react-native-3rddigital-appupdate 1.0.16 → 1.0.18

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 CHANGED
@@ -33,14 +33,17 @@ cd ios && pod install
33
33
 
34
34
  ```sh
35
35
  import React, { useEffect } from 'react';
36
- import { Alert, View, Text } from 'react-native';
36
+ import { Alert, Button, View, Text } from 'react-native';
37
37
  import {
38
38
  OTAProvider,
39
39
  checkOTAUpdate,
40
40
  consumeOTAUpdateSuccessState,
41
+ reloadAppForOTAUpdate,
41
42
  } from 'react-native-3rddigital-appupdate';
42
43
 
43
44
  const App = () => {
45
+ const [pendingUpdate, setPendingUpdate] = React.useState(null);
46
+
44
47
  useEffect(() => {
45
48
  const initializeOTAUpdate = async () => {
46
49
  const updateState = await consumeOTAUpdateSuccessState();
@@ -57,8 +60,11 @@ const App = () => {
57
60
  key: 'YOUR_PROJECT_KEY',
58
61
  iosPackage: 'com.example.ios',
59
62
  androidPackage: 'com.example.android',
60
- restartAfterInstall: true,
63
+ restartAfterInstall: false,
61
64
  restartDelay: 1000,
65
+ onUpdateInstalled: (state) => {
66
+ setPendingUpdate(state);
67
+ },
62
68
  loaderOptions: {
63
69
  text: 'Downloading update...',
64
70
  showProgress: true,
@@ -77,6 +83,12 @@ const App = () => {
77
83
  <OTAProvider>
78
84
  <View>
79
85
  <Text>My App Content</Text>
86
+ {pendingUpdate ? (
87
+ <Button
88
+ title={`Reload to apply OTA v${pendingUpdate.version}`}
89
+ onPress={reloadAppForOTAUpdate}
90
+ />
91
+ ) : null}
80
92
  </View>
81
93
  </OTAProvider>
82
94
  );
@@ -103,6 +115,7 @@ Options:
103
115
  | `androidPackage` | string | ✅ | Android bundle/package identifier |
104
116
  | `restartAfterInstall` | boolean | ❌ | Whether the app should restart automatically after OTA install. Defaults to `true` |
105
117
  | `restartDelay` | number | ❌ | Delay in milliseconds before restart after install. Defaults to `1000` |
118
+ | `onUpdateInstalled` | `(state: OTAUpdateSuccessState) => void` | ❌ | Called after the OTA bundle is installed, useful when `restartAfterInstall` is `false` and you want to trigger reload manually |
106
119
  | `loaderOptions` | object | ❌ | Customize loader UI (see below) |
107
120
  | `dialogOptions` | object | ❌ | Customize alert dialog UI (see below) |
108
121
 
@@ -125,6 +138,11 @@ Returns:
125
138
  | `appVersion` | string | Native app version associated with bundle |
126
139
  | `installedAt` | string | ISO timestamp when install completed |
127
140
 
141
+ 🔹 reloadAppForOTAUpdate()
142
+
143
+ - Manually reloads the app so an installed OTA bundle becomes active.
144
+ - Useful together with `restartAfterInstall: false` and `onUpdateInstalled`.
145
+
128
146
  🔹 Loader (AppLoader)
129
147
 
130
148
  - Global loader shown when downloading an update.
@@ -43,6 +43,9 @@ export const consumeOTAUpdateSuccessState = async () => {
43
43
  }
44
44
  return state;
45
45
  };
46
+ export const reloadAppForOTAUpdate = () => {
47
+ hotUpdate.resetApp();
48
+ };
46
49
  export const checkOTAUpdate = async ({
47
50
  key,
48
51
  iosPackage,
@@ -51,7 +54,8 @@ export const checkOTAUpdate = async ({
51
54
  dialogOptions,
52
55
  baseUrl,
53
56
  restartAfterInstall = true,
54
- restartDelay = 1000
57
+ restartDelay = 1000,
58
+ onUpdateInstalled
55
59
  }) => {
56
60
  try {
57
61
  const API_URL = baseUrl;
@@ -77,12 +81,13 @@ export const checkOTAUpdate = async ({
77
81
  }
78
82
  },
79
83
  updateSuccess: () => {
80
- persistOTAUpdateSuccessState({
84
+ const updateState = {
81
85
  bundleId,
82
86
  version,
83
87
  appVersion: bundleAppVersion,
84
88
  installedAt: new Date().toISOString()
85
- }).finally(() => {
89
+ };
90
+ persistOTAUpdateSuccessState(updateState).finally(() => {
86
91
  axios.post(`${API_URL}bundles/${bundleId}/count`, {
87
92
  status: 'success'
88
93
  }, {
@@ -93,6 +98,7 @@ export const checkOTAUpdate = async ({
93
98
  }).catch(error => {
94
99
  console.warn('Failed to finalize OTA update success handling:', error);
95
100
  });
101
+ onUpdateInstalled?.(updateState);
96
102
  },
97
103
  updateFail: error => {
98
104
  axios.post(`${API_URL}bundles/${bundleId}/count`, {
@@ -1 +1 @@
1
- {"version":3,"names":["axios","Platform","ReactNativeBlobUtil","DeviceInfo","hotUpdate","AppAlertDialog","AppLoader","OTA_UPDATE_SUCCESS_FILE","fs","dirs","CacheDir","persistOTAUpdateSuccessState","state","writeFile","JSON","stringify","error","console","warn","readOTAUpdateSuccessState","exists","content","readFile","parse","consumeOTAUpdateSuccessState","unlink","checkOTAUpdate","key","iosPackage","androidPackage","loaderOptions","dialogOptions","baseUrl","restartAfterInstall","restartDelay","API_URL","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","installedAt","Date","toISOString","finally","post","status","headers","hide","catch","updateFail","deviceInfo","model","getModel","brand","getBrand","systemName","getSystemName","systemVersion","getSystemVersion","showMessage","title","message","confirmText","cancelText","onConfirm","onCancel","err"],"sourceRoot":"../../src","sources":["checkOTAUpdate.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["axios","Platform","ReactNativeBlobUtil","DeviceInfo","hotUpdate","AppAlertDialog","AppLoader","OTA_UPDATE_SUCCESS_FILE","fs","dirs","CacheDir","persistOTAUpdateSuccessState","state","writeFile","JSON","stringify","error","console","warn","readOTAUpdateSuccessState","exists","content","readFile","parse","consumeOTAUpdateSuccessState","unlink","reloadAppForOTAUpdate","resetApp","checkOTAUpdate","key","iosPackage","androidPackage","loaderOptions","dialogOptions","baseUrl","restartAfterInstall","restartDelay","onUpdateInstalled","API_URL","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","updateState","installedAt","Date","toISOString","finally","post","status","headers","hide","catch","updateFail","deviceInfo","model","getModel","brand","getBrand","systemName","getSystemName","systemVersion","getSystemVersion","showMessage","title","message","confirmText","cancelText","onConfirm","onCancel","err"],"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;AAqB3D,MAAMC,uBAAuB,GAAG,GAAGL,mBAAmB,CAACM,EAAE,CAACC,IAAI,CAACC,QAAQ,0BAA0B;AAEjG,MAAMC,4BAA4B,GAAG,MAAOC,KAA4B,IAAK;EAC3E,IAAI;IACF,MAAMV,mBAAmB,CAACM,EAAE,CAACK,SAAS,CACpCN,uBAAuB,EACvBO,IAAI,CAACC,SAAS,CAACH,KAAK,CAAC,EACrB,MACF,CAAC;EACH,CAAC,CAAC,OAAOI,KAAK,EAAE;IACdC,OAAO,CAACC,IAAI,CAAC,6CAA6C,EAAEF,KAAK,CAAC;EACpE;AACF,CAAC;AAED,MAAMG,yBAAyB,GAAG,MAAAA,CAAA,KAAY;EAC5C,IAAI;IACF,MAAMC,MAAM,GAAG,MAAMlB,mBAAmB,CAACM,EAAE,CAACY,MAAM,CAACb,uBAAuB,CAAC;IAE3E,IAAI,CAACa,MAAM,EAAE;MACX,OAAO,IAAI;IACb;IAEA,MAAMC,OAAO,GAAG,MAAMnB,mBAAmB,CAACM,EAAE,CAACc,QAAQ,CACnDf,uBAAuB,EACvB,MACF,CAAC;IACD,OAAOO,IAAI,CAACS,KAAK,CAACF,OAAO,CAAC;EAC5B,CAAC,CAAC,OAAOL,KAAK,EAAE;IACdC,OAAO,CAACC,IAAI,CAAC,0CAA0C,EAAEF,KAAK,CAAC;IAC/D,OAAO,IAAI;EACb;AACF,CAAC;AAED,OAAO,MAAMQ,4BAA4B,GAAG,MAAAA,CAAA,KAAY;EACtD,MAAMZ,KAAK,GAAG,MAAMO,yBAAyB,CAAC,CAAC;EAE/C,IAAI,CAACP,KAAK,EAAE;IACV,OAAO,IAAI;EACb;EAEA,IAAI;IACF,MAAMQ,MAAM,GAAG,MAAMlB,mBAAmB,CAACM,EAAE,CAACY,MAAM,CAACb,uBAAuB,CAAC;IAE3E,IAAIa,MAAM,EAAE;MACV,MAAMlB,mBAAmB,CAACM,EAAE,CAACiB,MAAM,CAAClB,uBAAuB,CAAC;IAC9D;EACF,CAAC,CAAC,OAAOS,KAAK,EAAE;IACdC,OAAO,CAACC,IAAI,CAAC,2CAA2C,EAAEF,KAAK,CAAC;EAClE;EAEA,OAAOJ,KAAK;AACd,CAAC;AAED,OAAO,MAAMc,qBAAqB,GAAGA,CAAA,KAAM;EACzCtB,SAAS,CAACuB,QAAQ,CAAC,CAAC;AACtB,CAAC;AAED,OAAO,MAAMC,cAAc,GAAG,MAAAA,CAAO;EACnCC,GAAG;EACHC,UAAU;EACVC,cAAc;EACdC,aAAa;EACbC,aAAa;EACbC,OAAO;EACPC,mBAAmB,GAAG,IAAI;EAC1BC,YAAY,GAAG,IAAI;EACnBC;AACc,CAAC,KAAK;EACpB,IAAI;IACF,MAAMC,OAAO,GAAGJ,OAAO;IACvB,MAAMK,QAAQ,GAAG,MAAMvC,KAAK,CAACwC,GAAG,CAC9B,GAAGF,OAAO,2BAA2BT,GAAG,eAAeC,UAAU,mBAAmBC,cAAc,EACpG,CAAC;IAED,MAAMU,cAAc,GAAG,MAAMrC,SAAS,CAACsC,iBAAiB,CAAC,CAAC;IAC1D,MAAMC,IAAI,GACR1C,QAAQ,CAAC2C,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,GAAGhD,UAAU,CAACiD,UAAU,CAAC,CAAC;IACjD,MAAMC,gBAAgB,GAAGV,IAAI,EAAEW,UAAU,IAAIH,iBAAiB;IAE9D,IAAIJ,OAAO,IAAIN,cAAc,IAAIU,iBAAiB,KAAKE,gBAAgB,EAAE;MACvE;IACF;IAEA,MAAME,iBAAiB,GAAGA,CAAA,KAAM;MAC9BjD,SAAS,CAACkD,IAAI,CAACxB,aAAa,CAAC;MAC7B5B,SAAS,CAACqD,iBAAiB,CAACvD,mBAAmB,EAAE+C,GAAG,EAAEF,OAAO,EAAE;QAC7DW,QAAQ,EAAEA,CAACC,QAAQ,EAAEC,KAAK,KAAK;UAC7B,IAAI5B,aAAa,EAAE6B,YAAY,EAAE;YAC/B,MAAMC,UAAU,GAAG,CAChBC,MAAM,CAACJ,QAAQ,CAAC,GAAGI,MAAM,CAACH,KAAK,CAAC,GACjC,GAAG,EACHI,OAAO,CAAC,CAAC,CAAC;YACZ1D,SAAS,CAAC2D,cAAc,CAACF,MAAM,CAACD,UAAU,CAAC,CAAC;UAC9C;QACF,CAAC;QACDI,aAAa,EAAEA,CAAA,KAAM;UACnB,MAAMC,WAAW,GAAG;YAClBjB,QAAQ;YACRH,OAAO;YACPO,UAAU,EAAED,gBAAgB;YAC5Be,WAAW,EAAE,IAAIC,IAAI,CAAC,CAAC,CAACC,WAAW,CAAC;UACtC,CAAC;UAED3D,4BAA4B,CAACwD,WAAW,CAAC,CACtCI,OAAO,CAAC,MAAM;YACbvE,KAAK,CACFwE,IAAI,CACH,GAAGlC,OAAO,WAAWY,QAAQ,QAAQ,EACrC;cAAEuB,MAAM,EAAE;YAAU,CAAC,EACrB;cAAEC,OAAO,EAAE;gBAAE,cAAc,EAAE;cAAmB;YAAE,CACpD,CAAC,CACAH,OAAO,CAAC,MAAMjE,SAAS,CAACqE,IAAI,CAAC,CAAC,CAAC;UACpC,CAAC,CAAC,CACDC,KAAK,CAAE5D,KAAK,IAAK;YAChBC,OAAO,CAACC,IAAI,CACV,iDAAiD,EACjDF,KACF,CAAC;UACH,CAAC,CAAC;UAEJqB,iBAAiB,GAAG8B,WAAW,CAAC;QAClC,CAAC;QACDU,UAAU,EAAG7D,KAAK,IAAK;UACrBhB,KAAK,CACFwE,IAAI,CACH,GAAGlC,OAAO,WAAWY,QAAQ,QAAQ,EACrC;YACEuB,MAAM,EAAE,SAAS;YACjBzD,KAAK,EAAEF,IAAI,CAACC,SAAS,CAACC,KAAK,CAAC;YAC5B8D,UAAU,EAAE;cACVC,KAAK,EAAE5E,UAAU,CAAC6E,QAAQ,CAAC,CAAC;cAC5BC,KAAK,EAAE9E,UAAU,CAAC+E,QAAQ,CAAC,CAAC;cAC5BC,UAAU,EAAEhF,UAAU,CAACiF,aAAa,CAAC,CAAC;cACtCC,aAAa,EAAElF,UAAU,CAACmF,gBAAgB,CAAC;YAC7C;UACF,CAAC,EACD;YAAEZ,OAAO,EAAE;cAAE,cAAc,EAAE;YAAmB;UAAE,CACpD,CAAC,CACAH,OAAO,CAAC,MAAMjE,SAAS,CAACqE,IAAI,CAAC,CAAC,CAAC;QACpC,CAAC;QACDxC,mBAAmB;QACnBC;MACF,CAAC,CAAC;IACJ,CAAC;IAED,IAAIY,WAAW,EAAE;MACfO,iBAAiB,CAAC,CAAC;IACrB,CAAC,MAAM;MACLlD,cAAc,CAACkF,WAAW,CAAC;QACzBC,KAAK,EAAE,mBAAmB;QAC1BC,OAAO,EAAE,sCAAsC;QAC/CC,WAAW,EAAE,QAAQ;QACrBC,UAAU,EAAE,QAAQ;QACpBC,SAAS,EAAErC,iBAAiB;QAC5BsC,QAAQ,EAAEA,CAAA,KAAM,CAAC,CAAC;QAClB,GAAG5D;MACL,CAAC,CAAC;IACJ;EACF,CAAC,CAAC,OAAO6D,GAAG,EAAE;IACZ7E,OAAO,CAACC,IAAI,CAAC,0BAA0B,EAAE4E,GAAG,CAAC;EAC/C;AACF,CAAC","ignoreList":[]}
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
2
 
3
- export { checkOTAUpdate, consumeOTAUpdateSuccessState } from "./checkOTAUpdate.js";
3
+ export { checkOTAUpdate, consumeOTAUpdateSuccessState, reloadAppForOTAUpdate } from "./checkOTAUpdate.js";
4
4
  export { OTAProvider } from "./OTAProvider.js";
5
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["checkOTAUpdate","consumeOTAUpdateSuccessState","OTAProvider"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,SACEA,cAAc,EACdC,4BAA4B,QAGvB,qBAAkB;AACzB,SAASC,WAAW,QAAQ,kBAAe","ignoreList":[]}
1
+ {"version":3,"names":["checkOTAUpdate","consumeOTAUpdateSuccessState","reloadAppForOTAUpdate","OTAProvider"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,SACEA,cAAc,EACdC,4BAA4B,EAC5BC,qBAAqB,QAGhB,qBAAkB;AACzB,SAASC,WAAW,QAAQ,kBAAe","ignoreList":[]}
@@ -9,6 +9,7 @@ export type OTAUpdateProps = {
9
9
  baseUrl: string;
10
10
  restartAfterInstall?: boolean;
11
11
  restartDelay?: number;
12
+ onUpdateInstalled?: (state: OTAUpdateSuccessState) => void;
12
13
  };
13
14
  export type OTAUpdateSuccessState = {
14
15
  bundleId: string;
@@ -17,5 +18,6 @@ export type OTAUpdateSuccessState = {
17
18
  installedAt: string;
18
19
  };
19
20
  export declare const consumeOTAUpdateSuccessState: () => Promise<OTAUpdateSuccessState | null>;
20
- export declare const checkOTAUpdate: ({ key, iosPackage, androidPackage, loaderOptions, dialogOptions, baseUrl, restartAfterInstall, restartDelay, }: OTAUpdateProps) => Promise<void>;
21
+ export declare const reloadAppForOTAUpdate: () => void;
22
+ export declare const checkOTAUpdate: ({ key, iosPackage, androidPackage, loaderOptions, dialogOptions, baseUrl, restartAfterInstall, restartDelay, onUpdateInstalled, }: OTAUpdateProps) => Promise<void>;
21
23
  //# sourceMappingURL=checkOTAUpdate.d.ts.map
@@ -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;AAE5D,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;IAC9D,OAAO,EAAE,MAAM,CAAC;IAChB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAmCF,eAAO,MAAM,4BAA4B,6CAkBxC,CAAC;AAEF,eAAO,MAAM,cAAc,GAAU,gHASlC,cAAc,kBA+FhB,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;AAE5D,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;IAC9D,OAAO,EAAE,MAAM,CAAC;IAChB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,CAAC;CAC5D,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAmCF,eAAO,MAAM,4BAA4B,6CAkBxC,CAAC;AAEF,eAAO,MAAM,qBAAqB,YAEjC,CAAC;AAEF,eAAO,MAAM,cAAc,GAAU,mIAUlC,cAAc,kBAmGhB,CAAC"}
@@ -1,3 +1,3 @@
1
- export { checkOTAUpdate, consumeOTAUpdateSuccessState, type OTAUpdateProps, type OTAUpdateSuccessState, } from './checkOTAUpdate';
1
+ export { checkOTAUpdate, consumeOTAUpdateSuccessState, reloadAppForOTAUpdate, type OTAUpdateProps, type OTAUpdateSuccessState, } from './checkOTAUpdate';
2
2
  export { OTAProvider } from './OTAProvider';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,4BAA4B,EAC5B,KAAK,cAAc,EACnB,KAAK,qBAAqB,GAC3B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,4BAA4B,EAC5B,qBAAqB,EACrB,KAAK,cAAc,EACnB,KAAK,qBAAqB,GAC3B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-3rddigital-appupdate",
3
- "version": "1.0.16",
3
+ "version": "1.0.18",
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
@@ -340,6 +340,15 @@ function isAppLikeTarget(targetName, productType) {
340
340
  ].some((suffix) => targetName.endsWith(suffix));
341
341
  }
342
342
 
343
+ function choosePreferredBuildConfig(buildConfigs, preferredNames = []) {
344
+ for (const preferredName of preferredNames) {
345
+ const match = buildConfigs.find((config) => config.name === preferredName);
346
+ if (match) return match;
347
+ }
348
+
349
+ return buildConfigs[0] ?? null;
350
+ }
351
+
343
352
  function getAndroidBuildGradlePath(projectRoot) {
344
353
  return findFirstExistingPath([
345
354
  path.join(projectRoot, 'android', 'app', 'build.gradle'),
@@ -477,6 +486,7 @@ function getIosTargetMetadata() {
477
486
  configObjects.map((config) => [
478
487
  config.id,
479
488
  {
489
+ id: config.id,
480
490
  name: cleanPbxString(readPbxValue(config.body, 'name')),
481
491
  version: cleanPbxString(readPbxValue(config.body, 'MARKETING_VERSION')),
482
492
  appId: cleanPbxString(
@@ -534,34 +544,76 @@ function getIosTargetMetadata() {
534
544
  .map((configId) => configMap.get(configId))
535
545
  .filter(Boolean) ?? [];
536
546
 
537
- const preferredConfig =
538
- buildConfigs.find(
539
- (config) => config.name === configList?.defaultName
540
- ) ??
541
- buildConfigs.find((config) => config.name === 'Release') ??
542
- buildConfigs[0];
543
-
544
- if (!preferredConfig) return null;
545
-
546
- const buildConfigurationLabel = preferredConfig.name
547
- ? ` [${preferredConfig.name}]`
548
- : '';
549
-
550
- return {
551
- name: targetName,
552
- label: `${targetName}${buildConfigurationLabel}`,
553
- appId: preferredConfig.appId ?? null,
554
- version: preferredConfig.version ?? null,
555
- productName: preferredConfig.productName ?? targetName,
556
- buildConfiguration: preferredConfig.name ?? null,
557
- };
547
+ if (!buildConfigs.length) return null;
548
+
549
+ const buildConfigsWithAppId = buildConfigs.filter(
550
+ (config) => config.appId
551
+ );
552
+
553
+ const configsByAppId = new Map();
554
+ for (const buildConfig of buildConfigsWithAppId) {
555
+ const appIdKey = buildConfig.appId;
556
+ if (!configsByAppId.has(appIdKey)) {
557
+ configsByAppId.set(appIdKey, []);
558
+ }
559
+
560
+ configsByAppId.get(appIdKey).push(buildConfig);
561
+ }
562
+
563
+ const preferredConfigNames = [
564
+ configList?.defaultName,
565
+ 'Release',
566
+ 'Profile',
567
+ 'Debug',
568
+ ].filter(Boolean);
569
+
570
+ const distinctConfigs =
571
+ configsByAppId.size <= 1
572
+ ? [
573
+ choosePreferredBuildConfig(
574
+ buildConfigsWithAppId.length
575
+ ? buildConfigsWithAppId
576
+ : buildConfigs,
577
+ preferredConfigNames
578
+ ),
579
+ ].filter(Boolean)
580
+ : Array.from(configsByAppId.values())
581
+ .map((configGroup) =>
582
+ choosePreferredBuildConfig(configGroup, preferredConfigNames)
583
+ )
584
+ .filter(Boolean);
585
+
586
+ return distinctConfigs.map((selectedConfig) => {
587
+ const buildConfigurationLabel = selectedConfig.name
588
+ ? ` [${selectedConfig.name}]`
589
+ : '';
590
+
591
+ const appIdLabel = selectedConfig.appId
592
+ ? ` (${selectedConfig.appId})`
593
+ : '';
594
+
595
+ return {
596
+ name: `${targetName}::${selectedConfig.appId ?? selectedConfig.id ?? 'no-app-id'}`,
597
+ targetName,
598
+ label: `${targetName}${buildConfigurationLabel}${appIdLabel}`,
599
+ appId: selectedConfig.appId ?? null,
600
+ version: selectedConfig.version ?? null,
601
+ productName: selectedConfig.productName ?? targetName,
602
+ buildConfiguration: selectedConfig.name ?? null,
603
+ };
604
+ });
558
605
  })
606
+ .flat()
559
607
  .filter(Boolean);
560
608
 
561
609
  const uniqueTargets = targets.filter(
562
610
  (target, index, allTargets) =>
563
- allTargets.findIndex((candidate) => candidate.name === target.name) ===
564
- index
611
+ allTargets.findIndex((candidate) =>
612
+ candidate.appId
613
+ ? candidate.appId === target.appId
614
+ : candidate.targetName === target.targetName &&
615
+ candidate.buildConfiguration === target.buildConfiguration
616
+ ) === index
565
617
  );
566
618
 
567
619
  return {
@@ -15,6 +15,7 @@ export type OTAUpdateProps = {
15
15
  baseUrl: string;
16
16
  restartAfterInstall?: boolean;
17
17
  restartDelay?: number;
18
+ onUpdateInstalled?: (state: OTAUpdateSuccessState) => void;
18
19
  };
19
20
 
20
21
  export type OTAUpdateSuccessState = {
@@ -77,6 +78,10 @@ export const consumeOTAUpdateSuccessState = async () => {
77
78
  return state;
78
79
  };
79
80
 
81
+ export const reloadAppForOTAUpdate = () => {
82
+ hotUpdate.resetApp();
83
+ };
84
+
80
85
  export const checkOTAUpdate = async ({
81
86
  key,
82
87
  iosPackage,
@@ -86,6 +91,7 @@ export const checkOTAUpdate = async ({
86
91
  baseUrl,
87
92
  restartAfterInstall = true,
88
93
  restartDelay = 1000,
94
+ onUpdateInstalled,
89
95
  }: OTAUpdateProps) => {
90
96
  try {
91
97
  const API_URL = baseUrl;
@@ -120,12 +126,14 @@ export const checkOTAUpdate = async ({
120
126
  }
121
127
  },
122
128
  updateSuccess: () => {
123
- persistOTAUpdateSuccessState({
129
+ const updateState = {
124
130
  bundleId,
125
131
  version,
126
132
  appVersion: bundleAppVersion,
127
133
  installedAt: new Date().toISOString(),
128
- })
134
+ };
135
+
136
+ persistOTAUpdateSuccessState(updateState)
129
137
  .finally(() => {
130
138
  axios
131
139
  .post(
@@ -141,6 +149,8 @@ export const checkOTAUpdate = async ({
141
149
  error
142
150
  );
143
151
  });
152
+
153
+ onUpdateInstalled?.(updateState);
144
154
  },
145
155
  updateFail: (error) => {
146
156
  axios
package/src/index.tsx CHANGED
@@ -1,6 +1,7 @@
1
1
  export {
2
2
  checkOTAUpdate,
3
3
  consumeOTAUpdateSuccessState,
4
+ reloadAppForOTAUpdate,
4
5
  type OTAUpdateProps,
5
6
  type OTAUpdateSuccessState,
6
7
  } from './checkOTAUpdate';