jazz-tools 0.19.22 → 0.20.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 (201) hide show
  1. package/.svelte-kit/__package__/react.d.ts.map +1 -1
  2. package/.svelte-kit/__package__/react.tsx +5 -2
  3. package/.turbo/turbo-build.log +71 -83
  4. package/CHANGELOG.md +69 -0
  5. package/dist/better-auth/auth/react.d.ts.map +1 -1
  6. package/dist/better-auth/auth/react.js +5 -2
  7. package/dist/better-auth/auth/react.js.map +1 -1
  8. package/dist/browser/createBrowserContext.d.ts +1 -2
  9. package/dist/browser/createBrowserContext.d.ts.map +1 -1
  10. package/dist/browser/index.js +1 -8
  11. package/dist/browser/index.js.map +1 -1
  12. package/dist/browser/provideBrowserLockSession/SessionIDStorage.d.ts +1 -1
  13. package/dist/{chunk-QCTQH5RS.js → chunk-3CAPPS2F.js} +234 -101
  14. package/dist/chunk-3CAPPS2F.js.map +1 -0
  15. package/dist/{chunk-M2HGBOXS.js → chunk-K4D7IMFM.js} +3 -3
  16. package/dist/chunk-K4D7IMFM.js.map +1 -0
  17. package/dist/expo/auth/clerk/index.d.ts.map +1 -1
  18. package/dist/expo/index.js +5 -2
  19. package/dist/expo/index.js.map +1 -1
  20. package/dist/index.js +4 -2
  21. package/dist/index.js.map +1 -1
  22. package/dist/inspector/{chunk-YQNK5Y7B.js → chunk-MCTB5ZJC.js} +1 -1
  23. package/dist/inspector/chunk-MCTB5ZJC.js.map +1 -0
  24. package/dist/inspector/contexts/node.d.ts.map +1 -1
  25. package/dist/inspector/{custom-element-KYV64IOC.js → custom-element-5YWVZBWA.js} +1 -1
  26. package/dist/inspector/{custom-element-KYV64IOC.js.map → custom-element-5YWVZBWA.js.map} +1 -1
  27. package/dist/inspector/index.js +3 -3
  28. package/dist/inspector/index.js.map +1 -1
  29. package/dist/inspector/register-custom-element.js +1 -1
  30. package/dist/inspector/standalone.js +1 -1
  31. package/dist/react/auth/Clerk.d.ts.map +1 -1
  32. package/dist/react/hooks.d.ts +1 -1
  33. package/dist/react/hooks.d.ts.map +1 -1
  34. package/dist/react/index.js +61 -47
  35. package/dist/react/index.js.map +1 -1
  36. package/dist/react/provider.d.ts.map +1 -1
  37. package/dist/react/ssr.js +2 -2
  38. package/dist/react/ssr.js.map +1 -1
  39. package/dist/react-core/chunk-UOYH6JFJ.js +10 -0
  40. package/dist/react-core/chunk-UOYH6JFJ.js.map +1 -0
  41. package/dist/react-core/hooks.d.ts +3 -3
  42. package/dist/react-core/hooks.d.ts.map +1 -1
  43. package/dist/react-core/index.js +27 -25
  44. package/dist/react-core/index.js.map +1 -1
  45. package/dist/react-core/provider.d.ts +2 -3
  46. package/dist/react-core/provider.d.ts.map +1 -1
  47. package/dist/react-core/testing.d.ts.map +1 -1
  48. package/dist/react-core/testing.js +4 -10
  49. package/dist/react-core/testing.js.map +1 -1
  50. package/dist/react-native/index.js +61 -53
  51. package/dist/react-native/index.js.map +1 -1
  52. package/dist/react-native-core/ReactNativeContextManager.d.ts +0 -1
  53. package/dist/react-native-core/ReactNativeContextManager.d.ts.map +1 -1
  54. package/dist/react-native-core/hooks.d.ts +1 -1
  55. package/dist/react-native-core/hooks.d.ts.map +1 -1
  56. package/dist/react-native-core/index.js +58 -50
  57. package/dist/react-native-core/index.js.map +1 -1
  58. package/dist/react-native-core/platform.d.ts +0 -4
  59. package/dist/react-native-core/platform.d.ts.map +1 -1
  60. package/dist/react-native-core/provider.d.ts +2 -1
  61. package/dist/react-native-core/provider.d.ts.map +1 -1
  62. package/dist/svelte/jazz.class.svelte.d.ts.map +1 -1
  63. package/dist/svelte/jazz.class.svelte.js +2 -8
  64. package/dist/svelte/tests/AccountCoState.svelte.test.d.ts +2 -0
  65. package/dist/svelte/tests/AccountCoState.svelte.test.d.ts.map +1 -0
  66. package/dist/svelte/tests/AccountCoState.svelte.test.js +59 -0
  67. package/dist/svelte/tests/CoState.svelte.test.js +23 -0
  68. package/dist/svelte/tests/TestAccountCoStateWrapper.svelte +24 -0
  69. package/dist/svelte/tests/TestAccountCoStateWrapper.svelte.d.ts +11 -0
  70. package/dist/svelte/tests/TestAccountCoStateWrapper.svelte.d.ts.map +1 -0
  71. package/dist/testing.js +6 -6
  72. package/dist/testing.js.map +1 -1
  73. package/dist/tools/coValues/coList.d.ts +2 -2
  74. package/dist/tools/coValues/coList.d.ts.map +1 -1
  75. package/dist/tools/coValues/coMap.d.ts +2 -2
  76. package/dist/tools/coValues/deepLoading.d.ts +2 -2
  77. package/dist/tools/coValues/deepLoading.d.ts.map +1 -1
  78. package/dist/tools/coValues/interfaces.d.ts +32 -0
  79. package/dist/tools/coValues/interfaces.d.ts.map +1 -1
  80. package/dist/tools/exports.d.ts +1 -1
  81. package/dist/tools/exports.d.ts.map +1 -1
  82. package/dist/tools/implementation/ContextManager.d.ts.map +1 -1
  83. package/dist/tools/implementation/createContext.d.ts.map +1 -1
  84. package/dist/tools/implementation/zodSchema/schemaTypes/AccountSchema.d.ts +3 -2
  85. package/dist/tools/implementation/zodSchema/schemaTypes/AccountSchema.d.ts.map +1 -1
  86. package/dist/tools/implementation/zodSchema/schemaTypes/CoDiscriminatedUnionSchema.d.ts +3 -2
  87. package/dist/tools/implementation/zodSchema/schemaTypes/CoDiscriminatedUnionSchema.d.ts.map +1 -1
  88. package/dist/tools/implementation/zodSchema/schemaTypes/CoFeedSchema.d.ts +3 -3
  89. package/dist/tools/implementation/zodSchema/schemaTypes/CoFeedSchema.d.ts.map +1 -1
  90. package/dist/tools/implementation/zodSchema/schemaTypes/CoListSchema.d.ts +3 -2
  91. package/dist/tools/implementation/zodSchema/schemaTypes/CoListSchema.d.ts.map +1 -1
  92. package/dist/tools/implementation/zodSchema/schemaTypes/CoMapSchema.d.ts +5 -2
  93. package/dist/tools/implementation/zodSchema/schemaTypes/CoMapSchema.d.ts.map +1 -1
  94. package/dist/tools/implementation/zodSchema/zodCo.d.ts.map +1 -1
  95. package/dist/tools/ssr.js +1 -1
  96. package/dist/tools/subscribe/JazzError.d.ts +3 -3
  97. package/dist/tools/subscribe/JazzError.d.ts.map +1 -1
  98. package/dist/tools/subscribe/SubscriptionScope.d.ts.map +1 -1
  99. package/dist/tools/subscribe/types.d.ts +5 -1
  100. package/dist/tools/subscribe/types.d.ts.map +1 -1
  101. package/dist/tools/testing.d.ts +3 -3
  102. package/dist/tools/testing.d.ts.map +1 -1
  103. package/dist/tools/tests/deleteCoValues.test.d.ts +2 -0
  104. package/dist/tools/tests/deleteCoValues.test.d.ts.map +1 -0
  105. package/dist/tools/tests/deletedState.test.d.ts +2 -0
  106. package/dist/tools/tests/deletedState.test.d.ts.map +1 -0
  107. package/dist/worker/edge-wasm.js +2 -1
  108. package/dist/worker/edge-wasm.js.map +1 -1
  109. package/dist/worker/wasm.d.ts +2 -0
  110. package/dist/worker/wasm.d.ts.map +1 -0
  111. package/package.json +9 -28
  112. package/src/better-auth/auth/react.tsx +5 -2
  113. package/src/browser/createBrowserContext.ts +2 -5
  114. package/src/expo/auth/clerk/index.tsx +5 -2
  115. package/src/inspector/contexts/node.tsx +1 -2
  116. package/src/inspector/index.tsx +2 -2
  117. package/src/react/auth/Clerk.tsx +5 -2
  118. package/src/react/auth/PasskeyAuth.tsx +2 -2
  119. package/src/react/hooks.tsx +3 -2
  120. package/src/react/provider.tsx +45 -41
  121. package/src/react-core/auth/DemoAuth.tsx +2 -2
  122. package/src/react-core/auth/PassphraseAuth.tsx +2 -2
  123. package/src/react-core/hooks.ts +26 -27
  124. package/src/react-core/provider.tsx +1 -5
  125. package/src/react-core/testing.tsx +3 -11
  126. package/src/react-core/tests/useAccount.selector.test.ts +2 -3
  127. package/src/react-core/tests/useAccount.test.ts +57 -7
  128. package/src/react-core/tests/useCoState.test.ts +37 -0
  129. package/src/react-core/tests/useInboxSender.test.ts +2 -5
  130. package/src/react-core/tests/useSuspenseAccount.test.tsx +68 -0
  131. package/src/react-core/tests/useSuspenseCoState.test.tsx +44 -0
  132. package/src/react-native-core/ReactNativeContextManager.ts +0 -3
  133. package/src/react-native-core/auth/usePasskeyAuth.tsx +2 -2
  134. package/src/react-native-core/hooks.tsx +3 -3
  135. package/src/react-native-core/platform.ts +2 -6
  136. package/src/react-native-core/provider.tsx +47 -43
  137. package/src/svelte/jazz.class.svelte.ts +2 -8
  138. package/src/svelte/tests/AccountCoState.svelte.test.ts +79 -0
  139. package/src/svelte/tests/CoState.svelte.test.ts +36 -0
  140. package/src/svelte/tests/TestAccountCoStateWrapper.svelte +24 -0
  141. package/src/tools/coValues/deepLoading.ts +2 -0
  142. package/src/tools/coValues/interfaces.ts +170 -32
  143. package/src/tools/exports.ts +1 -0
  144. package/src/tools/implementation/ContextManager.ts +2 -2
  145. package/src/tools/implementation/createContext.ts +4 -0
  146. package/src/tools/implementation/zodSchema/schemaTypes/AccountSchema.ts +30 -6
  147. package/src/tools/implementation/zodSchema/schemaTypes/CoDiscriminatedUnionSchema.ts +55 -7
  148. package/src/tools/implementation/zodSchema/schemaTypes/CoFeedSchema.ts +33 -14
  149. package/src/tools/implementation/zodSchema/schemaTypes/CoListSchema.ts +35 -6
  150. package/src/tools/implementation/zodSchema/schemaTypes/CoMapSchema.ts +35 -14
  151. package/src/tools/ssr/ssr.ts +2 -2
  152. package/src/tools/subscribe/CoValueCoreSubscription.ts +1 -0
  153. package/src/tools/subscribe/JazzError.ts +4 -1
  154. package/src/tools/subscribe/SubscriptionScope.ts +23 -0
  155. package/src/tools/subscribe/types.ts +5 -0
  156. package/src/tools/testing.ts +5 -5
  157. package/src/tools/tests/PassphraseAuth.test.ts +5 -5
  158. package/src/tools/tests/deleteCoValues.test.ts +231 -0
  159. package/src/tools/tests/deletedState.test.ts +110 -0
  160. package/src/tools/tests/request.test.ts +15 -2
  161. package/src/worker/edge-wasm.ts +2 -1
  162. package/src/worker/wasm.ts +1 -0
  163. package/tsup.config.ts +0 -4
  164. package/dist/browser/storageOptions.d.ts +0 -8
  165. package/dist/browser/storageOptions.d.ts.map +0 -1
  166. package/dist/browser/tests/storageOptions.test.d.ts +0 -2
  167. package/dist/browser/tests/storageOptions.test.d.ts.map +0 -1
  168. package/dist/chunk-M2HGBOXS.js.map +0 -1
  169. package/dist/chunk-QCTQH5RS.js.map +0 -1
  170. package/dist/expo/crypto.d.ts +0 -2
  171. package/dist/expo/crypto.d.ts.map +0 -1
  172. package/dist/expo/crypto.js +0 -6
  173. package/dist/expo/crypto.js.map +0 -1
  174. package/dist/inspector/chunk-YQNK5Y7B.js.map +0 -1
  175. package/dist/react-core/chunk-7DYMJ74I.js +0 -12
  176. package/dist/react-core/chunk-7DYMJ74I.js.map +0 -1
  177. package/dist/react-native/chunk-DGUM43GV.js +0 -11
  178. package/dist/react-native/chunk-DGUM43GV.js.map +0 -1
  179. package/dist/react-native/crypto.d.ts +0 -2
  180. package/dist/react-native/crypto.d.ts.map +0 -1
  181. package/dist/react-native/crypto.js +0 -8
  182. package/dist/react-native/crypto.js.map +0 -1
  183. package/dist/react-native-core/chunk-DGUM43GV.js +0 -11
  184. package/dist/react-native-core/chunk-DGUM43GV.js.map +0 -1
  185. package/dist/react-native-core/crypto/RNCrypto.d.ts +0 -2
  186. package/dist/react-native-core/crypto/RNCrypto.d.ts.map +0 -1
  187. package/dist/react-native-core/crypto/RNCrypto.js +0 -3
  188. package/dist/react-native-core/crypto/RNCrypto.js.map +0 -1
  189. package/dist/react-native-core/crypto/RNQuickCrypto.d.ts +0 -17
  190. package/dist/react-native-core/crypto/RNQuickCrypto.d.ts.map +0 -1
  191. package/dist/react-native-core/crypto/index.d.ts +0 -2
  192. package/dist/react-native-core/crypto/index.d.ts.map +0 -1
  193. package/dist/react-native-core/crypto.js +0 -89
  194. package/dist/react-native-core/crypto.js.map +0 -1
  195. package/src/browser/storageOptions.ts +0 -17
  196. package/src/browser/tests/storageOptions.test.ts +0 -33
  197. package/src/expo/crypto.ts +0 -1
  198. package/src/react-native/crypto.ts +0 -1
  199. package/src/react-native-core/crypto/RNCrypto.ts +0 -1
  200. package/src/react-native-core/crypto/RNQuickCrypto.ts +0 -122
  201. package/src/react-native-core/crypto/index.ts +0 -1
@@ -1,6 +1,9 @@
1
- import {
2
- __require
3
- } from "./chunk-DGUM43GV.js";
1
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
2
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
3
+ }) : x)(function(x) {
4
+ if (typeof require !== "undefined") return require.apply(this, arguments);
5
+ throw Error('Dynamic require of "' + x + '" is not supported');
6
+ });
4
7
 
5
8
  // src/react-native-core/storage/kv-store-context.ts
6
9
  var KvStoreContext = class _KvStoreContext {
@@ -434,14 +437,14 @@ ReactNativePasskeyAuth.id = "passkey";
434
437
  import {
435
438
  useAuthSecretStorage,
436
439
  useIsAuthenticated,
437
- useJazzContext
440
+ useJazzContextValue
438
441
  } from "jazz-tools/react-core";
439
442
  import { useMemo } from "react";
440
443
  function usePasskeyAuth({
441
444
  appName,
442
445
  rpId
443
446
  }) {
444
- const context = useJazzContext();
447
+ const context = useJazzContextValue();
445
448
  const authSecretStorage = useAuthSecretStorage();
446
449
  if ("guest" in context) {
447
450
  throw new Error("Passkey auth is not supported in guest mode");
@@ -740,7 +743,7 @@ function clearUserCredentials() {
740
743
  // src/react-native-core/hooks.tsx
741
744
  import { useEffect } from "react";
742
745
  import { parseInviteLink } from "jazz-tools";
743
- import { useJazzContext as useJazzContext2 } from "jazz-tools/react-core";
746
+ import { useJazzContextValue as useJazzContextValue2 } from "jazz-tools/react-core";
744
747
  import { Linking } from "react-native";
745
748
  import {
746
749
  useCoState,
@@ -748,7 +751,7 @@ import {
748
751
  experimental_useInboxSender,
749
752
  useDemoAuth,
750
753
  usePassphraseAuth,
751
- useJazzContext as useJazzContext3,
754
+ useJazzContextValue as useJazzContextValue3,
752
755
  useAuthSecretStorage as useAuthSecretStorage2,
753
756
  useIsAuthenticated as useIsAuthenticated2,
754
757
  useAccount,
@@ -767,7 +770,7 @@ function useAcceptInviteNative({
767
770
  onAccept,
768
771
  forValueHint
769
772
  }) {
770
- const context = useJazzContext2();
773
+ const context = useJazzContextValue2();
771
774
  if (!("me" in context)) {
772
775
  throw new Error(
773
776
  "useAcceptInviteNative can't be used in a JazzProvider with auth === 'guest'."
@@ -799,8 +802,15 @@ function useAcceptInviteNative({
799
802
  }
800
803
 
801
804
  // src/react-native-core/provider.tsx
802
- import { JazzContext, JazzContextManagerContext } from "jazz-tools/react-core";
803
- import React3, { useEffect as useEffect2, useRef } from "react";
805
+ import { JazzContext } from "jazz-tools/react-core";
806
+ import React3, {
807
+ useCallback,
808
+ useContext,
809
+ useEffect as useEffect2,
810
+ useMemo as useMemo2,
811
+ useRef,
812
+ useSyncExternalStore
813
+ } from "react";
804
814
 
805
815
  // src/react-native-core/ReactNativeContextManager.ts
806
816
  import {
@@ -810,7 +820,6 @@ import {
810
820
  // src/react-native-core/platform.ts
811
821
  import NetInfo from "@react-native-community/netinfo";
812
822
  import { getSqliteStorageAsync } from "cojson";
813
- import { PureJSCrypto } from "cojson/dist/crypto/PureJSCrypto";
814
823
  import {
815
824
  createInviteLink as baseCreateInviteLink,
816
825
  createAnonymousJazzContext,
@@ -875,6 +884,7 @@ var ReactNativeSessionProvider = class {
875
884
 
876
885
  // src/react-native-core/platform.ts
877
886
  import { WebSocketPeerWithReconnection } from "cojson-transport-ws";
887
+ import { RNCrypto } from "cojson/crypto/RNCrypto";
878
888
  var ReactNativeWebSocketPeerWithReconnection = class extends WebSocketPeerWithReconnection {
879
889
  onNetworkChange(callback) {
880
890
  return NetInfo.addEventListener(
@@ -883,8 +893,7 @@ var ReactNativeWebSocketPeerWithReconnection = class extends WebSocketPeerWithRe
883
893
  }
884
894
  };
885
895
  async function setupPeers(options) {
886
- const CryptoProvider3 = options.CryptoProvider || PureJSCrypto;
887
- const crypto = await CryptoProvider3.create();
896
+ const crypto = await RNCrypto.create();
888
897
  let node = void 0;
889
898
  const peers = [];
890
899
  const storage = options.storage && options.storage !== "disabled" ? await getSqliteStorageAsync(options.storage) : void 0;
@@ -1056,8 +1065,7 @@ var ReactNativeContextManager = class extends JazzContextManager {
1056
1065
  return createJazzReactNativeGuestContext({
1057
1066
  sync: props.sync,
1058
1067
  storage: props.storage,
1059
- authSecretStorage: this.authSecretStorage,
1060
- CryptoProvider: props.CryptoProvider
1068
+ authSecretStorage: this.authSecretStorage
1061
1069
  });
1062
1070
  } else {
1063
1071
  return createJazzReactNativeContext({
@@ -1067,8 +1075,7 @@ var ReactNativeContextManager = class extends JazzContextManager {
1067
1075
  credentials: authProps?.credentials,
1068
1076
  newAccountProps: authProps?.newAccountProps,
1069
1077
  defaultProfileName: props.defaultProfileName,
1070
- authSecretStorage: this.authSecretStorage,
1071
- CryptoProvider: props.CryptoProvider
1078
+ authSecretStorage: this.authSecretStorage
1072
1079
  });
1073
1080
  }
1074
1081
  }
@@ -1096,9 +1103,14 @@ function JazzProviderCore({
1096
1103
  logOutReplacement,
1097
1104
  onAnonymousAccountDiscarded,
1098
1105
  kvStore,
1099
- CryptoProvider: CryptoProvider3,
1100
- authSecretStorageKey
1106
+ authSecretStorageKey,
1107
+ fallback = null
1101
1108
  }) {
1109
+ if (useContext(JazzContext)) {
1110
+ throw new Error(
1111
+ "You can't nest a JazzProvider inside another JazzProvider."
1112
+ );
1113
+ }
1102
1114
  setupKvStore(kvStore);
1103
1115
  const [contextManager] = React3.useState(
1104
1116
  () => new ReactNativeContextManager({ authSecretStorageKey })
@@ -1108,37 +1120,33 @@ function JazzProviderCore({
1108
1120
  const onAnonymousAccountDiscardedRefCallback = useRefCallback(
1109
1121
  onAnonymousAccountDiscarded
1110
1122
  );
1111
- const logoutReplacementActiveRef = useRef(false);
1112
- logoutReplacementActiveRef.current = Boolean(logOutReplacement);
1113
- const onAnonymousAccountDiscardedEnabled = Boolean(
1114
- onAnonymousAccountDiscarded
1115
- );
1116
- const value = React3.useSyncExternalStore(
1117
- React3.useCallback(
1123
+ const props = useMemo2(() => {
1124
+ return {
1125
+ AccountSchema,
1126
+ guestMode,
1127
+ sync,
1128
+ storage,
1129
+ defaultProfileName,
1130
+ onLogOut: onLogOutRefCallback,
1131
+ logOutReplacement: logOutReplacement ? logOutReplacementRefCallback : void 0,
1132
+ onAnonymousAccountDiscarded: onAnonymousAccountDiscarded ? onAnonymousAccountDiscardedRefCallback : void 0
1133
+ };
1134
+ }, [guestMode, sync.peer, sync.when, storage]);
1135
+ if (contextManager.propsChanged(props)) {
1136
+ contextManager.createContext(props).catch((error) => {
1137
+ console.log(error.stack);
1138
+ console.error("Error creating Jazz React Native context:", error);
1139
+ });
1140
+ }
1141
+ const isReady = useSyncExternalStore(
1142
+ useCallback(
1118
1143
  (callback) => {
1119
- const props = {
1120
- AccountSchema,
1121
- guestMode,
1122
- sync,
1123
- storage,
1124
- defaultProfileName,
1125
- onLogOut: onLogOutRefCallback,
1126
- logOutReplacement: logoutReplacementActiveRef.current ? logOutReplacementRefCallback : void 0,
1127
- onAnonymousAccountDiscarded: onAnonymousAccountDiscardedEnabled ? onAnonymousAccountDiscardedRefCallback : void 0,
1128
- CryptoProvider: CryptoProvider3
1129
- };
1130
- if (contextManager.propsChanged(props)) {
1131
- contextManager.createContext(props).catch((error) => {
1132
- console.log(error.stack);
1133
- console.error("Error creating Jazz React Native context:", error);
1134
- });
1135
- }
1136
1144
  return contextManager.subscribe(callback);
1137
1145
  },
1138
- [sync, guestMode].concat(storage)
1146
+ [contextManager]
1139
1147
  ),
1140
- () => contextManager.getCurrentValue(),
1141
- () => contextManager.getCurrentValue()
1148
+ () => Boolean(contextManager.getCurrentValue()),
1149
+ () => Boolean(contextManager.getCurrentValue())
1142
1150
  );
1143
1151
  useEffect2(() => {
1144
1152
  if (process.env.NODE_ENV === "development") return;
@@ -1146,7 +1154,7 @@ function JazzProviderCore({
1146
1154
  contextManager.done();
1147
1155
  };
1148
1156
  }, []);
1149
- return /* @__PURE__ */ jsx3(JazzContext.Provider, { value, children: /* @__PURE__ */ jsx3(JazzContextManagerContext.Provider, { value: contextManager, children: value && children }) });
1157
+ return /* @__PURE__ */ jsx3(JazzContext.Provider, { value: contextManager, children: isReady ? children : fallback });
1150
1158
  }
1151
1159
  function useRefCallback(callback) {
1152
1160
  const callbackRef = React3.useRef(callback);
@@ -1159,7 +1167,7 @@ function useRefCallback(callback) {
1159
1167
  // src/react-native-core/media/image.tsx
1160
1168
  import { ImageDefinition } from "jazz-tools";
1161
1169
  import { highestResAvailable } from "jazz-tools/media";
1162
- import { forwardRef, useEffect as useEffect3, useMemo as useMemo2, useState as useState3 } from "react";
1170
+ import { forwardRef, useEffect as useEffect3, useMemo as useMemo3, useState as useState3 } from "react";
1163
1171
  import { Image as RNImage } from "react-native";
1164
1172
  import { jsx as jsx4 } from "react/jsx-runtime";
1165
1173
  var Image = forwardRef(function Image2({ imageId, width, height, placeholder, ...props }, ref) {
@@ -1169,7 +1177,7 @@ var Image = forwardRef(function Image2({ imageId, width, height, placeholder, ..
1169
1177
  const [src, setSrc] = useState3(
1170
1178
  image?.placeholderDataURL ?? "data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=="
1171
1179
  );
1172
- const dimensions = useMemo2(() => {
1180
+ const dimensions = useMemo3(() => {
1173
1181
  const originalWidth = image?.originalSize?.[0];
1174
1182
  const originalHeight = image?.originalSize?.[1];
1175
1183
  if (width === "original" && height === "original") {
@@ -1272,7 +1280,7 @@ export {
1272
1280
  useCoValueSubscription,
1273
1281
  useDemoAuth,
1274
1282
  useIsAuthenticated2 as useIsAuthenticated,
1275
- useJazzContext3 as useJazzContext,
1283
+ useJazzContextValue3 as useJazzContextValue,
1276
1284
  useLogOut,
1277
1285
  usePasskeyAuth,
1278
1286
  usePassphraseAuth,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/react-native-core/storage/kv-store-context.ts","../../src/react-native-core/auth/DemoAuthUI.tsx","../../src/react-native-core/auth/PasskeyAuth.ts","../../src/react-native-core/auth/passkey-utils.ts","../../src/react-native-core/auth/usePasskeyAuth.tsx","../../src/react-native-core/auth/PasskeyAuthBasicUI.tsx","../../src/react-native-core/auth/auth.ts","../../src/react-native-core/hooks.tsx","../../src/react-native-core/provider.tsx","../../src/react-native-core/ReactNativeContextManager.ts","../../src/react-native-core/platform.ts","../../src/react-native-core/ReactNativeSessionProvider.ts","../../src/react-native-core/media/image.tsx","../../src/react-native-core/index.ts"],"sourcesContent":["export interface KvStore {\n get(key: string): Promise<string | null>;\n set(key: string, value: string): Promise<void>;\n delete(key: string): Promise<void>;\n clearAll(): Promise<void>;\n}\n\nexport class KvStoreContext {\n private static instance: KvStoreContext;\n private storageInstance: KvStore | null = null;\n\n private constructor() {}\n\n public static getInstance(): KvStoreContext {\n if (!KvStoreContext.instance) {\n KvStoreContext.instance = new KvStoreContext();\n }\n return KvStoreContext.instance;\n }\n\n public isInitialized(): boolean {\n return this.storageInstance !== null;\n }\n\n public initialize(store: KvStore): void {\n if (!this.storageInstance) {\n this.storageInstance = store;\n }\n }\n\n public getStorage(): KvStore {\n if (!this.storageInstance) {\n throw new Error(\"Storage instance is not initialized.\");\n }\n return this.storageInstance;\n }\n}\n\nexport default KvStoreContext;\n","import { useDemoAuth } from \"jazz-tools/react-core\";\nimport React, { useState } from \"react\";\nimport {\n StyleSheet,\n Text,\n TextInput,\n TouchableOpacity,\n View,\n useColorScheme,\n} from \"react-native\";\n\nexport const DemoAuthBasicUI = ({\n appName,\n auth,\n children,\n}: {\n appName: string;\n auth: ReturnType<typeof useDemoAuth>;\n children: React.ReactNode;\n}) => {\n const colorScheme = useColorScheme();\n const darkMode = colorScheme === \"dark\";\n const [username, setUsername] = useState<string>(\"\");\n const [errorMessage, setErrorMessage] = useState<string | null>(null);\n\n const handleSignUp = () => {\n setErrorMessage(null);\n\n auth.signUp(username).catch((error) => {\n setErrorMessage(error.message);\n });\n };\n\n const handleLogIn = (username: string) => {\n setErrorMessage(null);\n\n auth.logIn(username).catch((error) => {\n setErrorMessage(error.message);\n });\n };\n\n if (auth.state === \"signedIn\") {\n return children;\n }\n\n return (\n <View\n style={[\n styles.container,\n darkMode ? styles.darkBackground : styles.lightBackground,\n ]}\n >\n <View style={styles.formContainer}>\n <Text\n style={[\n styles.headerText,\n darkMode ? styles.darkText : styles.lightText,\n ]}\n >\n {appName}\n </Text>\n\n {errorMessage && <Text style={styles.errorText}>{errorMessage}</Text>}\n\n <TextInput\n placeholder=\"Display name\"\n value={username}\n onChangeText={setUsername}\n placeholderTextColor={darkMode ? \"#fff\" : \"#000\"}\n style={[\n styles.textInput,\n darkMode ? styles.darkInput : styles.lightInput,\n ]}\n />\n\n <TouchableOpacity\n onPress={handleSignUp}\n style={[\n styles.button,\n darkMode ? styles.darkButton : styles.lightButton,\n ]}\n >\n <Text\n style={darkMode ? styles.darkButtonText : styles.lightButtonText}\n >\n Sign Up as new account\n </Text>\n </TouchableOpacity>\n\n <View style={styles.existingUsersContainer}>\n {auth.existingUsers.map((user) => (\n <TouchableOpacity\n key={user}\n onPress={() => handleLogIn(user)}\n style={[\n styles.existingUserButton,\n darkMode ? styles.darkUserButton : styles.lightUserButton,\n ]}\n >\n <Text style={darkMode ? styles.darkText : styles.lightText}>\n Log In as \"{user}\"\n </Text>\n </TouchableOpacity>\n ))}\n </View>\n </View>\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n justifyContent: \"center\",\n alignItems: \"center\",\n padding: 20,\n },\n formContainer: {\n width: \"80%\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n headerText: {\n fontSize: 24,\n marginBottom: 20,\n },\n errorText: {\n color: \"red\",\n marginVertical: 5,\n textAlign: \"center\",\n },\n textInput: {\n borderWidth: 1,\n padding: 10,\n marginVertical: 10,\n width: \"100%\",\n borderRadius: 6,\n },\n darkInput: {\n borderColor: \"#444\",\n backgroundColor: \"#000\",\n color: \"#fff\",\n },\n lightInput: {\n borderColor: \"#ddd\",\n backgroundColor: \"#fff\",\n color: \"#000\",\n },\n button: {\n paddingVertical: 15,\n paddingHorizontal: 10,\n borderRadius: 6,\n width: \"100%\",\n marginVertical: 10,\n },\n darkButton: {\n backgroundColor: \"#444\",\n },\n lightButton: {\n backgroundColor: \"#ddd\",\n },\n darkButtonText: {\n color: \"#fff\",\n textAlign: \"center\",\n },\n lightButtonText: {\n color: \"#000\",\n textAlign: \"center\",\n },\n existingUsersContainer: {\n width: \"100%\",\n marginTop: 20,\n },\n existingUserButton: {\n paddingVertical: 15,\n paddingHorizontal: 10,\n borderRadius: 6,\n marginVertical: 5,\n },\n darkUserButton: {\n backgroundColor: \"#222\",\n },\n lightUserButton: {\n backgroundColor: \"#eee\",\n },\n loadingText: {\n fontSize: 18,\n color: \"#888\",\n },\n darkText: {\n color: \"#fff\",\n },\n lightText: {\n color: \"#000\",\n },\n darkBackground: {\n backgroundColor: \"#000\",\n },\n lightBackground: {\n backgroundColor: \"#fff\",\n },\n});\n","import { CryptoProvider, RawAccountID, cojsonInternals } from \"cojson\";\nimport {\n Account,\n AuthSecretStorage,\n AuthenticateAccountFunction,\n ID,\n} from \"jazz-tools\";\nimport {\n base64UrlToUint8Array,\n uint8ArrayToBase64Url,\n} from \"./passkey-utils.js\";\n\n// Types for react-native-passkey library\n// We define these here to avoid requiring the library as a direct dependency\ninterface PasskeyCreateRequest {\n challenge: string;\n rp: {\n id: string;\n name: string;\n };\n user: {\n id: string;\n name: string;\n displayName: string;\n };\n pubKeyCredParams: Array<{ alg: number; type: \"public-key\" }>;\n authenticatorSelection?: {\n authenticatorAttachment?: \"platform\" | \"cross-platform\";\n requireResidentKey?: boolean;\n residentKey?: \"discouraged\" | \"preferred\" | \"required\";\n userVerification?: \"discouraged\" | \"preferred\" | \"required\";\n };\n timeout?: number;\n attestation?: \"none\" | \"indirect\" | \"direct\" | \"enterprise\";\n}\n\ninterface PasskeyGetRequest {\n challenge: string;\n rpId: string;\n allowCredentials?: Array<{\n id: string;\n type: \"public-key\";\n transports?: Array<\"usb\" | \"nfc\" | \"ble\" | \"internal\" | \"hybrid\">;\n }>;\n timeout?: number;\n userVerification?: \"discouraged\" | \"preferred\" | \"required\";\n}\n\ninterface PasskeyGetResult {\n id: string;\n rawId: string;\n type: \"public-key\";\n response: {\n clientDataJSON: string;\n authenticatorData: string;\n signature: string;\n userHandle: string | null;\n };\n}\n\n/**\n * Interface for the react-native-passkey module.\n * @internal\n */\nexport interface PasskeyModule {\n create: (request: PasskeyCreateRequest) => Promise<unknown>;\n get: (request: PasskeyGetRequest) => Promise<PasskeyGetResult | null>;\n isSupported: () => Promise<boolean>;\n}\n\nlet cachedPasskeyModule: PasskeyModule | null = null;\n\n/**\n * Lazily loads the react-native-passkey module.\n * This allows the module to be an optional peer dependency.\n * @internal\n */\nexport function getPasskeyModule(): PasskeyModule {\n if (cachedPasskeyModule) {\n return cachedPasskeyModule;\n }\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const module = require(\"react-native-passkey\");\n const passkeyModule: PasskeyModule =\n module.Passkey || module.default || module;\n cachedPasskeyModule = passkeyModule;\n return passkeyModule;\n } catch (e) {\n console.error(\"Failed to load react-native-passkey:\", e);\n throw new Error(\n \"react-native-passkey is not installed. Please install it to use passkey authentication: npm install react-native-passkey\",\n );\n }\n}\n\n/**\n * Sets a custom passkey module (for testing purposes).\n * @internal\n */\nexport function setPasskeyModule(module: PasskeyModule | null): void {\n cachedPasskeyModule = module;\n}\n\n/**\n * Check if passkeys are supported on the current device.\n * Returns false if the react-native-passkey module is not available or if the device doesn't support passkeys.\n */\nexport async function isPasskeySupported(): Promise<boolean> {\n try {\n const module = getPasskeyModule();\n return await module.isSupported();\n } catch {\n return false;\n }\n}\n\n/**\n * `ReactNativePasskeyAuth` provides passkey (WebAuthn) authentication for React Native apps.\n *\n * This class uses the device's biometric authentication (FaceID/TouchID/fingerprint) to\n * securely store and retrieve Jazz account credentials.\n *\n * **Requirements:**\n * - Install `react-native-passkey` as a peer dependency\n * - Configure your app's associated domains (iOS) and asset links (Android)\n * - Passkeys require HTTPS domain verification\n *\n * ```ts\n * import { ReactNativePasskeyAuth } from \"jazz-tools/react-native-core\";\n *\n * const auth = new ReactNativePasskeyAuth(\n * crypto,\n * authenticate,\n * authSecretStorage,\n * \"My App\",\n * \"myapp.com\"\n * );\n * ```\n *\n * @category Auth Providers\n */\nexport class ReactNativePasskeyAuth {\n constructor(\n protected crypto: CryptoProvider,\n protected authenticate: AuthenticateAccountFunction,\n protected authSecretStorage: AuthSecretStorage,\n public appName: string,\n public rpId: string,\n ) {}\n\n static readonly id = \"passkey\";\n\n /**\n * Log in using an existing passkey.\n * This will prompt the user to authenticate with their device biometrics.\n */\n logIn = async () => {\n const { crypto, authenticate } = this;\n\n const webAuthNCredential = await this.getPasskeyCredentials();\n\n if (!webAuthNCredential) {\n return;\n }\n\n if (!webAuthNCredential.response.userHandle) {\n throw new Error(\"Passkey credential is missing userHandle\");\n }\n\n const webAuthNCredentialPayload = base64UrlToUint8Array(\n webAuthNCredential.response.userHandle,\n );\n\n const accountSecretSeed = webAuthNCredentialPayload.slice(\n 0,\n cojsonInternals.secretSeedLength,\n );\n\n const secret = crypto.agentSecretFromSecretSeed(accountSecretSeed);\n\n const accountID = cojsonInternals.rawCoIDfromBytes(\n webAuthNCredentialPayload.slice(\n cojsonInternals.secretSeedLength,\n cojsonInternals.secretSeedLength + cojsonInternals.shortHashLength,\n ),\n ) as ID<Account>;\n\n await authenticate({\n accountID,\n accountSecret: secret,\n });\n\n await this.authSecretStorage.set({\n accountID,\n secretSeed: accountSecretSeed,\n accountSecret: secret,\n provider: \"passkey\",\n });\n };\n\n /**\n * Register a new passkey for the current account.\n * This will create a passkey that stores the account credentials securely on the device.\n *\n * @param username - The display name for the passkey\n */\n signUp = async (username: string) => {\n const credentials = await this.authSecretStorage.get();\n\n if (!credentials?.secretSeed) {\n throw new Error(\n \"Not enough credentials to register the account with passkey\",\n );\n }\n\n await this.createPasskeyCredentials({\n accountID: credentials.accountID,\n secretSeed: credentials.secretSeed,\n username,\n });\n\n const currentAccount = await Account.getMe().$jazz.ensureLoaded({\n resolve: {\n profile: true,\n },\n });\n\n if (username.trim().length !== 0) {\n currentAccount.profile.$jazz.set(\"name\", username);\n }\n\n await this.authSecretStorage.set({\n accountID: credentials.accountID,\n secretSeed: credentials.secretSeed,\n accountSecret: credentials.accountSecret,\n provider: \"passkey\",\n });\n };\n\n private async createPasskeyCredentials({\n accountID,\n secretSeed,\n username,\n }: {\n accountID: ID<Account>;\n secretSeed: Uint8Array;\n username: string;\n }) {\n const webAuthNCredentialPayload = new Uint8Array(\n cojsonInternals.secretSeedLength + cojsonInternals.shortHashLength,\n );\n\n webAuthNCredentialPayload.set(secretSeed);\n webAuthNCredentialPayload.set(\n cojsonInternals.rawCoIDtoBytes(accountID as unknown as RawAccountID),\n cojsonInternals.secretSeedLength,\n );\n\n const challenge = uint8ArrayToBase64Url(\n new Uint8Array(this.crypto.randomBytes(32)),\n );\n const userId = uint8ArrayToBase64Url(webAuthNCredentialPayload);\n\n const passkey = getPasskeyModule();\n\n try {\n await passkey.create({\n challenge,\n rp: {\n id: this.rpId,\n name: this.appName,\n },\n user: {\n id: userId,\n name: `${username} (${new Date().toLocaleString()})`,\n displayName: username,\n },\n pubKeyCredParams: [\n { alg: -7, type: \"public-key\" }, // ES256\n { alg: -257, type: \"public-key\" }, // RS256\n ],\n authenticatorSelection: {\n residentKey: \"required\",\n userVerification: \"preferred\",\n },\n timeout: 60000,\n attestation: \"none\",\n });\n } catch (error) {\n throw new Error(\"Passkey creation aborted\", { cause: error });\n }\n }\n\n private async getPasskeyCredentials(): Promise<PasskeyGetResult | null> {\n const challenge = uint8ArrayToBase64Url(\n new Uint8Array(this.crypto.randomBytes(32)),\n );\n\n const passkey = getPasskeyModule();\n\n try {\n const result = await passkey.get({\n challenge,\n rpId: this.rpId,\n timeout: 60000,\n userVerification: \"preferred\",\n });\n\n return result;\n } catch (error) {\n throw new Error(\"Passkey authentication aborted\", { cause: error });\n }\n }\n}\n","/**\n * Utility functions for base64url encoding/decoding used by React Native passkey authentication.\n *\n * The react-native-passkey library uses base64url strings, while the browser WebAuthn API\n * uses raw ArrayBuffers. These utilities handle the conversion between formats.\n */\n\n/**\n * Converts a Uint8Array to a base64url-encoded string.\n * Base64url uses '-' and '_' instead of '+' and '/', and omits padding '='.\n */\nexport function uint8ArrayToBase64Url(bytes: Uint8Array): string {\n // Convert to regular base64 first\n let binary = \"\";\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]!);\n }\n const base64 = btoa(binary);\n\n // Convert to base64url: replace + with -, / with _, remove =\n return base64.replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n}\n\n/**\n * Converts a base64url-encoded string to a Uint8Array.\n */\nexport function base64UrlToUint8Array(base64url: string): Uint8Array {\n // Convert base64url to regular base64\n let base64 = base64url.replace(/-/g, \"+\").replace(/_/g, \"/\");\n\n // Add padding if needed\n const padding = base64.length % 4;\n if (padding > 0) {\n base64 += \"=\".repeat(4 - padding);\n }\n\n // Decode base64 to binary string\n const binary = atob(base64);\n\n // Convert binary string to Uint8Array\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n\n return bytes;\n}\n","import {\n useAuthSecretStorage,\n useIsAuthenticated,\n useJazzContext,\n} from \"jazz-tools/react-core\";\nimport { useMemo } from \"react\";\nimport { ReactNativePasskeyAuth } from \"./PasskeyAuth.js\";\n\n/**\n * React hook for passkey (WebAuthn) authentication in React Native apps.\n *\n * This hook provides a simple interface for signing up and logging in with passkeys,\n * using the device's biometric authentication (FaceID/TouchID/fingerprint).\n *\n * **Requirements:**\n * - Install `react-native-passkey` as a peer dependency\n * - Configure your app's associated domains (iOS) and asset links (Android)\n * - Passkeys require HTTPS domain verification\n *\n * @example\n * ```tsx\n * import { usePasskeyAuth } from \"jazz-tools/react-native-core\";\n *\n * function AuthScreen() {\n * const auth = usePasskeyAuth({\n * appName: \"My App\",\n * rpId: \"myapp.com\",\n * });\n *\n * if (auth.state === \"signedIn\") {\n * return <MainApp />;\n * }\n *\n * return (\n * <View>\n * <Button title=\"Sign Up\" onPress={() => auth.signUp(\"John Doe\")} />\n * <Button title=\"Log In\" onPress={auth.logIn} />\n * </View>\n * );\n * }\n * ```\n *\n * @param options.appName - The display name of your app shown during passkey prompts\n * @param options.rpId - The relying party ID (your app's domain, e.g., \"myapp.com\")\n *\n * @category Auth Providers\n */\nexport function usePasskeyAuth({\n appName,\n rpId,\n}: {\n appName: string;\n rpId: string;\n}) {\n const context = useJazzContext();\n const authSecretStorage = useAuthSecretStorage();\n\n if (\"guest\" in context) {\n throw new Error(\"Passkey auth is not supported in guest mode\");\n }\n\n const authMethod = useMemo(() => {\n return new ReactNativePasskeyAuth(\n context.node.crypto,\n context.authenticate,\n authSecretStorage,\n appName,\n rpId,\n );\n }, [\n appName,\n rpId,\n authSecretStorage,\n context.node.crypto,\n context.authenticate,\n ]);\n\n const isAuthenticated = useIsAuthenticated();\n\n return {\n state: isAuthenticated ? \"signedIn\" : \"anonymous\",\n logIn: authMethod.logIn,\n signUp: authMethod.signUp,\n } as const;\n}\n","import React, { useState } from \"react\";\nimport {\n StyleSheet,\n Text,\n TextInput,\n TouchableOpacity,\n View,\n useColorScheme,\n} from \"react-native\";\nimport { usePasskeyAuth } from \"./usePasskeyAuth.js\";\n\n/**\n * A basic UI component for passkey authentication in React Native apps.\n *\n * This component provides a simple sign-up and log-in interface using passkeys.\n * It's designed for quick prototyping and can be customized or replaced with\n * your own authentication UI.\n *\n * @example\n * ```tsx\n * import { PasskeyAuthBasicUI } from \"jazz-tools/react-native-core\";\n *\n * function App() {\n * return (\n * <JazzProvider ...>\n * <PasskeyAuthBasicUI\n * appName=\"My App\"\n * rpId=\"myapp.com\"\n * >\n * <MainApp />\n * </PasskeyAuthBasicUI>\n * </JazzProvider>\n * );\n * }\n * ```\n *\n * @category Auth Providers\n */\nexport const PasskeyAuthBasicUI = ({\n appName,\n rpId,\n children,\n}: {\n appName: string;\n rpId: string;\n children: React.ReactNode;\n}) => {\n const colorScheme = useColorScheme();\n const darkMode = colorScheme === \"dark\";\n const [username, setUsername] = useState<string>(\"\");\n const [errorMessage, setErrorMessage] = useState<string | null>(null);\n\n const auth = usePasskeyAuth({ appName, rpId });\n\n const handleSignUp = () => {\n setErrorMessage(null);\n\n auth.signUp(username).catch((error) => {\n if (error.cause instanceof Error) {\n setErrorMessage(error.cause.message);\n } else {\n setErrorMessage(error.message);\n }\n });\n };\n\n const handleLogIn = () => {\n setErrorMessage(null);\n\n auth.logIn().catch((error) => {\n if (error.cause instanceof Error) {\n setErrorMessage(error.cause.message);\n } else {\n setErrorMessage(error.message);\n }\n });\n };\n\n if (auth.state === \"signedIn\") {\n return children;\n }\n\n return (\n <View\n style={[\n styles.container,\n darkMode ? styles.darkBackground : styles.lightBackground,\n ]}\n >\n <View style={styles.formContainer}>\n <Text\n style={[\n styles.headerText,\n darkMode ? styles.darkText : styles.lightText,\n ]}\n >\n {appName}\n </Text>\n\n {errorMessage && <Text style={styles.errorText}>{errorMessage}</Text>}\n\n <TextInput\n placeholder=\"Display name\"\n value={username}\n onChangeText={setUsername}\n placeholderTextColor={darkMode ? \"#999\" : \"#666\"}\n style={[\n styles.textInput,\n darkMode ? styles.darkInput : styles.lightInput,\n ]}\n autoCapitalize=\"words\"\n autoCorrect={false}\n />\n\n <TouchableOpacity\n onPress={handleSignUp}\n style={[\n styles.button,\n darkMode ? styles.darkButton : styles.lightButton,\n ]}\n >\n <Text\n style={darkMode ? styles.darkButtonText : styles.lightButtonText}\n >\n Sign Up with Passkey\n </Text>\n </TouchableOpacity>\n\n <View style={styles.divider}>\n <View\n style={[\n styles.dividerLine,\n darkMode ? styles.darkDivider : styles.lightDivider,\n ]}\n />\n <Text\n style={[\n styles.dividerText,\n darkMode ? styles.darkText : styles.lightText,\n ]}\n >\n or\n </Text>\n <View\n style={[\n styles.dividerLine,\n darkMode ? styles.darkDivider : styles.lightDivider,\n ]}\n />\n </View>\n\n <TouchableOpacity\n onPress={handleLogIn}\n style={[\n styles.secondaryButton,\n darkMode ? styles.darkSecondaryButton : styles.lightSecondaryButton,\n ]}\n >\n <Text style={darkMode ? styles.darkText : styles.lightText}>\n Log In with Existing Passkey\n </Text>\n </TouchableOpacity>\n </View>\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n justifyContent: \"center\",\n alignItems: \"center\",\n padding: 20,\n },\n formContainer: {\n width: \"80%\",\n maxWidth: 300,\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n headerText: {\n fontSize: 24,\n fontWeight: \"600\",\n marginBottom: 30,\n },\n errorText: {\n color: \"#ff4444\",\n marginVertical: 10,\n textAlign: \"center\",\n fontSize: 14,\n },\n textInput: {\n borderWidth: 1,\n padding: 12,\n marginVertical: 10,\n width: \"100%\",\n borderRadius: 8,\n fontSize: 16,\n },\n darkInput: {\n borderColor: \"#444\",\n backgroundColor: \"#1a1a1a\",\n color: \"#fff\",\n },\n lightInput: {\n borderColor: \"#ddd\",\n backgroundColor: \"#fff\",\n color: \"#000\",\n },\n button: {\n paddingVertical: 14,\n paddingHorizontal: 10,\n borderRadius: 8,\n width: \"100%\",\n marginVertical: 10,\n },\n darkButton: {\n backgroundColor: \"#0066cc\",\n },\n lightButton: {\n backgroundColor: \"#007aff\",\n },\n darkButtonText: {\n color: \"#fff\",\n textAlign: \"center\",\n fontWeight: \"600\",\n fontSize: 16,\n },\n lightButtonText: {\n color: \"#fff\",\n textAlign: \"center\",\n fontWeight: \"600\",\n fontSize: 16,\n },\n divider: {\n flexDirection: \"row\",\n alignItems: \"center\",\n width: \"100%\",\n marginVertical: 20,\n },\n dividerLine: {\n flex: 1,\n height: 1,\n },\n darkDivider: {\n backgroundColor: \"#444\",\n },\n lightDivider: {\n backgroundColor: \"#ddd\",\n },\n dividerText: {\n marginHorizontal: 10,\n fontSize: 14,\n },\n secondaryButton: {\n paddingVertical: 14,\n paddingHorizontal: 10,\n borderRadius: 8,\n width: \"100%\",\n borderWidth: 1,\n },\n darkSecondaryButton: {\n borderColor: \"#444\",\n backgroundColor: \"transparent\",\n },\n lightSecondaryButton: {\n borderColor: \"#ddd\",\n backgroundColor: \"transparent\",\n },\n darkText: {\n color: \"#fff\",\n textAlign: \"center\",\n },\n lightText: {\n color: \"#000\",\n textAlign: \"center\",\n },\n darkBackground: {\n backgroundColor: \"#000\",\n },\n lightBackground: {\n backgroundColor: \"#fff\",\n },\n});\n","import { KvStoreContext } from \"../storage/kv-store-context.js\";\n\nexport * from \"./DemoAuthUI.js\";\nexport * from \"./PasskeyAuth.js\";\nexport * from \"./usePasskeyAuth.js\";\nexport * from \"./PasskeyAuthBasicUI.js\";\n\nexport function clearUserCredentials() {\n const kvStore = KvStoreContext.getInstance().getStorage();\n\n // TODO: Migrate the Auth methods to use the same storage key/interface\n return Promise.all([\n kvStore.delete(\"demo-auth-logged-in-secret\"),\n kvStore.delete(\"jazz-clerk-auth\"),\n kvStore.delete(\"jazz-logged-in-secret\"),\n ]);\n}\n","import { useEffect } from \"react\";\n\nimport { CoValueClassOrSchema, parseInviteLink } from \"jazz-tools\";\nimport { useJazzContext } from \"jazz-tools/react-core\";\nimport { Linking } from \"react-native\";\n\nexport {\n useCoState,\n useCoStates,\n experimental_useInboxSender,\n useDemoAuth,\n usePassphraseAuth,\n useJazzContext,\n useAuthSecretStorage,\n useIsAuthenticated,\n useAccount,\n useAgent,\n useLogOut,\n useSyncConnectionStatus,\n useCoValueSubscription,\n useAccountSubscription,\n useSubscriptionSelector,\n useSuspenseCoState,\n useSuspenseCoStates,\n useSuspenseAccount,\n} from \"jazz-tools/react-core\";\n\nexport function useAcceptInviteNative<S extends CoValueClassOrSchema>({\n invitedObjectSchema,\n onAccept,\n forValueHint,\n}: {\n invitedObjectSchema: S;\n onAccept: (projectID: string) => void;\n forValueHint?: string;\n}): void {\n const context = useJazzContext();\n\n if (!(\"me\" in context)) {\n throw new Error(\n \"useAcceptInviteNative can't be used in a JazzProvider with auth === 'guest'.\",\n );\n }\n\n useEffect(() => {\n const handleDeepLink = ({ url }: { url: string }) => {\n const result = parseInviteLink(url);\n if (result && result.valueHint === forValueHint) {\n context.me\n .acceptInvite(\n result.valueID,\n result.inviteSecret,\n invitedObjectSchema,\n )\n .then(() => {\n onAccept(result.valueID);\n })\n .catch((e) => {\n console.error(\"Failed to accept invite\", e);\n });\n }\n };\n\n const linkingListener = Linking.addEventListener(\"url\", handleDeepLink);\n\n void Linking.getInitialURL().then((url) => {\n if (url) handleDeepLink({ url });\n });\n\n return () => {\n linkingListener.remove();\n };\n }, [context, onAccept, invitedObjectSchema, forValueHint]);\n}\n","import {\n Account,\n AccountClass,\n AnyAccountSchema,\n CoValueFromRaw,\n InstanceOfSchema,\n JazzContextType,\n KvStore,\n} from \"jazz-tools\";\nimport { JazzContext, JazzContextManagerContext } from \"jazz-tools/react-core\";\nimport React, { useEffect, useRef } from \"react\";\nimport type { JazzContextManagerProps } from \"./ReactNativeContextManager.js\";\nimport { ReactNativeContextManager } from \"./ReactNativeContextManager.js\";\nimport { setupKvStore } from \"./platform.js\";\n\nexport type JazzProviderProps<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n> = {\n children: React.ReactNode;\n kvStore?: KvStore;\n authSecretStorageKey?: string;\n} & JazzContextManagerProps<S>;\n\n/** @category Context & Hooks */\nexport function JazzProviderCore<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n>({\n children,\n guestMode,\n sync,\n storage,\n AccountSchema,\n defaultProfileName,\n onLogOut,\n logOutReplacement,\n onAnonymousAccountDiscarded,\n kvStore,\n CryptoProvider,\n authSecretStorageKey,\n}: JazzProviderProps<S>) {\n setupKvStore(kvStore);\n\n const [contextManager] = React.useState(\n () => new ReactNativeContextManager<S>({ authSecretStorageKey }),\n );\n\n const onLogOutRefCallback = useRefCallback(onLogOut);\n const logOutReplacementRefCallback = useRefCallback(logOutReplacement);\n const onAnonymousAccountDiscardedRefCallback = useRefCallback(\n onAnonymousAccountDiscarded,\n );\n const logoutReplacementActiveRef = useRef(false);\n logoutReplacementActiveRef.current = Boolean(logOutReplacement);\n const onAnonymousAccountDiscardedEnabled = Boolean(\n onAnonymousAccountDiscarded,\n );\n\n const value = React.useSyncExternalStore<\n JazzContextType<InstanceOfSchema<S>> | undefined\n >(\n React.useCallback(\n (callback) => {\n const props = {\n AccountSchema,\n guestMode,\n sync,\n storage,\n defaultProfileName,\n onLogOut: onLogOutRefCallback,\n logOutReplacement: logoutReplacementActiveRef.current\n ? logOutReplacementRefCallback\n : undefined,\n onAnonymousAccountDiscarded: onAnonymousAccountDiscardedEnabled\n ? onAnonymousAccountDiscardedRefCallback\n : undefined,\n CryptoProvider,\n } satisfies JazzContextManagerProps<S>;\n\n if (contextManager.propsChanged(props)) {\n contextManager.createContext(props).catch((error) => {\n console.log(error.stack);\n console.error(\"Error creating Jazz React Native context:\", error);\n });\n }\n\n return contextManager.subscribe(callback);\n },\n [sync, guestMode].concat(storage as any),\n ),\n () => contextManager.getCurrentValue(),\n () => contextManager.getCurrentValue(),\n );\n\n useEffect(() => {\n // In development mode we don't return a cleanup function because otherwise\n // the double effect execution would mark the context as done immediately.\n if (process.env.NODE_ENV === \"development\") return;\n\n return () => {\n contextManager.done();\n };\n }, []);\n\n return (\n <JazzContext.Provider value={value}>\n <JazzContextManagerContext.Provider value={contextManager}>\n {value && children}\n </JazzContextManagerContext.Provider>\n </JazzContext.Provider>\n );\n}\n\nfunction useRefCallback<T extends (...args: any[]) => any>(callback?: T) {\n const callbackRef = React.useRef(callback);\n callbackRef.current = callback;\n return useRef(\n (...args: Parameters<T>): ReturnType<T> => callbackRef.current?.(...args),\n ).current;\n}\n","import {\n Account,\n AccountClass,\n CoValueFromRaw,\n JazzContextManager,\n KvStore,\n SyncConfig,\n} from \"jazz-tools\";\nimport type {\n AnyAccountSchema,\n InstanceOfSchema,\n JazzContextManagerAuthProps,\n} from \"jazz-tools\";\nimport {\n BaseReactNativeContextOptions,\n createJazzReactNativeContext,\n createJazzReactNativeGuestContext,\n} from \"./platform.js\";\nimport { KvStoreContext } from \"./storage/kv-store-context.js\";\n\nexport type JazzContextManagerProps<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n> = {\n guestMode?: boolean;\n sync: SyncConfig;\n onLogOut?: () => void;\n logOutReplacement?: () => void;\n storage?: BaseReactNativeContextOptions[\"storage\"];\n AccountSchema?: S;\n defaultProfileName?: string;\n onAnonymousAccountDiscarded?: (\n anonymousAccount: InstanceOfSchema<S>,\n ) => Promise<void>;\n CryptoProvider?: BaseReactNativeContextOptions[\"CryptoProvider\"];\n};\n\nexport class ReactNativeContextManager<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n> extends JazzContextManager<InstanceOfSchema<S>, JazzContextManagerProps<S>> {\n async getNewContext(\n props: JazzContextManagerProps<S>,\n authProps?: JazzContextManagerAuthProps,\n ) {\n if (props.guestMode) {\n return createJazzReactNativeGuestContext({\n sync: props.sync,\n storage: props.storage,\n authSecretStorage: this.authSecretStorage,\n CryptoProvider: props.CryptoProvider,\n });\n } else {\n return createJazzReactNativeContext<S>({\n sync: props.sync,\n storage: props.storage,\n AccountSchema: props.AccountSchema,\n credentials: authProps?.credentials,\n newAccountProps: authProps?.newAccountProps,\n defaultProfileName: props.defaultProfileName,\n authSecretStorage: this.authSecretStorage,\n CryptoProvider: props.CryptoProvider,\n });\n }\n }\n\n getKvStore(): KvStore {\n return KvStoreContext.getInstance().getStorage();\n }\n\n propsChanged(props: JazzContextManagerProps<S>) {\n if (!this.props) {\n return true;\n }\n\n return (\n this.props.sync.when !== props.sync.when ||\n this.props.sync.peer !== props.sync.peer ||\n this.props.guestMode !== props.guestMode\n );\n }\n}\n","import NetInfo from \"@react-native-community/netinfo\";\nimport { LocalNode, Peer, getSqliteStorageAsync } from \"cojson\";\nimport { PureJSCrypto } from \"cojson/dist/crypto/PureJSCrypto\"; // Importing from dist to not rely on the exports field\nimport {\n Account,\n AccountClass,\n AnyAccountSchema,\n AuthCredentials,\n AuthSecretStorage,\n CoValue,\n CoValueFromRaw,\n NewAccountProps,\n SyncConfig,\n createInviteLink as baseCreateInviteLink,\n createAnonymousJazzContext,\n createJazzContext,\n} from \"jazz-tools\";\nimport { KvStore, KvStoreContext } from \"./storage/kv-store-context.js\";\nimport { ReactNativeSessionProvider } from \"./ReactNativeSessionProvider.js\";\n\nimport { SQLiteDatabaseDriverAsync } from \"cojson\";\nimport { WebSocketPeerWithReconnection } from \"cojson-transport-ws\";\nimport type { RNQuickCrypto } from \"jazz-tools/react-native-core/crypto\";\nimport type { RNCrypto } from \"cojson/crypto/RNCrypto\";\n\nexport type BaseReactNativeContextOptions = {\n sync: SyncConfig;\n reconnectionTimeout?: number;\n storage?: SQLiteDatabaseDriverAsync | \"disabled\";\n CryptoProvider?: typeof PureJSCrypto | typeof RNQuickCrypto | typeof RNCrypto;\n authSecretStorage: AuthSecretStorage;\n};\n\nclass ReactNativeWebSocketPeerWithReconnection extends WebSocketPeerWithReconnection {\n onNetworkChange(callback: (connected: boolean) => void): () => void {\n return NetInfo.addEventListener((state) =>\n callback(state.isConnected ?? false),\n );\n }\n}\n\nasync function setupPeers(options: BaseReactNativeContextOptions) {\n const CryptoProvider = options.CryptoProvider || PureJSCrypto;\n const crypto = await CryptoProvider.create();\n let node: LocalNode | undefined = undefined;\n\n const peers: Peer[] = [];\n\n const storage =\n options.storage && options.storage !== \"disabled\"\n ? await getSqliteStorageAsync(options.storage)\n : undefined;\n\n if (options.sync.when === \"never\") {\n return {\n toggleNetwork: () => {},\n addConnectionListener: () => () => {},\n connected: () => false,\n peers,\n syncWhen: options.sync.when,\n setNode: () => {},\n crypto,\n storage,\n };\n }\n\n const wsPeer = new ReactNativeWebSocketPeerWithReconnection({\n peer: options.sync.peer,\n reconnectionTimeout: options.reconnectionTimeout,\n addPeer: (peer) => {\n if (node) {\n node.syncManager.addPeer(peer);\n } else {\n peers.push(peer);\n }\n },\n removePeer: (peer) => {\n peers.splice(peers.indexOf(peer), 1);\n },\n });\n\n function toggleNetwork(enabled: boolean) {\n if (enabled) {\n wsPeer.enable();\n } else {\n wsPeer.disable();\n }\n }\n\n function setNode(value: LocalNode) {\n node = value;\n }\n\n if (options.sync.when === \"always\" || !options.sync.when) {\n toggleNetwork(true);\n }\n\n return {\n toggleNetwork,\n addConnectionListener(listener: (connected: boolean) => void) {\n wsPeer.subscribe(listener);\n\n return () => {\n wsPeer.unsubscribe(listener);\n };\n },\n connected: () => wsPeer.connected,\n peers,\n syncWhen: options.sync.when,\n setNode,\n crypto,\n storage,\n };\n}\n\nexport async function createJazzReactNativeGuestContext(\n options: BaseReactNativeContextOptions,\n) {\n const {\n toggleNetwork,\n peers,\n syncWhen,\n setNode,\n crypto,\n storage,\n addConnectionListener,\n connected,\n } = await setupPeers(options);\n\n const context = createAnonymousJazzContext({\n crypto,\n peers,\n syncWhen,\n storage,\n });\n\n setNode(context.agent.node);\n\n options.authSecretStorage.emitUpdate(null);\n\n return {\n guest: context.agent,\n node: context.agent.node,\n done: () => {\n // TODO: Sync all the covalues before closing the connection & context\n toggleNetwork(false);\n context.done();\n },\n logOut: () => {\n return context.logOut();\n },\n addConnectionListener,\n connected,\n };\n}\n\nexport type ReactNativeContextOptions<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n> = {\n credentials?: AuthCredentials;\n AccountSchema?: S;\n newAccountProps?: NewAccountProps;\n defaultProfileName?: string;\n} & BaseReactNativeContextOptions;\n\nexport async function createJazzReactNativeContext<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n>(options: ReactNativeContextOptions<S>) {\n const {\n toggleNetwork,\n peers,\n syncWhen,\n setNode,\n crypto,\n storage,\n addConnectionListener,\n connected,\n } = await setupPeers(options);\n\n let unsubscribeAuthUpdate = () => {};\n\n if (options.sync.when === \"signedUp\") {\n const authSecretStorage = options.authSecretStorage;\n const credentials = options.credentials ?? (await authSecretStorage.get());\n\n // To update the internal state with the current credentials\n authSecretStorage.emitUpdate(credentials);\n\n function handleAuthUpdate(isAuthenticated: boolean) {\n if (isAuthenticated) {\n toggleNetwork(true);\n } else {\n toggleNetwork(false);\n }\n }\n\n unsubscribeAuthUpdate = authSecretStorage.onUpdate(handleAuthUpdate);\n handleAuthUpdate(authSecretStorage.isAuthenticated);\n }\n\n const sessionProvider = new ReactNativeSessionProvider();\n\n const context = await createJazzContext({\n credentials: options.credentials,\n newAccountProps: options.newAccountProps,\n peers,\n syncWhen,\n crypto,\n defaultProfileName: options.defaultProfileName,\n AccountSchema: options.AccountSchema,\n sessionProvider,\n authSecretStorage: options.authSecretStorage,\n storage,\n });\n\n setNode(context.node);\n\n return {\n me: context.account,\n node: context.node,\n authSecretStorage: context.authSecretStorage,\n done: () => {\n // TODO: Sync all the covalues before closing the connection & context\n toggleNetwork(false);\n unsubscribeAuthUpdate();\n context.done();\n },\n logOut: () => {\n unsubscribeAuthUpdate();\n return context.logOut();\n },\n addConnectionListener,\n connected,\n };\n}\n\n/** @category Invite Links */\nexport function createInviteLink<C extends CoValue>(\n value: C,\n role: \"reader\" | \"writer\" | \"admin\",\n { baseURL, valueHint }: { baseURL?: string; valueHint?: string } = {},\n): string {\n return baseCreateInviteLink(value, role, baseURL ?? \"\", valueHint);\n}\n\nexport function setupKvStore(\n kvStore: KvStore | undefined,\n): KvStore | undefined {\n if (!kvStore) {\n return undefined;\n }\n KvStoreContext.getInstance().initialize(kvStore);\n return kvStore;\n}\n","import {\n CryptoProvider,\n KvStoreContext,\n SessionID,\n SessionProvider,\n} from \"jazz-tools\";\nimport { AgentID, RawAccountID } from \"cojson\";\n\nconst lockedSessions = new Set<SessionID>();\n\nexport class ReactNativeSessionProvider implements SessionProvider {\n async acquireSession(\n accountID: string,\n crypto: CryptoProvider,\n ): Promise<{ sessionID: SessionID; sessionDone: () => void }> {\n const kvStore = KvStoreContext.getInstance().getStorage();\n const existingSession = await kvStore.get(accountID as string);\n\n if (!existingSession) {\n const newSessionID = crypto.newRandomSessionID(\n accountID as RawAccountID | AgentID,\n );\n await kvStore.set(accountID, newSessionID);\n lockedSessions.add(newSessionID);\n\n console.log(\"Created new session\", newSessionID);\n\n return Promise.resolve({\n sessionID: newSessionID,\n sessionDone: () => {\n lockedSessions.delete(newSessionID);\n },\n });\n }\n\n // Check if the session is already in use, should happen only if the dev\n // mounts multiple providers at the same time\n if (lockedSessions.has(existingSession as SessionID)) {\n const newSessionID = crypto.newRandomSessionID(\n accountID as RawAccountID | AgentID,\n );\n\n console.error(\"Existing session in use, creating new one\", newSessionID);\n\n return Promise.resolve({\n sessionID: newSessionID,\n sessionDone: () => {},\n });\n }\n\n console.log(\"Using existing session\", existingSession);\n lockedSessions.add(existingSession as SessionID);\n\n return Promise.resolve({\n sessionID: existingSession as SessionID,\n sessionDone: () => {\n lockedSessions.delete(existingSession as SessionID);\n },\n });\n }\n\n async persistSession(\n accountID: string,\n sessionID: SessionID,\n ): Promise<{ sessionDone: () => void }> {\n const kvStore = KvStoreContext.getInstance().getStorage();\n await kvStore.set(accountID, sessionID);\n lockedSessions.add(sessionID);\n\n console.log(\"Persisted session\", sessionID);\n\n return Promise.resolve({\n sessionDone: () => {\n lockedSessions.delete(sessionID);\n },\n });\n }\n}\n","import { FileStream, ImageDefinition } from \"jazz-tools\";\nimport { highestResAvailable } from \"jazz-tools/media\";\nimport { forwardRef, useEffect, useMemo, useState } from \"react\";\nimport { Image as RNImage, ImageProps as RNImageProps } from \"react-native\";\nimport { useCoState } from \"../hooks.js\";\n\nexport type ImageProps = Omit<RNImageProps, \"width\" | \"height\" | \"source\"> & {\n /** The ID of the ImageDefinition to display */\n imageId: string;\n /**\n * Width of the image. Can be a number or \"original\" to use the original image width.\n * When set to \"original\", the component will calculate the appropriate height to maintain aspect ratio.\n *\n * @example\n * ```tsx\n * // Fixed width, auto-calculated height\n * <Image imageId=\"123\" width={600} />\n *\n * // Original width\n * <Image imageId=\"123\" width=\"original\" />\n * ```\n */\n width?: number | \"original\";\n /**\n * Height of the image. Can be a number or \"original\" to use the original image height.\n * When set to \"original\", the component will calculate the appropriate width to maintain aspect ratio.\n *\n * @example\n * ```tsx\n * // Fixed height, auto-calculated width\n * <Image imageId=\"123\" height={400} />\n *\n * // Original height\n * <Image imageId=\"123\" height=\"original\" />\n * ```\n */\n height?: number | \"original\";\n /**\n * A custom placeholder to display while an image is loading. This will\n * be passed as the src of the img tag, so a data URL works well here.\n * This will be used as a fallback if no images are ready and no placeholder\n * is available otherwise.\n */\n placeholder?: string;\n};\n\n/**\n * A React Native Image component that integrates with Jazz's ImageDefinition system.\n *\n * @example\n * ```tsx\n * import { Image } from \"jazz-tools/react-native\";\n * import { StyleSheet } from \"react-native\";\n *\n * function ProfilePicture({ imageId }) {\n * return (\n * <Image\n * imageId={imageId}\n * style={styles.profilePic}\n * width={100}\n * height={100}\n * resizeMode=\"cover\"\n * placeholder=\"/placeholder.png\"\n * />\n * );\n * }\n *\n * const styles = StyleSheet.create({\n * profilePic: {\n * borderRadius: 50,\n * }\n * });\n * ```\n */\nexport const Image = forwardRef<RNImage, ImageProps>(function Image(\n { imageId, width, height, placeholder, ...props },\n ref,\n) {\n const image = useCoState(ImageDefinition, imageId, {\n select: (image) => (image.$isLoaded ? image : null),\n });\n const [src, setSrc] = useState<string | undefined>(\n image?.placeholderDataURL ??\n \"data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==\",\n );\n\n const dimensions: { width: number | undefined; height: number | undefined } =\n useMemo(() => {\n const originalWidth = image?.originalSize?.[0];\n const originalHeight = image?.originalSize?.[1];\n\n // Both width and height are \"original\"\n if (width === \"original\" && height === \"original\") {\n return { width: originalWidth, height: originalHeight };\n }\n\n // Width is \"original\", height is a number\n if (width === \"original\" && typeof height === \"number\") {\n if (originalWidth && originalHeight) {\n return {\n width: Math.round((height * originalWidth) / originalHeight),\n height,\n };\n }\n return { width: undefined, height };\n }\n\n // Height is \"original\", width is a number\n if (height === \"original\" && typeof width === \"number\") {\n if (originalWidth && originalHeight) {\n return {\n width,\n height: Math.round((width * originalHeight) / originalWidth),\n };\n }\n return { width, height: undefined };\n }\n\n // In all other cases, use the property value:\n return {\n width: width === \"original\" ? originalWidth : width,\n height: height === \"original\" ? originalHeight : height,\n };\n }, [image?.originalSize, width, height]);\n\n useEffect(() => {\n if (!image) return;\n\n let lastBestImage: FileStream | string | undefined =\n image?.placeholderDataURL ?? placeholder;\n\n const unsub = image.$jazz.subscribe({}, (update) => {\n if (lastBestImage === undefined && update.placeholderDataURL) {\n setSrc(update.placeholderDataURL);\n lastBestImage = update.placeholderDataURL;\n }\n\n const bestImage = highestResAvailable(\n update,\n dimensions.width || dimensions.height || 9999,\n dimensions.height || dimensions.width || 9999,\n );\n\n if (!bestImage) return;\n\n if (lastBestImage === bestImage.image) return;\n\n const url = bestImage.image.asBase64({ dataURL: true });\n\n if (url) {\n setSrc(url);\n lastBestImage = bestImage.image;\n }\n });\n\n return unsub;\n }, [image]);\n\n if (!src) {\n return null;\n }\n\n return (\n <RNImage\n ref={ref}\n source={{ uri: src }}\n width={dimensions.width}\n height={dimensions.height}\n {...props}\n />\n );\n});\n","export * from \"./auth/auth.js\";\nexport * from \"./hooks.js\";\nexport * from \"./provider.js\";\nexport * from \"./storage/kv-store-context.js\";\nexport * from \"./media/image.js\";\n\nexport {\n createCoValueSubscriptionContext,\n createAccountSubscriptionContext,\n type CoValueSubscription,\n} from \"jazz-tools/react-core\";\n\nexport { SQLiteDatabaseDriverAsync } from \"cojson\";\n\nexport { parseInviteLink } from \"jazz-tools\";\n\nexport { createInviteLink, setupKvStore } from \"./platform.js\";\nexport {\n ReactNativeContextManager,\n type JazzContextManagerProps,\n} from \"./ReactNativeContextManager.js\";\n"],"mappings":"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","names":["username","useState","StyleSheet","Text","TextInput","TouchableOpacity","View","useColorScheme","jsx","jsxs","useColorScheme","useState","View","styles","Text","TextInput","TouchableOpacity","StyleSheet","useJazzContext","useAuthSecretStorage","useIsAuthenticated","React","useEffect","KvStoreContext","CryptoProvider","handleAuthUpdate","jsx","CryptoProvider","React","useEffect","useEffect","useMemo","useState","jsx","Image","image","useState","useMemo","useEffect","parseInviteLink"]}
1
+ {"version":3,"sources":["../../src/react-native-core/storage/kv-store-context.ts","../../src/react-native-core/auth/DemoAuthUI.tsx","../../src/react-native-core/auth/PasskeyAuth.ts","../../src/react-native-core/auth/passkey-utils.ts","../../src/react-native-core/auth/usePasskeyAuth.tsx","../../src/react-native-core/auth/PasskeyAuthBasicUI.tsx","../../src/react-native-core/auth/auth.ts","../../src/react-native-core/hooks.tsx","../../src/react-native-core/provider.tsx","../../src/react-native-core/ReactNativeContextManager.ts","../../src/react-native-core/platform.ts","../../src/react-native-core/ReactNativeSessionProvider.ts","../../src/react-native-core/media/image.tsx","../../src/react-native-core/index.ts"],"sourcesContent":["export interface KvStore {\n get(key: string): Promise<string | null>;\n set(key: string, value: string): Promise<void>;\n delete(key: string): Promise<void>;\n clearAll(): Promise<void>;\n}\n\nexport class KvStoreContext {\n private static instance: KvStoreContext;\n private storageInstance: KvStore | null = null;\n\n private constructor() {}\n\n public static getInstance(): KvStoreContext {\n if (!KvStoreContext.instance) {\n KvStoreContext.instance = new KvStoreContext();\n }\n return KvStoreContext.instance;\n }\n\n public isInitialized(): boolean {\n return this.storageInstance !== null;\n }\n\n public initialize(store: KvStore): void {\n if (!this.storageInstance) {\n this.storageInstance = store;\n }\n }\n\n public getStorage(): KvStore {\n if (!this.storageInstance) {\n throw new Error(\"Storage instance is not initialized.\");\n }\n return this.storageInstance;\n }\n}\n\nexport default KvStoreContext;\n","import { useDemoAuth } from \"jazz-tools/react-core\";\nimport React, { useState } from \"react\";\nimport {\n StyleSheet,\n Text,\n TextInput,\n TouchableOpacity,\n View,\n useColorScheme,\n} from \"react-native\";\n\nexport const DemoAuthBasicUI = ({\n appName,\n auth,\n children,\n}: {\n appName: string;\n auth: ReturnType<typeof useDemoAuth>;\n children: React.ReactNode;\n}) => {\n const colorScheme = useColorScheme();\n const darkMode = colorScheme === \"dark\";\n const [username, setUsername] = useState<string>(\"\");\n const [errorMessage, setErrorMessage] = useState<string | null>(null);\n\n const handleSignUp = () => {\n setErrorMessage(null);\n\n auth.signUp(username).catch((error) => {\n setErrorMessage(error.message);\n });\n };\n\n const handleLogIn = (username: string) => {\n setErrorMessage(null);\n\n auth.logIn(username).catch((error) => {\n setErrorMessage(error.message);\n });\n };\n\n if (auth.state === \"signedIn\") {\n return children;\n }\n\n return (\n <View\n style={[\n styles.container,\n darkMode ? styles.darkBackground : styles.lightBackground,\n ]}\n >\n <View style={styles.formContainer}>\n <Text\n style={[\n styles.headerText,\n darkMode ? styles.darkText : styles.lightText,\n ]}\n >\n {appName}\n </Text>\n\n {errorMessage && <Text style={styles.errorText}>{errorMessage}</Text>}\n\n <TextInput\n placeholder=\"Display name\"\n value={username}\n onChangeText={setUsername}\n placeholderTextColor={darkMode ? \"#fff\" : \"#000\"}\n style={[\n styles.textInput,\n darkMode ? styles.darkInput : styles.lightInput,\n ]}\n />\n\n <TouchableOpacity\n onPress={handleSignUp}\n style={[\n styles.button,\n darkMode ? styles.darkButton : styles.lightButton,\n ]}\n >\n <Text\n style={darkMode ? styles.darkButtonText : styles.lightButtonText}\n >\n Sign Up as new account\n </Text>\n </TouchableOpacity>\n\n <View style={styles.existingUsersContainer}>\n {auth.existingUsers.map((user) => (\n <TouchableOpacity\n key={user}\n onPress={() => handleLogIn(user)}\n style={[\n styles.existingUserButton,\n darkMode ? styles.darkUserButton : styles.lightUserButton,\n ]}\n >\n <Text style={darkMode ? styles.darkText : styles.lightText}>\n Log In as \"{user}\"\n </Text>\n </TouchableOpacity>\n ))}\n </View>\n </View>\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n justifyContent: \"center\",\n alignItems: \"center\",\n padding: 20,\n },\n formContainer: {\n width: \"80%\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n headerText: {\n fontSize: 24,\n marginBottom: 20,\n },\n errorText: {\n color: \"red\",\n marginVertical: 5,\n textAlign: \"center\",\n },\n textInput: {\n borderWidth: 1,\n padding: 10,\n marginVertical: 10,\n width: \"100%\",\n borderRadius: 6,\n },\n darkInput: {\n borderColor: \"#444\",\n backgroundColor: \"#000\",\n color: \"#fff\",\n },\n lightInput: {\n borderColor: \"#ddd\",\n backgroundColor: \"#fff\",\n color: \"#000\",\n },\n button: {\n paddingVertical: 15,\n paddingHorizontal: 10,\n borderRadius: 6,\n width: \"100%\",\n marginVertical: 10,\n },\n darkButton: {\n backgroundColor: \"#444\",\n },\n lightButton: {\n backgroundColor: \"#ddd\",\n },\n darkButtonText: {\n color: \"#fff\",\n textAlign: \"center\",\n },\n lightButtonText: {\n color: \"#000\",\n textAlign: \"center\",\n },\n existingUsersContainer: {\n width: \"100%\",\n marginTop: 20,\n },\n existingUserButton: {\n paddingVertical: 15,\n paddingHorizontal: 10,\n borderRadius: 6,\n marginVertical: 5,\n },\n darkUserButton: {\n backgroundColor: \"#222\",\n },\n lightUserButton: {\n backgroundColor: \"#eee\",\n },\n loadingText: {\n fontSize: 18,\n color: \"#888\",\n },\n darkText: {\n color: \"#fff\",\n },\n lightText: {\n color: \"#000\",\n },\n darkBackground: {\n backgroundColor: \"#000\",\n },\n lightBackground: {\n backgroundColor: \"#fff\",\n },\n});\n","import { CryptoProvider, RawAccountID, cojsonInternals } from \"cojson\";\nimport {\n Account,\n AuthSecretStorage,\n AuthenticateAccountFunction,\n ID,\n} from \"jazz-tools\";\nimport {\n base64UrlToUint8Array,\n uint8ArrayToBase64Url,\n} from \"./passkey-utils.js\";\n\n// Types for react-native-passkey library\n// We define these here to avoid requiring the library as a direct dependency\ninterface PasskeyCreateRequest {\n challenge: string;\n rp: {\n id: string;\n name: string;\n };\n user: {\n id: string;\n name: string;\n displayName: string;\n };\n pubKeyCredParams: Array<{ alg: number; type: \"public-key\" }>;\n authenticatorSelection?: {\n authenticatorAttachment?: \"platform\" | \"cross-platform\";\n requireResidentKey?: boolean;\n residentKey?: \"discouraged\" | \"preferred\" | \"required\";\n userVerification?: \"discouraged\" | \"preferred\" | \"required\";\n };\n timeout?: number;\n attestation?: \"none\" | \"indirect\" | \"direct\" | \"enterprise\";\n}\n\ninterface PasskeyGetRequest {\n challenge: string;\n rpId: string;\n allowCredentials?: Array<{\n id: string;\n type: \"public-key\";\n transports?: Array<\"usb\" | \"nfc\" | \"ble\" | \"internal\" | \"hybrid\">;\n }>;\n timeout?: number;\n userVerification?: \"discouraged\" | \"preferred\" | \"required\";\n}\n\ninterface PasskeyGetResult {\n id: string;\n rawId: string;\n type: \"public-key\";\n response: {\n clientDataJSON: string;\n authenticatorData: string;\n signature: string;\n userHandle: string | null;\n };\n}\n\n/**\n * Interface for the react-native-passkey module.\n * @internal\n */\nexport interface PasskeyModule {\n create: (request: PasskeyCreateRequest) => Promise<unknown>;\n get: (request: PasskeyGetRequest) => Promise<PasskeyGetResult | null>;\n isSupported: () => Promise<boolean>;\n}\n\nlet cachedPasskeyModule: PasskeyModule | null = null;\n\n/**\n * Lazily loads the react-native-passkey module.\n * This allows the module to be an optional peer dependency.\n * @internal\n */\nexport function getPasskeyModule(): PasskeyModule {\n if (cachedPasskeyModule) {\n return cachedPasskeyModule;\n }\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const module = require(\"react-native-passkey\");\n const passkeyModule: PasskeyModule =\n module.Passkey || module.default || module;\n cachedPasskeyModule = passkeyModule;\n return passkeyModule;\n } catch (e) {\n console.error(\"Failed to load react-native-passkey:\", e);\n throw new Error(\n \"react-native-passkey is not installed. Please install it to use passkey authentication: npm install react-native-passkey\",\n );\n }\n}\n\n/**\n * Sets a custom passkey module (for testing purposes).\n * @internal\n */\nexport function setPasskeyModule(module: PasskeyModule | null): void {\n cachedPasskeyModule = module;\n}\n\n/**\n * Check if passkeys are supported on the current device.\n * Returns false if the react-native-passkey module is not available or if the device doesn't support passkeys.\n */\nexport async function isPasskeySupported(): Promise<boolean> {\n try {\n const module = getPasskeyModule();\n return await module.isSupported();\n } catch {\n return false;\n }\n}\n\n/**\n * `ReactNativePasskeyAuth` provides passkey (WebAuthn) authentication for React Native apps.\n *\n * This class uses the device's biometric authentication (FaceID/TouchID/fingerprint) to\n * securely store and retrieve Jazz account credentials.\n *\n * **Requirements:**\n * - Install `react-native-passkey` as a peer dependency\n * - Configure your app's associated domains (iOS) and asset links (Android)\n * - Passkeys require HTTPS domain verification\n *\n * ```ts\n * import { ReactNativePasskeyAuth } from \"jazz-tools/react-native-core\";\n *\n * const auth = new ReactNativePasskeyAuth(\n * crypto,\n * authenticate,\n * authSecretStorage,\n * \"My App\",\n * \"myapp.com\"\n * );\n * ```\n *\n * @category Auth Providers\n */\nexport class ReactNativePasskeyAuth {\n constructor(\n protected crypto: CryptoProvider,\n protected authenticate: AuthenticateAccountFunction,\n protected authSecretStorage: AuthSecretStorage,\n public appName: string,\n public rpId: string,\n ) {}\n\n static readonly id = \"passkey\";\n\n /**\n * Log in using an existing passkey.\n * This will prompt the user to authenticate with their device biometrics.\n */\n logIn = async () => {\n const { crypto, authenticate } = this;\n\n const webAuthNCredential = await this.getPasskeyCredentials();\n\n if (!webAuthNCredential) {\n return;\n }\n\n if (!webAuthNCredential.response.userHandle) {\n throw new Error(\"Passkey credential is missing userHandle\");\n }\n\n const webAuthNCredentialPayload = base64UrlToUint8Array(\n webAuthNCredential.response.userHandle,\n );\n\n const accountSecretSeed = webAuthNCredentialPayload.slice(\n 0,\n cojsonInternals.secretSeedLength,\n );\n\n const secret = crypto.agentSecretFromSecretSeed(accountSecretSeed);\n\n const accountID = cojsonInternals.rawCoIDfromBytes(\n webAuthNCredentialPayload.slice(\n cojsonInternals.secretSeedLength,\n cojsonInternals.secretSeedLength + cojsonInternals.shortHashLength,\n ),\n ) as ID<Account>;\n\n await authenticate({\n accountID,\n accountSecret: secret,\n });\n\n await this.authSecretStorage.set({\n accountID,\n secretSeed: accountSecretSeed,\n accountSecret: secret,\n provider: \"passkey\",\n });\n };\n\n /**\n * Register a new passkey for the current account.\n * This will create a passkey that stores the account credentials securely on the device.\n *\n * @param username - The display name for the passkey\n */\n signUp = async (username: string) => {\n const credentials = await this.authSecretStorage.get();\n\n if (!credentials?.secretSeed) {\n throw new Error(\n \"Not enough credentials to register the account with passkey\",\n );\n }\n\n await this.createPasskeyCredentials({\n accountID: credentials.accountID,\n secretSeed: credentials.secretSeed,\n username,\n });\n\n const currentAccount = await Account.getMe().$jazz.ensureLoaded({\n resolve: {\n profile: true,\n },\n });\n\n if (username.trim().length !== 0) {\n currentAccount.profile.$jazz.set(\"name\", username);\n }\n\n await this.authSecretStorage.set({\n accountID: credentials.accountID,\n secretSeed: credentials.secretSeed,\n accountSecret: credentials.accountSecret,\n provider: \"passkey\",\n });\n };\n\n private async createPasskeyCredentials({\n accountID,\n secretSeed,\n username,\n }: {\n accountID: ID<Account>;\n secretSeed: Uint8Array;\n username: string;\n }) {\n const webAuthNCredentialPayload = new Uint8Array(\n cojsonInternals.secretSeedLength + cojsonInternals.shortHashLength,\n );\n\n webAuthNCredentialPayload.set(secretSeed);\n webAuthNCredentialPayload.set(\n cojsonInternals.rawCoIDtoBytes(accountID as unknown as RawAccountID),\n cojsonInternals.secretSeedLength,\n );\n\n const challenge = uint8ArrayToBase64Url(\n new Uint8Array(this.crypto.randomBytes(32)),\n );\n const userId = uint8ArrayToBase64Url(webAuthNCredentialPayload);\n\n const passkey = getPasskeyModule();\n\n try {\n await passkey.create({\n challenge,\n rp: {\n id: this.rpId,\n name: this.appName,\n },\n user: {\n id: userId,\n name: `${username} (${new Date().toLocaleString()})`,\n displayName: username,\n },\n pubKeyCredParams: [\n { alg: -7, type: \"public-key\" }, // ES256\n { alg: -257, type: \"public-key\" }, // RS256\n ],\n authenticatorSelection: {\n residentKey: \"required\",\n userVerification: \"preferred\",\n },\n timeout: 60000,\n attestation: \"none\",\n });\n } catch (error) {\n throw new Error(\"Passkey creation aborted\", { cause: error });\n }\n }\n\n private async getPasskeyCredentials(): Promise<PasskeyGetResult | null> {\n const challenge = uint8ArrayToBase64Url(\n new Uint8Array(this.crypto.randomBytes(32)),\n );\n\n const passkey = getPasskeyModule();\n\n try {\n const result = await passkey.get({\n challenge,\n rpId: this.rpId,\n timeout: 60000,\n userVerification: \"preferred\",\n });\n\n return result;\n } catch (error) {\n throw new Error(\"Passkey authentication aborted\", { cause: error });\n }\n }\n}\n","/**\n * Utility functions for base64url encoding/decoding used by React Native passkey authentication.\n *\n * The react-native-passkey library uses base64url strings, while the browser WebAuthn API\n * uses raw ArrayBuffers. These utilities handle the conversion between formats.\n */\n\n/**\n * Converts a Uint8Array to a base64url-encoded string.\n * Base64url uses '-' and '_' instead of '+' and '/', and omits padding '='.\n */\nexport function uint8ArrayToBase64Url(bytes: Uint8Array): string {\n // Convert to regular base64 first\n let binary = \"\";\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]!);\n }\n const base64 = btoa(binary);\n\n // Convert to base64url: replace + with -, / with _, remove =\n return base64.replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n}\n\n/**\n * Converts a base64url-encoded string to a Uint8Array.\n */\nexport function base64UrlToUint8Array(base64url: string): Uint8Array {\n // Convert base64url to regular base64\n let base64 = base64url.replace(/-/g, \"+\").replace(/_/g, \"/\");\n\n // Add padding if needed\n const padding = base64.length % 4;\n if (padding > 0) {\n base64 += \"=\".repeat(4 - padding);\n }\n\n // Decode base64 to binary string\n const binary = atob(base64);\n\n // Convert binary string to Uint8Array\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n\n return bytes;\n}\n","import {\n useAuthSecretStorage,\n useIsAuthenticated,\n useJazzContextValue,\n} from \"jazz-tools/react-core\";\nimport { useMemo } from \"react\";\nimport { ReactNativePasskeyAuth } from \"./PasskeyAuth.js\";\n\n/**\n * React hook for passkey (WebAuthn) authentication in React Native apps.\n *\n * This hook provides a simple interface for signing up and logging in with passkeys,\n * using the device's biometric authentication (FaceID/TouchID/fingerprint).\n *\n * **Requirements:**\n * - Install `react-native-passkey` as a peer dependency\n * - Configure your app's associated domains (iOS) and asset links (Android)\n * - Passkeys require HTTPS domain verification\n *\n * @example\n * ```tsx\n * import { usePasskeyAuth } from \"jazz-tools/react-native-core\";\n *\n * function AuthScreen() {\n * const auth = usePasskeyAuth({\n * appName: \"My App\",\n * rpId: \"myapp.com\",\n * });\n *\n * if (auth.state === \"signedIn\") {\n * return <MainApp />;\n * }\n *\n * return (\n * <View>\n * <Button title=\"Sign Up\" onPress={() => auth.signUp(\"John Doe\")} />\n * <Button title=\"Log In\" onPress={auth.logIn} />\n * </View>\n * );\n * }\n * ```\n *\n * @param options.appName - The display name of your app shown during passkey prompts\n * @param options.rpId - The relying party ID (your app's domain, e.g., \"myapp.com\")\n *\n * @category Auth Providers\n */\nexport function usePasskeyAuth({\n appName,\n rpId,\n}: {\n appName: string;\n rpId: string;\n}) {\n const context = useJazzContextValue();\n const authSecretStorage = useAuthSecretStorage();\n\n if (\"guest\" in context) {\n throw new Error(\"Passkey auth is not supported in guest mode\");\n }\n\n const authMethod = useMemo(() => {\n return new ReactNativePasskeyAuth(\n context.node.crypto,\n context.authenticate,\n authSecretStorage,\n appName,\n rpId,\n );\n }, [\n appName,\n rpId,\n authSecretStorage,\n context.node.crypto,\n context.authenticate,\n ]);\n\n const isAuthenticated = useIsAuthenticated();\n\n return {\n state: isAuthenticated ? \"signedIn\" : \"anonymous\",\n logIn: authMethod.logIn,\n signUp: authMethod.signUp,\n } as const;\n}\n","import React, { useState } from \"react\";\nimport {\n StyleSheet,\n Text,\n TextInput,\n TouchableOpacity,\n View,\n useColorScheme,\n} from \"react-native\";\nimport { usePasskeyAuth } from \"./usePasskeyAuth.js\";\n\n/**\n * A basic UI component for passkey authentication in React Native apps.\n *\n * This component provides a simple sign-up and log-in interface using passkeys.\n * It's designed for quick prototyping and can be customized or replaced with\n * your own authentication UI.\n *\n * @example\n * ```tsx\n * import { PasskeyAuthBasicUI } from \"jazz-tools/react-native-core\";\n *\n * function App() {\n * return (\n * <JazzProvider ...>\n * <PasskeyAuthBasicUI\n * appName=\"My App\"\n * rpId=\"myapp.com\"\n * >\n * <MainApp />\n * </PasskeyAuthBasicUI>\n * </JazzProvider>\n * );\n * }\n * ```\n *\n * @category Auth Providers\n */\nexport const PasskeyAuthBasicUI = ({\n appName,\n rpId,\n children,\n}: {\n appName: string;\n rpId: string;\n children: React.ReactNode;\n}) => {\n const colorScheme = useColorScheme();\n const darkMode = colorScheme === \"dark\";\n const [username, setUsername] = useState<string>(\"\");\n const [errorMessage, setErrorMessage] = useState<string | null>(null);\n\n const auth = usePasskeyAuth({ appName, rpId });\n\n const handleSignUp = () => {\n setErrorMessage(null);\n\n auth.signUp(username).catch((error) => {\n if (error.cause instanceof Error) {\n setErrorMessage(error.cause.message);\n } else {\n setErrorMessage(error.message);\n }\n });\n };\n\n const handleLogIn = () => {\n setErrorMessage(null);\n\n auth.logIn().catch((error) => {\n if (error.cause instanceof Error) {\n setErrorMessage(error.cause.message);\n } else {\n setErrorMessage(error.message);\n }\n });\n };\n\n if (auth.state === \"signedIn\") {\n return children;\n }\n\n return (\n <View\n style={[\n styles.container,\n darkMode ? styles.darkBackground : styles.lightBackground,\n ]}\n >\n <View style={styles.formContainer}>\n <Text\n style={[\n styles.headerText,\n darkMode ? styles.darkText : styles.lightText,\n ]}\n >\n {appName}\n </Text>\n\n {errorMessage && <Text style={styles.errorText}>{errorMessage}</Text>}\n\n <TextInput\n placeholder=\"Display name\"\n value={username}\n onChangeText={setUsername}\n placeholderTextColor={darkMode ? \"#999\" : \"#666\"}\n style={[\n styles.textInput,\n darkMode ? styles.darkInput : styles.lightInput,\n ]}\n autoCapitalize=\"words\"\n autoCorrect={false}\n />\n\n <TouchableOpacity\n onPress={handleSignUp}\n style={[\n styles.button,\n darkMode ? styles.darkButton : styles.lightButton,\n ]}\n >\n <Text\n style={darkMode ? styles.darkButtonText : styles.lightButtonText}\n >\n Sign Up with Passkey\n </Text>\n </TouchableOpacity>\n\n <View style={styles.divider}>\n <View\n style={[\n styles.dividerLine,\n darkMode ? styles.darkDivider : styles.lightDivider,\n ]}\n />\n <Text\n style={[\n styles.dividerText,\n darkMode ? styles.darkText : styles.lightText,\n ]}\n >\n or\n </Text>\n <View\n style={[\n styles.dividerLine,\n darkMode ? styles.darkDivider : styles.lightDivider,\n ]}\n />\n </View>\n\n <TouchableOpacity\n onPress={handleLogIn}\n style={[\n styles.secondaryButton,\n darkMode ? styles.darkSecondaryButton : styles.lightSecondaryButton,\n ]}\n >\n <Text style={darkMode ? styles.darkText : styles.lightText}>\n Log In with Existing Passkey\n </Text>\n </TouchableOpacity>\n </View>\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n justifyContent: \"center\",\n alignItems: \"center\",\n padding: 20,\n },\n formContainer: {\n width: \"80%\",\n maxWidth: 300,\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n headerText: {\n fontSize: 24,\n fontWeight: \"600\",\n marginBottom: 30,\n },\n errorText: {\n color: \"#ff4444\",\n marginVertical: 10,\n textAlign: \"center\",\n fontSize: 14,\n },\n textInput: {\n borderWidth: 1,\n padding: 12,\n marginVertical: 10,\n width: \"100%\",\n borderRadius: 8,\n fontSize: 16,\n },\n darkInput: {\n borderColor: \"#444\",\n backgroundColor: \"#1a1a1a\",\n color: \"#fff\",\n },\n lightInput: {\n borderColor: \"#ddd\",\n backgroundColor: \"#fff\",\n color: \"#000\",\n },\n button: {\n paddingVertical: 14,\n paddingHorizontal: 10,\n borderRadius: 8,\n width: \"100%\",\n marginVertical: 10,\n },\n darkButton: {\n backgroundColor: \"#0066cc\",\n },\n lightButton: {\n backgroundColor: \"#007aff\",\n },\n darkButtonText: {\n color: \"#fff\",\n textAlign: \"center\",\n fontWeight: \"600\",\n fontSize: 16,\n },\n lightButtonText: {\n color: \"#fff\",\n textAlign: \"center\",\n fontWeight: \"600\",\n fontSize: 16,\n },\n divider: {\n flexDirection: \"row\",\n alignItems: \"center\",\n width: \"100%\",\n marginVertical: 20,\n },\n dividerLine: {\n flex: 1,\n height: 1,\n },\n darkDivider: {\n backgroundColor: \"#444\",\n },\n lightDivider: {\n backgroundColor: \"#ddd\",\n },\n dividerText: {\n marginHorizontal: 10,\n fontSize: 14,\n },\n secondaryButton: {\n paddingVertical: 14,\n paddingHorizontal: 10,\n borderRadius: 8,\n width: \"100%\",\n borderWidth: 1,\n },\n darkSecondaryButton: {\n borderColor: \"#444\",\n backgroundColor: \"transparent\",\n },\n lightSecondaryButton: {\n borderColor: \"#ddd\",\n backgroundColor: \"transparent\",\n },\n darkText: {\n color: \"#fff\",\n textAlign: \"center\",\n },\n lightText: {\n color: \"#000\",\n textAlign: \"center\",\n },\n darkBackground: {\n backgroundColor: \"#000\",\n },\n lightBackground: {\n backgroundColor: \"#fff\",\n },\n});\n","import { KvStoreContext } from \"../storage/kv-store-context.js\";\n\nexport * from \"./DemoAuthUI.js\";\nexport * from \"./PasskeyAuth.js\";\nexport * from \"./usePasskeyAuth.js\";\nexport * from \"./PasskeyAuthBasicUI.js\";\n\nexport function clearUserCredentials() {\n const kvStore = KvStoreContext.getInstance().getStorage();\n\n // TODO: Migrate the Auth methods to use the same storage key/interface\n return Promise.all([\n kvStore.delete(\"demo-auth-logged-in-secret\"),\n kvStore.delete(\"jazz-clerk-auth\"),\n kvStore.delete(\"jazz-logged-in-secret\"),\n ]);\n}\n","import { useEffect } from \"react\";\n\nimport { CoValueClassOrSchema, parseInviteLink } from \"jazz-tools\";\nimport { useJazzContextValue } from \"jazz-tools/react-core\";\nimport { Linking } from \"react-native\";\n\nexport {\n useCoState,\n useCoStates,\n experimental_useInboxSender,\n useDemoAuth,\n usePassphraseAuth,\n useJazzContextValue,\n useAuthSecretStorage,\n useIsAuthenticated,\n useAccount,\n useAgent,\n useLogOut,\n useSyncConnectionStatus,\n useCoValueSubscription,\n useAccountSubscription,\n useSubscriptionSelector,\n useSuspenseCoState,\n useSuspenseCoStates,\n useSuspenseAccount,\n} from \"jazz-tools/react-core\";\n\nexport function useAcceptInviteNative<S extends CoValueClassOrSchema>({\n invitedObjectSchema,\n onAccept,\n forValueHint,\n}: {\n invitedObjectSchema: S;\n onAccept: (projectID: string) => void;\n forValueHint?: string;\n}): void {\n const context = useJazzContextValue();\n\n if (!(\"me\" in context)) {\n throw new Error(\n \"useAcceptInviteNative can't be used in a JazzProvider with auth === 'guest'.\",\n );\n }\n\n useEffect(() => {\n const handleDeepLink = ({ url }: { url: string }) => {\n const result = parseInviteLink(url);\n if (result && result.valueHint === forValueHint) {\n context.me\n .acceptInvite(\n result.valueID,\n result.inviteSecret,\n invitedObjectSchema,\n )\n .then(() => {\n onAccept(result.valueID);\n })\n .catch((e) => {\n console.error(\"Failed to accept invite\", e);\n });\n }\n };\n\n const linkingListener = Linking.addEventListener(\"url\", handleDeepLink);\n\n void Linking.getInitialURL().then((url) => {\n if (url) handleDeepLink({ url });\n });\n\n return () => {\n linkingListener.remove();\n };\n }, [context, onAccept, invitedObjectSchema, forValueHint]);\n}\n","import {\n Account,\n AccountClass,\n AnyAccountSchema,\n CoValueFromRaw,\n KvStore,\n} from \"jazz-tools\";\nimport { JazzContext } from \"jazz-tools/react-core\";\nimport React, {\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useSyncExternalStore,\n} from \"react\";\nimport type { JazzContextManagerProps } from \"./ReactNativeContextManager.js\";\nimport { ReactNativeContextManager } from \"./ReactNativeContextManager.js\";\nimport { setupKvStore } from \"./platform.js\";\n\nexport type JazzProviderProps<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n> = {\n children: React.ReactNode;\n kvStore?: KvStore;\n fallback?: React.ReactNode | null;\n authSecretStorageKey?: string;\n} & JazzContextManagerProps<S>;\n\n/** @category Context & Hooks */\nexport function JazzProviderCore<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n>({\n children,\n guestMode,\n sync,\n storage,\n AccountSchema,\n defaultProfileName,\n onLogOut,\n logOutReplacement,\n onAnonymousAccountDiscarded,\n kvStore,\n authSecretStorageKey,\n fallback = null,\n}: JazzProviderProps<S>) {\n if (useContext(JazzContext)) {\n throw new Error(\n \"You can't nest a JazzProvider inside another JazzProvider.\",\n );\n }\n\n setupKvStore(kvStore);\n\n const [contextManager] = React.useState(\n () => new ReactNativeContextManager<S>({ authSecretStorageKey }),\n );\n\n const onLogOutRefCallback = useRefCallback(onLogOut);\n const logOutReplacementRefCallback = useRefCallback(logOutReplacement);\n const onAnonymousAccountDiscardedRefCallback = useRefCallback(\n onAnonymousAccountDiscarded,\n );\n\n const props = useMemo(() => {\n return {\n AccountSchema,\n guestMode,\n sync,\n storage,\n defaultProfileName,\n onLogOut: onLogOutRefCallback,\n logOutReplacement: logOutReplacement\n ? logOutReplacementRefCallback\n : undefined,\n onAnonymousAccountDiscarded: onAnonymousAccountDiscarded\n ? onAnonymousAccountDiscardedRefCallback\n : undefined,\n } satisfies JazzContextManagerProps<S>;\n }, [guestMode, sync.peer, sync.when, storage]);\n\n if (contextManager.propsChanged(props)) {\n contextManager.createContext(props).catch((error) => {\n console.log(error.stack);\n console.error(\"Error creating Jazz React Native context:\", error);\n });\n }\n\n const isReady = useSyncExternalStore(\n useCallback(\n (callback) => {\n return contextManager.subscribe(callback);\n },\n [contextManager],\n ),\n () => Boolean(contextManager.getCurrentValue()),\n () => Boolean(contextManager.getCurrentValue()),\n );\n\n useEffect(() => {\n // In development mode we don't return a cleanup function because otherwise\n // the double effect execution would mark the context as done immediately.\n if (process.env.NODE_ENV === \"development\") return;\n\n return () => {\n contextManager.done();\n };\n }, []);\n\n return (\n <JazzContext.Provider value={contextManager}>\n {isReady ? children : fallback}\n </JazzContext.Provider>\n );\n}\n\nfunction useRefCallback<T extends (...args: any[]) => any>(callback?: T) {\n const callbackRef = React.useRef(callback);\n callbackRef.current = callback;\n return useRef(\n (...args: Parameters<T>): ReturnType<T> => callbackRef.current?.(...args),\n ).current;\n}\n","import {\n Account,\n AccountClass,\n CoValueFromRaw,\n JazzContextManager,\n KvStore,\n SyncConfig,\n} from \"jazz-tools\";\nimport type {\n AnyAccountSchema,\n InstanceOfSchema,\n JazzContextManagerAuthProps,\n} from \"jazz-tools\";\nimport {\n BaseReactNativeContextOptions,\n createJazzReactNativeContext,\n createJazzReactNativeGuestContext,\n} from \"./platform.js\";\nimport { KvStoreContext } from \"./storage/kv-store-context.js\";\n\nexport type JazzContextManagerProps<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n> = {\n guestMode?: boolean;\n sync: SyncConfig;\n onLogOut?: () => void;\n logOutReplacement?: () => void;\n storage?: BaseReactNativeContextOptions[\"storage\"];\n AccountSchema?: S;\n defaultProfileName?: string;\n onAnonymousAccountDiscarded?: (\n anonymousAccount: InstanceOfSchema<S>,\n ) => Promise<void>;\n};\n\nexport class ReactNativeContextManager<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n> extends JazzContextManager<InstanceOfSchema<S>, JazzContextManagerProps<S>> {\n async getNewContext(\n props: JazzContextManagerProps<S>,\n authProps?: JazzContextManagerAuthProps,\n ) {\n if (props.guestMode) {\n return createJazzReactNativeGuestContext({\n sync: props.sync,\n storage: props.storage,\n authSecretStorage: this.authSecretStorage,\n });\n } else {\n return createJazzReactNativeContext<S>({\n sync: props.sync,\n storage: props.storage,\n AccountSchema: props.AccountSchema,\n credentials: authProps?.credentials,\n newAccountProps: authProps?.newAccountProps,\n defaultProfileName: props.defaultProfileName,\n authSecretStorage: this.authSecretStorage,\n });\n }\n }\n\n getKvStore(): KvStore {\n return KvStoreContext.getInstance().getStorage();\n }\n\n propsChanged(props: JazzContextManagerProps<S>) {\n if (!this.props) {\n return true;\n }\n\n return (\n this.props.sync.when !== props.sync.when ||\n this.props.sync.peer !== props.sync.peer ||\n this.props.guestMode !== props.guestMode\n );\n }\n}\n","import NetInfo from \"@react-native-community/netinfo\";\nimport { LocalNode, Peer, getSqliteStorageAsync } from \"cojson\";\nimport {\n Account,\n AccountClass,\n AnyAccountSchema,\n AuthCredentials,\n AuthSecretStorage,\n CoValue,\n CoValueFromRaw,\n NewAccountProps,\n SyncConfig,\n createInviteLink as baseCreateInviteLink,\n createAnonymousJazzContext,\n createJazzContext,\n} from \"jazz-tools\";\nimport { KvStore, KvStoreContext } from \"./storage/kv-store-context.js\";\nimport { ReactNativeSessionProvider } from \"./ReactNativeSessionProvider.js\";\n\nimport { SQLiteDatabaseDriverAsync } from \"cojson\";\nimport { WebSocketPeerWithReconnection } from \"cojson-transport-ws\";\nimport { RNCrypto } from \"cojson/crypto/RNCrypto\";\n\nexport type BaseReactNativeContextOptions = {\n sync: SyncConfig;\n reconnectionTimeout?: number;\n storage?: SQLiteDatabaseDriverAsync | \"disabled\";\n authSecretStorage: AuthSecretStorage;\n};\n\nclass ReactNativeWebSocketPeerWithReconnection extends WebSocketPeerWithReconnection {\n onNetworkChange(callback: (connected: boolean) => void): () => void {\n return NetInfo.addEventListener((state) =>\n callback(state.isConnected ?? false),\n );\n }\n}\n\nasync function setupPeers(options: BaseReactNativeContextOptions) {\n const crypto = await RNCrypto.create();\n let node: LocalNode | undefined = undefined;\n\n const peers: Peer[] = [];\n\n const storage =\n options.storage && options.storage !== \"disabled\"\n ? await getSqliteStorageAsync(options.storage)\n : undefined;\n\n if (options.sync.when === \"never\") {\n return {\n toggleNetwork: () => {},\n addConnectionListener: () => () => {},\n connected: () => false,\n peers,\n syncWhen: options.sync.when,\n setNode: () => {},\n crypto,\n storage,\n };\n }\n\n const wsPeer = new ReactNativeWebSocketPeerWithReconnection({\n peer: options.sync.peer,\n reconnectionTimeout: options.reconnectionTimeout,\n addPeer: (peer) => {\n if (node) {\n node.syncManager.addPeer(peer);\n } else {\n peers.push(peer);\n }\n },\n removePeer: (peer) => {\n peers.splice(peers.indexOf(peer), 1);\n },\n });\n\n function toggleNetwork(enabled: boolean) {\n if (enabled) {\n wsPeer.enable();\n } else {\n wsPeer.disable();\n }\n }\n\n function setNode(value: LocalNode) {\n node = value;\n }\n\n if (options.sync.when === \"always\" || !options.sync.when) {\n toggleNetwork(true);\n }\n\n return {\n toggleNetwork,\n addConnectionListener(listener: (connected: boolean) => void) {\n wsPeer.subscribe(listener);\n\n return () => {\n wsPeer.unsubscribe(listener);\n };\n },\n connected: () => wsPeer.connected,\n peers,\n syncWhen: options.sync.when,\n setNode,\n crypto,\n storage,\n };\n}\n\nexport async function createJazzReactNativeGuestContext(\n options: BaseReactNativeContextOptions,\n) {\n const {\n toggleNetwork,\n peers,\n syncWhen,\n setNode,\n crypto,\n storage,\n addConnectionListener,\n connected,\n } = await setupPeers(options);\n\n const context = createAnonymousJazzContext({\n crypto,\n peers,\n syncWhen,\n storage,\n });\n\n setNode(context.agent.node);\n\n options.authSecretStorage.emitUpdate(null);\n\n return {\n guest: context.agent,\n node: context.agent.node,\n done: () => {\n // TODO: Sync all the covalues before closing the connection & context\n toggleNetwork(false);\n context.done();\n },\n logOut: () => {\n return context.logOut();\n },\n addConnectionListener,\n connected,\n };\n}\n\nexport type ReactNativeContextOptions<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n> = {\n credentials?: AuthCredentials;\n AccountSchema?: S;\n newAccountProps?: NewAccountProps;\n defaultProfileName?: string;\n} & BaseReactNativeContextOptions;\n\nexport async function createJazzReactNativeContext<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n>(options: ReactNativeContextOptions<S>) {\n const {\n toggleNetwork,\n peers,\n syncWhen,\n setNode,\n crypto,\n storage,\n addConnectionListener,\n connected,\n } = await setupPeers(options);\n\n let unsubscribeAuthUpdate = () => {};\n\n if (options.sync.when === \"signedUp\") {\n const authSecretStorage = options.authSecretStorage;\n const credentials = options.credentials ?? (await authSecretStorage.get());\n\n // To update the internal state with the current credentials\n authSecretStorage.emitUpdate(credentials);\n\n function handleAuthUpdate(isAuthenticated: boolean) {\n if (isAuthenticated) {\n toggleNetwork(true);\n } else {\n toggleNetwork(false);\n }\n }\n\n unsubscribeAuthUpdate = authSecretStorage.onUpdate(handleAuthUpdate);\n handleAuthUpdate(authSecretStorage.isAuthenticated);\n }\n\n const sessionProvider = new ReactNativeSessionProvider();\n\n const context = await createJazzContext({\n credentials: options.credentials,\n newAccountProps: options.newAccountProps,\n peers,\n syncWhen,\n crypto,\n defaultProfileName: options.defaultProfileName,\n AccountSchema: options.AccountSchema,\n sessionProvider,\n authSecretStorage: options.authSecretStorage,\n storage,\n });\n\n setNode(context.node);\n\n return {\n me: context.account,\n node: context.node,\n authSecretStorage: context.authSecretStorage,\n done: () => {\n // TODO: Sync all the covalues before closing the connection & context\n toggleNetwork(false);\n unsubscribeAuthUpdate();\n context.done();\n },\n logOut: () => {\n unsubscribeAuthUpdate();\n return context.logOut();\n },\n addConnectionListener,\n connected,\n };\n}\n\n/** @category Invite Links */\nexport function createInviteLink<C extends CoValue>(\n value: C,\n role: \"reader\" | \"writer\" | \"admin\",\n { baseURL, valueHint }: { baseURL?: string; valueHint?: string } = {},\n): string {\n return baseCreateInviteLink(value, role, baseURL ?? \"\", valueHint);\n}\n\nexport function setupKvStore(\n kvStore: KvStore | undefined,\n): KvStore | undefined {\n if (!kvStore) {\n return undefined;\n }\n KvStoreContext.getInstance().initialize(kvStore);\n return kvStore;\n}\n","import {\n CryptoProvider,\n KvStoreContext,\n SessionID,\n SessionProvider,\n} from \"jazz-tools\";\nimport { AgentID, RawAccountID } from \"cojson\";\n\nconst lockedSessions = new Set<SessionID>();\n\nexport class ReactNativeSessionProvider implements SessionProvider {\n async acquireSession(\n accountID: string,\n crypto: CryptoProvider,\n ): Promise<{ sessionID: SessionID; sessionDone: () => void }> {\n const kvStore = KvStoreContext.getInstance().getStorage();\n const existingSession = await kvStore.get(accountID as string);\n\n if (!existingSession) {\n const newSessionID = crypto.newRandomSessionID(\n accountID as RawAccountID | AgentID,\n );\n await kvStore.set(accountID, newSessionID);\n lockedSessions.add(newSessionID);\n\n console.log(\"Created new session\", newSessionID);\n\n return Promise.resolve({\n sessionID: newSessionID,\n sessionDone: () => {\n lockedSessions.delete(newSessionID);\n },\n });\n }\n\n // Check if the session is already in use, should happen only if the dev\n // mounts multiple providers at the same time\n if (lockedSessions.has(existingSession as SessionID)) {\n const newSessionID = crypto.newRandomSessionID(\n accountID as RawAccountID | AgentID,\n );\n\n console.error(\"Existing session in use, creating new one\", newSessionID);\n\n return Promise.resolve({\n sessionID: newSessionID,\n sessionDone: () => {},\n });\n }\n\n console.log(\"Using existing session\", existingSession);\n lockedSessions.add(existingSession as SessionID);\n\n return Promise.resolve({\n sessionID: existingSession as SessionID,\n sessionDone: () => {\n lockedSessions.delete(existingSession as SessionID);\n },\n });\n }\n\n async persistSession(\n accountID: string,\n sessionID: SessionID,\n ): Promise<{ sessionDone: () => void }> {\n const kvStore = KvStoreContext.getInstance().getStorage();\n await kvStore.set(accountID, sessionID);\n lockedSessions.add(sessionID);\n\n console.log(\"Persisted session\", sessionID);\n\n return Promise.resolve({\n sessionDone: () => {\n lockedSessions.delete(sessionID);\n },\n });\n }\n}\n","import { FileStream, ImageDefinition } from \"jazz-tools\";\nimport { highestResAvailable } from \"jazz-tools/media\";\nimport { forwardRef, useEffect, useMemo, useState } from \"react\";\nimport { Image as RNImage, ImageProps as RNImageProps } from \"react-native\";\nimport { useCoState } from \"../hooks.js\";\n\nexport type ImageProps = Omit<RNImageProps, \"width\" | \"height\" | \"source\"> & {\n /** The ID of the ImageDefinition to display */\n imageId: string;\n /**\n * Width of the image. Can be a number or \"original\" to use the original image width.\n * When set to \"original\", the component will calculate the appropriate height to maintain aspect ratio.\n *\n * @example\n * ```tsx\n * // Fixed width, auto-calculated height\n * <Image imageId=\"123\" width={600} />\n *\n * // Original width\n * <Image imageId=\"123\" width=\"original\" />\n * ```\n */\n width?: number | \"original\";\n /**\n * Height of the image. Can be a number or \"original\" to use the original image height.\n * When set to \"original\", the component will calculate the appropriate width to maintain aspect ratio.\n *\n * @example\n * ```tsx\n * // Fixed height, auto-calculated width\n * <Image imageId=\"123\" height={400} />\n *\n * // Original height\n * <Image imageId=\"123\" height=\"original\" />\n * ```\n */\n height?: number | \"original\";\n /**\n * A custom placeholder to display while an image is loading. This will\n * be passed as the src of the img tag, so a data URL works well here.\n * This will be used as a fallback if no images are ready and no placeholder\n * is available otherwise.\n */\n placeholder?: string;\n};\n\n/**\n * A React Native Image component that integrates with Jazz's ImageDefinition system.\n *\n * @example\n * ```tsx\n * import { Image } from \"jazz-tools/react-native\";\n * import { StyleSheet } from \"react-native\";\n *\n * function ProfilePicture({ imageId }) {\n * return (\n * <Image\n * imageId={imageId}\n * style={styles.profilePic}\n * width={100}\n * height={100}\n * resizeMode=\"cover\"\n * placeholder=\"/placeholder.png\"\n * />\n * );\n * }\n *\n * const styles = StyleSheet.create({\n * profilePic: {\n * borderRadius: 50,\n * }\n * });\n * ```\n */\nexport const Image = forwardRef<RNImage, ImageProps>(function Image(\n { imageId, width, height, placeholder, ...props },\n ref,\n) {\n const image = useCoState(ImageDefinition, imageId, {\n select: (image) => (image.$isLoaded ? image : null),\n });\n const [src, setSrc] = useState<string | undefined>(\n image?.placeholderDataURL ??\n \"data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==\",\n );\n\n const dimensions: { width: number | undefined; height: number | undefined } =\n useMemo(() => {\n const originalWidth = image?.originalSize?.[0];\n const originalHeight = image?.originalSize?.[1];\n\n // Both width and height are \"original\"\n if (width === \"original\" && height === \"original\") {\n return { width: originalWidth, height: originalHeight };\n }\n\n // Width is \"original\", height is a number\n if (width === \"original\" && typeof height === \"number\") {\n if (originalWidth && originalHeight) {\n return {\n width: Math.round((height * originalWidth) / originalHeight),\n height,\n };\n }\n return { width: undefined, height };\n }\n\n // Height is \"original\", width is a number\n if (height === \"original\" && typeof width === \"number\") {\n if (originalWidth && originalHeight) {\n return {\n width,\n height: Math.round((width * originalHeight) / originalWidth),\n };\n }\n return { width, height: undefined };\n }\n\n // In all other cases, use the property value:\n return {\n width: width === \"original\" ? originalWidth : width,\n height: height === \"original\" ? originalHeight : height,\n };\n }, [image?.originalSize, width, height]);\n\n useEffect(() => {\n if (!image) return;\n\n let lastBestImage: FileStream | string | undefined =\n image?.placeholderDataURL ?? placeholder;\n\n const unsub = image.$jazz.subscribe({}, (update) => {\n if (lastBestImage === undefined && update.placeholderDataURL) {\n setSrc(update.placeholderDataURL);\n lastBestImage = update.placeholderDataURL;\n }\n\n const bestImage = highestResAvailable(\n update,\n dimensions.width || dimensions.height || 9999,\n dimensions.height || dimensions.width || 9999,\n );\n\n if (!bestImage) return;\n\n if (lastBestImage === bestImage.image) return;\n\n const url = bestImage.image.asBase64({ dataURL: true });\n\n if (url) {\n setSrc(url);\n lastBestImage = bestImage.image;\n }\n });\n\n return unsub;\n }, [image]);\n\n if (!src) {\n return null;\n }\n\n return (\n <RNImage\n ref={ref}\n source={{ uri: src }}\n width={dimensions.width}\n height={dimensions.height}\n {...props}\n />\n );\n});\n","export * from \"./auth/auth.js\";\nexport * from \"./hooks.js\";\nexport * from \"./provider.js\";\nexport * from \"./storage/kv-store-context.js\";\nexport * from \"./media/image.js\";\n\nexport {\n createCoValueSubscriptionContext,\n createAccountSubscriptionContext,\n type CoValueSubscription,\n} from \"jazz-tools/react-core\";\n\nexport { SQLiteDatabaseDriverAsync } from \"cojson\";\n\nexport { parseInviteLink } from \"jazz-tools\";\n\nexport { createInviteLink, setupKvStore } from \"./platform.js\";\nexport {\n ReactNativeContextManager,\n type JazzContextManagerProps,\n} from \"./ReactNativeContextManager.js\";\n"],"mappings":"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","names":["username","useState","StyleSheet","Text","TextInput","TouchableOpacity","View","useColorScheme","jsx","jsxs","useColorScheme","useState","View","styles","Text","TextInput","TouchableOpacity","StyleSheet","useJazzContextValue","useAuthSecretStorage","useIsAuthenticated","React","useEffect","useMemo","KvStoreContext","handleAuthUpdate","jsx","React","useMemo","useEffect","useEffect","useMemo","useState","jsx","Image","image","useState","useMemo","useEffect","parseInviteLink"]}
@@ -1,15 +1,11 @@
1
1
  import { LocalNode } from "cojson";
2
- import { PureJSCrypto } from "cojson/dist/crypto/PureJSCrypto";
3
2
  import { Account, AccountClass, AnyAccountSchema, AuthCredentials, AuthSecretStorage, CoValue, CoValueFromRaw, NewAccountProps, SyncConfig } from "jazz-tools";
4
3
  import { KvStore } from "./storage/kv-store-context.js";
5
4
  import { SQLiteDatabaseDriverAsync } from "cojson";
6
- import type { RNQuickCrypto } from "jazz-tools/react-native-core/crypto";
7
- import type { RNCrypto } from "cojson/crypto/RNCrypto";
8
5
  export type BaseReactNativeContextOptions = {
9
6
  sync: SyncConfig;
10
7
  reconnectionTimeout?: number;
11
8
  storage?: SQLiteDatabaseDriverAsync | "disabled";
12
- CryptoProvider?: typeof PureJSCrypto | typeof RNQuickCrypto | typeof RNCrypto;
13
9
  authSecretStorage: AuthSecretStorage;
14
10
  };
15
11
  export declare function createJazzReactNativeGuestContext(options: BaseReactNativeContextOptions): Promise<{
@@ -1 +1 @@
1
- {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/react-native-core/platform.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAA+B,MAAM,QAAQ,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EACL,OAAO,EACP,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,OAAO,EACP,cAAc,EACd,eAAe,EACf,UAAU,EAIX,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,OAAO,EAAkB,MAAM,+BAA+B,CAAC;AAGxE,OAAO,EAAE,yBAAyB,EAAE,MAAM,QAAQ,CAAC;AAEnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAEvD,MAAM,MAAM,6BAA6B,GAAG;IAC1C,IAAI,EAAE,UAAU,CAAC;IACjB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,OAAO,CAAC,EAAE,yBAAyB,GAAG,UAAU,CAAC;IACjD,cAAc,CAAC,EAAE,OAAO,YAAY,GAAG,OAAO,aAAa,GAAG,OAAO,QAAQ,CAAC;IAC9E,iBAAiB,EAAE,iBAAiB,CAAC;CACtC,CAAC;AAoFF,wBAAsB,iCAAiC,CACrD,OAAO,EAAE,6BAA6B;;;;;4DAjBJ,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI;;GAuD/D;AAED,MAAM,MAAM,yBAAyB,CACnC,CAAC,SACG,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GACjD,gBAAgB,IAClB;IACF,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,aAAa,CAAC,EAAE,CAAC,CAAC;IAClB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,GAAG,6BAA6B,CAAC;AAElC,wBAAsB,4BAA4B,CAChD,CAAC,SACG,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GACjD,gBAAgB,EACpB,OAAO,EAAE,yBAAyB,CAAC,CAAC,CAAC;;;;;;4DAxEH,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI;;GA2I/D;AAED,6BAA6B;AAC7B,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,OAAO,EAChD,KAAK,EAAE,CAAC,EACR,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,EACnC,EAAE,OAAO,EAAE,SAAS,EAAE,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACpE,MAAM,CAER;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,OAAO,GAAG,SAAS,GAC3B,OAAO,GAAG,SAAS,CAMrB"}
1
+ {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/react-native-core/platform.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAA+B,MAAM,QAAQ,CAAC;AAChE,OAAO,EACL,OAAO,EACP,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,OAAO,EACP,cAAc,EACd,eAAe,EACf,UAAU,EAIX,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,OAAO,EAAkB,MAAM,+BAA+B,CAAC;AAGxE,OAAO,EAAE,yBAAyB,EAAE,MAAM,QAAQ,CAAC;AAInD,MAAM,MAAM,6BAA6B,GAAG;IAC1C,IAAI,EAAE,UAAU,CAAC;IACjB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,OAAO,CAAC,EAAE,yBAAyB,GAAG,UAAU,CAAC;IACjD,iBAAiB,EAAE,iBAAiB,CAAC;CACtC,CAAC;AAmFF,wBAAsB,iCAAiC,CACrD,OAAO,EAAE,6BAA6B;;;;;4DAjBJ,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI;;GAuD/D;AAED,MAAM,MAAM,yBAAyB,CACnC,CAAC,SACG,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GACjD,gBAAgB,IAClB;IACF,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,aAAa,CAAC,EAAE,CAAC,CAAC;IAClB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,GAAG,6BAA6B,CAAC;AAElC,wBAAsB,4BAA4B,CAChD,CAAC,SACG,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GACjD,gBAAgB,EACpB,OAAO,EAAE,yBAAyB,CAAC,CAAC,CAAC;;;;;;4DAxEH,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI;;GA2I/D;AAED,6BAA6B;AAC7B,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,OAAO,EAChD,KAAK,EAAE,CAAC,EACR,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,EACnC,EAAE,OAAO,EAAE,SAAS,EAAE,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACpE,MAAM,CAER;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,OAAO,GAAG,SAAS,GAC3B,OAAO,GAAG,SAAS,CAMrB"}
@@ -4,8 +4,9 @@ import type { JazzContextManagerProps } from "./ReactNativeContextManager.js";
4
4
  export type JazzProviderProps<S extends (AccountClass<Account> & CoValueFromRaw<Account>) | AnyAccountSchema> = {
5
5
  children: React.ReactNode;
6
6
  kvStore?: KvStore;
7
+ fallback?: React.ReactNode | null;
7
8
  authSecretStorageKey?: string;
8
9
  } & JazzContextManagerProps<S>;
9
10
  /** @category Context & Hooks */
10
- export declare function JazzProviderCore<S extends (AccountClass<Account> & CoValueFromRaw<Account>) | AnyAccountSchema>({ children, guestMode, sync, storage, AccountSchema, defaultProfileName, onLogOut, logOutReplacement, onAnonymousAccountDiscarded, kvStore, CryptoProvider, authSecretStorageKey, }: JazzProviderProps<S>): import("react/jsx-runtime").JSX.Element;
11
+ export declare function JazzProviderCore<S extends (AccountClass<Account> & CoValueFromRaw<Account>) | AnyAccountSchema>({ children, guestMode, sync, storage, AccountSchema, defaultProfileName, onLogOut, logOutReplacement, onAnonymousAccountDiscarded, kvStore, authSecretStorageKey, fallback, }: JazzProviderProps<S>): import("react/jsx-runtime").JSX.Element;
11
12
  //# sourceMappingURL=provider.d.ts.map