@terreno/rtk 0.10.0 → 0.11.1

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.
Files changed (80) hide show
  1. package/dist/authSlice.test.js +68 -0
  2. package/dist/authSlice.test.js.map +1 -1
  3. package/dist/authSliceNative.test.d.ts +2 -0
  4. package/dist/authSliceNative.test.d.ts.map +1 -0
  5. package/dist/authSliceNative.test.js +167 -0
  6. package/dist/authSliceNative.test.js.map +1 -0
  7. package/dist/betterAuthClient.d.ts +16 -0
  8. package/dist/betterAuthClient.d.ts.map +1 -1
  9. package/dist/betterAuthClient.js +5 -2
  10. package/dist/betterAuthClient.js.map +1 -1
  11. package/dist/betterAuthClient.test.d.ts +2 -0
  12. package/dist/betterAuthClient.test.d.ts.map +1 -0
  13. package/dist/betterAuthClient.test.js +151 -0
  14. package/dist/betterAuthClient.test.js.map +1 -0
  15. package/dist/betterAuthSlice.test.js +54 -1
  16. package/dist/betterAuthSlice.test.js.map +1 -1
  17. package/dist/buildNumber.test.d.ts +2 -0
  18. package/dist/buildNumber.test.d.ts.map +1 -0
  19. package/dist/buildNumber.test.js +95 -0
  20. package/dist/buildNumber.test.js.map +1 -0
  21. package/dist/constants.d.ts +27 -3
  22. package/dist/constants.d.ts.map +1 -1
  23. package/dist/constants.js +45 -56
  24. package/dist/constants.js.map +1 -1
  25. package/dist/constants.test.js +174 -123
  26. package/dist/constants.test.js.map +1 -1
  27. package/dist/isolated/useUpgradeCheck.isolated.d.ts +2 -0
  28. package/dist/isolated/useUpgradeCheck.isolated.d.ts.map +1 -0
  29. package/dist/isolated/useUpgradeCheck.isolated.js +135 -0
  30. package/dist/isolated/useUpgradeCheck.isolated.js.map +1 -0
  31. package/dist/mongooseSlice.test.d.ts +2 -0
  32. package/dist/mongooseSlice.test.d.ts.map +1 -0
  33. package/dist/mongooseSlice.test.js +39 -0
  34. package/dist/mongooseSlice.test.js.map +1 -0
  35. package/dist/tagGenerator.test.d.ts +2 -0
  36. package/dist/tagGenerator.test.d.ts.map +1 -0
  37. package/dist/tagGenerator.test.js +96 -0
  38. package/dist/tagGenerator.test.js.map +1 -0
  39. package/dist/testPreload.test.d.ts +2 -0
  40. package/dist/testPreload.test.d.ts.map +1 -0
  41. package/dist/testPreload.test.js +27 -0
  42. package/dist/testPreload.test.js.map +1 -0
  43. package/dist/useFeatureFlags.d.ts +25 -1
  44. package/dist/useFeatureFlags.d.ts.map +1 -1
  45. package/dist/useFeatureFlags.js +18 -16
  46. package/dist/useFeatureFlags.js.map +1 -1
  47. package/dist/useFeatureFlags.test.d.ts +2 -0
  48. package/dist/useFeatureFlags.test.d.ts.map +1 -0
  49. package/dist/useFeatureFlags.test.js +162 -0
  50. package/dist/useFeatureFlags.test.js.map +1 -0
  51. package/dist/useUpgradeCheck.d.ts +2 -0
  52. package/dist/useUpgradeCheck.d.ts.map +1 -1
  53. package/dist/useUpgradeCheck.js +39 -46
  54. package/dist/useUpgradeCheck.js.map +1 -1
  55. package/dist/useUpgradeCheck.test.d.ts +2 -0
  56. package/dist/useUpgradeCheck.test.d.ts.map +1 -0
  57. package/dist/useUpgradeCheck.test.js +326 -0
  58. package/dist/useUpgradeCheck.test.js.map +1 -0
  59. package/package.json +6 -3
  60. package/src/authSlice.test.ts +79 -0
  61. package/src/authSliceNative.test.ts +187 -0
  62. package/src/betterAuthClient.test.ts +176 -0
  63. package/src/betterAuthClient.ts +6 -3
  64. package/src/betterAuthSlice.test.ts +67 -0
  65. package/src/buildNumber.test.ts +120 -0
  66. package/src/constants.test.ts +193 -154
  67. package/src/constants.ts +72 -70
  68. package/src/isolated/useUpgradeCheck.isolated.ts +175 -0
  69. package/src/mongooseSlice.test.ts +46 -0
  70. package/src/tagGenerator.test.ts +109 -0
  71. package/src/testPreload.test.ts +30 -0
  72. package/src/useFeatureFlags.test.ts +209 -0
  73. package/src/useFeatureFlags.ts +44 -5
  74. package/src/useUpgradeCheck.test.ts +408 -0
  75. package/src/useUpgradeCheck.ts +41 -48
  76. package/dist/test-preload.d.ts +0 -2
  77. package/dist/test-preload.d.ts.map +0 -1
  78. package/dist/test-preload.js +0 -24
  79. package/dist/test-preload.js.map +0 -1
  80. package/src/test-preload.ts +0 -28
@@ -0,0 +1,408 @@
1
+ import {afterEach, beforeEach, describe, expect, it, mock} from "bun:test";
2
+ import {act, renderHook, waitFor} from "@testing-library/react-native";
3
+
4
+ // ---------------------------------------------------------------------------
5
+ // Mutable refs that tests can tweak between runs
6
+ // ---------------------------------------------------------------------------
7
+ let mockBuildNumber: number | undefined = 42;
8
+
9
+ // Trigger + unwrap mocks for useLazyGetVersionCheckQuery.
10
+ interface MockVersionCheckResponse {
11
+ message?: string;
12
+ status: "ok" | "warning" | "required";
13
+ updateUrl?: string;
14
+ }
15
+ const mockUnwrap = mock((): Promise<MockVersionCheckResponse> => Promise.resolve({status: "ok"}));
16
+ const mockTrigger = mock((..._args: unknown[]) => ({unwrap: mockUnwrap}));
17
+
18
+ mock.module("./emptyApi", () => ({
19
+ useLazyGetVersionCheckQuery: () => [mockTrigger],
20
+ }));
21
+
22
+ // IsWeb is always true in tests (Platform.OS mocked as "web" in preload).
23
+ // We cannot change it per-test because bun snapshots module exports.
24
+ mock.module("./platform", () => ({
25
+ IsWeb: true,
26
+ }));
27
+
28
+ // AppState mock — capture listeners so tests can simulate transitions
29
+ let appStateListeners: Array<(state: string) => void> = [];
30
+ const mockRemove = mock(() => {});
31
+ const mockAddEventListener = mock((_event: string, handler: (state: string) => void) => {
32
+ appStateListeners.push(handler);
33
+ return {remove: mockRemove};
34
+ });
35
+
36
+ const mockOpenURL = mock(() => Promise.resolve(true));
37
+
38
+ mock.module("react-native", () => ({
39
+ AppState: {
40
+ addEventListener: mockAddEventListener,
41
+ currentState: "active",
42
+ },
43
+ Linking: {openURL: mockOpenURL},
44
+ Platform: {OS: "web"},
45
+ StyleSheet: {create: (s: unknown) => s},
46
+ }));
47
+
48
+ mock.module("expo-constants", () => ({
49
+ default: {
50
+ get expoConfig() {
51
+ return {extra: {buildNumber: mockBuildNumber}};
52
+ },
53
+ },
54
+ }));
55
+
56
+ // ---------------------------------------------------------------------------
57
+ // window.location.reload mock
58
+ // ---------------------------------------------------------------------------
59
+ const mockReload = mock(() => {});
60
+
61
+ // ---------------------------------------------------------------------------
62
+ // setInterval / clearInterval mocks (bun has no fake timers)
63
+ // ---------------------------------------------------------------------------
64
+ const originalSetInterval = globalThis.setInterval;
65
+ const originalClearInterval = globalThis.clearInterval;
66
+ let capturedIntervalMs: number | undefined;
67
+ let intervalIdCounter = 0;
68
+ const mockSetInterval = mock((_cb: () => void, ms: number) => {
69
+ capturedIntervalMs = ms;
70
+ return ++intervalIdCounter as unknown as ReturnType<typeof setInterval>;
71
+ });
72
+ const mockClearInterval = mock((_id: unknown) => {});
73
+
74
+ // ---------------------------------------------------------------------------
75
+ // console capture
76
+ // ---------------------------------------------------------------------------
77
+ const debugCalls: unknown[][] = [];
78
+ const originalDebug = console.debug;
79
+ const originalWarn = console.warn;
80
+
81
+ // Now import the hook (after all mock.module calls which are hoisted)
82
+ import {useUpgradeCheck} from "./useUpgradeCheck";
83
+
84
+ // Helper: flush microtasks (lets .then() chains resolve)
85
+ const flushPromises = (): Promise<void> => new Promise((r) => setTimeout(r, 0));
86
+
87
+ // ---------------------------------------------------------------------------
88
+ // Setup / teardown
89
+ // ---------------------------------------------------------------------------
90
+ beforeEach(() => {
91
+ // Reset mutable refs
92
+ mockBuildNumber = 42;
93
+ appStateListeners = [];
94
+
95
+ // Clear call history and set default implementations
96
+ mockUnwrap.mockClear();
97
+ mockUnwrap.mockImplementation(() => Promise.resolve({status: "ok" as const}));
98
+ mockTrigger.mockClear();
99
+ mockTrigger.mockImplementation((..._args: unknown[]) => ({unwrap: mockUnwrap}));
100
+ mockRemove.mockClear();
101
+ mockAddEventListener.mockClear();
102
+ mockAddEventListener.mockImplementation((_event: string, handler: (state: string) => void) => {
103
+ appStateListeners.push(handler);
104
+ return {remove: mockRemove};
105
+ });
106
+ mockOpenURL.mockClear();
107
+ mockOpenURL.mockImplementation(() => Promise.resolve(true));
108
+ mockReload.mockClear();
109
+
110
+ // Mock window.location.reload
111
+ Object.defineProperty(globalThis, "window", {
112
+ configurable: true,
113
+ value: {location: {reload: mockReload}},
114
+ writable: true,
115
+ });
116
+
117
+ // Mock timers
118
+ globalThis.setInterval = mockSetInterval as unknown as typeof setInterval;
119
+ globalThis.clearInterval = mockClearInterval as unknown as typeof clearInterval;
120
+ mockSetInterval.mockClear();
121
+ mockSetInterval.mockImplementation((_cb: () => void, ms: number) => {
122
+ capturedIntervalMs = ms;
123
+ return ++intervalIdCounter as unknown as ReturnType<typeof setInterval>;
124
+ });
125
+ mockClearInterval.mockClear();
126
+ capturedIntervalMs = undefined;
127
+
128
+ // Console capture
129
+ debugCalls.length = 0;
130
+ console.debug = (...args: unknown[]): void => {
131
+ debugCalls.push(args);
132
+ };
133
+ console.warn = (): void => {};
134
+ });
135
+
136
+ afterEach(() => {
137
+ console.debug = originalDebug;
138
+ console.warn = originalWarn;
139
+ globalThis.setInterval = originalSetInterval;
140
+ globalThis.clearInterval = originalClearInterval;
141
+ });
142
+
143
+ // ---------------------------------------------------------------------------
144
+ // Tests
145
+ // ---------------------------------------------------------------------------
146
+ describe("useUpgradeCheck", () => {
147
+ describe("mount behavior", () => {
148
+ it("returns default state before check resolves", () => {
149
+ // Make unwrap hang so state stays at defaults
150
+ mockUnwrap.mockImplementation(() => new Promise(() => {}));
151
+ const {result} = renderHook(() => useUpgradeCheck());
152
+
153
+ expect(result.current.isRequired).toBe(false);
154
+ expect(result.current.isWarning).toBe(false);
155
+ expect(result.current.requiredMessage).toBeUndefined();
156
+ expect(result.current.warningMessage).toBeUndefined();
157
+ expect(result.current.warningCheckCount).toBe(0);
158
+ });
159
+
160
+ it("skips check when buildNumber is undefined", () => {
161
+ mockBuildNumber = undefined;
162
+ renderHook(() => useUpgradeCheck());
163
+ expect(mockTrigger).not.toHaveBeenCalled();
164
+ });
165
+
166
+ it("triggers version check on mount with correct params", () => {
167
+ renderHook(() => useUpgradeCheck());
168
+ expect(mockTrigger).toHaveBeenCalledWith({platform: "web", version: 42});
169
+ });
170
+ });
171
+
172
+ describe("status handling", () => {
173
+ it("sets isRequired and requiredMessage when status is 'required'", async () => {
174
+ mockUnwrap.mockImplementation(() =>
175
+ Promise.resolve({message: "Please update now", status: "required" as const})
176
+ );
177
+ const {result} = renderHook(() => useUpgradeCheck());
178
+
179
+ await act(async () => {
180
+ await flushPromises();
181
+ });
182
+
183
+ await waitFor(() => {
184
+ expect(result.current.isRequired).toBe(true);
185
+ expect(result.current.requiredMessage).toBe("Please update now");
186
+ expect(result.current.isWarning).toBe(false);
187
+ });
188
+ });
189
+
190
+ it("sets isWarning, warningMessage, and increments warningCheckCount when status is 'warning'", async () => {
191
+ mockUnwrap.mockImplementation(() =>
192
+ Promise.resolve({message: "New version available", status: "warning" as const})
193
+ );
194
+ const {result} = renderHook(() => useUpgradeCheck());
195
+
196
+ await act(async () => {
197
+ await flushPromises();
198
+ });
199
+
200
+ await waitFor(() => {
201
+ expect(result.current.isWarning).toBe(true);
202
+ expect(result.current.warningMessage).toBe("New version available");
203
+ expect(result.current.warningCheckCount).toBe(1);
204
+ });
205
+ });
206
+
207
+ it("clears required/warning state when status is 'ok' after previous required", async () => {
208
+ // Start with "required"
209
+ mockUnwrap.mockImplementation(() =>
210
+ Promise.resolve({message: "Update", status: "required" as const})
211
+ );
212
+ const {result} = renderHook(() => useUpgradeCheck({recheckOnForeground: true}));
213
+
214
+ await act(async () => {
215
+ await flushPromises();
216
+ });
217
+
218
+ await waitFor(() => {
219
+ expect(result.current.isRequired).toBe(true);
220
+ });
221
+
222
+ // Switch to "ok" and trigger via foreground recheck (more reliable than interval mock)
223
+ mockUnwrap.mockImplementation(() => Promise.resolve({status: "ok" as const}));
224
+
225
+ await act(async () => {
226
+ // Simulate background → active transition to trigger runCheck
227
+ appStateListeners.forEach((listener) => {
228
+ listener("background");
229
+ });
230
+ });
231
+ await act(async () => {
232
+ appStateListeners.forEach((listener) => {
233
+ listener("active");
234
+ });
235
+ await flushPromises();
236
+ });
237
+
238
+ await waitFor(() => {
239
+ expect(result.current.isRequired).toBe(false);
240
+ expect(result.current.isWarning).toBe(false);
241
+ });
242
+ });
243
+
244
+ it("stores updateUrl from response", async () => {
245
+ mockUnwrap.mockImplementation(() =>
246
+ Promise.resolve({
247
+ message: "Update available",
248
+ status: "warning" as const,
249
+ updateUrl: "https://example.com/update",
250
+ })
251
+ );
252
+ const {result} = renderHook(() => useUpgradeCheck());
253
+
254
+ await act(async () => {
255
+ await flushPromises();
256
+ });
257
+
258
+ await waitFor(() => {
259
+ expect(result.current.isWarning).toBe(true);
260
+ });
261
+ });
262
+ });
263
+
264
+ describe("canUpdate", () => {
265
+ it("is true on web regardless of updateUrl", () => {
266
+ // IsWeb is always true in test env (Platform.OS: "web")
267
+ const {result} = renderHook(() => useUpgradeCheck());
268
+ expect(result.current.canUpdate).toBe(true);
269
+ });
270
+ });
271
+
272
+ describe("onUpdate", () => {
273
+ it("calls window.location.reload on web", () => {
274
+ const {result} = renderHook(() => useUpgradeCheck());
275
+
276
+ act(() => {
277
+ result.current.onUpdate();
278
+ });
279
+
280
+ expect(mockReload).toHaveBeenCalled();
281
+ });
282
+ });
283
+
284
+ describe("error handling", () => {
285
+ it("handles check failure gracefully", async () => {
286
+ mockUnwrap.mockImplementation(() => Promise.reject(new Error("Network error")));
287
+ const {result} = renderHook(() => useUpgradeCheck());
288
+
289
+ await act(async () => {
290
+ await flushPromises();
291
+ });
292
+
293
+ await waitFor(() => {
294
+ const failLog = debugCalls.find(
295
+ (args) => typeof args[0] === "string" && args[0].includes("Version check failed")
296
+ );
297
+ expect(failLog).toBeDefined();
298
+ });
299
+
300
+ // State should remain at defaults
301
+ expect(result.current.isRequired).toBe(false);
302
+ expect(result.current.isWarning).toBe(false);
303
+ });
304
+ });
305
+
306
+ describe("polling", () => {
307
+ it("sets up interval when pollingIntervalMs is provided", () => {
308
+ renderHook(() => useUpgradeCheck({pollingIntervalMs: 60_000}));
309
+ expect(mockSetInterval).toHaveBeenCalled();
310
+ expect(capturedIntervalMs).toBe(60_000);
311
+ });
312
+
313
+ it("does not set up interval when pollingIntervalMs is omitted", () => {
314
+ renderHook(() => useUpgradeCheck());
315
+ expect(mockSetInterval).not.toHaveBeenCalled();
316
+ });
317
+
318
+ it("cleans up interval on unmount", () => {
319
+ const {unmount} = renderHook(() => useUpgradeCheck({pollingIntervalMs: 60_000}));
320
+ unmount();
321
+ expect(mockClearInterval).toHaveBeenCalled();
322
+ });
323
+
324
+ it("increments warningCheckCount on each warning poll", async () => {
325
+ mockUnwrap.mockImplementation(() =>
326
+ Promise.resolve({message: "Update", status: "warning" as const})
327
+ );
328
+ const {result} = renderHook(() => useUpgradeCheck({recheckOnForeground: true}));
329
+
330
+ await act(async () => {
331
+ await flushPromises();
332
+ });
333
+
334
+ await waitFor(() => {
335
+ expect(result.current.warningCheckCount).toBe(1);
336
+ });
337
+
338
+ // Simulate a foreground return to trigger another check
339
+ await act(async () => {
340
+ appStateListeners.forEach((listener) => {
341
+ listener("background");
342
+ });
343
+ });
344
+ await act(async () => {
345
+ appStateListeners.forEach((listener) => {
346
+ listener("active");
347
+ });
348
+ await flushPromises();
349
+ });
350
+
351
+ await waitFor(() => {
352
+ expect(result.current.warningCheckCount).toBe(2);
353
+ });
354
+ });
355
+ });
356
+
357
+ describe("foreground recheck", () => {
358
+ it("sets up AppState listener when recheckOnForeground is true", () => {
359
+ renderHook(() => useUpgradeCheck({recheckOnForeground: true}));
360
+ expect(mockAddEventListener).toHaveBeenCalledWith("change", expect.any(Function));
361
+ });
362
+
363
+ it("does not set up AppState listener by default", () => {
364
+ renderHook(() => useUpgradeCheck());
365
+ expect(mockAddEventListener).not.toHaveBeenCalled();
366
+ });
367
+
368
+ it("triggers check on background to active transition", async () => {
369
+ renderHook(() => useUpgradeCheck({recheckOnForeground: true}));
370
+
371
+ const initialCallCount = mockTrigger.mock.calls.length;
372
+
373
+ // Simulate going to background, then back to active
374
+ act(() => {
375
+ appStateListeners.forEach((listener) => {
376
+ listener("background");
377
+ });
378
+ });
379
+ act(() => {
380
+ appStateListeners.forEach((listener) => {
381
+ listener("active");
382
+ });
383
+ });
384
+
385
+ expect(mockTrigger.mock.calls.length).toBeGreaterThan(initialCallCount);
386
+ });
387
+
388
+ it("does not trigger extra check on active to active transition", () => {
389
+ renderHook(() => useUpgradeCheck({recheckOnForeground: true}));
390
+
391
+ const initialCallCount = mockTrigger.mock.calls.length;
392
+
393
+ act(() => {
394
+ appStateListeners.forEach((listener) => {
395
+ listener("active");
396
+ });
397
+ });
398
+
399
+ expect(mockTrigger.mock.calls.length).toBe(initialCallCount);
400
+ });
401
+
402
+ it("cleans up AppState listener on unmount", () => {
403
+ const {unmount} = renderHook(() => useUpgradeCheck({recheckOnForeground: true}));
404
+ unmount();
405
+ expect(mockRemove).toHaveBeenCalled();
406
+ });
407
+ });
408
+ });
@@ -1,4 +1,3 @@
1
- import {useToast} from "@terreno/ui";
2
1
  import Constants from "expo-constants";
3
2
  import {useCallback, useEffect, useRef, useState} from "react";
4
3
  import {AppState, Linking} from "react-native";
@@ -25,6 +24,8 @@ interface UseUpgradeCheckResult {
25
24
  isWarning: boolean;
26
25
  requiredMessage?: string;
27
26
  warningMessage?: string;
27
+ /** Increments each time a poll returns "warning" status. Useful as a React key to force remount. */
28
+ warningCheckCount: number;
28
29
  onUpdate: () => void;
29
30
  }
30
31
 
@@ -51,17 +52,44 @@ export const useUpgradeCheck = (options?: UseUpgradeCheckOptions): UseUpgradeChe
51
52
  const [requiredMessage, setRequiredMessage] = useState<string>();
52
53
  const [warningMessage, setWarningMessage] = useState<string>();
53
54
  const [updateUrl, setUpdateUrl] = useState<string>();
54
- const toast = useToast();
55
- const [triggerVersionCheck, result] = useLazyGetVersionCheckQuery();
55
+ const [warningCheckCount, setWarningCheckCount] = useState(0);
56
+ const [triggerVersionCheck] = useLazyGetVersionCheckQuery();
56
57
  const buildNumber = Constants.expoConfig?.extra?.buildNumber as number | undefined;
57
58
  const appState = useRef(AppState.currentState);
58
59
 
60
+ // Process version-check response inline via .unwrap() so every poll trigger
61
+ // is handled, even when RTK Query returns a structurally-shared cached response
62
+ // (which would prevent a useEffect from re-firing).
59
63
  const runCheck = useCallback(() => {
60
64
  if (buildNumber === undefined || buildNumber === null) {
61
65
  return;
62
66
  }
63
67
  const platform = IsWeb ? "web" : "mobile";
64
- void triggerVersionCheck({platform, version: buildNumber});
68
+ triggerVersionCheck({platform, version: buildNumber})
69
+ .unwrap()
70
+ .then((data) => {
71
+ const {message, status, updateUrl: responseUpdateUrl} = data;
72
+
73
+ if (status === "required") {
74
+ setIsRequired(true);
75
+ setRequiredMessage(message);
76
+ setIsWarning(false);
77
+ } else if (status === "warning") {
78
+ setIsWarning(true);
79
+ setWarningMessage(message);
80
+ setWarningCheckCount((c) => c + 1);
81
+ } else {
82
+ setIsWarning(false);
83
+ setIsRequired(false);
84
+ }
85
+
86
+ if (responseUpdateUrl) {
87
+ setUpdateUrl(responseUpdateUrl);
88
+ }
89
+ })
90
+ .catch((error: unknown) => {
91
+ console.debug("Version check failed, continuing normally", error);
92
+ });
65
93
  }, [buildNumber, triggerVersionCheck]);
66
94
 
67
95
  const onUpdate = useCallback(() => {
@@ -111,50 +139,15 @@ export const useUpgradeCheck = (options?: UseUpgradeCheckOptions): UseUpgradeChe
111
139
  return () => subscription.remove();
112
140
  }, [runCheck, recheckOnForeground]);
113
141
 
114
- // Show warning toast in a separate effect. ToastProvider initializes its ref
115
- // in useEffect, so we may need to retry when toast becomes available.
116
- useEffect(() => {
117
- if (!warningMessage) {
118
- return;
119
- }
120
- const toastId = toast.warn(warningMessage, {persistent: true});
121
- if (toastId) {
122
- setWarningMessage(undefined);
123
- } else {
124
- console.warn("useUpgradeCheck: toast not yet available, will retry on next render");
125
- }
126
- }, [warningMessage, toast]);
127
-
128
- // Process version-check response — update warning/required state
129
- useEffect(() => {
130
- if (result.isError) {
131
- console.debug("Version check failed, continuing normally", result.error);
132
- return;
133
- }
134
- if (!result.isSuccess || !result.data) {
135
- return;
136
- }
137
-
138
- const {message, status, updateUrl: responseUpdateUrl} = result.data;
139
-
140
- if (status === "required") {
141
- setIsRequired(true);
142
- setRequiredMessage(message);
143
- setIsWarning(false);
144
- } else if (status === "warning") {
145
- setIsWarning(true);
146
- setWarningMessage(message);
147
- } else {
148
- setIsWarning(false);
149
- setIsRequired(false);
150
- }
151
-
152
- if (responseUpdateUrl) {
153
- setUpdateUrl(responseUpdateUrl);
154
- }
155
- }, [result.data, result.error, result.isError, result.isSuccess]);
156
-
157
142
  const canUpdate = IsWeb || !!updateUrl;
158
143
 
159
- return {canUpdate, isRequired, isWarning, onUpdate, requiredMessage, warningMessage};
144
+ return {
145
+ canUpdate,
146
+ isRequired,
147
+ isWarning,
148
+ onUpdate,
149
+ requiredMessage,
150
+ warningCheckCount,
151
+ warningMessage,
152
+ };
160
153
  };
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=test-preload.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test-preload.d.ts","sourceRoot":"","sources":["../src/test-preload.ts"],"names":[],"mappings":""}
@@ -1,24 +0,0 @@
1
- import { mock } from "bun:test";
2
- mock.module("react-native", () => ({
3
- Platform: { OS: "web" },
4
- StyleSheet: { create: (s) => s },
5
- }));
6
- mock.module("expo-secure-store", () => ({
7
- deleteItemAsync: async () => { },
8
- getItemAsync: async () => null,
9
- setItemAsync: async () => { },
10
- }));
11
- mock.module("@react-native-async-storage/async-storage", () => ({
12
- default: {
13
- getItem: async () => null,
14
- removeItem: async () => { },
15
- setItem: async () => { },
16
- },
17
- }));
18
- mock.module("expo-constants", () => ({
19
- default: { expoConfig: { extra: {} } },
20
- }));
21
- mock.module("expo-network", () => ({
22
- getNetworkStateAsync: async () => ({ isConnected: true }),
23
- }));
24
- //# sourceMappingURL=test-preload.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test-preload.js","sourceRoot":"","sources":["../src/test-preload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,IAAI,EAAC,MAAM,UAAU,CAAC;AAE9B,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC;IACjC,QAAQ,EAAE,EAAC,EAAE,EAAE,KAAK,EAAC;IACrB,UAAU,EAAE,EAAC,MAAM,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,EAAC;CACxC,CAAC,CAAC,CAAC;AAEJ,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,GAAG,EAAE,CAAC,CAAC;IACtC,eAAe,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;IAC/B,YAAY,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI;IAC9B,YAAY,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;CAC7B,CAAC,CAAC,CAAC;AAEJ,IAAI,CAAC,MAAM,CAAC,2CAA2C,EAAE,GAAG,EAAE,CAAC,CAAC;IAC9D,OAAO,EAAE;QACP,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI;QACzB,UAAU,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;QAC1B,OAAO,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;KACxB;CACF,CAAC,CAAC,CAAC;AAEJ,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC;IACnC,OAAO,EAAE,EAAC,UAAU,EAAE,EAAC,KAAK,EAAE,EAAE,EAAC,EAAC;CACnC,CAAC,CAAC,CAAC;AAEJ,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC;IACjC,oBAAoB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAC,WAAW,EAAE,IAAI,EAAC,CAAC;CACxD,CAAC,CAAC,CAAC"}
@@ -1,28 +0,0 @@
1
- import {mock} from "bun:test";
2
-
3
- mock.module("react-native", () => ({
4
- Platform: {OS: "web"},
5
- StyleSheet: {create: (s: unknown) => s},
6
- }));
7
-
8
- mock.module("expo-secure-store", () => ({
9
- deleteItemAsync: async () => {},
10
- getItemAsync: async () => null,
11
- setItemAsync: async () => {},
12
- }));
13
-
14
- mock.module("@react-native-async-storage/async-storage", () => ({
15
- default: {
16
- getItem: async () => null,
17
- removeItem: async () => {},
18
- setItem: async () => {},
19
- },
20
- }));
21
-
22
- mock.module("expo-constants", () => ({
23
- default: {expoConfig: {extra: {}}},
24
- }));
25
-
26
- mock.module("expo-network", () => ({
27
- getNetworkStateAsync: async () => ({isConnected: true}),
28
- }));