jazz-tools 0.18.15 → 0.18.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/.svelte-kit/__package__/media/image.svelte +104 -98
  2. package/.svelte-kit/__package__/media/image.svelte.d.ts.map +1 -1
  3. package/.svelte-kit/__package__/tests/media/image.svelte.test.js +16 -2
  4. package/.turbo/turbo-build.log +48 -38
  5. package/CHANGELOG.md +20 -0
  6. package/dist/better-auth/database-adapter/index.d.ts +50 -0
  7. package/dist/better-auth/database-adapter/index.d.ts.map +1 -0
  8. package/dist/better-auth/database-adapter/index.js +920 -0
  9. package/dist/better-auth/database-adapter/index.js.map +1 -0
  10. package/dist/better-auth/database-adapter/repository/account.d.ts +24 -0
  11. package/dist/better-auth/database-adapter/repository/account.d.ts.map +1 -0
  12. package/dist/better-auth/database-adapter/repository/generic.d.ts +45 -0
  13. package/dist/better-auth/database-adapter/repository/generic.d.ts.map +1 -0
  14. package/dist/better-auth/database-adapter/repository/index.d.ts +6 -0
  15. package/dist/better-auth/database-adapter/repository/index.d.ts.map +1 -0
  16. package/dist/better-auth/database-adapter/repository/session.d.ts +29 -0
  17. package/dist/better-auth/database-adapter/repository/session.d.ts.map +1 -0
  18. package/dist/better-auth/database-adapter/repository/user.d.ts +30 -0
  19. package/dist/better-auth/database-adapter/repository/user.d.ts.map +1 -0
  20. package/dist/better-auth/database-adapter/repository/verification.d.ts +18 -0
  21. package/dist/better-auth/database-adapter/repository/verification.d.ts.map +1 -0
  22. package/dist/better-auth/database-adapter/schema.d.ts +27 -0
  23. package/dist/better-auth/database-adapter/schema.d.ts.map +1 -0
  24. package/dist/better-auth/database-adapter/tests/index.test.d.ts +2 -0
  25. package/dist/better-auth/database-adapter/tests/index.test.d.ts.map +1 -0
  26. package/dist/better-auth/database-adapter/tests/repository/account.test.d.ts +2 -0
  27. package/dist/better-auth/database-adapter/tests/repository/account.test.d.ts.map +1 -0
  28. package/dist/better-auth/database-adapter/tests/repository/generic.test.d.ts +2 -0
  29. package/dist/better-auth/database-adapter/tests/repository/generic.test.d.ts.map +1 -0
  30. package/dist/better-auth/database-adapter/tests/repository/session.test.d.ts +2 -0
  31. package/dist/better-auth/database-adapter/tests/repository/session.test.d.ts.map +1 -0
  32. package/dist/better-auth/database-adapter/tests/repository/user.test.d.ts +2 -0
  33. package/dist/better-auth/database-adapter/tests/repository/user.test.d.ts.map +1 -0
  34. package/dist/better-auth/database-adapter/tests/repository/verification.test.d.ts +2 -0
  35. package/dist/better-auth/database-adapter/tests/repository/verification.test.d.ts.map +1 -0
  36. package/dist/better-auth/database-adapter/tests/sync-utils.d.ts +16 -0
  37. package/dist/better-auth/database-adapter/tests/sync-utils.d.ts.map +1 -0
  38. package/dist/better-auth/database-adapter/tests/utils.test.d.ts +2 -0
  39. package/dist/better-auth/database-adapter/tests/utils.test.d.ts.map +1 -0
  40. package/dist/better-auth/database-adapter/utils.d.ts +16 -0
  41. package/dist/better-auth/database-adapter/utils.d.ts.map +1 -0
  42. package/dist/{chunk-GRN6OAUX.js → chunk-OTWWOZMB.js} +73 -4
  43. package/dist/chunk-OTWWOZMB.js.map +1 -0
  44. package/dist/index.js +1 -1
  45. package/dist/react/index.js +2 -0
  46. package/dist/react/index.js.map +1 -1
  47. package/dist/react/media/image.d.ts.map +1 -1
  48. package/dist/react-native-core/index.js +3 -1
  49. package/dist/react-native-core/index.js.map +1 -1
  50. package/dist/react-native-core/media/image.d.ts.map +1 -1
  51. package/dist/svelte/media/image.svelte +104 -98
  52. package/dist/svelte/media/image.svelte.d.ts.map +1 -1
  53. package/dist/svelte/tests/media/image.svelte.test.js +16 -2
  54. package/dist/testing.js +1 -1
  55. package/dist/tools/implementation/refs.d.ts +1 -1
  56. package/dist/tools/implementation/refs.d.ts.map +1 -1
  57. package/dist/tools/subscribe/CoValueCoreSubscription.d.ts +4 -0
  58. package/dist/tools/subscribe/CoValueCoreSubscription.d.ts.map +1 -1
  59. package/dist/tools/subscribe/SubscriptionScope.d.ts +7 -0
  60. package/dist/tools/subscribe/SubscriptionScope.d.ts.map +1 -1
  61. package/dist/tools/subscribe/index.d.ts.map +1 -1
  62. package/jazz-tools-0.18.6.tgz +0 -0
  63. package/package.json +10 -5
  64. package/src/better-auth/database-adapter/index.ts +228 -0
  65. package/src/better-auth/database-adapter/repository/account.ts +131 -0
  66. package/src/better-auth/database-adapter/repository/generic.ts +297 -0
  67. package/src/better-auth/database-adapter/repository/index.ts +5 -0
  68. package/src/better-auth/database-adapter/repository/session.ts +190 -0
  69. package/src/better-auth/database-adapter/repository/user.ts +158 -0
  70. package/src/better-auth/database-adapter/repository/verification.ts +37 -0
  71. package/src/better-auth/database-adapter/schema.ts +222 -0
  72. package/src/better-auth/database-adapter/tests/index.test.ts +690 -0
  73. package/src/better-auth/database-adapter/tests/repository/account.test.ts +149 -0
  74. package/src/better-auth/database-adapter/tests/repository/generic.test.ts +183 -0
  75. package/src/better-auth/database-adapter/tests/repository/session.test.ts +419 -0
  76. package/src/better-auth/database-adapter/tests/repository/user.test.ts +673 -0
  77. package/src/better-auth/database-adapter/tests/repository/verification.test.ts +101 -0
  78. package/src/better-auth/database-adapter/tests/sync-utils.ts +127 -0
  79. package/src/better-auth/database-adapter/tests/utils.test.ts +787 -0
  80. package/src/better-auth/database-adapter/utils.ts +178 -0
  81. package/src/react/media/image.tsx +2 -0
  82. package/src/react/tests/media/image.test.tsx +20 -2
  83. package/src/react-native-core/media/image.tsx +4 -1
  84. package/src/svelte/media/image.svelte +104 -98
  85. package/src/svelte/tests/media/image.svelte.test.ts +18 -2
  86. package/src/tools/implementation/refs.ts +27 -3
  87. package/src/tools/subscribe/CoValueCoreSubscription.ts +14 -0
  88. package/src/tools/subscribe/SubscriptionScope.ts +62 -1
  89. package/src/tools/subscribe/index.ts +8 -0
  90. package/tsup.config.ts +7 -0
  91. package/dist/chunk-GRN6OAUX.js.map +0 -1
package/dist/index.js CHANGED
@@ -37,7 +37,7 @@ import {
37
37
  randomSessionProvider,
38
38
  subscribeToCoValue,
39
39
  zodReExport_exports
40
- } from "./chunk-GRN6OAUX.js";
40
+ } from "./chunk-OTWWOZMB.js";
41
41
 
42
42
  // src/tools/auth/clerk/index.ts
43
43
  import {
@@ -748,6 +748,8 @@ var Image = forwardRef(function Image2({ imageId, width, height, ...props }, ref
748
748
  if (waitingLazyLoading) {
749
749
  return lazyPlaceholder;
750
750
  }
751
+ if (image === void 0)
752
+ return "data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==";
751
753
  if (!image) return void 0;
752
754
  const bestImage = highestResAvailable(
753
755
  image,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/react/provider.tsx","../../src/react/hooks.tsx","../../src/react/index.ts","../../src/react/auth/Clerk.tsx","../../src/react/auth/DemoAuth.tsx","../../src/react/auth/PasskeyAuth.tsx","../../src/react/auth/PassphraseAuth.tsx","../../src/react/auth/auth.ts","../../src/react/media/image.tsx","../../src/media/utils.ts","../../src/media/create-image-factory.ts"],"sourcesContent":["import {\n Account,\n AccountClass,\n AnyAccountSchema,\n CoValueFromRaw,\n InstanceOfSchema,\n JazzContextType,\n} from \"jazz-tools\";\nimport {\n JazzBrowserContextManager,\n JazzContextManagerProps,\n} from \"jazz-tools/browser\";\nimport { JazzContext, JazzContextManagerContext } from \"jazz-tools/react-core\";\nimport React, { useEffect, useRef } from \"react\";\n\nexport type JazzProviderProps<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n> = {\n children: React.ReactNode;\n enableSSR?: boolean;\n fallback?: React.ReactNode | null;\n} & JazzContextManagerProps<S>;\n\n/** @category Context & Hooks */\nexport function JazzReactProvider<\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 enableSSR,\n fallback = null,\n}: JazzProviderProps<S>) {\n const [contextManager] = React.useState(\n () =>\n new JazzBrowserContextManager<S>({\n useAnonymousFallback: enableSSR,\n }),\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 } 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 browser 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 : fallback}\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 { consumeInviteLinkFromWindowLocation } from \"jazz-tools/browser\";\nimport { useEffect } from \"react\";\n\nimport { CoValueClassOrSchema } from \"jazz-tools\";\nimport { useJazzContext } from \"jazz-tools/react-core\";\n\nexport { useCoState, useAuthSecretStorage } from \"jazz-tools/react-core\";\n\nexport function useAcceptInvite<S extends CoValueClassOrSchema>({\n invitedObjectSchema,\n onAccept,\n forValueHint,\n}: {\n invitedObjectSchema: S;\n onAccept: (valueID: string) => void;\n forValueHint?: string;\n}): void {\n const context = useJazzContext();\n\n if (!(\"me\" in context)) {\n throw new Error(\n \"useAcceptInvite can't be used in a JazzProvider with auth === 'guest'.\",\n );\n }\n\n useEffect(() => {\n const handleInvite = () => {\n const result = consumeInviteLinkFromWindowLocation({\n as: context.me,\n invitedObjectSchema,\n forValueHint,\n });\n\n result\n .then((result) => result && onAccept(result?.valueID))\n .catch((e) => {\n console.error(\"Failed to accept invite\", e);\n });\n };\n\n handleInvite();\n\n window.addEventListener(\"hashchange\", handleInvite);\n\n return () => window.removeEventListener(\"hashchange\", handleInvite);\n }, [onAccept]);\n}\n\nexport {\n experimental_useInboxSender,\n useJazzContext,\n useAccount,\n useCoStateWithSelector,\n useAccountWithSelector,\n} from \"jazz-tools/react-core\";\n","export { JazzReactProvider } from \"./provider.js\";\nexport type { JazzProviderProps } from \"./provider.js\";\nexport {\n useAccount,\n useCoState,\n useAcceptInvite,\n experimental_useInboxSender,\n useJazzContext,\n useAuthSecretStorage,\n useCoStateWithSelector,\n useAccountWithSelector,\n} from \"./hooks.js\";\n\nexport { createInviteLink, parseInviteLink } from \"jazz-tools/browser\";\n\nexport * from \"./auth/auth.js\";\nexport * from \"./media/image.js\";\n","import { JazzClerkAuth, type MinimalClerkClient } from \"jazz-tools\";\nimport {\n Account,\n AccountClass,\n AnyAccountSchema,\n CoValueFromRaw,\n InMemoryKVStore,\n KvStoreContext,\n} from \"jazz-tools\";\nimport { LocalStorageKVStore } from \"jazz-tools/browser\";\nimport { useAuthSecretStorage, useJazzContext } from \"jazz-tools/react-core\";\nimport { ReactNode, useEffect, useMemo, useState } from \"react\";\nimport { JazzProviderProps, JazzReactProvider } from \"../provider.js\";\n\nfunction useJazzClerkAuth(clerk: MinimalClerkClient) {\n const context = useJazzContext();\n const authSecretStorage = useAuthSecretStorage();\n\n if (\"guest\" in context) {\n throw new Error(\"Clerk auth is not supported in guest mode\");\n }\n\n const authMethod = useMemo(() => {\n return new JazzClerkAuth(\n context.authenticate,\n context.logOut,\n authSecretStorage,\n );\n }, []);\n\n useEffect(() => {\n return authMethod.registerListener(clerk);\n }, []);\n}\n\nfunction RegisterClerkAuth(props: {\n clerk: MinimalClerkClient;\n children: React.ReactNode;\n}) {\n useJazzClerkAuth(props.clerk);\n\n return props.children;\n}\n\nexport const JazzReactProviderWithClerk = <\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n>(\n props: {\n clerk: MinimalClerkClient;\n } & JazzProviderProps<S>,\n) => {\n const [isLoaded, setIsLoaded] = useState(false);\n\n /**\n * This effect ensures that a logged-in Clerk user is authenticated before the JazzReactProvider is mounted.\n *\n * This is done to optimize the initial load.\n */\n useEffect(() => {\n setupKvStore();\n\n JazzClerkAuth.initializeAuth(props.clerk).then(() => {\n setIsLoaded(true);\n });\n }, []);\n\n if (!isLoaded) {\n return props.fallback ?? null;\n }\n\n return (\n <JazzReactProvider {...props} onLogOut={props.clerk.signOut}>\n <RegisterClerkAuth clerk={props.clerk}>\n {props.children}\n </RegisterClerkAuth>\n </JazzReactProvider>\n );\n};\n\nfunction setupKvStore() {\n KvStoreContext.getInstance().initialize(\n typeof window === \"undefined\"\n ? new InMemoryKVStore()\n : new LocalStorageKVStore(),\n );\n}\n","import { useDemoAuth } from \"jazz-tools/react-core\";\nimport { useState } from \"react\";\n\nexport const DemoAuthBasicUI = (props: {\n appName: string;\n children?: React.ReactNode;\n}) => {\n const auth = useDemoAuth();\n\n const [username, setUsername] = useState<string>(\"\");\n\n const darkMode =\n typeof window !== \"undefined\"\n ? window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n : false;\n\n if (auth.state === \"signedIn\") return props.children ?? null;\n\n const { signUp, logIn, existingUsers } = auth;\n\n return (\n <div\n style={{\n minHeight: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n width: \"18rem\",\n maxWidth: \"calc(100vw - 2rem)\",\n gap: \"2rem\",\n margin: \"0 auto\",\n }}\n >\n <h1\n style={{\n color: darkMode ? \"#fff\" : \"#000\",\n textAlign: \"center\",\n fontSize: \"1.5rem\",\n fontWeight: \"bold\",\n }}\n >\n {props.appName}\n </h1>\n <form\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"0.5rem\",\n }}\n onSubmit={(e) => {\n e.preventDefault();\n signUp(username);\n }}\n >\n <input\n placeholder=\"Display name\"\n value={username}\n onChange={(e) => setUsername(e.target.value)}\n autoComplete=\"webauthn\"\n style={{\n border: darkMode ? \"1px solid #444\" : \"1px solid #ddd\",\n padding: \"11px 8px\",\n borderRadius: \"6px\",\n background: darkMode ? \"#000\" : \"#fff\",\n color: darkMode ? \"#fff\" : \"#000\",\n }}\n />\n <input\n type=\"submit\"\n value=\"Sign up\"\n style={{\n padding: \"13px 5px\",\n border: \"none\",\n borderRadius: \"6px\",\n cursor: \"pointer\",\n background: darkMode ? \"#444\" : \"#ddd\",\n color: darkMode ? \"#fff\" : \"#000\",\n }}\n />\n </form>\n {existingUsers.length > 0 && (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"0.5rem\",\n }}\n >\n <p\n style={{\n color: darkMode ? \"#e2e2e2\" : \"#000\",\n textAlign: \"center\",\n paddingTop: \"0.5rem\",\n borderTop: \"1px solid\",\n borderColor: darkMode ? \"#111\" : \"#e2e2e2\",\n }}\n >\n Log in as\n </p>\n {existingUsers.map((user) => (\n <button\n key={user}\n onClick={() => logIn(user)}\n type=\"button\"\n aria-label={`Log in as ${user}`}\n style={{\n background: darkMode ? \"#0d0d0d\" : \"#eee\",\n color: darkMode ? \"#fff\" : \"#000\",\n padding: \"0.5rem\",\n border: \"none\",\n borderRadius: \"6px\",\n }}\n >\n {user}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n};\n","import { BrowserPasskeyAuth } from \"jazz-tools/browser\";\nimport {\n useAuthSecretStorage,\n useIsAuthenticated,\n useJazzContext,\n} from \"jazz-tools/react-core\";\nimport { useMemo, useState } from \"react\";\n\n/**\n * `usePasskeyAuth` hook provides a `JazzAuth` object for passkey authentication.\n *\n * @example\n * ```ts\n * const auth = usePasskeyAuth({ appName, appHostname });\n * ```\n *\n * @category Auth Providers\n */\nexport function usePasskeyAuth({\n appName,\n appHostname,\n}: {\n appName: string;\n appHostname?: string;\n}) {\n const context = useJazzContext();\n const authSecretStorage = useAuthSecretStorage();\n\n if (\"guest\" in context) {\n throw new Error(\"Passkey auth is not supported in guest mode\");\n }\n\n const authMethod = useMemo(() => {\n return new BrowserPasskeyAuth(\n context.node.crypto,\n context.authenticate,\n authSecretStorage,\n appName,\n appHostname,\n );\n }, [appName, appHostname, authSecretStorage]);\n\n const isAuthenticated = useIsAuthenticated();\n\n return {\n state: isAuthenticated ? \"signedIn\" : \"anonymous\",\n logIn: authMethod.logIn,\n signUp: authMethod.signUp,\n } as const;\n}\n\nexport const PasskeyAuthBasicUI = (props: {\n appName: string;\n appHostname?: string;\n children?: React.ReactNode;\n}) => {\n const [username, setUsername] = useState<string>(\"\");\n const [error, setError] = useState<string | null>(null);\n\n const auth = usePasskeyAuth({\n appName: props.appName,\n appHostname: props.appHostname,\n });\n\n if (auth.state === \"signedIn\") {\n return props.children ?? null;\n }\n\n const { logIn, signUp } = auth;\n\n function handleError(error: Error) {\n if (error.cause instanceof Error) {\n setError(error.cause.message);\n } else {\n setError(error.message);\n }\n }\n\n return (\n <div\n style={{\n width: \"100vw\",\n height: \"100vh\",\n display: \"flex\",\n flexWrap: \"wrap\",\n justifyContent: \"center\",\n alignItems: error ? \"inherit\" : \"center\",\n }}\n >\n {error && (\n <div\n style={{\n color: \"red\",\n width: \"100%\",\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"end\",\n padding: \"1rem\",\n }}\n >\n {error}\n </div>\n )}\n <div\n style={{\n width: \"18rem\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"2rem\",\n }}\n >\n <form\n style={{\n width: \"18rem\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"0.5rem\",\n }}\n onSubmit={(e) => {\n e.preventDefault();\n setError(null);\n signUp(username).catch(handleError);\n }}\n >\n <input\n placeholder=\"Display name\"\n value={username}\n onChange={(e) => setUsername(e.target.value)}\n autoComplete=\"webauthn\"\n style={{\n border: \"2px solid #000\",\n padding: \"11px 8px\",\n borderRadius: \"6px\",\n }}\n />\n <input\n type=\"submit\"\n value=\"Sign up\"\n style={{\n background: \"#000\",\n color: \"#fff\",\n padding: \"13px 5px\",\n border: \"none\",\n borderRadius: \"6px\",\n cursor: \"pointer\",\n }}\n />\n </form>\n <button\n onClick={() => {\n setError(null);\n logIn().catch(handleError);\n }}\n style={{\n background: \"#000\",\n color: \"#fff\",\n padding: \"13px 5px\",\n border: \"none\",\n borderRadius: \"6px\",\n cursor: \"pointer\",\n }}\n >\n Log in with existing account\n </button>\n </div>\n </div>\n );\n};\n","import { usePassphraseAuth } from \"jazz-tools/react-core\";\nimport { useState } from \"react\";\n\nexport function PassphraseAuthBasicUI(props: {\n appName: string;\n wordlist: string[];\n children?: React.ReactNode;\n}) {\n const auth = usePassphraseAuth({\n wordlist: props.wordlist,\n });\n\n const [step, setStep] = useState<\"initial\" | \"create\" | \"login\">(\"initial\");\n const [loginPassphrase, setLoginPassphrase] = useState(\"\");\n const [isCopied, setIsCopied] = useState(false);\n\n if (auth.state === \"signedIn\") {\n return props.children ?? null;\n }\n\n const handleCreateAccount = async () => {\n setStep(\"create\");\n };\n\n const handleLogin = () => {\n setStep(\"login\");\n };\n\n const handleBack = () => {\n setStep(\"initial\");\n setLoginPassphrase(\"\");\n };\n\n const handleCopy = async () => {\n await navigator.clipboard.writeText(auth.passphrase);\n setIsCopied(true);\n };\n\n const handleLoginSubmit = async () => {\n await auth.logIn(loginPassphrase); // Sets the state to signed in\n\n // Reset the state in case of logout\n setStep(\"initial\");\n setLoginPassphrase(\"\");\n };\n\n const handleNext = async () => {\n await auth.signUp(); // Sets the state to signed in\n\n // Reset the state in case of logout\n setStep(\"initial\");\n setLoginPassphrase(\"\");\n };\n\n return (\n <div style={containerStyle}>\n <div style={cardStyle}>\n {step === \"initial\" && (\n <div>\n <h1 style={headingStyle}>{props.appName}</h1>\n <button onClick={handleCreateAccount} style={primaryButtonStyle}>\n Create new account\n </button>\n <button onClick={handleLogin} style={secondaryButtonStyle}>\n Log in\n </button>\n </div>\n )}\n\n {step === \"create\" && (\n <>\n <h1 style={headingStyle}>Your Passphrase</h1>\n <p\n style={{\n fontSize: \"0.875rem\",\n color: \"#4b5563\",\n textAlign: \"center\",\n marginBottom: \"1rem\",\n }}\n >\n Please copy and store this passphrase somewhere safe. You'll need\n it to log in.\n </p>\n <textarea\n readOnly\n value={auth.passphrase}\n style={textareaStyle}\n rows={5}\n />\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n gap: \"1rem\",\n }}\n >\n <button onClick={handleBack} style={secondaryButtonStyle}>\n Back\n </button>\n <button onClick={handleCopy} style={primaryButtonStyle}>\n {isCopied ? \"Copied!\" : \"Copy Passphrase\"}\n </button>\n <button onClick={handleNext} style={primaryButtonStyle}>\n I have saved it!\n </button>\n </div>\n </>\n )}\n\n {step === \"login\" && (\n <div>\n <h1 style={headingStyle}>Log In</h1>\n <textarea\n value={loginPassphrase}\n onChange={(e) => setLoginPassphrase(e.target.value)}\n placeholder=\"Enter your passphrase\"\n style={textareaStyle}\n rows={5}\n />\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n gap: \"1rem\",\n }}\n >\n <button onClick={handleBack} style={secondaryButtonStyle}>\n Back\n </button>\n <button onClick={handleLoginSubmit} style={primaryButtonStyle}>\n Log In\n </button>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}\n\nconst containerStyle: React.CSSProperties = {\n minHeight: \"100vh\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: \"#f3f4f6\",\n};\n\nconst cardStyle: React.CSSProperties = {\n backgroundColor: \"white\",\n padding: \"2rem\",\n borderRadius: \"0.5rem\",\n boxShadow:\n \"0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)\",\n width: \"24rem\",\n};\n\nconst buttonStyle: React.CSSProperties = {\n width: \"100%\",\n padding: \"0.5rem 1rem\",\n borderRadius: \"0.25rem\",\n fontWeight: \"bold\",\n cursor: \"pointer\",\n marginBottom: \"1rem\",\n};\n\nconst primaryButtonStyle: React.CSSProperties = {\n ...buttonStyle,\n backgroundColor: \"black\",\n color: \"white\",\n border: \"none\",\n};\n\nconst secondaryButtonStyle: React.CSSProperties = {\n ...buttonStyle,\n backgroundColor: \"white\",\n color: \"black\",\n border: \"1px solid black\",\n};\n\nconst headingStyle: React.CSSProperties = {\n color: \"black\",\n fontSize: \"1.5rem\",\n fontWeight: \"bold\",\n textAlign: \"center\",\n marginBottom: \"1rem\",\n};\n\nconst textareaStyle: React.CSSProperties = {\n width: \"100%\",\n padding: \"0.5rem\",\n border: \"1px solid #d1d5db\",\n borderRadius: \"0.25rem\",\n marginBottom: \"1rem\",\n boxSizing: \"border-box\",\n};\n","export { JazzReactProviderWithClerk } from \"./Clerk.js\";\nexport { DemoAuthBasicUI } from \"./DemoAuth.js\";\nexport { usePasskeyAuth, PasskeyAuthBasicUI } from \"./PasskeyAuth.js\";\nexport { PassphraseAuthBasicUI } from \"./PassphraseAuth.js\";\nexport {\n useIsAuthenticated,\n useDemoAuth,\n usePassphraseAuth,\n} from \"jazz-tools/react-core\";\n","import { ImageDefinition } from \"jazz-tools\";\nimport {\n type JSX,\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { highestResAvailable } from \"../../media/index.js\";\nimport { useCoState } from \"../hooks.js\";\n\nexport type ImageProps = Omit<\n JSX.IntrinsicElements[\"img\"],\n \"src\" | \"srcSet\" | \"width\" | \"height\"\n> & {\n /** The ID of the ImageDefinition to display */\n imageId: string;\n /**\n * The desired width of the image. Can be a number in pixels or \"original\" to use the image's original width.\n * When set to a number, the component will select the best available resolution and maintain aspect ratio.\n *\n * @example\n * ```tsx\n * // Use original width\n * <Image imageId=\"123\" width=\"original\" />\n *\n * // Set width to 600px, height will be calculated to maintain aspect ratio\n * <Image imageId=\"123\" width={600} />\n *\n * // Set both width and height to maintain aspect ratio\n * <Image imageId=\"123\" width={600} height={400} />\n * ```\n */\n width?: number | \"original\";\n /**\n * The desired height of the image. Can be a number in pixels or \"original\" to use the image's original height.\n * When set to a number, the component will select the best available resolution and maintain aspect ratio.\n *\n * @example\n * ```tsx\n * // Use original height\n * <Image imageId=\"123\" height=\"original\" />\n *\n * // Set height to 400px, width will be calculated to maintain aspect ratio\n * <Image imageId=\"123\" height={400} />\n *\n * // Set both width and height to maintain aspect ratio\n * <Image imageId=\"123\" width={600} height={400} />\n * ```\n */\n height?: number | \"original\";\n};\n\n/**\n * A React component for displaying images stored as ImageDefinition CoValues.\n *\n * @example\n * ```tsx\n * import { Image } from \"jazz-tools/react\";\n *\n * // Force specific dimensions (may crop or stretch)\n * function Avatar({ imageId }: { imageId: string }) {\n * return (\n * <Image\n * imageId={imageId}\n * width={100}\n * height={100}\n * alt=\"Avatar\"\n * style={{ borderRadius: \"50%\", objectFit: \"cover\" }}\n * />\n * );\n * }\n * ```\n */\nexport const Image = forwardRef<HTMLImageElement, ImageProps>(function Image(\n { imageId, width, height, ...props },\n ref,\n) {\n const image = useCoState(ImageDefinition, imageId);\n const lastBestImage = useRef<[string, string] | null>(null);\n\n /**\n * For lazy loading, we use the browser's strategy for images with loading=\"lazy\".\n * We use an empty image, and when the browser triggers the load event, we load the best available image.\n * On page loading, if the image url is already in browser's cache, the load event is triggered immediately.\n * This is why we need to use a different blob url for every image.\n */\n const [waitingLazyLoading, setWaitingLazyLoading] = useState(\n props.loading === \"lazy\",\n );\n const lazyPlaceholder = useMemo(\n () =>\n waitingLazyLoading ? URL.createObjectURL(getEmptyPixelBlob()) : undefined,\n [waitingLazyLoading],\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 const src = useMemo(() => {\n if (waitingLazyLoading) {\n return lazyPlaceholder;\n }\n\n if (!image) return undefined;\n\n const bestImage = highestResAvailable(\n image,\n dimensions.width || dimensions.height || 9999,\n dimensions.height || dimensions.width || 9999,\n );\n\n if (!bestImage) return image.placeholderDataURL;\n if (lastBestImage.current?.[0] === bestImage.image.$jazz.id)\n return lastBestImage.current?.[1];\n\n const blob = bestImage.image.toBlob();\n\n if (blob) {\n const url = URL.createObjectURL(blob);\n revokeObjectURL(lastBestImage.current?.[1]);\n lastBestImage.current = [bestImage.image.$jazz.id, url];\n return url;\n }\n\n return image.placeholderDataURL;\n }, [image, dimensions.width, dimensions.height, waitingLazyLoading]);\n\n const onThresholdReached = useCallback(() => {\n setWaitingLazyLoading(false);\n }, []);\n\n // Revoke object URL when component unmounts\n useEffect(\n () => () => {\n // In development mode we don't revokeObjectURL on unmount because\n // it triggers twice under StrictMode.\n if (process.env.NODE_ENV === \"development\") return;\n revokeObjectURL(lastBestImage.current?.[1]);\n },\n [],\n );\n\n return (\n <img\n ref={ref}\n src={src}\n width={dimensions.width}\n height={dimensions.height}\n onLoad={waitingLazyLoading ? onThresholdReached : undefined}\n {...props}\n />\n );\n});\n\nfunction revokeObjectURL(url: string | undefined) {\n if (url && url.startsWith(\"blob:\")) {\n URL.revokeObjectURL(url);\n }\n}\n\nlet emptyPixelBlob: Blob | undefined;\nfunction getEmptyPixelBlob() {\n if (!emptyPixelBlob) {\n emptyPixelBlob = new Blob(\n [\n Uint8Array.from(\n atob(\n \"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg==\",\n ),\n (c) => c.charCodeAt(0),\n ),\n ],\n { type: \"image/png\" },\n );\n }\n return emptyPixelBlob;\n}\n","import type { CoID } from \"cojson\";\nimport { Account, FileStream, ImageDefinition } from \"jazz-tools\";\n\nexport function highestResAvailable(\n image: ImageDefinition,\n wantedWidth: number,\n wantedHeight: number,\n): { width: number; height: number; image: FileStream } | null {\n const availableSizes: [number, number, string][] = image.$jazz.raw\n .keys()\n .filter((key) => /^\\d+x\\d+$/.test(key))\n .map((key) => {\n const [w, h] = key.split(\"x\").map(Number) as [number, number];\n return [w, h, key];\n });\n\n if (availableSizes.length === 0) {\n return image.original\n ? {\n width: image.originalSize[0],\n height: image.originalSize[1],\n image: image.original,\n }\n : null;\n }\n\n const sortedSizes = availableSizes\n .map((size) => {\n return {\n size,\n match: sizesMatchWanted(size[0], size[1], wantedWidth, wantedHeight),\n isLoaded: isLoaded(\n image.$jazz.raw.get(size[2]) as CoID<any> | undefined,\n ),\n };\n })\n .sort((a, b) => a.match - b.match);\n\n // We try to find the better already loaded image\n // note: `toReversed` is not available in react-native.\n const bestLoaded = [...sortedSizes]\n .reverse()\n .find((el) => el.isLoaded && image[el.size[2]]?.getChunks());\n\n // if I can't find a good match, let's use the highest resolution\n const bestTarget =\n sortedSizes.find((el) => el.match > 0.95) || sortedSizes.at(-1);\n\n // if the best target is already loaded, we are done\n if (image[bestTarget!.size[2]]?.getChunks()) {\n return image[bestTarget!.size[2]]\n ? {\n width: bestTarget!.size[0],\n height: bestTarget!.size[1],\n image: image[bestTarget!.size[2]]!,\n }\n : null;\n }\n\n // if the best already loaded is not the best target\n // let's trigger the load of the best target\n if (bestLoaded) {\n image[bestTarget!.size[2]]?.getChunks();\n return image[bestLoaded.size[2]]\n ? {\n width: bestLoaded.size[0],\n height: bestLoaded.size[1],\n image: image[bestLoaded.size[2]]!,\n }\n : null;\n }\n\n // if nothing is loaded, then start fetching all the images till the best\n for (let size of sortedSizes) {\n if (size.match <= bestTarget!.match) {\n image[size.size[2]]?.getChunks();\n }\n }\n\n return null;\n}\n\nfunction sizesMatchWanted(\n w: number,\n h: number,\n wantedW: number,\n wantedH: number,\n): number {\n const area1 = w * h;\n const area2 = wantedW * wantedH;\n\n const areaRatio = area1 / area2;\n\n // // Below 0.95 means the image is too small, we don't want to upscale it\n // if (areaRatio < 0.95) {\n // return 9999;\n // }\n\n return areaRatio;\n}\n\nfunction isLoaded(id: CoID<any> | null | undefined): boolean {\n if (!id) {\n return false;\n }\n\n return !!Account.getMe().$jazz.localNode.getLoaded(id);\n}\n\nexport async function loadImage(\n imageOrId: ImageDefinition | string,\n): Promise<{ width: number; height: number; image: FileStream } | null> {\n if (typeof imageOrId === \"string\") {\n const image = await ImageDefinition.load(imageOrId, {\n resolve: {\n original: true,\n },\n });\n\n if (image === null || image.original === null) {\n return null;\n }\n\n return {\n width: image.originalSize[0],\n height: image.originalSize[1],\n image: image.original,\n };\n }\n\n if (!imageOrId.original) {\n console.warn(\"Unable to find the original image\");\n return null;\n }\n\n const loadedOriginal = await FileStream.load(imageOrId.original.$jazz.id);\n\n if (!loadedOriginal) {\n console.warn(\"Unable to find the original image\");\n return null;\n }\n\n return {\n width: imageOrId.originalSize[0],\n height: imageOrId.originalSize[1],\n image: loadedOriginal,\n };\n}\n\nexport async function loadImageBySize(\n imageOrId: ImageDefinition | string,\n wantedWidth: number,\n wantedHeight: number,\n): Promise<{ width: number; height: number; image: FileStream } | null> {\n // @ts-expect-error The resolved type for CoMap does not include catchall properties\n const image: ImageDefinition | null =\n typeof imageOrId === \"string\"\n ? await ImageDefinition.load(imageOrId)\n : imageOrId;\n\n if (image === null) {\n return null;\n }\n\n if (image.progressive === false) {\n return loadImage(imageOrId);\n }\n\n const availableSizes: [number, number, string][] = image.$jazz.raw\n .keys()\n .filter((key) => /^\\d+x\\d+$/.test(key))\n .map((key) => {\n const [w, h] = key.split(\"x\").map(Number) as [number, number];\n return [w, h, key];\n });\n\n if (availableSizes.length === 0) {\n return null;\n }\n\n const sortedSizes = availableSizes\n .map((size) => ({\n size,\n match: sizesMatchWanted(size[0], size[1], wantedWidth, wantedHeight),\n }))\n .sort((a, b) => a.match - b.match);\n\n const bestTarget =\n sortedSizes.find((el) => el.match > 0.95) || sortedSizes.at(-1)!;\n\n // The image's `wxh` keys reference FileStream.\n // image[bestTarget.size[2]] returns undefined if FileStream hasn't loaded yet.\n // Since we only need the file's ID to fetch it later, we check the raw _refs\n // which contain only the linked covalue's ID.\n const file = image.$jazz.refs[bestTarget.size[2]];\n\n if (!file) {\n return null;\n }\n\n const loadedFile = await FileStream.load(file.id);\n\n if (!loadedFile) {\n return null;\n }\n\n return {\n width: bestTarget.size[0],\n height: bestTarget.size[1],\n image: loadedFile,\n };\n}\n","import {\n Account,\n FileStream,\n Group,\n ImageDefinition,\n type Loaded,\n} from \"jazz-tools\";\n\nexport type SourceType = Blob | File | string;\n\nexport type ResizeOutput = Blob | string;\n\nexport type CreateImageOptions = {\n /** The owner of the image. Can be either a Group or Account. If not specified, the current user will be the owner. */\n owner?: Group | Account;\n /**\n * Controls placeholder generation for the image.\n * - `\"blur\"`: Generates a blurred placeholder image (default)\n * - `false`: No placeholder is generated\n * @default \"blur\"\n */\n placeholder?: \"blur\" | false;\n /**\n * Maximum size constraint for the image. The image will be resized to fit within this size while maintaining aspect ratio.\n * If the image is smaller than maxSize in both dimensions, no resizing occurs.\n * @example 1024 // Resizes image to fit within 1024px in the largest dimension\n */\n maxSize?: number; // | [number, number];\n /**\n * The progressive loading pattern is a technique that allows images to load incrementally, starting with a small version and gradually replacing it with a larger version as it becomes available.\n * This is useful for improving the user experience by showing a placeholder while the image is loading.\n *\n * Passing progressive: true to createImage() will create internal smaller versions of the image for future uses.\n *\n * @default false\n */\n progressive?: boolean;\n};\n\nexport type CreateImageImpl<\n TSourceType = SourceType,\n TResizeOutput = ResizeOutput,\n> = {\n createFileStreamFromSource: (\n imageBlobOrFile: TSourceType | TResizeOutput,\n owner?: Group | Account,\n ) => Promise<FileStream>;\n getImageSize: (\n imageBlobOrFile: TSourceType,\n ) => Promise<{ width: number; height: number }>;\n getPlaceholderBase64: (imageBlobOrFile: TSourceType) => Promise<string>;\n resize: (\n imageBlobOrFile: TSourceType,\n width: number,\n height: number,\n ) => Promise<TResizeOutput>;\n};\n\nexport function createImageFactory<TSourceType, TResizeOutput>(\n impl: CreateImageImpl<TSourceType, TResizeOutput>,\n imageTypeGuard?: (imageBlobOrFile: TSourceType) => void,\n) {\n return (source: TSourceType, options?: CreateImageOptions) => {\n imageTypeGuard?.(source);\n return createImage(source, options ?? {}, impl);\n };\n}\n\nasync function createImage<TSourceType, TResizeOutput>(\n imageBlobOrFile: TSourceType,\n options: CreateImageOptions,\n impl: CreateImageImpl<TSourceType, TResizeOutput>,\n): Promise<Loaded<typeof ImageDefinition, { $each: true }>> {\n // Get the original size of the image\n const { width: originalWidth, height: originalHeight } =\n await impl.getImageSize(imageBlobOrFile);\n\n const def: {\n originalSize: [number, number];\n progressive: boolean;\n placeholderDataURL: string | undefined;\n original?: FileStream;\n files: Record<string, FileStream>;\n } = {\n originalSize: [originalWidth, originalHeight],\n progressive: false,\n placeholderDataURL: undefined,\n files: {},\n };\n\n // Placeholder\n if (options?.placeholder === \"blur\") {\n def.placeholderDataURL = await impl.getPlaceholderBase64(imageBlobOrFile);\n }\n\n /**\n * Original\n *\n * Save the original image.\n * If the maxSize is set, resize the image to the maxSize if needed\n */\n if (options?.maxSize === undefined) {\n def.original = await impl.createFileStreamFromSource(\n imageBlobOrFile,\n options?.owner,\n );\n def.files[`${originalWidth}x${originalHeight}`] = def.original;\n } else if (\n options?.maxSize >= originalWidth &&\n options?.maxSize >= originalHeight\n ) {\n // no resizes required, just return the original image\n def.original = await impl.createFileStreamFromSource(\n imageBlobOrFile,\n options?.owner,\n );\n def.files[`${originalWidth}x${originalHeight}`] = def.original;\n } else {\n const { width, height } = getNewDimensions(\n originalWidth,\n originalHeight,\n options.maxSize,\n );\n\n const blob = await impl.resize(imageBlobOrFile, width, height);\n def.originalSize = [width, height];\n def.original = await impl.createFileStreamFromSource(blob, options?.owner);\n def.files[`${width}x${height}`] = def.original;\n }\n\n const imageCoValue = ImageDefinition.create(\n {\n originalSize: def.originalSize,\n progressive: def.progressive,\n placeholderDataURL: def.placeholderDataURL,\n original: def.original,\n ...def.files,\n },\n options?.owner,\n );\n\n /**\n * Progressive loading\n *\n * Save a set of resized images using three sizes: 256, 1024, 2048\n *\n * On the client side, the image will be loaded progressively, starting from the smallest size and increasing the size until the original size is reached.\n */\n if (options?.progressive) {\n imageCoValue.$jazz.set(\"progressive\", true);\n\n const resizes = ([256, 1024, 2048] as const).filter(\n (s) =>\n s <\n Math.max(imageCoValue.originalSize[0], imageCoValue.originalSize[1]),\n );\n\n for (const size of resizes) {\n const { width, height } = getNewDimensions(\n originalWidth,\n originalHeight,\n size,\n );\n\n const blob = await impl.resize(imageBlobOrFile, width, height);\n imageCoValue.$jazz.set(\n `${width}x${height}`,\n await impl.createFileStreamFromSource(blob, options?.owner),\n );\n }\n }\n\n return imageCoValue;\n}\n\nconst getNewDimensions = (\n originalWidth: number,\n originalHeight: number,\n maxSize: number,\n) => {\n if (originalWidth > originalHeight) {\n return {\n width: maxSize,\n height: Math.round(maxSize * (originalHeight / originalWidth)),\n };\n }\n\n return {\n width: Math.round(maxSize * (originalWidth / originalHeight)),\n height: maxSize,\n };\n};\n"],"mappings":"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","names":["useEffect","useJazzContext","result","useAuthSecretStorage","useJazzContext","useEffect","jsx","useJazzContext","useAuthSecretStorage","useEffect","isLoaded","useState","jsx","useAuthSecretStorage","useJazzContext","useMemo","useState","jsx","jsxs","error","useState","jsx","jsxs","useIsAuthenticated","useDemoAuth","usePassphraseAuth","ImageDefinition","useEffect","useMemo","useRef","useState","Account","ImageDefinition","jsx","Image","ImageDefinition","useRef","useState","useMemo","useEffect"]}
1
+ {"version":3,"sources":["../../src/react/provider.tsx","../../src/react/hooks.tsx","../../src/react/index.ts","../../src/react/auth/Clerk.tsx","../../src/react/auth/DemoAuth.tsx","../../src/react/auth/PasskeyAuth.tsx","../../src/react/auth/PassphraseAuth.tsx","../../src/react/auth/auth.ts","../../src/react/media/image.tsx","../../src/media/utils.ts","../../src/media/create-image-factory.ts"],"sourcesContent":["import {\n Account,\n AccountClass,\n AnyAccountSchema,\n CoValueFromRaw,\n InstanceOfSchema,\n JazzContextType,\n} from \"jazz-tools\";\nimport {\n JazzBrowserContextManager,\n JazzContextManagerProps,\n} from \"jazz-tools/browser\";\nimport { JazzContext, JazzContextManagerContext } from \"jazz-tools/react-core\";\nimport React, { useEffect, useRef } from \"react\";\n\nexport type JazzProviderProps<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n> = {\n children: React.ReactNode;\n enableSSR?: boolean;\n fallback?: React.ReactNode | null;\n} & JazzContextManagerProps<S>;\n\n/** @category Context & Hooks */\nexport function JazzReactProvider<\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 enableSSR,\n fallback = null,\n}: JazzProviderProps<S>) {\n const [contextManager] = React.useState(\n () =>\n new JazzBrowserContextManager<S>({\n useAnonymousFallback: enableSSR,\n }),\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 } 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 browser 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 : fallback}\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 { consumeInviteLinkFromWindowLocation } from \"jazz-tools/browser\";\nimport { useEffect } from \"react\";\n\nimport { CoValueClassOrSchema } from \"jazz-tools\";\nimport { useJazzContext } from \"jazz-tools/react-core\";\n\nexport { useCoState, useAuthSecretStorage } from \"jazz-tools/react-core\";\n\nexport function useAcceptInvite<S extends CoValueClassOrSchema>({\n invitedObjectSchema,\n onAccept,\n forValueHint,\n}: {\n invitedObjectSchema: S;\n onAccept: (valueID: string) => void;\n forValueHint?: string;\n}): void {\n const context = useJazzContext();\n\n if (!(\"me\" in context)) {\n throw new Error(\n \"useAcceptInvite can't be used in a JazzProvider with auth === 'guest'.\",\n );\n }\n\n useEffect(() => {\n const handleInvite = () => {\n const result = consumeInviteLinkFromWindowLocation({\n as: context.me,\n invitedObjectSchema,\n forValueHint,\n });\n\n result\n .then((result) => result && onAccept(result?.valueID))\n .catch((e) => {\n console.error(\"Failed to accept invite\", e);\n });\n };\n\n handleInvite();\n\n window.addEventListener(\"hashchange\", handleInvite);\n\n return () => window.removeEventListener(\"hashchange\", handleInvite);\n }, [onAccept]);\n}\n\nexport {\n experimental_useInboxSender,\n useJazzContext,\n useAccount,\n useCoStateWithSelector,\n useAccountWithSelector,\n} from \"jazz-tools/react-core\";\n","export { JazzReactProvider } from \"./provider.js\";\nexport type { JazzProviderProps } from \"./provider.js\";\nexport {\n useAccount,\n useCoState,\n useAcceptInvite,\n experimental_useInboxSender,\n useJazzContext,\n useAuthSecretStorage,\n useCoStateWithSelector,\n useAccountWithSelector,\n} from \"./hooks.js\";\n\nexport { createInviteLink, parseInviteLink } from \"jazz-tools/browser\";\n\nexport * from \"./auth/auth.js\";\nexport * from \"./media/image.js\";\n","import { JazzClerkAuth, type MinimalClerkClient } from \"jazz-tools\";\nimport {\n Account,\n AccountClass,\n AnyAccountSchema,\n CoValueFromRaw,\n InMemoryKVStore,\n KvStoreContext,\n} from \"jazz-tools\";\nimport { LocalStorageKVStore } from \"jazz-tools/browser\";\nimport { useAuthSecretStorage, useJazzContext } from \"jazz-tools/react-core\";\nimport { ReactNode, useEffect, useMemo, useState } from \"react\";\nimport { JazzProviderProps, JazzReactProvider } from \"../provider.js\";\n\nfunction useJazzClerkAuth(clerk: MinimalClerkClient) {\n const context = useJazzContext();\n const authSecretStorage = useAuthSecretStorage();\n\n if (\"guest\" in context) {\n throw new Error(\"Clerk auth is not supported in guest mode\");\n }\n\n const authMethod = useMemo(() => {\n return new JazzClerkAuth(\n context.authenticate,\n context.logOut,\n authSecretStorage,\n );\n }, []);\n\n useEffect(() => {\n return authMethod.registerListener(clerk);\n }, []);\n}\n\nfunction RegisterClerkAuth(props: {\n clerk: MinimalClerkClient;\n children: React.ReactNode;\n}) {\n useJazzClerkAuth(props.clerk);\n\n return props.children;\n}\n\nexport const JazzReactProviderWithClerk = <\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n>(\n props: {\n clerk: MinimalClerkClient;\n } & JazzProviderProps<S>,\n) => {\n const [isLoaded, setIsLoaded] = useState(false);\n\n /**\n * This effect ensures that a logged-in Clerk user is authenticated before the JazzReactProvider is mounted.\n *\n * This is done to optimize the initial load.\n */\n useEffect(() => {\n setupKvStore();\n\n JazzClerkAuth.initializeAuth(props.clerk).then(() => {\n setIsLoaded(true);\n });\n }, []);\n\n if (!isLoaded) {\n return props.fallback ?? null;\n }\n\n return (\n <JazzReactProvider {...props} onLogOut={props.clerk.signOut}>\n <RegisterClerkAuth clerk={props.clerk}>\n {props.children}\n </RegisterClerkAuth>\n </JazzReactProvider>\n );\n};\n\nfunction setupKvStore() {\n KvStoreContext.getInstance().initialize(\n typeof window === \"undefined\"\n ? new InMemoryKVStore()\n : new LocalStorageKVStore(),\n );\n}\n","import { useDemoAuth } from \"jazz-tools/react-core\";\nimport { useState } from \"react\";\n\nexport const DemoAuthBasicUI = (props: {\n appName: string;\n children?: React.ReactNode;\n}) => {\n const auth = useDemoAuth();\n\n const [username, setUsername] = useState<string>(\"\");\n\n const darkMode =\n typeof window !== \"undefined\"\n ? window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n : false;\n\n if (auth.state === \"signedIn\") return props.children ?? null;\n\n const { signUp, logIn, existingUsers } = auth;\n\n return (\n <div\n style={{\n minHeight: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n width: \"18rem\",\n maxWidth: \"calc(100vw - 2rem)\",\n gap: \"2rem\",\n margin: \"0 auto\",\n }}\n >\n <h1\n style={{\n color: darkMode ? \"#fff\" : \"#000\",\n textAlign: \"center\",\n fontSize: \"1.5rem\",\n fontWeight: \"bold\",\n }}\n >\n {props.appName}\n </h1>\n <form\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"0.5rem\",\n }}\n onSubmit={(e) => {\n e.preventDefault();\n signUp(username);\n }}\n >\n <input\n placeholder=\"Display name\"\n value={username}\n onChange={(e) => setUsername(e.target.value)}\n autoComplete=\"webauthn\"\n style={{\n border: darkMode ? \"1px solid #444\" : \"1px solid #ddd\",\n padding: \"11px 8px\",\n borderRadius: \"6px\",\n background: darkMode ? \"#000\" : \"#fff\",\n color: darkMode ? \"#fff\" : \"#000\",\n }}\n />\n <input\n type=\"submit\"\n value=\"Sign up\"\n style={{\n padding: \"13px 5px\",\n border: \"none\",\n borderRadius: \"6px\",\n cursor: \"pointer\",\n background: darkMode ? \"#444\" : \"#ddd\",\n color: darkMode ? \"#fff\" : \"#000\",\n }}\n />\n </form>\n {existingUsers.length > 0 && (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"0.5rem\",\n }}\n >\n <p\n style={{\n color: darkMode ? \"#e2e2e2\" : \"#000\",\n textAlign: \"center\",\n paddingTop: \"0.5rem\",\n borderTop: \"1px solid\",\n borderColor: darkMode ? \"#111\" : \"#e2e2e2\",\n }}\n >\n Log in as\n </p>\n {existingUsers.map((user) => (\n <button\n key={user}\n onClick={() => logIn(user)}\n type=\"button\"\n aria-label={`Log in as ${user}`}\n style={{\n background: darkMode ? \"#0d0d0d\" : \"#eee\",\n color: darkMode ? \"#fff\" : \"#000\",\n padding: \"0.5rem\",\n border: \"none\",\n borderRadius: \"6px\",\n }}\n >\n {user}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n};\n","import { BrowserPasskeyAuth } from \"jazz-tools/browser\";\nimport {\n useAuthSecretStorage,\n useIsAuthenticated,\n useJazzContext,\n} from \"jazz-tools/react-core\";\nimport { useMemo, useState } from \"react\";\n\n/**\n * `usePasskeyAuth` hook provides a `JazzAuth` object for passkey authentication.\n *\n * @example\n * ```ts\n * const auth = usePasskeyAuth({ appName, appHostname });\n * ```\n *\n * @category Auth Providers\n */\nexport function usePasskeyAuth({\n appName,\n appHostname,\n}: {\n appName: string;\n appHostname?: string;\n}) {\n const context = useJazzContext();\n const authSecretStorage = useAuthSecretStorage();\n\n if (\"guest\" in context) {\n throw new Error(\"Passkey auth is not supported in guest mode\");\n }\n\n const authMethod = useMemo(() => {\n return new BrowserPasskeyAuth(\n context.node.crypto,\n context.authenticate,\n authSecretStorage,\n appName,\n appHostname,\n );\n }, [appName, appHostname, authSecretStorage]);\n\n const isAuthenticated = useIsAuthenticated();\n\n return {\n state: isAuthenticated ? \"signedIn\" : \"anonymous\",\n logIn: authMethod.logIn,\n signUp: authMethod.signUp,\n } as const;\n}\n\nexport const PasskeyAuthBasicUI = (props: {\n appName: string;\n appHostname?: string;\n children?: React.ReactNode;\n}) => {\n const [username, setUsername] = useState<string>(\"\");\n const [error, setError] = useState<string | null>(null);\n\n const auth = usePasskeyAuth({\n appName: props.appName,\n appHostname: props.appHostname,\n });\n\n if (auth.state === \"signedIn\") {\n return props.children ?? null;\n }\n\n const { logIn, signUp } = auth;\n\n function handleError(error: Error) {\n if (error.cause instanceof Error) {\n setError(error.cause.message);\n } else {\n setError(error.message);\n }\n }\n\n return (\n <div\n style={{\n width: \"100vw\",\n height: \"100vh\",\n display: \"flex\",\n flexWrap: \"wrap\",\n justifyContent: \"center\",\n alignItems: error ? \"inherit\" : \"center\",\n }}\n >\n {error && (\n <div\n style={{\n color: \"red\",\n width: \"100%\",\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"end\",\n padding: \"1rem\",\n }}\n >\n {error}\n </div>\n )}\n <div\n style={{\n width: \"18rem\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"2rem\",\n }}\n >\n <form\n style={{\n width: \"18rem\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"0.5rem\",\n }}\n onSubmit={(e) => {\n e.preventDefault();\n setError(null);\n signUp(username).catch(handleError);\n }}\n >\n <input\n placeholder=\"Display name\"\n value={username}\n onChange={(e) => setUsername(e.target.value)}\n autoComplete=\"webauthn\"\n style={{\n border: \"2px solid #000\",\n padding: \"11px 8px\",\n borderRadius: \"6px\",\n }}\n />\n <input\n type=\"submit\"\n value=\"Sign up\"\n style={{\n background: \"#000\",\n color: \"#fff\",\n padding: \"13px 5px\",\n border: \"none\",\n borderRadius: \"6px\",\n cursor: \"pointer\",\n }}\n />\n </form>\n <button\n onClick={() => {\n setError(null);\n logIn().catch(handleError);\n }}\n style={{\n background: \"#000\",\n color: \"#fff\",\n padding: \"13px 5px\",\n border: \"none\",\n borderRadius: \"6px\",\n cursor: \"pointer\",\n }}\n >\n Log in with existing account\n </button>\n </div>\n </div>\n );\n};\n","import { usePassphraseAuth } from \"jazz-tools/react-core\";\nimport { useState } from \"react\";\n\nexport function PassphraseAuthBasicUI(props: {\n appName: string;\n wordlist: string[];\n children?: React.ReactNode;\n}) {\n const auth = usePassphraseAuth({\n wordlist: props.wordlist,\n });\n\n const [step, setStep] = useState<\"initial\" | \"create\" | \"login\">(\"initial\");\n const [loginPassphrase, setLoginPassphrase] = useState(\"\");\n const [isCopied, setIsCopied] = useState(false);\n\n if (auth.state === \"signedIn\") {\n return props.children ?? null;\n }\n\n const handleCreateAccount = async () => {\n setStep(\"create\");\n };\n\n const handleLogin = () => {\n setStep(\"login\");\n };\n\n const handleBack = () => {\n setStep(\"initial\");\n setLoginPassphrase(\"\");\n };\n\n const handleCopy = async () => {\n await navigator.clipboard.writeText(auth.passphrase);\n setIsCopied(true);\n };\n\n const handleLoginSubmit = async () => {\n await auth.logIn(loginPassphrase); // Sets the state to signed in\n\n // Reset the state in case of logout\n setStep(\"initial\");\n setLoginPassphrase(\"\");\n };\n\n const handleNext = async () => {\n await auth.signUp(); // Sets the state to signed in\n\n // Reset the state in case of logout\n setStep(\"initial\");\n setLoginPassphrase(\"\");\n };\n\n return (\n <div style={containerStyle}>\n <div style={cardStyle}>\n {step === \"initial\" && (\n <div>\n <h1 style={headingStyle}>{props.appName}</h1>\n <button onClick={handleCreateAccount} style={primaryButtonStyle}>\n Create new account\n </button>\n <button onClick={handleLogin} style={secondaryButtonStyle}>\n Log in\n </button>\n </div>\n )}\n\n {step === \"create\" && (\n <>\n <h1 style={headingStyle}>Your Passphrase</h1>\n <p\n style={{\n fontSize: \"0.875rem\",\n color: \"#4b5563\",\n textAlign: \"center\",\n marginBottom: \"1rem\",\n }}\n >\n Please copy and store this passphrase somewhere safe. You'll need\n it to log in.\n </p>\n <textarea\n readOnly\n value={auth.passphrase}\n style={textareaStyle}\n rows={5}\n />\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n gap: \"1rem\",\n }}\n >\n <button onClick={handleBack} style={secondaryButtonStyle}>\n Back\n </button>\n <button onClick={handleCopy} style={primaryButtonStyle}>\n {isCopied ? \"Copied!\" : \"Copy Passphrase\"}\n </button>\n <button onClick={handleNext} style={primaryButtonStyle}>\n I have saved it!\n </button>\n </div>\n </>\n )}\n\n {step === \"login\" && (\n <div>\n <h1 style={headingStyle}>Log In</h1>\n <textarea\n value={loginPassphrase}\n onChange={(e) => setLoginPassphrase(e.target.value)}\n placeholder=\"Enter your passphrase\"\n style={textareaStyle}\n rows={5}\n />\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n gap: \"1rem\",\n }}\n >\n <button onClick={handleBack} style={secondaryButtonStyle}>\n Back\n </button>\n <button onClick={handleLoginSubmit} style={primaryButtonStyle}>\n Log In\n </button>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}\n\nconst containerStyle: React.CSSProperties = {\n minHeight: \"100vh\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: \"#f3f4f6\",\n};\n\nconst cardStyle: React.CSSProperties = {\n backgroundColor: \"white\",\n padding: \"2rem\",\n borderRadius: \"0.5rem\",\n boxShadow:\n \"0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)\",\n width: \"24rem\",\n};\n\nconst buttonStyle: React.CSSProperties = {\n width: \"100%\",\n padding: \"0.5rem 1rem\",\n borderRadius: \"0.25rem\",\n fontWeight: \"bold\",\n cursor: \"pointer\",\n marginBottom: \"1rem\",\n};\n\nconst primaryButtonStyle: React.CSSProperties = {\n ...buttonStyle,\n backgroundColor: \"black\",\n color: \"white\",\n border: \"none\",\n};\n\nconst secondaryButtonStyle: React.CSSProperties = {\n ...buttonStyle,\n backgroundColor: \"white\",\n color: \"black\",\n border: \"1px solid black\",\n};\n\nconst headingStyle: React.CSSProperties = {\n color: \"black\",\n fontSize: \"1.5rem\",\n fontWeight: \"bold\",\n textAlign: \"center\",\n marginBottom: \"1rem\",\n};\n\nconst textareaStyle: React.CSSProperties = {\n width: \"100%\",\n padding: \"0.5rem\",\n border: \"1px solid #d1d5db\",\n borderRadius: \"0.25rem\",\n marginBottom: \"1rem\",\n boxSizing: \"border-box\",\n};\n","export { JazzReactProviderWithClerk } from \"./Clerk.js\";\nexport { DemoAuthBasicUI } from \"./DemoAuth.js\";\nexport { usePasskeyAuth, PasskeyAuthBasicUI } from \"./PasskeyAuth.js\";\nexport { PassphraseAuthBasicUI } from \"./PassphraseAuth.js\";\nexport {\n useIsAuthenticated,\n useDemoAuth,\n usePassphraseAuth,\n} from \"jazz-tools/react-core\";\n","import { ImageDefinition } from \"jazz-tools\";\nimport {\n type JSX,\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { highestResAvailable } from \"../../media/index.js\";\nimport { useCoState } from \"../hooks.js\";\n\nexport type ImageProps = Omit<\n JSX.IntrinsicElements[\"img\"],\n \"src\" | \"srcSet\" | \"width\" | \"height\"\n> & {\n /** The ID of the ImageDefinition to display */\n imageId: string;\n /**\n * The desired width of the image. Can be a number in pixels or \"original\" to use the image's original width.\n * When set to a number, the component will select the best available resolution and maintain aspect ratio.\n *\n * @example\n * ```tsx\n * // Use original width\n * <Image imageId=\"123\" width=\"original\" />\n *\n * // Set width to 600px, height will be calculated to maintain aspect ratio\n * <Image imageId=\"123\" width={600} />\n *\n * // Set both width and height to maintain aspect ratio\n * <Image imageId=\"123\" width={600} height={400} />\n * ```\n */\n width?: number | \"original\";\n /**\n * The desired height of the image. Can be a number in pixels or \"original\" to use the image's original height.\n * When set to a number, the component will select the best available resolution and maintain aspect ratio.\n *\n * @example\n * ```tsx\n * // Use original height\n * <Image imageId=\"123\" height=\"original\" />\n *\n * // Set height to 400px, width will be calculated to maintain aspect ratio\n * <Image imageId=\"123\" height={400} />\n *\n * // Set both width and height to maintain aspect ratio\n * <Image imageId=\"123\" width={600} height={400} />\n * ```\n */\n height?: number | \"original\";\n};\n\n/**\n * A React component for displaying images stored as ImageDefinition CoValues.\n *\n * @example\n * ```tsx\n * import { Image } from \"jazz-tools/react\";\n *\n * // Force specific dimensions (may crop or stretch)\n * function Avatar({ imageId }: { imageId: string }) {\n * return (\n * <Image\n * imageId={imageId}\n * width={100}\n * height={100}\n * alt=\"Avatar\"\n * style={{ borderRadius: \"50%\", objectFit: \"cover\" }}\n * />\n * );\n * }\n * ```\n */\nexport const Image = forwardRef<HTMLImageElement, ImageProps>(function Image(\n { imageId, width, height, ...props },\n ref,\n) {\n const image = useCoState(ImageDefinition, imageId);\n const lastBestImage = useRef<[string, string] | null>(null);\n\n /**\n * For lazy loading, we use the browser's strategy for images with loading=\"lazy\".\n * We use an empty image, and when the browser triggers the load event, we load the best available image.\n * On page loading, if the image url is already in browser's cache, the load event is triggered immediately.\n * This is why we need to use a different blob url for every image.\n */\n const [waitingLazyLoading, setWaitingLazyLoading] = useState(\n props.loading === \"lazy\",\n );\n const lazyPlaceholder = useMemo(\n () =>\n waitingLazyLoading ? URL.createObjectURL(getEmptyPixelBlob()) : undefined,\n [waitingLazyLoading],\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 const src = useMemo(() => {\n if (waitingLazyLoading) {\n return lazyPlaceholder;\n }\n\n if (image === undefined)\n return \"data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==\";\n if (!image) return undefined;\n\n const bestImage = highestResAvailable(\n image,\n dimensions.width || dimensions.height || 9999,\n dimensions.height || dimensions.width || 9999,\n );\n\n if (!bestImage) return image.placeholderDataURL;\n if (lastBestImage.current?.[0] === bestImage.image.$jazz.id)\n return lastBestImage.current?.[1];\n\n const blob = bestImage.image.toBlob();\n\n if (blob) {\n const url = URL.createObjectURL(blob);\n revokeObjectURL(lastBestImage.current?.[1]);\n lastBestImage.current = [bestImage.image.$jazz.id, url];\n return url;\n }\n\n return image.placeholderDataURL;\n }, [image, dimensions.width, dimensions.height, waitingLazyLoading]);\n\n const onThresholdReached = useCallback(() => {\n setWaitingLazyLoading(false);\n }, []);\n\n // Revoke object URL when component unmounts\n useEffect(\n () => () => {\n // In development mode we don't revokeObjectURL on unmount because\n // it triggers twice under StrictMode.\n if (process.env.NODE_ENV === \"development\") return;\n revokeObjectURL(lastBestImage.current?.[1]);\n },\n [],\n );\n\n return (\n <img\n ref={ref}\n src={src}\n width={dimensions.width}\n height={dimensions.height}\n onLoad={waitingLazyLoading ? onThresholdReached : undefined}\n {...props}\n />\n );\n});\n\nfunction revokeObjectURL(url: string | undefined) {\n if (url && url.startsWith(\"blob:\")) {\n URL.revokeObjectURL(url);\n }\n}\n\nlet emptyPixelBlob: Blob | undefined;\nfunction getEmptyPixelBlob() {\n if (!emptyPixelBlob) {\n emptyPixelBlob = new Blob(\n [\n Uint8Array.from(\n atob(\n \"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg==\",\n ),\n (c) => c.charCodeAt(0),\n ),\n ],\n { type: \"image/png\" },\n );\n }\n return emptyPixelBlob;\n}\n","import type { CoID } from \"cojson\";\nimport { Account, FileStream, ImageDefinition } from \"jazz-tools\";\n\nexport function highestResAvailable(\n image: ImageDefinition,\n wantedWidth: number,\n wantedHeight: number,\n): { width: number; height: number; image: FileStream } | null {\n const availableSizes: [number, number, string][] = image.$jazz.raw\n .keys()\n .filter((key) => /^\\d+x\\d+$/.test(key))\n .map((key) => {\n const [w, h] = key.split(\"x\").map(Number) as [number, number];\n return [w, h, key];\n });\n\n if (availableSizes.length === 0) {\n return image.original\n ? {\n width: image.originalSize[0],\n height: image.originalSize[1],\n image: image.original,\n }\n : null;\n }\n\n const sortedSizes = availableSizes\n .map((size) => {\n return {\n size,\n match: sizesMatchWanted(size[0], size[1], wantedWidth, wantedHeight),\n isLoaded: isLoaded(\n image.$jazz.raw.get(size[2]) as CoID<any> | undefined,\n ),\n };\n })\n .sort((a, b) => a.match - b.match);\n\n // We try to find the better already loaded image\n // note: `toReversed` is not available in react-native.\n const bestLoaded = [...sortedSizes]\n .reverse()\n .find((el) => el.isLoaded && image[el.size[2]]?.getChunks());\n\n // if I can't find a good match, let's use the highest resolution\n const bestTarget =\n sortedSizes.find((el) => el.match > 0.95) || sortedSizes.at(-1);\n\n // if the best target is already loaded, we are done\n if (image[bestTarget!.size[2]]?.getChunks()) {\n return image[bestTarget!.size[2]]\n ? {\n width: bestTarget!.size[0],\n height: bestTarget!.size[1],\n image: image[bestTarget!.size[2]]!,\n }\n : null;\n }\n\n // if the best already loaded is not the best target\n // let's trigger the load of the best target\n if (bestLoaded) {\n image[bestTarget!.size[2]]?.getChunks();\n return image[bestLoaded.size[2]]\n ? {\n width: bestLoaded.size[0],\n height: bestLoaded.size[1],\n image: image[bestLoaded.size[2]]!,\n }\n : null;\n }\n\n // if nothing is loaded, then start fetching all the images till the best\n for (let size of sortedSizes) {\n if (size.match <= bestTarget!.match) {\n image[size.size[2]]?.getChunks();\n }\n }\n\n return null;\n}\n\nfunction sizesMatchWanted(\n w: number,\n h: number,\n wantedW: number,\n wantedH: number,\n): number {\n const area1 = w * h;\n const area2 = wantedW * wantedH;\n\n const areaRatio = area1 / area2;\n\n // // Below 0.95 means the image is too small, we don't want to upscale it\n // if (areaRatio < 0.95) {\n // return 9999;\n // }\n\n return areaRatio;\n}\n\nfunction isLoaded(id: CoID<any> | null | undefined): boolean {\n if (!id) {\n return false;\n }\n\n return !!Account.getMe().$jazz.localNode.getLoaded(id);\n}\n\nexport async function loadImage(\n imageOrId: ImageDefinition | string,\n): Promise<{ width: number; height: number; image: FileStream } | null> {\n if (typeof imageOrId === \"string\") {\n const image = await ImageDefinition.load(imageOrId, {\n resolve: {\n original: true,\n },\n });\n\n if (image === null || image.original === null) {\n return null;\n }\n\n return {\n width: image.originalSize[0],\n height: image.originalSize[1],\n image: image.original,\n };\n }\n\n if (!imageOrId.original) {\n console.warn(\"Unable to find the original image\");\n return null;\n }\n\n const loadedOriginal = await FileStream.load(imageOrId.original.$jazz.id);\n\n if (!loadedOriginal) {\n console.warn(\"Unable to find the original image\");\n return null;\n }\n\n return {\n width: imageOrId.originalSize[0],\n height: imageOrId.originalSize[1],\n image: loadedOriginal,\n };\n}\n\nexport async function loadImageBySize(\n imageOrId: ImageDefinition | string,\n wantedWidth: number,\n wantedHeight: number,\n): Promise<{ width: number; height: number; image: FileStream } | null> {\n // @ts-expect-error The resolved type for CoMap does not include catchall properties\n const image: ImageDefinition | null =\n typeof imageOrId === \"string\"\n ? await ImageDefinition.load(imageOrId)\n : imageOrId;\n\n if (image === null) {\n return null;\n }\n\n if (image.progressive === false) {\n return loadImage(imageOrId);\n }\n\n const availableSizes: [number, number, string][] = image.$jazz.raw\n .keys()\n .filter((key) => /^\\d+x\\d+$/.test(key))\n .map((key) => {\n const [w, h] = key.split(\"x\").map(Number) as [number, number];\n return [w, h, key];\n });\n\n if (availableSizes.length === 0) {\n return null;\n }\n\n const sortedSizes = availableSizes\n .map((size) => ({\n size,\n match: sizesMatchWanted(size[0], size[1], wantedWidth, wantedHeight),\n }))\n .sort((a, b) => a.match - b.match);\n\n const bestTarget =\n sortedSizes.find((el) => el.match > 0.95) || sortedSizes.at(-1)!;\n\n // The image's `wxh` keys reference FileStream.\n // image[bestTarget.size[2]] returns undefined if FileStream hasn't loaded yet.\n // Since we only need the file's ID to fetch it later, we check the raw _refs\n // which contain only the linked covalue's ID.\n const file = image.$jazz.refs[bestTarget.size[2]];\n\n if (!file) {\n return null;\n }\n\n const loadedFile = await FileStream.load(file.id);\n\n if (!loadedFile) {\n return null;\n }\n\n return {\n width: bestTarget.size[0],\n height: bestTarget.size[1],\n image: loadedFile,\n };\n}\n","import {\n Account,\n FileStream,\n Group,\n ImageDefinition,\n type Loaded,\n} from \"jazz-tools\";\n\nexport type SourceType = Blob | File | string;\n\nexport type ResizeOutput = Blob | string;\n\nexport type CreateImageOptions = {\n /** The owner of the image. Can be either a Group or Account. If not specified, the current user will be the owner. */\n owner?: Group | Account;\n /**\n * Controls placeholder generation for the image.\n * - `\"blur\"`: Generates a blurred placeholder image (default)\n * - `false`: No placeholder is generated\n * @default \"blur\"\n */\n placeholder?: \"blur\" | false;\n /**\n * Maximum size constraint for the image. The image will be resized to fit within this size while maintaining aspect ratio.\n * If the image is smaller than maxSize in both dimensions, no resizing occurs.\n * @example 1024 // Resizes image to fit within 1024px in the largest dimension\n */\n maxSize?: number; // | [number, number];\n /**\n * The progressive loading pattern is a technique that allows images to load incrementally, starting with a small version and gradually replacing it with a larger version as it becomes available.\n * This is useful for improving the user experience by showing a placeholder while the image is loading.\n *\n * Passing progressive: true to createImage() will create internal smaller versions of the image for future uses.\n *\n * @default false\n */\n progressive?: boolean;\n};\n\nexport type CreateImageImpl<\n TSourceType = SourceType,\n TResizeOutput = ResizeOutput,\n> = {\n createFileStreamFromSource: (\n imageBlobOrFile: TSourceType | TResizeOutput,\n owner?: Group | Account,\n ) => Promise<FileStream>;\n getImageSize: (\n imageBlobOrFile: TSourceType,\n ) => Promise<{ width: number; height: number }>;\n getPlaceholderBase64: (imageBlobOrFile: TSourceType) => Promise<string>;\n resize: (\n imageBlobOrFile: TSourceType,\n width: number,\n height: number,\n ) => Promise<TResizeOutput>;\n};\n\nexport function createImageFactory<TSourceType, TResizeOutput>(\n impl: CreateImageImpl<TSourceType, TResizeOutput>,\n imageTypeGuard?: (imageBlobOrFile: TSourceType) => void,\n) {\n return (source: TSourceType, options?: CreateImageOptions) => {\n imageTypeGuard?.(source);\n return createImage(source, options ?? {}, impl);\n };\n}\n\nasync function createImage<TSourceType, TResizeOutput>(\n imageBlobOrFile: TSourceType,\n options: CreateImageOptions,\n impl: CreateImageImpl<TSourceType, TResizeOutput>,\n): Promise<Loaded<typeof ImageDefinition, { $each: true }>> {\n // Get the original size of the image\n const { width: originalWidth, height: originalHeight } =\n await impl.getImageSize(imageBlobOrFile);\n\n const def: {\n originalSize: [number, number];\n progressive: boolean;\n placeholderDataURL: string | undefined;\n original?: FileStream;\n files: Record<string, FileStream>;\n } = {\n originalSize: [originalWidth, originalHeight],\n progressive: false,\n placeholderDataURL: undefined,\n files: {},\n };\n\n // Placeholder\n if (options?.placeholder === \"blur\") {\n def.placeholderDataURL = await impl.getPlaceholderBase64(imageBlobOrFile);\n }\n\n /**\n * Original\n *\n * Save the original image.\n * If the maxSize is set, resize the image to the maxSize if needed\n */\n if (options?.maxSize === undefined) {\n def.original = await impl.createFileStreamFromSource(\n imageBlobOrFile,\n options?.owner,\n );\n def.files[`${originalWidth}x${originalHeight}`] = def.original;\n } else if (\n options?.maxSize >= originalWidth &&\n options?.maxSize >= originalHeight\n ) {\n // no resizes required, just return the original image\n def.original = await impl.createFileStreamFromSource(\n imageBlobOrFile,\n options?.owner,\n );\n def.files[`${originalWidth}x${originalHeight}`] = def.original;\n } else {\n const { width, height } = getNewDimensions(\n originalWidth,\n originalHeight,\n options.maxSize,\n );\n\n const blob = await impl.resize(imageBlobOrFile, width, height);\n def.originalSize = [width, height];\n def.original = await impl.createFileStreamFromSource(blob, options?.owner);\n def.files[`${width}x${height}`] = def.original;\n }\n\n const imageCoValue = ImageDefinition.create(\n {\n originalSize: def.originalSize,\n progressive: def.progressive,\n placeholderDataURL: def.placeholderDataURL,\n original: def.original,\n ...def.files,\n },\n options?.owner,\n );\n\n /**\n * Progressive loading\n *\n * Save a set of resized images using three sizes: 256, 1024, 2048\n *\n * On the client side, the image will be loaded progressively, starting from the smallest size and increasing the size until the original size is reached.\n */\n if (options?.progressive) {\n imageCoValue.$jazz.set(\"progressive\", true);\n\n const resizes = ([256, 1024, 2048] as const).filter(\n (s) =>\n s <\n Math.max(imageCoValue.originalSize[0], imageCoValue.originalSize[1]),\n );\n\n for (const size of resizes) {\n const { width, height } = getNewDimensions(\n originalWidth,\n originalHeight,\n size,\n );\n\n const blob = await impl.resize(imageBlobOrFile, width, height);\n imageCoValue.$jazz.set(\n `${width}x${height}`,\n await impl.createFileStreamFromSource(blob, options?.owner),\n );\n }\n }\n\n return imageCoValue;\n}\n\nconst getNewDimensions = (\n originalWidth: number,\n originalHeight: number,\n maxSize: number,\n) => {\n if (originalWidth > originalHeight) {\n return {\n width: maxSize,\n height: Math.round(maxSize * (originalHeight / originalWidth)),\n };\n }\n\n return {\n width: Math.round(maxSize * (originalWidth / originalHeight)),\n height: maxSize,\n };\n};\n"],"mappings":"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","names":["useEffect","useJazzContext","result","useAuthSecretStorage","useJazzContext","useEffect","jsx","useJazzContext","useAuthSecretStorage","useEffect","isLoaded","useState","jsx","useAuthSecretStorage","useJazzContext","useMemo","useState","jsx","jsxs","error","useState","jsx","jsxs","useIsAuthenticated","useDemoAuth","usePassphraseAuth","ImageDefinition","useEffect","useMemo","useRef","useState","Account","ImageDefinition","jsx","Image","ImageDefinition","useRef","useState","useMemo","useEffect"]}
@@ -1 +1 @@
1
- {"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../../src/react/media/image.tsx"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,GAAG,EAOT,MAAM,OAAO,CAAC;AAIf,MAAM,MAAM,UAAU,GAAG,IAAI,CAC3B,GAAG,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAC5B,KAAK,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CACtC,GAAG;IACF,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB;;;;;;;;;;;;;;;OAeG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAC5B;;;;;;;;;;;;;;;OAeG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;CAC9B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,KAAK,sHAmHhB,CAAC"}
1
+ {"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../../src/react/media/image.tsx"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,GAAG,EAOT,MAAM,OAAO,CAAC;AAIf,MAAM,MAAM,UAAU,GAAG,IAAI,CAC3B,GAAG,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAC5B,KAAK,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CACtC,GAAG;IACF,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB;;;;;;;;;;;;;;;OAeG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAC5B;;;;;;;;;;;;;;;OAeG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;CAC9B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,KAAK,sHAqHhB,CAAC"}
@@ -563,7 +563,9 @@ import { Image as RNImage } from "react-native";
563
563
  import { jsx as jsx3 } from "react/jsx-runtime";
564
564
  var Image = forwardRef(function Image2({ imageId, width, height, ...props }, ref) {
565
565
  const image = useCoState(ImageDefinition, imageId);
566
- const [src, setSrc] = useState2(image?.placeholderDataURL);
566
+ const [src, setSrc] = useState2(
567
+ image?.placeholderDataURL ?? "data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=="
568
+ );
567
569
  const dimensions = useMemo(() => {
568
570
  const originalWidth = image?.originalSize?.[0];
569
571
  const originalHeight = image?.originalSize?.[1];
@@ -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"],"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 useCoStateWithSelector,\n useAccountWithSelector,\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} & 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}: JazzProviderProps<S>) {\n setupKvStore(kvStore);\n\n const [contextManager] = React.useState(\n () => new ReactNativeContextManager<S>(),\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\";\n\nexport type BaseReactNativeContextOptions = {\n sync: SyncConfig;\n reconnectionTimeout?: number;\n storage?: SQLiteDatabaseDriverAsync | \"disabled\";\n CryptoProvider?: typeof PureJSCrypto | typeof RNQuickCrypto;\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 peersToLoadFrom: 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 peersToLoadFrom,\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 peersToLoadFrom.push(peer);\n }\n },\n removePeer: (peer) => {\n peersToLoadFrom.splice(peersToLoadFrom.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 peersToLoadFrom,\n setNode,\n crypto,\n storage,\n };\n}\n\nexport async function createJazzReactNativeGuestContext(\n options: BaseReactNativeContextOptions,\n) {\n const { toggleNetwork, peersToLoadFrom, setNode, crypto, storage } =\n await setupPeers(options);\n\n const context = createAnonymousJazzContext({\n crypto,\n peersToLoadFrom,\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 };\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 { toggleNetwork, peersToLoadFrom, setNode, crypto, storage } =\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 peersToLoadFrom,\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 };\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\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 * />\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, ...props },\n ref,\n) {\n const image = useCoState(ImageDefinition, imageId);\n const [src, setSrc] = useState<string | undefined>(image?.placeholderDataURL);\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;\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 (!image) {\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 { SQLiteDatabaseDriverAsync } from \"cojson\";\nexport { parseInviteLink } from \"jazz-tools\";\nexport { createInviteLink, setupKvStore } from \"./platform.js\";\nexport {\n ReactNativeContextManager,\n type JazzContextManagerProps,\n} from \"./ReactNativeContextManager.js\";\n"],"mappings":"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","names":["username","useJazzContext","React","useEffect","CryptoProvider","handleAuthUpdate","jsx","CryptoProvider","React","useEffect","useEffect","useState","jsx","Image","useState","useEffect","parseInviteLink"]}
1
+ {"version":3,"sources":["../../src/react-native-core/storage/kv-store-context.ts","../../src/react-native-core/auth/DemoAuthUI.tsx","../../src/react-native-core/auth/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"],"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 useCoStateWithSelector,\n useAccountWithSelector,\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} & 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}: JazzProviderProps<S>) {\n setupKvStore(kvStore);\n\n const [contextManager] = React.useState(\n () => new ReactNativeContextManager<S>(),\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\";\n\nexport type BaseReactNativeContextOptions = {\n sync: SyncConfig;\n reconnectionTimeout?: number;\n storage?: SQLiteDatabaseDriverAsync | \"disabled\";\n CryptoProvider?: typeof PureJSCrypto | typeof RNQuickCrypto;\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 peersToLoadFrom: 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 peersToLoadFrom,\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 peersToLoadFrom.push(peer);\n }\n },\n removePeer: (peer) => {\n peersToLoadFrom.splice(peersToLoadFrom.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 peersToLoadFrom,\n setNode,\n crypto,\n storage,\n };\n}\n\nexport async function createJazzReactNativeGuestContext(\n options: BaseReactNativeContextOptions,\n) {\n const { toggleNetwork, peersToLoadFrom, setNode, crypto, storage } =\n await setupPeers(options);\n\n const context = createAnonymousJazzContext({\n crypto,\n peersToLoadFrom,\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 };\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 { toggleNetwork, peersToLoadFrom, setNode, crypto, storage } =\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 peersToLoadFrom,\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 };\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\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 * />\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, ...props },\n ref,\n) {\n const image = useCoState(ImageDefinition, imageId);\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;\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 (!image) {\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 { SQLiteDatabaseDriverAsync } from \"cojson\";\nexport { parseInviteLink } from \"jazz-tools\";\nexport { createInviteLink, setupKvStore } from \"./platform.js\";\nexport {\n ReactNativeContextManager,\n type JazzContextManagerProps,\n} from \"./ReactNativeContextManager.js\";\n"],"mappings":"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","names":["username","useJazzContext","React","useEffect","CryptoProvider","handleAuthUpdate","jsx","CryptoProvider","React","useEffect","useEffect","useState","jsx","Image","useState","useEffect","parseInviteLink"]}
@@ -1 +1 @@
1
- {"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../../src/react-native-core/media/image.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,IAAI,OAAO,EAAE,UAAU,IAAI,YAAY,EAAE,MAAM,cAAc,CAAC;AAG5E,MAAM,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC,GAAG;IAC3E,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAC5B;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;CAC9B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,KAAK;IA3DhB,+CAA+C;aACtC,MAAM;IACf;;;;;;;;;;;;OAYG;YACK,MAAM,GAAG,UAAU;IAC3B;;;;;;;;;;;;OAYG;aACM,MAAM,GAAG,UAAU;2CA0H5B,CAAC"}
1
+ {"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../../src/react-native-core/media/image.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,IAAI,OAAO,EAAE,UAAU,IAAI,YAAY,EAAE,MAAM,cAAc,CAAC;AAG5E,MAAM,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC,GAAG;IAC3E,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAC5B;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;CAC9B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,KAAK;IA3DhB,+CAA+C;aACtC,MAAM;IACf;;;;;;;;;;;;OAYG;YACK,MAAM,GAAG,UAAU;IAC3B;;;;;;;;;;;;OAYG;aACM,MAAM,GAAG,UAAU;2CA6H5B,CAAC"}