@medialane/ui 0.140.2 → 0.140.4

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.
@@ -23,7 +23,7 @@ __export(action_dialog_exports, {
23
23
  });
24
24
  module.exports = __toCommonJS(action_dialog_exports);
25
25
  var import_jsx_runtime = require("react/jsx-runtime");
26
- function ActionDialog({ open, onClose, width = 540, children }) {
26
+ function ActionDialog({ open, onClose, width = 540, shadow = true, children }) {
27
27
  if (!open) return null;
28
28
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
29
29
  "div",
@@ -52,7 +52,7 @@ function ActionDialog({ open, onClose, width = 540, children }) {
52
52
  maxWidth: "100%",
53
53
  maxHeight: "92vh",
54
54
  borderRadius: 24,
55
- boxShadow: "0 50px 120px rgba(0,0,0,0.6)",
55
+ boxShadow: shadow ? "0 50px 120px rgba(0,0,0,0.6)" : "none",
56
56
  animation: "mlPop .22s cubic-bezier(.2,.8,.3,1)"
57
57
  },
58
58
  children
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/action-dialog.tsx"],"sourcesContent":["\"use client\";\n\nexport interface ActionDialogProps {\n open: boolean;\n onClose: () => void;\n\n width?: number;\n children: React.ReactNode;\n}\n\nexport function ActionDialog({ open, onClose, width = 540, children }: ActionDialogProps) {\n if (!open) return null;\n return (\n <div\n onClick={onClose}\n style={{\n position: 'fixed',\n inset: 0,\n zIndex: 1000,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 24,\n backdropFilter: 'blur(28px) saturate(150%)',\n WebkitBackdropFilter: 'blur(28px) saturate(150%)',\n background: 'rgba(6,7,15,0.55)',\n animation: 'mlFade .18s ease',\n }}\n >\n <div\n onClick={e => e.stopPropagation()}\n className=\"bg-card text-card-foreground border border-border overflow-y-auto\"\n style={{\n width,\n maxWidth: '100%',\n maxHeight: '92vh',\n borderRadius: 24,\n boxShadow: '0 50px 120px rgba(0,0,0,0.6)',\n animation: 'mlPop .22s cubic-bezier(.2,.8,.3,1)',\n }}\n >\n {children}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA6BM;AAnBC,SAAS,aAAa,EAAE,MAAM,SAAS,QAAQ,KAAK,SAAS,GAAsB;AACxF,MAAI,CAAC,KAAM,QAAO;AAClB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,SAAS;AAAA,MACT,OAAO;AAAA,QACL,UAAU;AAAA,QACV,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,SAAS;AAAA,QACT,gBAAgB;AAAA,QAChB,sBAAsB;AAAA,QACtB,YAAY;AAAA,QACZ,WAAW;AAAA,MACb;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,SAAS,OAAK,EAAE,gBAAgB;AAAA,UAChC,WAAU;AAAA,UACV,OAAO;AAAA,YACL;AAAA,YACA,UAAU;AAAA,YACV,WAAW;AAAA,YACX,cAAc;AAAA,YACd,WAAW;AAAA,YACX,WAAW;AAAA,UACb;AAAA,UAEC;AAAA;AAAA,MACH;AAAA;AAAA,EACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/components/action-dialog.tsx"],"sourcesContent":["\"use client\";\n\nexport interface ActionDialogProps {\n open: boolean;\n onClose: () => void;\n\n width?: number;\n shadow?: boolean;\n children: React.ReactNode;\n}\n\nexport function ActionDialog({ open, onClose, width = 540, shadow = true, children }: ActionDialogProps) {\n if (!open) return null;\n return (\n <div\n onClick={onClose}\n style={{\n position: 'fixed',\n inset: 0,\n zIndex: 1000,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 24,\n backdropFilter: 'blur(28px) saturate(150%)',\n WebkitBackdropFilter: 'blur(28px) saturate(150%)',\n background: 'rgba(6,7,15,0.55)',\n animation: 'mlFade .18s ease',\n }}\n >\n <div\n onClick={e => e.stopPropagation()}\n className=\"bg-card text-card-foreground border border-border overflow-y-auto\"\n style={{\n width,\n maxWidth: '100%',\n maxHeight: '92vh',\n borderRadius: 24,\n boxShadow: shadow ? '0 50px 120px rgba(0,0,0,0.6)' : 'none',\n animation: 'mlPop .22s cubic-bezier(.2,.8,.3,1)',\n }}\n >\n {children}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA8BM;AAnBC,SAAS,aAAa,EAAE,MAAM,SAAS,QAAQ,KAAK,SAAS,MAAM,SAAS,GAAsB;AACvG,MAAI,CAAC,KAAM,QAAO;AAClB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,SAAS;AAAA,MACT,OAAO;AAAA,QACL,UAAU;AAAA,QACV,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,SAAS;AAAA,QACT,gBAAgB;AAAA,QAChB,sBAAsB;AAAA,QACtB,YAAY;AAAA,QACZ,WAAW;AAAA,MACb;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,SAAS,OAAK,EAAE,gBAAgB;AAAA,UAChC,WAAU;AAAA,UACV,OAAO;AAAA,YACL;AAAA,YACA,UAAU;AAAA,YACV,WAAW;AAAA,YACX,cAAc;AAAA,YACd,WAAW,SAAS,iCAAiC;AAAA,YACrD,WAAW;AAAA,UACb;AAAA,UAEC;AAAA;AAAA,MACH;AAAA;AAAA,EACF;AAEJ;","names":[]}
@@ -4,8 +4,9 @@ interface ActionDialogProps {
4
4
  open: boolean;
5
5
  onClose: () => void;
6
6
  width?: number;
7
+ shadow?: boolean;
7
8
  children: React.ReactNode;
8
9
  }
9
- declare function ActionDialog({ open, onClose, width, children }: ActionDialogProps): react_jsx_runtime.JSX.Element | null;
10
+ declare function ActionDialog({ open, onClose, width, shadow, children }: ActionDialogProps): react_jsx_runtime.JSX.Element | null;
10
11
 
11
12
  export { ActionDialog, type ActionDialogProps };
@@ -4,8 +4,9 @@ interface ActionDialogProps {
4
4
  open: boolean;
5
5
  onClose: () => void;
6
6
  width?: number;
7
+ shadow?: boolean;
7
8
  children: React.ReactNode;
8
9
  }
9
- declare function ActionDialog({ open, onClose, width, children }: ActionDialogProps): react_jsx_runtime.JSX.Element | null;
10
+ declare function ActionDialog({ open, onClose, width, shadow, children }: ActionDialogProps): react_jsx_runtime.JSX.Element | null;
10
11
 
11
12
  export { ActionDialog, type ActionDialogProps };
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { jsx } from "react/jsx-runtime";
3
- function ActionDialog({ open, onClose, width = 540, children }) {
3
+ function ActionDialog({ open, onClose, width = 540, shadow = true, children }) {
4
4
  if (!open) return null;
5
5
  return /* @__PURE__ */ jsx(
6
6
  "div",
@@ -29,7 +29,7 @@ function ActionDialog({ open, onClose, width = 540, children }) {
29
29
  maxWidth: "100%",
30
30
  maxHeight: "92vh",
31
31
  borderRadius: 24,
32
- boxShadow: "0 50px 120px rgba(0,0,0,0.6)",
32
+ boxShadow: shadow ? "0 50px 120px rgba(0,0,0,0.6)" : "none",
33
33
  animation: "mlPop .22s cubic-bezier(.2,.8,.3,1)"
34
34
  },
35
35
  children
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/action-dialog.tsx"],"sourcesContent":["\"use client\";\n\nexport interface ActionDialogProps {\n open: boolean;\n onClose: () => void;\n\n width?: number;\n children: React.ReactNode;\n}\n\nexport function ActionDialog({ open, onClose, width = 540, children }: ActionDialogProps) {\n if (!open) return null;\n return (\n <div\n onClick={onClose}\n style={{\n position: 'fixed',\n inset: 0,\n zIndex: 1000,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 24,\n backdropFilter: 'blur(28px) saturate(150%)',\n WebkitBackdropFilter: 'blur(28px) saturate(150%)',\n background: 'rgba(6,7,15,0.55)',\n animation: 'mlFade .18s ease',\n }}\n >\n <div\n onClick={e => e.stopPropagation()}\n className=\"bg-card text-card-foreground border border-border overflow-y-auto\"\n style={{\n width,\n maxWidth: '100%',\n maxHeight: '92vh',\n borderRadius: 24,\n boxShadow: '0 50px 120px rgba(0,0,0,0.6)',\n animation: 'mlPop .22s cubic-bezier(.2,.8,.3,1)',\n }}\n >\n {children}\n </div>\n </div>\n );\n}\n"],"mappings":";AA6BM;AAnBC,SAAS,aAAa,EAAE,MAAM,SAAS,QAAQ,KAAK,SAAS,GAAsB;AACxF,MAAI,CAAC,KAAM,QAAO;AAClB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,SAAS;AAAA,MACT,OAAO;AAAA,QACL,UAAU;AAAA,QACV,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,SAAS;AAAA,QACT,gBAAgB;AAAA,QAChB,sBAAsB;AAAA,QACtB,YAAY;AAAA,QACZ,WAAW;AAAA,MACb;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,SAAS,OAAK,EAAE,gBAAgB;AAAA,UAChC,WAAU;AAAA,UACV,OAAO;AAAA,YACL;AAAA,YACA,UAAU;AAAA,YACV,WAAW;AAAA,YACX,cAAc;AAAA,YACd,WAAW;AAAA,YACX,WAAW;AAAA,UACb;AAAA,UAEC;AAAA;AAAA,MACH;AAAA;AAAA,EACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/components/action-dialog.tsx"],"sourcesContent":["\"use client\";\n\nexport interface ActionDialogProps {\n open: boolean;\n onClose: () => void;\n\n width?: number;\n shadow?: boolean;\n children: React.ReactNode;\n}\n\nexport function ActionDialog({ open, onClose, width = 540, shadow = true, children }: ActionDialogProps) {\n if (!open) return null;\n return (\n <div\n onClick={onClose}\n style={{\n position: 'fixed',\n inset: 0,\n zIndex: 1000,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 24,\n backdropFilter: 'blur(28px) saturate(150%)',\n WebkitBackdropFilter: 'blur(28px) saturate(150%)',\n background: 'rgba(6,7,15,0.55)',\n animation: 'mlFade .18s ease',\n }}\n >\n <div\n onClick={e => e.stopPropagation()}\n className=\"bg-card text-card-foreground border border-border overflow-y-auto\"\n style={{\n width,\n maxWidth: '100%',\n maxHeight: '92vh',\n borderRadius: 24,\n boxShadow: shadow ? '0 50px 120px rgba(0,0,0,0.6)' : 'none',\n animation: 'mlPop .22s cubic-bezier(.2,.8,.3,1)',\n }}\n >\n {children}\n </div>\n </div>\n );\n}\n"],"mappings":";AA8BM;AAnBC,SAAS,aAAa,EAAE,MAAM,SAAS,QAAQ,KAAK,SAAS,MAAM,SAAS,GAAsB;AACvG,MAAI,CAAC,KAAM,QAAO;AAClB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,SAAS;AAAA,MACT,OAAO;AAAA,QACL,UAAU;AAAA,QACV,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,SAAS;AAAA,QACT,gBAAgB;AAAA,QAChB,sBAAsB;AAAA,QACtB,YAAY;AAAA,QACZ,WAAW;AAAA,MACb;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,SAAS,OAAK,EAAE,gBAAgB;AAAA,UAChC,WAAU;AAAA,UACV,OAAO;AAAA,YACL;AAAA,YACA,UAAU;AAAA,YACV,WAAW;AAAA,YACX,cAAc;AAAA,YACd,WAAW,SAAS,iCAAiC;AAAA,YACrD,WAAW;AAAA,UACb;AAAA,UAEC;AAAA;AAAA,MACH;AAAA;AAAA,EACF;AAEJ;","names":[]}
@@ -21,11 +21,19 @@ __export(portfolio_counts_exports, {
21
21
  derivePortfolioCounts: () => derivePortfolioCounts
22
22
  });
23
23
  module.exports = __toCommonJS(portfolio_counts_exports);
24
+ var import_sdk = require("@medialane/sdk");
25
+ function safeNormalize(address) {
26
+ try {
27
+ return (0, import_sdk.normalizeAddress)("STARKNET", address);
28
+ } catch {
29
+ return null;
30
+ }
31
+ }
24
32
  function derivePortfolioCounts(orders, remixOffers, address, sponsorshipPendingCount = 0) {
25
33
  const list = Array.isArray(orders) ? orders : [];
26
- const addr = (address ?? "").toLowerCase();
34
+ const addr = address ? safeNormalize(address) : null;
27
35
  const received = list.filter(
28
- (o) => o.status === "ACTIVE" && o.offer.itemType === "ERC20" && o.offerer.toLowerCase() !== addr
36
+ (o) => o.status === "ACTIVE" && o.offer.itemType === "ERC20" && safeNormalize(o.offerer) !== addr
29
37
  ).length;
30
38
  const listings = list.filter(
31
39
  (o) => (o.offer.itemType === "ERC721" || o.offer.itemType === "ERC1155") && o.status === "ACTIVE"
@@ -34,7 +42,7 @@ function derivePortfolioCounts(orders, remixOffers, address, sponsorshipPendingC
34
42
  (o) => o.status === "PENDING" || o.status === "AUTO_PENDING"
35
43
  ).length : 0;
36
44
  const counter = list.filter(
37
- (o) => o.offer.itemType === "ERC20" && o.offerer.toLowerCase() === addr && o.hasActiveCounterOffer === true
45
+ (o) => o.offer.itemType === "ERC20" && addr !== null && safeNormalize(o.offerer) === addr && o.hasActiveCounterOffer === true
38
46
  ).length;
39
47
  return { received, listings, remix, counter, sponsorships: Math.max(0, sponsorshipPendingCount) };
40
48
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/portfolio-counts.ts"],"sourcesContent":["\nexport interface CountableOrder {\n status: string;\n offerer: string;\n offer: { itemType: string };\n hasActiveCounterOffer?: boolean;\n}\n\nexport interface PortfolioCounts {\n\n received: number;\n\n listings: number;\n\n remix: number;\n\n counter: number;\n\n sponsorships: number;\n}\n\nexport function derivePortfolioCounts(\n orders: ReadonlyArray<CountableOrder> | null | undefined,\n remixOffers: ReadonlyArray<{ status: string }> | null | undefined,\n address: string | null | undefined,\n sponsorshipPendingCount = 0,\n): PortfolioCounts {\n const list = Array.isArray(orders) ? orders : [];\n const addr = (address ?? \"\").toLowerCase();\n\n const received = list.filter(\n (o) =>\n o.status === \"ACTIVE\" &&\n o.offer.itemType === \"ERC20\" &&\n o.offerer.toLowerCase() !== addr,\n ).length;\n\n const listings = list.filter(\n (o) =>\n (o.offer.itemType === \"ERC721\" || o.offer.itemType === \"ERC1155\") &&\n o.status === \"ACTIVE\",\n ).length;\n\n const remix = Array.isArray(remixOffers)\n ? remixOffers.filter(\n (o) => o.status === \"PENDING\" || o.status === \"AUTO_PENDING\",\n ).length\n : 0;\n\n const counter = list.filter(\n (o) =>\n o.offer.itemType === \"ERC20\" &&\n o.offerer.toLowerCase() === addr &&\n o.hasActiveCounterOffer === true,\n ).length;\n\n return { received, listings, remix, counter, sponsorships: Math.max(0, sponsorshipPendingCount) };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBO,SAAS,sBACd,QACA,aACA,SACA,0BAA0B,GACT;AACjB,QAAM,OAAO,MAAM,QAAQ,MAAM,IAAI,SAAS,CAAC;AAC/C,QAAM,QAAQ,WAAW,IAAI,YAAY;AAEzC,QAAM,WAAW,KAAK;AAAA,IACpB,CAAC,MACC,EAAE,WAAW,YACb,EAAE,MAAM,aAAa,WACrB,EAAE,QAAQ,YAAY,MAAM;AAAA,EAChC,EAAE;AAEF,QAAM,WAAW,KAAK;AAAA,IACpB,CAAC,OACE,EAAE,MAAM,aAAa,YAAY,EAAE,MAAM,aAAa,cACvD,EAAE,WAAW;AAAA,EACjB,EAAE;AAEF,QAAM,QAAQ,MAAM,QAAQ,WAAW,IACnC,YAAY;AAAA,IACV,CAAC,MAAM,EAAE,WAAW,aAAa,EAAE,WAAW;AAAA,EAChD,EAAE,SACF;AAEJ,QAAM,UAAU,KAAK;AAAA,IACnB,CAAC,MACC,EAAE,MAAM,aAAa,WACrB,EAAE,QAAQ,YAAY,MAAM,QAC5B,EAAE,0BAA0B;AAAA,EAChC,EAAE;AAEF,SAAO,EAAE,UAAU,UAAU,OAAO,SAAS,cAAc,KAAK,IAAI,GAAG,uBAAuB,EAAE;AAClG;","names":[]}
1
+ {"version":3,"sources":["../../src/utils/portfolio-counts.ts"],"sourcesContent":["import { normalizeAddress } from \"@medialane/sdk\";\n\nexport interface CountableOrder {\n status: string;\n offerer: string;\n offer: { itemType: string };\n hasActiveCounterOffer?: boolean;\n}\n\nexport interface PortfolioCounts {\n\n received: number;\n\n listings: number;\n\n remix: number;\n\n counter: number;\n\n sponsorships: number;\n}\n\nfunction safeNormalize(address: string): string | null {\n try {\n return normalizeAddress(\"STARKNET\", address);\n } catch {\n return null;\n }\n}\n\nexport function derivePortfolioCounts(\n orders: ReadonlyArray<CountableOrder> | null | undefined,\n remixOffers: ReadonlyArray<{ status: string }> | null | undefined,\n address: string | null | undefined,\n sponsorshipPendingCount = 0,\n): PortfolioCounts {\n const list = Array.isArray(orders) ? orders : [];\n const addr = address ? safeNormalize(address) : null;\n\n const received = list.filter(\n (o) =>\n o.status === \"ACTIVE\" &&\n o.offer.itemType === \"ERC20\" &&\n safeNormalize(o.offerer) !== addr,\n ).length;\n\n const listings = list.filter(\n (o) =>\n (o.offer.itemType === \"ERC721\" || o.offer.itemType === \"ERC1155\") &&\n o.status === \"ACTIVE\",\n ).length;\n\n const remix = Array.isArray(remixOffers)\n ? remixOffers.filter(\n (o) => o.status === \"PENDING\" || o.status === \"AUTO_PENDING\",\n ).length\n : 0;\n\n const counter = list.filter(\n (o) =>\n o.offer.itemType === \"ERC20\" &&\n addr !== null &&\n safeNormalize(o.offerer) === addr &&\n o.hasActiveCounterOffer === true,\n ).length;\n\n return { received, listings, remix, counter, sponsorships: Math.max(0, sponsorshipPendingCount) };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAiC;AAsBjC,SAAS,cAAc,SAAgC;AACrD,MAAI;AACF,eAAO,6BAAiB,YAAY,OAAO;AAAA,EAC7C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,sBACd,QACA,aACA,SACA,0BAA0B,GACT;AACjB,QAAM,OAAO,MAAM,QAAQ,MAAM,IAAI,SAAS,CAAC;AAC/C,QAAM,OAAO,UAAU,cAAc,OAAO,IAAI;AAEhD,QAAM,WAAW,KAAK;AAAA,IACpB,CAAC,MACC,EAAE,WAAW,YACb,EAAE,MAAM,aAAa,WACrB,cAAc,EAAE,OAAO,MAAM;AAAA,EACjC,EAAE;AAEF,QAAM,WAAW,KAAK;AAAA,IACpB,CAAC,OACE,EAAE,MAAM,aAAa,YAAY,EAAE,MAAM,aAAa,cACvD,EAAE,WAAW;AAAA,EACjB,EAAE;AAEF,QAAM,QAAQ,MAAM,QAAQ,WAAW,IACnC,YAAY;AAAA,IACV,CAAC,MAAM,EAAE,WAAW,aAAa,EAAE,WAAW;AAAA,EAChD,EAAE,SACF;AAEJ,QAAM,UAAU,KAAK;AAAA,IACnB,CAAC,MACC,EAAE,MAAM,aAAa,WACrB,SAAS,QACT,cAAc,EAAE,OAAO,MAAM,QAC7B,EAAE,0BAA0B;AAAA,EAChC,EAAE;AAEF,SAAO,EAAE,UAAU,UAAU,OAAO,SAAS,cAAc,KAAK,IAAI,GAAG,uBAAuB,EAAE;AAClG;","names":[]}
@@ -1,8 +1,16 @@
1
+ import { normalizeAddress } from "@medialane/sdk";
2
+ function safeNormalize(address) {
3
+ try {
4
+ return normalizeAddress("STARKNET", address);
5
+ } catch {
6
+ return null;
7
+ }
8
+ }
1
9
  function derivePortfolioCounts(orders, remixOffers, address, sponsorshipPendingCount = 0) {
2
10
  const list = Array.isArray(orders) ? orders : [];
3
- const addr = (address ?? "").toLowerCase();
11
+ const addr = address ? safeNormalize(address) : null;
4
12
  const received = list.filter(
5
- (o) => o.status === "ACTIVE" && o.offer.itemType === "ERC20" && o.offerer.toLowerCase() !== addr
13
+ (o) => o.status === "ACTIVE" && o.offer.itemType === "ERC20" && safeNormalize(o.offerer) !== addr
6
14
  ).length;
7
15
  const listings = list.filter(
8
16
  (o) => (o.offer.itemType === "ERC721" || o.offer.itemType === "ERC1155") && o.status === "ACTIVE"
@@ -11,7 +19,7 @@ function derivePortfolioCounts(orders, remixOffers, address, sponsorshipPendingC
11
19
  (o) => o.status === "PENDING" || o.status === "AUTO_PENDING"
12
20
  ).length : 0;
13
21
  const counter = list.filter(
14
- (o) => o.offer.itemType === "ERC20" && o.offerer.toLowerCase() === addr && o.hasActiveCounterOffer === true
22
+ (o) => o.offer.itemType === "ERC20" && addr !== null && safeNormalize(o.offerer) === addr && o.hasActiveCounterOffer === true
15
23
  ).length;
16
24
  return { received, listings, remix, counter, sponsorships: Math.max(0, sponsorshipPendingCount) };
17
25
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/portfolio-counts.ts"],"sourcesContent":["\nexport interface CountableOrder {\n status: string;\n offerer: string;\n offer: { itemType: string };\n hasActiveCounterOffer?: boolean;\n}\n\nexport interface PortfolioCounts {\n\n received: number;\n\n listings: number;\n\n remix: number;\n\n counter: number;\n\n sponsorships: number;\n}\n\nexport function derivePortfolioCounts(\n orders: ReadonlyArray<CountableOrder> | null | undefined,\n remixOffers: ReadonlyArray<{ status: string }> | null | undefined,\n address: string | null | undefined,\n sponsorshipPendingCount = 0,\n): PortfolioCounts {\n const list = Array.isArray(orders) ? orders : [];\n const addr = (address ?? \"\").toLowerCase();\n\n const received = list.filter(\n (o) =>\n o.status === \"ACTIVE\" &&\n o.offer.itemType === \"ERC20\" &&\n o.offerer.toLowerCase() !== addr,\n ).length;\n\n const listings = list.filter(\n (o) =>\n (o.offer.itemType === \"ERC721\" || o.offer.itemType === \"ERC1155\") &&\n o.status === \"ACTIVE\",\n ).length;\n\n const remix = Array.isArray(remixOffers)\n ? remixOffers.filter(\n (o) => o.status === \"PENDING\" || o.status === \"AUTO_PENDING\",\n ).length\n : 0;\n\n const counter = list.filter(\n (o) =>\n o.offer.itemType === \"ERC20\" &&\n o.offerer.toLowerCase() === addr &&\n o.hasActiveCounterOffer === true,\n ).length;\n\n return { received, listings, remix, counter, sponsorships: Math.max(0, sponsorshipPendingCount) };\n}\n"],"mappings":"AAqBO,SAAS,sBACd,QACA,aACA,SACA,0BAA0B,GACT;AACjB,QAAM,OAAO,MAAM,QAAQ,MAAM,IAAI,SAAS,CAAC;AAC/C,QAAM,QAAQ,WAAW,IAAI,YAAY;AAEzC,QAAM,WAAW,KAAK;AAAA,IACpB,CAAC,MACC,EAAE,WAAW,YACb,EAAE,MAAM,aAAa,WACrB,EAAE,QAAQ,YAAY,MAAM;AAAA,EAChC,EAAE;AAEF,QAAM,WAAW,KAAK;AAAA,IACpB,CAAC,OACE,EAAE,MAAM,aAAa,YAAY,EAAE,MAAM,aAAa,cACvD,EAAE,WAAW;AAAA,EACjB,EAAE;AAEF,QAAM,QAAQ,MAAM,QAAQ,WAAW,IACnC,YAAY;AAAA,IACV,CAAC,MAAM,EAAE,WAAW,aAAa,EAAE,WAAW;AAAA,EAChD,EAAE,SACF;AAEJ,QAAM,UAAU,KAAK;AAAA,IACnB,CAAC,MACC,EAAE,MAAM,aAAa,WACrB,EAAE,QAAQ,YAAY,MAAM,QAC5B,EAAE,0BAA0B;AAAA,EAChC,EAAE;AAEF,SAAO,EAAE,UAAU,UAAU,OAAO,SAAS,cAAc,KAAK,IAAI,GAAG,uBAAuB,EAAE;AAClG;","names":[]}
1
+ {"version":3,"sources":["../../src/utils/portfolio-counts.ts"],"sourcesContent":["import { normalizeAddress } from \"@medialane/sdk\";\n\nexport interface CountableOrder {\n status: string;\n offerer: string;\n offer: { itemType: string };\n hasActiveCounterOffer?: boolean;\n}\n\nexport interface PortfolioCounts {\n\n received: number;\n\n listings: number;\n\n remix: number;\n\n counter: number;\n\n sponsorships: number;\n}\n\nfunction safeNormalize(address: string): string | null {\n try {\n return normalizeAddress(\"STARKNET\", address);\n } catch {\n return null;\n }\n}\n\nexport function derivePortfolioCounts(\n orders: ReadonlyArray<CountableOrder> | null | undefined,\n remixOffers: ReadonlyArray<{ status: string }> | null | undefined,\n address: string | null | undefined,\n sponsorshipPendingCount = 0,\n): PortfolioCounts {\n const list = Array.isArray(orders) ? orders : [];\n const addr = address ? safeNormalize(address) : null;\n\n const received = list.filter(\n (o) =>\n o.status === \"ACTIVE\" &&\n o.offer.itemType === \"ERC20\" &&\n safeNormalize(o.offerer) !== addr,\n ).length;\n\n const listings = list.filter(\n (o) =>\n (o.offer.itemType === \"ERC721\" || o.offer.itemType === \"ERC1155\") &&\n o.status === \"ACTIVE\",\n ).length;\n\n const remix = Array.isArray(remixOffers)\n ? remixOffers.filter(\n (o) => o.status === \"PENDING\" || o.status === \"AUTO_PENDING\",\n ).length\n : 0;\n\n const counter = list.filter(\n (o) =>\n o.offer.itemType === \"ERC20\" &&\n addr !== null &&\n safeNormalize(o.offerer) === addr &&\n o.hasActiveCounterOffer === true,\n ).length;\n\n return { received, listings, remix, counter, sponsorships: Math.max(0, sponsorshipPendingCount) };\n}\n"],"mappings":"AAAA,SAAS,wBAAwB;AAsBjC,SAAS,cAAc,SAAgC;AACrD,MAAI;AACF,WAAO,iBAAiB,YAAY,OAAO;AAAA,EAC7C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,sBACd,QACA,aACA,SACA,0BAA0B,GACT;AACjB,QAAM,OAAO,MAAM,QAAQ,MAAM,IAAI,SAAS,CAAC;AAC/C,QAAM,OAAO,UAAU,cAAc,OAAO,IAAI;AAEhD,QAAM,WAAW,KAAK;AAAA,IACpB,CAAC,MACC,EAAE,WAAW,YACb,EAAE,MAAM,aAAa,WACrB,cAAc,EAAE,OAAO,MAAM;AAAA,EACjC,EAAE;AAEF,QAAM,WAAW,KAAK;AAAA,IACpB,CAAC,OACE,EAAE,MAAM,aAAa,YAAY,EAAE,MAAM,aAAa,cACvD,EAAE,WAAW;AAAA,EACjB,EAAE;AAEF,QAAM,QAAQ,MAAM,QAAQ,WAAW,IACnC,YAAY;AAAA,IACV,CAAC,MAAM,EAAE,WAAW,aAAa,EAAE,WAAW;AAAA,EAChD,EAAE,SACF;AAEJ,QAAM,UAAU,KAAK;AAAA,IACnB,CAAC,MACC,EAAE,MAAM,aAAa,WACrB,SAAS,QACT,cAAc,EAAE,OAAO,MAAM,QAC7B,EAAE,0BAA0B;AAAA,EAChC,EAAE;AAEF,SAAO,EAAE,UAAU,UAAU,OAAO,SAAS,cAAc,KAAK,IAAI,GAAG,uBAAuB,EAAE;AAClG;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@medialane/ui",
3
- "version": "0.140.2",
3
+ "version": "0.140.4",
4
4
  "description": "Shared UI components for Medialane apps",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -99,7 +99,7 @@
99
99
  "cmdk": "^1.1.1",
100
100
  "framer-motion": "^11.0.0",
101
101
  "lucide-react": "^0.400.0",
102
- "next": "^15.0.0",
102
+ "next": "^15.5.23",
103
103
  "next-themes": "^0.4.0",
104
104
  "playwright": "^1.61.1",
105
105
  "react": "^19.0.0",