react-native-3rddigital-appupdate 1.0.5 → 1.0.7
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 +11 -8
- package/lib/module/AppLoader.js +21 -1
- package/lib/module/AppLoader.js.map +1 -1
- package/lib/module/checkOTAUpdate.js +6 -0
- package/lib/module/checkOTAUpdate.js.map +1 -1
- package/lib/typescript/src/AppLoader.d.ts +3 -0
- package/lib/typescript/src/AppLoader.d.ts.map +1 -1
- package/lib/typescript/src/checkOTAUpdate.d.ts.map +1 -1
- package/package.json +1 -1
- package/scripts/bundle.js +27 -5
- package/src/AppLoader.tsx +30 -0
- package/src/checkOTAUpdate.ts +9 -0
package/README.md
CHANGED
|
@@ -44,6 +44,7 @@ const App = () => {
|
|
|
44
44
|
androidPackage: 'com.example.android',
|
|
45
45
|
loaderOptions: {
|
|
46
46
|
text: 'Downloading update...',
|
|
47
|
+
showProgress: true,
|
|
47
48
|
},
|
|
48
49
|
dialogOptions: {
|
|
49
50
|
title: 'Update Available',
|
|
@@ -91,14 +92,16 @@ Options:
|
|
|
91
92
|
|
|
92
93
|
Props (LoaderOptions):
|
|
93
94
|
|
|
94
|
-
| Key
|
|
95
|
-
|
|
|
96
|
-
| `text`
|
|
97
|
-
| `color`
|
|
98
|
-
| `backgroundColor`
|
|
99
|
-
| `textColor`
|
|
100
|
-
| `containerStyle`
|
|
101
|
-
| `textStyle`
|
|
95
|
+
| Key | Type | Default | Description |
|
|
96
|
+
| ------------------- | --------- | ----------------- | ----------------------------------------------- |
|
|
97
|
+
| `text` | string | `undefined` | Text displayed below the spinner |
|
|
98
|
+
| `color` | string | `#2563EB` | Spinner color |
|
|
99
|
+
| `backgroundColor` | string | `rgba(0,0,0,0.3)` | Overlay background color |
|
|
100
|
+
| `textColor` | string | `#fff` | Loader text color |
|
|
101
|
+
| `containerStyle` | ViewStyle | `{}` | Custom style for the loader container |
|
|
102
|
+
| `textStyle` | TextStyle | `{}` | Custom style for the loader text |
|
|
103
|
+
| `progressTextStyle` | TextStyle | `{}` | Custom style for the loader progress text |
|
|
104
|
+
| `showProgress` | boolean | `false` | Show real-time download percentage (e.g. “45%”) |
|
|
102
105
|
|
|
103
106
|
🔹 Dialog (AppAlertDialog)
|
|
104
107
|
|
package/lib/module/AppLoader.js
CHANGED
|
@@ -5,15 +5,22 @@ import { ActivityIndicator, StyleSheet, Text, View } from 'react-native';
|
|
|
5
5
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
6
6
|
let showLoader;
|
|
7
7
|
let hideLoader;
|
|
8
|
+
let updateProgressValue;
|
|
8
9
|
export const AppLoader = () => {
|
|
9
10
|
const [visible, setVisible] = useState(false);
|
|
10
11
|
const [options, setOptions] = useState({});
|
|
12
|
+
const [progress, setProgress] = useState(0);
|
|
11
13
|
showLoader = opts => {
|
|
12
14
|
setOptions(opts || {});
|
|
15
|
+
setProgress(0);
|
|
13
16
|
setVisible(true);
|
|
14
17
|
};
|
|
15
18
|
hideLoader = () => {
|
|
16
19
|
setVisible(false);
|
|
20
|
+
setProgress(0);
|
|
21
|
+
};
|
|
22
|
+
updateProgressValue = value => {
|
|
23
|
+
setProgress(value);
|
|
17
24
|
};
|
|
18
25
|
if (!visible) return null;
|
|
19
26
|
return /*#__PURE__*/_jsx(View, {
|
|
@@ -30,6 +37,11 @@ export const AppLoader = () => {
|
|
|
30
37
|
color: options.textColor || '#fff'
|
|
31
38
|
}, options.textStyle],
|
|
32
39
|
children: options.text
|
|
40
|
+
}), options.showProgress && /*#__PURE__*/_jsxs(Text, {
|
|
41
|
+
style: [styles.progressText, {
|
|
42
|
+
color: options.textColor || '#fff'
|
|
43
|
+
}, options.progressTextStyle],
|
|
44
|
+
children: [progress.toFixed(0), "%"]
|
|
33
45
|
})]
|
|
34
46
|
})
|
|
35
47
|
});
|
|
@@ -50,9 +62,17 @@ const styles = StyleSheet.create({
|
|
|
50
62
|
text: {
|
|
51
63
|
marginTop: 12,
|
|
52
64
|
fontSize: 14,
|
|
53
|
-
fontWeight: '500'
|
|
65
|
+
fontWeight: '500',
|
|
66
|
+
textAlign: 'center'
|
|
67
|
+
},
|
|
68
|
+
progressText: {
|
|
69
|
+
marginTop: 10,
|
|
70
|
+
fontSize: 13,
|
|
71
|
+
fontWeight: '600',
|
|
72
|
+
textAlign: 'center'
|
|
54
73
|
}
|
|
55
74
|
});
|
|
56
75
|
AppLoader.show = options => showLoader?.(options);
|
|
57
76
|
AppLoader.hide = () => hideLoader?.();
|
|
77
|
+
AppLoader.updateProgress = progress => updateProgressValue?.(progress);
|
|
58
78
|
//# sourceMappingURL=AppLoader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useState","ActivityIndicator","StyleSheet","Text","View","jsx","_jsx","jsxs","_jsxs","showLoader","hideLoader","AppLoader","visible","setVisible","options","setOptions","opts","style","styles","overlay","backgroundColor","children","loaderBox","containerStyle","size","color","text","textColor","textStyle","create","absoluteFillObject","justifyContent","alignItems","zIndex","padding","borderRadius","marginTop","fontSize","fontWeight","show","hide"],"sourceRoot":"../../src","sources":["AppLoader.tsx"],"mappings":";;AAAA,SAASA,QAAQ,QAAQ,OAAO;AAChC,SACEC,iBAAiB,EACjBC,UAAU,EACVC,IAAI,EACJC,IAAI,QAGC,cAAc;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;
|
|
1
|
+
{"version":3,"names":["useState","ActivityIndicator","StyleSheet","Text","View","jsx","_jsx","jsxs","_jsxs","showLoader","hideLoader","updateProgressValue","AppLoader","visible","setVisible","options","setOptions","progress","setProgress","opts","value","style","styles","overlay","backgroundColor","children","loaderBox","containerStyle","size","color","text","textColor","textStyle","showProgress","progressText","progressTextStyle","toFixed","create","absoluteFillObject","justifyContent","alignItems","zIndex","padding","borderRadius","marginTop","fontSize","fontWeight","textAlign","show","hide","updateProgress"],"sourceRoot":"../../src","sources":["AppLoader.tsx"],"mappings":";;AAAA,SAASA,QAAQ,QAAQ,OAAO;AAChC,SACEC,iBAAiB,EACjBC,UAAU,EACVC,IAAI,EACJC,IAAI,QAGC,cAAc;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAatB,IAAIC,UAA6C;AACjD,IAAIC,UAAsB;AAC1B,IAAIC,mBAA+C;AAEnD,OAAO,MAAMC,SAAS,GAAGA,CAAA,KAAM;EAC7B,MAAM,CAACC,OAAO,EAAEC,UAAU,CAAC,GAAGd,QAAQ,CAAC,KAAK,CAAC;EAC7C,MAAM,CAACe,OAAO,EAAEC,UAAU,CAAC,GAAGhB,QAAQ,CAAgB,CAAC,CAAC,CAAC;EACzD,MAAM,CAACiB,QAAQ,EAAEC,WAAW,CAAC,GAAGlB,QAAQ,CAAC,CAAC,CAAC;EAE3CS,UAAU,GAAIU,IAAoB,IAAK;IACrCH,UAAU,CAACG,IAAI,IAAI,CAAC,CAAC,CAAC;IACtBD,WAAW,CAAC,CAAC,CAAC;IACdJ,UAAU,CAAC,IAAI,CAAC;EAClB,CAAC;EAEDJ,UAAU,GAAGA,CAAA,KAAM;IACjBI,UAAU,CAAC,KAAK,CAAC;IACjBI,WAAW,CAAC,CAAC,CAAC;EAChB,CAAC;EAEDP,mBAAmB,GAAIS,KAAa,IAAK;IACvCF,WAAW,CAACE,KAAK,CAAC;EACpB,CAAC;EAED,IAAI,CAACP,OAAO,EAAE,OAAO,IAAI;EAEzB,oBACEP,IAAA,CAACF,IAAI;IACHiB,KAAK,EAAE,CACLC,MAAM,CAACC,OAAO,EACd;MAAEC,eAAe,EAAET,OAAO,CAACS,eAAe,IAAI;IAAkB,CAAC,CACjE;IAAAC,QAAA,eAEFjB,KAAA,CAACJ,IAAI;MAACiB,KAAK,EAAE,CAACC,MAAM,CAACI,SAAS,EAAEX,OAAO,CAACY,cAAc,CAAE;MAAAF,QAAA,gBACtDnB,IAAA,CAACL,iBAAiB;QAAC2B,IAAI,EAAC,OAAO;QAACC,KAAK,EAAEd,OAAO,CAACc,KAAK,IAAI;MAAU,CAAE,CAAC,EACpEd,OAAO,CAACe,IAAI,iBACXxB,IAAA,CAACH,IAAI;QACHkB,KAAK,EAAE,CACLC,MAAM,CAACQ,IAAI,EACX;UAAED,KAAK,EAAEd,OAAO,CAACgB,SAAS,IAAI;QAAO,CAAC,EACtChB,OAAO,CAACiB,SAAS,CACjB;QAAAP,QAAA,EAEDV,OAAO,CAACe;MAAI,CACT,CACP,EACAf,OAAO,CAACkB,YAAY,iBACnBzB,KAAA,CAACL,IAAI;QACHkB,KAAK,EAAE,CACLC,MAAM,CAACY,YAAY,EACnB;UAAEL,KAAK,EAAEd,OAAO,CAACgB,SAAS,IAAI;QAAO,CAAC,EACtChB,OAAO,CAACoB,iBAAiB,CACzB;QAAAV,QAAA,GAEDR,QAAQ,CAACmB,OAAO,CAAC,CAAC,CAAC,EAAC,GACvB;MAAA,CAAM,CACP;IAAA,CACG;EAAC,CACH,CAAC;AAEX,CAAC;AAED,MAAMd,MAAM,GAAGpB,UAAU,CAACmC,MAAM,CAAC;EAC/Bd,OAAO,EAAE;IACP,GAAGrB,UAAU,CAACoC,kBAAkB;IAChCC,cAAc,EAAE,QAAQ;IACxBC,UAAU,EAAE,QAAQ;IACpBC,MAAM,EAAE;EACV,CAAC;EACDf,SAAS,EAAE;IACTgB,OAAO,EAAE,EAAE;IACXC,YAAY,EAAE,EAAE;IAChBnB,eAAe,EAAE,SAAS;IAC1BgB,UAAU,EAAE;EACd,CAAC;EACDV,IAAI,EAAE;IACJc,SAAS,EAAE,EAAE;IACbC,QAAQ,EAAE,EAAE;IACZC,UAAU,EAAE,KAAK;IACjBC,SAAS,EAAE;EACb,CAAC;EACDb,YAAY,EAAE;IACZU,SAAS,EAAE,EAAE;IACbC,QAAQ,EAAE,EAAE;IACZC,UAAU,EAAE,KAAK;IACjBC,SAAS,EAAE;EACb;AACF,CAAC,CAAC;AAEFnC,SAAS,CAACoC,IAAI,GAAIjC,OAAuB,IAAKN,UAAU,GAAGM,OAAO,CAAC;AACnEH,SAAS,CAACqC,IAAI,GAAG,MAAMvC,UAAU,GAAG,CAAC;AACrCE,SAAS,CAACsC,cAAc,GAAIjC,QAAgB,IAC1CN,mBAAmB,GAAGM,QAAQ,CAAC","ignoreList":[]}
|
|
@@ -31,6 +31,12 @@ export const checkOTAUpdate = async ({
|
|
|
31
31
|
const downloadAndReport = () => {
|
|
32
32
|
AppLoader.show(loaderOptions);
|
|
33
33
|
hotUpdate.downloadBundleUri(ReactNativeBlobUtil, url, version, {
|
|
34
|
+
progress: (received, total) => {
|
|
35
|
+
if (loaderOptions?.showProgress) {
|
|
36
|
+
const percentage = (Number(received) / Number(total) * 100).toFixed(1);
|
|
37
|
+
AppLoader.updateProgress(Number(percentage));
|
|
38
|
+
}
|
|
39
|
+
},
|
|
34
40
|
updateSuccess: () => {
|
|
35
41
|
axios.post(`${API_URL}bundles/${bundleId}/count`, {
|
|
36
42
|
status: 'success'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["axios","Platform","ReactNativeBlobUtil","DeviceInfo","hotUpdate","AppAlertDialog","AppLoader","API_URL","checkOTAUpdate","key","iosPackage","androidPackage","loaderOptions","dialogOptions","response","get","currentVersion","getCurrentVersion","data","OS","android","ios","version","forceUpdate","url","bundleId","currentAppVersion","getVersion","bundleAppVersion","appVersion","downloadAndReport","show","downloadBundleUri","updateSuccess","post","status","headers","finally","hide","updateFail","error","JSON","stringify","deviceInfo","model","getModel","brand","getBrand","systemName","getSystemName","systemVersion","getSystemVersion","restartAfterInstall","restartDelay","showMessage","title","message","confirmText","cancelText","onConfirm","onCancel","err","console","warn"],"sourceRoot":"../../src","sources":["checkOTAUpdate.ts"],"mappings":";;AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,QAAQ,QAAQ,cAAc;AACvC,OAAOC,mBAAmB,MAAM,wBAAwB;AACxD,OAAOC,UAAU,MAAM,0BAA0B;AACjD,OAAOC,SAAS,MAAM,6BAA6B;AACnD,SAASC,cAAc,QAA4B,qBAAkB;AACrE,SAASC,SAAS,QAA4B,gBAAa;AAE3D,MAAMC,OAAO,GAAG,+CAA+C;AAU/D,OAAO,MAAMC,cAAc,GAAG,MAAAA,CAAO;EACnCC,GAAG;EACHC,UAAU;EACVC,cAAc;EACdC,aAAa;EACbC;AACc,CAAC,KAAK;EACpB,IAAI;IACF,MAAMC,QAAQ,GAAG,MAAMd,KAAK,CAACe,GAAG,CAC9B,GAAGR,OAAO,2BAA2BE,GAAG,eAAeC,UAAU,mBAAmBC,cAAc,EACpG,CAAC;IAED,MAAMK,cAAc,GAAG,MAAMZ,SAAS,CAACa,iBAAiB,CAAC,CAAC;IAC1D,MAAMC,IAAI,GACRjB,QAAQ,CAACkB,EAAE,KAAK,SAAS,GAAGL,QAAQ,EAAEI,IAAI,EAAEE,OAAO,GAAGN,QAAQ,EAAEI,IAAI,EAAEG,GAAG;IAC3E,MAAMC,OAAO,GAAGJ,IAAI,EAAEI,OAAO,IAAI,CAAC;IAClC,MAAMC,WAAW,GAAGL,IAAI,EAAEK,WAAW,IAAI,KAAK;IAC9C,MAAMC,GAAG,GAAGN,IAAI,EAAEM,GAAG,IAAI,EAAE;IAC3B,MAAMC,QAAQ,GAAGP,IAAI,EAAEO,QAAQ,IAAI,EAAE;IACrC,MAAMC,iBAAiB,GAAGvB,UAAU,CAACwB,UAAU,CAAC,CAAC;IACjD,MAAMC,gBAAgB,GAAGV,IAAI,EAAEW,UAAU,IAAIH,iBAAiB;IAE9D,IAAIJ,OAAO,IAAIN,cAAc,IAAIU,iBAAiB,IAAIE,gBAAgB,EAAE;MACtE;IACF;IAEA,MAAME,iBAAiB,GAAGA,CAAA,KAAM;MAC9BxB,SAAS,CAACyB,IAAI,CAACnB,aAAa,CAAC;MAC7BR,SAAS,CAAC4B,iBAAiB,CAAC9B,mBAAmB,EAAEsB,GAAG,EAAEF,OAAO,EAAE;QAC7DW,aAAa,EAAEA,CAAA,KAAM;
|
|
1
|
+
{"version":3,"names":["axios","Platform","ReactNativeBlobUtil","DeviceInfo","hotUpdate","AppAlertDialog","AppLoader","API_URL","checkOTAUpdate","key","iosPackage","androidPackage","loaderOptions","dialogOptions","response","get","currentVersion","getCurrentVersion","data","OS","android","ios","version","forceUpdate","url","bundleId","currentAppVersion","getVersion","bundleAppVersion","appVersion","downloadAndReport","show","downloadBundleUri","progress","received","total","showProgress","percentage","Number","toFixed","updateProgress","updateSuccess","post","status","headers","finally","hide","updateFail","error","JSON","stringify","deviceInfo","model","getModel","brand","getBrand","systemName","getSystemName","systemVersion","getSystemVersion","restartAfterInstall","restartDelay","showMessage","title","message","confirmText","cancelText","onConfirm","onCancel","err","console","warn"],"sourceRoot":"../../src","sources":["checkOTAUpdate.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -6,10 +6,13 @@ export type LoaderOptions = {
|
|
|
6
6
|
textColor?: string;
|
|
7
7
|
containerStyle?: ViewStyle;
|
|
8
8
|
textStyle?: TextStyle;
|
|
9
|
+
progressTextStyle?: TextStyle;
|
|
10
|
+
showProgress?: boolean;
|
|
9
11
|
};
|
|
10
12
|
export declare const AppLoader: {
|
|
11
13
|
(): import("react/jsx-runtime").JSX.Element | null;
|
|
12
14
|
show(options?: LoaderOptions): void;
|
|
13
15
|
hide(): void;
|
|
16
|
+
updateProgress(progress: number): void;
|
|
14
17
|
};
|
|
15
18
|
//# sourceMappingURL=AppLoader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppLoader.d.ts","sourceRoot":"","sources":["../../../src/AppLoader.tsx"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,cAAc,CAAC;AAEtB,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,SAAS,CAAC;IAC3B,SAAS,CAAC,EAAE,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"AppLoader.d.ts","sourceRoot":"","sources":["../../../src/AppLoader.tsx"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,cAAc,CAAC;AAEtB,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,SAAS,CAAC;IAC3B,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,iBAAiB,CAAC,EAAE,SAAS,CAAC;IAC9B,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAMF,eAAO,MAAM,SAAS;;mBAqFM,aAAa;;6BAEH,MAAM;CA/B3C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkOTAUpdate.d.ts","sourceRoot":"","sources":["../../../src/checkOTAUpdate.ts"],"names":[],"mappings":"AAKA,OAAO,EAAkB,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAa,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAI5D,MAAM,MAAM,cAAc,GAAG;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,aAAa,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,WAAW,GAAG,UAAU,CAAC,CAAC;CAC/D,CAAC;AAEF,eAAO,MAAM,cAAc,GAAU,oEAMlC,cAAc,
|
|
1
|
+
{"version":3,"file":"checkOTAUpdate.d.ts","sourceRoot":"","sources":["../../../src/checkOTAUpdate.ts"],"names":[],"mappings":"AAKA,OAAO,EAAkB,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAa,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAI5D,MAAM,MAAM,cAAc,GAAG;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,aAAa,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,WAAW,GAAG,UAAU,CAAC,CAAC;CAC/D,CAAC;AAEF,eAAO,MAAM,cAAc,GAAU,oEAMlC,cAAc,kBAgFhB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-3rddigital-appupdate",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.7",
|
|
4
4
|
"description": "A React Native library for seamless over-the-air (OTA) updates with version checks, automatic bundle download, and customizable user prompts for iOS and Android.",
|
|
5
5
|
"main": "./lib/module/index.js",
|
|
6
6
|
"types": "./lib/typescript/src/index.d.ts",
|
package/scripts/bundle.js
CHANGED
|
@@ -106,11 +106,29 @@ function buildIOS() {
|
|
|
106
106
|
*/
|
|
107
107
|
function getAppVersion(platform) {
|
|
108
108
|
try {
|
|
109
|
+
// Find the actual React Native project root (two levels up from node_modules)
|
|
110
|
+
let projectRoot = path.resolve(__dirname);
|
|
111
|
+
while (
|
|
112
|
+
projectRoot.includes('node_modules') &&
|
|
113
|
+
!fs.existsSync(path.join(projectRoot, 'package.json'))
|
|
114
|
+
) {
|
|
115
|
+
projectRoot = path.resolve(projectRoot, '..');
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Once we exit node_modules, ensure we’re at the React Native app root
|
|
119
|
+
if (projectRoot.includes('node_modules')) {
|
|
120
|
+
projectRoot = path.resolve(projectRoot, '../../');
|
|
121
|
+
}
|
|
122
|
+
|
|
109
123
|
if (platform === 'android') {
|
|
110
|
-
|
|
111
|
-
|
|
124
|
+
const gradlePath = path.join(
|
|
125
|
+
projectRoot,
|
|
126
|
+
'android',
|
|
127
|
+
'app',
|
|
128
|
+
'build.gradle'
|
|
129
|
+
);
|
|
112
130
|
if (!fs.existsSync(gradlePath)) {
|
|
113
|
-
console.warn(
|
|
131
|
+
console.warn(`⚠️ Android build.gradle not found at ${gradlePath}`);
|
|
114
132
|
return null;
|
|
115
133
|
}
|
|
116
134
|
const gradleContent = fs.readFileSync(gradlePath, 'utf8');
|
|
@@ -121,8 +139,12 @@ function getAppVersion(platform) {
|
|
|
121
139
|
console.warn('⚠️ Could not find versionName in build.gradle.');
|
|
122
140
|
}
|
|
123
141
|
} else if (platform === 'ios') {
|
|
124
|
-
|
|
125
|
-
|
|
142
|
+
const iosDir = path.join(projectRoot, 'ios');
|
|
143
|
+
if (!fs.existsSync(iosDir)) {
|
|
144
|
+
console.warn(`⚠️ iOS folder not found at ${iosDir}`);
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
|
|
126
148
|
const projectDir = fs
|
|
127
149
|
.readdirSync(iosDir)
|
|
128
150
|
.find((d) => d.endsWith('.xcodeproj'));
|
package/src/AppLoader.tsx
CHANGED
|
@@ -15,22 +15,32 @@ export type LoaderOptions = {
|
|
|
15
15
|
textColor?: string;
|
|
16
16
|
containerStyle?: ViewStyle;
|
|
17
17
|
textStyle?: TextStyle;
|
|
18
|
+
progressTextStyle?: TextStyle;
|
|
19
|
+
showProgress?: boolean;
|
|
18
20
|
};
|
|
19
21
|
|
|
20
22
|
let showLoader: (options?: LoaderOptions) => void;
|
|
21
23
|
let hideLoader: () => void;
|
|
24
|
+
let updateProgressValue: (progress: number) => void;
|
|
22
25
|
|
|
23
26
|
export const AppLoader = () => {
|
|
24
27
|
const [visible, setVisible] = useState(false);
|
|
25
28
|
const [options, setOptions] = useState<LoaderOptions>({});
|
|
29
|
+
const [progress, setProgress] = useState(0);
|
|
26
30
|
|
|
27
31
|
showLoader = (opts?: LoaderOptions) => {
|
|
28
32
|
setOptions(opts || {});
|
|
33
|
+
setProgress(0);
|
|
29
34
|
setVisible(true);
|
|
30
35
|
};
|
|
31
36
|
|
|
32
37
|
hideLoader = () => {
|
|
33
38
|
setVisible(false);
|
|
39
|
+
setProgress(0);
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
updateProgressValue = (value: number) => {
|
|
43
|
+
setProgress(value);
|
|
34
44
|
};
|
|
35
45
|
|
|
36
46
|
if (!visible) return null;
|
|
@@ -55,6 +65,17 @@ export const AppLoader = () => {
|
|
|
55
65
|
{options.text}
|
|
56
66
|
</Text>
|
|
57
67
|
)}
|
|
68
|
+
{options.showProgress && (
|
|
69
|
+
<Text
|
|
70
|
+
style={[
|
|
71
|
+
styles.progressText,
|
|
72
|
+
{ color: options.textColor || '#fff' },
|
|
73
|
+
options.progressTextStyle,
|
|
74
|
+
]}
|
|
75
|
+
>
|
|
76
|
+
{progress.toFixed(0)}%
|
|
77
|
+
</Text>
|
|
78
|
+
)}
|
|
58
79
|
</View>
|
|
59
80
|
</View>
|
|
60
81
|
);
|
|
@@ -77,8 +98,17 @@ const styles = StyleSheet.create({
|
|
|
77
98
|
marginTop: 12,
|
|
78
99
|
fontSize: 14,
|
|
79
100
|
fontWeight: '500',
|
|
101
|
+
textAlign: 'center',
|
|
102
|
+
},
|
|
103
|
+
progressText: {
|
|
104
|
+
marginTop: 10,
|
|
105
|
+
fontSize: 13,
|
|
106
|
+
fontWeight: '600',
|
|
107
|
+
textAlign: 'center',
|
|
80
108
|
},
|
|
81
109
|
});
|
|
82
110
|
|
|
83
111
|
AppLoader.show = (options?: LoaderOptions) => showLoader?.(options);
|
|
84
112
|
AppLoader.hide = () => hideLoader?.();
|
|
113
|
+
AppLoader.updateProgress = (progress: number) =>
|
|
114
|
+
updateProgressValue?.(progress);
|
package/src/checkOTAUpdate.ts
CHANGED
|
@@ -45,6 +45,15 @@ export const checkOTAUpdate = async ({
|
|
|
45
45
|
const downloadAndReport = () => {
|
|
46
46
|
AppLoader.show(loaderOptions);
|
|
47
47
|
hotUpdate.downloadBundleUri(ReactNativeBlobUtil, url, version, {
|
|
48
|
+
progress: (received, total) => {
|
|
49
|
+
if (loaderOptions?.showProgress) {
|
|
50
|
+
const percentage = (
|
|
51
|
+
(Number(received) / Number(total)) *
|
|
52
|
+
100
|
|
53
|
+
).toFixed(1);
|
|
54
|
+
AppLoader.updateProgress(Number(percentage));
|
|
55
|
+
}
|
|
56
|
+
},
|
|
48
57
|
updateSuccess: () => {
|
|
49
58
|
axios
|
|
50
59
|
.post(
|