@zero-bits/react-native-hot-update 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +159 -0
- package/es/constants.d.ts +20 -0
- package/es/constants.js +20 -0
- package/es/index.d.ts +4 -0
- package/es/index.js +3 -0
- package/es/initialize.d.ts +14 -0
- package/es/initialize.js +32 -0
- package/es/updateProvider.d.ts +75 -0
- package/es/updateProvider.js +74 -0
- package/es/updateState.d.ts +25 -0
- package/es/updateState.js +166 -0
- package/es/usePushyUpdate.d.ts +17 -0
- package/es/usePushyUpdate.js +108 -0
- package/es/widget/animated.overlay.d.ts +12 -0
- package/es/widget/animated.overlay.js +96 -0
- package/es/widget/content.widget.d.ts +5 -0
- package/es/widget/content.widget.js +55 -0
- package/es/widget/description.widget.d.ts +5 -0
- package/es/widget/description.widget.js +33 -0
- package/es/widget/download.modal.widget.d.ts +5 -0
- package/es/widget/download.modal.widget.js +130 -0
- package/es/widget/footer.widget.d.ts +5 -0
- package/es/widget/footer.widget.js +153 -0
- package/es/widget/title.widget.d.ts +5 -0
- package/es/widget/title.widget.js +27 -0
- package/es/widget/update.modal.widget.d.ts +5 -0
- package/es/widget/update.modal.widget.js +50 -0
- package/lib/constants.d.ts +20 -0
- package/lib/constants.js +26 -0
- package/lib/index.d.ts +4 -0
- package/lib/index.js +36 -0
- package/lib/initialize.d.ts +14 -0
- package/lib/initialize.js +38 -0
- package/lib/updateProvider.d.ts +75 -0
- package/lib/updateProvider.js +83 -0
- package/lib/updateState.d.ts +25 -0
- package/lib/updateState.js +176 -0
- package/lib/usePushyUpdate.d.ts +17 -0
- package/lib/usePushyUpdate.js +114 -0
- package/lib/widget/animated.overlay.d.ts +12 -0
- package/lib/widget/animated.overlay.js +104 -0
- package/lib/widget/content.widget.d.ts +5 -0
- package/lib/widget/content.widget.js +63 -0
- package/lib/widget/description.widget.d.ts +5 -0
- package/lib/widget/description.widget.js +41 -0
- package/lib/widget/download.modal.widget.d.ts +5 -0
- package/lib/widget/download.modal.widget.js +138 -0
- package/lib/widget/footer.widget.d.ts +5 -0
- package/lib/widget/footer.widget.js +161 -0
- package/lib/widget/title.widget.d.ts +5 -0
- package/lib/widget/title.widget.js +35 -0
- package/lib/widget/update.modal.widget.d.ts +5 -0
- package/lib/widget/update.modal.widget.js +59 -0
- package/package.json +30 -0
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.default = FooterWidget;
|
|
8
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
9
|
+
var _reactNative = require("react-native");
|
|
10
|
+
var _reactNativeUpdate = require("react-native-update");
|
|
11
|
+
var _updateState = require("../updateState");
|
|
12
|
+
var _reactNativeMarketLinking = require("react-native-market-linking");
|
|
13
|
+
var _updateProvider = require("../updateProvider");
|
|
14
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
|
|
15
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
16
|
+
/**
|
|
17
|
+
* @description 更新弹窗底部操作按钮组件
|
|
18
|
+
* @returns 更新弹窗底部操作按钮组件
|
|
19
|
+
*/
|
|
20
|
+
function FooterWidget() {
|
|
21
|
+
var isAndroid = _reactNative.Platform.OS === 'android';
|
|
22
|
+
var _useUpdate = (0, _reactNativeUpdate.useUpdate)(),
|
|
23
|
+
updateInfo = _useUpdate.updateInfo;
|
|
24
|
+
var _useUpdateState = (0, _updateState.useUpdateState)(),
|
|
25
|
+
hideUpdateModal = _useUpdateState.hideUpdateModal,
|
|
26
|
+
startDownloadFlow = _useUpdateState.startDownloadFlow;
|
|
27
|
+
var config = (0, _react.useContext)(_updateProvider.HotUpdateContext);
|
|
28
|
+
var locale = config.localeText;
|
|
29
|
+
var primaryColor = config.themeColor || 'rgba(52,92,255,1)';
|
|
30
|
+
var isForceUpdate = (0, _react.useMemo)(function () {
|
|
31
|
+
try {
|
|
32
|
+
if (!(updateInfo !== null && updateInfo !== void 0 && updateInfo.metaInfo)) return false;
|
|
33
|
+
var meta = JSON.parse(updateInfo.metaInfo);
|
|
34
|
+
return meta.force === true || meta.forceUpdate === true;
|
|
35
|
+
} catch (_unused) {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
}, [updateInfo === null || updateInfo === void 0 ? void 0 : updateInfo.metaInfo]);
|
|
39
|
+
function appStoreUpdate() {
|
|
40
|
+
if (!isForceUpdate) hideUpdateModal();
|
|
41
|
+
if (config.iosAppId) {
|
|
42
|
+
(0, _reactNativeMarketLinking.openAppStore)(config.iosAppId);
|
|
43
|
+
} else {
|
|
44
|
+
_reactNative.Alert.alert('提示', locale.alertMissingAppId);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function openH5ApkDownloadPage() {
|
|
48
|
+
if (!isForceUpdate) hideUpdateModal();
|
|
49
|
+
if (!(updateInfo !== null && updateInfo !== void 0 && updateInfo.downloadUrl)) {
|
|
50
|
+
_reactNative.Alert.alert('提示', locale.alertMissingDownloadUrl);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
_reactNative.Linking.canOpenURL(updateInfo === null || updateInfo === void 0 ? void 0 : updateInfo.downloadUrl).then(function (supported) {
|
|
54
|
+
if (supported) return _reactNative.Linking.openURL(updateInfo === null || updateInfo === void 0 ? void 0 : updateInfo.downloadUrl);
|
|
55
|
+
_reactNative.Alert.alert('提示', locale.alertCantOpenDownloadUrl);
|
|
56
|
+
}).catch(function () {
|
|
57
|
+
_reactNative.Alert.alert('提示', locale.alertDownloadUrlFailed);
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
var PrimaryBtn = function PrimaryBtn(_ref) {
|
|
61
|
+
var title = _ref.title,
|
|
62
|
+
onPress = _ref.onPress,
|
|
63
|
+
style = _ref.style;
|
|
64
|
+
return /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, {
|
|
65
|
+
style: [Style.button, {
|
|
66
|
+
backgroundColor: primaryColor
|
|
67
|
+
}, style],
|
|
68
|
+
onPress: onPress
|
|
69
|
+
}, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
|
|
70
|
+
style: Style.primaryText
|
|
71
|
+
}, title));
|
|
72
|
+
};
|
|
73
|
+
var GhostBtn = function GhostBtn(_ref2) {
|
|
74
|
+
var title = _ref2.title,
|
|
75
|
+
onPress = _ref2.onPress,
|
|
76
|
+
style = _ref2.style;
|
|
77
|
+
return /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, {
|
|
78
|
+
style: [Style.button, Style.ghostButton, {
|
|
79
|
+
borderColor: primaryColor
|
|
80
|
+
}, style],
|
|
81
|
+
onPress: onPress
|
|
82
|
+
}, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
|
|
83
|
+
style: [Style.ghostText, {
|
|
84
|
+
color: primaryColor
|
|
85
|
+
}]
|
|
86
|
+
}, title));
|
|
87
|
+
};
|
|
88
|
+
function renderActionButton() {
|
|
89
|
+
if (updateInfo !== null && updateInfo !== void 0 && updateInfo.upToDate) return /*#__PURE__*/_react.default.createElement(PrimaryBtn, {
|
|
90
|
+
title: locale.btnGotIt,
|
|
91
|
+
onPress: hideUpdateModal
|
|
92
|
+
});
|
|
93
|
+
if (updateInfo !== null && updateInfo !== void 0 && updateInfo.update) return [!isForceUpdate && /*#__PURE__*/_react.default.createElement(GhostBtn, {
|
|
94
|
+
key: "plus",
|
|
95
|
+
title: locale.btnUpdateLater,
|
|
96
|
+
onPress: hideUpdateModal,
|
|
97
|
+
style: {
|
|
98
|
+
marginRight: 15
|
|
99
|
+
}
|
|
100
|
+
}), /*#__PURE__*/_react.default.createElement(PrimaryBtn, {
|
|
101
|
+
key: "submit",
|
|
102
|
+
title: locale.btnUpdateNow,
|
|
103
|
+
onPress: startDownloadFlow
|
|
104
|
+
})];
|
|
105
|
+
if (updateInfo !== null && updateInfo !== void 0 && updateInfo.expired) return [!isForceUpdate && /*#__PURE__*/_react.default.createElement(GhostBtn, {
|
|
106
|
+
key: "unable",
|
|
107
|
+
title: locale.btnUpdateLater,
|
|
108
|
+
onPress: hideUpdateModal,
|
|
109
|
+
style: {
|
|
110
|
+
marginRight: 10
|
|
111
|
+
}
|
|
112
|
+
}), /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, {
|
|
113
|
+
key: "store",
|
|
114
|
+
style: [Style.button, isAndroid ? [Style.ghostButton, {
|
|
115
|
+
borderColor: primaryColor
|
|
116
|
+
}] : {
|
|
117
|
+
backgroundColor: primaryColor
|
|
118
|
+
}],
|
|
119
|
+
onPress: appStoreUpdate
|
|
120
|
+
}, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
|
|
121
|
+
style: isAndroid ? [Style.ghostText, {
|
|
122
|
+
color: primaryColor
|
|
123
|
+
}] : Style.primaryText
|
|
124
|
+
}, locale.btnAppStore)), isAndroid && /*#__PURE__*/_react.default.createElement(PrimaryBtn, {
|
|
125
|
+
key: "install",
|
|
126
|
+
title: locale.btnDownload,
|
|
127
|
+
onPress: openH5ApkDownloadPage,
|
|
128
|
+
style: {
|
|
129
|
+
marginLeft: 10
|
|
130
|
+
}
|
|
131
|
+
})];
|
|
132
|
+
}
|
|
133
|
+
return /*#__PURE__*/_react.default.createElement(_reactNative.View, {
|
|
134
|
+
style: Style.container
|
|
135
|
+
}, renderActionButton());
|
|
136
|
+
}
|
|
137
|
+
var Style = _reactNative.StyleSheet.create({
|
|
138
|
+
container: {
|
|
139
|
+
marginHorizontal: 15,
|
|
140
|
+
flexDirection: 'row',
|
|
141
|
+
marginTop: 20
|
|
142
|
+
},
|
|
143
|
+
button: {
|
|
144
|
+
flex: 1,
|
|
145
|
+
height: 40,
|
|
146
|
+
borderRadius: 4,
|
|
147
|
+
justifyContent: 'center',
|
|
148
|
+
alignItems: 'center'
|
|
149
|
+
},
|
|
150
|
+
ghostButton: {
|
|
151
|
+
backgroundColor: 'transparent',
|
|
152
|
+
borderWidth: 1
|
|
153
|
+
},
|
|
154
|
+
primaryText: {
|
|
155
|
+
color: '#fff',
|
|
156
|
+
fontSize: 14
|
|
157
|
+
},
|
|
158
|
+
ghostText: {
|
|
159
|
+
fontSize: 14
|
|
160
|
+
}
|
|
161
|
+
});
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.default = TitleWidget;
|
|
8
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
9
|
+
var _reactNative = require("react-native");
|
|
10
|
+
var _updateProvider = require("../updateProvider");
|
|
11
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
|
|
12
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
13
|
+
/**
|
|
14
|
+
* @description 更新标题原子组件
|
|
15
|
+
* @returns 标题展示原子组件
|
|
16
|
+
*/
|
|
17
|
+
function TitleWidget() {
|
|
18
|
+
var config = (0, _react.useContext)(_updateProvider.HotUpdateContext);
|
|
19
|
+
var locale = config.localeText;
|
|
20
|
+
return /*#__PURE__*/_react.default.createElement(_reactNative.View, {
|
|
21
|
+
style: Style.container
|
|
22
|
+
}, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
|
|
23
|
+
style: Style.title
|
|
24
|
+
}, locale.updateTitle));
|
|
25
|
+
}
|
|
26
|
+
var Style = _reactNative.StyleSheet.create({
|
|
27
|
+
container: {
|
|
28
|
+
alignItems: 'center',
|
|
29
|
+
justifyContent: 'center'
|
|
30
|
+
},
|
|
31
|
+
title: {
|
|
32
|
+
fontSize: 18,
|
|
33
|
+
fontWeight: 'bold'
|
|
34
|
+
}
|
|
35
|
+
});
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.default = UpdateModalWidget;
|
|
8
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
9
|
+
var _reactNative = require("react-native");
|
|
10
|
+
var _reactNativeUpdate = require("react-native-update");
|
|
11
|
+
var _title = _interopRequireDefault(require("./title.widget"));
|
|
12
|
+
var _description = _interopRequireDefault(require("./description.widget"));
|
|
13
|
+
var _content = _interopRequireDefault(require("./content.widget"));
|
|
14
|
+
var _footer = _interopRequireDefault(require("./footer.widget"));
|
|
15
|
+
var _updateProvider = require("../updateProvider");
|
|
16
|
+
var _updateState = require("../updateState");
|
|
17
|
+
var _animated = _interopRequireDefault(require("./animated.overlay"));
|
|
18
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
19
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
|
|
20
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
21
|
+
/**
|
|
22
|
+
* @description 更新弹窗组件
|
|
23
|
+
* @returns 更新弹窗组件
|
|
24
|
+
*/
|
|
25
|
+
function UpdateModalWidget() {
|
|
26
|
+
var config = (0, _react.useContext)(_updateProvider.HotUpdateContext);
|
|
27
|
+
var _useUpdate = (0, _reactNativeUpdate.useUpdate)(),
|
|
28
|
+
updateInfo = _useUpdate.updateInfo;
|
|
29
|
+
var _useUpdateState = (0, _updateState.useUpdateState)(),
|
|
30
|
+
isUpdateVisible = _useUpdateState.isUpdateVisible,
|
|
31
|
+
hideUpdateModal = _useUpdateState.hideUpdateModal,
|
|
32
|
+
startDownloadFlow = _useUpdateState.startDownloadFlow;
|
|
33
|
+
var content = null;
|
|
34
|
+
if (config.renderUpdateModal) {
|
|
35
|
+
content = config.renderUpdateModal(updateInfo, {
|
|
36
|
+
hideModal: hideUpdateModal,
|
|
37
|
+
doUpdate: startDownloadFlow
|
|
38
|
+
});
|
|
39
|
+
} else {
|
|
40
|
+
content = /*#__PURE__*/_react.default.createElement(_reactNative.View, {
|
|
41
|
+
style: Style.content
|
|
42
|
+
}, /*#__PURE__*/_react.default.createElement(_title.default, null), /*#__PURE__*/_react.default.createElement(_description.default, null), /*#__PURE__*/_react.default.createElement(_content.default, null), /*#__PURE__*/_react.default.createElement(_footer.default, null));
|
|
43
|
+
}
|
|
44
|
+
return /*#__PURE__*/_react.default.createElement(_animated.default, {
|
|
45
|
+
visible: isUpdateVisible,
|
|
46
|
+
onAnimationComplete: function onAnimationComplete() {}
|
|
47
|
+
}, content);
|
|
48
|
+
}
|
|
49
|
+
var Style = _reactNative.StyleSheet.create({
|
|
50
|
+
content: {
|
|
51
|
+
backgroundColor: 'white',
|
|
52
|
+
marginHorizontal: 20,
|
|
53
|
+
borderRadius: 8,
|
|
54
|
+
paddingVertical: 20,
|
|
55
|
+
flexDirection: 'column',
|
|
56
|
+
width: '90%',
|
|
57
|
+
maxWidth: 400
|
|
58
|
+
}
|
|
59
|
+
});
|
package/package.json
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@zero-bits/react-native-hot-update",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "react-native热更新展示组件",
|
|
5
|
+
"main": "lib/index.js",
|
|
6
|
+
"types": "lib/index.d.ts",
|
|
7
|
+
"publishConfig": {
|
|
8
|
+
"access": "public",
|
|
9
|
+
"registry": "https://registry.npmjs.org/"
|
|
10
|
+
},
|
|
11
|
+
"module": "es/index.js",
|
|
12
|
+
"keywords": [
|
|
13
|
+
"react-native",
|
|
14
|
+
"hot-update",
|
|
15
|
+
"pushy",
|
|
16
|
+
"react-native-update"
|
|
17
|
+
],
|
|
18
|
+
"files": [
|
|
19
|
+
"lib",
|
|
20
|
+
"es"
|
|
21
|
+
],
|
|
22
|
+
"author": "641261604@qq.com",
|
|
23
|
+
"license": "ISC",
|
|
24
|
+
"peerDependencies": {
|
|
25
|
+
"react": ">=16.13.1",
|
|
26
|
+
"react-native": ">=0.63.4",
|
|
27
|
+
"react-native-market-linking": ">=0.0.8",
|
|
28
|
+
"react-native-update": ">=10.34.0"
|
|
29
|
+
}
|
|
30
|
+
}
|