react-native-simple-version-update
Version:
react-native-simple-version-update is a lightweight and easy-to-use custom React Native hook that checks if your app needs to be updated by comparing the installed version with the latest version available on the App Store (iOS) or Google Play Store (Andr
152 lines (151 loc) • 8.09 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (g && (g = 0, op[0] && (_ = 0)), _) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
var react_1 = require("react");
var react_native_device_info_1 = __importDefault(require("react-native-device-info"));
var react_native_1 = require("react-native");
var useVersionUpdate = function () {
var _a = (0, react_1.useState)(null), currentVersion = _a[0], setCurrentVersion = _a[1];
var _b = (0, react_1.useState)(null), liveVersion = _b[0], setLiveVersion = _b[1];
var _c = (0, react_1.useState)(false), needUpdate = _c[0], setNeedUpdate = _c[1];
var _d = (0, react_1.useState)(null), updateUrl = _d[0], setUpdateUrl = _d[1];
(0, react_1.useEffect)(function () {
var checkForUpdate = function () { return __awaiter(void 0, void 0, void 0, function () {
var appVersion, latestVersion, error_1;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
appVersion = react_native_device_info_1.default.getVersion();
setCurrentVersion(appVersion);
_a.label = 1;
case 1:
_a.trys.push([1, 3, , 4]);
return [4 /*yield*/, getLatestStoreVersion()];
case 2:
latestVersion = _a.sent();
setLiveVersion(latestVersion);
if (latestVersion && compareVersions(latestVersion, appVersion)) {
setNeedUpdate(true);
}
return [3 /*break*/, 4];
case 3:
error_1 = _a.sent();
console.error('Error checking for update:', error_1);
return [3 /*break*/, 4];
case 4: return [2 /*return*/];
}
});
}); };
checkForUpdate();
}, []);
var getLatestStoreVersion = function () { return __awaiter(void 0, void 0, void 0, function () {
var bundleId, response, data, response, html, match, latestVersion, matchNewLayout, error_2;
var _a;
return __generator(this, function (_b) {
switch (_b.label) {
case 0:
_b.trys.push([0, 7, , 8]);
bundleId = react_native_device_info_1.default.getBundleId();
if (!(react_native_1.Platform.OS === 'ios')) return [3 /*break*/, 3];
return [4 /*yield*/, fetch("https://itunes.apple.com/lookup?bundleId=".concat(bundleId))];
case 1:
response = _b.sent();
return [4 /*yield*/, response.json()];
case 2:
data = _b.sent();
if (data.resultCount > 0) {
setUpdateUrl((_a = data === null || data === void 0 ? void 0 : data.results[0]) === null || _a === void 0 ? void 0 : _a.trackViewUrl);
return [2 /*return*/, data.results[0].version];
}
return [3 /*break*/, 6];
case 3: return [4 /*yield*/, fetch("https://play.google.com/store/apps/details?id=".concat(bundleId, "&hl=en&gl=US"))];
case 4:
response = _b.sent();
return [4 /*yield*/, response.text()];
case 5:
html = _b.sent();
match = html.match(/Current Version.+?>([\d.-]+)<\/span>/);
latestVersion = null;
if (match) {
latestVersion = match[1].trim();
}
matchNewLayout = html.match(/\[\[\["([\d-.]+?)"\]\]/);
if (matchNewLayout) {
latestVersion = matchNewLayout[1].trim();
}
setLiveVersion(latestVersion);
setUpdateUrl("https://play.google.com/store/apps/details?id=".concat(bundleId));
return [2 /*return*/, latestVersion];
case 6: return [2 /*return*/, null];
case 7:
error_2 = _b.sent();
console.error('Error fetching the latest version:', error_2);
return [2 /*return*/, null];
case 8: return [2 /*return*/];
}
});
}); };
var compareVersions = function (latestVersion, currentV) {
var latest = latestVersion.replace(/\./g, '');
var current = currentV.replace(/\./g, '');
return latest > current;
};
var handleUpdate = function () { return __awaiter(void 0, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
if (!updateUrl) return [3 /*break*/, 2];
return [4 /*yield*/, react_native_1.Linking.openURL(updateUrl)];
case 1:
_a.sent();
_a.label = 2;
case 2: return [2 /*return*/];
}
});
}); };
return {
currentVersion: currentVersion,
liveVersion: liveVersion,
needUpdate: needUpdate,
handleUpdate: handleUpdate,
};
};
exports.default = useVersionUpdate;