@omniretail/omniflags-react-native 1.0.8 → 1.0.9

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.
@@ -1,9 +1,21 @@
1
1
  import React, { type ReactNode } from "react";
2
+ import type { FlagSnapshot } from "@omniretail/omniflags-core";
2
3
  import { type ReactNativeAsyncStorage } from "./async-storage-cache.js";
3
4
  export interface OmniFlagsProviderProps {
4
5
  sdkKey: string;
5
6
  children?: ReactNode;
6
7
  /** Optional override for AsyncStorage implementation (tests/custom runtimes). */
7
8
  asyncStorage?: ReactNativeAsyncStorage;
9
+ /**
10
+ * Pre-loaded snapshot to seed the client synchronously, avoiding a loading
11
+ * flash on cold start. Read from AsyncStorage before mounting the provider:
12
+ *
13
+ * ```ts
14
+ * const raw = await AsyncStorage.getItem(`omniflags:snapshot:${sdkKey}`);
15
+ * const initialSnapshot = raw ? JSON.parse(raw) : undefined;
16
+ * <OmniFlagsProvider sdkKey={sdkKey} initialSnapshot={initialSnapshot} />
17
+ * ```
18
+ */
19
+ initialSnapshot?: FlagSnapshot;
8
20
  }
9
- export declare function OmniFlagsProvider({ sdkKey, children, asyncStorage, ...rest }: OmniFlagsProviderProps): React.FunctionComponentElement<React.ProviderProps<import("./context.js").OmniFlagsContextValue | null>>;
21
+ export declare function OmniFlagsProvider({ sdkKey, children, asyncStorage, initialSnapshot, ...rest }: OmniFlagsProviderProps): React.FunctionComponentElement<React.ProviderProps<import("./context.js").OmniFlagsContextValue | null>>;
package/dist/provider.js CHANGED
@@ -5,14 +5,22 @@ import AsyncStorage from "@react-native-async-storage/async-storage";
5
5
  import { OmniFlagsClient } from "@omniretail/omniflags-core";
6
6
  import { OmniFlagsContext } from "./context.js";
7
7
  import { AsyncStorageCache } from "./async-storage-cache.js";
8
- export function OmniFlagsProvider({ sdkKey, children, asyncStorage, ...rest }) {
8
+ export function OmniFlagsProvider({ sdkKey, children, asyncStorage, initialSnapshot, ...rest }) {
9
9
  const provider = rest.provider;
10
- const [ready, setReady] = useState(false);
11
- const clientRef = useRef(null);
12
- if (!clientRef.current) {
13
- clientRef.current = new OmniFlagsClient({ sdkKey, provider }, new AsyncStorageCache(asyncStorage ?? AsyncStorage));
14
- }
15
- const client = clientRef.current;
10
+ const [client, setClient] = useState(() => new OmniFlagsClient(
11
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
+ { sdkKey, provider, initialSnapshot }, new AsyncStorageCache(asyncStorage ?? AsyncStorage)));
13
+ const [ready, setReady] = useState(() => client.status !== "not_ready");
14
+ const prevSdkKeyRef = useRef(sdkKey);
15
+ useEffect(() => {
16
+ if (prevSdkKeyRef.current === sdkKey)
17
+ return;
18
+ prevSdkKeyRef.current = sdkKey;
19
+ const next = new OmniFlagsClient({ sdkKey, provider }, new AsyncStorageCache(asyncStorage ?? AsyncStorage));
20
+ setReady(next.status !== "not_ready");
21
+ setClient(next);
22
+ // eslint-disable-next-line react-hooks/exhaustive-deps
23
+ }, [sdkKey]);
16
24
  useEffect(() => {
17
25
  let mounted = true;
18
26
  client.waitForReady().then(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,YAAY,MAAM,2CAA2C,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAgC,MAAM,0BAA0B,CAAC;AAc3F,MAAM,UAAU,iBAAiB,CAAC,EAChC,MAAM,EACN,QAAQ,EACR,YAAY,EACZ,GAAG,IAAI,EACgB;IACvB,MAAM,QAAQ,GAAI,IAAsB,CAAC,QAAQ,CAAC;IAClD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,MAAM,CAAyB,IAAI,CAAC,CAAC;IAEvD,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;QACvB,SAAS,CAAC,OAAO,GAAG,IAAI,eAAe,CACrC,EAAE,MAAM,EAAE,QAAQ,EAAE,EACpB,IAAI,iBAAiB,CAAC,YAAY,IAAI,YAAY,CAAC,CACpD,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC;IAEjC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,GAAG,IAAI,CAAC;QAEnB,MAAM,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;YAC9B,IAAI,OAAO;gBAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,OAAO,GAAG,EAAE;YACV,OAAO,GAAG,KAAK,CAAC;YAChB,KAAK,MAAM,CAAC,QAAQ,EAAE,CAAC;QACzB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,YAAY,GAAG,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,EAAE;YACrE,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;gBAC3B,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,GAAG,EAAE;YACV,YAAY,CAAC,MAAM,EAAE,CAAC;QACxB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,OAAO,KAAK,CAAC,aAAa,CACxB,gBAAgB,CAAC,QAAQ,EACzB,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAC5B,QAAQ,CACT,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,YAAY,MAAM,2CAA2C,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAgC,MAAM,0BAA0B,CAAC;AAyB3F,MAAM,UAAU,iBAAiB,CAAC,EAChC,MAAM,EACN,QAAQ,EACR,YAAY,EACZ,eAAe,EACf,GAAG,IAAI,EACgB;IACvB,MAAM,QAAQ,GAAI,IAAsB,CAAC,QAAQ,CAAC;IAClD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,eAAe;IAC5D,8DAA8D;IAC9D,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,EAAS,EAC5C,IAAI,iBAAiB,CAAC,YAAY,IAAI,YAAY,CAAC,CACpD,CAAC,CAAC;IACH,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC;IACxE,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAErC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,aAAa,CAAC,OAAO,KAAK,MAAM;YAAE,OAAO;QAC7C,aAAa,CAAC,OAAO,GAAG,MAAM,CAAC;QAC/B,MAAM,IAAI,GAAG,IAAI,eAAe,CAC9B,EAAE,MAAM,EAAE,QAAQ,EAAE,EACpB,IAAI,iBAAiB,CAAC,YAAY,IAAI,YAAY,CAAC,CACpD,CAAC;QACF,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC;QACtC,SAAS,CAAC,IAAI,CAAC,CAAC;QAClB,uDAAuD;IACvD,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,GAAG,IAAI,CAAC;QAEnB,MAAM,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;YAC9B,IAAI,OAAO;gBAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,OAAO,GAAG,EAAE;YACV,OAAO,GAAG,KAAK,CAAC;YAChB,KAAK,MAAM,CAAC,QAAQ,EAAE,CAAC;QACzB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,YAAY,GAAG,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,EAAE;YACrE,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;gBAC3B,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,GAAG,EAAE;YACV,YAAY,CAAC,MAAM,EAAE,CAAC;QACxB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,OAAO,KAAK,CAAC,aAAa,CACxB,gBAAgB,CAAC,QAAQ,EACzB,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAC5B,QAAQ,CACT,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@omniretail/omniflags-react-native",
3
- "version": "1.0.8",
3
+ "version": "1.0.9",
4
4
  "description": "OmniFlags React Native SDK — provider + hooks with built-in AsyncStorage offline cache",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -29,7 +29,7 @@
29
29
  }
30
30
  },
31
31
  "dependencies": {
32
- "@omniretail/omniflags-core": "^1.0.8"
32
+ "@omniretail/omniflags-core": "^1.0.9"
33
33
  },
34
34
  "devDependencies": {
35
35
  "@testing-library/react": "^16.0.0",