@medialane/ui 0.192.0 → 0.194.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/components/button.d.cts +1 -1
  2. package/dist/components/button.d.ts +1 -1
  3. package/dist/components/collection-card.cjs +2 -2
  4. package/dist/components/collection-card.cjs.map +1 -1
  5. package/dist/components/collection-card.js +2 -2
  6. package/dist/components/collection-card.js.map +1 -1
  7. package/dist/components/discover-creators-strip.cjs +2 -2
  8. package/dist/components/discover-creators-strip.cjs.map +1 -1
  9. package/dist/components/discover-creators-strip.js +2 -2
  10. package/dist/components/discover-creators-strip.js.map +1 -1
  11. package/dist/components/drop/drop-card.cjs +7 -1
  12. package/dist/components/drop/drop-card.cjs.map +1 -1
  13. package/dist/components/drop/drop-card.js +7 -1
  14. package/dist/components/drop/drop-card.js.map +1 -1
  15. package/dist/components/fast-mint/fast-mint.d.cts +2 -2
  16. package/dist/components/fast-mint/fast-mint.d.ts +2 -2
  17. package/dist/components/medialane-collection-card.cjs +1 -1
  18. package/dist/components/medialane-collection-card.cjs.map +1 -1
  19. package/dist/components/medialane-collection-card.js +1 -1
  20. package/dist/components/medialane-collection-card.js.map +1 -1
  21. package/dist/components/sheet.d.cts +1 -1
  22. package/dist/components/sheet.d.ts +1 -1
  23. package/dist/index.cjs +2 -0
  24. package/dist/index.cjs.map +1 -1
  25. package/dist/index.d.cts +1 -1
  26. package/dist/index.d.ts +1 -1
  27. package/dist/index.js +3 -1
  28. package/dist/index.js.map +1 -1
  29. package/dist/utils/ipfs-upload.cjs +77 -9
  30. package/dist/utils/ipfs-upload.cjs.map +1 -1
  31. package/dist/utils/ipfs-upload.d.cts +14 -1
  32. package/dist/utils/ipfs-upload.d.ts +14 -1
  33. package/dist/utils/ipfs-upload.js +76 -9
  34. package/dist/utils/ipfs-upload.js.map +1 -1
  35. package/package.json +1 -1
@@ -6,6 +6,19 @@ interface UploadedIpfsFile {
6
6
  uri: string;
7
7
  }
8
8
  type SignedUploadKind = "image" | "document" | "media";
9
+ interface UploadDiagnostics {
10
+ kind: SignedUploadKind;
11
+ fileSize: number;
12
+ fileType: string;
13
+ failedAfterMs: number;
14
+ error: string;
15
+ fileReadable: string;
16
+ uploadHostReachable: string;
17
+ retry: string;
18
+ online: boolean | null;
19
+ connection: string | null;
20
+ }
21
+ declare function setUploadDiagnosticsReporter(reporter: ((diagnostics: UploadDiagnostics) => void) | null): void;
9
22
  declare function uploadFileToIpfs(api: ApiClient, file: File, kind?: SignedUploadKind): Promise<UploadedIpfsFile>;
10
23
  declare function uploadJsonToIpfs(api: ApiClient, payload: unknown): Promise<string>;
11
24
  declare function uploadDirectoryToIpfs(api: ApiClient, files: {
@@ -29,4 +42,4 @@ interface PinnedAsset {
29
42
  }
30
43
  declare function pinAssetMetadata(api: ApiClient, input: PinAssetMetadataInput): Promise<PinnedAsset>;
31
44
 
32
- export { FILE_UPLOAD_FAILED, type PinAssetMetadataInput, type PinnedAsset, type SignedUploadKind, type UploadedIpfsFile, isUserRejection, pinAssetMetadata, uploadDirectoryToIpfs, uploadFailureToast, uploadFileToIpfs, uploadJsonToIpfs };
45
+ export { FILE_UPLOAD_FAILED, type PinAssetMetadataInput, type PinnedAsset, type SignedUploadKind, type UploadDiagnostics, type UploadedIpfsFile, isUserRejection, pinAssetMetadata, setUploadDiagnosticsReporter, uploadDirectoryToIpfs, uploadFailureToast, uploadFileToIpfs, uploadJsonToIpfs };
@@ -6,6 +6,19 @@ interface UploadedIpfsFile {
6
6
  uri: string;
7
7
  }
8
8
  type SignedUploadKind = "image" | "document" | "media";
9
+ interface UploadDiagnostics {
10
+ kind: SignedUploadKind;
11
+ fileSize: number;
12
+ fileType: string;
13
+ failedAfterMs: number;
14
+ error: string;
15
+ fileReadable: string;
16
+ uploadHostReachable: string;
17
+ retry: string;
18
+ online: boolean | null;
19
+ connection: string | null;
20
+ }
21
+ declare function setUploadDiagnosticsReporter(reporter: ((diagnostics: UploadDiagnostics) => void) | null): void;
9
22
  declare function uploadFileToIpfs(api: ApiClient, file: File, kind?: SignedUploadKind): Promise<UploadedIpfsFile>;
10
23
  declare function uploadJsonToIpfs(api: ApiClient, payload: unknown): Promise<string>;
11
24
  declare function uploadDirectoryToIpfs(api: ApiClient, files: {
@@ -29,4 +42,4 @@ interface PinnedAsset {
29
42
  }
30
43
  declare function pinAssetMetadata(api: ApiClient, input: PinAssetMetadataInput): Promise<PinnedAsset>;
31
44
 
32
- export { FILE_UPLOAD_FAILED, type PinAssetMetadataInput, type PinnedAsset, type SignedUploadKind, type UploadedIpfsFile, isUserRejection, pinAssetMetadata, uploadDirectoryToIpfs, uploadFailureToast, uploadFileToIpfs, uploadJsonToIpfs };
45
+ export { FILE_UPLOAD_FAILED, type PinAssetMetadataInput, type PinnedAsset, type SignedUploadKind, type UploadDiagnostics, type UploadedIpfsFile, isUserRejection, pinAssetMetadata, setUploadDiagnosticsReporter, uploadDirectoryToIpfs, uploadFailureToast, uploadFileToIpfs, uploadJsonToIpfs };
@@ -3,25 +3,91 @@ const FILE_UPLOAD_FAILED = "We couldn't upload your file. Check your connection
3
3
  function uploadFailed(cause) {
4
4
  return Object.assign(new UserFacingError(FILE_UPLOAD_FAILED), { cause });
5
5
  }
6
- async function uploadFileToIpfs(api, file, kind = "image") {
6
+ let reportDiagnostics = null;
7
+ function setUploadDiagnosticsReporter(reporter) {
8
+ reportDiagnostics = reporter;
9
+ }
10
+ function describe(err) {
11
+ const text = err instanceof Error ? `${err.name}: ${err.message}` : String(err);
12
+ return text.slice(0, 300);
13
+ }
14
+ function connectionType() {
15
+ if (typeof navigator === "undefined") return null;
16
+ const connection = navigator.connection;
17
+ return connection?.effectiveType ?? null;
18
+ }
19
+ async function signedUploadUrl(api, kind) {
7
20
  const signedUrl = (await api.getMetadataSignedUrl(kind)).data?.url;
8
21
  if (!signedUrl) throw new Error("Failed to prepare the upload");
22
+ return signedUrl;
23
+ }
24
+ function postFile(signedUrl, file) {
9
25
  const formData = new FormData();
10
26
  formData.append("file", file, file.name);
11
27
  formData.append("network", "public");
12
28
  formData.append("name", file.name);
29
+ return fetch(signedUrl, { method: "POST", body: formData });
30
+ }
31
+ async function uploadedFile(res) {
32
+ const uploadJson = await res.json().catch(() => ({}));
33
+ const cid = uploadJson.data?.cid;
34
+ if (!res.ok || !cid) {
35
+ throw uploadFailed(new Error(`File upload returned HTTP ${res.status}${cid ? "" : " without a cid"}`));
36
+ }
37
+ return { cid, uri: `ipfs://${cid}` };
38
+ }
39
+ async function recoverUpload(api, file, kind, signedUrl, err, failedAfterMs) {
40
+ const diagnostics = {
41
+ kind,
42
+ fileSize: file.size,
43
+ fileType: file.type,
44
+ failedAfterMs,
45
+ error: describe(err),
46
+ fileReadable: "not checked",
47
+ uploadHostReachable: "not checked",
48
+ retry: "not attempted",
49
+ online: typeof navigator === "undefined" ? null : navigator.onLine,
50
+ connection: connectionType()
51
+ };
52
+ let copy = null;
53
+ try {
54
+ copy = new File([await file.arrayBuffer()], file.name, { type: file.type });
55
+ diagnostics.fileReadable = "ok";
56
+ } catch (readErr) {
57
+ diagnostics.fileReadable = describe(readErr);
58
+ }
59
+ try {
60
+ await fetch(new URL(signedUrl).origin, { mode: "no-cors", cache: "no-store" });
61
+ diagnostics.uploadHostReachable = "ok";
62
+ } catch (probeErr) {
63
+ diagnostics.uploadHostReachable = describe(probeErr);
64
+ }
65
+ let result = null;
66
+ if (copy) {
67
+ try {
68
+ result = await uploadedFile(await postFile(await signedUploadUrl(api, kind), copy));
69
+ diagnostics.retry = "ok";
70
+ } catch (retryErr) {
71
+ diagnostics.retry = describe(retryErr instanceof UserFacingError && retryErr.cause ? retryErr.cause : retryErr);
72
+ }
73
+ }
74
+ try {
75
+ reportDiagnostics?.(diagnostics);
76
+ } catch {
77
+ }
78
+ if (result) return result;
79
+ throw Object.assign(uploadFailed(err), { diagnostics });
80
+ }
81
+ async function uploadFileToIpfs(api, file, kind = "image") {
82
+ const signedUrl = await signedUploadUrl(api, kind);
83
+ const startedAt = Date.now();
13
84
  let uploadRes;
14
85
  try {
15
- uploadRes = await fetch(signedUrl, { method: "POST", body: formData });
86
+ uploadRes = await postFile(signedUrl, file);
16
87
  } catch (err) {
17
- throw uploadFailed(err);
88
+ return recoverUpload(api, file, kind, signedUrl, err, Date.now() - startedAt);
18
89
  }
19
- const uploadJson = await uploadRes.json().catch(() => ({}));
20
- const cid = uploadJson.data?.cid;
21
- if (!uploadRes.ok || !cid) {
22
- throw uploadFailed(new Error(`File upload returned HTTP ${uploadRes.status}${cid ? "" : " without a cid"}`));
23
- }
24
- return { cid, uri: `ipfs://${cid}` };
90
+ return uploadedFile(uploadRes);
25
91
  }
26
92
  async function uploadJsonToIpfs(api, payload) {
27
93
  const uri = (await api.uploadMetadata(payload)).data?.url;
@@ -67,6 +133,7 @@ export {
67
133
  FILE_UPLOAD_FAILED,
68
134
  isUserRejection,
69
135
  pinAssetMetadata,
136
+ setUploadDiagnosticsReporter,
70
137
  uploadDirectoryToIpfs,
71
138
  uploadFailureToast,
72
139
  uploadFileToIpfs,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/ipfs-upload.ts"],"sourcesContent":["import { buildAssetMetadata, UserFacingError, type ApiClient, type BuildAssetMetadataInput } from \"@medialane/sdk\";\n\nexport const FILE_UPLOAD_FAILED =\n \"We couldn't upload your file. Check your connection and try again, or choose a different file.\";\n\nfunction uploadFailed(cause: unknown): UserFacingError {\n return Object.assign(new UserFacingError(FILE_UPLOAD_FAILED), { cause });\n}\n\nexport interface UploadedIpfsFile {\n cid: string;\n uri: string;\n}\n\nexport type SignedUploadKind = \"image\" | \"document\" | \"media\";\n\nexport async function uploadFileToIpfs(\n api: ApiClient,\n file: File,\n kind: SignedUploadKind = \"image\",\n): Promise<UploadedIpfsFile> {\n const signedUrl = (await api.getMetadataSignedUrl(kind)).data?.url;\n if (!signedUrl) throw new Error(\"Failed to prepare the upload\");\n\n const formData = new FormData();\n formData.append(\"file\", file, file.name);\n formData.append(\"network\", \"public\");\n formData.append(\"name\", file.name);\n\n let uploadRes: Response;\n try {\n uploadRes = await fetch(signedUrl, { method: \"POST\", body: formData });\n } catch (err) {\n throw uploadFailed(err);\n }\n const uploadJson = (await uploadRes.json().catch(() => ({}))) as { data?: { cid?: string } };\n const cid = uploadJson.data?.cid;\n if (!uploadRes.ok || !cid) {\n throw uploadFailed(new Error(`File upload returned HTTP ${uploadRes.status}${cid ? \"\" : \" without a cid\"}`));\n }\n\n return { cid, uri: `ipfs://${cid}` };\n}\n\nexport async function uploadJsonToIpfs(api: ApiClient, payload: unknown): Promise<string> {\n const uri = (await api.uploadMetadata(payload as Record<string, unknown>)).data?.url;\n if (!uri) throw new Error(\"Metadata upload failed\");\n return uri;\n}\n\nexport function uploadDirectoryToIpfs(\n api: ApiClient,\n files: { name: string; content: unknown }[],\n): Promise<{ cid: string; baseUri: string }> {\n return api.uploadMetadataDirectory(files);\n}\n\nexport function isUserRejection(err: unknown): boolean {\n const msg = err instanceof Error ? err.message : String(err ?? \"\");\n return /reject|denied|declin|abort|cancel|refus/i.test(msg);\n}\n\nexport function uploadFailureToast(err: unknown): { title: string; description?: string } {\n if (isUserRejection(err)) {\n return {\n title: \"Signature declined\",\n description: \"Try again and approve the request in your wallet.\",\n };\n }\n return {\n title: \"Upload failed\",\n description: err instanceof Error ? err.message : undefined,\n };\n}\n\nexport interface PinAssetMetadataInput extends Omit<BuildAssetMetadataInput, \"registrationDate\"> {\n imageFile?: File | null;\n}\n\nexport interface PinnedAsset {\n uri: string;\n imageUri: string | null;\n}\n\nexport async function pinAssetMetadata(api: ApiClient, input: PinAssetMetadataInput): Promise<PinnedAsset> {\n const { imageFile, ...fields } = input;\n\n let imageUri = fields.imageUri ?? null;\n if (!imageUri && imageFile && imageFile.size > 0) {\n imageUri = (await uploadFileToIpfs(api, imageFile)).uri;\n }\n\n const uri = await uploadJsonToIpfs(\n api,\n buildAssetMetadata({\n ...fields,\n imageUri,\n externalUrl: fields.externalUrl || \"https://medialane.io\",\n }),\n );\n\n return { uri, imageUri };\n}\n"],"mappings":"AAAA,SAAS,oBAAoB,uBAAqE;AAE3F,MAAM,qBACX;AAEF,SAAS,aAAa,OAAiC;AACrD,SAAO,OAAO,OAAO,IAAI,gBAAgB,kBAAkB,GAAG,EAAE,MAAM,CAAC;AACzE;AASA,eAAsB,iBACpB,KACA,MACA,OAAyB,SACE;AAC3B,QAAM,aAAa,MAAM,IAAI,qBAAqB,IAAI,GAAG,MAAM;AAC/D,MAAI,CAAC,UAAW,OAAM,IAAI,MAAM,8BAA8B;AAE9D,QAAM,WAAW,IAAI,SAAS;AAC9B,WAAS,OAAO,QAAQ,MAAM,KAAK,IAAI;AACvC,WAAS,OAAO,WAAW,QAAQ;AACnC,WAAS,OAAO,QAAQ,KAAK,IAAI;AAEjC,MAAI;AACJ,MAAI;AACF,gBAAY,MAAM,MAAM,WAAW,EAAE,QAAQ,QAAQ,MAAM,SAAS,CAAC;AAAA,EACvE,SAAS,KAAK;AACZ,UAAM,aAAa,GAAG;AAAA,EACxB;AACA,QAAM,aAAc,MAAM,UAAU,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAC3D,QAAM,MAAM,WAAW,MAAM;AAC7B,MAAI,CAAC,UAAU,MAAM,CAAC,KAAK;AACzB,UAAM,aAAa,IAAI,MAAM,6BAA6B,UAAU,MAAM,GAAG,MAAM,KAAK,gBAAgB,EAAE,CAAC;AAAA,EAC7G;AAEA,SAAO,EAAE,KAAK,KAAK,UAAU,GAAG,GAAG;AACrC;AAEA,eAAsB,iBAAiB,KAAgB,SAAmC;AACxF,QAAM,OAAO,MAAM,IAAI,eAAe,OAAkC,GAAG,MAAM;AACjF,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,wBAAwB;AAClD,SAAO;AACT;AAEO,SAAS,sBACd,KACA,OAC2C;AAC3C,SAAO,IAAI,wBAAwB,KAAK;AAC1C;AAEO,SAAS,gBAAgB,KAAuB;AACrD,QAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,OAAO,EAAE;AACjE,SAAO,2CAA2C,KAAK,GAAG;AAC5D;AAEO,SAAS,mBAAmB,KAAuD;AACxF,MAAI,gBAAgB,GAAG,GAAG;AACxB,WAAO;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,IACf;AAAA,EACF;AACA,SAAO;AAAA,IACL,OAAO;AAAA,IACP,aAAa,eAAe,QAAQ,IAAI,UAAU;AAAA,EACpD;AACF;AAWA,eAAsB,iBAAiB,KAAgB,OAAoD;AACzG,QAAM,EAAE,WAAW,GAAG,OAAO,IAAI;AAEjC,MAAI,WAAW,OAAO,YAAY;AAClC,MAAI,CAAC,YAAY,aAAa,UAAU,OAAO,GAAG;AAChD,gBAAY,MAAM,iBAAiB,KAAK,SAAS,GAAG;AAAA,EACtD;AAEA,QAAM,MAAM,MAAM;AAAA,IAChB;AAAA,IACA,mBAAmB;AAAA,MACjB,GAAG;AAAA,MACH;AAAA,MACA,aAAa,OAAO,eAAe;AAAA,IACrC,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,KAAK,SAAS;AACzB;","names":[]}
1
+ {"version":3,"sources":["../../src/utils/ipfs-upload.ts"],"sourcesContent":["import { buildAssetMetadata, UserFacingError, type ApiClient, type BuildAssetMetadataInput } from \"@medialane/sdk\";\n\nexport const FILE_UPLOAD_FAILED =\n \"We couldn't upload your file. Check your connection and try again, or choose a different file.\";\n\nfunction uploadFailed(cause: unknown): UserFacingError {\n return Object.assign(new UserFacingError(FILE_UPLOAD_FAILED), { cause });\n}\n\nexport interface UploadedIpfsFile {\n cid: string;\n uri: string;\n}\n\nexport type SignedUploadKind = \"image\" | \"document\" | \"media\";\n\nexport interface UploadDiagnostics {\n kind: SignedUploadKind;\n fileSize: number;\n fileType: string;\n failedAfterMs: number;\n error: string;\n fileReadable: string;\n uploadHostReachable: string;\n retry: string;\n online: boolean | null;\n connection: string | null;\n}\n\nlet reportDiagnostics: ((diagnostics: UploadDiagnostics) => void) | null = null;\n\nexport function setUploadDiagnosticsReporter(reporter: ((diagnostics: UploadDiagnostics) => void) | null): void {\n reportDiagnostics = reporter;\n}\n\nfunction describe(err: unknown): string {\n const text = err instanceof Error ? `${err.name}: ${err.message}` : String(err);\n return text.slice(0, 300);\n}\n\nfunction connectionType(): string | null {\n if (typeof navigator === \"undefined\") return null;\n const connection = (navigator as Navigator & { connection?: { effectiveType?: string } }).connection;\n return connection?.effectiveType ?? null;\n}\n\nasync function signedUploadUrl(api: ApiClient, kind: SignedUploadKind): Promise<string> {\n const signedUrl = (await api.getMetadataSignedUrl(kind)).data?.url;\n if (!signedUrl) throw new Error(\"Failed to prepare the upload\");\n return signedUrl;\n}\n\nfunction postFile(signedUrl: string, file: File): Promise<Response> {\n const formData = new FormData();\n formData.append(\"file\", file, file.name);\n formData.append(\"network\", \"public\");\n formData.append(\"name\", file.name);\n return fetch(signedUrl, { method: \"POST\", body: formData });\n}\n\nasync function uploadedFile(res: Response): Promise<UploadedIpfsFile> {\n const uploadJson = (await res.json().catch(() => ({}))) as { data?: { cid?: string } };\n const cid = uploadJson.data?.cid;\n if (!res.ok || !cid) {\n throw uploadFailed(new Error(`File upload returned HTTP ${res.status}${cid ? \"\" : \" without a cid\"}`));\n }\n return { cid, uri: `ipfs://${cid}` };\n}\n\nasync function recoverUpload(\n api: ApiClient,\n file: File,\n kind: SignedUploadKind,\n signedUrl: string,\n err: unknown,\n failedAfterMs: number,\n): Promise<UploadedIpfsFile> {\n const diagnostics: UploadDiagnostics = {\n kind,\n fileSize: file.size,\n fileType: file.type,\n failedAfterMs,\n error: describe(err),\n fileReadable: \"not checked\",\n uploadHostReachable: \"not checked\",\n retry: \"not attempted\",\n online: typeof navigator === \"undefined\" ? null : navigator.onLine,\n connection: connectionType(),\n };\n\n let copy: File | null = null;\n try {\n copy = new File([await file.arrayBuffer()], file.name, { type: file.type });\n diagnostics.fileReadable = \"ok\";\n } catch (readErr) {\n diagnostics.fileReadable = describe(readErr);\n }\n\n try {\n await fetch(new URL(signedUrl).origin, { mode: \"no-cors\", cache: \"no-store\" });\n diagnostics.uploadHostReachable = \"ok\";\n } catch (probeErr) {\n diagnostics.uploadHostReachable = describe(probeErr);\n }\n\n let result: UploadedIpfsFile | null = null;\n if (copy) {\n try {\n result = await uploadedFile(await postFile(await signedUploadUrl(api, kind), copy));\n diagnostics.retry = \"ok\";\n } catch (retryErr) {\n diagnostics.retry = describe(retryErr instanceof UserFacingError && retryErr.cause ? retryErr.cause : retryErr);\n }\n }\n\n try {\n reportDiagnostics?.(diagnostics);\n } catch {}\n\n if (result) return result;\n throw Object.assign(uploadFailed(err), { diagnostics });\n}\n\nexport async function uploadFileToIpfs(\n api: ApiClient,\n file: File,\n kind: SignedUploadKind = \"image\",\n): Promise<UploadedIpfsFile> {\n const signedUrl = await signedUploadUrl(api, kind);\n const startedAt = Date.now();\n let uploadRes: Response;\n try {\n uploadRes = await postFile(signedUrl, file);\n } catch (err) {\n return recoverUpload(api, file, kind, signedUrl, err, Date.now() - startedAt);\n }\n return uploadedFile(uploadRes);\n}\n\nexport async function uploadJsonToIpfs(api: ApiClient, payload: unknown): Promise<string> {\n const uri = (await api.uploadMetadata(payload as Record<string, unknown>)).data?.url;\n if (!uri) throw new Error(\"Metadata upload failed\");\n return uri;\n}\n\nexport function uploadDirectoryToIpfs(\n api: ApiClient,\n files: { name: string; content: unknown }[],\n): Promise<{ cid: string; baseUri: string }> {\n return api.uploadMetadataDirectory(files);\n}\n\nexport function isUserRejection(err: unknown): boolean {\n const msg = err instanceof Error ? err.message : String(err ?? \"\");\n return /reject|denied|declin|abort|cancel|refus/i.test(msg);\n}\n\nexport function uploadFailureToast(err: unknown): { title: string; description?: string } {\n if (isUserRejection(err)) {\n return {\n title: \"Signature declined\",\n description: \"Try again and approve the request in your wallet.\",\n };\n }\n return {\n title: \"Upload failed\",\n description: err instanceof Error ? err.message : undefined,\n };\n}\n\nexport interface PinAssetMetadataInput extends Omit<BuildAssetMetadataInput, \"registrationDate\"> {\n imageFile?: File | null;\n}\n\nexport interface PinnedAsset {\n uri: string;\n imageUri: string | null;\n}\n\nexport async function pinAssetMetadata(api: ApiClient, input: PinAssetMetadataInput): Promise<PinnedAsset> {\n const { imageFile, ...fields } = input;\n\n let imageUri = fields.imageUri ?? null;\n if (!imageUri && imageFile && imageFile.size > 0) {\n imageUri = (await uploadFileToIpfs(api, imageFile)).uri;\n }\n\n const uri = await uploadJsonToIpfs(\n api,\n buildAssetMetadata({\n ...fields,\n imageUri,\n externalUrl: fields.externalUrl || \"https://medialane.io\",\n }),\n );\n\n return { uri, imageUri };\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@medialane/ui",
3
- "version": "0.192.0",
3
+ "version": "0.194.0",
4
4
  "description": "Shared UI components for Medialane apps",
5
5
  "type": "module",
6
6
  "sideEffects": false,