jazz-tools 0.19.11 → 0.19.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +46 -46
- package/CHANGELOG.md +12 -0
- package/dist/{chunk-HX5S6W5E.js → chunk-AGF4HEDH.js} +56 -27
- package/dist/chunk-AGF4HEDH.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/inspector/{chunk-C6BJPHBQ.js → chunk-YQNK5Y7B.js} +47 -35
- package/dist/inspector/chunk-YQNK5Y7B.js.map +1 -0
- package/dist/inspector/{custom-element-GJVBPZES.js → custom-element-KYV64IOC.js} +47 -35
- package/dist/inspector/{custom-element-GJVBPZES.js.map → custom-element-KYV64IOC.js.map} +1 -1
- package/dist/inspector/index.js +1 -1
- package/dist/inspector/register-custom-element.js +1 -1
- package/dist/inspector/standalone.js +1 -1
- package/dist/inspector/tests/utils/transactions-changes.test.d.ts +2 -0
- package/dist/inspector/tests/utils/transactions-changes.test.d.ts.map +1 -0
- package/dist/inspector/utils/transactions-changes.d.ts +13 -13
- package/dist/inspector/utils/transactions-changes.d.ts.map +1 -1
- package/dist/react/index.js +4 -1
- package/dist/react/index.js.map +1 -1
- package/dist/react/provider.d.ts.map +1 -1
- package/dist/react-core/index.js +2 -2
- package/dist/react-core/index.js.map +1 -1
- package/dist/react-native/index.js +4 -1
- package/dist/react-native/index.js.map +1 -1
- package/dist/react-native-core/index.js +4 -1
- package/dist/react-native-core/index.js.map +1 -1
- package/dist/react-native-core/provider.d.ts.map +1 -1
- package/dist/testing.js +1 -1
- package/dist/tools/implementation/ContextManager.d.ts.map +1 -1
- package/dist/tools/subscribe/SubscriptionScope.d.ts +3 -6
- package/dist/tools/subscribe/SubscriptionScope.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/inspector/tests/utils/transactions-changes.test.ts +102 -0
- package/src/inspector/ui/icons/add-icon.tsx +3 -3
- package/src/inspector/utils/history.ts +6 -6
- package/src/inspector/utils/transactions-changes.ts +37 -3
- package/src/inspector/viewer/history-view.tsx +13 -13
- package/src/react/provider.tsx +6 -1
- package/src/react-core/hooks.ts +2 -2
- package/src/react-core/tests/useSuspenseCoState.test.tsx +47 -0
- package/src/react-native-core/provider.tsx +6 -1
- package/src/tools/implementation/ContextManager.ts +10 -0
- package/src/tools/subscribe/SubscriptionScope.ts +61 -39
- package/dist/chunk-HX5S6W5E.js.map +0 -1
- package/dist/inspector/chunk-C6BJPHBQ.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/react-core/hooks.ts","../../src/react-core/utils.ts","../../src/react-core/use.ts","../../src/react-core/subscription-provider.tsx","../../src/react-core/auth/DemoAuth.tsx","../../src/react-core/auth/PassphraseAuth.tsx"],"sourcesContent":["import { useSyncExternalStoreWithSelector } from \"use-sync-external-store/shim/with-selector\";\nimport React, {\n useCallback,\n useContext,\n useMemo,\n useRef,\n useSyncExternalStore,\n} from \"react\";\n\nimport {\n Account,\n AccountClass,\n AnonymousJazzAgent,\n AnyAccountSchema,\n CoValue,\n CoValueClassOrSchema,\n CoValueLoadingState,\n ExportedCoValue,\n InboxSender,\n InstanceOfSchema,\n JazzContextManager,\n JazzContextType,\n Loaded,\n MaybeLoaded,\n NotLoaded,\n RefsToResolve,\n ResolveQuery,\n ResolveQueryStrict,\n SchemaResolveQuery,\n SubscriptionScope,\n importContentPieces,\n captureStack,\n getUnloadedCoValueWithoutId,\n type BranchDefinition,\n} from \"jazz-tools\";\nimport { JazzContext, JazzContextManagerContext } from \"./provider.js\";\nimport { getCurrentAccountFromContextManager } from \"./utils.js\";\nimport { CoValueSubscription } from \"./types.js\";\nimport { use } from \"./use.js\";\n\nexport function useJazzContext<Acc extends Account>() {\n const value = useContext(JazzContext) as JazzContextType<Acc>;\n\n if (!value) {\n throw new Error(\n \"You need to set up a JazzProvider on top of your app to use this hook.\",\n );\n }\n\n return value;\n}\n\nexport function useJazzContextManager<Acc extends Account>() {\n const value = useContext(JazzContextManagerContext) as JazzContextManager<\n Acc,\n {}\n >;\n\n if (!value) {\n throw new Error(\n \"You need to set up a JazzProvider on top of your app to use this hook.\",\n );\n }\n\n return value;\n}\n\nexport function useAuthSecretStorage() {\n const value = useContext(JazzContextManagerContext);\n\n if (!value) {\n throw new Error(\n \"You need to set up a JazzProvider on top of your app to use this useAuthSecretStorage.\",\n );\n }\n\n return value.getAuthSecretStorage();\n}\n\nexport function useIsAuthenticated() {\n const authSecretStorage = useAuthSecretStorage();\n\n return useSyncExternalStore(\n useCallback(\n (callback) => {\n return authSecretStorage.onUpdate(callback);\n },\n [authSecretStorage],\n ),\n () => authSecretStorage.isAuthenticated,\n () => authSecretStorage.isAuthenticated,\n );\n}\n\nexport function useCoValueSubscription<\n S extends CoValueClassOrSchema,\n // @ts-expect-error we can't statically enforce the schema's resolve query is a valid resolve query, but in practice it is\n const R extends ResolveQuery<S> = SchemaResolveQuery<S>,\n>(\n Schema: S,\n id: string | undefined | null,\n options?: {\n resolve?: ResolveQueryStrict<S, R>;\n unstable_branch?: BranchDefinition;\n },\n) {\n const contextManager = useJazzContextManager();\n const agent = useAgent();\n\n const callerStack = React.useRef<Error | undefined>(undefined);\n\n if (!callerStack.current) {\n callerStack.current = captureStack();\n }\n\n const createSubscription = () => {\n if (!id) {\n return {\n subscription: null,\n contextManager,\n id,\n Schema,\n };\n }\n\n if (options?.unstable_branch?.owner === null) {\n return {\n subscription: null,\n contextManager,\n id,\n Schema,\n };\n }\n\n const resolve = getResolveQuery(Schema, options?.resolve);\n\n const node = contextManager.getCurrentValue()!.node;\n const cache = contextManager.getSubscriptionScopeCache();\n const subscription = cache.getOrCreate(\n node,\n Schema,\n id,\n resolve,\n false,\n false,\n options?.unstable_branch,\n );\n\n // Set callerStack on returned subscription after retrieval\n if (callerStack.current) {\n subscription.callerStack = callerStack.current;\n }\n\n return {\n value: subscription,\n contextManager,\n id,\n Schema,\n branchName: options?.unstable_branch?.name,\n branchOwnerId: options?.unstable_branch?.owner?.$jazz.id,\n agent,\n };\n };\n\n const subscriptionRef = React.useRef<null | ReturnType<\n typeof createSubscription\n >>(null);\n\n if (!subscriptionRef.current) {\n subscriptionRef.current = createSubscription();\n }\n\n const branchName = options?.unstable_branch?.name;\n const branchOwnerId = options?.unstable_branch?.owner?.$jazz.id;\n\n let subscription = subscriptionRef.current;\n\n // Check if the subscription needs to be updated\n // because one of the dependencies has changed\n if (\n subscription.contextManager !== contextManager ||\n subscription.id !== id ||\n subscription.Schema !== Schema ||\n subscription.branchName !== branchName ||\n subscription.branchOwnerId !== branchOwnerId ||\n subscription.agent !== agent\n ) {\n subscriptionRef.current = createSubscription();\n subscription = subscriptionRef.current;\n }\n\n // Subscribe to the context manager to react to auth changes\n return subscription.value as CoValueSubscription<S, R>;\n}\n\nfunction useImportCoValueContent<V>(\n id: string | undefined | null,\n content?: ExportedCoValue<V>,\n) {\n const agent = useAgent();\n const preloadExecuted = useRef<typeof agent | null>(null);\n if (content && preloadExecuted.current !== agent && id) {\n if (content.id === id) {\n importContentPieces(content.contentPieces, agent);\n } else {\n console.warn(\"Preloaded value ID does not match the subscription ID\");\n }\n\n preloadExecuted.current = agent;\n }\n}\n\nfunction useGetCurrentValue<C extends CoValue>(\n subscription: SubscriptionScope<C> | null,\n) {\n return useCallback(() => {\n if (!subscription) {\n return getUnloadedCoValueWithoutId(CoValueLoadingState.UNAVAILABLE);\n }\n\n return subscription.getCurrentValue();\n }, [subscription]);\n}\n\n/**\n * React hook for subscribing to CoValues and handling loading states.\n *\n * This hook provides a convenient way to subscribe to CoValues and automatically\n * handles the subscription lifecycle (subscribe on mount, unsubscribe on unmount).\n * It also supports deep loading of nested CoValues through resolve queries.\n *\n * The {@param options.select} function allows returning only specific parts of the CoValue data,\n * which helps reduce unnecessary re-renders by narrowing down the returned data.\n * Additionally, you can provide a custom {@param options.equalityFn} to further optimize\n * performance by controlling when the component should re-render based on the selected data.\n *\n * @returns The loaded CoValue, or an {@link NotLoaded} value. Use `$isLoaded` to check whether the\n * CoValue is loaded, or use {@link MaybeLoaded.$jazz.loadingState} to get the detailed loading state.\n * If a selector function is provided, returns the result of the selector function.\n *\n * @example\n * ```tsx\n * // Select only specific fields to reduce re-renders\n * const Project = co.map({\n * name: z.string(),\n * description: z.string(),\n * tasks: co.list(Task),\n * lastModified: z.date(),\n * });\n *\n * function ProjectTitle({ projectId }: { projectId: string }) {\n * // Only re-render when the project name changes, not other fields\n * const projectName = useCoState(\n * Project,\n * projectId,\n * {\n * select: (project) => !project.$isLoading ? project.name : \"Loading...\",\n * }\n * );\n *\n * return <h1>{projectName}</h1>;\n * }\n * ```\n *\n * @example\n * ```tsx\n * // Deep loading with resolve queries\n * const Project = co.map({\n * name: z.string(),\n * tasks: co.list(Task),\n * owner: TeamMember,\n * });\n *\n * function ProjectView({ projectId }: { projectId: string }) {\n * const project = useCoState(Project, projectId, {\n * resolve: {\n * tasks: { $each: true },\n * owner: true,\n * },\n * });\n *\n * if (!project.$isLoaded) {\n * switch (project.$jazz.loadingState) {\n * case \"unauthorized\":\n * return \"Project not accessible\";\n * case \"unavailable\":\n * return \"Project not found\";\n * case \"loading\":\n * return \"Loading project...\";\n * }\n * }\n *\n * return (\n * <div>\n * <h1>{project.name}</h1>\n * <p>Owner: {project.owner.name}</p>\n * <ul>\n * {project.tasks.map((task) => (\n * <li key={task.id}>{task.title}</li>\n * ))}\n * </ul>\n * </div>\n * );\n * }\n * ```\n *\n * @example\n * ```tsx\n * // Using with optional references and error handling\n * const Task = co.map({\n * title: z.string(),\n * assignee: co.optional(TeamMember),\n * subtasks: co.list(Task),\n * });\n *\n * function TaskDetail({ taskId }: { taskId: string }) {\n * const task = useCoState(Task, taskId, {\n * resolve: {\n * assignee: true,\n * subtasks: { $each: { $onError: 'catch' } },\n * },\n * });\n *\n * if (!task.$isLoaded) {\n * switch (task.$jazz.loadingState) {\n * case \"unauthorized\":\n * return \"Task not accessible\";\n * case \"unavailable\":\n * return \"Task not found\";\n * case \"loading\":\n * return \"Loading task...\";\n * }\n * }\n *\n * return (\n * <div>\n * <h2>{task.title}</h2>\n * {task.assignee && <p>Assigned to: {task.assignee.name}</p>}\n * <ul>\n * {task.subtasks.map((subtask, index) => (\n * subtask.$isLoaded ? <li key={subtask.id}>{subtask.title}</li> : <li key={index}>Inaccessible subtask</li>\n * ))}\n * </ul>\n * </div>\n * );\n * }\n * ```\n *\n * @example\n * ```tsx\n * // Use custom equality function for complex data structures\n * const TaskList = co.list(Task);\n *\n * function TaskCount({ listId }: { listId: string }) {\n * const taskStats = useCoState(\n * TaskList,\n * listId,\n * {\n * resolve: { $each: true },\n * select: (tasks) => {\n * if (!tasks.$isLoaded) return { total: 0, completed: 0 };\n * return {\n * total: tasks.length,\n * completed: tasks.filter(task => task.completed).length,\n * };\n * },\n * // Custom equality to prevent re-renders when stats haven't changed\n * equalityFn: (a, b) => a.total === b.total && a.completed === b.completed,\n * }\n * );\n *\n * return (\n * <div>\n * {taskStats.completed} of {taskStats.total} tasks completed\n * </div>\n * );\n * }\n * ```\n *\n * For more examples, see the [subscription and deep loading](https://jazz.tools/docs/react/using-covalues/subscription-and-loading) documentation.\n */\nexport function useCoState<\n S extends CoValueClassOrSchema,\n // @ts-expect-error we can't statically enforce the schema's resolve query is a valid resolve query, but in practice it is\n const R extends ResolveQuery<S> = SchemaResolveQuery<S>,\n TSelectorReturn = MaybeLoaded<Loaded<S, R>>,\n>(\n /** The CoValue schema or class constructor */\n Schema: S,\n /** The ID of the CoValue to subscribe to. If `undefined`, returns an `unavailable` value */\n id: string | undefined,\n /** Optional configuration for the subscription */\n options?: {\n /** Resolve query to specify which nested CoValues to load */\n resolve?: ResolveQueryStrict<S, R>;\n /** Select which value to return */\n select?: (value: MaybeLoaded<Loaded<S, R>>) => TSelectorReturn;\n /** Equality function to determine if the selected value has changed, defaults to `Object.is` */\n equalityFn?: (a: TSelectorReturn, b: TSelectorReturn) => boolean;\n /**\n * Create or load a branch for isolated editing.\n *\n * Branching lets you take a snapshot of the current state and start modifying it without affecting the canonical/shared version.\n * It's a fork of your data graph: the same schema, but with diverging values.\n *\n * The checkout of the branch is applied on all the resolved values.\n *\n * @param name - A unique name for the branch. This identifies the branch\n * and can be used to switch between different branches of the same CoValue.\n * @param owner - The owner of the branch. Determines who can access and modify\n * the branch. If not provided, the branch is owned by the current user.\n *\n * For more info see the [branching](https://jazz.tools/docs/react/using-covalues/version-control) documentation.\n */\n unstable_branch?: BranchDefinition;\n preloaded?: ExportedCoValue<Loaded<S, R>>;\n },\n): TSelectorReturn {\n useImportCoValueContent(id, options?.preloaded);\n\n const subscription = useCoValueSubscription(Schema, id, options);\n const getCurrentValue = useGetCurrentValue(subscription);\n\n const value = useSyncExternalStoreWithSelector<\n MaybeLoaded<Loaded<S, R>>,\n TSelectorReturn\n >(\n React.useCallback(\n (callback) => {\n if (!subscription) {\n return () => {};\n }\n\n return subscription.subscribe(callback);\n },\n [subscription],\n ),\n getCurrentValue,\n getCurrentValue,\n options?.select ?? ((value) => value as TSelectorReturn),\n options?.equalityFn ?? Object.is,\n );\n\n return value;\n}\n\nexport function useSuspenseCoState<\n S extends CoValueClassOrSchema,\n // @ts-expect-error we can't statically enforce the schema's resolve query is a valid resolve query, but in practice it is\n const R extends ResolveQuery<S> = SchemaResolveQuery<S>,\n TSelectorReturn = Loaded<S, R>,\n>(\n /** The CoValue schema or class constructor */\n Schema: S,\n /** The ID of the CoValue to subscribe to */\n id: string,\n /** Optional configuration for the subscription */\n options?: {\n /** Resolve query to specify which nested CoValues to load */\n resolve?: ResolveQueryStrict<S, R>;\n /** Select which value to return */\n select?: (value: Loaded<S, R>) => TSelectorReturn;\n /** Equality function to determine if the selected value has changed, defaults to `Object.is` */\n equalityFn?: (a: TSelectorReturn, b: TSelectorReturn) => boolean;\n /**\n * Create or load a branch for isolated editing.\n *\n * Branching lets you take a snapshot of the current state and start modifying it without affecting the canonical/shared version.\n * It's a fork of your data graph: the same schema, but with diverging values.\n *\n * The checkout of the branch is applied on all the resolved values.\n *\n * @param name - A unique name for the branch. This identifies the branch\n * and can be used to switch between different branches of the same CoValue.\n * @param owner - The owner of the branch. Determines who can access and modify\n * the branch. If not provided, the branch is owned by the current user.\n *\n * For more info see the [branching](https://jazz.tools/docs/react/using-covalues/version-control) documentation.\n */\n unstable_branch?: BranchDefinition;\n preloaded?: ExportedCoValue<Loaded<S, R>>;\n },\n): TSelectorReturn {\n useImportCoValueContent(id, options?.preloaded);\n\n const subscription = useCoValueSubscription(Schema, id, options);\n\n if (!subscription) {\n throw new Error(\"Subscription not found\");\n }\n\n use(subscription.getPromise());\n\n const getCurrentValue = () => {\n const value = subscription.getCurrentValue();\n\n if (!value.$isLoaded) {\n throw new Error(\"CoValue must be loaded in a suspense context\");\n }\n\n return value;\n };\n\n const value = useSyncExternalStoreWithSelector<Loaded<S, R>, TSelectorReturn>(\n React.useCallback(\n (callback) => {\n return subscription.subscribe(callback);\n },\n [subscription],\n ),\n getCurrentValue,\n getCurrentValue,\n options?.select ?? ((value) => value as TSelectorReturn),\n options?.equalityFn ?? Object.is,\n );\n\n return value;\n}\n\nexport function useSubscriptionSelector<\n S extends CoValueClassOrSchema,\n // @ts-expect-error we can't statically enforce the schema's resolve query is a valid resolve query, but in practice it is\n const R extends ResolveQuery<S> = SchemaResolveQuery<S>,\n TSelectorReturn = MaybeLoaded<Loaded<S, R>>,\n>(\n subscription: CoValueSubscription<S, R>,\n options?: {\n select?: (value: MaybeLoaded<Loaded<S, R>>) => TSelectorReturn;\n equalityFn?: (a: TSelectorReturn, b: TSelectorReturn) => boolean;\n },\n) {\n const getCurrentValue = useGetCurrentValue(subscription);\n\n return useSyncExternalStoreWithSelector<\n MaybeLoaded<Loaded<S, R>>,\n TSelectorReturn\n >(\n React.useCallback(\n (callback) => {\n if (!subscription) {\n return () => {};\n }\n\n return subscription.subscribe(callback);\n },\n [subscription],\n ),\n getCurrentValue,\n getCurrentValue,\n options?.select ?? ((value) => value as TSelectorReturn),\n options?.equalityFn ?? Object.is,\n );\n}\n\nexport function useAccountSubscription<\n S extends AccountClass<Account> | AnyAccountSchema,\n // @ts-expect-error we can't statically enforce the schema's resolve query is a valid resolve query, but in practice it is\n const R extends ResolveQuery<S> = SchemaResolveQuery<S>,\n>(\n Schema: S,\n options?: {\n resolve?: ResolveQueryStrict<S, R>;\n unstable_branch?: BranchDefinition;\n },\n) {\n const contextManager = useJazzContextManager();\n\n // Capture stack trace at hook call time\n const callerStack = React.useRef<Error | undefined>(undefined);\n if (!callerStack.current) {\n callerStack.current = captureStack();\n }\n\n const createSubscription = () => {\n const agent = getCurrentAccountFromContextManager(contextManager);\n\n if (agent.$type$ === \"Anonymous\") {\n return {\n subscription: null,\n contextManager,\n agent,\n };\n }\n\n const resolve = getResolveQuery(Schema, options?.resolve);\n\n const node = contextManager.getCurrentValue()!.node;\n const cache = contextManager.getSubscriptionScopeCache();\n const subscription = cache.getOrCreate(\n node,\n Schema,\n agent.$jazz.id,\n resolve,\n false,\n false,\n options?.unstable_branch,\n );\n\n // Set callerStack on returned subscription after retrieval\n if (callerStack.current) {\n subscription.callerStack = callerStack.current;\n }\n\n return {\n subscription,\n contextManager,\n Schema,\n branchName: options?.unstable_branch?.name,\n branchOwnerId: options?.unstable_branch?.owner?.$jazz.id,\n };\n };\n\n const [subscription, setSubscription] = React.useState(createSubscription);\n\n const branchName = options?.unstable_branch?.name;\n const branchOwnerId = options?.unstable_branch?.owner?.$jazz.id;\n\n React.useLayoutEffect(() => {\n if (\n subscription.contextManager !== contextManager ||\n subscription.Schema !== Schema ||\n subscription.branchName !== options?.unstable_branch?.name ||\n subscription.branchOwnerId !== options?.unstable_branch?.owner?.$jazz.id\n ) {\n // No need to manually destroy - cache handles cleanup via SubscriptionScope lifecycle\n setSubscription(createSubscription());\n }\n\n return contextManager.subscribe(() => {\n // No need to manually destroy - cache handles cleanup via SubscriptionScope lifecycle\n setSubscription(createSubscription());\n });\n }, [Schema, contextManager, branchName, branchOwnerId]);\n\n return subscription.subscription as CoValueSubscription<S, R>;\n}\n\n/**\n * React hook for accessing the current user's account.\n *\n * This hook provides access to the current user's account profile and root data.\n * It automatically handles the subscription lifecycle and supports deep loading of nested\n * CoValues through resolve queries.\n *\n * The {@param options.select} function allows returning only specific parts of the account data,\n * which helps reduce unnecessary re-renders by narrowing down the returned data.\n * Additionally, you can provide a custom {@param options.equalityFn} to further optimize\n * performance by controlling when the component should re-render based on the selected data.\n *\n * @returns The account data, or an {@link NotLoaded} value. Use `$isLoaded` to check whether the\n * CoValue is loaded, or use {@link MaybeLoaded.$jazz.loadingState} to get the detailed loading state.\n * If a selector function is provided, returns the result of the selector function.\n *\n * @example\n * ```tsx\n * // Select only specific fields to reduce re-renders\n * const MyAppAccount = co.account({\n * profile: co.profile(),\n * root: co.map({\n * name: z.string(),\n * email: z.string(),\n * lastLogin: z.date(),\n * }),\n * });\n *\n * function UserProfile({ accountId }: { accountId: string }) {\n * // Only re-render when the profile name changes, not other fields\n * const profileName = useAccount(\n * MyAppAccount,\n * {\n * resolve: {\n * profile: true,\n * root: true,\n * },\n * select: (account) => account.$isLoaded ? account.profile.name : \"Loading...\",\n * }\n * );\n *\n * return <h1>{profileName}</h1>;\n * }\n * ```\n *\n * @example\n * ```tsx\n * // Deep loading with resolve queries\n * function ProjectListWithDetails() {\n * const me = useAccount(MyAppAccount, {\n * resolve: {\n * profile: true,\n * root: {\n * myProjects: {\n * $each: {\n * tasks: true,\n * },\n * },\n * },\n * },\n * });\n *\n * if (!me.$isLoaded) {\n * switch (me.$jazz.loadingState) {\n * case \"unauthorized\":\n * return \"Account not accessible\";\n * case \"unavailable\":\n * return \"Account not found\";\n * case \"loading\":\n * return \"Loading account...\";\n * }\n * }\n *\n * return (\n * <div>\n * <h1>{me.profile.name}'s projects</h1>\n * <ul>\n * {me.root.myProjects.map((project) => (\n * <li key={project.id}>\n * {project.name} ({project.tasks.length} tasks)\n * </li>\n * ))}\n * </ul>\n * </div>\n * );\n * }\n * ```\n *\n */\nexport function useAccount<\n A extends AccountClass<Account> | AnyAccountSchema,\n // @ts-expect-error we can't statically enforce the schema's resolve query is a valid resolve query, but in practice it is\n const R extends ResolveQuery<A> = SchemaResolveQuery<A>,\n TSelectorReturn = MaybeLoaded<Loaded<A, R>>,\n>(\n /** The account schema to use. Defaults to the base Account schema */\n AccountSchema: A = Account as unknown as A,\n /** Optional configuration for the subscription */\n options?: {\n /** Resolve query to specify which nested CoValues to load from the account */\n resolve?: ResolveQueryStrict<A, R>;\n /** Select which value to return from the account data */\n select?: (account: MaybeLoaded<Loaded<A, R>>) => TSelectorReturn;\n /** Equality function to determine if the selected value has changed, defaults to `Object.is` */\n equalityFn?: (a: TSelectorReturn, b: TSelectorReturn) => boolean;\n /**\n * Create or load a branch for isolated editing.\n *\n * Branching lets you take a snapshot of the current state and start modifying it without affecting the canonical/shared version.\n * It's a fork of your data graph: the same schema, but with diverging values.\n *\n * The checkout of the branch is applied on all the resolved values.\n *\n * @param name - A unique name for the branch. This identifies the branch\n * and can be used to switch between different branches of the same CoValue.\n * @param owner - The owner of the branch. Determines who can access and modify\n * the branch. If not provided, the branch is owned by the current user.\n *\n * For more info see the [branching](https://jazz.tools/docs/react/using-covalues/version-control) documentation.\n */\n unstable_branch?: BranchDefinition;\n },\n): TSelectorReturn {\n const subscription = useAccountSubscription(AccountSchema, options);\n const getCurrentValue = useGetCurrentValue(subscription);\n\n return useSyncExternalStoreWithSelector<\n MaybeLoaded<Loaded<A, R>>,\n TSelectorReturn\n >(\n React.useCallback(\n (callback) => {\n if (!subscription) {\n return () => {};\n }\n\n return subscription.subscribe(callback);\n },\n [subscription],\n ),\n getCurrentValue,\n getCurrentValue,\n options?.select ?? ((value) => value as TSelectorReturn),\n options?.equalityFn ?? Object.is,\n );\n}\n\nexport function useSuspenseAccount<\n A extends AccountClass<Account> | AnyAccountSchema,\n // @ts-expect-error we can't statically enforce the schema's resolve query is a valid resolve query, but in practice it is\n const R extends ResolveQuery<A> = SchemaResolveQuery<A>,\n TSelectorReturn = Loaded<A, R>,\n>(\n /** The account schema to use. Defaults to the base Account schema */\n AccountSchema: A = Account as unknown as A,\n /** Optional configuration for the subscription */\n options?: {\n /** Resolve query to specify which nested CoValues to load from the account */\n resolve?: ResolveQueryStrict<A, R>;\n /** Select which value to return from the account data */\n select?: (account: Loaded<A, R>) => TSelectorReturn;\n /** Equality function to determine if the selected value has changed, defaults to `Object.is` */\n equalityFn?: (a: TSelectorReturn, b: TSelectorReturn) => boolean;\n /**\n * Create or load a branch for isolated editing.\n *\n * Branching lets you take a snapshot of the current state and start modifying it without affecting the canonical/shared version.\n * It's a fork of your data graph: the same schema, but with diverging values.\n *\n * The checkout of the branch is applied on all the resolved values.\n *\n * @param name - A unique name for the branch. This identifies the branch\n * and can be used to switch between different branches of the same CoValue.\n * @param owner - The owner of the branch. Determines who can access and modify\n * the branch. If not provided, the branch is owned by the current user.\n *\n * For more info see the [branching](https://jazz.tools/docs/react/using-covalues/version-control) documentation.\n */\n unstable_branch?: BranchDefinition;\n },\n): TSelectorReturn {\n const subscription = useAccountSubscription(AccountSchema, options);\n\n if (!subscription) {\n throw new Error(\n \"Subscription not found, are you using useSuspenseAccount in guest mode?\",\n );\n }\n\n use(subscription.getPromise());\n\n const getCurrentValue = () => {\n const value = subscription.getCurrentValue();\n\n if (!value.$isLoaded) {\n throw new Error(\"Account must be loaded in a suspense context\");\n }\n\n return value;\n };\n\n return useSyncExternalStoreWithSelector<Loaded<A, R>, TSelectorReturn>(\n React.useCallback(\n (callback) => {\n if (!subscription) {\n return () => {};\n }\n\n return subscription.subscribe(callback);\n },\n [subscription],\n ),\n getCurrentValue,\n getCurrentValue,\n options?.select ?? ((value) => value as TSelectorReturn),\n options?.equalityFn ?? Object.is,\n );\n}\n\n/**\n * Returns a function for logging out of the current account.\n */\nexport function useLogOut(): () => void {\n const contextManager = useJazzContextManager();\n return contextManager.logOut;\n}\n\n/**\n * React hook for accessing the current agent. An agent can either be:\n * - an Authenticated Account, if the user is logged in\n * - an Anonymous Account, if the user didn't log in\n * - or an anonymous agent, if in guest mode\n *\n * The agent can be used as the `loadAs` parameter for load and subscribe methods.\n */\nexport function useAgent<\n A extends AccountClass<Account> | AnyAccountSchema = typeof Account,\n>(): AnonymousJazzAgent | Loaded<A, true> {\n const contextManager = useJazzContextManager<InstanceOfSchema<A>>();\n\n const getCurrentValue = () =>\n getCurrentAccountFromContextManager(contextManager) as\n | AnonymousJazzAgent\n | Loaded<A, true>;\n\n return React.useSyncExternalStore(\n useCallback(\n (callback) => {\n return contextManager.subscribe(callback);\n },\n [contextManager],\n ),\n getCurrentValue,\n getCurrentValue,\n );\n}\n\nexport function experimental_useInboxSender<\n I extends CoValue,\n O extends CoValue | undefined,\n>(inboxOwnerID: string | undefined) {\n const context = useJazzContext();\n\n if (!(\"me\" in context)) {\n throw new Error(\n \"useInboxSender can't be used in a JazzProvider with auth === 'guest'.\",\n );\n }\n\n const me = context.me;\n const inboxRef = useRef<Promise<InboxSender<I, O>> | undefined>(undefined);\n\n const sendMessage = useCallback(\n async (message: I) => {\n if (!inboxOwnerID) throw new Error(\"Inbox owner ID is required\");\n\n if (!inboxRef.current) {\n const inbox = InboxSender.load<I, O>(inboxOwnerID, me);\n inboxRef.current = inbox;\n }\n\n let inbox = await inboxRef.current;\n\n // Regenerate the InboxSender if the inbox owner or current account changes\n if (inbox.owner.id !== inboxOwnerID || inbox.currentAccount !== me) {\n const req = InboxSender.load<I, O>(inboxOwnerID, me);\n inboxRef.current = req;\n inbox = await req;\n }\n\n return inbox.sendMessage(message);\n },\n [inboxOwnerID, me.$jazz.id],\n );\n\n return sendMessage;\n}\n\n/**\n * Hook that returns the current connection status to the Jazz sync server.\n *\n * @returns `true` when connected to the server, `false` when disconnected\n *\n * @remarks\n * On connection drop, this hook will return `false` only when Jazz detects the disconnection\n * after 5 seconds of not receiving a ping from the server.\n */\nexport function useSyncConnectionStatus() {\n const context = useJazzContext();\n\n const connected = useSyncExternalStore(\n useCallback(\n (callback) => {\n return context.addConnectionListener(callback);\n },\n [context],\n ),\n () => context.connected(),\n () => context.connected(),\n );\n\n return connected;\n}\n\nfunction getResolveQuery(\n Schema: CoValueClassOrSchema,\n // We don't need type validation here, since this is an internal API\n resolveQuery?: ResolveQuery<any>,\n): ResolveQuery<any> {\n if (resolveQuery) {\n return resolveQuery;\n }\n // Check the schema is a CoValue schema (and not a CoValue class)\n if (\"resolveQuery\" in Schema) {\n return Schema.resolveQuery;\n }\n return true;\n}\n","import { Account, JazzContextManager } from \"jazz-tools\";\n\nexport function getCurrentAccountFromContextManager<Acc extends Account>(\n contextManager: JazzContextManager<Acc, any>,\n) {\n const context = contextManager.getCurrentValue();\n\n if (!context) {\n throw new Error(\"No context found\");\n }\n\n return \"me\" in context ? context.me : context.guest;\n}\n\nexport function subscribeToContextManager<Acc extends Account>(\n contextManager: JazzContextManager<Acc, any>,\n callback: () => () => void,\n) {\n let unsub = () => {};\n\n const handler = () => {\n unsub();\n unsub = callback();\n };\n\n handler();\n return contextManager.subscribe(handler);\n}\n","import React from \"react\";\n\n// shim from https://github.com/pmndrs/jotai/blob/f287c5d665a807e676bc731e83174c62c1fe1fc9/src/react/useAtomValue.ts#L13C1-L56C1\nconst attachPromiseStatus = <T>(\n promise: PromiseLike<T> & {\n status?: \"pending\" | \"fulfilled\" | \"rejected\";\n value?: T;\n reason?: unknown;\n },\n) => {\n if (!promise.status) {\n promise.status = \"pending\";\n promise.then(\n (v) => {\n promise.status = \"fulfilled\";\n promise.value = v;\n },\n (e) => {\n promise.status = \"rejected\";\n promise.reason = e;\n },\n );\n }\n};\n\nexport const use =\n React.use ||\n // A shim for older React versions\n (<T>(\n promise: PromiseLike<T> & {\n status?: \"pending\" | \"fulfilled\" | \"rejected\";\n value?: T;\n reason?: unknown;\n },\n ): T => {\n if (promise.status === \"pending\") {\n throw promise;\n } else if (promise.status === \"fulfilled\") {\n return promise.value as T;\n } else if (promise.status === \"rejected\") {\n throw promise.reason;\n } else {\n attachPromiseStatus(promise);\n throw promise;\n }\n });\n","import React from \"react\";\nimport {\n Account,\n AccountClass,\n AnyAccountSchema,\n CoValueClassOrSchema,\n CoValueLoadingState,\n Loaded,\n MaybeLoaded,\n ResolveQuery,\n ResolveQueryStrict,\n} from \"jazz-tools\";\nimport {\n useAccountSubscription,\n useCoValueSubscription,\n useSubscriptionSelector,\n} from \"./hooks.js\";\nimport type { CoValueSubscription } from \"./types.js\";\n\nexport function createCoValueSubscriptionContext<\n S extends CoValueClassOrSchema,\n const R extends ResolveQuery<S> = true,\n>(schema: S, resolve?: ResolveQueryStrict<S, R>) {\n const Context = React.createContext<CoValueSubscription<S, R>>(null);\n\n return {\n Provider: ({\n id,\n options,\n loadingFallback,\n unavailableFallback,\n children,\n }: React.PropsWithChildren<{\n id: string | undefined | null;\n options?: Omit<\n Parameters<typeof useCoValueSubscription<S, R>>[2],\n \"resolve\"\n >;\n loadingFallback?: React.ReactNode;\n unavailableFallback?: React.ReactNode;\n }>) => {\n const subscription = useCoValueSubscription(schema, id, {\n ...options,\n resolve: resolve,\n });\n\n const loadState = useSubscriptionSelector(subscription, {\n select: (value) => value.$jazz.loadingState,\n });\n\n if (loadState === CoValueLoadingState.LOADING) {\n return loadingFallback ?? null;\n }\n if (\n loadState === CoValueLoadingState.UNAUTHORIZED ||\n loadState === CoValueLoadingState.UNAVAILABLE\n ) {\n return unavailableFallback ?? null;\n }\n\n return (\n <Context.Provider value={subscription}>{children}</Context.Provider>\n );\n },\n useSelector: <TSelectorReturn = Loaded<S, R>>(options?: {\n select?: (value: Loaded<S, R>) => TSelectorReturn;\n equalityFn?: (a: TSelectorReturn, b: TSelectorReturn) => boolean;\n }) => {\n const subscription = React.useContext(Context);\n\n if (!subscription) {\n throw new Error(\n \"useSelector must be used within a coValue subscription provider\",\n );\n }\n\n return useSubscriptionSelector<S, R, TSelectorReturn>(\n subscription,\n options as Parameters<\n typeof useSubscriptionSelector<S, R, TSelectorReturn>\n >[1],\n );\n },\n };\n}\n\nexport function createAccountSubscriptionContext<\n A extends AccountClass<Account> | AnyAccountSchema,\n const R extends ResolveQuery<A> = true,\n>(schema: A, resolve?: ResolveQueryStrict<A, R>) {\n const Context = React.createContext<CoValueSubscription<A, R>>(null);\n\n return {\n Provider: ({\n options,\n loadingFallback,\n unavailableFallback,\n children,\n }: React.PropsWithChildren<{\n options?: Omit<\n Parameters<typeof useAccountSubscription<A, R>>[1],\n \"resolve\"\n >;\n loadingFallback?: React.ReactNode;\n unavailableFallback?: React.ReactNode;\n }>) => {\n const subscription = useAccountSubscription(schema, {\n ...options,\n resolve: resolve,\n });\n\n const loadState = useSubscriptionSelector(subscription, {\n select: (value) => value.$jazz.loadingState,\n });\n\n if (loadState === CoValueLoadingState.LOADING) {\n return loadingFallback ?? null;\n }\n\n if (\n loadState === CoValueLoadingState.UNAUTHORIZED ||\n loadState === CoValueLoadingState.UNAVAILABLE\n ) {\n return unavailableFallback ?? null;\n }\n\n return (\n <Context.Provider value={subscription}>{children}</Context.Provider>\n );\n },\n useSelector: <TSelectorReturn = Loaded<A, R>>(options?: {\n select?: (value: Loaded<A, R>) => TSelectorReturn;\n equalityFn?: (a: TSelectorReturn, b: TSelectorReturn) => boolean;\n }) => {\n const subscription = React.useContext(Context);\n\n if (!subscription) {\n throw new Error(\n \"useSelector must be used within an account subscription provider\",\n );\n }\n\n return useSubscriptionSelector<A, R, TSelectorReturn>(\n subscription,\n options as Parameters<\n typeof useSubscriptionSelector<A, R, TSelectorReturn>\n >[1],\n );\n },\n };\n}\n","import { DemoAuth } from \"jazz-tools\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { useAuthSecretStorage, useJazzContext } from \"../hooks.js\";\nimport { useIsAuthenticated } from \"../hooks.js\";\n\n/**\n * `useDemoAuth` is a hook that provides a `JazzAuth` object for demo authentication.\n *\n *\n * ```ts\n * const { state, logIn, signUp, existingUsers } = useDemoAuth();\n * ```\n *\n * @category Auth Providers\n */\nexport function useDemoAuth() {\n const context = useJazzContext();\n const authSecretStorage = useAuthSecretStorage();\n\n if (\"guest\" in context) {\n throw new Error(\"Demo auth is not supported in guest mode\");\n }\n\n const authMethod = useMemo(() => {\n return new DemoAuth(context.authenticate, authSecretStorage);\n }, []);\n\n const isAuthenticated = useIsAuthenticated();\n const [existingUsers, setExistingUsers] = useState<string[]>([]);\n\n useEffect(() => {\n authMethod.getExistingUsers().then(setExistingUsers);\n }, [authMethod]);\n\n function handleSignUp(username: string) {\n return authMethod.signUp(username).then(() => {\n setExistingUsers(existingUsers.concat([username]));\n });\n }\n\n return {\n state: isAuthenticated ? \"signedIn\" : \"anonymous\",\n logIn: authMethod.logIn,\n signUp: handleSignUp,\n existingUsers,\n } as const;\n}\n","import { PassphraseAuth } from \"jazz-tools\";\nimport { useCallback, useMemo, useSyncExternalStore } from \"react\";\nimport { useAuthSecretStorage, useJazzContext } from \"../hooks.js\";\nimport { useIsAuthenticated } from \"../hooks.js\";\n\n/**\n * `usePassphraseAuth` hook provides a `JazzAuth` object for passphrase authentication.\n *\n * @example\n * ```ts\n * const auth = usePassphraseAuth({ appName, appHostname, wordlist });\n * ```\n *\n * @category Auth Providers\n */\nexport function usePassphraseAuth({ wordlist }: { wordlist: string[] }) {\n const context = useJazzContext();\n const authSecretStorage = useAuthSecretStorage();\n\n if (\"guest\" in context) {\n throw new Error(\"Passphrase auth is not supported in guest mode\");\n }\n\n const authMethod = useMemo(() => {\n return new PassphraseAuth(\n context.node.crypto,\n context.authenticate,\n context.register,\n authSecretStorage,\n wordlist,\n );\n }, [wordlist]);\n\n const passphrase = useSyncExternalStore(\n useCallback(\n (callback) => {\n authMethod.loadCurrentAccountPassphrase();\n return authMethod.subscribe(callback);\n },\n [authMethod],\n ),\n () => authMethod.passphrase,\n );\n\n const isAuthenticated = useIsAuthenticated();\n return {\n state: isAuthenticated ? \"signedIn\" : \"anonymous\",\n logIn: authMethod.logIn,\n signUp: authMethod.signUp,\n registerNewAccount: authMethod.registerNewAccount,\n generateRandomPassphrase: authMethod.generateRandomPassphrase,\n passphrase,\n } as const;\n}\n"],"mappings":"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","names":["React","React","subscription","value","inbox","React","CoValueLoadingState","React","CoValueLoadingState","useMemo","useMemo","useCallback","useMemo","useSyncExternalStore","useMemo","useSyncExternalStore","useCallback"]}
|
|
1
|
+
{"version":3,"sources":["../../src/react-core/hooks.ts","../../src/react-core/utils.ts","../../src/react-core/use.ts","../../src/react-core/subscription-provider.tsx","../../src/react-core/auth/DemoAuth.tsx","../../src/react-core/auth/PassphraseAuth.tsx"],"sourcesContent":["import { useSyncExternalStoreWithSelector } from \"use-sync-external-store/shim/with-selector\";\nimport React, {\n useCallback,\n useContext,\n useMemo,\n useRef,\n useSyncExternalStore,\n} from \"react\";\n\nimport {\n Account,\n AccountClass,\n AnonymousJazzAgent,\n AnyAccountSchema,\n CoValue,\n CoValueClassOrSchema,\n CoValueLoadingState,\n ExportedCoValue,\n InboxSender,\n InstanceOfSchema,\n JazzContextManager,\n JazzContextType,\n Loaded,\n MaybeLoaded,\n NotLoaded,\n RefsToResolve,\n ResolveQuery,\n ResolveQueryStrict,\n SchemaResolveQuery,\n SubscriptionScope,\n importContentPieces,\n captureStack,\n getUnloadedCoValueWithoutId,\n type BranchDefinition,\n} from \"jazz-tools\";\nimport { JazzContext, JazzContextManagerContext } from \"./provider.js\";\nimport { getCurrentAccountFromContextManager } from \"./utils.js\";\nimport { CoValueSubscription } from \"./types.js\";\nimport { use } from \"./use.js\";\n\nexport function useJazzContext<Acc extends Account>() {\n const value = useContext(JazzContext) as JazzContextType<Acc>;\n\n if (!value) {\n throw new Error(\n \"You need to set up a JazzProvider on top of your app to use this hook.\",\n );\n }\n\n return value;\n}\n\nexport function useJazzContextManager<Acc extends Account>() {\n const value = useContext(JazzContextManagerContext) as JazzContextManager<\n Acc,\n {}\n >;\n\n if (!value) {\n throw new Error(\n \"You need to set up a JazzProvider on top of your app to use this hook.\",\n );\n }\n\n return value;\n}\n\nexport function useAuthSecretStorage() {\n const value = useContext(JazzContextManagerContext);\n\n if (!value) {\n throw new Error(\n \"You need to set up a JazzProvider on top of your app to use this useAuthSecretStorage.\",\n );\n }\n\n return value.getAuthSecretStorage();\n}\n\nexport function useIsAuthenticated() {\n const authSecretStorage = useAuthSecretStorage();\n\n return useSyncExternalStore(\n useCallback(\n (callback) => {\n return authSecretStorage.onUpdate(callback);\n },\n [authSecretStorage],\n ),\n () => authSecretStorage.isAuthenticated,\n () => authSecretStorage.isAuthenticated,\n );\n}\n\nexport function useCoValueSubscription<\n S extends CoValueClassOrSchema,\n // @ts-expect-error we can't statically enforce the schema's resolve query is a valid resolve query, but in practice it is\n const R extends ResolveQuery<S> = SchemaResolveQuery<S>,\n>(\n Schema: S,\n id: string | undefined | null,\n options?: {\n resolve?: ResolveQueryStrict<S, R>;\n unstable_branch?: BranchDefinition;\n },\n) {\n const contextManager = useJazzContextManager();\n const agent = useAgent();\n\n const callerStack = React.useRef<Error | undefined>(undefined);\n\n if (!callerStack.current) {\n callerStack.current = captureStack();\n }\n\n const createSubscription = () => {\n if (!id) {\n return {\n subscription: null,\n contextManager,\n id,\n Schema,\n };\n }\n\n if (options?.unstable_branch?.owner === null) {\n return {\n subscription: null,\n contextManager,\n id,\n Schema,\n };\n }\n\n const resolve = getResolveQuery(Schema, options?.resolve);\n\n const node = contextManager.getCurrentValue()!.node;\n const cache = contextManager.getSubscriptionScopeCache();\n const subscription = cache.getOrCreate(\n node,\n Schema,\n id,\n resolve,\n false,\n false,\n options?.unstable_branch,\n );\n\n // Set callerStack on returned subscription after retrieval\n if (callerStack.current) {\n subscription.callerStack = callerStack.current;\n }\n\n return {\n value: subscription,\n contextManager,\n id,\n Schema,\n branchName: options?.unstable_branch?.name,\n branchOwnerId: options?.unstable_branch?.owner?.$jazz.id,\n agent,\n };\n };\n\n const subscriptionRef = React.useRef<null | ReturnType<\n typeof createSubscription\n >>(null);\n\n if (!subscriptionRef.current) {\n subscriptionRef.current = createSubscription();\n }\n\n const branchName = options?.unstable_branch?.name;\n const branchOwnerId = options?.unstable_branch?.owner?.$jazz.id;\n\n let subscription = subscriptionRef.current;\n\n // Check if the subscription needs to be updated\n // because one of the dependencies has changed\n if (\n subscription.contextManager !== contextManager ||\n subscription.id !== id ||\n subscription.Schema !== Schema ||\n subscription.branchName !== branchName ||\n subscription.branchOwnerId !== branchOwnerId ||\n subscription.agent !== agent\n ) {\n subscriptionRef.current = createSubscription();\n subscription = subscriptionRef.current;\n }\n\n // Subscribe to the context manager to react to auth changes\n return subscription.value as CoValueSubscription<S, R>;\n}\n\nfunction useImportCoValueContent<V>(\n id: string | undefined | null,\n content?: ExportedCoValue<V>,\n) {\n const agent = useAgent();\n const preloadExecuted = useRef<typeof agent | null>(null);\n if (content && preloadExecuted.current !== agent && id) {\n if (content.id === id) {\n importContentPieces(content.contentPieces, agent);\n } else {\n console.warn(\"Preloaded value ID does not match the subscription ID\");\n }\n\n preloadExecuted.current = agent;\n }\n}\n\nfunction useGetCurrentValue<C extends CoValue>(\n subscription: SubscriptionScope<C> | null,\n) {\n return useCallback(() => {\n if (!subscription) {\n return getUnloadedCoValueWithoutId(CoValueLoadingState.UNAVAILABLE);\n }\n\n return subscription.getCurrentValue();\n }, [subscription]);\n}\n\n/**\n * React hook for subscribing to CoValues and handling loading states.\n *\n * This hook provides a convenient way to subscribe to CoValues and automatically\n * handles the subscription lifecycle (subscribe on mount, unsubscribe on unmount).\n * It also supports deep loading of nested CoValues through resolve queries.\n *\n * The {@param options.select} function allows returning only specific parts of the CoValue data,\n * which helps reduce unnecessary re-renders by narrowing down the returned data.\n * Additionally, you can provide a custom {@param options.equalityFn} to further optimize\n * performance by controlling when the component should re-render based on the selected data.\n *\n * @returns The loaded CoValue, or an {@link NotLoaded} value. Use `$isLoaded` to check whether the\n * CoValue is loaded, or use {@link MaybeLoaded.$jazz.loadingState} to get the detailed loading state.\n * If a selector function is provided, returns the result of the selector function.\n *\n * @example\n * ```tsx\n * // Select only specific fields to reduce re-renders\n * const Project = co.map({\n * name: z.string(),\n * description: z.string(),\n * tasks: co.list(Task),\n * lastModified: z.date(),\n * });\n *\n * function ProjectTitle({ projectId }: { projectId: string }) {\n * // Only re-render when the project name changes, not other fields\n * const projectName = useCoState(\n * Project,\n * projectId,\n * {\n * select: (project) => !project.$isLoading ? project.name : \"Loading...\",\n * }\n * );\n *\n * return <h1>{projectName}</h1>;\n * }\n * ```\n *\n * @example\n * ```tsx\n * // Deep loading with resolve queries\n * const Project = co.map({\n * name: z.string(),\n * tasks: co.list(Task),\n * owner: TeamMember,\n * });\n *\n * function ProjectView({ projectId }: { projectId: string }) {\n * const project = useCoState(Project, projectId, {\n * resolve: {\n * tasks: { $each: true },\n * owner: true,\n * },\n * });\n *\n * if (!project.$isLoaded) {\n * switch (project.$jazz.loadingState) {\n * case \"unauthorized\":\n * return \"Project not accessible\";\n * case \"unavailable\":\n * return \"Project not found\";\n * case \"loading\":\n * return \"Loading project...\";\n * }\n * }\n *\n * return (\n * <div>\n * <h1>{project.name}</h1>\n * <p>Owner: {project.owner.name}</p>\n * <ul>\n * {project.tasks.map((task) => (\n * <li key={task.id}>{task.title}</li>\n * ))}\n * </ul>\n * </div>\n * );\n * }\n * ```\n *\n * @example\n * ```tsx\n * // Using with optional references and error handling\n * const Task = co.map({\n * title: z.string(),\n * assignee: co.optional(TeamMember),\n * subtasks: co.list(Task),\n * });\n *\n * function TaskDetail({ taskId }: { taskId: string }) {\n * const task = useCoState(Task, taskId, {\n * resolve: {\n * assignee: true,\n * subtasks: { $each: { $onError: 'catch' } },\n * },\n * });\n *\n * if (!task.$isLoaded) {\n * switch (task.$jazz.loadingState) {\n * case \"unauthorized\":\n * return \"Task not accessible\";\n * case \"unavailable\":\n * return \"Task not found\";\n * case \"loading\":\n * return \"Loading task...\";\n * }\n * }\n *\n * return (\n * <div>\n * <h2>{task.title}</h2>\n * {task.assignee && <p>Assigned to: {task.assignee.name}</p>}\n * <ul>\n * {task.subtasks.map((subtask, index) => (\n * subtask.$isLoaded ? <li key={subtask.id}>{subtask.title}</li> : <li key={index}>Inaccessible subtask</li>\n * ))}\n * </ul>\n * </div>\n * );\n * }\n * ```\n *\n * @example\n * ```tsx\n * // Use custom equality function for complex data structures\n * const TaskList = co.list(Task);\n *\n * function TaskCount({ listId }: { listId: string }) {\n * const taskStats = useCoState(\n * TaskList,\n * listId,\n * {\n * resolve: { $each: true },\n * select: (tasks) => {\n * if (!tasks.$isLoaded) return { total: 0, completed: 0 };\n * return {\n * total: tasks.length,\n * completed: tasks.filter(task => task.completed).length,\n * };\n * },\n * // Custom equality to prevent re-renders when stats haven't changed\n * equalityFn: (a, b) => a.total === b.total && a.completed === b.completed,\n * }\n * );\n *\n * return (\n * <div>\n * {taskStats.completed} of {taskStats.total} tasks completed\n * </div>\n * );\n * }\n * ```\n *\n * For more examples, see the [subscription and deep loading](https://jazz.tools/docs/react/using-covalues/subscription-and-loading) documentation.\n */\nexport function useCoState<\n S extends CoValueClassOrSchema,\n // @ts-expect-error we can't statically enforce the schema's resolve query is a valid resolve query, but in practice it is\n const R extends ResolveQuery<S> = SchemaResolveQuery<S>,\n TSelectorReturn = MaybeLoaded<Loaded<S, R>>,\n>(\n /** The CoValue schema or class constructor */\n Schema: S,\n /** The ID of the CoValue to subscribe to. If `undefined`, returns an `unavailable` value */\n id: string | undefined,\n /** Optional configuration for the subscription */\n options?: {\n /** Resolve query to specify which nested CoValues to load */\n resolve?: ResolveQueryStrict<S, R>;\n /** Select which value to return */\n select?: (value: MaybeLoaded<Loaded<S, R>>) => TSelectorReturn;\n /** Equality function to determine if the selected value has changed, defaults to `Object.is` */\n equalityFn?: (a: TSelectorReturn, b: TSelectorReturn) => boolean;\n /**\n * Create or load a branch for isolated editing.\n *\n * Branching lets you take a snapshot of the current state and start modifying it without affecting the canonical/shared version.\n * It's a fork of your data graph: the same schema, but with diverging values.\n *\n * The checkout of the branch is applied on all the resolved values.\n *\n * @param name - A unique name for the branch. This identifies the branch\n * and can be used to switch between different branches of the same CoValue.\n * @param owner - The owner of the branch. Determines who can access and modify\n * the branch. If not provided, the branch is owned by the current user.\n *\n * For more info see the [branching](https://jazz.tools/docs/react/using-covalues/version-control) documentation.\n */\n unstable_branch?: BranchDefinition;\n preloaded?: ExportedCoValue<Loaded<S, R>>;\n },\n): TSelectorReturn {\n useImportCoValueContent(id, options?.preloaded);\n\n const subscription = useCoValueSubscription(Schema, id, options);\n const getCurrentValue = useGetCurrentValue(subscription);\n\n const value = useSyncExternalStoreWithSelector<\n MaybeLoaded<Loaded<S, R>>,\n TSelectorReturn\n >(\n React.useCallback(\n (callback) => {\n if (!subscription) {\n return () => {};\n }\n\n return subscription.subscribe(callback);\n },\n [subscription],\n ),\n getCurrentValue,\n getCurrentValue,\n options?.select ?? ((value) => value as TSelectorReturn),\n options?.equalityFn ?? Object.is,\n );\n\n return value;\n}\n\nexport function useSuspenseCoState<\n S extends CoValueClassOrSchema,\n // @ts-expect-error we can't statically enforce the schema's resolve query is a valid resolve query, but in practice it is\n const R extends ResolveQuery<S> = SchemaResolveQuery<S>,\n TSelectorReturn = Loaded<S, R>,\n>(\n /** The CoValue schema or class constructor */\n Schema: S,\n /** The ID of the CoValue to subscribe to */\n id: string,\n /** Optional configuration for the subscription */\n options?: {\n /** Resolve query to specify which nested CoValues to load */\n resolve?: ResolveQueryStrict<S, R>;\n /** Select which value to return */\n select?: (value: Loaded<S, R>) => TSelectorReturn;\n /** Equality function to determine if the selected value has changed, defaults to `Object.is` */\n equalityFn?: (a: TSelectorReturn, b: TSelectorReturn) => boolean;\n /**\n * Create or load a branch for isolated editing.\n *\n * Branching lets you take a snapshot of the current state and start modifying it without affecting the canonical/shared version.\n * It's a fork of your data graph: the same schema, but with diverging values.\n *\n * The checkout of the branch is applied on all the resolved values.\n *\n * @param name - A unique name for the branch. This identifies the branch\n * and can be used to switch between different branches of the same CoValue.\n * @param owner - The owner of the branch. Determines who can access and modify\n * the branch. If not provided, the branch is owned by the current user.\n *\n * For more info see the [branching](https://jazz.tools/docs/react/using-covalues/version-control) documentation.\n */\n unstable_branch?: BranchDefinition;\n preloaded?: ExportedCoValue<Loaded<S, R>>;\n },\n): TSelectorReturn {\n useImportCoValueContent(id, options?.preloaded);\n\n const subscription = useCoValueSubscription(Schema, id, options);\n\n if (!subscription) {\n throw new Error(\"Subscription not found\");\n }\n\n use(subscription.getCachedPromise());\n\n const getCurrentValue = () => {\n const value = subscription.getCurrentValue();\n\n if (!value.$isLoaded) {\n throw new Error(\"CoValue must be loaded in a suspense context\");\n }\n\n return value;\n };\n\n const value = useSyncExternalStoreWithSelector<Loaded<S, R>, TSelectorReturn>(\n React.useCallback(\n (callback) => {\n return subscription.subscribe(callback);\n },\n [subscription],\n ),\n getCurrentValue,\n getCurrentValue,\n options?.select ?? ((value) => value as TSelectorReturn),\n options?.equalityFn ?? Object.is,\n );\n\n return value;\n}\n\nexport function useSubscriptionSelector<\n S extends CoValueClassOrSchema,\n // @ts-expect-error we can't statically enforce the schema's resolve query is a valid resolve query, but in practice it is\n const R extends ResolveQuery<S> = SchemaResolveQuery<S>,\n TSelectorReturn = MaybeLoaded<Loaded<S, R>>,\n>(\n subscription: CoValueSubscription<S, R>,\n options?: {\n select?: (value: MaybeLoaded<Loaded<S, R>>) => TSelectorReturn;\n equalityFn?: (a: TSelectorReturn, b: TSelectorReturn) => boolean;\n },\n) {\n const getCurrentValue = useGetCurrentValue(subscription);\n\n return useSyncExternalStoreWithSelector<\n MaybeLoaded<Loaded<S, R>>,\n TSelectorReturn\n >(\n React.useCallback(\n (callback) => {\n if (!subscription) {\n return () => {};\n }\n\n return subscription.subscribe(callback);\n },\n [subscription],\n ),\n getCurrentValue,\n getCurrentValue,\n options?.select ?? ((value) => value as TSelectorReturn),\n options?.equalityFn ?? Object.is,\n );\n}\n\nexport function useAccountSubscription<\n S extends AccountClass<Account> | AnyAccountSchema,\n // @ts-expect-error we can't statically enforce the schema's resolve query is a valid resolve query, but in practice it is\n const R extends ResolveQuery<S> = SchemaResolveQuery<S>,\n>(\n Schema: S,\n options?: {\n resolve?: ResolveQueryStrict<S, R>;\n unstable_branch?: BranchDefinition;\n },\n) {\n const contextManager = useJazzContextManager();\n\n // Capture stack trace at hook call time\n const callerStack = React.useRef<Error | undefined>(undefined);\n if (!callerStack.current) {\n callerStack.current = captureStack();\n }\n\n const createSubscription = () => {\n const agent = getCurrentAccountFromContextManager(contextManager);\n\n if (agent.$type$ === \"Anonymous\") {\n return {\n subscription: null,\n contextManager,\n agent,\n };\n }\n\n const resolve = getResolveQuery(Schema, options?.resolve);\n\n const node = contextManager.getCurrentValue()!.node;\n const cache = contextManager.getSubscriptionScopeCache();\n const subscription = cache.getOrCreate(\n node,\n Schema,\n agent.$jazz.id,\n resolve,\n false,\n false,\n options?.unstable_branch,\n );\n\n // Set callerStack on returned subscription after retrieval\n if (callerStack.current) {\n subscription.callerStack = callerStack.current;\n }\n\n return {\n subscription,\n contextManager,\n Schema,\n branchName: options?.unstable_branch?.name,\n branchOwnerId: options?.unstable_branch?.owner?.$jazz.id,\n };\n };\n\n const [subscription, setSubscription] = React.useState(createSubscription);\n\n const branchName = options?.unstable_branch?.name;\n const branchOwnerId = options?.unstable_branch?.owner?.$jazz.id;\n\n React.useLayoutEffect(() => {\n if (\n subscription.contextManager !== contextManager ||\n subscription.Schema !== Schema ||\n subscription.branchName !== options?.unstable_branch?.name ||\n subscription.branchOwnerId !== options?.unstable_branch?.owner?.$jazz.id\n ) {\n // No need to manually destroy - cache handles cleanup via SubscriptionScope lifecycle\n setSubscription(createSubscription());\n }\n\n return contextManager.subscribe(() => {\n // No need to manually destroy - cache handles cleanup via SubscriptionScope lifecycle\n setSubscription(createSubscription());\n });\n }, [Schema, contextManager, branchName, branchOwnerId]);\n\n return subscription.subscription as CoValueSubscription<S, R>;\n}\n\n/**\n * React hook for accessing the current user's account.\n *\n * This hook provides access to the current user's account profile and root data.\n * It automatically handles the subscription lifecycle and supports deep loading of nested\n * CoValues through resolve queries.\n *\n * The {@param options.select} function allows returning only specific parts of the account data,\n * which helps reduce unnecessary re-renders by narrowing down the returned data.\n * Additionally, you can provide a custom {@param options.equalityFn} to further optimize\n * performance by controlling when the component should re-render based on the selected data.\n *\n * @returns The account data, or an {@link NotLoaded} value. Use `$isLoaded` to check whether the\n * CoValue is loaded, or use {@link MaybeLoaded.$jazz.loadingState} to get the detailed loading state.\n * If a selector function is provided, returns the result of the selector function.\n *\n * @example\n * ```tsx\n * // Select only specific fields to reduce re-renders\n * const MyAppAccount = co.account({\n * profile: co.profile(),\n * root: co.map({\n * name: z.string(),\n * email: z.string(),\n * lastLogin: z.date(),\n * }),\n * });\n *\n * function UserProfile({ accountId }: { accountId: string }) {\n * // Only re-render when the profile name changes, not other fields\n * const profileName = useAccount(\n * MyAppAccount,\n * {\n * resolve: {\n * profile: true,\n * root: true,\n * },\n * select: (account) => account.$isLoaded ? account.profile.name : \"Loading...\",\n * }\n * );\n *\n * return <h1>{profileName}</h1>;\n * }\n * ```\n *\n * @example\n * ```tsx\n * // Deep loading with resolve queries\n * function ProjectListWithDetails() {\n * const me = useAccount(MyAppAccount, {\n * resolve: {\n * profile: true,\n * root: {\n * myProjects: {\n * $each: {\n * tasks: true,\n * },\n * },\n * },\n * },\n * });\n *\n * if (!me.$isLoaded) {\n * switch (me.$jazz.loadingState) {\n * case \"unauthorized\":\n * return \"Account not accessible\";\n * case \"unavailable\":\n * return \"Account not found\";\n * case \"loading\":\n * return \"Loading account...\";\n * }\n * }\n *\n * return (\n * <div>\n * <h1>{me.profile.name}'s projects</h1>\n * <ul>\n * {me.root.myProjects.map((project) => (\n * <li key={project.id}>\n * {project.name} ({project.tasks.length} tasks)\n * </li>\n * ))}\n * </ul>\n * </div>\n * );\n * }\n * ```\n *\n */\nexport function useAccount<\n A extends AccountClass<Account> | AnyAccountSchema,\n // @ts-expect-error we can't statically enforce the schema's resolve query is a valid resolve query, but in practice it is\n const R extends ResolveQuery<A> = SchemaResolveQuery<A>,\n TSelectorReturn = MaybeLoaded<Loaded<A, R>>,\n>(\n /** The account schema to use. Defaults to the base Account schema */\n AccountSchema: A = Account as unknown as A,\n /** Optional configuration for the subscription */\n options?: {\n /** Resolve query to specify which nested CoValues to load from the account */\n resolve?: ResolveQueryStrict<A, R>;\n /** Select which value to return from the account data */\n select?: (account: MaybeLoaded<Loaded<A, R>>) => TSelectorReturn;\n /** Equality function to determine if the selected value has changed, defaults to `Object.is` */\n equalityFn?: (a: TSelectorReturn, b: TSelectorReturn) => boolean;\n /**\n * Create or load a branch for isolated editing.\n *\n * Branching lets you take a snapshot of the current state and start modifying it without affecting the canonical/shared version.\n * It's a fork of your data graph: the same schema, but with diverging values.\n *\n * The checkout of the branch is applied on all the resolved values.\n *\n * @param name - A unique name for the branch. This identifies the branch\n * and can be used to switch between different branches of the same CoValue.\n * @param owner - The owner of the branch. Determines who can access and modify\n * the branch. If not provided, the branch is owned by the current user.\n *\n * For more info see the [branching](https://jazz.tools/docs/react/using-covalues/version-control) documentation.\n */\n unstable_branch?: BranchDefinition;\n },\n): TSelectorReturn {\n const subscription = useAccountSubscription(AccountSchema, options);\n const getCurrentValue = useGetCurrentValue(subscription);\n\n return useSyncExternalStoreWithSelector<\n MaybeLoaded<Loaded<A, R>>,\n TSelectorReturn\n >(\n React.useCallback(\n (callback) => {\n if (!subscription) {\n return () => {};\n }\n\n return subscription.subscribe(callback);\n },\n [subscription],\n ),\n getCurrentValue,\n getCurrentValue,\n options?.select ?? ((value) => value as TSelectorReturn),\n options?.equalityFn ?? Object.is,\n );\n}\n\nexport function useSuspenseAccount<\n A extends AccountClass<Account> | AnyAccountSchema,\n // @ts-expect-error we can't statically enforce the schema's resolve query is a valid resolve query, but in practice it is\n const R extends ResolveQuery<A> = SchemaResolveQuery<A>,\n TSelectorReturn = Loaded<A, R>,\n>(\n /** The account schema to use. Defaults to the base Account schema */\n AccountSchema: A = Account as unknown as A,\n /** Optional configuration for the subscription */\n options?: {\n /** Resolve query to specify which nested CoValues to load from the account */\n resolve?: ResolveQueryStrict<A, R>;\n /** Select which value to return from the account data */\n select?: (account: Loaded<A, R>) => TSelectorReturn;\n /** Equality function to determine if the selected value has changed, defaults to `Object.is` */\n equalityFn?: (a: TSelectorReturn, b: TSelectorReturn) => boolean;\n /**\n * Create or load a branch for isolated editing.\n *\n * Branching lets you take a snapshot of the current state and start modifying it without affecting the canonical/shared version.\n * It's a fork of your data graph: the same schema, but with diverging values.\n *\n * The checkout of the branch is applied on all the resolved values.\n *\n * @param name - A unique name for the branch. This identifies the branch\n * and can be used to switch between different branches of the same CoValue.\n * @param owner - The owner of the branch. Determines who can access and modify\n * the branch. If not provided, the branch is owned by the current user.\n *\n * For more info see the [branching](https://jazz.tools/docs/react/using-covalues/version-control) documentation.\n */\n unstable_branch?: BranchDefinition;\n },\n): TSelectorReturn {\n const subscription = useAccountSubscription(AccountSchema, options);\n\n if (!subscription) {\n throw new Error(\n \"Subscription not found, are you using useSuspenseAccount in guest mode?\",\n );\n }\n\n use(subscription.getCachedPromise());\n\n const getCurrentValue = () => {\n const value = subscription.getCurrentValue();\n\n if (!value.$isLoaded) {\n throw new Error(\"Account must be loaded in a suspense context\");\n }\n\n return value;\n };\n\n return useSyncExternalStoreWithSelector<Loaded<A, R>, TSelectorReturn>(\n React.useCallback(\n (callback) => {\n if (!subscription) {\n return () => {};\n }\n\n return subscription.subscribe(callback);\n },\n [subscription],\n ),\n getCurrentValue,\n getCurrentValue,\n options?.select ?? ((value) => value as TSelectorReturn),\n options?.equalityFn ?? Object.is,\n );\n}\n\n/**\n * Returns a function for logging out of the current account.\n */\nexport function useLogOut(): () => void {\n const contextManager = useJazzContextManager();\n return contextManager.logOut;\n}\n\n/**\n * React hook for accessing the current agent. An agent can either be:\n * - an Authenticated Account, if the user is logged in\n * - an Anonymous Account, if the user didn't log in\n * - or an anonymous agent, if in guest mode\n *\n * The agent can be used as the `loadAs` parameter for load and subscribe methods.\n */\nexport function useAgent<\n A extends AccountClass<Account> | AnyAccountSchema = typeof Account,\n>(): AnonymousJazzAgent | Loaded<A, true> {\n const contextManager = useJazzContextManager<InstanceOfSchema<A>>();\n\n const getCurrentValue = () =>\n getCurrentAccountFromContextManager(contextManager) as\n | AnonymousJazzAgent\n | Loaded<A, true>;\n\n return React.useSyncExternalStore(\n useCallback(\n (callback) => {\n return contextManager.subscribe(callback);\n },\n [contextManager],\n ),\n getCurrentValue,\n getCurrentValue,\n );\n}\n\nexport function experimental_useInboxSender<\n I extends CoValue,\n O extends CoValue | undefined,\n>(inboxOwnerID: string | undefined) {\n const context = useJazzContext();\n\n if (!(\"me\" in context)) {\n throw new Error(\n \"useInboxSender can't be used in a JazzProvider with auth === 'guest'.\",\n );\n }\n\n const me = context.me;\n const inboxRef = useRef<Promise<InboxSender<I, O>> | undefined>(undefined);\n\n const sendMessage = useCallback(\n async (message: I) => {\n if (!inboxOwnerID) throw new Error(\"Inbox owner ID is required\");\n\n if (!inboxRef.current) {\n const inbox = InboxSender.load<I, O>(inboxOwnerID, me);\n inboxRef.current = inbox;\n }\n\n let inbox = await inboxRef.current;\n\n // Regenerate the InboxSender if the inbox owner or current account changes\n if (inbox.owner.id !== inboxOwnerID || inbox.currentAccount !== me) {\n const req = InboxSender.load<I, O>(inboxOwnerID, me);\n inboxRef.current = req;\n inbox = await req;\n }\n\n return inbox.sendMessage(message);\n },\n [inboxOwnerID, me.$jazz.id],\n );\n\n return sendMessage;\n}\n\n/**\n * Hook that returns the current connection status to the Jazz sync server.\n *\n * @returns `true` when connected to the server, `false` when disconnected\n *\n * @remarks\n * On connection drop, this hook will return `false` only when Jazz detects the disconnection\n * after 5 seconds of not receiving a ping from the server.\n */\nexport function useSyncConnectionStatus() {\n const context = useJazzContext();\n\n const connected = useSyncExternalStore(\n useCallback(\n (callback) => {\n return context.addConnectionListener(callback);\n },\n [context],\n ),\n () => context.connected(),\n () => context.connected(),\n );\n\n return connected;\n}\n\nfunction getResolveQuery(\n Schema: CoValueClassOrSchema,\n // We don't need type validation here, since this is an internal API\n resolveQuery?: ResolveQuery<any>,\n): ResolveQuery<any> {\n if (resolveQuery) {\n return resolveQuery;\n }\n // Check the schema is a CoValue schema (and not a CoValue class)\n if (\"resolveQuery\" in Schema) {\n return Schema.resolveQuery;\n }\n return true;\n}\n","import { Account, JazzContextManager } from \"jazz-tools\";\n\nexport function getCurrentAccountFromContextManager<Acc extends Account>(\n contextManager: JazzContextManager<Acc, any>,\n) {\n const context = contextManager.getCurrentValue();\n\n if (!context) {\n throw new Error(\"No context found\");\n }\n\n return \"me\" in context ? context.me : context.guest;\n}\n\nexport function subscribeToContextManager<Acc extends Account>(\n contextManager: JazzContextManager<Acc, any>,\n callback: () => () => void,\n) {\n let unsub = () => {};\n\n const handler = () => {\n unsub();\n unsub = callback();\n };\n\n handler();\n return contextManager.subscribe(handler);\n}\n","import React from \"react\";\n\n// shim from https://github.com/pmndrs/jotai/blob/f287c5d665a807e676bc731e83174c62c1fe1fc9/src/react/useAtomValue.ts#L13C1-L56C1\nconst attachPromiseStatus = <T>(\n promise: PromiseLike<T> & {\n status?: \"pending\" | \"fulfilled\" | \"rejected\";\n value?: T;\n reason?: unknown;\n },\n) => {\n if (!promise.status) {\n promise.status = \"pending\";\n promise.then(\n (v) => {\n promise.status = \"fulfilled\";\n promise.value = v;\n },\n (e) => {\n promise.status = \"rejected\";\n promise.reason = e;\n },\n );\n }\n};\n\nexport const use =\n React.use ||\n // A shim for older React versions\n (<T>(\n promise: PromiseLike<T> & {\n status?: \"pending\" | \"fulfilled\" | \"rejected\";\n value?: T;\n reason?: unknown;\n },\n ): T => {\n if (promise.status === \"pending\") {\n throw promise;\n } else if (promise.status === \"fulfilled\") {\n return promise.value as T;\n } else if (promise.status === \"rejected\") {\n throw promise.reason;\n } else {\n attachPromiseStatus(promise);\n throw promise;\n }\n });\n","import React from \"react\";\nimport {\n Account,\n AccountClass,\n AnyAccountSchema,\n CoValueClassOrSchema,\n CoValueLoadingState,\n Loaded,\n MaybeLoaded,\n ResolveQuery,\n ResolveQueryStrict,\n} from \"jazz-tools\";\nimport {\n useAccountSubscription,\n useCoValueSubscription,\n useSubscriptionSelector,\n} from \"./hooks.js\";\nimport type { CoValueSubscription } from \"./types.js\";\n\nexport function createCoValueSubscriptionContext<\n S extends CoValueClassOrSchema,\n const R extends ResolveQuery<S> = true,\n>(schema: S, resolve?: ResolveQueryStrict<S, R>) {\n const Context = React.createContext<CoValueSubscription<S, R>>(null);\n\n return {\n Provider: ({\n id,\n options,\n loadingFallback,\n unavailableFallback,\n children,\n }: React.PropsWithChildren<{\n id: string | undefined | null;\n options?: Omit<\n Parameters<typeof useCoValueSubscription<S, R>>[2],\n \"resolve\"\n >;\n loadingFallback?: React.ReactNode;\n unavailableFallback?: React.ReactNode;\n }>) => {\n const subscription = useCoValueSubscription(schema, id, {\n ...options,\n resolve: resolve,\n });\n\n const loadState = useSubscriptionSelector(subscription, {\n select: (value) => value.$jazz.loadingState,\n });\n\n if (loadState === CoValueLoadingState.LOADING) {\n return loadingFallback ?? null;\n }\n if (\n loadState === CoValueLoadingState.UNAUTHORIZED ||\n loadState === CoValueLoadingState.UNAVAILABLE\n ) {\n return unavailableFallback ?? null;\n }\n\n return (\n <Context.Provider value={subscription}>{children}</Context.Provider>\n );\n },\n useSelector: <TSelectorReturn = Loaded<S, R>>(options?: {\n select?: (value: Loaded<S, R>) => TSelectorReturn;\n equalityFn?: (a: TSelectorReturn, b: TSelectorReturn) => boolean;\n }) => {\n const subscription = React.useContext(Context);\n\n if (!subscription) {\n throw new Error(\n \"useSelector must be used within a coValue subscription provider\",\n );\n }\n\n return useSubscriptionSelector<S, R, TSelectorReturn>(\n subscription,\n options as Parameters<\n typeof useSubscriptionSelector<S, R, TSelectorReturn>\n >[1],\n );\n },\n };\n}\n\nexport function createAccountSubscriptionContext<\n A extends AccountClass<Account> | AnyAccountSchema,\n const R extends ResolveQuery<A> = true,\n>(schema: A, resolve?: ResolveQueryStrict<A, R>) {\n const Context = React.createContext<CoValueSubscription<A, R>>(null);\n\n return {\n Provider: ({\n options,\n loadingFallback,\n unavailableFallback,\n children,\n }: React.PropsWithChildren<{\n options?: Omit<\n Parameters<typeof useAccountSubscription<A, R>>[1],\n \"resolve\"\n >;\n loadingFallback?: React.ReactNode;\n unavailableFallback?: React.ReactNode;\n }>) => {\n const subscription = useAccountSubscription(schema, {\n ...options,\n resolve: resolve,\n });\n\n const loadState = useSubscriptionSelector(subscription, {\n select: (value) => value.$jazz.loadingState,\n });\n\n if (loadState === CoValueLoadingState.LOADING) {\n return loadingFallback ?? null;\n }\n\n if (\n loadState === CoValueLoadingState.UNAUTHORIZED ||\n loadState === CoValueLoadingState.UNAVAILABLE\n ) {\n return unavailableFallback ?? null;\n }\n\n return (\n <Context.Provider value={subscription}>{children}</Context.Provider>\n );\n },\n useSelector: <TSelectorReturn = Loaded<A, R>>(options?: {\n select?: (value: Loaded<A, R>) => TSelectorReturn;\n equalityFn?: (a: TSelectorReturn, b: TSelectorReturn) => boolean;\n }) => {\n const subscription = React.useContext(Context);\n\n if (!subscription) {\n throw new Error(\n \"useSelector must be used within an account subscription provider\",\n );\n }\n\n return useSubscriptionSelector<A, R, TSelectorReturn>(\n subscription,\n options as Parameters<\n typeof useSubscriptionSelector<A, R, TSelectorReturn>\n >[1],\n );\n },\n };\n}\n","import { DemoAuth } from \"jazz-tools\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { useAuthSecretStorage, useJazzContext } from \"../hooks.js\";\nimport { useIsAuthenticated } from \"../hooks.js\";\n\n/**\n * `useDemoAuth` is a hook that provides a `JazzAuth` object for demo authentication.\n *\n *\n * ```ts\n * const { state, logIn, signUp, existingUsers } = useDemoAuth();\n * ```\n *\n * @category Auth Providers\n */\nexport function useDemoAuth() {\n const context = useJazzContext();\n const authSecretStorage = useAuthSecretStorage();\n\n if (\"guest\" in context) {\n throw new Error(\"Demo auth is not supported in guest mode\");\n }\n\n const authMethod = useMemo(() => {\n return new DemoAuth(context.authenticate, authSecretStorage);\n }, []);\n\n const isAuthenticated = useIsAuthenticated();\n const [existingUsers, setExistingUsers] = useState<string[]>([]);\n\n useEffect(() => {\n authMethod.getExistingUsers().then(setExistingUsers);\n }, [authMethod]);\n\n function handleSignUp(username: string) {\n return authMethod.signUp(username).then(() => {\n setExistingUsers(existingUsers.concat([username]));\n });\n }\n\n return {\n state: isAuthenticated ? \"signedIn\" : \"anonymous\",\n logIn: authMethod.logIn,\n signUp: handleSignUp,\n existingUsers,\n } as const;\n}\n","import { PassphraseAuth } from \"jazz-tools\";\nimport { useCallback, useMemo, useSyncExternalStore } from \"react\";\nimport { useAuthSecretStorage, useJazzContext } from \"../hooks.js\";\nimport { useIsAuthenticated } from \"../hooks.js\";\n\n/**\n * `usePassphraseAuth` hook provides a `JazzAuth` object for passphrase authentication.\n *\n * @example\n * ```ts\n * const auth = usePassphraseAuth({ appName, appHostname, wordlist });\n * ```\n *\n * @category Auth Providers\n */\nexport function usePassphraseAuth({ wordlist }: { wordlist: string[] }) {\n const context = useJazzContext();\n const authSecretStorage = useAuthSecretStorage();\n\n if (\"guest\" in context) {\n throw new Error(\"Passphrase auth is not supported in guest mode\");\n }\n\n const authMethod = useMemo(() => {\n return new PassphraseAuth(\n context.node.crypto,\n context.authenticate,\n context.register,\n authSecretStorage,\n wordlist,\n );\n }, [wordlist]);\n\n const passphrase = useSyncExternalStore(\n useCallback(\n (callback) => {\n authMethod.loadCurrentAccountPassphrase();\n return authMethod.subscribe(callback);\n },\n [authMethod],\n ),\n () => authMethod.passphrase,\n );\n\n const isAuthenticated = useIsAuthenticated();\n return {\n state: isAuthenticated ? \"signedIn\" : \"anonymous\",\n logIn: authMethod.logIn,\n signUp: authMethod.signUp,\n registerNewAccount: authMethod.registerNewAccount,\n generateRandomPassphrase: authMethod.generateRandomPassphrase,\n passphrase,\n } as const;\n}\n"],"mappings":"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","names":["React","React","subscription","value","inbox","React","CoValueLoadingState","React","CoValueLoadingState","useMemo","useMemo","useCallback","useMemo","useSyncExternalStore","useMemo","useSyncExternalStore","useCallback"]}
|
|
@@ -549,6 +549,9 @@ function JazzProviderCore({
|
|
|
549
549
|
);
|
|
550
550
|
const logoutReplacementActiveRef = useRef(false);
|
|
551
551
|
logoutReplacementActiveRef.current = Boolean(logOutReplacement);
|
|
552
|
+
const onAnonymousAccountDiscardedEnabled = Boolean(
|
|
553
|
+
onAnonymousAccountDiscarded
|
|
554
|
+
);
|
|
552
555
|
const value = React2.useSyncExternalStore(
|
|
553
556
|
React2.useCallback(
|
|
554
557
|
(callback) => {
|
|
@@ -560,7 +563,7 @@ function JazzProviderCore({
|
|
|
560
563
|
defaultProfileName,
|
|
561
564
|
onLogOut: onLogOutRefCallback,
|
|
562
565
|
logOutReplacement: logoutReplacementActiveRef.current ? logOutReplacementRefCallback : void 0,
|
|
563
|
-
onAnonymousAccountDiscarded: onAnonymousAccountDiscardedRefCallback,
|
|
566
|
+
onAnonymousAccountDiscarded: onAnonymousAccountDiscardedEnabled ? onAnonymousAccountDiscardedRefCallback : void 0,
|
|
564
567
|
CryptoProvider: CryptoProvider2
|
|
565
568
|
};
|
|
566
569
|
if (contextManager.propsChanged(props)) {
|
|
@@ -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/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/media/image.tsx","../../src/react-native-core/index.ts","../../src/react-native/provider.tsx","../../src/react-native/storage/mmkv-store-adapter.ts","../../src/react-native/storage/op-sqlite-adapter.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 { KvStoreContext } from \"../storage/kv-store-context.js\";\n\nexport * from \"./DemoAuthUI.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 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 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\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: onAnonymousAccountDiscardedRefCallback,\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, RawAccountID, 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 AgentID,\n AnyAccountSchema,\n AuthCredentials,\n AuthSecretStorage,\n CoValue,\n CoValueFromRaw,\n CryptoProvider,\n ID,\n NewAccountProps,\n SessionID,\n SyncConfig,\n createInviteLink as baseCreateInviteLink,\n createAnonymousJazzContext,\n createJazzContext,\n} from \"jazz-tools\";\nimport { KvStore, KvStoreContext } from \"./storage/kv-store-context.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 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 setNode,\n crypto,\n storage,\n };\n}\n\nexport async function createJazzReactNativeGuestContext(\n options: BaseReactNativeContextOptions,\n) {\n const {\n toggleNetwork,\n peers,\n setNode,\n crypto,\n storage,\n addConnectionListener,\n connected,\n } = await setupPeers(options);\n\n const context = createAnonymousJazzContext({\n crypto,\n peers,\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 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 context = await createJazzContext({\n credentials: options.credentials,\n newAccountProps: options.newAccountProps,\n peers,\n crypto,\n defaultProfileName: options.defaultProfileName,\n AccountSchema: options.AccountSchema,\n sessionProvider: provideLockSession,\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 Auth Providers */\nexport type SessionProvider = (\n accountID: ID<Account> | AgentID,\n) => Promise<SessionID>;\n\nexport async function provideLockSession(\n accountID: ID<Account> | AgentID,\n crypto: CryptoProvider,\n) {\n const sessionDone = () => {};\n\n const kvStore = KvStoreContext.getInstance().getStorage();\n\n const sessionID =\n ((await kvStore.get(accountID)) as SessionID) ||\n crypto.newRandomSessionID(accountID as RawAccountID | AgentID);\n await kvStore.set(accountID, sessionID);\n\n return Promise.resolve({\n sessionID,\n sessionDone,\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 { 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","import {\n Account,\n AccountClass,\n AnyAccountSchema,\n CoValueFromRaw,\n} from \"jazz-tools\";\nimport {\n JazzProviderCore,\n JazzProviderProps,\n} from \"jazz-tools/react-native-core\";\nimport React, { useMemo } from \"react\";\nimport { MMKVStore } from \"./storage/mmkv-store-adapter.js\";\nimport { OPSQLiteAdapter } from \"./storage/op-sqlite-adapter.js\";\n\nexport function JazzReactNativeProvider<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n>(props: JazzProviderProps<S>) {\n // Destructure kvStore and pass everything else via rest\n const storage = useMemo(() => {\n return props.storage ?? new OPSQLiteAdapter();\n }, [props.storage]);\n\n const kvStore = useMemo(() => {\n return props.kvStore ?? new MMKVStore();\n }, [props.kvStore]);\n\n return <JazzProviderCore {...props} storage={storage} kvStore={kvStore} />;\n}\n","import { KvStore } from \"jazz-tools/react-native-core\";\nimport { MMKV } from \"react-native-mmkv\";\n\nconst storage = new MMKV({\n id: \"jazz-react-native.default\",\n});\n\nexport class MMKVStore implements KvStore {\n async get(key: string): Promise<string | null> {\n return storage.getString(key) ?? null;\n }\n\n async set(key: string, value: string): Promise<void> {\n return storage.set(key, value);\n }\n\n async delete(key: string): Promise<void> {\n return storage.delete(key);\n }\n\n async clearAll(): Promise<void> {\n return storage.clearAll();\n }\n}\n","import * as opSQLite from \"@op-engineering/op-sqlite\";\nimport {\n ANDROID_DATABASE_PATH,\n IOS_LIBRARY_PATH,\n} from \"@op-engineering/op-sqlite\";\nimport { Platform } from \"react-native\";\n\ntype OPSQLiteDB = ReturnType<typeof opSQLite.open>;\n\nimport { type SQLiteDatabaseDriverAsync } from \"jazz-tools/react-native-core\";\n\nexport class OPSQLiteAdapter implements SQLiteDatabaseDriverAsync {\n private db: OPSQLiteDB | null = null;\n private dbName: string;\n\n public constructor(dbName: string = \"jazz-storage\") {\n this.dbName = dbName;\n }\n\n public async initialize(): Promise<void> {\n if (this.db) {\n return;\n }\n\n const dbPath =\n Platform.OS === \"ios\" ? IOS_LIBRARY_PATH : ANDROID_DATABASE_PATH;\n\n const db = (this.db = opSQLite.open({\n name: this.dbName,\n location: dbPath,\n }));\n\n await db.execute(\"PRAGMA journal_mode=WAL\");\n }\n\n public async query<T>(sql: string, params?: unknown[]): Promise<T[]> {\n if (!this.db) {\n throw new Error(\"Database not initialized\");\n }\n\n const result = await this.db.execute(sql, params as any[]);\n\n return result.rows as T[];\n }\n\n public async get<T>(sql: string, params?: unknown[]): Promise<T | undefined> {\n if (!this.db) {\n throw new Error(\"Database not initialized\");\n }\n\n const result = await this.db.execute(sql, params as any[]);\n\n return result.rows[0] as T | undefined;\n }\n\n public async run(sql: string, params?: unknown[]) {\n if (!this.db) {\n throw new Error(\"Database not initialized\");\n }\n\n await this.db.executeRaw(sql, params as any[]);\n }\n\n public async transaction(callback: () => unknown) {\n await this.run(\"BEGIN TRANSACTION\");\n\n try {\n await callback();\n await this.run(\"COMMIT\");\n } catch (error) {\n await this.run(\"ROLLBACK\");\n throw error;\n }\n }\n\n public async closeDb(): Promise<void> {\n // Keeping the database open and reusing the same connection over multiple ctx instances.\n }\n}\n"],"mappings":"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","names":["username","useJazzContext","React","useEffect","CryptoProvider","storage","handleAuthUpdate","jsx","storage","CryptoProvider","React","useEffect","useEffect","useState","jsx","Image","image","useState","useEffect","parseInviteLink","JazzProviderCore","useMemo","jsx","storage","useMemo","JazzProviderCore"]}
|
|
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/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/media/image.tsx","../../src/react-native-core/index.ts","../../src/react-native/provider.tsx","../../src/react-native/storage/mmkv-store-adapter.ts","../../src/react-native/storage/op-sqlite-adapter.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 { KvStoreContext } from \"../storage/kv-store-context.js\";\n\nexport * from \"./DemoAuthUI.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 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 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, RawAccountID, 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 AgentID,\n AnyAccountSchema,\n AuthCredentials,\n AuthSecretStorage,\n CoValue,\n CoValueFromRaw,\n CryptoProvider,\n ID,\n NewAccountProps,\n SessionID,\n SyncConfig,\n createInviteLink as baseCreateInviteLink,\n createAnonymousJazzContext,\n createJazzContext,\n} from \"jazz-tools\";\nimport { KvStore, KvStoreContext } from \"./storage/kv-store-context.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 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 setNode,\n crypto,\n storage,\n };\n}\n\nexport async function createJazzReactNativeGuestContext(\n options: BaseReactNativeContextOptions,\n) {\n const {\n toggleNetwork,\n peers,\n setNode,\n crypto,\n storage,\n addConnectionListener,\n connected,\n } = await setupPeers(options);\n\n const context = createAnonymousJazzContext({\n crypto,\n peers,\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 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 context = await createJazzContext({\n credentials: options.credentials,\n newAccountProps: options.newAccountProps,\n peers,\n crypto,\n defaultProfileName: options.defaultProfileName,\n AccountSchema: options.AccountSchema,\n sessionProvider: provideLockSession,\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 Auth Providers */\nexport type SessionProvider = (\n accountID: ID<Account> | AgentID,\n) => Promise<SessionID>;\n\nexport async function provideLockSession(\n accountID: ID<Account> | AgentID,\n crypto: CryptoProvider,\n) {\n const sessionDone = () => {};\n\n const kvStore = KvStoreContext.getInstance().getStorage();\n\n const sessionID =\n ((await kvStore.get(accountID)) as SessionID) ||\n crypto.newRandomSessionID(accountID as RawAccountID | AgentID);\n await kvStore.set(accountID, sessionID);\n\n return Promise.resolve({\n sessionID,\n sessionDone,\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 { 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","import {\n Account,\n AccountClass,\n AnyAccountSchema,\n CoValueFromRaw,\n} from \"jazz-tools\";\nimport {\n JazzProviderCore,\n JazzProviderProps,\n} from \"jazz-tools/react-native-core\";\nimport React, { useMemo } from \"react\";\nimport { MMKVStore } from \"./storage/mmkv-store-adapter.js\";\nimport { OPSQLiteAdapter } from \"./storage/op-sqlite-adapter.js\";\n\nexport function JazzReactNativeProvider<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n>(props: JazzProviderProps<S>) {\n // Destructure kvStore and pass everything else via rest\n const storage = useMemo(() => {\n return props.storage ?? new OPSQLiteAdapter();\n }, [props.storage]);\n\n const kvStore = useMemo(() => {\n return props.kvStore ?? new MMKVStore();\n }, [props.kvStore]);\n\n return <JazzProviderCore {...props} storage={storage} kvStore={kvStore} />;\n}\n","import { KvStore } from \"jazz-tools/react-native-core\";\nimport { MMKV } from \"react-native-mmkv\";\n\nconst storage = new MMKV({\n id: \"jazz-react-native.default\",\n});\n\nexport class MMKVStore implements KvStore {\n async get(key: string): Promise<string | null> {\n return storage.getString(key) ?? null;\n }\n\n async set(key: string, value: string): Promise<void> {\n return storage.set(key, value);\n }\n\n async delete(key: string): Promise<void> {\n return storage.delete(key);\n }\n\n async clearAll(): Promise<void> {\n return storage.clearAll();\n }\n}\n","import * as opSQLite from \"@op-engineering/op-sqlite\";\nimport {\n ANDROID_DATABASE_PATH,\n IOS_LIBRARY_PATH,\n} from \"@op-engineering/op-sqlite\";\nimport { Platform } from \"react-native\";\n\ntype OPSQLiteDB = ReturnType<typeof opSQLite.open>;\n\nimport { type SQLiteDatabaseDriverAsync } from \"jazz-tools/react-native-core\";\n\nexport class OPSQLiteAdapter implements SQLiteDatabaseDriverAsync {\n private db: OPSQLiteDB | null = null;\n private dbName: string;\n\n public constructor(dbName: string = \"jazz-storage\") {\n this.dbName = dbName;\n }\n\n public async initialize(): Promise<void> {\n if (this.db) {\n return;\n }\n\n const dbPath =\n Platform.OS === \"ios\" ? IOS_LIBRARY_PATH : ANDROID_DATABASE_PATH;\n\n const db = (this.db = opSQLite.open({\n name: this.dbName,\n location: dbPath,\n }));\n\n await db.execute(\"PRAGMA journal_mode=WAL\");\n }\n\n public async query<T>(sql: string, params?: unknown[]): Promise<T[]> {\n if (!this.db) {\n throw new Error(\"Database not initialized\");\n }\n\n const result = await this.db.execute(sql, params as any[]);\n\n return result.rows as T[];\n }\n\n public async get<T>(sql: string, params?: unknown[]): Promise<T | undefined> {\n if (!this.db) {\n throw new Error(\"Database not initialized\");\n }\n\n const result = await this.db.execute(sql, params as any[]);\n\n return result.rows[0] as T | undefined;\n }\n\n public async run(sql: string, params?: unknown[]) {\n if (!this.db) {\n throw new Error(\"Database not initialized\");\n }\n\n await this.db.executeRaw(sql, params as any[]);\n }\n\n public async transaction(callback: () => unknown) {\n await this.run(\"BEGIN TRANSACTION\");\n\n try {\n await callback();\n await this.run(\"COMMIT\");\n } catch (error) {\n await this.run(\"ROLLBACK\");\n throw error;\n }\n }\n\n public async closeDb(): Promise<void> {\n // Keeping the database open and reusing the same connection over multiple ctx instances.\n }\n}\n"],"mappings":"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","names":["username","useJazzContext","React","useEffect","CryptoProvider","storage","handleAuthUpdate","jsx","storage","CryptoProvider","React","useEffect","useEffect","useState","jsx","Image","image","useState","useEffect","parseInviteLink","JazzProviderCore","useMemo","jsx","storage","useMemo","JazzProviderCore"]}
|
|
@@ -549,6 +549,9 @@ function JazzProviderCore({
|
|
|
549
549
|
);
|
|
550
550
|
const logoutReplacementActiveRef = useRef(false);
|
|
551
551
|
logoutReplacementActiveRef.current = Boolean(logOutReplacement);
|
|
552
|
+
const onAnonymousAccountDiscardedEnabled = Boolean(
|
|
553
|
+
onAnonymousAccountDiscarded
|
|
554
|
+
);
|
|
552
555
|
const value = React2.useSyncExternalStore(
|
|
553
556
|
React2.useCallback(
|
|
554
557
|
(callback) => {
|
|
@@ -560,7 +563,7 @@ function JazzProviderCore({
|
|
|
560
563
|
defaultProfileName,
|
|
561
564
|
onLogOut: onLogOutRefCallback,
|
|
562
565
|
logOutReplacement: logoutReplacementActiveRef.current ? logOutReplacementRefCallback : void 0,
|
|
563
|
-
onAnonymousAccountDiscarded: onAnonymousAccountDiscardedRefCallback,
|
|
566
|
+
onAnonymousAccountDiscarded: onAnonymousAccountDiscardedEnabled ? onAnonymousAccountDiscardedRefCallback : void 0,
|
|
564
567
|
CryptoProvider: CryptoProvider2
|
|
565
568
|
};
|
|
566
569
|
if (contextManager.propsChanged(props)) {
|