@medialane/ui 0.167.0 → 0.169.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 (67) hide show
  1. package/dist/components/asset-marketplace-panel.cjs +2 -5
  2. package/dist/components/asset-marketplace-panel.cjs.map +1 -1
  3. package/dist/components/asset-marketplace-panel.d.cts +1 -3
  4. package/dist/components/asset-marketplace-panel.d.ts +1 -3
  5. package/dist/components/asset-marketplace-panel.js +2 -5
  6. package/dist/components/asset-marketplace-panel.js.map +1 -1
  7. package/dist/components/badge.d.cts +1 -1
  8. package/dist/components/badge.d.ts +1 -1
  9. package/dist/components/button.d.cts +2 -2
  10. package/dist/components/button.d.ts +2 -2
  11. package/dist/components/fast-mint/fast-mint.cjs +4 -4
  12. package/dist/components/fast-mint/fast-mint.cjs.map +1 -1
  13. package/dist/components/fast-mint/fast-mint.d.cts +2 -2
  14. package/dist/components/fast-mint/fast-mint.d.ts +2 -2
  15. package/dist/components/fast-mint/fast-mint.js +4 -4
  16. package/dist/components/fast-mint/fast-mint.js.map +1 -1
  17. package/dist/components/remixes-tab.cjs +2 -2
  18. package/dist/components/remixes-tab.cjs.map +1 -1
  19. package/dist/components/remixes-tab.d.cts +3 -3
  20. package/dist/components/remixes-tab.d.ts +3 -3
  21. package/dist/components/remixes-tab.js +2 -2
  22. package/dist/components/remixes-tab.js.map +1 -1
  23. package/dist/components/sheet.d.cts +1 -1
  24. package/dist/components/sheet.d.ts +1 -1
  25. package/dist/index.cjs +0 -8
  26. package/dist/index.cjs.map +1 -1
  27. package/dist/index.d.cts +0 -2
  28. package/dist/index.d.ts +0 -2
  29. package/dist/index.js +0 -5
  30. package/dist/index.js.map +1 -1
  31. package/dist/utils/ipfs-upload.cjs +11 -31
  32. package/dist/utils/ipfs-upload.cjs.map +1 -1
  33. package/dist/utils/ipfs-upload.d.cts +5 -5
  34. package/dist/utils/ipfs-upload.d.ts +5 -5
  35. package/dist/utils/ipfs-upload.js +11 -31
  36. package/dist/utils/ipfs-upload.js.map +1 -1
  37. package/dist/utils/use-notifications.cjs +2 -2
  38. package/dist/utils/use-notifications.cjs.map +1 -1
  39. package/dist/utils/use-notifications.d.cts +1 -2
  40. package/dist/utils/use-notifications.d.ts +1 -2
  41. package/dist/utils/use-notifications.js +2 -2
  42. package/dist/utils/use-notifications.js.map +1 -1
  43. package/dist/utils/use-orders.cjs +3 -3
  44. package/dist/utils/use-orders.cjs.map +1 -1
  45. package/dist/utils/use-orders.d.cts +1 -2
  46. package/dist/utils/use-orders.d.ts +1 -2
  47. package/dist/utils/use-orders.js +3 -3
  48. package/dist/utils/use-orders.js.map +1 -1
  49. package/dist/utils/use-remix-offers.cjs +5 -4
  50. package/dist/utils/use-remix-offers.cjs.map +1 -1
  51. package/dist/utils/use-remix-offers.d.cts +4 -9
  52. package/dist/utils/use-remix-offers.d.ts +4 -9
  53. package/dist/utils/use-remix-offers.js +5 -4
  54. package/dist/utils/use-remix-offers.js.map +1 -1
  55. package/package.json +3 -3
  56. package/dist/components/email-verification-gate.cjs +0 -57
  57. package/dist/components/email-verification-gate.cjs.map +0 -1
  58. package/dist/components/email-verification-gate.d.cts +0 -10
  59. package/dist/components/email-verification-gate.d.ts +0 -10
  60. package/dist/components/email-verification-gate.js +0 -33
  61. package/dist/components/email-verification-gate.js.map +0 -1
  62. package/dist/utils/api-fetch.cjs +0 -65
  63. package/dist/utils/api-fetch.cjs.map +0 -1
  64. package/dist/utils/api-fetch.d.cts +0 -17
  65. package/dist/utils/api-fetch.d.ts +0 -17
  66. package/dist/utils/api-fetch.js +0 -40
  67. package/dist/utils/api-fetch.js.map +0 -1
@@ -1,11 +1,7 @@
1
1
  import { buildAssetMetadata } from "@medialane/sdk";
2
- async function uploadFileToIpfs(file, kind = "image") {
3
- const signedRes = await fetch(`/api/proxy/v1/metadata/signed-url?kind=${kind}`);
4
- const signed = await signedRes.json().catch(() => ({}));
5
- const signedUrl = signed.data?.url;
6
- if (!signedRes.ok || !signedUrl) {
7
- throw new Error(signed.error ?? "Failed to prepare the upload");
8
- }
2
+ async function uploadFileToIpfs(api, file, kind = "image") {
3
+ const signedUrl = (await api.getMetadataSignedUrl(kind)).data?.url;
4
+ if (!signedUrl) throw new Error("Failed to prepare the upload");
9
5
  const formData = new FormData();
10
6
  formData.append("file", file, file.name);
11
7
  formData.append("network", "public");
@@ -18,30 +14,13 @@ async function uploadFileToIpfs(file, kind = "image") {
18
14
  }
19
15
  return { cid, uri: `ipfs://${cid}` };
20
16
  }
21
- async function uploadJsonToIpfs(payload) {
22
- const res = await fetch("/api/proxy/v1/metadata/upload", {
23
- method: "POST",
24
- headers: { "Content-Type": "application/json" },
25
- body: JSON.stringify(payload)
26
- });
27
- const body = await res.json().catch(() => ({}));
28
- const uri = body.data?.url;
29
- if (!res.ok || !uri) {
30
- throw new Error(body.error ?? "Metadata upload failed");
31
- }
17
+ async function uploadJsonToIpfs(api, payload) {
18
+ const uri = (await api.uploadMetadata(payload)).data?.url;
19
+ if (!uri) throw new Error("Metadata upload failed");
32
20
  return uri;
33
21
  }
34
- async function uploadDirectoryToIpfs(files) {
35
- const res = await fetch("/api/proxy/v1/metadata/upload-directory", {
36
- method: "POST",
37
- headers: { "Content-Type": "application/json" },
38
- body: JSON.stringify({ files })
39
- });
40
- const body = await res.json().catch(() => ({}));
41
- if (!res.ok || !body.data?.baseUri || !body.data.cid) {
42
- throw new Error(body.error ?? "Directory pin failed");
43
- }
44
- return { cid: body.data.cid, baseUri: body.data.baseUri };
22
+ function uploadDirectoryToIpfs(api, files) {
23
+ return api.uploadMetadataDirectory(files);
45
24
  }
46
25
  function isUserRejection(err) {
47
26
  const msg = err instanceof Error ? err.message : String(err ?? "");
@@ -59,13 +38,14 @@ function uploadFailureToast(err) {
59
38
  description: err instanceof Error ? err.message : void 0
60
39
  };
61
40
  }
62
- async function pinAssetMetadata(input) {
41
+ async function pinAssetMetadata(api, input) {
63
42
  const { imageFile, ...fields } = input;
64
43
  let imageUri = fields.imageUri ?? null;
65
44
  if (!imageUri && imageFile && imageFile.size > 0) {
66
- imageUri = (await uploadFileToIpfs(imageFile)).uri;
45
+ imageUri = (await uploadFileToIpfs(api, imageFile)).uri;
67
46
  }
68
47
  const uri = await uploadJsonToIpfs(
48
+ api,
69
49
  buildAssetMetadata({
70
50
  ...fields,
71
51
  imageUri,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/ipfs-upload.ts"],"sourcesContent":["import { buildAssetMetadata, type BuildAssetMetadataInput } from \"@medialane/sdk\";\n\nexport interface UploadedIpfsFile {\n cid: string;\n uri: string;\n}\n\nexport type SignedUploadKind = \"image\" | \"document\" | \"media\";\n\nexport async function uploadFileToIpfs(\n file: File,\n kind: SignedUploadKind = \"image\",\n): Promise<UploadedIpfsFile> {\n const signedRes = await fetch(`/api/proxy/v1/metadata/signed-url?kind=${kind}`);\n const signed = (await signedRes.json().catch(() => ({}))) as {\n data?: { url?: string };\n error?: string;\n };\n const signedUrl = signed.data?.url;\n if (!signedRes.ok || !signedUrl) {\n throw new Error(signed.error ?? \"Failed to prepare the upload\");\n }\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 const uploadRes = await fetch(signedUrl, { method: \"POST\", body: formData });\n const uploadJson = (await uploadRes.json().catch(() => ({}))) as { data?: { cid?: string } };\n const cid = uploadJson.data?.cid;\n if (!uploadRes.ok || !cid) {\n throw new Error(\"Upload to IPFS failed\");\n }\n\n return { cid, uri: `ipfs://${cid}` };\n}\n\nexport async function uploadJsonToIpfs(payload: unknown): Promise<string> {\n const res = await fetch(\"/api/proxy/v1/metadata/upload\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n });\n const body = (await res.json().catch(() => ({}))) as {\n data?: { url?: string };\n error?: string;\n };\n const uri = body.data?.url;\n if (!res.ok || !uri) {\n throw new Error(body.error ?? \"Metadata upload failed\");\n }\n\n return uri;\n}\n\nexport async function uploadDirectoryToIpfs(\n files: { name: string; content: unknown }[],\n): Promise<{ cid: string; baseUri: string }> {\n const res = await fetch(\"/api/proxy/v1/metadata/upload-directory\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ files }),\n });\n const body = (await res.json().catch(() => ({}))) as {\n data?: { cid?: string; baseUri?: string };\n error?: string;\n };\n if (!res.ok || !body.data?.baseUri || !body.data.cid) {\n throw new Error(body.error ?? \"Directory pin failed\");\n }\n return { cid: body.data.cid, baseUri: body.data.baseUri };\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(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(imageFile)).uri;\n }\n\n const uri = await uploadJsonToIpfs(\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,0BAAwD;AASjE,eAAsB,iBACpB,MACA,OAAyB,SACE;AAC3B,QAAM,YAAY,MAAM,MAAM,0CAA0C,IAAI,EAAE;AAC9E,QAAM,SAAU,MAAM,UAAU,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAIvD,QAAM,YAAY,OAAO,MAAM;AAC/B,MAAI,CAAC,UAAU,MAAM,CAAC,WAAW;AAC/B,UAAM,IAAI,MAAM,OAAO,SAAS,8BAA8B;AAAA,EAChE;AAEA,QAAM,WAAW,IAAI,SAAS;AAC9B,WAAS,OAAO,QAAQ,MAAM,KAAK,IAAI;AACvC,WAAS,OAAO,WAAW,QAAQ;AACnC,WAAS,OAAO,QAAQ,KAAK,IAAI;AAEjC,QAAM,YAAY,MAAM,MAAM,WAAW,EAAE,QAAQ,QAAQ,MAAM,SAAS,CAAC;AAC3E,QAAM,aAAc,MAAM,UAAU,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAC3D,QAAM,MAAM,WAAW,MAAM;AAC7B,MAAI,CAAC,UAAU,MAAM,CAAC,KAAK;AACzB,UAAM,IAAI,MAAM,uBAAuB;AAAA,EACzC;AAEA,SAAO,EAAE,KAAK,KAAK,UAAU,GAAG,GAAG;AACrC;AAEA,eAAsB,iBAAiB,SAAmC;AACxE,QAAM,MAAM,MAAM,MAAM,iCAAiC;AAAA,IACvD,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU,OAAO;AAAA,EAC9B,CAAC;AACD,QAAM,OAAQ,MAAM,IAAI,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAI/C,QAAM,MAAM,KAAK,MAAM;AACvB,MAAI,CAAC,IAAI,MAAM,CAAC,KAAK;AACnB,UAAM,IAAI,MAAM,KAAK,SAAS,wBAAwB;AAAA,EACxD;AAEA,SAAO;AACT;AAEA,eAAsB,sBACpB,OAC2C;AAC3C,QAAM,MAAM,MAAM,MAAM,2CAA2C;AAAA,IACjE,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU,EAAE,MAAM,CAAC;AAAA,EAChC,CAAC;AACD,QAAM,OAAQ,MAAM,IAAI,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAI/C,MAAI,CAAC,IAAI,MAAM,CAAC,KAAK,MAAM,WAAW,CAAC,KAAK,KAAK,KAAK;AACpD,UAAM,IAAI,MAAM,KAAK,SAAS,sBAAsB;AAAA,EACtD;AACA,SAAO,EAAE,KAAK,KAAK,KAAK,KAAK,SAAS,KAAK,KAAK,QAAQ;AAC1D;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,OAAoD;AACzF,QAAM,EAAE,WAAW,GAAG,OAAO,IAAI;AAEjC,MAAI,WAAW,OAAO,YAAY;AAClC,MAAI,CAAC,YAAY,aAAa,UAAU,OAAO,GAAG;AAChD,gBAAY,MAAM,iBAAiB,SAAS,GAAG;AAAA,EACjD;AAEA,QAAM,MAAM,MAAM;AAAA,IAChB,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, type ApiClient, type BuildAssetMetadataInput } from \"@medialane/sdk\";\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 const uploadRes = await fetch(signedUrl, { method: \"POST\", body: formData });\n const uploadJson = (await uploadRes.json().catch(() => ({}))) as { data?: { cid?: string } };\n const cid = uploadJson.data?.cid;\n if (!uploadRes.ok || !cid) {\n throw new Error(\"Upload to IPFS failed\");\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,0BAAwE;AASjF,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,QAAM,YAAY,MAAM,MAAM,WAAW,EAAE,QAAQ,QAAQ,MAAM,SAAS,CAAC;AAC3E,QAAM,aAAc,MAAM,UAAU,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAC3D,QAAM,MAAM,WAAW,MAAM;AAC7B,MAAI,CAAC,UAAU,MAAM,CAAC,KAAK;AACzB,UAAM,IAAI,MAAM,uBAAuB;AAAA,EACzC;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":[]}
@@ -45,13 +45,13 @@ async function fetchAnnouncements() {
45
45
  if (!res.ok) return [];
46
46
  return res.json();
47
47
  }
48
- function useNotifications(getClient, apiConfig, address) {
48
+ function useNotifications(getClient, address) {
49
49
  const [readIds, setReadIds] = (0, import_react.useState)(() => /* @__PURE__ */ new Set());
50
50
  (0, import_react.useEffect)(() => {
51
51
  setReadIds((0, import_notification_storage.getReadIds)());
52
52
  }, []);
53
53
  const { orders: userOrders, isLoading: ordersLoading } = (0, import_use_orders.useUserOrders)(getClient, address ?? null);
54
- const { orders: receivedOffers, isLoading: receivedLoading } = (0, import_use_orders.useReceivedOffers)(apiConfig, address ?? null);
54
+ const { orders: receivedOffers, isLoading: receivedLoading } = (0, import_use_orders.useReceivedOffers)(getClient, address ?? null);
55
55
  const { activities, isLoading: activitiesLoading } = (0, import_use_activities.useActivitiesByAddress)(getClient, address ?? null);
56
56
  const { data: announcements = [] } = (0, import_swr.default)(
57
57
  "announcements",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/use-notifications.ts"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport useSWR from \"swr\";\nimport { normalizeAddress } from \"@medialane/sdk\";\nimport type { ApiActivity } from \"@medialane/sdk\";\nimport type { MedialaneClient } from \"@medialane/sdk/starknet\";\nimport { useUserOrders, useReceivedOffers } from \"./use-orders.js\";\nimport { useActivitiesByAddress } from \"./use-activities.js\";\nimport { getReadIds, markRead } from \"./notification-storage.js\";\nimport { notificationsAreLoading } from \"./notification-readiness.js\";\nimport {\n formatActivity,\n formatOrderNotification,\n formatOfferAcceptedNotification,\n formatAssetReceivedNotification,\n} from \"./format-activity.js\";\nimport type { Notification, Announcement } from \"../data/notification.js\";\nimport type { ApiFetchConfig } from \"./api-fetch.js\";\n\nasync function fetchAnnouncements(): Promise<Announcement[]> {\n const res = await fetch(\"/api/announcements\");\n if (!res.ok) return [];\n return res.json();\n}\n\nexport function useNotifications(\n getClient: () => MedialaneClient,\n apiConfig: ApiFetchConfig,\n address: string | null | undefined\n) {\n const [readIds, setReadIds] = useState<Set<string>>(() => new Set<string>());\n\n useEffect(() => {\n setReadIds(getReadIds());\n }, []);\n\n const { orders: userOrders, isLoading: ordersLoading } = useUserOrders(getClient, address ?? null);\n\n const { orders: receivedOffers, isLoading: receivedLoading } = useReceivedOffers(apiConfig, address ?? null);\n const { activities, isLoading: activitiesLoading } = useActivitiesByAddress(getClient, address ?? null);\n const { data: announcements = [] } = useSWR<Announcement[]>(\n \"announcements\",\n fetchAnnouncements,\n { revalidateOnFocus: false, dedupingInterval: 60_000 }\n );\n\n const notifications: Notification[] = useMemo(() => {\n const items: Notification[] = [];\n\n userOrders\n .filter((o) => o.offer.itemType === \"ERC20\" && o.status === \"FULFILLED\")\n .forEach((order) => {\n const id = `offer-accepted-${order.orderHash}`;\n const fmt = formatOfferAcceptedNotification(order);\n items.push({\n id,\n type: \"offer_accepted\",\n priority: \"spotlight\",\n celebratory: true,\n ...fmt,\n timestamp: order.updatedAt ?? order.createdAt ?? new Date().toISOString(),\n isUnread: !readIds.has(id),\n metadata: {\n amount: order.price?.formatted ?? undefined,\n currency: order.price?.currency ?? undefined,\n txHash: order.txHash?.fulfilled ?? undefined,\n assetName: order.token?.name ?? undefined,\n },\n });\n });\n\n receivedOffers.forEach((order) => {\n const id = `order-${order.orderHash}`;\n const fmt = formatOrderNotification(order);\n items.push({\n id,\n type: \"offer\",\n priority: \"spotlight\",\n celebratory: false,\n ...fmt,\n timestamp: order.createdAt ?? new Date().toISOString(),\n isUnread: !readIds.has(id),\n metadata: {\n amount: order.price?.formatted ?? undefined,\n currency: order.price?.currency ?? undefined,\n assetName: order.token?.name ?? undefined,\n },\n });\n });\n\n (activities as ApiActivity[]).slice(0, 50).forEach((event) => {\n const id = `activity-${event.txHash}-${event.type}-${event.nftTokenId ?? \"\"}`;\n\n if (\n event.type === \"transfer\" &&\n address &&\n !!event.to && normalizeAddress(\"STARKNET\", event.to) === normalizeAddress(\"STARKNET\", address)\n ) {\n const fmt = formatAssetReceivedNotification(event);\n items.push({\n id,\n type: \"asset_received\",\n priority: \"spotlight\",\n celebratory: true,\n ...fmt,\n timestamp: event.timestamp ?? new Date().toISOString(),\n isUnread: !readIds.has(id),\n metadata: {\n txHash: event.txHash ?? undefined,\n assetName: event.token?.name ?? undefined,\n },\n });\n return;\n }\n\n const isMySale =\n event.type === \"sale\" &&\n address &&\n ((!!event.offerer && normalizeAddress(\"STARKNET\", event.offerer) === normalizeAddress(\"STARKNET\", address)) ||\n (!!event.from && normalizeAddress(\"STARKNET\", event.from) === normalizeAddress(\"STARKNET\", address)));\n\n const fmt = formatActivity(event);\n items.push({\n id,\n type: event.type as Notification[\"type\"],\n priority: isMySale ? \"spotlight\" : \"normal\",\n celebratory: !!isMySale,\n ...fmt,\n timestamp: event.timestamp ?? new Date().toISOString(),\n isUnread: !readIds.has(id),\n metadata: {\n amount: event.price?.formatted ?? undefined,\n currency: event.price?.currency ?? undefined,\n txHash: event.txHash ?? undefined,\n assetName: event.token?.name ?? undefined,\n },\n });\n });\n\n announcements.forEach((ann) => {\n const id = `ann-${ann.id}`;\n items.push({\n id,\n type: \"announcement\",\n priority: ann.pinned ? \"spotlight\" : \"normal\",\n celebratory: false,\n title: ann.title,\n description: ann.body,\n image: ann.image,\n href: ann.href,\n timestamp: ann.created_at,\n isUnread: !readIds.has(id),\n });\n });\n\n items.sort(\n (a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime()\n );\n\n return items;\n }, [userOrders, receivedOffers, activities, announcements, address, readIds]);\n\n const unreadCount = notifications.filter((n) => n.isUnread).length;\n\n const markNotificationsRead = useCallback((ids: string[]) => {\n markRead(ids);\n setReadIds(getReadIds());\n }, []);\n\n const isLoading = notificationsAreLoading({\n ordersLoading,\n receivedLoading,\n activitiesLoading,\n hasAddress: !!address,\n });\n\n return {\n notifications,\n unreadCount,\n isLoading,\n markAllRead: () => markNotificationsRead(notifications.map((n) => n.id)),\n markRead: (id: string) => markNotificationsRead([id]),\n };\n}\n"],"mappings":"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","names":["useSWR","fmt"]}
1
+ {"version":3,"sources":["../../src/utils/use-notifications.ts"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport useSWR from \"swr\";\nimport { normalizeAddress } from \"@medialane/sdk\";\nimport type { ApiActivity } from \"@medialane/sdk\";\nimport type { MedialaneClient } from \"@medialane/sdk/starknet\";\nimport { useUserOrders, useReceivedOffers } from \"./use-orders.js\";\nimport { useActivitiesByAddress } from \"./use-activities.js\";\nimport { getReadIds, markRead } from \"./notification-storage.js\";\nimport { notificationsAreLoading } from \"./notification-readiness.js\";\nimport {\n formatActivity,\n formatOrderNotification,\n formatOfferAcceptedNotification,\n formatAssetReceivedNotification,\n} from \"./format-activity.js\";\nimport type { Notification, Announcement } from \"../data/notification.js\";\n\nasync function fetchAnnouncements(): Promise<Announcement[]> {\n const res = await fetch(\"/api/announcements\");\n if (!res.ok) return [];\n return res.json();\n}\n\nexport function useNotifications(\n getClient: () => MedialaneClient,\n address: string | null | undefined\n) {\n const [readIds, setReadIds] = useState<Set<string>>(() => new Set<string>());\n\n useEffect(() => {\n setReadIds(getReadIds());\n }, []);\n\n const { orders: userOrders, isLoading: ordersLoading } = useUserOrders(getClient, address ?? null);\n\n const { orders: receivedOffers, isLoading: receivedLoading } = useReceivedOffers(getClient, address ?? null);\n const { activities, isLoading: activitiesLoading } = useActivitiesByAddress(getClient, address ?? null);\n const { data: announcements = [] } = useSWR<Announcement[]>(\n \"announcements\",\n fetchAnnouncements,\n { revalidateOnFocus: false, dedupingInterval: 60_000 }\n );\n\n const notifications: Notification[] = useMemo(() => {\n const items: Notification[] = [];\n\n userOrders\n .filter((o) => o.offer.itemType === \"ERC20\" && o.status === \"FULFILLED\")\n .forEach((order) => {\n const id = `offer-accepted-${order.orderHash}`;\n const fmt = formatOfferAcceptedNotification(order);\n items.push({\n id,\n type: \"offer_accepted\",\n priority: \"spotlight\",\n celebratory: true,\n ...fmt,\n timestamp: order.updatedAt ?? order.createdAt ?? new Date().toISOString(),\n isUnread: !readIds.has(id),\n metadata: {\n amount: order.price?.formatted ?? undefined,\n currency: order.price?.currency ?? undefined,\n txHash: order.txHash?.fulfilled ?? undefined,\n assetName: order.token?.name ?? undefined,\n },\n });\n });\n\n receivedOffers.forEach((order) => {\n const id = `order-${order.orderHash}`;\n const fmt = formatOrderNotification(order);\n items.push({\n id,\n type: \"offer\",\n priority: \"spotlight\",\n celebratory: false,\n ...fmt,\n timestamp: order.createdAt ?? new Date().toISOString(),\n isUnread: !readIds.has(id),\n metadata: {\n amount: order.price?.formatted ?? undefined,\n currency: order.price?.currency ?? undefined,\n assetName: order.token?.name ?? undefined,\n },\n });\n });\n\n (activities as ApiActivity[]).slice(0, 50).forEach((event) => {\n const id = `activity-${event.txHash}-${event.type}-${event.nftTokenId ?? \"\"}`;\n\n if (\n event.type === \"transfer\" &&\n address &&\n !!event.to && normalizeAddress(\"STARKNET\", event.to) === normalizeAddress(\"STARKNET\", address)\n ) {\n const fmt = formatAssetReceivedNotification(event);\n items.push({\n id,\n type: \"asset_received\",\n priority: \"spotlight\",\n celebratory: true,\n ...fmt,\n timestamp: event.timestamp ?? new Date().toISOString(),\n isUnread: !readIds.has(id),\n metadata: {\n txHash: event.txHash ?? undefined,\n assetName: event.token?.name ?? undefined,\n },\n });\n return;\n }\n\n const isMySale =\n event.type === \"sale\" &&\n address &&\n ((!!event.offerer && normalizeAddress(\"STARKNET\", event.offerer) === normalizeAddress(\"STARKNET\", address)) ||\n (!!event.from && normalizeAddress(\"STARKNET\", event.from) === normalizeAddress(\"STARKNET\", address)));\n\n const fmt = formatActivity(event);\n items.push({\n id,\n type: event.type as Notification[\"type\"],\n priority: isMySale ? \"spotlight\" : \"normal\",\n celebratory: !!isMySale,\n ...fmt,\n timestamp: event.timestamp ?? new Date().toISOString(),\n isUnread: !readIds.has(id),\n metadata: {\n amount: event.price?.formatted ?? undefined,\n currency: event.price?.currency ?? undefined,\n txHash: event.txHash ?? undefined,\n assetName: event.token?.name ?? undefined,\n },\n });\n });\n\n announcements.forEach((ann) => {\n const id = `ann-${ann.id}`;\n items.push({\n id,\n type: \"announcement\",\n priority: ann.pinned ? \"spotlight\" : \"normal\",\n celebratory: false,\n title: ann.title,\n description: ann.body,\n image: ann.image,\n href: ann.href,\n timestamp: ann.created_at,\n isUnread: !readIds.has(id),\n });\n });\n\n items.sort(\n (a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime()\n );\n\n return items;\n }, [userOrders, receivedOffers, activities, announcements, address, readIds]);\n\n const unreadCount = notifications.filter((n) => n.isUnread).length;\n\n const markNotificationsRead = useCallback((ids: string[]) => {\n markRead(ids);\n setReadIds(getReadIds());\n }, []);\n\n const isLoading = notificationsAreLoading({\n ordersLoading,\n receivedLoading,\n activitiesLoading,\n hasAddress: !!address,\n });\n\n return {\n notifications,\n unreadCount,\n isLoading,\n markAllRead: () => markNotificationsRead(notifications.map((n) => n.id)),\n markRead: (id: string) => markNotificationsRead([id]),\n };\n}\n"],"mappings":"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","names":["useSWR","fmt"]}
@@ -1,8 +1,7 @@
1
1
  import { MedialaneClient } from '@medialane/sdk/starknet';
2
2
  import { Notification } from '../data/notification.cjs';
3
- import { ApiFetchConfig } from './api-fetch.cjs';
4
3
 
5
- declare function useNotifications(getClient: () => MedialaneClient, apiConfig: ApiFetchConfig, address: string | null | undefined): {
4
+ declare function useNotifications(getClient: () => MedialaneClient, address: string | null | undefined): {
6
5
  notifications: Notification[];
7
6
  unreadCount: number;
8
7
  isLoading: boolean;
@@ -1,8 +1,7 @@
1
1
  import { MedialaneClient } from '@medialane/sdk/starknet';
2
2
  import { Notification } from '../data/notification.js';
3
- import { ApiFetchConfig } from './api-fetch.js';
4
3
 
5
- declare function useNotifications(getClient: () => MedialaneClient, apiConfig: ApiFetchConfig, address: string | null | undefined): {
4
+ declare function useNotifications(getClient: () => MedialaneClient, address: string | null | undefined): {
6
5
  notifications: Notification[];
7
6
  unreadCount: number;
8
7
  isLoading: boolean;
@@ -17,13 +17,13 @@ async function fetchAnnouncements() {
17
17
  if (!res.ok) return [];
18
18
  return res.json();
19
19
  }
20
- function useNotifications(getClient, apiConfig, address) {
20
+ function useNotifications(getClient, address) {
21
21
  const [readIds, setReadIds] = useState(() => /* @__PURE__ */ new Set());
22
22
  useEffect(() => {
23
23
  setReadIds(getReadIds());
24
24
  }, []);
25
25
  const { orders: userOrders, isLoading: ordersLoading } = useUserOrders(getClient, address ?? null);
26
- const { orders: receivedOffers, isLoading: receivedLoading } = useReceivedOffers(apiConfig, address ?? null);
26
+ const { orders: receivedOffers, isLoading: receivedLoading } = useReceivedOffers(getClient, address ?? null);
27
27
  const { activities, isLoading: activitiesLoading } = useActivitiesByAddress(getClient, address ?? null);
28
28
  const { data: announcements = [] } = useSWR(
29
29
  "announcements",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/use-notifications.ts"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport useSWR from \"swr\";\nimport { normalizeAddress } from \"@medialane/sdk\";\nimport type { ApiActivity } from \"@medialane/sdk\";\nimport type { MedialaneClient } from \"@medialane/sdk/starknet\";\nimport { useUserOrders, useReceivedOffers } from \"./use-orders.js\";\nimport { useActivitiesByAddress } from \"./use-activities.js\";\nimport { getReadIds, markRead } from \"./notification-storage.js\";\nimport { notificationsAreLoading } from \"./notification-readiness.js\";\nimport {\n formatActivity,\n formatOrderNotification,\n formatOfferAcceptedNotification,\n formatAssetReceivedNotification,\n} from \"./format-activity.js\";\nimport type { Notification, Announcement } from \"../data/notification.js\";\nimport type { ApiFetchConfig } from \"./api-fetch.js\";\n\nasync function fetchAnnouncements(): Promise<Announcement[]> {\n const res = await fetch(\"/api/announcements\");\n if (!res.ok) return [];\n return res.json();\n}\n\nexport function useNotifications(\n getClient: () => MedialaneClient,\n apiConfig: ApiFetchConfig,\n address: string | null | undefined\n) {\n const [readIds, setReadIds] = useState<Set<string>>(() => new Set<string>());\n\n useEffect(() => {\n setReadIds(getReadIds());\n }, []);\n\n const { orders: userOrders, isLoading: ordersLoading } = useUserOrders(getClient, address ?? null);\n\n const { orders: receivedOffers, isLoading: receivedLoading } = useReceivedOffers(apiConfig, address ?? null);\n const { activities, isLoading: activitiesLoading } = useActivitiesByAddress(getClient, address ?? null);\n const { data: announcements = [] } = useSWR<Announcement[]>(\n \"announcements\",\n fetchAnnouncements,\n { revalidateOnFocus: false, dedupingInterval: 60_000 }\n );\n\n const notifications: Notification[] = useMemo(() => {\n const items: Notification[] = [];\n\n userOrders\n .filter((o) => o.offer.itemType === \"ERC20\" && o.status === \"FULFILLED\")\n .forEach((order) => {\n const id = `offer-accepted-${order.orderHash}`;\n const fmt = formatOfferAcceptedNotification(order);\n items.push({\n id,\n type: \"offer_accepted\",\n priority: \"spotlight\",\n celebratory: true,\n ...fmt,\n timestamp: order.updatedAt ?? order.createdAt ?? new Date().toISOString(),\n isUnread: !readIds.has(id),\n metadata: {\n amount: order.price?.formatted ?? undefined,\n currency: order.price?.currency ?? undefined,\n txHash: order.txHash?.fulfilled ?? undefined,\n assetName: order.token?.name ?? undefined,\n },\n });\n });\n\n receivedOffers.forEach((order) => {\n const id = `order-${order.orderHash}`;\n const fmt = formatOrderNotification(order);\n items.push({\n id,\n type: \"offer\",\n priority: \"spotlight\",\n celebratory: false,\n ...fmt,\n timestamp: order.createdAt ?? new Date().toISOString(),\n isUnread: !readIds.has(id),\n metadata: {\n amount: order.price?.formatted ?? undefined,\n currency: order.price?.currency ?? undefined,\n assetName: order.token?.name ?? undefined,\n },\n });\n });\n\n (activities as ApiActivity[]).slice(0, 50).forEach((event) => {\n const id = `activity-${event.txHash}-${event.type}-${event.nftTokenId ?? \"\"}`;\n\n if (\n event.type === \"transfer\" &&\n address &&\n !!event.to && normalizeAddress(\"STARKNET\", event.to) === normalizeAddress(\"STARKNET\", address)\n ) {\n const fmt = formatAssetReceivedNotification(event);\n items.push({\n id,\n type: \"asset_received\",\n priority: \"spotlight\",\n celebratory: true,\n ...fmt,\n timestamp: event.timestamp ?? new Date().toISOString(),\n isUnread: !readIds.has(id),\n metadata: {\n txHash: event.txHash ?? undefined,\n assetName: event.token?.name ?? undefined,\n },\n });\n return;\n }\n\n const isMySale =\n event.type === \"sale\" &&\n address &&\n ((!!event.offerer && normalizeAddress(\"STARKNET\", event.offerer) === normalizeAddress(\"STARKNET\", address)) ||\n (!!event.from && normalizeAddress(\"STARKNET\", event.from) === normalizeAddress(\"STARKNET\", address)));\n\n const fmt = formatActivity(event);\n items.push({\n id,\n type: event.type as Notification[\"type\"],\n priority: isMySale ? \"spotlight\" : \"normal\",\n celebratory: !!isMySale,\n ...fmt,\n timestamp: event.timestamp ?? new Date().toISOString(),\n isUnread: !readIds.has(id),\n metadata: {\n amount: event.price?.formatted ?? undefined,\n currency: event.price?.currency ?? undefined,\n txHash: event.txHash ?? undefined,\n assetName: event.token?.name ?? undefined,\n },\n });\n });\n\n announcements.forEach((ann) => {\n const id = `ann-${ann.id}`;\n items.push({\n id,\n type: \"announcement\",\n priority: ann.pinned ? \"spotlight\" : \"normal\",\n celebratory: false,\n title: ann.title,\n description: ann.body,\n image: ann.image,\n href: ann.href,\n timestamp: ann.created_at,\n isUnread: !readIds.has(id),\n });\n });\n\n items.sort(\n (a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime()\n );\n\n return items;\n }, [userOrders, receivedOffers, activities, announcements, address, readIds]);\n\n const unreadCount = notifications.filter((n) => n.isUnread).length;\n\n const markNotificationsRead = useCallback((ids: string[]) => {\n markRead(ids);\n setReadIds(getReadIds());\n }, []);\n\n const isLoading = notificationsAreLoading({\n ordersLoading,\n receivedLoading,\n activitiesLoading,\n hasAddress: !!address,\n });\n\n return {\n notifications,\n unreadCount,\n isLoading,\n markAllRead: () => markNotificationsRead(notifications.map((n) => n.id)),\n markRead: (id: string) => markNotificationsRead([id]),\n };\n}\n"],"mappings":";AAEA,SAAS,aAAa,WAAW,SAAS,gBAAgB;AAC1D,OAAO,YAAY;AACnB,SAAS,wBAAwB;AAGjC,SAAS,eAAe,yBAAyB;AACjD,SAAS,8BAA8B;AACvC,SAAS,YAAY,gBAAgB;AACrC,SAAS,+BAA+B;AACxC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAIP,eAAe,qBAA8C;AAC3D,QAAM,MAAM,MAAM,MAAM,oBAAoB;AAC5C,MAAI,CAAC,IAAI,GAAI,QAAO,CAAC;AACrB,SAAO,IAAI,KAAK;AAClB;AAEO,SAAS,iBACd,WACA,WACA,SACA;AACA,QAAM,CAAC,SAAS,UAAU,IAAI,SAAsB,MAAM,oBAAI,IAAY,CAAC;AAE3E,YAAU,MAAM;AACd,eAAW,WAAW,CAAC;AAAA,EACzB,GAAG,CAAC,CAAC;AAEL,QAAM,EAAE,QAAQ,YAAY,WAAW,cAAc,IAAI,cAAc,WAAW,WAAW,IAAI;AAEjG,QAAM,EAAE,QAAQ,gBAAgB,WAAW,gBAAgB,IAAI,kBAAkB,WAAW,WAAW,IAAI;AAC3G,QAAM,EAAE,YAAY,WAAW,kBAAkB,IAAI,uBAAuB,WAAW,WAAW,IAAI;AACtG,QAAM,EAAE,MAAM,gBAAgB,CAAC,EAAE,IAAI;AAAA,IACnC;AAAA,IACA;AAAA,IACA,EAAE,mBAAmB,OAAO,kBAAkB,IAAO;AAAA,EACvD;AAEA,QAAM,gBAAgC,QAAQ,MAAM;AAClD,UAAM,QAAwB,CAAC;AAE/B,eACG,OAAO,CAAC,MAAM,EAAE,MAAM,aAAa,WAAW,EAAE,WAAW,WAAW,EACtE,QAAQ,CAAC,UAAU;AAClB,YAAM,KAAK,kBAAkB,MAAM,SAAS;AAC5C,YAAM,MAAM,gCAAgC,KAAK;AACjD,YAAM,KAAK;AAAA,QACT;AAAA,QACA,MAAM;AAAA,QACN,UAAU;AAAA,QACV,aAAa;AAAA,QACb,GAAG;AAAA,QACH,WAAW,MAAM,aAAa,MAAM,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,QACxE,UAAU,CAAC,QAAQ,IAAI,EAAE;AAAA,QACzB,UAAU;AAAA,UACR,QAAQ,MAAM,OAAO,aAAa;AAAA,UAClC,UAAU,MAAM,OAAO,YAAY;AAAA,UACnC,QAAQ,MAAM,QAAQ,aAAa;AAAA,UACnC,WAAW,MAAM,OAAO,QAAQ;AAAA,QAClC;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAEH,mBAAe,QAAQ,CAAC,UAAU;AAChC,YAAM,KAAK,SAAS,MAAM,SAAS;AACnC,YAAM,MAAM,wBAAwB,KAAK;AACzC,YAAM,KAAK;AAAA,QACT;AAAA,QACA,MAAM;AAAA,QACN,UAAU;AAAA,QACV,aAAa;AAAA,QACb,GAAG;AAAA,QACH,WAAW,MAAM,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,QACrD,UAAU,CAAC,QAAQ,IAAI,EAAE;AAAA,QACzB,UAAU;AAAA,UACR,QAAQ,MAAM,OAAO,aAAa;AAAA,UAClC,UAAU,MAAM,OAAO,YAAY;AAAA,UACnC,WAAW,MAAM,OAAO,QAAQ;AAAA,QAClC;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,IAAC,WAA6B,MAAM,GAAG,EAAE,EAAE,QAAQ,CAAC,UAAU;AAC5D,YAAM,KAAK,YAAY,MAAM,MAAM,IAAI,MAAM,IAAI,IAAI,MAAM,cAAc,EAAE;AAE3E,UACE,MAAM,SAAS,cACf,WACA,CAAC,CAAC,MAAM,MAAM,iBAAiB,YAAY,MAAM,EAAE,MAAM,iBAAiB,YAAY,OAAO,GAC7F;AACA,cAAMA,OAAM,gCAAgC,KAAK;AACjD,cAAM,KAAK;AAAA,UACT;AAAA,UACA,MAAM;AAAA,UACN,UAAU;AAAA,UACV,aAAa;AAAA,UACb,GAAGA;AAAA,UACH,WAAW,MAAM,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,UACrD,UAAU,CAAC,QAAQ,IAAI,EAAE;AAAA,UACzB,UAAU;AAAA,YACR,QAAQ,MAAM,UAAU;AAAA,YACxB,WAAW,MAAM,OAAO,QAAQ;AAAA,UAClC;AAAA,QACF,CAAC;AACD;AAAA,MACF;AAEA,YAAM,WACJ,MAAM,SAAS,UACf,YACE,CAAC,CAAC,MAAM,WAAW,iBAAiB,YAAY,MAAM,OAAO,MAAM,iBAAiB,YAAY,OAAO,KACtG,CAAC,CAAC,MAAM,QAAQ,iBAAiB,YAAY,MAAM,IAAI,MAAM,iBAAiB,YAAY,OAAO;AAEtG,YAAM,MAAM,eAAe,KAAK;AAChC,YAAM,KAAK;AAAA,QACT;AAAA,QACA,MAAM,MAAM;AAAA,QACZ,UAAU,WAAW,cAAc;AAAA,QACnC,aAAa,CAAC,CAAC;AAAA,QACf,GAAG;AAAA,QACH,WAAW,MAAM,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,QACrD,UAAU,CAAC,QAAQ,IAAI,EAAE;AAAA,QACzB,UAAU;AAAA,UACR,QAAQ,MAAM,OAAO,aAAa;AAAA,UAClC,UAAU,MAAM,OAAO,YAAY;AAAA,UACnC,QAAQ,MAAM,UAAU;AAAA,UACxB,WAAW,MAAM,OAAO,QAAQ;AAAA,QAClC;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,kBAAc,QAAQ,CAAC,QAAQ;AAC7B,YAAM,KAAK,OAAO,IAAI,EAAE;AACxB,YAAM,KAAK;AAAA,QACT;AAAA,QACA,MAAM;AAAA,QACN,UAAU,IAAI,SAAS,cAAc;AAAA,QACrC,aAAa;AAAA,QACb,OAAO,IAAI;AAAA,QACX,aAAa,IAAI;AAAA,QACjB,OAAO,IAAI;AAAA,QACX,MAAM,IAAI;AAAA,QACV,WAAW,IAAI;AAAA,QACf,UAAU,CAAC,QAAQ,IAAI,EAAE;AAAA,MAC3B,CAAC;AAAA,IACH,CAAC;AAED,UAAM;AAAA,MACJ,CAAC,GAAG,MAAM,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ,IAAI,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ;AAAA,IAC5E;AAEA,WAAO;AAAA,EACT,GAAG,CAAC,YAAY,gBAAgB,YAAY,eAAe,SAAS,OAAO,CAAC;AAE5E,QAAM,cAAc,cAAc,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE;AAE5D,QAAM,wBAAwB,YAAY,CAAC,QAAkB;AAC3D,aAAS,GAAG;AACZ,eAAW,WAAW,CAAC;AAAA,EACzB,GAAG,CAAC,CAAC;AAEL,QAAM,YAAY,wBAAwB;AAAA,IACxC;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY,CAAC,CAAC;AAAA,EAChB,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,MAAM,sBAAsB,cAAc,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAAA,IACvE,UAAU,CAAC,OAAe,sBAAsB,CAAC,EAAE,CAAC;AAAA,EACtD;AACF;","names":["fmt"]}
1
+ {"version":3,"sources":["../../src/utils/use-notifications.ts"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport useSWR from \"swr\";\nimport { normalizeAddress } from \"@medialane/sdk\";\nimport type { ApiActivity } from \"@medialane/sdk\";\nimport type { MedialaneClient } from \"@medialane/sdk/starknet\";\nimport { useUserOrders, useReceivedOffers } from \"./use-orders.js\";\nimport { useActivitiesByAddress } from \"./use-activities.js\";\nimport { getReadIds, markRead } from \"./notification-storage.js\";\nimport { notificationsAreLoading } from \"./notification-readiness.js\";\nimport {\n formatActivity,\n formatOrderNotification,\n formatOfferAcceptedNotification,\n formatAssetReceivedNotification,\n} from \"./format-activity.js\";\nimport type { Notification, Announcement } from \"../data/notification.js\";\n\nasync function fetchAnnouncements(): Promise<Announcement[]> {\n const res = await fetch(\"/api/announcements\");\n if (!res.ok) return [];\n return res.json();\n}\n\nexport function useNotifications(\n getClient: () => MedialaneClient,\n address: string | null | undefined\n) {\n const [readIds, setReadIds] = useState<Set<string>>(() => new Set<string>());\n\n useEffect(() => {\n setReadIds(getReadIds());\n }, []);\n\n const { orders: userOrders, isLoading: ordersLoading } = useUserOrders(getClient, address ?? null);\n\n const { orders: receivedOffers, isLoading: receivedLoading } = useReceivedOffers(getClient, address ?? null);\n const { activities, isLoading: activitiesLoading } = useActivitiesByAddress(getClient, address ?? null);\n const { data: announcements = [] } = useSWR<Announcement[]>(\n \"announcements\",\n fetchAnnouncements,\n { revalidateOnFocus: false, dedupingInterval: 60_000 }\n );\n\n const notifications: Notification[] = useMemo(() => {\n const items: Notification[] = [];\n\n userOrders\n .filter((o) => o.offer.itemType === \"ERC20\" && o.status === \"FULFILLED\")\n .forEach((order) => {\n const id = `offer-accepted-${order.orderHash}`;\n const fmt = formatOfferAcceptedNotification(order);\n items.push({\n id,\n type: \"offer_accepted\",\n priority: \"spotlight\",\n celebratory: true,\n ...fmt,\n timestamp: order.updatedAt ?? order.createdAt ?? new Date().toISOString(),\n isUnread: !readIds.has(id),\n metadata: {\n amount: order.price?.formatted ?? undefined,\n currency: order.price?.currency ?? undefined,\n txHash: order.txHash?.fulfilled ?? undefined,\n assetName: order.token?.name ?? undefined,\n },\n });\n });\n\n receivedOffers.forEach((order) => {\n const id = `order-${order.orderHash}`;\n const fmt = formatOrderNotification(order);\n items.push({\n id,\n type: \"offer\",\n priority: \"spotlight\",\n celebratory: false,\n ...fmt,\n timestamp: order.createdAt ?? new Date().toISOString(),\n isUnread: !readIds.has(id),\n metadata: {\n amount: order.price?.formatted ?? undefined,\n currency: order.price?.currency ?? undefined,\n assetName: order.token?.name ?? undefined,\n },\n });\n });\n\n (activities as ApiActivity[]).slice(0, 50).forEach((event) => {\n const id = `activity-${event.txHash}-${event.type}-${event.nftTokenId ?? \"\"}`;\n\n if (\n event.type === \"transfer\" &&\n address &&\n !!event.to && normalizeAddress(\"STARKNET\", event.to) === normalizeAddress(\"STARKNET\", address)\n ) {\n const fmt = formatAssetReceivedNotification(event);\n items.push({\n id,\n type: \"asset_received\",\n priority: \"spotlight\",\n celebratory: true,\n ...fmt,\n timestamp: event.timestamp ?? new Date().toISOString(),\n isUnread: !readIds.has(id),\n metadata: {\n txHash: event.txHash ?? undefined,\n assetName: event.token?.name ?? undefined,\n },\n });\n return;\n }\n\n const isMySale =\n event.type === \"sale\" &&\n address &&\n ((!!event.offerer && normalizeAddress(\"STARKNET\", event.offerer) === normalizeAddress(\"STARKNET\", address)) ||\n (!!event.from && normalizeAddress(\"STARKNET\", event.from) === normalizeAddress(\"STARKNET\", address)));\n\n const fmt = formatActivity(event);\n items.push({\n id,\n type: event.type as Notification[\"type\"],\n priority: isMySale ? \"spotlight\" : \"normal\",\n celebratory: !!isMySale,\n ...fmt,\n timestamp: event.timestamp ?? new Date().toISOString(),\n isUnread: !readIds.has(id),\n metadata: {\n amount: event.price?.formatted ?? undefined,\n currency: event.price?.currency ?? undefined,\n txHash: event.txHash ?? undefined,\n assetName: event.token?.name ?? undefined,\n },\n });\n });\n\n announcements.forEach((ann) => {\n const id = `ann-${ann.id}`;\n items.push({\n id,\n type: \"announcement\",\n priority: ann.pinned ? \"spotlight\" : \"normal\",\n celebratory: false,\n title: ann.title,\n description: ann.body,\n image: ann.image,\n href: ann.href,\n timestamp: ann.created_at,\n isUnread: !readIds.has(id),\n });\n });\n\n items.sort(\n (a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime()\n );\n\n return items;\n }, [userOrders, receivedOffers, activities, announcements, address, readIds]);\n\n const unreadCount = notifications.filter((n) => n.isUnread).length;\n\n const markNotificationsRead = useCallback((ids: string[]) => {\n markRead(ids);\n setReadIds(getReadIds());\n }, []);\n\n const isLoading = notificationsAreLoading({\n ordersLoading,\n receivedLoading,\n activitiesLoading,\n hasAddress: !!address,\n });\n\n return {\n notifications,\n unreadCount,\n isLoading,\n markAllRead: () => markNotificationsRead(notifications.map((n) => n.id)),\n markRead: (id: string) => markNotificationsRead([id]),\n };\n}\n"],"mappings":"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","names":["fmt"]}
@@ -42,7 +42,6 @@ var import_swr = __toESM(require("swr"), 1);
42
42
  var import_sdk = require("@medialane/sdk");
43
43
  var import_use_medialane_client = require("./use-medialane-client.js");
44
44
  var import_query_keys = require("./query-keys.js");
45
- var import_api_fetch = require("./api-fetch.js");
46
45
  const ACTIVE_ORDER_REFRESH_INTERVAL = 6e4;
47
46
  const ACTIVE_ORDER_DEDUPING_INTERVAL = 1e4;
48
47
  function useOrders(getClient, query = {}) {
@@ -112,11 +111,12 @@ function useCounterOffers(getClient, {
112
111
  mutate
113
112
  };
114
113
  }
115
- function useReceivedOffers(apiConfig, address) {
114
+ function useReceivedOffers(getClient, address) {
115
+ const client = (0, import_use_medialane_client.useMedialaneClient)(getClient);
116
116
  const normalized = address ? (0, import_sdk.normalizeAddress)("STARKNET", address) : null;
117
117
  const { data, error, isLoading, mutate } = (0, import_swr.default)(
118
118
  normalized ? ["received-offers", normalized] : null,
119
- () => (0, import_api_fetch.apiFetch)(apiConfig, `/v1/orders/received/${normalized}?limit=50`),
119
+ () => client.api.getReceivedOffers(normalized, { limit: 50 }),
120
120
  { revalidateOnFocus: false, refreshInterval: ACTIVE_ORDER_REFRESH_INTERVAL, dedupingInterval: ACTIVE_ORDER_DEDUPING_INTERVAL }
121
121
  );
122
122
  return { orders: data?.data ?? [], isLoading, error, mutate };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/use-orders.ts"],"sourcesContent":["\"use client\";\n\nimport useSWR from \"swr\";\nimport { normalizeAddress } from \"@medialane/sdk\";\nimport type { MedialaneClient } from \"@medialane/sdk/starknet\";\nimport type { ApiOrdersQuery, ApiOrder, ApiResponse } from \"@medialane/sdk\";\nimport { useMedialaneClient } from \"./use-medialane-client.js\";\nimport { queryKeys } from \"./query-keys.js\";\nimport { apiFetch, type ApiFetchConfig } from \"./api-fetch.js\";\n\nconst ACTIVE_ORDER_REFRESH_INTERVAL = 60_000;\nconst ACTIVE_ORDER_DEDUPING_INTERVAL = 10_000;\n\nexport function useOrders(getClient: () => MedialaneClient, query: ApiOrdersQuery = {}) {\n const client = useMedialaneClient(getClient);\n const key = queryKeys.orders(query);\n\n const { data, error, isLoading, mutate } = useSWR<ApiResponse<ApiOrder[]>>(\n key,\n () => client.api.getOrders(query),\n { revalidateOnFocus: false, refreshInterval: 30000, dedupingInterval: 5000 }\n );\n\n return {\n orders: data?.data ?? [],\n meta: data?.meta,\n isLoading,\n error,\n mutate,\n };\n}\n\nexport function useOrder(getClient: () => MedialaneClient, orderHash: string | null) {\n const client = useMedialaneClient(getClient);\n\n const { data, error, isLoading } = useSWR(\n orderHash ? queryKeys.order(orderHash) : null,\n () => client.api.getOrder(orderHash!),\n { revalidateOnFocus: false }\n );\n\n return { order: data?.data ?? null, isLoading, error };\n}\n\nexport function useTokenListings(getClient: () => MedialaneClient, contract: string | null, tokenId: string | null) {\n const client = useMedialaneClient(getClient);\n\n const { data, error, isLoading, mutate } = useSWR(\n contract && tokenId ? queryKeys.listings(contract, tokenId) : null,\n () => client.api.getActiveOrdersForToken(contract!, tokenId!),\n { revalidateOnFocus: false, refreshInterval: ACTIVE_ORDER_REFRESH_INTERVAL, dedupingInterval: ACTIVE_ORDER_DEDUPING_INTERVAL }\n );\n\n return { listings: data?.data ?? [], isLoading, error, mutate };\n}\n\nexport function useUserOrders(getClient: () => MedialaneClient, address: string | null) {\n const client = useMedialaneClient(getClient);\n const normalized = address ? normalizeAddress(\"STARKNET\", address) : null;\n\n const { data, error, isLoading, mutate } = useSWR(\n normalized ? queryKeys.userOrders(normalized) : null,\n () => client.api.getOrdersByUser(normalized!),\n { revalidateOnFocus: false, refreshInterval: ACTIVE_ORDER_REFRESH_INTERVAL, dedupingInterval: ACTIVE_ORDER_DEDUPING_INTERVAL }\n );\n\n return { orders: data?.data ?? [], isLoading, error, mutate };\n}\n\nexport function useCounterOffers(\n getClient: () => MedialaneClient,\n {\n originalOrderHash,\n sellerAddress,\n }: {\n originalOrderHash?: string | null;\n sellerAddress?: string | null;\n }\n) {\n const client = useMedialaneClient(getClient);\n const normalized = sellerAddress ? normalizeAddress(\"STARKNET\", sellerAddress) : null;\n const key =\n originalOrderHash\n ? queryKeys.counterOffersByOrder(originalOrderHash)\n : normalized\n ? queryKeys.counterOffersBySeller(normalized)\n : null;\n\n const { data, error, isLoading, mutate } = useSWR<ApiResponse<ApiOrder[]>>(\n key,\n () => client.api.getCounterOffers({\n ...(originalOrderHash ? { originalOrderHash } : {}),\n ...(normalized ? { sellerAddress: normalized } : {}),\n }),\n { revalidateOnFocus: false, refreshInterval: ACTIVE_ORDER_REFRESH_INTERVAL, dedupingInterval: ACTIVE_ORDER_DEDUPING_INTERVAL }\n );\n\n return {\n counterOffers: data?.data ?? [],\n total: data?.meta?.total ?? 0,\n isLoading,\n error,\n mutate,\n };\n}\n\nexport function useReceivedOffers(apiConfig: ApiFetchConfig, address: string | null) {\n const normalized = address ? normalizeAddress(\"STARKNET\", address) : null;\n\n const { data, error, isLoading, mutate } = useSWR<ApiResponse<ApiOrder[]>>(\n normalized ? [\"received-offers\", normalized] : null,\n () => apiFetch<ApiResponse<ApiOrder[]>>(apiConfig, `/v1/orders/received/${normalized}?limit=50`),\n { revalidateOnFocus: false, refreshInterval: ACTIVE_ORDER_REFRESH_INTERVAL, dedupingInterval: ACTIVE_ORDER_DEDUPING_INTERVAL }\n );\n\n return { orders: data?.data ?? [], isLoading, error, mutate };\n}\n\nexport function useCollectionFloorListings(getClient: () => MedialaneClient, contract: string | null, limit = 20) {\n const client = useMedialaneClient(getClient);\n const key = contract ? queryKeys.floorListings(contract, limit) : null;\n\n const { data, error, isLoading } = useSWR<ApiResponse<ApiOrder[]>>(\n key,\n () =>\n client.api.getOrders({\n collection: contract!,\n status: \"ACTIVE\",\n sort: \"price_asc\",\n limit,\n }),\n { revalidateOnFocus: false, refreshInterval: ACTIVE_ORDER_REFRESH_INTERVAL }\n );\n\n return {\n listings: data?.data ?? [],\n isLoading,\n error,\n };\n}\n"],"mappings":"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","names":["useSWR"]}
1
+ {"version":3,"sources":["../../src/utils/use-orders.ts"],"sourcesContent":["\"use client\";\n\nimport useSWR from \"swr\";\nimport { normalizeAddress } from \"@medialane/sdk\";\nimport type { MedialaneClient } from \"@medialane/sdk/starknet\";\nimport type { ApiOrdersQuery, ApiOrder, ApiResponse } from \"@medialane/sdk\";\nimport { useMedialaneClient } from \"./use-medialane-client.js\";\nimport { queryKeys } from \"./query-keys.js\";\n\nconst ACTIVE_ORDER_REFRESH_INTERVAL = 60_000;\nconst ACTIVE_ORDER_DEDUPING_INTERVAL = 10_000;\n\nexport function useOrders(getClient: () => MedialaneClient, query: ApiOrdersQuery = {}) {\n const client = useMedialaneClient(getClient);\n const key = queryKeys.orders(query);\n\n const { data, error, isLoading, mutate } = useSWR<ApiResponse<ApiOrder[]>>(\n key,\n () => client.api.getOrders(query),\n { revalidateOnFocus: false, refreshInterval: 30000, dedupingInterval: 5000 }\n );\n\n return {\n orders: data?.data ?? [],\n meta: data?.meta,\n isLoading,\n error,\n mutate,\n };\n}\n\nexport function useOrder(getClient: () => MedialaneClient, orderHash: string | null) {\n const client = useMedialaneClient(getClient);\n\n const { data, error, isLoading } = useSWR(\n orderHash ? queryKeys.order(orderHash) : null,\n () => client.api.getOrder(orderHash!),\n { revalidateOnFocus: false }\n );\n\n return { order: data?.data ?? null, isLoading, error };\n}\n\nexport function useTokenListings(getClient: () => MedialaneClient, contract: string | null, tokenId: string | null) {\n const client = useMedialaneClient(getClient);\n\n const { data, error, isLoading, mutate } = useSWR(\n contract && tokenId ? queryKeys.listings(contract, tokenId) : null,\n () => client.api.getActiveOrdersForToken(contract!, tokenId!),\n { revalidateOnFocus: false, refreshInterval: ACTIVE_ORDER_REFRESH_INTERVAL, dedupingInterval: ACTIVE_ORDER_DEDUPING_INTERVAL }\n );\n\n return { listings: data?.data ?? [], isLoading, error, mutate };\n}\n\nexport function useUserOrders(getClient: () => MedialaneClient, address: string | null) {\n const client = useMedialaneClient(getClient);\n const normalized = address ? normalizeAddress(\"STARKNET\", address) : null;\n\n const { data, error, isLoading, mutate } = useSWR(\n normalized ? queryKeys.userOrders(normalized) : null,\n () => client.api.getOrdersByUser(normalized!),\n { revalidateOnFocus: false, refreshInterval: ACTIVE_ORDER_REFRESH_INTERVAL, dedupingInterval: ACTIVE_ORDER_DEDUPING_INTERVAL }\n );\n\n return { orders: data?.data ?? [], isLoading, error, mutate };\n}\n\nexport function useCounterOffers(\n getClient: () => MedialaneClient,\n {\n originalOrderHash,\n sellerAddress,\n }: {\n originalOrderHash?: string | null;\n sellerAddress?: string | null;\n }\n) {\n const client = useMedialaneClient(getClient);\n const normalized = sellerAddress ? normalizeAddress(\"STARKNET\", sellerAddress) : null;\n const key =\n originalOrderHash\n ? queryKeys.counterOffersByOrder(originalOrderHash)\n : normalized\n ? queryKeys.counterOffersBySeller(normalized)\n : null;\n\n const { data, error, isLoading, mutate } = useSWR<ApiResponse<ApiOrder[]>>(\n key,\n () => client.api.getCounterOffers({\n ...(originalOrderHash ? { originalOrderHash } : {}),\n ...(normalized ? { sellerAddress: normalized } : {}),\n }),\n { revalidateOnFocus: false, refreshInterval: ACTIVE_ORDER_REFRESH_INTERVAL, dedupingInterval: ACTIVE_ORDER_DEDUPING_INTERVAL }\n );\n\n return {\n counterOffers: data?.data ?? [],\n total: data?.meta?.total ?? 0,\n isLoading,\n error,\n mutate,\n };\n}\n\nexport function useReceivedOffers(getClient: () => MedialaneClient, address: string | null) {\n const client = useMedialaneClient(getClient);\n const normalized = address ? normalizeAddress(\"STARKNET\", address) : null;\n\n const { data, error, isLoading, mutate } = useSWR<ApiResponse<ApiOrder[]>>(\n normalized ? [\"received-offers\", normalized] : null,\n () => client.api.getReceivedOffers(normalized!, { limit: 50 }),\n { revalidateOnFocus: false, refreshInterval: ACTIVE_ORDER_REFRESH_INTERVAL, dedupingInterval: ACTIVE_ORDER_DEDUPING_INTERVAL }\n );\n\n return { orders: data?.data ?? [], isLoading, error, mutate };\n}\n\nexport function useCollectionFloorListings(getClient: () => MedialaneClient, contract: string | null, limit = 20) {\n const client = useMedialaneClient(getClient);\n const key = contract ? queryKeys.floorListings(contract, limit) : null;\n\n const { data, error, isLoading } = useSWR<ApiResponse<ApiOrder[]>>(\n key,\n () =>\n client.api.getOrders({\n collection: contract!,\n status: \"ACTIVE\",\n sort: \"price_asc\",\n limit,\n }),\n { revalidateOnFocus: false, refreshInterval: ACTIVE_ORDER_REFRESH_INTERVAL }\n );\n\n return {\n listings: data?.data ?? [],\n isLoading,\n error,\n };\n}\n"],"mappings":"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","names":["useSWR"]}
@@ -2,7 +2,6 @@ import * as swr from 'swr';
2
2
  import * as _medialane_sdk from '@medialane/sdk';
3
3
  import { ApiOrder, ApiResponse, ApiOrdersQuery } from '@medialane/sdk';
4
4
  import { MedialaneClient } from '@medialane/sdk/starknet';
5
- import { ApiFetchConfig } from './api-fetch.cjs';
6
5
 
7
6
  declare function useOrders(getClient: () => MedialaneClient, query?: ApiOrdersQuery): {
8
7
  orders: ApiOrder[];
@@ -38,7 +37,7 @@ declare function useCounterOffers(getClient: () => MedialaneClient, { originalOr
38
37
  error: any;
39
38
  mutate: swr.KeyedMutator<ApiResponse<ApiOrder[]>>;
40
39
  };
41
- declare function useReceivedOffers(apiConfig: ApiFetchConfig, address: string | null): {
40
+ declare function useReceivedOffers(getClient: () => MedialaneClient, address: string | null): {
42
41
  orders: ApiOrder[];
43
42
  isLoading: boolean;
44
43
  error: any;
@@ -2,7 +2,6 @@ import * as swr from 'swr';
2
2
  import * as _medialane_sdk from '@medialane/sdk';
3
3
  import { ApiOrder, ApiResponse, ApiOrdersQuery } from '@medialane/sdk';
4
4
  import { MedialaneClient } from '@medialane/sdk/starknet';
5
- import { ApiFetchConfig } from './api-fetch.js';
6
5
 
7
6
  declare function useOrders(getClient: () => MedialaneClient, query?: ApiOrdersQuery): {
8
7
  orders: ApiOrder[];
@@ -38,7 +37,7 @@ declare function useCounterOffers(getClient: () => MedialaneClient, { originalOr
38
37
  error: any;
39
38
  mutate: swr.KeyedMutator<ApiResponse<ApiOrder[]>>;
40
39
  };
41
- declare function useReceivedOffers(apiConfig: ApiFetchConfig, address: string | null): {
40
+ declare function useReceivedOffers(getClient: () => MedialaneClient, address: string | null): {
42
41
  orders: ApiOrder[];
43
42
  isLoading: boolean;
44
43
  error: any;
@@ -3,7 +3,6 @@ import useSWR from "swr";
3
3
  import { normalizeAddress } from "@medialane/sdk";
4
4
  import { useMedialaneClient } from "./use-medialane-client.js";
5
5
  import { queryKeys } from "./query-keys.js";
6
- import { apiFetch } from "./api-fetch.js";
7
6
  const ACTIVE_ORDER_REFRESH_INTERVAL = 6e4;
8
7
  const ACTIVE_ORDER_DEDUPING_INTERVAL = 1e4;
9
8
  function useOrders(getClient, query = {}) {
@@ -73,11 +72,12 @@ function useCounterOffers(getClient, {
73
72
  mutate
74
73
  };
75
74
  }
76
- function useReceivedOffers(apiConfig, address) {
75
+ function useReceivedOffers(getClient, address) {
76
+ const client = useMedialaneClient(getClient);
77
77
  const normalized = address ? normalizeAddress("STARKNET", address) : null;
78
78
  const { data, error, isLoading, mutate } = useSWR(
79
79
  normalized ? ["received-offers", normalized] : null,
80
- () => apiFetch(apiConfig, `/v1/orders/received/${normalized}?limit=50`),
80
+ () => client.api.getReceivedOffers(normalized, { limit: 50 }),
81
81
  { revalidateOnFocus: false, refreshInterval: ACTIVE_ORDER_REFRESH_INTERVAL, dedupingInterval: ACTIVE_ORDER_DEDUPING_INTERVAL }
82
82
  );
83
83
  return { orders: data?.data ?? [], isLoading, error, mutate };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/use-orders.ts"],"sourcesContent":["\"use client\";\n\nimport useSWR from \"swr\";\nimport { normalizeAddress } from \"@medialane/sdk\";\nimport type { MedialaneClient } from \"@medialane/sdk/starknet\";\nimport type { ApiOrdersQuery, ApiOrder, ApiResponse } from \"@medialane/sdk\";\nimport { useMedialaneClient } from \"./use-medialane-client.js\";\nimport { queryKeys } from \"./query-keys.js\";\nimport { apiFetch, type ApiFetchConfig } from \"./api-fetch.js\";\n\nconst ACTIVE_ORDER_REFRESH_INTERVAL = 60_000;\nconst ACTIVE_ORDER_DEDUPING_INTERVAL = 10_000;\n\nexport function useOrders(getClient: () => MedialaneClient, query: ApiOrdersQuery = {}) {\n const client = useMedialaneClient(getClient);\n const key = queryKeys.orders(query);\n\n const { data, error, isLoading, mutate } = useSWR<ApiResponse<ApiOrder[]>>(\n key,\n () => client.api.getOrders(query),\n { revalidateOnFocus: false, refreshInterval: 30000, dedupingInterval: 5000 }\n );\n\n return {\n orders: data?.data ?? [],\n meta: data?.meta,\n isLoading,\n error,\n mutate,\n };\n}\n\nexport function useOrder(getClient: () => MedialaneClient, orderHash: string | null) {\n const client = useMedialaneClient(getClient);\n\n const { data, error, isLoading } = useSWR(\n orderHash ? queryKeys.order(orderHash) : null,\n () => client.api.getOrder(orderHash!),\n { revalidateOnFocus: false }\n );\n\n return { order: data?.data ?? null, isLoading, error };\n}\n\nexport function useTokenListings(getClient: () => MedialaneClient, contract: string | null, tokenId: string | null) {\n const client = useMedialaneClient(getClient);\n\n const { data, error, isLoading, mutate } = useSWR(\n contract && tokenId ? queryKeys.listings(contract, tokenId) : null,\n () => client.api.getActiveOrdersForToken(contract!, tokenId!),\n { revalidateOnFocus: false, refreshInterval: ACTIVE_ORDER_REFRESH_INTERVAL, dedupingInterval: ACTIVE_ORDER_DEDUPING_INTERVAL }\n );\n\n return { listings: data?.data ?? [], isLoading, error, mutate };\n}\n\nexport function useUserOrders(getClient: () => MedialaneClient, address: string | null) {\n const client = useMedialaneClient(getClient);\n const normalized = address ? normalizeAddress(\"STARKNET\", address) : null;\n\n const { data, error, isLoading, mutate } = useSWR(\n normalized ? queryKeys.userOrders(normalized) : null,\n () => client.api.getOrdersByUser(normalized!),\n { revalidateOnFocus: false, refreshInterval: ACTIVE_ORDER_REFRESH_INTERVAL, dedupingInterval: ACTIVE_ORDER_DEDUPING_INTERVAL }\n );\n\n return { orders: data?.data ?? [], isLoading, error, mutate };\n}\n\nexport function useCounterOffers(\n getClient: () => MedialaneClient,\n {\n originalOrderHash,\n sellerAddress,\n }: {\n originalOrderHash?: string | null;\n sellerAddress?: string | null;\n }\n) {\n const client = useMedialaneClient(getClient);\n const normalized = sellerAddress ? normalizeAddress(\"STARKNET\", sellerAddress) : null;\n const key =\n originalOrderHash\n ? queryKeys.counterOffersByOrder(originalOrderHash)\n : normalized\n ? queryKeys.counterOffersBySeller(normalized)\n : null;\n\n const { data, error, isLoading, mutate } = useSWR<ApiResponse<ApiOrder[]>>(\n key,\n () => client.api.getCounterOffers({\n ...(originalOrderHash ? { originalOrderHash } : {}),\n ...(normalized ? { sellerAddress: normalized } : {}),\n }),\n { revalidateOnFocus: false, refreshInterval: ACTIVE_ORDER_REFRESH_INTERVAL, dedupingInterval: ACTIVE_ORDER_DEDUPING_INTERVAL }\n );\n\n return {\n counterOffers: data?.data ?? [],\n total: data?.meta?.total ?? 0,\n isLoading,\n error,\n mutate,\n };\n}\n\nexport function useReceivedOffers(apiConfig: ApiFetchConfig, address: string | null) {\n const normalized = address ? normalizeAddress(\"STARKNET\", address) : null;\n\n const { data, error, isLoading, mutate } = useSWR<ApiResponse<ApiOrder[]>>(\n normalized ? [\"received-offers\", normalized] : null,\n () => apiFetch<ApiResponse<ApiOrder[]>>(apiConfig, `/v1/orders/received/${normalized}?limit=50`),\n { revalidateOnFocus: false, refreshInterval: ACTIVE_ORDER_REFRESH_INTERVAL, dedupingInterval: ACTIVE_ORDER_DEDUPING_INTERVAL }\n );\n\n return { orders: data?.data ?? [], isLoading, error, mutate };\n}\n\nexport function useCollectionFloorListings(getClient: () => MedialaneClient, contract: string | null, limit = 20) {\n const client = useMedialaneClient(getClient);\n const key = contract ? queryKeys.floorListings(contract, limit) : null;\n\n const { data, error, isLoading } = useSWR<ApiResponse<ApiOrder[]>>(\n key,\n () =>\n client.api.getOrders({\n collection: contract!,\n status: \"ACTIVE\",\n sort: \"price_asc\",\n limit,\n }),\n { revalidateOnFocus: false, refreshInterval: ACTIVE_ORDER_REFRESH_INTERVAL }\n );\n\n return {\n listings: data?.data ?? [],\n isLoading,\n error,\n };\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/utils/use-orders.ts"],"sourcesContent":["\"use client\";\n\nimport useSWR from \"swr\";\nimport { normalizeAddress } from \"@medialane/sdk\";\nimport type { MedialaneClient } from \"@medialane/sdk/starknet\";\nimport type { ApiOrdersQuery, ApiOrder, ApiResponse } from \"@medialane/sdk\";\nimport { useMedialaneClient } from \"./use-medialane-client.js\";\nimport { queryKeys } from \"./query-keys.js\";\n\nconst ACTIVE_ORDER_REFRESH_INTERVAL = 60_000;\nconst ACTIVE_ORDER_DEDUPING_INTERVAL = 10_000;\n\nexport function useOrders(getClient: () => MedialaneClient, query: ApiOrdersQuery = {}) {\n const client = useMedialaneClient(getClient);\n const key = queryKeys.orders(query);\n\n const { data, error, isLoading, mutate } = useSWR<ApiResponse<ApiOrder[]>>(\n key,\n () => client.api.getOrders(query),\n { revalidateOnFocus: false, refreshInterval: 30000, dedupingInterval: 5000 }\n );\n\n return {\n orders: data?.data ?? [],\n meta: data?.meta,\n isLoading,\n error,\n mutate,\n };\n}\n\nexport function useOrder(getClient: () => MedialaneClient, orderHash: string | null) {\n const client = useMedialaneClient(getClient);\n\n const { data, error, isLoading } = useSWR(\n orderHash ? queryKeys.order(orderHash) : null,\n () => client.api.getOrder(orderHash!),\n { revalidateOnFocus: false }\n );\n\n return { order: data?.data ?? null, isLoading, error };\n}\n\nexport function useTokenListings(getClient: () => MedialaneClient, contract: string | null, tokenId: string | null) {\n const client = useMedialaneClient(getClient);\n\n const { data, error, isLoading, mutate } = useSWR(\n contract && tokenId ? queryKeys.listings(contract, tokenId) : null,\n () => client.api.getActiveOrdersForToken(contract!, tokenId!),\n { revalidateOnFocus: false, refreshInterval: ACTIVE_ORDER_REFRESH_INTERVAL, dedupingInterval: ACTIVE_ORDER_DEDUPING_INTERVAL }\n );\n\n return { listings: data?.data ?? [], isLoading, error, mutate };\n}\n\nexport function useUserOrders(getClient: () => MedialaneClient, address: string | null) {\n const client = useMedialaneClient(getClient);\n const normalized = address ? normalizeAddress(\"STARKNET\", address) : null;\n\n const { data, error, isLoading, mutate } = useSWR(\n normalized ? queryKeys.userOrders(normalized) : null,\n () => client.api.getOrdersByUser(normalized!),\n { revalidateOnFocus: false, refreshInterval: ACTIVE_ORDER_REFRESH_INTERVAL, dedupingInterval: ACTIVE_ORDER_DEDUPING_INTERVAL }\n );\n\n return { orders: data?.data ?? [], isLoading, error, mutate };\n}\n\nexport function useCounterOffers(\n getClient: () => MedialaneClient,\n {\n originalOrderHash,\n sellerAddress,\n }: {\n originalOrderHash?: string | null;\n sellerAddress?: string | null;\n }\n) {\n const client = useMedialaneClient(getClient);\n const normalized = sellerAddress ? normalizeAddress(\"STARKNET\", sellerAddress) : null;\n const key =\n originalOrderHash\n ? queryKeys.counterOffersByOrder(originalOrderHash)\n : normalized\n ? queryKeys.counterOffersBySeller(normalized)\n : null;\n\n const { data, error, isLoading, mutate } = useSWR<ApiResponse<ApiOrder[]>>(\n key,\n () => client.api.getCounterOffers({\n ...(originalOrderHash ? { originalOrderHash } : {}),\n ...(normalized ? { sellerAddress: normalized } : {}),\n }),\n { revalidateOnFocus: false, refreshInterval: ACTIVE_ORDER_REFRESH_INTERVAL, dedupingInterval: ACTIVE_ORDER_DEDUPING_INTERVAL }\n );\n\n return {\n counterOffers: data?.data ?? [],\n total: data?.meta?.total ?? 0,\n isLoading,\n error,\n mutate,\n };\n}\n\nexport function useReceivedOffers(getClient: () => MedialaneClient, address: string | null) {\n const client = useMedialaneClient(getClient);\n const normalized = address ? normalizeAddress(\"STARKNET\", address) : null;\n\n const { data, error, isLoading, mutate } = useSWR<ApiResponse<ApiOrder[]>>(\n normalized ? [\"received-offers\", normalized] : null,\n () => client.api.getReceivedOffers(normalized!, { limit: 50 }),\n { revalidateOnFocus: false, refreshInterval: ACTIVE_ORDER_REFRESH_INTERVAL, dedupingInterval: ACTIVE_ORDER_DEDUPING_INTERVAL }\n );\n\n return { orders: data?.data ?? [], isLoading, error, mutate };\n}\n\nexport function useCollectionFloorListings(getClient: () => MedialaneClient, contract: string | null, limit = 20) {\n const client = useMedialaneClient(getClient);\n const key = contract ? queryKeys.floorListings(contract, limit) : null;\n\n const { data, error, isLoading } = useSWR<ApiResponse<ApiOrder[]>>(\n key,\n () =>\n client.api.getOrders({\n collection: contract!,\n status: \"ACTIVE\",\n sort: \"price_asc\",\n limit,\n }),\n { revalidateOnFocus: false, refreshInterval: ACTIVE_ORDER_REFRESH_INTERVAL }\n );\n\n return {\n listings: data?.data ?? [],\n isLoading,\n error,\n };\n}\n"],"mappings":"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","names":[]}
@@ -33,14 +33,15 @@ __export(use_remix_offers_exports, {
33
33
  });
34
34
  module.exports = __toCommonJS(use_remix_offers_exports);
35
35
  var import_swr = __toESM(require("swr"), 1);
36
- var import_api_fetch = require("./api-fetch.js");
37
- function useTokenRemixes(apiConfig, contract, tokenId) {
36
+ var import_use_medialane_client = require("./use-medialane-client.js");
37
+ function useTokenRemixes(getClient, contract, tokenId) {
38
+ const client = (0, import_use_medialane_client.useMedialaneClient)(getClient);
38
39
  const { data, error, isLoading, mutate } = (0, import_swr.default)(
39
40
  contract && tokenId ? `token-remixes-${contract}-${tokenId}` : null,
40
- () => (0, import_api_fetch.apiFetch)(apiConfig, `/v1/tokens/${contract}/${tokenId}/remixes`),
41
+ () => client.api.getTokenRemixes(contract, tokenId),
41
42
  { refreshInterval: 6e4, revalidateOnFocus: false }
42
43
  );
43
- return { remixes: data?.data ?? [], total: data?.meta.total ?? 0, isLoading, error, mutate };
44
+ return { remixes: data?.data ?? [], total: data?.meta?.total ?? 0, isLoading, error, mutate };
44
45
  }
45
46
  // Annotate the CommonJS export names for ESM import in node:
46
47
  0 && (module.exports = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/use-remix-offers.ts"],"sourcesContent":["\"use client\";\n\nimport useSWR from \"swr\";\nimport { apiFetch, type ApiFetchConfig } from \"./api-fetch.js\";\nimport type { ApiPublicRemix } from \"@medialane/sdk\";\n\nexport function useTokenRemixes(apiConfig: ApiFetchConfig, contract: string | null, tokenId: string | null) {\n const { data, error, isLoading, mutate } = useSWR<{ data: ApiPublicRemix[]; meta: { total: number } }>(\n contract && tokenId ? `token-remixes-${contract}-${tokenId}` : null,\n () => apiFetch(apiConfig, `/v1/tokens/${contract}/${tokenId}/remixes`),\n { refreshInterval: 60000, revalidateOnFocus: false }\n );\n\n return { remixes: data?.data ?? [], total: data?.meta.total ?? 0, isLoading, error, mutate };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,iBAAmB;AACnB,uBAA8C;AAGvC,SAAS,gBAAgB,WAA2B,UAAyB,SAAwB;AAC1G,QAAM,EAAE,MAAM,OAAO,WAAW,OAAO,QAAI,WAAAA;AAAA,IACzC,YAAY,UAAU,iBAAiB,QAAQ,IAAI,OAAO,KAAK;AAAA,IAC/D,UAAM,2BAAS,WAAW,cAAc,QAAQ,IAAI,OAAO,UAAU;AAAA,IACrE,EAAE,iBAAiB,KAAO,mBAAmB,MAAM;AAAA,EACrD;AAEA,SAAO,EAAE,SAAS,MAAM,QAAQ,CAAC,GAAG,OAAO,MAAM,KAAK,SAAS,GAAG,WAAW,OAAO,OAAO;AAC7F;","names":["useSWR"]}
1
+ {"version":3,"sources":["../../src/utils/use-remix-offers.ts"],"sourcesContent":["\"use client\";\n\nimport useSWR from \"swr\";\nimport type { MedialaneClient } from \"@medialane/sdk/starknet\";\nimport { useMedialaneClient } from \"./use-medialane-client.js\";\nimport type { ApiPublicRemix, ApiResponse } from \"@medialane/sdk\";\n\nexport function useTokenRemixes(getClient: () => MedialaneClient, contract: string | null, tokenId: string | null) {\n const client = useMedialaneClient(getClient);\n const { data, error, isLoading, mutate } = useSWR<ApiResponse<ApiPublicRemix[]>>(\n contract && tokenId ? `token-remixes-${contract}-${tokenId}` : null,\n () => client.api.getTokenRemixes(contract!, tokenId!),\n { refreshInterval: 60000, revalidateOnFocus: false }\n );\n\n return { remixes: data?.data ?? [], total: data?.meta?.total ?? 0, isLoading, error, mutate };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,iBAAmB;AAEnB,kCAAmC;AAG5B,SAAS,gBAAgB,WAAkC,UAAyB,SAAwB;AACjH,QAAM,aAAS,gDAAmB,SAAS;AAC3C,QAAM,EAAE,MAAM,OAAO,WAAW,OAAO,QAAI,WAAAA;AAAA,IACzC,YAAY,UAAU,iBAAiB,QAAQ,IAAI,OAAO,KAAK;AAAA,IAC/D,MAAM,OAAO,IAAI,gBAAgB,UAAW,OAAQ;AAAA,IACpD,EAAE,iBAAiB,KAAO,mBAAmB,MAAM;AAAA,EACrD;AAEA,SAAO,EAAE,SAAS,MAAM,QAAQ,CAAC,GAAG,OAAO,MAAM,MAAM,SAAS,GAAG,WAAW,OAAO,OAAO;AAC9F;","names":["useSWR"]}
@@ -1,18 +1,13 @@
1
1
  import * as swr from 'swr';
2
- import { ApiFetchConfig } from './api-fetch.cjs';
3
- import { ApiPublicRemix } from '@medialane/sdk';
2
+ import { MedialaneClient } from '@medialane/sdk/starknet';
3
+ import { ApiPublicRemix, ApiResponse } from '@medialane/sdk';
4
4
 
5
- declare function useTokenRemixes(apiConfig: ApiFetchConfig, contract: string | null, tokenId: string | null): {
5
+ declare function useTokenRemixes(getClient: () => MedialaneClient, contract: string | null, tokenId: string | null): {
6
6
  remixes: ApiPublicRemix[];
7
7
  total: number;
8
8
  isLoading: boolean;
9
9
  error: any;
10
- mutate: swr.KeyedMutator<{
11
- data: ApiPublicRemix[];
12
- meta: {
13
- total: number;
14
- };
15
- }>;
10
+ mutate: swr.KeyedMutator<ApiResponse<ApiPublicRemix[]>>;
16
11
  };
17
12
 
18
13
  export { useTokenRemixes };
@@ -1,18 +1,13 @@
1
1
  import * as swr from 'swr';
2
- import { ApiFetchConfig } from './api-fetch.js';
3
- import { ApiPublicRemix } from '@medialane/sdk';
2
+ import { MedialaneClient } from '@medialane/sdk/starknet';
3
+ import { ApiPublicRemix, ApiResponse } from '@medialane/sdk';
4
4
 
5
- declare function useTokenRemixes(apiConfig: ApiFetchConfig, contract: string | null, tokenId: string | null): {
5
+ declare function useTokenRemixes(getClient: () => MedialaneClient, contract: string | null, tokenId: string | null): {
6
6
  remixes: ApiPublicRemix[];
7
7
  total: number;
8
8
  isLoading: boolean;
9
9
  error: any;
10
- mutate: swr.KeyedMutator<{
11
- data: ApiPublicRemix[];
12
- meta: {
13
- total: number;
14
- };
15
- }>;
10
+ mutate: swr.KeyedMutator<ApiResponse<ApiPublicRemix[]>>;
16
11
  };
17
12
 
18
13
  export { useTokenRemixes };
@@ -1,13 +1,14 @@
1
1
  "use client";
2
2
  import useSWR from "swr";
3
- import { apiFetch } from "./api-fetch.js";
4
- function useTokenRemixes(apiConfig, contract, tokenId) {
3
+ import { useMedialaneClient } from "./use-medialane-client.js";
4
+ function useTokenRemixes(getClient, contract, tokenId) {
5
+ const client = useMedialaneClient(getClient);
5
6
  const { data, error, isLoading, mutate } = useSWR(
6
7
  contract && tokenId ? `token-remixes-${contract}-${tokenId}` : null,
7
- () => apiFetch(apiConfig, `/v1/tokens/${contract}/${tokenId}/remixes`),
8
+ () => client.api.getTokenRemixes(contract, tokenId),
8
9
  { refreshInterval: 6e4, revalidateOnFocus: false }
9
10
  );
10
- return { remixes: data?.data ?? [], total: data?.meta.total ?? 0, isLoading, error, mutate };
11
+ return { remixes: data?.data ?? [], total: data?.meta?.total ?? 0, isLoading, error, mutate };
11
12
  }
12
13
  export {
13
14
  useTokenRemixes
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/use-remix-offers.ts"],"sourcesContent":["\"use client\";\n\nimport useSWR from \"swr\";\nimport { apiFetch, type ApiFetchConfig } from \"./api-fetch.js\";\nimport type { ApiPublicRemix } from \"@medialane/sdk\";\n\nexport function useTokenRemixes(apiConfig: ApiFetchConfig, contract: string | null, tokenId: string | null) {\n const { data, error, isLoading, mutate } = useSWR<{ data: ApiPublicRemix[]; meta: { total: number } }>(\n contract && tokenId ? `token-remixes-${contract}-${tokenId}` : null,\n () => apiFetch(apiConfig, `/v1/tokens/${contract}/${tokenId}/remixes`),\n { refreshInterval: 60000, revalidateOnFocus: false }\n );\n\n return { remixes: data?.data ?? [], total: data?.meta.total ?? 0, isLoading, error, mutate };\n}\n"],"mappings":";AAEA,OAAO,YAAY;AACnB,SAAS,gBAAqC;AAGvC,SAAS,gBAAgB,WAA2B,UAAyB,SAAwB;AAC1G,QAAM,EAAE,MAAM,OAAO,WAAW,OAAO,IAAI;AAAA,IACzC,YAAY,UAAU,iBAAiB,QAAQ,IAAI,OAAO,KAAK;AAAA,IAC/D,MAAM,SAAS,WAAW,cAAc,QAAQ,IAAI,OAAO,UAAU;AAAA,IACrE,EAAE,iBAAiB,KAAO,mBAAmB,MAAM;AAAA,EACrD;AAEA,SAAO,EAAE,SAAS,MAAM,QAAQ,CAAC,GAAG,OAAO,MAAM,KAAK,SAAS,GAAG,WAAW,OAAO,OAAO;AAC7F;","names":[]}
1
+ {"version":3,"sources":["../../src/utils/use-remix-offers.ts"],"sourcesContent":["\"use client\";\n\nimport useSWR from \"swr\";\nimport type { MedialaneClient } from \"@medialane/sdk/starknet\";\nimport { useMedialaneClient } from \"./use-medialane-client.js\";\nimport type { ApiPublicRemix, ApiResponse } from \"@medialane/sdk\";\n\nexport function useTokenRemixes(getClient: () => MedialaneClient, contract: string | null, tokenId: string | null) {\n const client = useMedialaneClient(getClient);\n const { data, error, isLoading, mutate } = useSWR<ApiResponse<ApiPublicRemix[]>>(\n contract && tokenId ? `token-remixes-${contract}-${tokenId}` : null,\n () => client.api.getTokenRemixes(contract!, tokenId!),\n { refreshInterval: 60000, revalidateOnFocus: false }\n );\n\n return { remixes: data?.data ?? [], total: data?.meta?.total ?? 0, isLoading, error, mutate };\n}\n"],"mappings":";AAEA,OAAO,YAAY;AAEnB,SAAS,0BAA0B;AAG5B,SAAS,gBAAgB,WAAkC,UAAyB,SAAwB;AACjH,QAAM,SAAS,mBAAmB,SAAS;AAC3C,QAAM,EAAE,MAAM,OAAO,WAAW,OAAO,IAAI;AAAA,IACzC,YAAY,UAAU,iBAAiB,QAAQ,IAAI,OAAO,KAAK;AAAA,IAC/D,MAAM,OAAO,IAAI,gBAAgB,UAAW,OAAQ;AAAA,IACpD,EAAE,iBAAiB,KAAO,mBAAmB,MAAM;AAAA,EACrD;AAEA,SAAO,EAAE,SAAS,MAAM,QAAQ,CAAC,GAAG,OAAO,MAAM,MAAM,SAAS,GAAG,WAAW,OAAO,OAAO;AAC9F;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@medialane/ui",
3
- "version": "0.167.0",
3
+ "version": "0.169.0",
4
4
  "description": "Shared UI components for Medialane apps",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -51,7 +51,7 @@
51
51
  "preview": "vite --config preview/vite.config.ts"
52
52
  },
53
53
  "peerDependencies": {
54
- "@medialane/sdk": ">=0.129.0",
54
+ "@medialane/sdk": ">=0.135.0",
55
55
  "@radix-ui/react-checkbox": ">=1.1.0",
56
56
  "@radix-ui/react-collapsible": ">=1.1.0",
57
57
  "@radix-ui/react-dialog": ">=1.1.0",
@@ -79,7 +79,7 @@
79
79
  "zod": "^3.25.0"
80
80
  },
81
81
  "devDependencies": {
82
- "@medialane/sdk": "0.129.0",
82
+ "@medialane/sdk": "0.135.0",
83
83
  "@radix-ui/react-checkbox": "^1.3.8",
84
84
  "@radix-ui/react-collapsible": "^1.1.17",
85
85
  "@radix-ui/react-dialog": "^1.1.20",