jazz-tools 0.17.1 → 0.17.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
 
2
- > jazz-tools@0.17.1 build /home/runner/_work/jazz/jazz/packages/jazz-tools
2
+ > jazz-tools@0.17.3 build /home/runner/_work/jazz/jazz/packages/jazz-tools
3
3
  > tsup && pnpm types && pnpm build:svelte
4
4
 
5
5
  CLI Building entry: {"index":"src/index.ts","testing":"src/testing.ts"}
@@ -102,82 +102,82 @@
102
102
  ESM Build start
103
103
  ESM dist/react/ssr.js 688.00 B
104
104
  ESM dist/react/ssr.js.map 1.12 KB
105
- ESM ⚡️ Build success in 15ms
106
- ESM dist/worker/index.js 2.31 KB
107
- ESM dist/worker/index.js.map 4.77 KB
108
- ESM ⚡️ Build success in 12ms
105
+ ESM ⚡️ Build success in 23ms
109
106
  ESM dist/tiptap/index.js 564.00 B
110
107
  ESM dist/tiptap/index.js.map 1.21 KB
111
- ESM ⚡️ Build success in 13ms
112
- ESM dist/react-native/index.js 2.53 KB
113
- ESM dist/react-native/crypto.js 117.00 B
114
- ESM dist/react-native/testing.js 120.00 B
115
- ESM dist/react-native/index.js.map 5.68 KB
116
- ESM dist/react-native/crypto.js.map 174.00 B
117
- ESM dist/react-native/testing.js.map 176.00 B
118
- ESM ⚡️ Build success in 18ms
108
+ ESM ⚡️ Build success in 21ms
109
+ ESM dist/worker/index.js 2.31 KB
110
+ ESM dist/worker/index.js.map 4.77 KB
111
+ ESM ⚡️ Build success in 22ms
119
112
  ESM dist/media/index.js 236.00 B
120
113
  ESM dist/media/index.browser.js 3.21 KB
121
- ESM dist/media/index.native.js 3.39 KB
122
114
  ESM dist/media/chunk-JBLT443O.js 6.33 KB
115
+ ESM dist/media/index.native.js 3.53 KB
123
116
  ESM dist/media/index.js.map 71.00 B
124
- ESM dist/media/index.native.js.map 6.18 KB
125
117
  ESM dist/media/index.browser.js.map 6.02 KB
118
+ ESM dist/media/index.native.js.map 6.52 KB
126
119
  ESM dist/media/chunk-JBLT443O.js.map 15.68 KB
127
- ESM ⚡️ Build success in 22ms
128
- ESM dist/expo/crypto.js 109.00 B
129
- ESM dist/expo/index.js 4.65 KB
130
- ESM dist/expo/testing.js 112.00 B
131
- ESM dist/expo/crypto.js.map 166.00 B
132
- ESM dist/expo/index.js.map 10.17 KB
133
- ESM dist/expo/testing.js.map 168.00 B
134
- ESM ⚡️ Build success in 24ms
120
+ ESM ⚡️ Build success in 28ms
135
121
  ESM dist/react-core/index.js 8.41 KB
136
122
  ESM dist/react-core/chunk-7DYMJ74I.js 279.00 B
137
123
  ESM dist/react-core/testing.js 1.17 KB
138
- ESM dist/react-core/chunk-7DYMJ74I.js.map 533.00 B
139
124
  ESM dist/react-core/index.js.map 20.68 KB
125
+ ESM dist/react-core/chunk-7DYMJ74I.js.map 533.00 B
140
126
  ESM dist/react-core/testing.js.map 1.82 KB
141
- ESM ⚡️ Build success in 26ms
127
+ ESM ⚡️ Build success in 27ms
128
+ ESM dist/react-native/index.js 2.53 KB
129
+ ESM dist/react-native/testing.js 120.00 B
130
+ ESM dist/react-native/crypto.js 161.00 B
131
+ ESM dist/react-native/index.js.map 5.68 KB
132
+ ESM dist/react-native/testing.js.map 176.00 B
133
+ ESM dist/react-native/crypto.js.map 197.00 B
134
+ ESM ⚡️ Build success in 28ms
142
135
  ESM dist/browser/index.js 13.43 KB
143
136
  ESM dist/browser/index.js.map 28.65 KB
144
- ESM ⚡️ Build success in 31ms
145
- ESM dist/react/index.js 24.40 KB
146
- ESM dist/react/testing.js 122.00 B
147
- ESM dist/react/index.js.map 52.17 KB
148
- ESM dist/react/testing.js.map 165.00 B
137
+ ESM ⚡️ Build success in 35ms
138
+ ESM dist/expo/index.js 4.65 KB
139
+ ESM dist/expo/crypto.js 153.00 B
140
+ ESM dist/expo/testing.js 112.00 B
141
+ ESM dist/expo/index.js.map 10.17 KB
142
+ ESM dist/expo/crypto.js.map 189.00 B
143
+ ESM dist/expo/testing.js.map 168.00 B
149
144
  ESM ⚡️ Build success in 34ms
150
145
  ESM dist/react-native-core/index.js 17.90 KB
151
- ESM dist/react-native-core/crypto.js 2.10 KB
152
146
  ESM dist/react-native-core/testing.js 119.00 B
147
+ ESM dist/react-native-core/crypto.js 2.10 KB
153
148
  ESM dist/react-native-core/index.js.map 36.65 KB
154
- ESM dist/react-native-core/crypto.js.map 4.25 KB
155
149
  ESM dist/react-native-core/testing.js.map 175.00 B
156
- ESM ⚡️ Build success in 35ms
150
+ ESM dist/react-native-core/crypto.js.map 4.25 KB
151
+ ESM ⚡️ Build success in 30ms
152
+ ESM dist/react/index.js 24.55 KB
153
+ ESM dist/react/testing.js 122.00 B
154
+ ESM dist/react/testing.js.map 165.00 B
155
+ ESM dist/react/index.js.map 52.42 KB
156
+ ESM ⚡️ Build success in 33ms
157
157
  ESM dist/prosemirror/index.js 76.90 KB
158
158
  ESM dist/prosemirror/index.js.map 305.53 KB
159
- ESM ⚡️ Build success in 46ms
159
+ ESM ⚡️ Build success in 40ms
160
160
  ESM dist/inspector/index.js 60.40 KB
161
161
  ESM dist/inspector/index.js.map 107.91 KB
162
- ESM ⚡️ Build success in 56ms
163
- ESM dist/testing.js 6.76 KB
162
+ ESM ⚡️ Build success in 47ms
164
163
  ESM dist/index.js 25.95 KB
164
+ ESM dist/testing.js 6.76 KB
165
165
  ESM dist/chunk-2SH44VLX.js 150.65 KB
166
166
  ESM dist/testing.js.map 13.07 KB
167
167
  ESM dist/index.js.map 52.62 KB
168
168
  ESM dist/chunk-2SH44VLX.js.map 361.51 KB
169
- ESM ⚡️ Build success in 71ms
169
+ ESM ⚡️ Build success in 63ms
170
170
  ESM dist/inspector/register-custom-element.js 218.00 B
171
171
  ESM dist/inspector/register-custom-element.js.map 314.00 B
172
172
  ESM dist/inspector/custom-element-I7L56H6B.js 1.53 MB
173
173
  ESM dist/inspector/custom-element-I7L56H6B.js.map 2.35 MB
174
- ESM ⚡️ Build success in 114ms
174
+ ESM ⚡️ Build success in 104ms
175
175
 
176
- > jazz-tools@0.17.1 types /home/runner/_work/jazz/jazz/packages/jazz-tools
176
+ > jazz-tools@0.17.3 types /home/runner/_work/jazz/jazz/packages/jazz-tools
177
177
  > tsc --outDir dist
178
178
 
179
179
 
180
- > jazz-tools@0.17.1 build:svelte /home/runner/_work/jazz/jazz/packages/jazz-tools
180
+ > jazz-tools@0.17.3 build:svelte /home/runner/_work/jazz/jazz/packages/jazz-tools
181
181
  > rm -rf dist/svelte && svelte-package -i src/svelte -o dist/svelte --tsconfig tsconfig.svelte.json
182
182
 
183
183
  src/svelte -> dist/svelte
package/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # jazz-tools
2
2
 
3
+ ## 0.17.3
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [f0c73d9]
8
+ - cojson@0.17.3
9
+ - cojson-storage-indexeddb@0.17.3
10
+ - cojson-transport-ws@0.17.3
11
+
12
+ ## 0.17.2
13
+
14
+ ### Patch Changes
15
+
16
+ - 794681a: fix unused blob creation on react Image component
17
+ - 83fc22f: React Native resizer is now imported dynamically, as it is an optional dependency
18
+ - Updated dependencies [5b2b16a]
19
+ - cojson@0.17.2
20
+ - cojson-storage-indexeddb@0.17.2
21
+ - cojson-transport-ws@0.17.2
22
+
3
23
  ## 0.17.1
4
24
 
5
25
  ### Patch Changes
@@ -1,2 +1,2 @@
1
- export * from "jazz-tools/react-native-core/crypto";
1
+ export { RNQuickCrypto } from "jazz-tools/react-native-core/crypto";
2
2
  //# sourceMappingURL=crypto.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/expo/crypto.ts"],"names":[],"mappings":"AAAA,cAAc,qCAAqC,CAAC"}
1
+ {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/expo/crypto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC"}
@@ -1,3 +1,6 @@
1
1
  // src/expo/crypto.ts
2
- export * from "jazz-tools/react-native-core/crypto";
2
+ import { RNQuickCrypto } from "jazz-tools/react-native-core/crypto";
3
+ export {
4
+ RNQuickCrypto
5
+ };
3
6
  //# sourceMappingURL=crypto.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/expo/crypto.ts"],"sourcesContent":["export * from \"jazz-tools/react-native-core/crypto\";\n"],"mappings":";AAAA,cAAc;","names":[]}
1
+ {"version":3,"sources":["../../src/expo/crypto.ts"],"sourcesContent":["export { RNQuickCrypto } from \"jazz-tools/react-native-core/crypto\";\n"],"mappings":";AAAA,SAAS,qBAAqB;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.native.d.ts","sourceRoot":"","sources":["../../src/media/index.native.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAmB,MAAM,YAAY,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,OAAO,EACL,kBAAkB,EAClB,UAAU,EACV,kBAAkB,EACnB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAE9B,wBAAsB,WAAW,CAC/B,eAAe,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM,EACrC,OAAO,CAAC,EAAE,kBAAkB;;;;;;;;;gCAQ7B;AAmFD,wBAAsB,0BAA0B,CAC9C,QAAQ,EAAE,UAAU,EACpB,KAAK,CAAC,EAAE,OAAO,GAAG,KAAK,GACtB,OAAO,CAAC,UAAU,CAAC,CAarB"}
1
+ {"version":3,"file":"index.native.d.ts","sourceRoot":"","sources":["../../src/media/index.native.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,OAAO,EACL,kBAAkB,EAClB,UAAU,EACV,kBAAkB,EACnB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAI9B,wBAAsB,WAAW,CAC/B,eAAe,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM,EACrC,OAAO,CAAC,EAAE,kBAAkB;;;;;;;;;gCAmB7B;AAmFD,wBAAsB,0BAA0B,CAC9C,QAAQ,EAAE,UAAU,EACpB,KAAK,CAAC,EAAE,OAAO,GAAG,KAAK,GACtB,OAAO,CAAC,UAAU,CAAC,CAarB"}
@@ -6,10 +6,19 @@ import {
6
6
  } from "./chunk-JBLT443O.js";
7
7
 
8
8
  // src/media/index.native.ts
9
- import ImageResizer from "@bam.tech/react-native-image-resizer";
10
9
  import { FileStream } from "jazz-tools";
11
10
  import { Image } from "react-native";
11
+ var ImageResizer;
12
12
  async function createImage(imageBlobOrFile, options) {
13
+ if (!ImageResizer) {
14
+ try {
15
+ ImageResizer = (await import("@bam.tech/react-native-image-resizer")).default;
16
+ } catch (e) {
17
+ throw new Error(
18
+ "ImageResizer is not installed, please run `npm install @bam.tech/react-native-image-resizer`"
19
+ );
20
+ }
21
+ }
13
22
  return createImageFactory({
14
23
  getImageSize,
15
24
  getPlaceholderBase64,
@@ -32,7 +41,7 @@ async function getPlaceholderBase64(filePath) {
32
41
  "createImage(Blob | File) is not supported on this platform"
33
42
  );
34
43
  }
35
- if (typeof ImageResizer === "undefined" || ImageResizer === null) {
44
+ if (!ImageResizer) {
36
45
  throw new Error(
37
46
  "ImageResizer is not installed, please run `npm install @bam.tech/react-native-image-resizer`"
38
47
  );
@@ -52,7 +61,7 @@ async function resize(filePath, width, height) {
52
61
  "createImage(Blob | File) is not supported on this platform"
53
62
  );
54
63
  }
55
- if (typeof ImageResizer === "undefined" || ImageResizer === null) {
64
+ if (!ImageResizer) {
56
65
  throw new Error(
57
66
  "ImageResizer is not installed, please run `npm install @bam.tech/react-native-image-resizer`"
58
67
  );
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/media/index.native.ts"],"sourcesContent":["import ImageResizer from \"@bam.tech/react-native-image-resizer\";\nimport type { Account, Group, ImageDefinition } from \"jazz-tools\";\nimport { FileStream } from \"jazz-tools\";\nimport { Image } from \"react-native\";\nimport {\n CreateImageOptions,\n SourceType,\n createImageFactory,\n} from \"./create-image.js\";\n\nexport { highestResAvailable, loadImage, loadImageBySize } from \"./utils.js\";\nexport { createImageFactory };\n\nexport async function createImage(\n imageBlobOrFile: Blob | File | string,\n options?: CreateImageOptions,\n) {\n return createImageFactory({\n getImageSize,\n getPlaceholderBase64,\n createFileStreamFromSource,\n resize,\n })(imageBlobOrFile, options || {});\n}\n\nasync function getImageSize(\n filePath: SourceType,\n): Promise<{ width: number; height: number }> {\n if (typeof filePath !== \"string\") {\n throw new Error(\n \"createImage(Blob | File) is not supported on this platform\",\n );\n }\n\n const { width, height } = await Image.getSize(filePath);\n\n return { width, height };\n}\n\nasync function getPlaceholderBase64(filePath: SourceType): Promise<string> {\n if (typeof filePath !== \"string\") {\n throw new Error(\n \"createImage(Blob | File) is not supported on this platform\",\n );\n }\n\n if (typeof ImageResizer === \"undefined\" || ImageResizer === null) {\n throw new Error(\n \"ImageResizer is not installed, please run `npm install @bam.tech/react-native-image-resizer`\",\n );\n }\n\n const { uri } = await ImageResizer.createResizedImage(\n filePath,\n 8,\n 8,\n \"PNG\",\n 100,\n );\n\n return imageUrlToBase64(uri);\n}\n\nasync function resize(\n filePath: SourceType,\n width: number,\n height: number,\n): Promise<string> {\n if (typeof filePath !== \"string\") {\n throw new Error(\n \"createImage(Blob | File) is not supported on this platform\",\n );\n }\n\n if (typeof ImageResizer === \"undefined\" || ImageResizer === null) {\n throw new Error(\n \"ImageResizer is not installed, please run `npm install @bam.tech/react-native-image-resizer`\",\n );\n }\n\n const mimeType = await getMimeType(filePath);\n\n const { uri } = await ImageResizer.createResizedImage(\n filePath,\n width,\n height,\n contentTypeToFormat(mimeType),\n 80,\n );\n\n return uri;\n}\n\nfunction getMimeType(filePath: string): Promise<string> {\n return fetch(filePath)\n .then((res) => res.blob())\n .then((blob) => blob.type);\n}\n\nfunction contentTypeToFormat(contentType: string) {\n if (contentType.includes(\"image/png\")) return \"PNG\";\n if (contentType.includes(\"image/jpeg\")) return \"JPEG\";\n if (contentType.includes(\"image/webp\")) return \"WEBP\";\n return \"PNG\";\n}\n\nexport async function createFileStreamFromSource(\n filePath: SourceType,\n owner?: Account | Group,\n): Promise<FileStream> {\n if (typeof filePath !== \"string\") {\n throw new Error(\n \"createImage(Blob | File) is not supported on this platform\",\n );\n }\n\n const blob = await fetch(filePath).then((res) => res.blob());\n const arrayBuffer = await toArrayBuffer(blob);\n\n return FileStream.createFromArrayBuffer(arrayBuffer, blob.type, undefined, {\n owner,\n });\n}\n\n// TODO: look for more efficient way to do this as React Native hasn't blob.arrayBuffer()\nfunction toArrayBuffer(blob: Blob): Promise<ArrayBuffer> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => {\n resolve(reader.result as ArrayBuffer);\n };\n reader.onerror = (error) => {\n reject(error);\n };\n reader.readAsArrayBuffer(blob);\n });\n}\n\nasync function imageUrlToBase64(url: string): Promise<string> {\n const response = await fetch(url);\n const blob = await response.blob();\n return new Promise((onSuccess, onError) => {\n try {\n const reader = new FileReader();\n reader.onload = function () {\n onSuccess(reader.result as string);\n };\n reader.readAsDataURL(blob);\n } catch (e) {\n onError(e);\n }\n });\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/media/index.native.ts"],"sourcesContent":["import type ImageResizerType from \"@bam.tech/react-native-image-resizer\";\nimport type { Account, Group } from \"jazz-tools\";\nimport { FileStream } from \"jazz-tools\";\nimport { Image } from \"react-native\";\nimport {\n CreateImageOptions,\n SourceType,\n createImageFactory,\n} from \"./create-image.js\";\n\nexport { highestResAvailable, loadImage, loadImageBySize } from \"./utils.js\";\nexport { createImageFactory };\n\nlet ImageResizer: typeof ImageResizerType | undefined;\n\nexport async function createImage(\n imageBlobOrFile: Blob | File | string,\n options?: CreateImageOptions,\n) {\n if (!ImageResizer) {\n try {\n ImageResizer = (await import(\"@bam.tech/react-native-image-resizer\"))\n .default;\n } catch (e) {\n throw new Error(\n \"ImageResizer is not installed, please run `npm install @bam.tech/react-native-image-resizer`\",\n );\n }\n }\n\n return createImageFactory({\n getImageSize,\n getPlaceholderBase64,\n createFileStreamFromSource,\n resize,\n })(imageBlobOrFile, options || {});\n}\n\nasync function getImageSize(\n filePath: SourceType,\n): Promise<{ width: number; height: number }> {\n if (typeof filePath !== \"string\") {\n throw new Error(\n \"createImage(Blob | File) is not supported on this platform\",\n );\n }\n\n const { width, height } = await Image.getSize(filePath);\n\n return { width, height };\n}\n\nasync function getPlaceholderBase64(filePath: SourceType): Promise<string> {\n if (typeof filePath !== \"string\") {\n throw new Error(\n \"createImage(Blob | File) is not supported on this platform\",\n );\n }\n\n if (!ImageResizer) {\n throw new Error(\n \"ImageResizer is not installed, please run `npm install @bam.tech/react-native-image-resizer`\",\n );\n }\n\n const { uri } = await ImageResizer.createResizedImage(\n filePath,\n 8,\n 8,\n \"PNG\",\n 100,\n );\n\n return imageUrlToBase64(uri);\n}\n\nasync function resize(\n filePath: SourceType,\n width: number,\n height: number,\n): Promise<string> {\n if (typeof filePath !== \"string\") {\n throw new Error(\n \"createImage(Blob | File) is not supported on this platform\",\n );\n }\n\n if (!ImageResizer) {\n throw new Error(\n \"ImageResizer is not installed, please run `npm install @bam.tech/react-native-image-resizer`\",\n );\n }\n\n const mimeType = await getMimeType(filePath);\n\n const { uri } = await ImageResizer.createResizedImage(\n filePath,\n width,\n height,\n contentTypeToFormat(mimeType),\n 80,\n );\n\n return uri;\n}\n\nfunction getMimeType(filePath: string): Promise<string> {\n return fetch(filePath)\n .then((res) => res.blob())\n .then((blob) => blob.type);\n}\n\nfunction contentTypeToFormat(contentType: string) {\n if (contentType.includes(\"image/png\")) return \"PNG\";\n if (contentType.includes(\"image/jpeg\")) return \"JPEG\";\n if (contentType.includes(\"image/webp\")) return \"WEBP\";\n return \"PNG\";\n}\n\nexport async function createFileStreamFromSource(\n filePath: SourceType,\n owner?: Account | Group,\n): Promise<FileStream> {\n if (typeof filePath !== \"string\") {\n throw new Error(\n \"createImage(Blob | File) is not supported on this platform\",\n );\n }\n\n const blob = await fetch(filePath).then((res) => res.blob());\n const arrayBuffer = await toArrayBuffer(blob);\n\n return FileStream.createFromArrayBuffer(arrayBuffer, blob.type, undefined, {\n owner,\n });\n}\n\n// TODO: look for more efficient way to do this as React Native hasn't blob.arrayBuffer()\nfunction toArrayBuffer(blob: Blob): Promise<ArrayBuffer> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => {\n resolve(reader.result as ArrayBuffer);\n };\n reader.onerror = (error) => {\n reject(error);\n };\n reader.readAsArrayBuffer(blob);\n });\n}\n\nasync function imageUrlToBase64(url: string): Promise<string> {\n const response = await fetch(url);\n const blob = await response.blob();\n return new Promise((onSuccess, onError) => {\n try {\n const reader = new FileReader();\n reader.onload = function () {\n onSuccess(reader.result as string);\n };\n reader.readAsDataURL(blob);\n } catch (e) {\n onError(e);\n }\n });\n}\n"],"mappings":"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","names":[]}
@@ -703,7 +703,7 @@ var Image = forwardRef(function Image2({ imageId, width, height, ...props }, ref
703
703
  props.loading === "lazy"
704
704
  );
705
705
  const lazyPlaceholder = useMemo3(
706
- () => waitingLazyLoading ? URL.createObjectURL(emptyPixelBlob) : void 0,
706
+ () => waitingLazyLoading ? URL.createObjectURL(getEmptyPixelBlob()) : void 0,
707
707
  [waitingLazyLoading]
708
708
  );
709
709
  const dimensions = useMemo3(() => {
@@ -784,17 +784,23 @@ function revokeObjectURL(url) {
784
784
  URL.revokeObjectURL(url);
785
785
  }
786
786
  }
787
- var emptyPixelBlob = new Blob(
788
- [
789
- Uint8Array.from(
790
- atob(
791
- "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg=="
792
- ),
793
- (c) => c.charCodeAt(0)
794
- )
795
- ],
796
- { type: "image/png" }
797
- );
787
+ var emptyPixelBlob;
788
+ function getEmptyPixelBlob() {
789
+ if (!emptyPixelBlob) {
790
+ emptyPixelBlob = new Blob(
791
+ [
792
+ Uint8Array.from(
793
+ atob(
794
+ "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg=="
795
+ ),
796
+ (c) => c.charCodeAt(0)
797
+ )
798
+ ],
799
+ { type: "image/png" }
800
+ );
801
+ }
802
+ return emptyPixelBlob;
803
+ }
798
804
  export {
799
805
  DemoAuthBasicUI,
800
806
  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/create-image.ts","../../src/media/utils.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} & 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}: 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}\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} 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} 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 { 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(context.authenticate, authSecretStorage);\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: { clerk: MinimalClerkClient } & 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 null;\n }\n\n return (\n <JazzReactProvider {...props} logOutReplacement={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(emptyPixelBlob) : 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.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.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\nconst 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","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 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 createFileStreamFromSource: (\n imageBlobOrFile: SourceType,\n owner?: Group | Account,\n ) => Promise<FileStream>;\n getImageSize: (\n imageBlobOrFile: SourceType,\n ) => Promise<{ width: number; height: number }>;\n getPlaceholderBase64: (imageBlobOrFile: SourceType) => Promise<string>;\n resize: (\n imageBlobOrFile: SourceType,\n width: number,\n height: number,\n ) => Promise<Blob | string>;\n};\n\nexport function createImageFactory(impl: CreateImageImpl) {\n return (source: SourceType, options: CreateImageOptions) =>\n createImage(source, options, impl);\n}\n\nasync function createImage(\n imageBlobOrFile: SourceType,\n options: CreateImageOptions,\n impl: CreateImageImpl,\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.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[`${width}x${height}`] =\n await impl.createFileStreamFromSource(blob, options?.owner);\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","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._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(image._raw.get(size[2]) as CoID<any> | undefined),\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()._raw.core.node.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.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 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._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 const file = image[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"],"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","FileStream","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/create-image.ts","../../src/media/utils.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} & 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}: 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}\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} 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} 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 { 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(context.authenticate, authSecretStorage);\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: { clerk: MinimalClerkClient } & 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 null;\n }\n\n return (\n <JazzReactProvider {...props} logOutReplacement={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.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.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 {\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 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 createFileStreamFromSource: (\n imageBlobOrFile: SourceType,\n owner?: Group | Account,\n ) => Promise<FileStream>;\n getImageSize: (\n imageBlobOrFile: SourceType,\n ) => Promise<{ width: number; height: number }>;\n getPlaceholderBase64: (imageBlobOrFile: SourceType) => Promise<string>;\n resize: (\n imageBlobOrFile: SourceType,\n width: number,\n height: number,\n ) => Promise<Blob | string>;\n};\n\nexport function createImageFactory(impl: CreateImageImpl) {\n return (source: SourceType, options: CreateImageOptions) =>\n createImage(source, options, impl);\n}\n\nasync function createImage(\n imageBlobOrFile: SourceType,\n options: CreateImageOptions,\n impl: CreateImageImpl,\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.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[`${width}x${height}`] =\n await impl.createFileStreamFromSource(blob, options?.owner);\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","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._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(image._raw.get(size[2]) as CoID<any> | undefined),\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()._raw.core.node.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.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 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._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 const file = image[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"],"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","FileStream","ImageDefinition","jsx","Image","ImageDefinition","useRef","useState","useMemo","useEffect"]}
@@ -1,2 +1,2 @@
1
- export * from "jazz-tools/react-native-core/crypto";
1
+ export { RNQuickCrypto } from "jazz-tools/react-native-core/crypto";
2
2
  //# sourceMappingURL=crypto.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/react-native/crypto.ts"],"names":[],"mappings":"AAAA,cAAc,qCAAqC,CAAC"}
1
+ {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/react-native/crypto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC"}
@@ -1,3 +1,6 @@
1
1
  // src/react-native/crypto.ts
2
- export * from "jazz-tools/react-native-core/crypto";
2
+ import { RNQuickCrypto } from "jazz-tools/react-native-core/crypto";
3
+ export {
4
+ RNQuickCrypto
5
+ };
3
6
  //# sourceMappingURL=crypto.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/react-native/crypto.ts"],"sourcesContent":["export * from \"jazz-tools/react-native-core/crypto\";\n"],"mappings":";AAAA,cAAc;","names":[]}
1
+ {"version":3,"sources":["../../src/react-native/crypto.ts"],"sourcesContent":["export { RNQuickCrypto } from \"jazz-tools/react-native-core/crypto\";\n"],"mappings":";AAAA,SAAS,qBAAqB;","names":[]}
package/package.json CHANGED
@@ -36,7 +36,7 @@
36
36
  "default": "./dist/expo/index.js"
37
37
  },
38
38
  "./expo/crypto": {
39
- "@jazz-tools/source": "./src/expo/crypto/index.ts",
39
+ "@jazz-tools/source": "./src/expo/crypto.ts",
40
40
  "types": "./dist/expo/crypto.d.ts",
41
41
  "default": "./dist/expo/crypto.js"
42
42
  },
@@ -91,7 +91,7 @@
91
91
  "default": "./dist/react-native/index.js"
92
92
  },
93
93
  "./react-native/crypto": {
94
- "@jazz-tools/source": "./src/react-native/crypto/index.ts",
94
+ "@jazz-tools/source": "./src/react-native/crypto.ts",
95
95
  "types": "./dist/react-native/crypto.d.ts",
96
96
  "default": "./dist/react-native/crypto.js"
97
97
  },
@@ -140,7 +140,7 @@
140
140
  },
141
141
  "type": "module",
142
142
  "license": "MIT",
143
- "version": "0.17.1",
143
+ "version": "0.17.3",
144
144
  "dependencies": {
145
145
  "@manuscripts/prosemirror-recreate-steps": "^0.1.4",
146
146
  "@scure/base": "1.2.1",
@@ -156,9 +156,9 @@
156
156
  "prosemirror-state": "^1.4.3",
157
157
  "prosemirror-transform": "^1.9.0",
158
158
  "zod": "3.25.76",
159
- "cojson": "0.17.1",
160
- "cojson-storage-indexeddb": "0.17.1",
161
- "cojson-transport-ws": "0.17.1"
159
+ "cojson-storage-indexeddb": "0.17.3",
160
+ "cojson": "0.17.3",
161
+ "cojson-transport-ws": "0.17.3"
162
162
  },
163
163
  "devDependencies": {
164
164
  "@scure/bip39": "^1.3.0",
@@ -1 +1 @@
1
- export * from "jazz-tools/react-native-core/crypto";
1
+ export { RNQuickCrypto } from "jazz-tools/react-native-core/crypto";
@@ -1,5 +1,5 @@
1
- import ImageResizer from "@bam.tech/react-native-image-resizer";
2
- import type { Account, Group, ImageDefinition } from "jazz-tools";
1
+ import type ImageResizerType from "@bam.tech/react-native-image-resizer";
2
+ import type { Account, Group } from "jazz-tools";
3
3
  import { FileStream } from "jazz-tools";
4
4
  import { Image } from "react-native";
5
5
  import {
@@ -11,10 +11,23 @@ import {
11
11
  export { highestResAvailable, loadImage, loadImageBySize } from "./utils.js";
12
12
  export { createImageFactory };
13
13
 
14
+ let ImageResizer: typeof ImageResizerType | undefined;
15
+
14
16
  export async function createImage(
15
17
  imageBlobOrFile: Blob | File | string,
16
18
  options?: CreateImageOptions,
17
19
  ) {
20
+ if (!ImageResizer) {
21
+ try {
22
+ ImageResizer = (await import("@bam.tech/react-native-image-resizer"))
23
+ .default;
24
+ } catch (e) {
25
+ throw new Error(
26
+ "ImageResizer is not installed, please run `npm install @bam.tech/react-native-image-resizer`",
27
+ );
28
+ }
29
+ }
30
+
18
31
  return createImageFactory({
19
32
  getImageSize,
20
33
  getPlaceholderBase64,
@@ -44,7 +57,7 @@ async function getPlaceholderBase64(filePath: SourceType): Promise<string> {
44
57
  );
45
58
  }
46
59
 
47
- if (typeof ImageResizer === "undefined" || ImageResizer === null) {
60
+ if (!ImageResizer) {
48
61
  throw new Error(
49
62
  "ImageResizer is not installed, please run `npm install @bam.tech/react-native-image-resizer`",
50
63
  );
@@ -72,7 +85,7 @@ async function resize(
72
85
  );
73
86
  }
74
87
 
75
- if (typeof ImageResizer === "undefined" || ImageResizer === null) {
88
+ if (!ImageResizer) {
76
89
  throw new Error(
77
90
  "ImageResizer is not installed, please run `npm install @bam.tech/react-native-image-resizer`",
78
91
  );
@@ -92,7 +92,7 @@ export const Image = forwardRef<HTMLImageElement, ImageProps>(function Image(
92
92
  );
93
93
  const lazyPlaceholder = useMemo(
94
94
  () =>
95
- waitingLazyLoading ? URL.createObjectURL(emptyPixelBlob) : undefined,
95
+ waitingLazyLoading ? URL.createObjectURL(getEmptyPixelBlob()) : undefined,
96
96
  [waitingLazyLoading],
97
97
  );
98
98
 
@@ -197,14 +197,20 @@ function revokeObjectURL(url: string | undefined) {
197
197
  }
198
198
  }
199
199
 
200
- const emptyPixelBlob = new Blob(
201
- [
202
- Uint8Array.from(
203
- atob(
204
- "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg==",
205
- ),
206
- (c) => c.charCodeAt(0),
207
- ),
208
- ],
209
- { type: "image/png" },
210
- );
200
+ let emptyPixelBlob: Blob | undefined;
201
+ function getEmptyPixelBlob() {
202
+ if (!emptyPixelBlob) {
203
+ emptyPixelBlob = new Blob(
204
+ [
205
+ Uint8Array.from(
206
+ atob(
207
+ "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg==",
208
+ ),
209
+ (c) => c.charCodeAt(0),
210
+ ),
211
+ ],
212
+ { type: "image/png" },
213
+ );
214
+ }
215
+ return emptyPixelBlob;
216
+ }
@@ -1 +1 @@
1
- export * from "jazz-tools/react-native-core/crypto";
1
+ export { RNQuickCrypto } from "jazz-tools/react-native-core/crypto";