@terreno/rtk 0.24.0 → 0.26.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.
Files changed (61) hide show
  1. package/.ai/guidelines/core.md +2 -0
  2. package/dist/authSlice.d.ts.map +1 -1
  3. package/dist/authSlice.js +1 -1
  4. package/dist/authSlice.js.map +1 -1
  5. package/dist/authSlice.test.js +11 -7
  6. package/dist/authSlice.test.js.map +1 -1
  7. package/dist/betterAuthSlice.d.ts +9 -5
  8. package/dist/betterAuthSlice.d.ts.map +1 -1
  9. package/dist/betterAuthSlice.js +7 -20
  10. package/dist/betterAuthSlice.js.map +1 -1
  11. package/dist/constants.d.ts +7 -1
  12. package/dist/constants.d.ts.map +1 -1
  13. package/dist/constants.js.map +1 -1
  14. package/dist/isolated/constants.test.d.ts +2 -0
  15. package/dist/isolated/constants.test.d.ts.map +1 -0
  16. package/dist/isolated/constants.test.js +65 -0
  17. package/dist/isolated/constants.test.js.map +1 -0
  18. package/dist/mongooseSlice.test.js +0 -1
  19. package/dist/mongooseSlice.test.js.map +1 -1
  20. package/dist/sync.test.d.ts +2 -0
  21. package/dist/sync.test.d.ts.map +1 -0
  22. package/dist/sync.test.js +298 -0
  23. package/dist/sync.test.js.map +1 -0
  24. package/dist/useFeatureFlags.d.ts.map +1 -1
  25. package/dist/useFeatureFlags.js +4 -3
  26. package/dist/useFeatureFlags.js.map +1 -1
  27. package/dist/useRealtimeDebug.test.d.ts +2 -0
  28. package/dist/useRealtimeDebug.test.d.ts.map +1 -0
  29. package/dist/useRealtimeDebug.test.js +131 -0
  30. package/dist/useRealtimeDebug.test.js.map +1 -0
  31. package/dist/useServerStatus.test.js +49 -0
  32. package/dist/useServerStatus.test.js.map +1 -1
  33. package/dist/useTerrenoFeatureFlags.test.js +15 -0
  34. package/dist/useTerrenoFeatureFlags.test.js.map +1 -1
  35. package/dist/useUpgradeCheck.test.d.ts +2 -0
  36. package/dist/useUpgradeCheck.test.d.ts.map +1 -0
  37. package/dist/useUpgradeCheck.test.js +174 -0
  38. package/dist/useUpgradeCheck.test.js.map +1 -0
  39. package/dist/useUpgradeCheckNative.test.d.ts +2 -0
  40. package/dist/useUpgradeCheckNative.test.d.ts.map +1 -0
  41. package/dist/useUpgradeCheckNative.test.js +90 -0
  42. package/dist/useUpgradeCheckNative.test.js.map +1 -0
  43. package/package.json +2 -2
  44. package/src/authSlice.test.ts +20 -12
  45. package/src/authSlice.ts +1 -1
  46. package/src/betterAuthSlice.ts +19 -18
  47. package/src/constants.ts +7 -2
  48. package/src/isolated/constants.test.ts +95 -0
  49. package/src/mongooseSlice.test.ts +1 -2
  50. package/src/sync.test.ts +391 -0
  51. package/src/useFeatureFlags.ts +4 -3
  52. package/src/useRealtimeDebug.test.ts +173 -0
  53. package/src/useServerStatus.test.ts +68 -0
  54. package/src/useTerrenoFeatureFlags.test.ts +25 -0
  55. package/src/useUpgradeCheck.test.ts +226 -0
  56. package/src/useUpgradeCheckNative.test.ts +124 -0
  57. package/dist/isolated/constants.isolated.d.ts +0 -2
  58. package/dist/isolated/constants.isolated.d.ts.map +0 -1
  59. package/dist/isolated/constants.isolated.js +0 -87
  60. package/dist/isolated/constants.isolated.js.map +0 -1
  61. package/src/isolated/constants.isolated.ts +0 -92
@@ -168,5 +168,20 @@ describe("useTerrenoFeatureFlags ref-count cleanup", () => {
168
168
  expect(OpenFeature.getClient(refcountTestDomain).getBooleanValue("alpha", false)).toBe(false);
169
169
  }, { timeout: 5000 });
170
170
  });
171
+ it("keeps the provider installed while another hook instance is still mounted", async () => {
172
+ const { api } = buildApi({ data: { alpha: boolDef("on") } });
173
+ // Two instances share the domain, so the ref count reaches 2.
174
+ const first = renderHook(() => useTerrenoFeatureFlags(api, { domain: refcountTestDomain, userId: "u1" }));
175
+ const second = renderHook(() => useTerrenoFeatureFlags(api, { domain: refcountTestDomain, userId: "u1" }));
176
+ await waitFor(() => {
177
+ expect(OpenFeature.getClient(refcountTestDomain).getBooleanValue("alpha", false)).toBe(true);
178
+ }, { timeout: 5000 });
179
+ // Unmounting one instance decrements the ref count to 1 (the else branch),
180
+ // so the provider must remain installed rather than falling back to NOOP.
181
+ first.unmount();
182
+ await new Promise((r) => setTimeout(r, 200));
183
+ expect(OpenFeature.getClient(refcountTestDomain).getBooleanValue("alpha", false)).toBe(true);
184
+ second.unmount();
185
+ });
171
186
  });
172
187
  //# sourceMappingURL=useTerrenoFeatureFlags.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useTerrenoFeatureFlags.test.js","sourceRoot":"","sources":["../src/useTerrenoFeatureFlags.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useTerrenoFeatureFlags.test.js","sourceRoot":"","sources":["../src/useTerrenoFeatureFlags.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=useUpgradeCheck.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useUpgradeCheck.test.d.ts","sourceRoot":"","sources":["../src/useUpgradeCheck.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,174 @@
1
+ import { afterEach, beforeEach, describe, expect, it, mock } from "bun:test";
2
+ import { configureStore } from "@reduxjs/toolkit";
3
+ import { act, renderHook } from "@testing-library/react-native";
4
+ import Constants from "expo-constants";
5
+ import React from "react";
6
+ import { Provider } from "react-redux";
7
+ // Capture the AppState "change" handler so tests can simulate foreground transitions.
8
+ let appStateChangeHandler;
9
+ const appStateMock = {
10
+ addEventListener: (_event, handler) => {
11
+ appStateChangeHandler = handler;
12
+ return { remove: () => { } };
13
+ },
14
+ currentState: "active",
15
+ };
16
+ // Keep this react-native mock a superset of the preload's mock so other test
17
+ // files still resolve AppState / Linking / Platform after this file runs.
18
+ mock.module("react-native", () => ({
19
+ AppState: appStateMock,
20
+ Linking: { openURL: async () => true },
21
+ Platform: { OS: "web" },
22
+ StyleSheet: { create: (s) => s },
23
+ }));
24
+ // Force IsWeb=true regardless of load order with the native test files.
25
+ mock.module("./platform", () => ({ IsWeb: true }));
26
+ const { emptySplitApi } = await import("./emptyApi");
27
+ const { useUpgradeCheck } = await import("./useUpgradeCheck");
28
+ const constantsWithExtra = Constants;
29
+ const createTestStore = () => configureStore({
30
+ middleware: (getDefaultMiddleware) => getDefaultMiddleware().concat(emptySplitApi.middleware),
31
+ reducer: { [emptySplitApi.reducerPath]: emptySplitApi.reducer },
32
+ });
33
+ const createWrapper = (store) => {
34
+ const Wrapper = ({ children }) => React.createElement(Provider, { children, store });
35
+ return Wrapper;
36
+ };
37
+ const mockFetchWith = (payload) => {
38
+ const fetchFn = mock(async () => new Response(JSON.stringify(payload), {
39
+ headers: { "content-type": "application/json" },
40
+ status: 200,
41
+ }));
42
+ globalThis.fetch = fetchFn;
43
+ return fetchFn;
44
+ };
45
+ const flush = async (ms = 60) => {
46
+ await act(async () => {
47
+ await new Promise((resolve) => setTimeout(resolve, ms));
48
+ });
49
+ };
50
+ describe("useUpgradeCheck (web)", () => {
51
+ let originalFetch;
52
+ let originalWindow;
53
+ beforeEach(() => {
54
+ originalFetch = globalThis.fetch;
55
+ originalWindow = globalThis.window;
56
+ appStateChangeHandler = undefined;
57
+ appStateMock.currentState = "active";
58
+ constantsWithExtra.expoConfig.extra.buildNumber = 100;
59
+ });
60
+ afterEach(() => {
61
+ globalThis.fetch = originalFetch;
62
+ globalThis.window = originalWindow;
63
+ delete constantsWithExtra.expoConfig.extra.buildNumber;
64
+ emptySplitApi.util.resetApiState();
65
+ });
66
+ it("does not call the backend when the build number is unavailable", async () => {
67
+ delete constantsWithExtra.expoConfig.extra.buildNumber;
68
+ const fetchFn = mockFetchWith({ status: "ok" });
69
+ const { result, unmount } = renderHook(() => useUpgradeCheck(), {
70
+ wrapper: createWrapper(createTestStore()),
71
+ });
72
+ await flush();
73
+ expect(fetchFn).not.toHaveBeenCalled();
74
+ expect(result.current.isRequired).toBe(false);
75
+ expect(result.current.isWarning).toBe(false);
76
+ unmount();
77
+ });
78
+ it("flags a required upgrade and adopts the server polling interval", async () => {
79
+ const fetchFn = mockFetchWith({
80
+ message: "Please update",
81
+ pollingIntervalMs: 999999,
82
+ status: "required",
83
+ updateUrl: "https://example.com/update",
84
+ });
85
+ const { result, unmount } = renderHook(() => useUpgradeCheck(), {
86
+ wrapper: createWrapper(createTestStore()),
87
+ });
88
+ await flush();
89
+ expect(fetchFn).toHaveBeenCalled();
90
+ expect(result.current.isRequired).toBe(true);
91
+ expect(result.current.requiredMessage).toBe("Please update");
92
+ expect(result.current.isWarning).toBe(false);
93
+ // On web the app can always self-update via reload.
94
+ expect(result.current.canUpdate).toBe(true);
95
+ unmount();
96
+ });
97
+ it("flags a warning upgrade and increments the warning check count", async () => {
98
+ const fetchFn = mockFetchWith({ message: "Update soon", status: "warning" });
99
+ const { result, unmount } = renderHook(() => useUpgradeCheck(), {
100
+ wrapper: createWrapper(createTestStore()),
101
+ });
102
+ await flush();
103
+ expect(fetchFn).toHaveBeenCalled();
104
+ expect(result.current.isWarning).toBe(true);
105
+ expect(result.current.warningMessage).toBe("Update soon");
106
+ expect(result.current.warningCheckCount).toBe(1);
107
+ expect(result.current.isRequired).toBe(false);
108
+ unmount();
109
+ });
110
+ it("clears upgrade state for an ok status", async () => {
111
+ mockFetchWith({ status: "ok" });
112
+ const { result, unmount } = renderHook(() => useUpgradeCheck(), {
113
+ wrapper: createWrapper(createTestStore()),
114
+ });
115
+ await flush();
116
+ expect(result.current.isRequired).toBe(false);
117
+ expect(result.current.isWarning).toBe(false);
118
+ unmount();
119
+ });
120
+ it("swallows version-check failures and stays in the default state", async () => {
121
+ const fetchFn = mock(async () => {
122
+ throw new Error("network down");
123
+ });
124
+ globalThis.fetch = fetchFn;
125
+ const { result, unmount } = renderHook(() => useUpgradeCheck(), {
126
+ wrapper: createWrapper(createTestStore()),
127
+ });
128
+ // Wait long enough for RTK Query's retry backoff to exhaust and reject.
129
+ await flush(7000);
130
+ expect(result.current.isRequired).toBe(false);
131
+ expect(result.current.isWarning).toBe(false);
132
+ unmount();
133
+ }, 20000);
134
+ it("reloads the page on web when onUpdate is invoked", async () => {
135
+ mockFetchWith({ status: "required", updateUrl: "https://example.com/update" });
136
+ const reload = mock(() => { });
137
+ globalThis.window = { location: { reload } };
138
+ const { result, unmount } = renderHook(() => useUpgradeCheck(), {
139
+ wrapper: createWrapper(createTestStore()),
140
+ });
141
+ await flush();
142
+ act(() => {
143
+ result.current.onUpdate();
144
+ });
145
+ expect(reload).toHaveBeenCalledTimes(1);
146
+ unmount();
147
+ });
148
+ it("polls repeatedly using the fallback interval", async () => {
149
+ const fetchFn = mockFetchWith({ status: "ok" });
150
+ const { unmount } = renderHook(() => useUpgradeCheck({ pollingIntervalMs: 20 }), {
151
+ wrapper: createWrapper(createTestStore()),
152
+ });
153
+ await flush(120);
154
+ expect(fetchFn.mock.calls.length).toBeGreaterThan(1);
155
+ unmount();
156
+ });
157
+ it("re-checks when the app returns to the foreground", async () => {
158
+ const fetchFn = mockFetchWith({ status: "ok" });
159
+ const { unmount } = renderHook(() => useUpgradeCheck({ recheckOnForeground: true }), {
160
+ wrapper: createWrapper(createTestStore()),
161
+ });
162
+ await flush();
163
+ const initialCalls = fetchFn.mock.calls.length;
164
+ expect(appStateChangeHandler).toBeDefined();
165
+ await act(async () => {
166
+ appStateChangeHandler?.("background");
167
+ appStateChangeHandler?.("active");
168
+ await new Promise((resolve) => setTimeout(resolve, 30));
169
+ });
170
+ expect(fetchFn.mock.calls.length).toBeGreaterThan(initialCalls);
171
+ unmount();
172
+ });
173
+ });
174
+ //# sourceMappingURL=useUpgradeCheck.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useUpgradeCheck.test.js","sourceRoot":"","sources":["../src/useUpgradeCheck.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=useUpgradeCheckNative.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useUpgradeCheckNative.test.d.ts","sourceRoot":"","sources":["../src/useUpgradeCheckNative.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,90 @@
1
+ import { afterEach, beforeEach, describe, expect, it, mock } from "bun:test";
2
+ import { configureStore } from "@reduxjs/toolkit";
3
+ import { act, renderHook } from "@testing-library/react-native";
4
+ import Constants from "expo-constants";
5
+ import React from "react";
6
+ import { Provider } from "react-redux";
7
+ const openedUrls = [];
8
+ // Keep this react-native mock a superset of the preload's mock so other test
9
+ // files still resolve AppState / Linking / Platform after this file runs.
10
+ mock.module("react-native", () => ({
11
+ AppState: {
12
+ addEventListener: () => ({ remove: () => { } }),
13
+ currentState: "active",
14
+ },
15
+ Linking: {
16
+ openURL: async (url) => {
17
+ openedUrls.push(url);
18
+ return true;
19
+ },
20
+ },
21
+ Platform: { OS: "ios" },
22
+ StyleSheet: { create: (s) => s },
23
+ }));
24
+ // Force IsWeb=false so the mobile update path is exercised.
25
+ mock.module("./platform", () => ({ IsWeb: false }));
26
+ const { emptySplitApi } = await import("./emptyApi");
27
+ const { useUpgradeCheck } = await import("./useUpgradeCheck");
28
+ const constantsWithExtra = Constants;
29
+ const createTestStore = () => configureStore({
30
+ middleware: (getDefaultMiddleware) => getDefaultMiddleware().concat(emptySplitApi.middleware),
31
+ reducer: { [emptySplitApi.reducerPath]: emptySplitApi.reducer },
32
+ });
33
+ const createWrapper = (store) => {
34
+ const Wrapper = ({ children }) => React.createElement(Provider, { children, store });
35
+ return Wrapper;
36
+ };
37
+ const mockFetchWith = (payload) => {
38
+ globalThis.fetch = mock(async () => new Response(JSON.stringify(payload), {
39
+ headers: { "content-type": "application/json" },
40
+ status: 200,
41
+ }));
42
+ };
43
+ const flush = async (ms = 60) => {
44
+ await act(async () => {
45
+ await new Promise((resolve) => setTimeout(resolve, ms));
46
+ });
47
+ };
48
+ describe("useUpgradeCheck (native)", () => {
49
+ let originalFetch;
50
+ beforeEach(() => {
51
+ originalFetch = globalThis.fetch;
52
+ openedUrls.length = 0;
53
+ constantsWithExtra.expoConfig.extra.buildNumber = 100;
54
+ });
55
+ afterEach(() => {
56
+ globalThis.fetch = originalFetch;
57
+ delete constantsWithExtra.expoConfig.extra.buildNumber;
58
+ emptySplitApi.util.resetApiState();
59
+ });
60
+ it("opens the update URL on native when onUpdate is invoked", async () => {
61
+ mockFetchWith({ status: "required", updateUrl: "https://example.com/app-update" });
62
+ const { result, unmount } = renderHook(() => useUpgradeCheck(), {
63
+ wrapper: createWrapper(createTestStore()),
64
+ });
65
+ await flush();
66
+ // canUpdate on native depends on having a resolved update URL.
67
+ expect(result.current.canUpdate).toBe(true);
68
+ await act(async () => {
69
+ result.current.onUpdate();
70
+ await new Promise((resolve) => setTimeout(resolve, 10));
71
+ });
72
+ expect(openedUrls).toEqual(["https://example.com/app-update"]);
73
+ unmount();
74
+ });
75
+ it("does not open a URL on native when no update URL is available", async () => {
76
+ mockFetchWith({ status: "required" });
77
+ const { result, unmount } = renderHook(() => useUpgradeCheck(), {
78
+ wrapper: createWrapper(createTestStore()),
79
+ });
80
+ await flush();
81
+ expect(result.current.canUpdate).toBe(false);
82
+ await act(async () => {
83
+ result.current.onUpdate();
84
+ await new Promise((resolve) => setTimeout(resolve, 10));
85
+ });
86
+ expect(openedUrls).toEqual([]);
87
+ unmount();
88
+ });
89
+ });
90
+ //# sourceMappingURL=useUpgradeCheckNative.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useUpgradeCheckNative.test.js","sourceRoot":"","sources":["../src/useUpgradeCheckNative.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "@openfeature/core": "^1.11.0",
5
5
  "@react-native-async-storage/async-storage": "2.2.0",
6
6
  "@reduxjs/toolkit": "^2.11.1",
7
- "@terreno/ui": "0.24.0",
7
+ "@terreno/ui": "0.26.0",
8
8
  "async-mutex": "^0.5.0",
9
9
  "axios": "^1.13.2",
10
10
  "axios-retry": "^4.5.0",
@@ -73,5 +73,5 @@
73
73
  "test:coverage": "bun run ../scripts/check-coverage.ts"
74
74
  },
75
75
  "types": "dist/index.d.ts",
76
- "version": "0.24.0"
76
+ "version": "0.26.0"
77
77
  }
@@ -4,6 +4,7 @@ import AsyncStorage from "@react-native-async-storage/async-storage";
4
4
  import {configureStore} from "@reduxjs/toolkit";
5
5
  import {createApi, fetchBaseQuery} from "@reduxjs/toolkit/query/react";
6
6
  import {renderHook} from "@testing-library/react-native";
7
+ import {assert} from "chai";
7
8
  import React from "react";
8
9
  import {Provider} from "react-redux";
9
10
 
@@ -18,6 +19,7 @@ import {
18
19
  useSelectCurrentUserId,
19
20
  useSelectIsAuthenticating,
20
21
  } from "./authSlice";
22
+ import type {RootState} from "./constants";
21
23
 
22
24
  // Create a real RTK Query API with the endpoints that generateAuthSlice expects
23
25
  const api = createApi({
@@ -41,7 +43,9 @@ const api = createApi({
41
43
  });
42
44
 
43
45
  const createTestStore = () => {
44
- const {authReducer, middleware, ...rest} = generateAuthSlice(api as any);
46
+ const {authReducer, middleware, ...rest} = generateAuthSlice(
47
+ api as unknown as Parameters<typeof generateAuthSlice>[0]
48
+ );
45
49
 
46
50
  return {
47
51
  ...rest,
@@ -281,26 +285,30 @@ describe("generateAuthSlice", () => {
281
285
 
282
286
  describe("selectors", () => {
283
287
  it("selectCurrentUserId returns userId", () => {
284
- const state = {auth: {userId: "user-123"}} as any;
285
- expect(selectCurrentUserId(state)).toBe("user-123");
288
+ const state: RootState = {auth: {lastTokenRefreshTimestamp: null, userId: "user-123"}};
289
+ assert.equal(selectCurrentUserId(state), "user-123");
286
290
  });
287
291
 
288
292
  it("selectCurrentUserId returns undefined when no auth state", () => {
289
- expect(selectCurrentUserId({} as any)).toBeUndefined();
293
+ assert.isUndefined(selectCurrentUserId({}));
290
294
  });
291
295
 
292
296
  it("selectIsAuthenticating returns isAuthenticating", () => {
293
- const state = {auth: {isAuthenticating: true}} as any;
294
- expect(selectIsAuthenticating(state)).toBe(true);
297
+ const state: RootState = {auth: {isAuthenticating: true, lastTokenRefreshTimestamp: null}};
298
+ assert.isTrue(selectIsAuthenticating(state));
295
299
  });
296
300
 
297
301
  it("selectIsAuthenticating defaults to false", () => {
298
- expect(selectIsAuthenticating({} as any)).toBe(false);
302
+ assert.isFalse(selectIsAuthenticating({}));
299
303
  });
300
304
 
301
305
  it("selectLastTokenRefreshTimestamp returns timestamp", () => {
302
- const state = {auth: {lastTokenRefreshTimestamp: 12345}} as any;
303
- expect(selectLastTokenRefreshTimestamp(state)).toBe(12345);
306
+ const state: RootState = {auth: {lastTokenRefreshTimestamp: 12345}};
307
+ assert.equal(selectLastTokenRefreshTimestamp(state), 12345);
308
+ });
309
+
310
+ it("selectLastTokenRefreshTimestamp defaults to null", () => {
311
+ assert.isNull(selectLastTokenRefreshTimestamp({}));
304
312
  });
305
313
  });
306
314
 
@@ -321,9 +329,9 @@ describe("EmailLoginRequest type", () => {
321
329
  describe("generateProfileEndpoints", () => {
322
330
  it("builds endpoint query payloads", () => {
323
331
  const builder = {
324
- mutation: (config: any) => config,
325
- };
326
- const endpoints = generateProfileEndpoints(builder as any, "todos");
332
+ mutation: (config: unknown) => config,
333
+ } as unknown as Parameters<typeof generateProfileEndpoints>[0];
334
+ const endpoints = generateProfileEndpoints(builder, "todos");
327
335
  const createEmailUserQuery = endpoints.createEmailUser.query;
328
336
  const emailLoginQuery = endpoints.emailLogin.query;
329
337
  const emailSignUpQuery = endpoints.emailSignUp.query;
package/src/authSlice.ts CHANGED
@@ -298,7 +298,7 @@ export const generateAuthSlice = (api: Api<any, any, any, any, any>) => {
298
298
 
299
299
  export const selectCurrentUserId = (state: RootState): string | undefined => state.auth?.userId;
300
300
  export const selectLastTokenRefreshTimestamp = (state: RootState): number | null =>
301
- state.auth?.lastTokenRefreshTimestamp;
301
+ state.auth?.lastTokenRefreshTimestamp ?? null;
302
302
  export const selectIsAuthenticating = (state: RootState): boolean =>
303
303
  state.auth?.isAuthenticating ?? false;
304
304
 
@@ -5,7 +5,12 @@
5
5
  * login/logout actions, and selectors for auth state.
6
6
  */
7
7
 
8
- import {createListenerMiddleware, createSlice, type PayloadAction} from "@reduxjs/toolkit";
8
+ import {
9
+ createListenerMiddleware,
10
+ createSlice,
11
+ type PayloadAction,
12
+ type UnknownAction,
13
+ } from "@reduxjs/toolkit";
9
14
  import {DateTime} from "luxon";
10
15
 
11
16
  import type {BetterAuthClientInterface, BetterAuthUser} from "./betterAuthTypes";
@@ -16,10 +21,13 @@ import type {BetterAuthClientInterface, BetterAuthUser} from "./betterAuthTypes"
16
21
  const LOGOUT_ACTION_TYPE = "auth/logout";
17
22
 
18
23
  /**
19
- * Root state type - loosely typed to avoid circular dependencies.
24
+ * Root state type - only the betterAuth slice is known here; other slices are
25
+ * allowed via the index signature so this works with any Redux store configuration.
20
26
  */
21
- // biome-ignore lint/suspicious/noExplicitAny: RootState is loosely typed to work with any Redux store configuration.
22
- type RootState = any;
27
+ interface RootState {
28
+ betterAuth?: BetterAuthState;
29
+ [key: string]: unknown;
30
+ }
23
31
 
24
32
  /**
25
33
  * Better Auth Redux state interface.
@@ -202,8 +210,7 @@ export const generateBetterAuthSlice = (config: GenerateBetterAuthSliceConfig) =
202
210
  * Syncs the session state from Better Auth to Redux.
203
211
  * Call this on app startup and periodically to keep state in sync.
204
212
  */
205
- // biome-ignore lint/suspicious/noExplicitAny: Redux dispatch type varies by store configuration
206
- const syncSession = async (dispatch: any): Promise<void> => {
213
+ const syncSession = async (dispatch: (action: UnknownAction) => void): Promise<void> => {
207
214
  dispatch(betterAuthSlice.actions.setLoading(true));
208
215
 
209
216
  try {
@@ -269,40 +276,34 @@ export type BetterAuthSlice = ReturnType<typeof generateBetterAuthSlice>;
269
276
  * Selects the entire Better Auth state.
270
277
  */
271
278
  export const selectBetterAuthState = (state: RootState): BetterAuthState | undefined =>
272
- // biome-ignore lint/suspicious/noExplicitAny: RootState is loosely typed
273
- (state as any).betterAuth;
279
+ state.betterAuth;
274
280
 
275
281
  /**
276
282
  * Selects whether the user is authenticated.
277
283
  */
278
284
  export const selectBetterAuthIsAuthenticated = (state: RootState): boolean =>
279
- // biome-ignore lint/suspicious/noExplicitAny: RootState is loosely typed
280
- (state as any).betterAuth?.isAuthenticated ?? false;
285
+ state.betterAuth?.isAuthenticated ?? false;
281
286
 
282
287
  /**
283
288
  * Selects the current user ID.
284
289
  */
285
290
  export const selectBetterAuthUserId = (state: RootState): string | null =>
286
- // biome-ignore lint/suspicious/noExplicitAny: RootState is loosely typed
287
- (state as any).betterAuth?.userId ?? null;
291
+ state.betterAuth?.userId ?? null;
288
292
 
289
293
  /**
290
294
  * Selects the current user data.
291
295
  */
292
296
  export const selectBetterAuthUser = (state: RootState): BetterAuthUser | null =>
293
- // biome-ignore lint/suspicious/noExplicitAny: RootState is loosely typed
294
- (state as any).betterAuth?.user ?? null;
297
+ state.betterAuth?.user ?? null;
295
298
 
296
299
  /**
297
300
  * Selects whether the auth state is loading.
298
301
  */
299
302
  export const selectBetterAuthIsLoading = (state: RootState): boolean =>
300
- // biome-ignore lint/suspicious/noExplicitAny: RootState is loosely typed
301
- (state as any).betterAuth?.isLoading ?? false;
303
+ state.betterAuth?.isLoading ?? false;
302
304
 
303
305
  /**
304
306
  * Selects the last error message.
305
307
  */
306
308
  export const selectBetterAuthError = (state: RootState): string | null =>
307
- // biome-ignore lint/suspicious/noExplicitAny: RootState is loosely typed
308
- (state as any).betterAuth?.error ?? null;
309
+ state.betterAuth?.error ?? null;
package/src/constants.ts CHANGED
@@ -1,7 +1,12 @@
1
1
  import Constants from "expo-constants";
2
2
 
3
- // biome-ignore lint/suspicious/noExplicitAny: RootState is hard to type without becoming circular.
4
- export type RootState = any;
3
+ export interface RootState {
4
+ auth?: {
5
+ isAuthenticating?: boolean;
6
+ lastTokenRefreshTimestamp: number | null;
7
+ userId?: string;
8
+ };
9
+ }
5
10
  export const LOGOUT_ACTION_TYPE = "auth/logout";
6
11
  export const TOKEN_REFRESHED_SUCCESS = "auth/tokenRefreshedSuccess";
7
12