@savers_app/react-native-sdk 1.2.2 → 1.2.3
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 +30 -6
- package/lib/module/data/models/onboardingModel.js +8 -8
- package/lib/module/data/models/onboardingModel.js.map +1 -1
- package/lib/module/services/navigation/dialPad.js.map +1 -1
- package/lib/module/services/navigation/goBackNavigation.js +7 -8
- package/lib/module/services/navigation/goBackNavigation.js.map +1 -1
- package/lib/module/utils/encryption.js +1 -1
- package/lib/module/utils/encryption.js.map +1 -1
- package/lib/typescript/src/data/models/onboardingModel.d.ts.map +1 -1
- package/lib/typescript/src/services/navigation/goBackNavigation.d.ts +1 -1
- package/lib/typescript/src/services/navigation/goBackNavigation.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/data/models/onboardingModel.ts +17 -19
- package/src/services/navigation/dialPad.ts +2 -2
- package/src/services/navigation/goBackNavigation.ts +7 -8
- package/src/utils/encryption.ts +1 -1
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@ React Native SDK that bridges host app features like maps, dialer, browser, devi
|
|
|
6
6
|
- Open native maps by coordinates with graceful browser fallback
|
|
7
7
|
- Dial pad invocation with optional number and direct call helper
|
|
8
8
|
- External browser navigation from the host app or from web content
|
|
9
|
-
- Close current screen via
|
|
9
|
+
- Close current screen via a binder component (React Navigation) using **END_SESSION** (no ref on NavigationContainer)
|
|
10
10
|
- Device ID retrieval (via `react-native-device-info`)
|
|
11
11
|
- Optional device location retrieval and URL payload enrichment
|
|
12
12
|
- Session and keys management (API key, encryption key, program ref code, auth mode)
|
|
@@ -181,16 +181,36 @@ Notes:
|
|
|
181
181
|
|
|
182
182
|
## Navigation (End Session)
|
|
183
183
|
|
|
184
|
-
The SDK can close the current screen without knowing the host app's navigation structure
|
|
184
|
+
The SDK can close the current screen without knowing the host app's navigation structure. This is useful for flows initiated from web content or deep links that need to programmatically exit back to the host app.
|
|
185
185
|
|
|
186
|
-
One-time host app setup:
|
|
186
|
+
One-time host app setup (binder component):
|
|
187
187
|
|
|
188
188
|
```tsx
|
|
189
|
-
import {
|
|
190
|
-
import {
|
|
189
|
+
import { useEffect } from 'react';
|
|
190
|
+
import { NavigationContainer, useNavigation } from '@react-navigation/native';
|
|
191
|
+
import { setGoBackImpl } from '@savers_app/react-native-sdk';
|
|
192
|
+
|
|
193
|
+
function SaversNavBinder() {
|
|
194
|
+
const navigation = useNavigation();
|
|
195
|
+
useEffect(() => {
|
|
196
|
+
setGoBackImpl(() => {
|
|
197
|
+
if (navigation.canGoBack()) {
|
|
198
|
+
navigation.goBack();
|
|
199
|
+
return true;
|
|
200
|
+
}
|
|
201
|
+
return false;
|
|
202
|
+
});
|
|
203
|
+
}, [navigation]);
|
|
204
|
+
return null;
|
|
205
|
+
}
|
|
191
206
|
|
|
192
207
|
export function App() {
|
|
193
|
-
return
|
|
208
|
+
return (
|
|
209
|
+
<NavigationContainer>
|
|
210
|
+
<SaversNavBinder />
|
|
211
|
+
{/* your navigators */}
|
|
212
|
+
</NavigationContainer>
|
|
213
|
+
);
|
|
194
214
|
}
|
|
195
215
|
```
|
|
196
216
|
|
|
@@ -203,6 +223,10 @@ closeCurrentScreen(); // returns boolean
|
|
|
203
223
|
closeCurrentScreenSafe(); // Android-only fallback to exitApp if it can't goBack()
|
|
204
224
|
```
|
|
205
225
|
|
|
226
|
+
Notes:
|
|
227
|
+
- No `ref` is required on your `NavigationContainer`.
|
|
228
|
+
- The binder component wires the SDK to React Navigation using context, enabling `closeCurrentScreen()` to work anywhere.
|
|
229
|
+
|
|
206
230
|
## WebView Integration
|
|
207
231
|
|
|
208
232
|
Trigger native actions from web & bind `onMessage` to a `WebView`:
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
export function onBoardingImageFromJson(json) {
|
|
4
4
|
return {
|
|
5
|
-
id: typeof json
|
|
6
|
-
url: typeof json
|
|
5
|
+
id: typeof json.id === 'number' ? json.id : null,
|
|
6
|
+
url: typeof json.url === 'string' ? json.url : null
|
|
7
7
|
};
|
|
8
8
|
}
|
|
9
9
|
export function onBoardingImageListFromJson(list) {
|
|
@@ -21,9 +21,9 @@ export function onBoardingThemeFromJson(json) {
|
|
|
21
21
|
const map = {
|
|
22
22
|
...json
|
|
23
23
|
};
|
|
24
|
-
const imagesRaw = Array.isArray(map
|
|
24
|
+
const imagesRaw = Array.isArray(map.images) ? map.images : [];
|
|
25
25
|
const images = onBoardingImageListFromJson(imagesRaw);
|
|
26
|
-
const total = typeof map
|
|
26
|
+
const total = typeof map.total === 'number' ? map.total : typeof map.total === 'string' ? Number(map.total) : null;
|
|
27
27
|
return {
|
|
28
28
|
total: total ?? null,
|
|
29
29
|
images: images.length > 0 ? images : null
|
|
@@ -35,15 +35,15 @@ export function onBoardingDataFromJson(json) {
|
|
|
35
35
|
};
|
|
36
36
|
const hasDayNight = 'day' in map || 'night' in map;
|
|
37
37
|
if (hasDayNight) {
|
|
38
|
-
const day = map
|
|
39
|
-
const night = map
|
|
38
|
+
const day = map.day ? onBoardingThemeFromJson(map.day) : null;
|
|
39
|
+
const night = map.night ? onBoardingThemeFromJson(map.night) : null;
|
|
40
40
|
return {
|
|
41
41
|
day,
|
|
42
42
|
night
|
|
43
43
|
};
|
|
44
44
|
}
|
|
45
|
-
const legacyImages = Array.isArray(map
|
|
46
|
-
const legacyTotal = typeof map
|
|
45
|
+
const legacyImages = Array.isArray(map.images) ? onBoardingImageListFromJson(map.images) : [];
|
|
46
|
+
const legacyTotal = typeof map.total === 'number' ? map.total : typeof map.total === 'string' ? Number(map.total) : null;
|
|
47
47
|
const legacyTheme = {
|
|
48
48
|
total: legacyTotal ?? null,
|
|
49
49
|
images: legacyImages.length > 0 ? legacyImages : null
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["onBoardingImageFromJson","json","id","url","onBoardingImageListFromJson","list","out","item","Array","isArray","push","onBoardingThemeFromJson","map","imagesRaw","images","total","Number","length","onBoardingDataFromJson","hasDayNight","day","night","legacyImages","legacyTotal","legacyTheme","d","hasTotal","hasImages","imageCount","isValid","getImage","index"],"sourceRoot":"../../../../src","sources":["data/models/onboardingModel.ts"],"mappings":";;AAKA,OAAO,SAASA,uBAAuBA,CACrCC,IAAyB,EACR;EACjB,OAAO;IACLC,EAAE,EAAE,OAAOD,IAAI,
|
|
1
|
+
{"version":3,"names":["onBoardingImageFromJson","json","id","url","onBoardingImageListFromJson","list","out","item","Array","isArray","push","onBoardingThemeFromJson","map","imagesRaw","images","total","Number","length","onBoardingDataFromJson","hasDayNight","day","night","legacyImages","legacyTotal","legacyTheme","d","hasTotal","hasImages","imageCount","isValid","getImage","index"],"sourceRoot":"../../../../src","sources":["data/models/onboardingModel.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Linking","Platform","isValidPhoneNumber","callPhone","phone","Error","url","OS","openURL","openDialPad"],"sourceRoot":"../../../../src","sources":["services/navigation/dialPad.ts"],"mappings":";;AAAA;AACA,SAASA,OAAO,EAAEC,QAAQ,QAAQ,cAAc;;AAEhD;AACA,SAASC,kBAAkB,QAAQ,0BAAuB;AAE1D,OAAO,MAAMC,SAAS,GAAG,MAAOC,KAAa,IAAoB;EAC/D,IAAI,CAACF,kBAAkB,CAACE,KAAK,CAAC,EAAE;IAC9B,MAAM,IAAIC,KAAK,CAAC,sBAAsB,CAAC;EACzC;EAEA,MAAMC,GAAG,GACPL,QAAQ,CAACM,EAAE,KAAK,KAAK,GACjB,aAAaH,KAAK,EAAE,CAAC;EAAA,EACrB,OAAOA,KAAK,EAAE;EAEpB,IAAI;IACF,MAAMJ,OAAO,CAACQ,OAAO,CAACF,GAAG,CAAC;EAC5B,CAAC,CAAC,MAAM;IACN,MAAM,IAAID,KAAK,CAAC,oBAAoB,CAAC;EACvC;AACF,CAAC;AAED,OAAO,eAAeI,WAAWA,CAACL,KAAc,EAAiB;EAC/D,MAAME,GAAG,GACPL,QAAQ,CAACM,EAAE,KAAK,KAAK,GACjBH,KAAK,GACH,aAAaA,KAAK,EAAE,GACpB,MAAM,CAAC;EAAA,EACTA,KAAK,
|
|
1
|
+
{"version":3,"names":["Linking","Platform","isValidPhoneNumber","callPhone","phone","Error","url","OS","openURL","openDialPad"],"sourceRoot":"../../../../src","sources":["services/navigation/dialPad.ts"],"mappings":";;AAAA;AACA,SAASA,OAAO,EAAEC,QAAQ,QAAQ,cAAc;;AAEhD;AACA,SAASC,kBAAkB,QAAQ,0BAAuB;AAE1D,OAAO,MAAMC,SAAS,GAAG,MAAOC,KAAa,IAAoB;EAC/D,IAAI,CAACF,kBAAkB,CAACE,KAAK,CAAC,EAAE;IAC9B,MAAM,IAAIC,KAAK,CAAC,sBAAsB,CAAC;EACzC;EAEA,MAAMC,GAAG,GACPL,QAAQ,CAACM,EAAE,KAAK,KAAK,GACjB,aAAaH,KAAK,EAAE,CAAC;EAAA,EACrB,OAAOA,KAAK,EAAE;EAEpB,IAAI;IACF,MAAMJ,OAAO,CAACQ,OAAO,CAACF,GAAG,CAAC;EAC5B,CAAC,CAAC,MAAM;IACN,MAAM,IAAID,KAAK,CAAC,oBAAoB,CAAC;EACvC;AACF,CAAC;AAED,OAAO,eAAeI,WAAWA,CAACL,KAAc,EAAiB;EAC/D,MAAME,GAAG,GACPL,QAAQ,CAACM,EAAE,KAAK,KAAK,GACjBH,KAAK,GACH,aAAaA,KAAK,EAAE,GACpB,MAAM,CAAC;EAAA,EACTA,KAAK,GACH,OAAOA,KAAK,EAAE,GACd,MAAM;EAEd,IAAI;IACF,MAAMJ,OAAO,CAACQ,OAAO,CAACF,GAAG,CAAC;EAC5B,CAAC,CAAC,MAAM;IACN,MAAM,IAAID,KAAK,CAAC,wBAAwB,CAAC;EAC3C;AACF","ignoreList":[]}
|
|
@@ -2,15 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
// React Native Core
|
|
4
4
|
import { BackHandler, Platform } from 'react-native';
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
let goBackFn = null;
|
|
6
|
+
export function setGoBackImpl(fn) {
|
|
7
|
+
goBackFn = fn;
|
|
8
|
+
}
|
|
9
9
|
export function closeCurrentScreen() {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
}
|
|
10
|
+
try {
|
|
11
|
+
if (goBackFn) return !!goBackFn();
|
|
12
|
+
} catch {}
|
|
14
13
|
return false;
|
|
15
14
|
}
|
|
16
15
|
export function closeCurrentScreenSafe() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["BackHandler","Platform","
|
|
1
|
+
{"version":3,"names":["BackHandler","Platform","goBackFn","setGoBackImpl","fn","closeCurrentScreen","closeCurrentScreenSafe","closed","OS","exitApp"],"sourceRoot":"../../../../src","sources":["services/navigation/goBackNavigation.ts"],"mappings":";;AAAA;AACA,SAASA,WAAW,EAAEC,QAAQ,QAAQ,cAAc;AAEpD,IAAIC,QAAgC,GAAG,IAAI;AAC3C,OAAO,SAASC,aAAaA,CAACC,EAAiB,EAAE;EAC/CF,QAAQ,GAAGE,EAAE;AACf;AAEA,OAAO,SAASC,kBAAkBA,CAAA,EAAY;EAC5C,IAAI;IACF,IAAIH,QAAQ,EAAE,OAAO,CAAC,CAACA,QAAQ,CAAC,CAAC;EACnC,CAAC,CAAC,MAAM,CAAC;EACT,OAAO,KAAK;AACd;AAEA,OAAO,SAASI,sBAAsBA,CAAA,EAAS;EAC7C,MAAMC,MAAM,GAAGF,kBAAkB,CAAC,CAAC;EACnC,IAAI,CAACE,MAAM,IAAIN,QAAQ,CAACO,EAAE,KAAK,SAAS,EAAE;IACxCR,WAAW,CAACS,OAAO,CAAC,CAAC;EACvB;AACF","ignoreList":[]}
|
|
@@ -19,7 +19,7 @@ function isBase64(input) {
|
|
|
19
19
|
return /^[A-Za-z0-9+/]+={0,2}$/.test(input);
|
|
20
20
|
}
|
|
21
21
|
function base64ByteLength(b64) {
|
|
22
|
-
const cleaned = b64.replace(
|
|
22
|
+
const cleaned = b64.replace(/[=]+$/, '');
|
|
23
23
|
return Math.floor(cleaned.length * 3 / 4);
|
|
24
24
|
}
|
|
25
25
|
export async function aesEncrypt(text, key) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["NativeModules","AesGcmCrypto","ensureAesAvailable","nativeModule","RNAesGcmCrypto","Error","encrypt","isBase64","input","test","base64ByteLength","b64","cleaned","replace","Math","floor","length","aesEncrypt","text","key","iv","tag","content","base64Encrypt","err","message","aesDecrypt","ciphertext","split","decrypted","decrypt","plain","utf8","encodeURIComponent","_","p1","String","fromCharCode","parseInt","btoa","base64Decrypt","encoded","binary","atob","map","c","charCodeAt","toString","slice","join","decodeURIComponent"],"sourceRoot":"../../../src","sources":["utils/encryption.ts"],"mappings":";;AAAA,SAASA,aAAa,QAAQ,cAAc;AAC5C,OAAOC,YAAY,MAAM,6BAA6B;;AAEtD;AACA;AACA;AACA,SAASC,kBAAkBA,CAAA,EAAG;EAC5B,MAAMC,YAAY,GAChBH,aAAa,CAACC,YAAY,IAAID,aAAa,CAACI,cAAc;EAE5D,IAAI,CAACH,YAAY,IAAI,CAACE,YAAY,EAAE;IAClC,MAAM,IAAIE,KAAK,CACb,uEAAuE,GACrE,QAAQ,GACR,2CAA2C,GAC3C,4BAA4B,GAC5B,sBACJ,CAAC;EACH;EAEA,IAAI,OAAOJ,YAAY,CAACK,OAAO,KAAK,UAAU,EAAE;IAC9C,MAAM,IAAID,KAAK,CACb,+DACF,CAAC;EACH;AACF;AAEA,SAASE,QAAQA,CAACC,KAAa,EAAW;EACxC,OAAO,wBAAwB,CAACC,IAAI,CAACD,KAAK,CAAC;AAC7C;AAEA,SAASE,gBAAgBA,CAACC,GAAW,EAAU;EAC7C,MAAMC,OAAO,GAAGD,GAAG,CAACE,OAAO,CAAC,
|
|
1
|
+
{"version":3,"names":["NativeModules","AesGcmCrypto","ensureAesAvailable","nativeModule","RNAesGcmCrypto","Error","encrypt","isBase64","input","test","base64ByteLength","b64","cleaned","replace","Math","floor","length","aesEncrypt","text","key","iv","tag","content","base64Encrypt","err","message","aesDecrypt","ciphertext","split","decrypted","decrypt","plain","utf8","encodeURIComponent","_","p1","String","fromCharCode","parseInt","btoa","base64Decrypt","encoded","binary","atob","map","c","charCodeAt","toString","slice","join","decodeURIComponent"],"sourceRoot":"../../../src","sources":["utils/encryption.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onboardingModel.d.ts","sourceRoot":"","sources":["../../../../../src/data/models/onboardingModel.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB,CAAC;AAEF,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GACxB,eAAe,CAKjB;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,eAAe,EAAE,CAU1E;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC;CACnC,CAAC;AAEF,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,GAAG,GAAG,mBAAmB,
|
|
1
|
+
{"version":3,"file":"onboardingModel.d.ts","sourceRoot":"","sources":["../../../../../src/data/models/onboardingModel.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB,CAAC;AAEF,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GACxB,eAAe,CAKjB;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,eAAe,EAAE,CAU1E;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC;CACnC,CAAC;AAEF,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,GAAG,GAAG,mBAAmB,CActE;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,GAAG,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACjC,KAAK,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;CACpC,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,GAAG,GAAG,cAAc,CAsBhE;AAED,eAAO,MAAM,MAAM,GAAI,IAAI,cAAc,GAAG,IAAI,KAAG,eAAe,EAAE,GAAG,IAC3B,CAAC;AAC7C,eAAO,MAAM,KAAK,GAAI,IAAI,cAAc,GAAG,IAAI,KAAG,MAAM,GAAG,IACjB,CAAC;AAC3C,eAAO,MAAM,QAAQ,GAAI,IAAI,cAAc,GAAG,IAAI,KAAG,OAClC,CAAC;AACpB,eAAO,MAAM,SAAS,GAAI,IAAI,cAAc,GAAG,IAAI,KAAG,OACT,CAAC;AAC9C,eAAO,MAAM,UAAU,GAAI,IAAI,cAAc,GAAG,IAAI,KAAG,MAC/B,CAAC;AACzB,eAAO,MAAM,OAAO,GAAI,IAAI,cAAc,GAAG,IAAI,KAAG,OAEX,CAAC;AAC1C,eAAO,MAAM,QAAQ,GACnB,GAAG,cAAc,GAAG,IAAI,GAAG,SAAS,EACpC,OAAO,MAAM,KACZ,eAAe,GAAG,IAIpB,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare
|
|
1
|
+
export declare function setGoBackImpl(fn: () => boolean): void;
|
|
2
2
|
export declare function closeCurrentScreen(): boolean;
|
|
3
3
|
export declare function closeCurrentScreenSafe(): void;
|
|
4
4
|
//# sourceMappingURL=goBackNavigation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"goBackNavigation.d.ts","sourceRoot":"","sources":["../../../../../src/services/navigation/goBackNavigation.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"goBackNavigation.d.ts","sourceRoot":"","sources":["../../../../../src/services/navigation/goBackNavigation.ts"],"names":[],"mappings":"AAIA,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,OAAO,QAE9C;AAED,wBAAgB,kBAAkB,IAAI,OAAO,CAK5C;AAED,wBAAgB,sBAAsB,IAAI,IAAI,CAK7C"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@savers_app/react-native-sdk",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.3",
|
|
4
4
|
"description": "Cross-platform React Native SDK exposing native features (maps, dial pad, browser), device ID/location and session utilities, a URL generator, and a WebView message bridge to trigger actions from web content.",
|
|
5
5
|
"main": "./lib/module/index.js",
|
|
6
6
|
"react-native": "./src/index.tsx",
|
|
@@ -78,7 +78,7 @@
|
|
|
78
78
|
"eslint-config-prettier": "^10.1.8",
|
|
79
79
|
"eslint-plugin-prettier": "^5.5.4",
|
|
80
80
|
"jest": "^29.7.0",
|
|
81
|
-
"lefthook": "
|
|
81
|
+
"lefthook": "2.1.1",
|
|
82
82
|
"prettier": "^3.8.1",
|
|
83
83
|
"react": "19.1.0",
|
|
84
84
|
"react-native": "0.81.5",
|
|
@@ -7,8 +7,8 @@ export function onBoardingImageFromJson(
|
|
|
7
7
|
json: Record<string, any>
|
|
8
8
|
): OnBoardingImage {
|
|
9
9
|
return {
|
|
10
|
-
id: typeof json
|
|
11
|
-
url: typeof json
|
|
10
|
+
id: typeof json.id === 'number' ? json.id : null,
|
|
11
|
+
url: typeof json.url === 'string' ? json.url : null,
|
|
12
12
|
};
|
|
13
13
|
}
|
|
14
14
|
|
|
@@ -31,16 +31,14 @@ export type OnBoardingThemeData = {
|
|
|
31
31
|
|
|
32
32
|
export function onBoardingThemeFromJson(json: any): OnBoardingThemeData {
|
|
33
33
|
const map = { ...(json as Record<string, any>) };
|
|
34
|
-
const imagesRaw = Array.isArray(map[
|
|
35
|
-
? (map['images'] as any[])
|
|
36
|
-
: [];
|
|
34
|
+
const imagesRaw = Array.isArray(map.images) ? (map.images as any[]) : [];
|
|
37
35
|
const images = onBoardingImageListFromJson(imagesRaw);
|
|
38
36
|
const total =
|
|
39
|
-
typeof map
|
|
40
|
-
? map
|
|
41
|
-
: typeof map
|
|
42
|
-
|
|
43
|
-
|
|
37
|
+
typeof map.total === 'number'
|
|
38
|
+
? map.total
|
|
39
|
+
: typeof map.total === 'string'
|
|
40
|
+
? Number(map.total)
|
|
41
|
+
: null;
|
|
44
42
|
return {
|
|
45
43
|
total: total ?? null,
|
|
46
44
|
images: images.length > 0 ? images : null,
|
|
@@ -56,19 +54,19 @@ export function onBoardingDataFromJson(json: any): OnBoardingData {
|
|
|
56
54
|
const map = { ...(json as Record<string, any>) };
|
|
57
55
|
const hasDayNight = 'day' in map || 'night' in map;
|
|
58
56
|
if (hasDayNight) {
|
|
59
|
-
const day = map
|
|
60
|
-
const night = map
|
|
57
|
+
const day = map.day ? onBoardingThemeFromJson(map.day) : null;
|
|
58
|
+
const night = map.night ? onBoardingThemeFromJson(map.night) : null;
|
|
61
59
|
return { day, night };
|
|
62
60
|
}
|
|
63
|
-
const legacyImages = Array.isArray(map
|
|
64
|
-
? onBoardingImageListFromJson(map
|
|
61
|
+
const legacyImages = Array.isArray(map.images)
|
|
62
|
+
? onBoardingImageListFromJson(map.images as any[])
|
|
65
63
|
: [];
|
|
66
64
|
const legacyTotal =
|
|
67
|
-
typeof map
|
|
68
|
-
? map
|
|
69
|
-
: typeof map
|
|
70
|
-
|
|
71
|
-
|
|
65
|
+
typeof map.total === 'number'
|
|
66
|
+
? map.total
|
|
67
|
+
: typeof map.total === 'string'
|
|
68
|
+
? Number(map.total)
|
|
69
|
+
: null;
|
|
72
70
|
const legacyTheme: OnBoardingThemeData = {
|
|
73
71
|
total: legacyTotal ?? null,
|
|
74
72
|
images: legacyImages.length > 0 ? legacyImages : null,
|
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
// React Native Core
|
|
2
2
|
import { BackHandler, Platform } from 'react-native';
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
let goBackFn: (() => boolean) | null = null;
|
|
5
|
+
export function setGoBackImpl(fn: () => boolean) {
|
|
6
|
+
goBackFn = fn;
|
|
7
|
+
}
|
|
8
8
|
|
|
9
9
|
export function closeCurrentScreen(): boolean {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
}
|
|
10
|
+
try {
|
|
11
|
+
if (goBackFn) return !!goBackFn();
|
|
12
|
+
} catch {}
|
|
14
13
|
return false;
|
|
15
14
|
}
|
|
16
15
|
|
package/src/utils/encryption.ts
CHANGED