UNPKG

update-react-native-app

Version:

Uses Github releases to update apk in React Native

122 lines (89 loc) 3.43 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _reactNative = require('react-native'); var _reactNativeFs = require('react-native-fs'); var _reactNativeFs2 = _interopRequireDefault(_reactNativeFs); var _semverMax = require('semver-max'); var _semverMax2 = _interopRequireDefault(_semverMax); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var Updater = function Updater(options) { var _this = this; _classCallCheck(this, Updater); this.jobId = -1; this.releasesUri = 'https://api.github.com/repos/{ownerAndRepo}/releases'; this.get = function (url, success, error) { fetch(url).then(function (response) { return response.json(); }).then(success).catch(error); }; this.getApkVersion = function () { if (_this.jobId !== -1) { return; } if (!_this.options.repo) { return; } _this.get(_this.releasesUri.replace('{ownerAndRepo}', _this.options.repo), _this.getApkVersionSuccess, _this.getVersionError); }; this.getApkVersionSuccess = function (releases) { var latestRelease = releases.length > 0 ? releases[0] : null; var latestVersion = latestRelease.tag_name.replace('v', ''); // Only if we have a latest release and it's higher then the current one if (latestRelease && (0, _semverMax2.default)(latestVersion, Updater.UpdateRNApp.versionName) !== Updater.UpdateRNApp.versionName) { var apkAsset = latestRelease.assets.find(function (asset) { return asset.browser_download_url.indexOf('.apk') > -1; }); if (apkAsset) { _this.fire('onUpdateAvailable', latestRelease, function () { _this.downloadApk(apkAsset); }); } } }; this.downloadApk = function (apkAsset) { var progress = function progress(data) { var percentage = 100 * data.bytesWritten / data.contentLength | 0; _this.fire('onProgress', percentage); }; var downloadDest = _reactNativeFs2.default.ExternalCachesDirectoryPath + '/' + apkAsset.name; var downloadFile = _reactNativeFs2.default.downloadFile({ fromUrl: apkAsset.browser_download_url, toFile: downloadDest, begin: function begin(response) { return _this.fire('onDownloadStart'); }, progress: progress, background: true, progressDivider: 1 }); _this.jobId = downloadFile.jobId; downloadFile.promise.then(function (response) { _this.fire('onDownloadEnd'); Updater.UpdateRNApp.installApk(downloadDest); _this.jobId = -1; }).catch(function (error) { _this.fire('onDownloadError', error); _this.jobId = -1; }); }; this.getVersionError = function (err) {}; this.checkUpdate = function () { if (_reactNative.Platform.OS === 'android') { _this.getApkVersion(); } }; this.fire = function (func) { for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } if (_this.options[func]) { _this.options[func].apply(null, args); } }; this.options = options; }; Updater.UpdateRNApp = _reactNative.NativeModules.UpdateRNApp; exports.default = Updater;