update-react-native-app
Version:
Uses Github releases to update apk in React Native
122 lines (89 loc) • 3.43 kB
JavaScript
;
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;