@medialane/ui 0.184.0 → 0.186.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.
- package/dist/components/drop/create/drop-create.cjs +6 -4
- package/dist/components/drop/create/drop-create.cjs.map +1 -1
- package/dist/components/drop/create/drop-create.d.cts +4 -6
- package/dist/components/drop/create/drop-create.d.ts +4 -6
- package/dist/components/drop/create/drop-create.js +6 -4
- package/dist/components/drop/create/drop-create.js.map +1 -1
- package/dist/components/drop/create/launch-dialog.cjs +4 -1
- package/dist/components/drop/create/launch-dialog.cjs.map +1 -1
- package/dist/components/drop/create/launch-dialog.js +5 -2
- package/dist/components/drop/create/launch-dialog.js.map +1 -1
- package/dist/components/drop/create/sale-section.cjs +2 -2
- package/dist/components/drop/create/sale-section.cjs.map +1 -1
- package/dist/components/drop/create/sale-section.d.cts +3 -3
- package/dist/components/drop/create/sale-section.d.ts +3 -3
- package/dist/components/drop/create/sale-section.js +2 -2
- package/dist/components/drop/create/sale-section.js.map +1 -1
- package/dist/components/drop/drop-card.cjs +2 -2
- package/dist/components/drop/drop-card.cjs.map +1 -1
- package/dist/components/drop/drop-card.js +1 -1
- package/dist/components/drop/drop-card.js.map +1 -1
- package/dist/components/drop/drop-features.cjs +44 -0
- package/dist/components/drop/drop-features.cjs.map +1 -0
- package/dist/components/drop/drop-features.d.cts +5 -0
- package/dist/components/drop/drop-features.d.ts +5 -0
- package/dist/components/drop/drop-features.js +20 -0
- package/dist/components/drop/drop-features.js.map +1 -0
- package/dist/components/{drop-status-display.cjs → drop/drop-status.cjs} +5 -5
- package/dist/components/drop/drop-status.cjs.map +1 -0
- package/dist/components/{drop-status-display.d.ts → drop/drop-status.d.cts} +1 -2
- package/dist/components/{drop-status-display.d.cts → drop/drop-status.d.ts} +1 -2
- package/dist/components/{drop-status-display.js → drop/drop-status.js} +2 -2
- package/dist/components/drop/drop-status.js.map +1 -0
- package/dist/components/drop/page/drop-action-box.cjs +3 -3
- package/dist/components/drop/page/drop-action-box.cjs.map +1 -1
- package/dist/components/drop/page/drop-action-box.d.cts +0 -1
- package/dist/components/drop/page/drop-action-box.d.ts +0 -1
- package/dist/components/drop/page/drop-action-box.js +1 -1
- package/dist/components/drop/page/drop-action-box.js.map +1 -1
- package/dist/components/drop/page/drop-page.cjs +6 -4
- package/dist/components/drop/page/drop-page.cjs.map +1 -1
- package/dist/components/drop/page/drop-page.d.cts +1 -2
- package/dist/components/drop/page/drop-page.d.ts +1 -2
- package/dist/components/drop/page/drop-page.js +7 -5
- package/dist/components/drop/page/drop-page.js.map +1 -1
- package/dist/components/media-wallet/action-button.cjs +54 -0
- package/dist/components/media-wallet/action-button.cjs.map +1 -0
- package/dist/components/media-wallet/action-button.d.cts +10 -0
- package/dist/components/media-wallet/action-button.d.ts +10 -0
- package/dist/components/media-wallet/action-button.js +28 -0
- package/dist/components/media-wallet/action-button.js.map +1 -0
- package/dist/components/media-wallet/action-modal.cjs +84 -0
- package/dist/components/media-wallet/action-modal.cjs.map +1 -0
- package/dist/components/media-wallet/action-modal.d.cts +20 -0
- package/dist/components/media-wallet/action-modal.d.ts +20 -0
- package/dist/components/media-wallet/action-modal.js +56 -0
- package/dist/components/media-wallet/action-modal.js.map +1 -0
- package/dist/components/media-wallet/activate-card.cjs +72 -0
- package/dist/components/media-wallet/activate-card.cjs.map +1 -0
- package/dist/components/media-wallet/activate-card.d.cts +7 -0
- package/dist/components/media-wallet/activate-card.d.ts +7 -0
- package/dist/components/media-wallet/activate-card.js +48 -0
- package/dist/components/media-wallet/activate-card.js.map +1 -0
- package/dist/components/media-wallet/address-qr.cjs +64 -0
- package/dist/components/media-wallet/address-qr.cjs.map +1 -0
- package/dist/components/media-wallet/address-qr.d.cts +8 -0
- package/dist/components/media-wallet/address-qr.d.ts +8 -0
- package/dist/components/media-wallet/address-qr.js +30 -0
- package/dist/components/media-wallet/address-qr.js.map +1 -0
- package/dist/components/media-wallet/back-button.cjs +41 -0
- package/dist/components/media-wallet/back-button.cjs.map +1 -0
- package/dist/components/media-wallet/back-button.d.cts +7 -0
- package/dist/components/media-wallet/back-button.d.ts +7 -0
- package/dist/components/media-wallet/back-button.js +17 -0
- package/dist/components/media-wallet/back-button.js.map +1 -0
- package/dist/components/media-wallet/copy-icon.cjs +49 -0
- package/dist/components/media-wallet/copy-icon.cjs.map +1 -0
- package/dist/components/media-wallet/copy-icon.d.cts +7 -0
- package/dist/components/media-wallet/copy-icon.d.ts +7 -0
- package/dist/components/media-wallet/copy-icon.js +25 -0
- package/dist/components/media-wallet/copy-icon.js.map +1 -0
- package/dist/components/media-wallet/currency-sheet.cjs +54 -0
- package/dist/components/media-wallet/currency-sheet.cjs.map +1 -0
- package/dist/components/media-wallet/currency-sheet.d.cts +12 -0
- package/dist/components/media-wallet/currency-sheet.d.ts +12 -0
- package/dist/components/media-wallet/currency-sheet.js +30 -0
- package/dist/components/media-wallet/currency-sheet.js.map +1 -0
- package/dist/components/media-wallet/media-wallet-activity.cjs +223 -0
- package/dist/components/media-wallet/media-wallet-activity.cjs.map +1 -0
- package/dist/components/media-wallet/media-wallet-activity.d.cts +12 -0
- package/dist/components/media-wallet/media-wallet-activity.d.ts +12 -0
- package/dist/components/media-wallet/media-wallet-activity.js +189 -0
- package/dist/components/media-wallet/media-wallet-activity.js.map +1 -0
- package/dist/components/media-wallet/media-wallet-header.cjs +97 -0
- package/dist/components/media-wallet/media-wallet-header.cjs.map +1 -0
- package/dist/components/media-wallet/media-wallet-header.d.cts +8 -0
- package/dist/components/media-wallet/media-wallet-header.d.ts +8 -0
- package/dist/components/media-wallet/media-wallet-header.js +63 -0
- package/dist/components/media-wallet/media-wallet-header.js.map +1 -0
- package/dist/components/media-wallet/media-wallet-home.cjs +258 -0
- package/dist/components/media-wallet/media-wallet-home.cjs.map +1 -0
- package/dist/components/media-wallet/media-wallet-home.d.cts +14 -0
- package/dist/components/media-wallet/media-wallet-home.d.ts +14 -0
- package/dist/components/media-wallet/media-wallet-home.js +224 -0
- package/dist/components/media-wallet/media-wallet-home.js.map +1 -0
- package/dist/components/media-wallet/media-wallet-overlay.cjs +137 -0
- package/dist/components/media-wallet/media-wallet-overlay.cjs.map +1 -0
- package/dist/components/media-wallet/media-wallet-overlay.d.cts +14 -0
- package/dist/components/media-wallet/media-wallet-overlay.d.ts +14 -0
- package/dist/components/media-wallet/media-wallet-overlay.js +102 -0
- package/dist/components/media-wallet/media-wallet-overlay.js.map +1 -0
- package/dist/components/media-wallet/media-wallet-send.cjs +313 -0
- package/dist/components/media-wallet/media-wallet-send.cjs.map +1 -0
- package/dist/components/media-wallet/media-wallet-send.d.cts +14 -0
- package/dist/components/media-wallet/media-wallet-send.d.ts +14 -0
- package/dist/components/media-wallet/media-wallet-send.js +289 -0
- package/dist/components/media-wallet/media-wallet-send.js.map +1 -0
- package/dist/components/media-wallet/media-wallet-token-detail.cjs +164 -0
- package/dist/components/media-wallet/media-wallet-token-detail.cjs.map +1 -0
- package/dist/components/media-wallet/media-wallet-token-detail.d.cts +13 -0
- package/dist/components/media-wallet/media-wallet-token-detail.d.ts +13 -0
- package/dist/components/media-wallet/media-wallet-token-detail.js +140 -0
- package/dist/components/media-wallet/media-wallet-token-detail.js.map +1 -0
- package/dist/components/media-wallet/media-wallet.cjs +51 -0
- package/dist/components/media-wallet/media-wallet.cjs.map +1 -0
- package/dist/components/media-wallet/media-wallet.d.cts +13 -0
- package/dist/components/media-wallet/media-wallet.d.ts +13 -0
- package/dist/components/media-wallet/media-wallet.js +27 -0
- package/dist/components/media-wallet/media-wallet.js.map +1 -0
- package/dist/components/media-wallet/nft-strip.cjs +85 -0
- package/dist/components/media-wallet/nft-strip.cjs.map +1 -0
- package/dist/components/media-wallet/nft-strip.d.cts +12 -0
- package/dist/components/media-wallet/nft-strip.d.ts +12 -0
- package/dist/components/media-wallet/nft-strip.js +51 -0
- package/dist/components/media-wallet/nft-strip.js.map +1 -0
- package/dist/components/media-wallet/quick-action.cjs +59 -0
- package/dist/components/media-wallet/quick-action.cjs.map +1 -0
- package/dist/components/media-wallet/quick-action.d.cts +12 -0
- package/dist/components/media-wallet/quick-action.d.ts +12 -0
- package/dist/components/media-wallet/quick-action.js +35 -0
- package/dist/components/media-wallet/quick-action.js.map +1 -0
- package/dist/components/media-wallet/receive-card.cjs +86 -0
- package/dist/components/media-wallet/receive-card.cjs.map +1 -0
- package/dist/components/media-wallet/receive-card.d.cts +7 -0
- package/dist/components/media-wallet/receive-card.d.ts +7 -0
- package/dist/components/media-wallet/receive-card.js +52 -0
- package/dist/components/media-wallet/receive-card.js.map +1 -0
- package/dist/components/media-wallet/section-header.cjs +32 -0
- package/dist/components/media-wallet/section-header.cjs.map +1 -0
- package/dist/components/media-wallet/section-header.d.cts +7 -0
- package/dist/components/media-wallet/section-header.d.ts +7 -0
- package/dist/components/media-wallet/section-header.js +8 -0
- package/dist/components/media-wallet/section-header.js.map +1 -0
- package/dist/components/media-wallet/success-dialog.cjs +75 -0
- package/dist/components/media-wallet/success-dialog.cjs.map +1 -0
- package/dist/components/media-wallet/success-dialog.d.cts +11 -0
- package/dist/components/media-wallet/success-dialog.d.ts +11 -0
- package/dist/components/media-wallet/success-dialog.js +51 -0
- package/dist/components/media-wallet/success-dialog.js.map +1 -0
- package/dist/components/media-wallet/types.cjs +37 -0
- package/dist/components/media-wallet/types.cjs.map +1 -0
- package/dist/components/media-wallet/types.d.cts +66 -0
- package/dist/components/media-wallet/types.d.ts +66 -0
- package/dist/components/media-wallet/types.js +12 -0
- package/dist/components/media-wallet/types.js.map +1 -0
- package/dist/components/media-wallet/wallet-activity-icon.cjs +69 -0
- package/dist/components/media-wallet/wallet-activity-icon.cjs.map +1 -0
- package/dist/components/media-wallet/wallet-activity-icon.d.cts +8 -0
- package/dist/components/media-wallet/wallet-activity-icon.d.ts +8 -0
- package/dist/components/media-wallet/wallet-activity-icon.js +45 -0
- package/dist/components/media-wallet/wallet-activity-icon.js.map +1 -0
- package/dist/index.cjs +13 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +6 -2
- package/dist/index.d.ts +6 -2
- package/dist/index.js +8 -2
- package/dist/index.js.map +1 -1
- package/dist/utils/drop/sale.cjs +3 -3
- package/dist/utils/drop/sale.cjs.map +1 -1
- package/dist/utils/drop/sale.d.cts +2 -2
- package/dist/utils/drop/sale.d.ts +2 -2
- package/dist/utils/drop/sale.js +4 -4
- package/dist/utils/drop/sale.js.map +1 -1
- package/dist/utils/drop/view.cjs +2 -2
- package/dist/utils/drop/view.cjs.map +1 -1
- package/dist/utils/drop/view.d.cts +2 -2
- package/dist/utils/drop/view.d.ts +2 -2
- package/dist/utils/drop/view.js +2 -2
- package/dist/utils/drop/view.js.map +1 -1
- package/dist/utils/media-wallet/activity-feed.cjs +35 -0
- package/dist/utils/media-wallet/activity-feed.cjs.map +1 -0
- package/dist/utils/media-wallet/activity-feed.d.cts +14 -0
- package/dist/utils/media-wallet/activity-feed.d.ts +14 -0
- package/dist/utils/media-wallet/activity-feed.js +11 -0
- package/dist/utils/media-wallet/activity-feed.js.map +1 -0
- package/dist/utils/media-wallet/confetti.cjs +51 -0
- package/dist/utils/media-wallet/confetti.cjs.map +1 -0
- package/dist/utils/media-wallet/confetti.d.cts +3 -0
- package/dist/utils/media-wallet/confetti.d.ts +3 -0
- package/dist/utils/media-wallet/confetti.js +17 -0
- package/dist/utils/media-wallet/confetti.js.map +1 -0
- package/dist/utils/media-wallet/nft-items.cjs +38 -0
- package/dist/utils/media-wallet/nft-items.cjs.map +1 -0
- package/dist/utils/media-wallet/nft-items.d.cts +13 -0
- package/dist/utils/media-wallet/nft-items.d.ts +13 -0
- package/dist/utils/media-wallet/nft-items.js +14 -0
- package/dist/utils/media-wallet/nft-items.js.map +1 -0
- package/dist/utils/media-wallet/run-intent-calls.cjs +32 -0
- package/dist/utils/media-wallet/run-intent-calls.cjs.map +1 -0
- package/dist/utils/media-wallet/run-intent-calls.d.cts +16 -0
- package/dist/utils/media-wallet/run-intent-calls.d.ts +16 -0
- package/dist/utils/media-wallet/run-intent-calls.js +8 -0
- package/dist/utils/media-wallet/run-intent-calls.js.map +1 -0
- package/dist/utils/media-wallet/use-erc20-balance.cjs +75 -0
- package/dist/utils/media-wallet/use-erc20-balance.cjs.map +1 -0
- package/dist/utils/media-wallet/use-erc20-balance.d.cts +15 -0
- package/dist/utils/media-wallet/use-erc20-balance.d.ts +15 -0
- package/dist/utils/media-wallet/use-erc20-balance.js +40 -0
- package/dist/utils/media-wallet/use-erc20-balance.js.map +1 -0
- package/dist/utils/media-wallet/use-tokens-by-owner.cjs +52 -0
- package/dist/utils/media-wallet/use-tokens-by-owner.cjs.map +1 -0
- package/dist/utils/media-wallet/use-tokens-by-owner.d.cts +10 -0
- package/dist/utils/media-wallet/use-tokens-by-owner.d.ts +10 -0
- package/dist/utils/media-wallet/use-tokens-by-owner.js +18 -0
- package/dist/utils/media-wallet/use-tokens-by-owner.js.map +1 -0
- package/dist/utils/media-wallet/wallet-activity.cjs +83 -0
- package/dist/utils/media-wallet/wallet-activity.cjs.map +1 -0
- package/dist/utils/media-wallet/wallet-activity.d.cts +7 -0
- package/dist/utils/media-wallet/wallet-activity.d.ts +7 -0
- package/dist/utils/media-wallet/wallet-activity.js +57 -0
- package/dist/utils/media-wallet/wallet-activity.js.map +1 -0
- package/dist/utils/media-wallet/wallet-format.cjs +59 -0
- package/dist/utils/media-wallet/wallet-format.cjs.map +1 -0
- package/dist/utils/media-wallet/wallet-format.d.cts +9 -0
- package/dist/utils/media-wallet/wallet-format.d.ts +9 -0
- package/dist/utils/media-wallet/wallet-format.js +29 -0
- package/dist/utils/media-wallet/wallet-format.js.map +1 -0
- package/dist/utils/media-wallet/wallet-tokens.cjs +39 -0
- package/dist/utils/media-wallet/wallet-tokens.cjs.map +1 -0
- package/dist/utils/media-wallet/wallet-tokens.d.cts +10 -0
- package/dist/utils/media-wallet/wallet-tokens.d.ts +10 -0
- package/dist/utils/media-wallet/wallet-tokens.js +15 -0
- package/dist/utils/media-wallet/wallet-tokens.js.map +1 -0
- package/dist/utils/use-drops.cjs +7 -0
- package/dist/utils/use-drops.cjs.map +1 -1
- package/dist/utils/use-drops.d.cts +3 -1
- package/dist/utils/use-drops.d.ts +3 -1
- package/dist/utils/use-drops.js +6 -0
- package/dist/utils/use-drops.js.map +1 -1
- package/package.json +11 -3
- package/dist/components/drop-status-display.cjs.map +0 -1
- package/dist/components/drop-status-display.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/drop/drop-card.tsx"],"sourcesContent":["\"use client\";\n\nimport { dropHref, type ApiDrop } from \"@medialane/sdk\";\nimport Image from \"../image.js\";\nimport Link from \"../link.js\";\nimport { DropStatusBadge } from \"
|
|
1
|
+
{"version":3,"sources":["../../../src/components/drop/drop-card.tsx"],"sourcesContent":["\"use client\";\n\nimport { dropHref, type ApiDrop } from \"@medialane/sdk\";\nimport Image from \"../image.js\";\nimport Link from \"../link.js\";\nimport { DropStatusBadge } from \"./drop-status.js\";\nimport { ipfsToHttp } from \"../../utils/ipfs.js\";\nimport { dropPhase } from \"../../utils/drop/view.js\";\nimport { priceLabel, supplyLabel } from \"../../utils/drop/sale.js\";\n\nexport interface DropCardProps {\n drop: ApiDrop;\n now: number;\n /** Organizer view: links to the Manage tab. */\n manage?: boolean;\n}\n\nexport function DropCard({ drop, now, manage }: DropCardProps) {\n const phase = dropPhase(drop.terms, BigInt(drop.maxSupply), BigInt(drop.minted), now);\n return (\n <Link\n href={`${dropHref(drop.contractAddress)}${manage ? \"?tab=manage\" : \"\"}`}\n className=\"group block rounded-2xl border border-border bg-card overflow-hidden transition-colors hover:border-primary/40\"\n >\n <div className=\"relative aspect-square bg-muted\">\n {drop.image && (\n <Image src={ipfsToHttp(drop.image)} alt={drop.name ?? \"Drop\"} fill unoptimized className=\"object-cover transition-transform group-hover:scale-[1.02]\" />\n )}\n <div className=\"absolute left-3 top-3\"><DropStatusBadge phase={phase} /></div>\n </div>\n <div className=\"space-y-1 p-4\">\n <p className=\"truncate font-semibold\">{drop.name ?? \"Untitled drop\"}</p>\n <div className=\"flex justify-between gap-2 text-xs text-muted-foreground\">\n <span>{priceLabel(drop.terms.price, drop.terms.paymentToken)}</span>\n <span>{supplyLabel(drop.minted, drop.maxSupply)}</span>\n </div>\n {manage && <p className=\"pt-1 text-xs font-semibold text-primary\">Manage</p>}\n </div>\n </Link>\n );\n}\n\nexport function DropGrid({ drops, now, manage }: { drops: ApiDrop[]; now: number; manage?: boolean }) {\n return (\n <div className=\"grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-3\">\n {drops.map((d) => <DropCard key={d.contractAddress} drop={d} now={now} manage={manage} />)}\n </div>\n );\n}\n\nexport function DropGridSkeleton() {\n return (\n <div className=\"grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-3\">\n {Array.from({ length: 6 }).map((_, i) => <div key={i} className=\"aspect-[4/5] animate-pulse rounded-2xl bg-muted\" />)}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwBM;AAtBN,iBAAuC;AACvC,mBAAkB;AAClB,kBAAiB;AACjB,yBAAgC;AAChC,kBAA2B;AAC3B,kBAA0B;AAC1B,kBAAwC;AASjC,SAAS,SAAS,EAAE,MAAM,KAAK,OAAO,GAAkB;AAC7D,QAAM,YAAQ,uBAAU,KAAK,OAAO,OAAO,KAAK,SAAS,GAAG,OAAO,KAAK,MAAM,GAAG,GAAG;AACpF,SACE;AAAA,IAAC,YAAAA;AAAA,IAAA;AAAA,MACC,MAAM,OAAG,qBAAS,KAAK,eAAe,CAAC,GAAG,SAAS,gBAAgB,EAAE;AAAA,MACrE,WAAU;AAAA,MAEV;AAAA,qDAAC,SAAI,WAAU,mCACZ;AAAA,eAAK,SACJ,4CAAC,aAAAC,SAAA,EAAM,SAAK,wBAAW,KAAK,KAAK,GAAG,KAAK,KAAK,QAAQ,QAAQ,MAAI,MAAC,aAAW,MAAC,WAAU,8DAA6D;AAAA,UAExJ,4CAAC,SAAI,WAAU,yBAAwB,sDAAC,sCAAgB,OAAc,GAAE;AAAA,WAC1E;AAAA,QACA,6CAAC,SAAI,WAAU,iBACb;AAAA,sDAAC,OAAE,WAAU,0BAA0B,eAAK,QAAQ,iBAAgB;AAAA,UACpE,6CAAC,SAAI,WAAU,4DACb;AAAA,wDAAC,UAAM,sCAAW,KAAK,MAAM,OAAO,KAAK,MAAM,YAAY,GAAE;AAAA,YAC7D,4CAAC,UAAM,uCAAY,KAAK,QAAQ,KAAK,SAAS,GAAE;AAAA,aAClD;AAAA,UACC,UAAU,4CAAC,OAAE,WAAU,2CAA0C,oBAAM;AAAA,WAC1E;AAAA;AAAA;AAAA,EACF;AAEJ;AAEO,SAAS,SAAS,EAAE,OAAO,KAAK,OAAO,GAAwD;AACpG,SACE,4CAAC,SAAI,WAAU,wDACZ,gBAAM,IAAI,CAAC,MAAM,4CAAC,YAAiC,MAAM,GAAG,KAAU,UAAtC,EAAE,eAAoD,CAAE,GAC3F;AAEJ;AAEO,SAAS,mBAAmB;AACjC,SACE,4CAAC,SAAI,WAAU,wDACZ,gBAAM,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,MAAM,4CAAC,SAAY,WAAU,qDAAb,CAA+D,CAAE,GACtH;AAEJ;","names":["Link","Image"]}
|
|
@@ -3,7 +3,7 @@ import { jsx, jsxs } from "react/jsx-runtime";
|
|
|
3
3
|
import { dropHref } from "@medialane/sdk";
|
|
4
4
|
import Image from "../image.js";
|
|
5
5
|
import Link from "../link.js";
|
|
6
|
-
import { DropStatusBadge } from "
|
|
6
|
+
import { DropStatusBadge } from "./drop-status.js";
|
|
7
7
|
import { ipfsToHttp } from "../../utils/ipfs.js";
|
|
8
8
|
import { dropPhase } from "../../utils/drop/view.js";
|
|
9
9
|
import { priceLabel, supplyLabel } from "../../utils/drop/sale.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/drop/drop-card.tsx"],"sourcesContent":["\"use client\";\n\nimport { dropHref, type ApiDrop } from \"@medialane/sdk\";\nimport Image from \"../image.js\";\nimport Link from \"../link.js\";\nimport { DropStatusBadge } from \"
|
|
1
|
+
{"version":3,"sources":["../../../src/components/drop/drop-card.tsx"],"sourcesContent":["\"use client\";\n\nimport { dropHref, type ApiDrop } from \"@medialane/sdk\";\nimport Image from \"../image.js\";\nimport Link from \"../link.js\";\nimport { DropStatusBadge } from \"./drop-status.js\";\nimport { ipfsToHttp } from \"../../utils/ipfs.js\";\nimport { dropPhase } from \"../../utils/drop/view.js\";\nimport { priceLabel, supplyLabel } from \"../../utils/drop/sale.js\";\n\nexport interface DropCardProps {\n drop: ApiDrop;\n now: number;\n /** Organizer view: links to the Manage tab. */\n manage?: boolean;\n}\n\nexport function DropCard({ drop, now, manage }: DropCardProps) {\n const phase = dropPhase(drop.terms, BigInt(drop.maxSupply), BigInt(drop.minted), now);\n return (\n <Link\n href={`${dropHref(drop.contractAddress)}${manage ? \"?tab=manage\" : \"\"}`}\n className=\"group block rounded-2xl border border-border bg-card overflow-hidden transition-colors hover:border-primary/40\"\n >\n <div className=\"relative aspect-square bg-muted\">\n {drop.image && (\n <Image src={ipfsToHttp(drop.image)} alt={drop.name ?? \"Drop\"} fill unoptimized className=\"object-cover transition-transform group-hover:scale-[1.02]\" />\n )}\n <div className=\"absolute left-3 top-3\"><DropStatusBadge phase={phase} /></div>\n </div>\n <div className=\"space-y-1 p-4\">\n <p className=\"truncate font-semibold\">{drop.name ?? \"Untitled drop\"}</p>\n <div className=\"flex justify-between gap-2 text-xs text-muted-foreground\">\n <span>{priceLabel(drop.terms.price, drop.terms.paymentToken)}</span>\n <span>{supplyLabel(drop.minted, drop.maxSupply)}</span>\n </div>\n {manage && <p className=\"pt-1 text-xs font-semibold text-primary\">Manage</p>}\n </div>\n </Link>\n );\n}\n\nexport function DropGrid({ drops, now, manage }: { drops: ApiDrop[]; now: number; manage?: boolean }) {\n return (\n <div className=\"grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-3\">\n {drops.map((d) => <DropCard key={d.contractAddress} drop={d} now={now} manage={manage} />)}\n </div>\n );\n}\n\nexport function DropGridSkeleton() {\n return (\n <div className=\"grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-3\">\n {Array.from({ length: 6 }).map((_, i) => <div key={i} className=\"aspect-[4/5] animate-pulse rounded-2xl bg-muted\" />)}\n </div>\n );\n}\n"],"mappings":";AAwBM,SAEI,KAFJ;AAtBN,SAAS,gBAA8B;AACvC,OAAO,WAAW;AAClB,OAAO,UAAU;AACjB,SAAS,uBAAuB;AAChC,SAAS,kBAAkB;AAC3B,SAAS,iBAAiB;AAC1B,SAAS,YAAY,mBAAmB;AASjC,SAAS,SAAS,EAAE,MAAM,KAAK,OAAO,GAAkB;AAC7D,QAAM,QAAQ,UAAU,KAAK,OAAO,OAAO,KAAK,SAAS,GAAG,OAAO,KAAK,MAAM,GAAG,GAAG;AACpF,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAM,GAAG,SAAS,KAAK,eAAe,CAAC,GAAG,SAAS,gBAAgB,EAAE;AAAA,MACrE,WAAU;AAAA,MAEV;AAAA,6BAAC,SAAI,WAAU,mCACZ;AAAA,eAAK,SACJ,oBAAC,SAAM,KAAK,WAAW,KAAK,KAAK,GAAG,KAAK,KAAK,QAAQ,QAAQ,MAAI,MAAC,aAAW,MAAC,WAAU,8DAA6D;AAAA,UAExJ,oBAAC,SAAI,WAAU,yBAAwB,8BAAC,mBAAgB,OAAc,GAAE;AAAA,WAC1E;AAAA,QACA,qBAAC,SAAI,WAAU,iBACb;AAAA,8BAAC,OAAE,WAAU,0BAA0B,eAAK,QAAQ,iBAAgB;AAAA,UACpE,qBAAC,SAAI,WAAU,4DACb;AAAA,gCAAC,UAAM,qBAAW,KAAK,MAAM,OAAO,KAAK,MAAM,YAAY,GAAE;AAAA,YAC7D,oBAAC,UAAM,sBAAY,KAAK,QAAQ,KAAK,SAAS,GAAE;AAAA,aAClD;AAAA,UACC,UAAU,oBAAC,OAAE,WAAU,2CAA0C,oBAAM;AAAA,WAC1E;AAAA;AAAA;AAAA,EACF;AAEJ;AAEO,SAAS,SAAS,EAAE,OAAO,KAAK,OAAO,GAAwD;AACpG,SACE,oBAAC,SAAI,WAAU,wDACZ,gBAAM,IAAI,CAAC,MAAM,oBAAC,YAAiC,MAAM,GAAG,KAAU,UAAtC,EAAE,eAAoD,CAAE,GAC3F;AAEJ;AAEO,SAAS,mBAAmB;AACjC,SACE,oBAAC,SAAI,WAAU,wDACZ,gBAAM,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,MAAM,oBAAC,SAAY,WAAU,qDAAb,CAA+D,CAAE,GACtH;AAEJ;","names":[]}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
"use client";
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
+
var drop_features_exports = {};
|
|
21
|
+
__export(drop_features_exports, {
|
|
22
|
+
DropFeatures: () => DropFeatures
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(drop_features_exports);
|
|
25
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
26
|
+
var import_lucide_react = require("lucide-react");
|
|
27
|
+
const FEATURES = [
|
|
28
|
+
{ icon: import_lucide_react.Layers, title: "Edition or collection", desc: "One artwork in numbered copies, or many unique items." },
|
|
29
|
+
{ icon: import_lucide_react.Timer, title: "Your sale window", desc: "Open now or on a date, close whenever you choose \u2014 or never." },
|
|
30
|
+
{ icon: import_lucide_react.Users, title: "Everyone or a list", desc: "Open to all, or only the wallets you invite with claim links." },
|
|
31
|
+
{ icon: import_lucide_react.Package, title: "Collectors own them", desc: "Each token is theirs to keep, sell or trade anywhere." }
|
|
32
|
+
];
|
|
33
|
+
function DropFeatures() {
|
|
34
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "grid grid-cols-2 sm:grid-cols-4 gap-3", children: FEATURES.map(({ icon: Icon, title, desc }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "bento-cell p-4 space-y-2", children: [
|
|
35
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Icon, { className: "h-5 w-5 text-brand-orange" }),
|
|
36
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm font-semibold leading-tight", children: title }),
|
|
37
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-xs text-muted-foreground leading-relaxed", children: desc })
|
|
38
|
+
] }, title)) });
|
|
39
|
+
}
|
|
40
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
41
|
+
0 && (module.exports = {
|
|
42
|
+
DropFeatures
|
|
43
|
+
});
|
|
44
|
+
//# sourceMappingURL=drop-features.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/drop/drop-features.tsx"],"sourcesContent":["\"use client\";\n\nimport { Layers, Package, Timer, Users } from \"lucide-react\";\n\nconst FEATURES = [\n { icon: Layers, title: \"Edition or collection\", desc: \"One artwork in numbered copies, or many unique items.\" },\n { icon: Timer, title: \"Your sale window\", desc: \"Open now or on a date, close whenever you choose — or never.\" },\n { icon: Users, title: \"Everyone or a list\", desc: \"Open to all, or only the wallets you invite with claim links.\" },\n { icon: Package, title: \"Collectors own them\", desc: \"Each token is theirs to keep, sell or trade anywhere.\" },\n];\n\nexport function DropFeatures() {\n return (\n <div className=\"grid grid-cols-2 sm:grid-cols-4 gap-3\">\n {FEATURES.map(({ icon: Icon, title, desc }) => (\n <div key={title} className=\"bento-cell p-4 space-y-2\">\n <Icon className=\"h-5 w-5 text-brand-orange\" />\n <p className=\"text-sm font-semibold leading-tight\">{title}</p>\n <p className=\"text-xs text-muted-foreground leading-relaxed\">{desc}</p>\n </div>\n ))}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAeQ;AAbR,0BAA8C;AAE9C,MAAM,WAAW;AAAA,EACf,EAAE,MAAM,4BAAQ,OAAO,yBAAyB,MAAM,wDAAwD;AAAA,EAC9G,EAAE,MAAM,2BAAO,OAAO,oBAAoB,MAAM,oEAA+D;AAAA,EAC/G,EAAE,MAAM,2BAAO,OAAO,sBAAsB,MAAM,gEAAgE;AAAA,EAClH,EAAE,MAAM,6BAAS,OAAO,uBAAuB,MAAM,wDAAwD;AAC/G;AAEO,SAAS,eAAe;AAC7B,SACE,4CAAC,SAAI,WAAU,yCACZ,mBAAS,IAAI,CAAC,EAAE,MAAM,MAAM,OAAO,KAAK,MACvC,6CAAC,SAAgB,WAAU,4BACzB;AAAA,gDAAC,QAAK,WAAU,6BAA4B;AAAA,IAC5C,4CAAC,OAAE,WAAU,uCAAuC,iBAAM;AAAA,IAC1D,4CAAC,OAAE,WAAU,iDAAiD,gBAAK;AAAA,OAH3D,KAIV,CACD,GACH;AAEJ;","names":[]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Layers, Package, Timer, Users } from "lucide-react";
|
|
4
|
+
const FEATURES = [
|
|
5
|
+
{ icon: Layers, title: "Edition or collection", desc: "One artwork in numbered copies, or many unique items." },
|
|
6
|
+
{ icon: Timer, title: "Your sale window", desc: "Open now or on a date, close whenever you choose \u2014 or never." },
|
|
7
|
+
{ icon: Users, title: "Everyone or a list", desc: "Open to all, or only the wallets you invite with claim links." },
|
|
8
|
+
{ icon: Package, title: "Collectors own them", desc: "Each token is theirs to keep, sell or trade anywhere." }
|
|
9
|
+
];
|
|
10
|
+
function DropFeatures() {
|
|
11
|
+
return /* @__PURE__ */ jsx("div", { className: "grid grid-cols-2 sm:grid-cols-4 gap-3", children: FEATURES.map(({ icon: Icon, title, desc }) => /* @__PURE__ */ jsxs("div", { className: "bento-cell p-4 space-y-2", children: [
|
|
12
|
+
/* @__PURE__ */ jsx(Icon, { className: "h-5 w-5 text-brand-orange" }),
|
|
13
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm font-semibold leading-tight", children: title }),
|
|
14
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground leading-relaxed", children: desc })
|
|
15
|
+
] }, title)) });
|
|
16
|
+
}
|
|
17
|
+
export {
|
|
18
|
+
DropFeatures
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=drop-features.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/drop/drop-features.tsx"],"sourcesContent":["\"use client\";\n\nimport { Layers, Package, Timer, Users } from \"lucide-react\";\n\nconst FEATURES = [\n { icon: Layers, title: \"Edition or collection\", desc: \"One artwork in numbered copies, or many unique items.\" },\n { icon: Timer, title: \"Your sale window\", desc: \"Open now or on a date, close whenever you choose — or never.\" },\n { icon: Users, title: \"Everyone or a list\", desc: \"Open to all, or only the wallets you invite with claim links.\" },\n { icon: Package, title: \"Collectors own them\", desc: \"Each token is theirs to keep, sell or trade anywhere.\" },\n];\n\nexport function DropFeatures() {\n return (\n <div className=\"grid grid-cols-2 sm:grid-cols-4 gap-3\">\n {FEATURES.map(({ icon: Icon, title, desc }) => (\n <div key={title} className=\"bento-cell p-4 space-y-2\">\n <Icon className=\"h-5 w-5 text-brand-orange\" />\n <p className=\"text-sm font-semibold leading-tight\">{title}</p>\n <p className=\"text-xs text-muted-foreground leading-relaxed\">{desc}</p>\n </div>\n ))}\n </div>\n );\n}\n"],"mappings":";AAeQ,SACE,KADF;AAbR,SAAS,QAAQ,SAAS,OAAO,aAAa;AAE9C,MAAM,WAAW;AAAA,EACf,EAAE,MAAM,QAAQ,OAAO,yBAAyB,MAAM,wDAAwD;AAAA,EAC9G,EAAE,MAAM,OAAO,OAAO,oBAAoB,MAAM,oEAA+D;AAAA,EAC/G,EAAE,MAAM,OAAO,OAAO,sBAAsB,MAAM,gEAAgE;AAAA,EAClH,EAAE,MAAM,SAAS,OAAO,uBAAuB,MAAM,wDAAwD;AAC/G;AAEO,SAAS,eAAe;AAC7B,SACE,oBAAC,SAAI,WAAU,yCACZ,mBAAS,IAAI,CAAC,EAAE,MAAM,MAAM,OAAO,KAAK,MACvC,qBAAC,SAAgB,WAAU,4BACzB;AAAA,wBAAC,QAAK,WAAU,6BAA4B;AAAA,IAC5C,oBAAC,OAAE,WAAU,uCAAuC,iBAAM;AAAA,IAC1D,oBAAC,OAAE,WAAU,iDAAiD,gBAAK;AAAA,OAH3D,KAIV,CACD,GACH;AAEJ;","names":[]}
|
|
@@ -17,14 +17,14 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
17
17
|
return to;
|
|
18
18
|
};
|
|
19
19
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
-
var
|
|
21
|
-
__export(
|
|
20
|
+
var drop_status_exports = {};
|
|
21
|
+
__export(drop_status_exports, {
|
|
22
22
|
DropStatusBadge: () => DropStatusBadge,
|
|
23
23
|
DropSupplyProgress: () => DropSupplyProgress
|
|
24
24
|
});
|
|
25
|
-
module.exports = __toCommonJS(
|
|
25
|
+
module.exports = __toCommonJS(drop_status_exports);
|
|
26
26
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
27
|
-
var import_cn = require("
|
|
27
|
+
var import_cn = require("../../utils/cn.js");
|
|
28
28
|
function DropStatusBadge({ phase }) {
|
|
29
29
|
const map = {
|
|
30
30
|
live: { label: "Live", cls: "text-green-400 bg-green-500/10" },
|
|
@@ -69,4 +69,4 @@ function DropSupplyProgress({ minted, max }) {
|
|
|
69
69
|
DropStatusBadge,
|
|
70
70
|
DropSupplyProgress
|
|
71
71
|
});
|
|
72
|
-
//# sourceMappingURL=drop-status
|
|
72
|
+
//# sourceMappingURL=drop-status.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/drop/drop-status.tsx"],"sourcesContent":["\"use client\";\n\nimport { cn } from \"../../utils/cn.js\";\nimport type { DropPhase } from \"../../utils/drop/view.js\";\n\nexport function DropStatusBadge({ phase }: { phase: DropPhase }) {\n const map = {\n live: { label: \"Live\", cls: \"text-green-400 bg-green-500/10\" },\n upcoming: { label: \"Upcoming\", cls: \"text-brand-blue bg-brand-blue/10\" },\n ended: { label: \"Ended\", cls: \"text-muted-foreground bg-muted\" },\n \"sold-out\": { label: \"Sold out\", cls: \"text-brand-orange bg-brand-orange/10\" },\n } as const;\n const { label, cls } = map[phase];\n return (\n <span className={cn(\"inline-flex items-center gap-1 text-xs font-bold uppercase tracking-widest rounded-full px-3 py-1\", cls)}>\n {phase === \"live\" && <span className=\"h-1.5 w-1.5 rounded-full bg-green-400 animate-pulse\" />}\n {label}\n </span>\n );\n}\n\nexport function DropSupplyProgress({ minted, max }: { minted: number; max: number }) {\n const pct = max > 0 ? Math.min(100, (minted / max) * 100) : 0;\n return (\n <div className=\"space-y-1.5\">\n <div className=\"flex justify-between text-xs text-muted-foreground\">\n <span>{minted.toLocaleString()} minted</span>\n <span>of {max.toLocaleString()}</span>\n </div>\n <div className=\"h-2 rounded-full bg-muted overflow-hidden\">\n <div\n className=\"h-full rounded-full bg-brand-orange transition-all duration-500\"\n style={{ width: `${pct}%` }}\n />\n </div>\n <p className=\"text-xs text-muted-foreground\">{pct.toFixed(1)}% claimed</p>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAcI;AAZJ,gBAAmB;AAGZ,SAAS,gBAAgB,EAAE,MAAM,GAAyB;AAC/D,QAAM,MAAM;AAAA,IACV,MAAY,EAAE,OAAO,QAAY,KAAK,iCAAiC;AAAA,IACvE,UAAY,EAAE,OAAO,YAAY,KAAK,mCAAmC;AAAA,IACzE,OAAY,EAAE,OAAO,SAAY,KAAK,iCAAiC;AAAA,IACvE,YAAY,EAAE,OAAO,YAAY,KAAK,uCAAuC;AAAA,EAC/E;AACA,QAAM,EAAE,OAAO,IAAI,IAAI,IAAI,KAAK;AAChC,SACE,6CAAC,UAAK,eAAW,cAAG,qGAAqG,GAAG,GACzH;AAAA,cAAU,UAAU,4CAAC,UAAK,WAAU,uDAAsD;AAAA,IAC1F;AAAA,KACH;AAEJ;AAEO,SAAS,mBAAmB,EAAE,QAAQ,IAAI,GAAoC;AACnF,QAAM,MAAM,MAAM,IAAI,KAAK,IAAI,KAAM,SAAS,MAAO,GAAG,IAAI;AAC5D,SACE,6CAAC,SAAI,WAAU,eACb;AAAA,iDAAC,SAAI,WAAU,sDACb;AAAA,mDAAC,UAAM;AAAA,eAAO,eAAe;AAAA,QAAE;AAAA,SAAO;AAAA,MACtC,6CAAC,UAAK;AAAA;AAAA,QAAI,IAAI,eAAe;AAAA,SAAE;AAAA,OACjC;AAAA,IACA,4CAAC,SAAI,WAAU,6CACb;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO,EAAE,OAAO,GAAG,GAAG,IAAI;AAAA;AAAA,IAC5B,GACF;AAAA,IACA,6CAAC,OAAE,WAAU,iCAAiC;AAAA,UAAI,QAAQ,CAAC;AAAA,MAAE;AAAA,OAAS;AAAA,KACxE;AAEJ;","names":[]}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
-
import { DropPhase } from '
|
|
3
|
-
import '@medialane/sdk';
|
|
2
|
+
import { DropPhase } from '../../utils/drop/view.cjs';
|
|
4
3
|
import '@medialane/sdk/starknet';
|
|
5
4
|
|
|
6
5
|
declare function DropStatusBadge({ phase }: {
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
-
import { DropPhase } from '
|
|
3
|
-
import '@medialane/sdk';
|
|
2
|
+
import { DropPhase } from '../../utils/drop/view.js';
|
|
4
3
|
import '@medialane/sdk/starknet';
|
|
5
4
|
|
|
6
5
|
declare function DropStatusBadge({ phase }: {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { cn } from "
|
|
3
|
+
import { cn } from "../../utils/cn.js";
|
|
4
4
|
function DropStatusBadge({ phase }) {
|
|
5
5
|
const map = {
|
|
6
6
|
live: { label: "Live", cls: "text-green-400 bg-green-500/10" },
|
|
@@ -44,4 +44,4 @@ export {
|
|
|
44
44
|
DropStatusBadge,
|
|
45
45
|
DropSupplyProgress
|
|
46
46
|
};
|
|
47
|
-
//# sourceMappingURL=drop-status
|
|
47
|
+
//# sourceMappingURL=drop-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/drop/drop-status.tsx"],"sourcesContent":["\"use client\";\n\nimport { cn } from \"../../utils/cn.js\";\nimport type { DropPhase } from \"../../utils/drop/view.js\";\n\nexport function DropStatusBadge({ phase }: { phase: DropPhase }) {\n const map = {\n live: { label: \"Live\", cls: \"text-green-400 bg-green-500/10\" },\n upcoming: { label: \"Upcoming\", cls: \"text-brand-blue bg-brand-blue/10\" },\n ended: { label: \"Ended\", cls: \"text-muted-foreground bg-muted\" },\n \"sold-out\": { label: \"Sold out\", cls: \"text-brand-orange bg-brand-orange/10\" },\n } as const;\n const { label, cls } = map[phase];\n return (\n <span className={cn(\"inline-flex items-center gap-1 text-xs font-bold uppercase tracking-widest rounded-full px-3 py-1\", cls)}>\n {phase === \"live\" && <span className=\"h-1.5 w-1.5 rounded-full bg-green-400 animate-pulse\" />}\n {label}\n </span>\n );\n}\n\nexport function DropSupplyProgress({ minted, max }: { minted: number; max: number }) {\n const pct = max > 0 ? Math.min(100, (minted / max) * 100) : 0;\n return (\n <div className=\"space-y-1.5\">\n <div className=\"flex justify-between text-xs text-muted-foreground\">\n <span>{minted.toLocaleString()} minted</span>\n <span>of {max.toLocaleString()}</span>\n </div>\n <div className=\"h-2 rounded-full bg-muted overflow-hidden\">\n <div\n className=\"h-full rounded-full bg-brand-orange transition-all duration-500\"\n style={{ width: `${pct}%` }}\n />\n </div>\n <p className=\"text-xs text-muted-foreground\">{pct.toFixed(1)}% claimed</p>\n </div>\n );\n}\n"],"mappings":";AAcI,SACuB,KADvB;AAZJ,SAAS,UAAU;AAGZ,SAAS,gBAAgB,EAAE,MAAM,GAAyB;AAC/D,QAAM,MAAM;AAAA,IACV,MAAY,EAAE,OAAO,QAAY,KAAK,iCAAiC;AAAA,IACvE,UAAY,EAAE,OAAO,YAAY,KAAK,mCAAmC;AAAA,IACzE,OAAY,EAAE,OAAO,SAAY,KAAK,iCAAiC;AAAA,IACvE,YAAY,EAAE,OAAO,YAAY,KAAK,uCAAuC;AAAA,EAC/E;AACA,QAAM,EAAE,OAAO,IAAI,IAAI,IAAI,KAAK;AAChC,SACE,qBAAC,UAAK,WAAW,GAAG,qGAAqG,GAAG,GACzH;AAAA,cAAU,UAAU,oBAAC,UAAK,WAAU,uDAAsD;AAAA,IAC1F;AAAA,KACH;AAEJ;AAEO,SAAS,mBAAmB,EAAE,QAAQ,IAAI,GAAoC;AACnF,QAAM,MAAM,MAAM,IAAI,KAAK,IAAI,KAAM,SAAS,MAAO,GAAG,IAAI;AAC5D,SACE,qBAAC,SAAI,WAAU,eACb;AAAA,yBAAC,SAAI,WAAU,sDACb;AAAA,2BAAC,UAAM;AAAA,eAAO,eAAe;AAAA,QAAE;AAAA,SAAO;AAAA,MACtC,qBAAC,UAAK;AAAA;AAAA,QAAI,IAAI,eAAe;AAAA,SAAE;AAAA,OACjC;AAAA,IACA,oBAAC,SAAI,WAAU,6CACb;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO,EAAE,OAAO,GAAG,GAAG,IAAI;AAAA;AAAA,IAC5B,GACF;AAAA,IACA,qBAAC,OAAE,WAAU,iCAAiC;AAAA,UAAI,QAAQ,CAAC;AAAA,MAAE;AAAA,OAAS;AAAA,KACxE;AAEJ;","names":[]}
|
|
@@ -25,17 +25,17 @@ module.exports = __toCommonJS(drop_action_box_exports);
|
|
|
25
25
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
26
26
|
var import_lucide_react = require("lucide-react");
|
|
27
27
|
var import_drop_countdown = require("../../drop-countdown.js");
|
|
28
|
-
var
|
|
28
|
+
var import_drop_status = require("../drop-status.js");
|
|
29
29
|
var import_gradient_button = require("../../gradient-button.js");
|
|
30
30
|
function DropActionBox({ view, minted, maxSupply, quantity, onQuantity, onAction }) {
|
|
31
31
|
const canPick = view.button.action === "mint" && view.maxQuantity > 1n;
|
|
32
32
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-5 rounded-2xl border border-border bg-card p-5", children: [
|
|
33
33
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center justify-between gap-3", children: [
|
|
34
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
34
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_drop_status.DropStatusBadge, { phase: view.phase }),
|
|
35
35
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-xs text-muted-foreground", children: view.statusText })
|
|
36
36
|
] }),
|
|
37
37
|
view.countdown && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_drop_countdown.DropCountdown, { targetTs: view.countdown.target, label: view.countdown.label }),
|
|
38
|
-
maxSupply > 0n ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
38
|
+
maxSupply > 0n ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_drop_status.DropSupplyProgress, { minted: Number(minted), max: Number(maxSupply) }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", { className: "text-sm text-muted-foreground", children: [
|
|
39
39
|
Number(minted).toLocaleString("en-US"),
|
|
40
40
|
" minted"
|
|
41
41
|
] }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/drop/page/drop-action-box.tsx"],"sourcesContent":["\"use client\";\n\nimport { Minus, Plus } from \"lucide-react\";\nimport { DropCountdown } from \"../../drop-countdown.js\";\nimport { DropStatusBadge, DropSupplyProgress } from \"
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/drop/page/drop-action-box.tsx"],"sourcesContent":["\"use client\";\n\nimport { Minus, Plus } from \"lucide-react\";\nimport { DropCountdown } from \"../../drop-countdown.js\";\nimport { DropStatusBadge, DropSupplyProgress } from \"../drop-status.js\";\nimport { GradientButton } from \"../../gradient-button.js\";\nimport type { ActionBoxView } from \"../../../utils/drop/view.js\";\n\nexport interface DropActionBoxProps {\n view: ActionBoxView;\n minted: bigint;\n maxSupply: bigint;\n quantity: bigint;\n onQuantity: (q: bigint) => void;\n onAction: () => void;\n}\n\nexport function DropActionBox({ view, minted, maxSupply, quantity, onQuantity, onAction }: DropActionBoxProps) {\n const canPick = view.button.action === \"mint\" && view.maxQuantity > 1n;\n return (\n <div className=\"space-y-5 rounded-2xl border border-border bg-card p-5\">\n <div className=\"flex items-center justify-between gap-3\">\n <DropStatusBadge phase={view.phase} />\n <span className=\"text-xs text-muted-foreground\">{view.statusText}</span>\n </div>\n {view.countdown && <DropCountdown targetTs={view.countdown.target} label={view.countdown.label} />}\n {maxSupply > 0n\n ? <DropSupplyProgress minted={Number(minted)} max={Number(maxSupply)} />\n : <p className=\"text-sm text-muted-foreground\">{Number(minted).toLocaleString(\"en-US\")} minted</p>}\n <div className=\"flex items-end justify-between gap-3\">\n <div>\n <p className=\"text-xs text-muted-foreground\">Price</p>\n <p className=\"text-xl font-bold\">{view.priceText}</p>\n </div>\n {canPick && (\n <div className=\"flex items-center gap-2\" aria-label=\"Quantity\">\n <span className=\"sr-only\">Quantity</span>\n <button type=\"button\" className=\"rounded-md border border-border p-2\" disabled={quantity <= 1n} onClick={() => onQuantity(quantity - 1n)}><Minus className=\"h-3.5 w-3.5\" /></button>\n <span className=\"w-8 text-center font-semibold tabular-nums\">{quantity.toString()}</span>\n <button type=\"button\" className=\"rounded-md border border-border p-2\" disabled={quantity >= view.maxQuantity} onClick={() => onQuantity(quantity + 1n)}><Plus className=\"h-3.5 w-3.5\" /></button>\n </div>\n )}\n </div>\n {view.totalText && <p className=\"text-sm text-muted-foreground\">{view.totalText}</p>}\n {view.eligibility && <p className=\"text-sm\">{view.eligibility}</p>}\n <GradientButton big disabled={view.button.action === \"none\"} onClick={onAction} className=\"disabled:opacity-50\">\n {view.button.label}\n </GradientButton>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBM;AAnBN,0BAA4B;AAC5B,4BAA8B;AAC9B,yBAAoD;AACpD,6BAA+B;AAYxB,SAAS,cAAc,EAAE,MAAM,QAAQ,WAAW,UAAU,YAAY,SAAS,GAAuB;AAC7G,QAAM,UAAU,KAAK,OAAO,WAAW,UAAU,KAAK,cAAc;AACpE,SACE,6CAAC,SAAI,WAAU,0DACb;AAAA,iDAAC,SAAI,WAAU,2CACb;AAAA,kDAAC,sCAAgB,OAAO,KAAK,OAAO;AAAA,MACpC,4CAAC,UAAK,WAAU,iCAAiC,eAAK,YAAW;AAAA,OACnE;AAAA,IACC,KAAK,aAAa,4CAAC,uCAAc,UAAU,KAAK,UAAU,QAAQ,OAAO,KAAK,UAAU,OAAO;AAAA,IAC/F,YAAY,KACT,4CAAC,yCAAmB,QAAQ,OAAO,MAAM,GAAG,KAAK,OAAO,SAAS,GAAG,IACpE,6CAAC,OAAE,WAAU,iCAAiC;AAAA,aAAO,MAAM,EAAE,eAAe,OAAO;AAAA,MAAE;AAAA,OAAO;AAAA,IAChG,6CAAC,SAAI,WAAU,wCACb;AAAA,mDAAC,SACC;AAAA,oDAAC,OAAE,WAAU,iCAAgC,mBAAK;AAAA,QAClD,4CAAC,OAAE,WAAU,qBAAqB,eAAK,WAAU;AAAA,SACnD;AAAA,MACC,WACC,6CAAC,SAAI,WAAU,2BAA0B,cAAW,YAClD;AAAA,oDAAC,UAAK,WAAU,WAAU,sBAAQ;AAAA,QAClC,4CAAC,YAAO,MAAK,UAAS,WAAU,uCAAsC,UAAU,YAAY,IAAI,SAAS,MAAM,WAAW,WAAW,EAAE,GAAG,sDAAC,6BAAM,WAAU,eAAc,GAAE;AAAA,QAC3K,4CAAC,UAAK,WAAU,8CAA8C,mBAAS,SAAS,GAAE;AAAA,QAClF,4CAAC,YAAO,MAAK,UAAS,WAAU,uCAAsC,UAAU,YAAY,KAAK,aAAa,SAAS,MAAM,WAAW,WAAW,EAAE,GAAG,sDAAC,4BAAK,WAAU,eAAc,GAAE;AAAA,SAC1L;AAAA,OAEJ;AAAA,IACC,KAAK,aAAa,4CAAC,OAAE,WAAU,iCAAiC,eAAK,WAAU;AAAA,IAC/E,KAAK,eAAe,4CAAC,OAAE,WAAU,WAAW,eAAK,aAAY;AAAA,IAC9D,4CAAC,yCAAe,KAAG,MAAC,UAAU,KAAK,OAAO,WAAW,QAAQ,SAAS,UAAU,WAAU,uBACvF,eAAK,OAAO,OACf;AAAA,KACF;AAEJ;","names":[]}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { Minus, Plus } from "lucide-react";
|
|
4
4
|
import { DropCountdown } from "../../drop-countdown.js";
|
|
5
|
-
import { DropStatusBadge, DropSupplyProgress } from "
|
|
5
|
+
import { DropStatusBadge, DropSupplyProgress } from "../drop-status.js";
|
|
6
6
|
import { GradientButton } from "../../gradient-button.js";
|
|
7
7
|
function DropActionBox({ view, minted, maxSupply, quantity, onQuantity, onAction }) {
|
|
8
8
|
const canPick = view.button.action === "mint" && view.maxQuantity > 1n;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/drop/page/drop-action-box.tsx"],"sourcesContent":["\"use client\";\n\nimport { Minus, Plus } from \"lucide-react\";\nimport { DropCountdown } from \"../../drop-countdown.js\";\nimport { DropStatusBadge, DropSupplyProgress } from \"
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/drop/page/drop-action-box.tsx"],"sourcesContent":["\"use client\";\n\nimport { Minus, Plus } from \"lucide-react\";\nimport { DropCountdown } from \"../../drop-countdown.js\";\nimport { DropStatusBadge, DropSupplyProgress } from \"../drop-status.js\";\nimport { GradientButton } from \"../../gradient-button.js\";\nimport type { ActionBoxView } from \"../../../utils/drop/view.js\";\n\nexport interface DropActionBoxProps {\n view: ActionBoxView;\n minted: bigint;\n maxSupply: bigint;\n quantity: bigint;\n onQuantity: (q: bigint) => void;\n onAction: () => void;\n}\n\nexport function DropActionBox({ view, minted, maxSupply, quantity, onQuantity, onAction }: DropActionBoxProps) {\n const canPick = view.button.action === \"mint\" && view.maxQuantity > 1n;\n return (\n <div className=\"space-y-5 rounded-2xl border border-border bg-card p-5\">\n <div className=\"flex items-center justify-between gap-3\">\n <DropStatusBadge phase={view.phase} />\n <span className=\"text-xs text-muted-foreground\">{view.statusText}</span>\n </div>\n {view.countdown && <DropCountdown targetTs={view.countdown.target} label={view.countdown.label} />}\n {maxSupply > 0n\n ? <DropSupplyProgress minted={Number(minted)} max={Number(maxSupply)} />\n : <p className=\"text-sm text-muted-foreground\">{Number(minted).toLocaleString(\"en-US\")} minted</p>}\n <div className=\"flex items-end justify-between gap-3\">\n <div>\n <p className=\"text-xs text-muted-foreground\">Price</p>\n <p className=\"text-xl font-bold\">{view.priceText}</p>\n </div>\n {canPick && (\n <div className=\"flex items-center gap-2\" aria-label=\"Quantity\">\n <span className=\"sr-only\">Quantity</span>\n <button type=\"button\" className=\"rounded-md border border-border p-2\" disabled={quantity <= 1n} onClick={() => onQuantity(quantity - 1n)}><Minus className=\"h-3.5 w-3.5\" /></button>\n <span className=\"w-8 text-center font-semibold tabular-nums\">{quantity.toString()}</span>\n <button type=\"button\" className=\"rounded-md border border-border p-2\" disabled={quantity >= view.maxQuantity} onClick={() => onQuantity(quantity + 1n)}><Plus className=\"h-3.5 w-3.5\" /></button>\n </div>\n )}\n </div>\n {view.totalText && <p className=\"text-sm text-muted-foreground\">{view.totalText}</p>}\n {view.eligibility && <p className=\"text-sm\">{view.eligibility}</p>}\n <GradientButton big disabled={view.button.action === \"none\"} onClick={onAction} className=\"disabled:opacity-50\">\n {view.button.label}\n </GradientButton>\n </div>\n );\n}\n"],"mappings":";AAqBM,SACE,KADF;AAnBN,SAAS,OAAO,YAAY;AAC5B,SAAS,qBAAqB;AAC9B,SAAS,iBAAiB,0BAA0B;AACpD,SAAS,sBAAsB;AAYxB,SAAS,cAAc,EAAE,MAAM,QAAQ,WAAW,UAAU,YAAY,SAAS,GAAuB;AAC7G,QAAM,UAAU,KAAK,OAAO,WAAW,UAAU,KAAK,cAAc;AACpE,SACE,qBAAC,SAAI,WAAU,0DACb;AAAA,yBAAC,SAAI,WAAU,2CACb;AAAA,0BAAC,mBAAgB,OAAO,KAAK,OAAO;AAAA,MACpC,oBAAC,UAAK,WAAU,iCAAiC,eAAK,YAAW;AAAA,OACnE;AAAA,IACC,KAAK,aAAa,oBAAC,iBAAc,UAAU,KAAK,UAAU,QAAQ,OAAO,KAAK,UAAU,OAAO;AAAA,IAC/F,YAAY,KACT,oBAAC,sBAAmB,QAAQ,OAAO,MAAM,GAAG,KAAK,OAAO,SAAS,GAAG,IACpE,qBAAC,OAAE,WAAU,iCAAiC;AAAA,aAAO,MAAM,EAAE,eAAe,OAAO;AAAA,MAAE;AAAA,OAAO;AAAA,IAChG,qBAAC,SAAI,WAAU,wCACb;AAAA,2BAAC,SACC;AAAA,4BAAC,OAAE,WAAU,iCAAgC,mBAAK;AAAA,QAClD,oBAAC,OAAE,WAAU,qBAAqB,eAAK,WAAU;AAAA,SACnD;AAAA,MACC,WACC,qBAAC,SAAI,WAAU,2BAA0B,cAAW,YAClD;AAAA,4BAAC,UAAK,WAAU,WAAU,sBAAQ;AAAA,QAClC,oBAAC,YAAO,MAAK,UAAS,WAAU,uCAAsC,UAAU,YAAY,IAAI,SAAS,MAAM,WAAW,WAAW,EAAE,GAAG,8BAAC,SAAM,WAAU,eAAc,GAAE;AAAA,QAC3K,oBAAC,UAAK,WAAU,8CAA8C,mBAAS,SAAS,GAAE;AAAA,QAClF,oBAAC,YAAO,MAAK,UAAS,WAAU,uCAAsC,UAAU,YAAY,KAAK,aAAa,SAAS,MAAM,WAAW,WAAW,EAAE,GAAG,8BAAC,QAAK,WAAU,eAAc,GAAE;AAAA,SAC1L;AAAA,OAEJ;AAAA,IACC,KAAK,aAAa,oBAAC,OAAE,WAAU,iCAAiC,eAAK,WAAU;AAAA,IAC/E,KAAK,eAAe,oBAAC,OAAE,WAAU,WAAW,eAAK,aAAY;AAAA,IAC9D,oBAAC,kBAAe,KAAG,MAAC,UAAU,KAAK,OAAO,WAAW,QAAQ,SAAS,UAAU,WAAU,uBACvF,eAAK,OAAO,OACf;AAAA,KACF;AAEJ;","names":[]}
|
|
@@ -60,9 +60,11 @@ function DropPage(props) {
|
|
|
60
60
|
const { drop: indexed, isLoading } = (0, import_use_drops.useDrop)(getClient, contract);
|
|
61
61
|
const chain = (0, import_use_drops.useDropChain)(provider, contract, walletAddress);
|
|
62
62
|
const { mints, mutate: refreshMints } = (0, import_use_drops.useDropMints)(getClient, contract);
|
|
63
|
+
const feeBps = (0, import_use_drops.useDropFee)(getClient);
|
|
63
64
|
const collectionFile = (0, import_use_drops.useDropFile)(getClient, indexed?.baseUri ?? null, "collection.json");
|
|
65
|
+
const isCollection = collectionFile?.drop_kind === "collection";
|
|
64
66
|
const firstToken = (0, import_use_drops.useDropFile)(getClient, indexed?.baseUri ?? null, "1");
|
|
65
|
-
const { tokens } = (0, import_use_collections.useCollectionTokens)(getClient, contract, 1, 24);
|
|
67
|
+
const { tokens } = (0, import_use_collections.useCollectionTokens)(getClient, isCollection ? contract : null, 1, 24);
|
|
66
68
|
const now = (0, import_use_now.useNow)();
|
|
67
69
|
const [quantity, setQuantity] = (0, import_react.useState)(1n);
|
|
68
70
|
const [minting, setMinting] = (0, import_react.useState)(false);
|
|
@@ -83,10 +85,10 @@ function DropPage(props) {
|
|
|
83
85
|
] });
|
|
84
86
|
}
|
|
85
87
|
const onchain = chain.drop;
|
|
86
|
-
const
|
|
87
|
-
const
|
|
88
|
+
const priced = feeBps === null ? null : onchain;
|
|
89
|
+
const mint = (0, import_starknet.dropMintState)({ drop: priced, wallet: walletAddress, claimed: chain.claimed, proof, balance: chain.balance, feeBps: feeBps ?? 0, now });
|
|
90
|
+
const view = priced ? (0, import_view.actionBoxView)({ drop: priced, mint, quantity, feeBps, now }) : null;
|
|
88
91
|
const isOrganizer = !!walletAddress && !!onchain && BigInt(walletAddress) === BigInt(onchain.organizer);
|
|
89
|
-
const isCollection = collectionFile?.drop_kind === "collection";
|
|
90
92
|
const art = firstToken?.image ?? indexed?.image ?? null;
|
|
91
93
|
const name = indexed?.name ?? "Drop";
|
|
92
94
|
const deps = async () => ({ client: getClient(), provider, signer: await props.getSigner() });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/drop/page/drop-page.tsx"],"sourcesContent":["\"use client\";\n\nimport { useMemo, useState } from \"react\";\nimport { Package } from \"lucide-react\";\nimport type { ResolvedFeeConfig } from \"@medialane/sdk\";\nimport { dropMintState } from \"@medialane/sdk/starknet\";\nimport Image from \"../../image.js\";\nimport { CreatorChip } from \"../../creator-chip.js\";\nimport { ShareButton } from \"../../share-button.js\";\nimport { Skeleton } from \"../../skeleton.js\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"../../tabs.js\";\nimport { AssetLicenseSummary } from \"../../asset-license-summary.js\";\nimport { TokenCard } from \"../../token-card.js\";\nimport { DropActionBox } from \"./drop-action-box.js\";\nimport { DropActivityList } from \"./drop-activity.js\";\nimport { DropManage } from \"./drop-manage.js\";\nimport { DropMintDialog } from \"./drop-mint-dialog.js\";\nimport { GradientButton } from \"../../gradient-button.js\";\nimport { ipfsToHttp } from \"../../../utils/ipfs.js\";\nimport { useCollectionTokens } from \"../../../utils/use-collections.js\";\nimport { useDrop, useDropChain, useDropFile, useDropMints } from \"../../../utils/use-drops.js\";\nimport { useNow } from \"../../../utils/drop/use-now.js\";\nimport { actionBoxView } from \"../../../utils/drop/view.js\";\nimport { claimProofFor } from \"../../../utils/drop/claim-proof.js\";\nimport { manageDrop, mintDrop, saveExclusiveContent } from \"../../../utils/drop/actions.js\";\nimport type { DropAppProps } from \"../../../utils/drop/types.js\";\n\ntype TokenFile = { image?: string; attributes?: { trait_type?: string; value?: string }[] };\n\nexport function DropPage(props: DropAppProps & { contract: string; feeConfig: ResolvedFeeConfig; initialTab?: string; portfolioHref?: string }) {\n const { contract, getClient, provider, walletAddress } = props;\n const { drop: indexed, isLoading } = useDrop(getClient, contract);\n const chain = useDropChain(provider, contract, walletAddress);\n const { mints, mutate: refreshMints } = useDropMints(getClient, contract);\n const collectionFile = useDropFile<{ drop_kind?: string }>(getClient, indexed?.baseUri ?? null, \"collection.json\");\n const firstToken = useDropFile<TokenFile>(getClient, indexed?.baseUri ?? null, \"1\");\n const { tokens } = useCollectionTokens(getClient, contract, 1, 24);\n const now = useNow();\n const [quantity, setQuantity] = useState(1n);\n const [minting, setMinting] = useState(false);\n const proof = useMemo(\n () => (typeof window === \"undefined\" ? null : claimProofFor(window.localStorage, contract, window.location.hash, \"drop-proof\")),\n [contract],\n );\n\n if (isLoading && !chain.drop) {\n return <div className=\"grid gap-8 lg:grid-cols-2\"><Skeleton className=\"aspect-square rounded-2xl\" /><Skeleton className=\"h-96 rounded-2xl\" /></div>;\n }\n if (!indexed && !chain.drop) {\n return (\n <div className=\"space-y-3 py-24 text-center\">\n <Package className=\"mx-auto h-10 w-10 text-muted-foreground/30\" />\n <p className=\"text-sm text-muted-foreground\">This drop wasn't found. A new drop can take a minute to appear.</p>\n </div>\n );\n }\n\n const onchain = chain.drop;\n const mint = dropMintState({ drop: onchain, wallet: walletAddress, claimed: chain.claimed, proof, balance: chain.balance, feeConfig: props.feeConfig, now });\n const view = onchain ? actionBoxView({ drop: onchain, mint, quantity, feeConfig: props.feeConfig, now }) : null;\n const isOrganizer = !!walletAddress && !!onchain && BigInt(walletAddress) === BigInt(onchain.organizer);\n const isCollection = collectionFile?.drop_kind === \"collection\";\n const art = firstToken?.image ?? indexed?.image ?? null;\n const name = indexed?.name ?? \"Drop\";\n const deps = async () => ({ client: getClient(), provider, signer: await props.getSigner() });\n\n const onAction = () => {\n if (!view) return;\n if (view.button.action === \"sign-in\") props.onRequireWallet();\n if (view.button.action === \"mint\") setMinting(true);\n };\n\n return (\n <div className=\"space-y-10 pb-28 lg:pb-0\">\n <div className=\"grid gap-8 lg:grid-cols-2 lg:gap-10\">\n <div className=\"relative aspect-square overflow-hidden rounded-2xl bg-muted\">\n {art && <Image src={ipfsToHttp(art)} alt={name} fill unoptimized className=\"object-cover\" />}\n </div>\n <div className=\"space-y-5\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"space-y-1\">\n <h1 className=\"text-3xl font-semibold\">{name}</h1>\n {onchain && <CreatorChip getClient={getClient} address={onchain.organizer} />}\n </div>\n <ShareButton title={name} variant=\"outline\" size=\"sm\" />\n </div>\n {view && onchain && (\n <div className=\"hidden lg:block\">\n <DropActionBox view={view} minted={onchain.totalMinted} maxSupply={onchain.maxSupply} quantity={quantity} onQuantity={setQuantity} onAction={onAction} />\n </div>\n )}\n </div>\n </div>\n\n {view && onchain && (\n <div className=\"lg:hidden\">\n <DropActionBox view={view} minted={onchain.totalMinted} maxSupply={onchain.maxSupply} quantity={quantity} onQuantity={setQuantity} onAction={onAction} />\n <div className=\"fixed inset-x-0 bottom-0 z-30 border-t border-border bg-background/95 p-3 backdrop-blur\">\n <GradientButton disabled={view.button.action === \"none\"} onClick={onAction}>{view.button.label}</GradientButton>\n </div>\n </div>\n )}\n\n <Tabs defaultValue={props.initialTab === \"manage\" && isOrganizer ? \"manage\" : \"about\"}>\n <TabsList>\n <TabsTrigger value=\"about\">About</TabsTrigger>\n {isCollection && <TabsTrigger value=\"items\">Items</TabsTrigger>}\n <TabsTrigger value=\"activity\">Activity</TabsTrigger>\n <TabsTrigger value=\"license\">License</TabsTrigger>\n {isOrganizer && <TabsTrigger value=\"manage\">Manage</TabsTrigger>}\n </TabsList>\n <TabsContent value=\"about\" className=\"pt-6\">\n <p className=\"whitespace-pre-line text-sm leading-relaxed text-muted-foreground\">{indexed?.description || \"No description.\"}</p>\n </TabsContent>\n {isCollection && (\n <TabsContent value=\"items\" className=\"pt-6\">\n <div className=\"grid grid-cols-2 gap-4 sm:grid-cols-3 lg:grid-cols-4\">{tokens.map((t) => <TokenCard key={t.tokenId} token={t} />)}</div>\n </TabsContent>\n )}\n <TabsContent value=\"activity\" className=\"pt-6\"><DropActivityList mints={mints} /></TabsContent>\n <TabsContent value=\"license\" className=\"pt-6\"><AssetLicenseSummary attributes={firstToken?.attributes ?? []} /></TabsContent>\n {isOrganizer && onchain && (\n <TabsContent value=\"manage\" className=\"pt-6\">\n <DropManage\n contract={contract}\n indexed={indexed}\n onchain={onchain}\n mints={mints}\n run={async (params) => {\n await manageDrop(await deps(), { owner: walletAddress!, collection: contract, ...params });\n await Promise.all([chain.mutate(), refreshMints()]);\n }}\n saveExclusive={(value) => saveExclusiveContent(getClient(), contract, value)}\n />\n </TabsContent>\n )}\n </Tabs>\n\n {view && minting && (\n <DropMintDialog\n open\n onClose={() => setMinting(false)}\n name={name}\n quantity={quantity > view.maxQuantity ? view.maxQuantity : quantity}\n totalText={view.totalText}\n portfolioHref={props.portfolioHref ?? \"/portfolio\"}\n onMint={async () => {\n const res = await mintDrop(await deps(), { claimer: walletAddress!, collection: contract, quantity: quantity > view.maxQuantity ? view.maxQuantity : quantity, proof });\n await Promise.all([chain.mutate(), refreshMints()]);\n return res;\n }}\n />\n )}\n </div>\n );\n}\n"],"mappings":"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","names":["Image"]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/drop/page/drop-page.tsx"],"sourcesContent":["\"use client\";\n\nimport { useMemo, useState } from \"react\";\nimport { Package } from \"lucide-react\";\nimport { dropMintState } from \"@medialane/sdk/starknet\";\nimport Image from \"../../image.js\";\nimport { CreatorChip } from \"../../creator-chip.js\";\nimport { ShareButton } from \"../../share-button.js\";\nimport { Skeleton } from \"../../skeleton.js\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"../../tabs.js\";\nimport { AssetLicenseSummary } from \"../../asset-license-summary.js\";\nimport { TokenCard } from \"../../token-card.js\";\nimport { DropActionBox } from \"./drop-action-box.js\";\nimport { DropActivityList } from \"./drop-activity.js\";\nimport { DropManage } from \"./drop-manage.js\";\nimport { DropMintDialog } from \"./drop-mint-dialog.js\";\nimport { GradientButton } from \"../../gradient-button.js\";\nimport { ipfsToHttp } from \"../../../utils/ipfs.js\";\nimport { useCollectionTokens } from \"../../../utils/use-collections.js\";\nimport { useDrop, useDropChain, useDropFee, useDropFile, useDropMints } from \"../../../utils/use-drops.js\";\nimport { useNow } from \"../../../utils/drop/use-now.js\";\nimport { actionBoxView } from \"../../../utils/drop/view.js\";\nimport { claimProofFor } from \"../../../utils/drop/claim-proof.js\";\nimport { manageDrop, mintDrop, saveExclusiveContent } from \"../../../utils/drop/actions.js\";\nimport type { DropAppProps } from \"../../../utils/drop/types.js\";\n\ntype TokenFile = { image?: string; attributes?: { trait_type?: string; value?: string }[] };\n\nexport function DropPage(props: DropAppProps & { contract: string; initialTab?: string; portfolioHref?: string }) {\n const { contract, getClient, provider, walletAddress } = props;\n const { drop: indexed, isLoading } = useDrop(getClient, contract);\n const chain = useDropChain(provider, contract, walletAddress);\n const { mints, mutate: refreshMints } = useDropMints(getClient, contract);\n const feeBps = useDropFee(getClient);\n const collectionFile = useDropFile<{ drop_kind?: string }>(getClient, indexed?.baseUri ?? null, \"collection.json\");\n const isCollection = collectionFile?.drop_kind === \"collection\";\n const firstToken = useDropFile<TokenFile>(getClient, indexed?.baseUri ?? null, \"1\");\n const { tokens } = useCollectionTokens(getClient, isCollection ? contract : null, 1, 24);\n const now = useNow();\n const [quantity, setQuantity] = useState(1n);\n const [minting, setMinting] = useState(false);\n const proof = useMemo(\n () => (typeof window === \"undefined\" ? null : claimProofFor(window.localStorage, contract, window.location.hash, \"drop-proof\")),\n [contract],\n );\n\n if (isLoading && !chain.drop) {\n return <div className=\"grid gap-8 lg:grid-cols-2\"><Skeleton className=\"aspect-square rounded-2xl\" /><Skeleton className=\"h-96 rounded-2xl\" /></div>;\n }\n if (!indexed && !chain.drop) {\n return (\n <div className=\"space-y-3 py-24 text-center\">\n <Package className=\"mx-auto h-10 w-10 text-muted-foreground/30\" />\n <p className=\"text-sm text-muted-foreground\">This drop wasn't found. A new drop can take a minute to appear.</p>\n </div>\n );\n }\n\n const onchain = chain.drop;\n // Until the fee is known the mint box counts as loading: no total, no mint button on a guessed fee.\n const priced = feeBps === null ? null : onchain;\n const mint = dropMintState({ drop: priced, wallet: walletAddress, claimed: chain.claimed, proof, balance: chain.balance, feeBps: feeBps ?? 0, now });\n const view = priced ? actionBoxView({ drop: priced, mint, quantity, feeBps: feeBps!, now }) : null;\n const isOrganizer = !!walletAddress && !!onchain && BigInt(walletAddress) === BigInt(onchain.organizer);\n const art = firstToken?.image ?? indexed?.image ?? null;\n const name = indexed?.name ?? \"Drop\";\n const deps = async () => ({ client: getClient(), provider, signer: await props.getSigner() });\n\n const onAction = () => {\n if (!view) return;\n if (view.button.action === \"sign-in\") props.onRequireWallet();\n if (view.button.action === \"mint\") setMinting(true);\n };\n\n return (\n <div className=\"space-y-10 pb-28 lg:pb-0\">\n <div className=\"grid gap-8 lg:grid-cols-2 lg:gap-10\">\n <div className=\"relative aspect-square overflow-hidden rounded-2xl bg-muted\">\n {art && <Image src={ipfsToHttp(art)} alt={name} fill unoptimized className=\"object-cover\" />}\n </div>\n <div className=\"space-y-5\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"space-y-1\">\n <h1 className=\"text-3xl font-semibold\">{name}</h1>\n {onchain && <CreatorChip getClient={getClient} address={onchain.organizer} />}\n </div>\n <ShareButton title={name} variant=\"outline\" size=\"sm\" />\n </div>\n {view && onchain && (\n <div className=\"hidden lg:block\">\n <DropActionBox view={view} minted={onchain.totalMinted} maxSupply={onchain.maxSupply} quantity={quantity} onQuantity={setQuantity} onAction={onAction} />\n </div>\n )}\n </div>\n </div>\n\n {view && onchain && (\n <div className=\"lg:hidden\">\n <DropActionBox view={view} minted={onchain.totalMinted} maxSupply={onchain.maxSupply} quantity={quantity} onQuantity={setQuantity} onAction={onAction} />\n <div className=\"fixed inset-x-0 bottom-0 z-30 border-t border-border bg-background/95 p-3 backdrop-blur\">\n <GradientButton disabled={view.button.action === \"none\"} onClick={onAction}>{view.button.label}</GradientButton>\n </div>\n </div>\n )}\n\n <Tabs defaultValue={props.initialTab === \"manage\" && isOrganizer ? \"manage\" : \"about\"}>\n <TabsList>\n <TabsTrigger value=\"about\">About</TabsTrigger>\n {isCollection && <TabsTrigger value=\"items\">Items</TabsTrigger>}\n <TabsTrigger value=\"activity\">Activity</TabsTrigger>\n <TabsTrigger value=\"license\">License</TabsTrigger>\n {isOrganizer && <TabsTrigger value=\"manage\">Manage</TabsTrigger>}\n </TabsList>\n <TabsContent value=\"about\" className=\"pt-6\">\n <p className=\"whitespace-pre-line text-sm leading-relaxed text-muted-foreground\">{indexed?.description || \"No description.\"}</p>\n </TabsContent>\n {isCollection && (\n <TabsContent value=\"items\" className=\"pt-6\">\n <div className=\"grid grid-cols-2 gap-4 sm:grid-cols-3 lg:grid-cols-4\">{tokens.map((t) => <TokenCard key={t.tokenId} token={t} />)}</div>\n </TabsContent>\n )}\n <TabsContent value=\"activity\" className=\"pt-6\"><DropActivityList mints={mints} /></TabsContent>\n <TabsContent value=\"license\" className=\"pt-6\"><AssetLicenseSummary attributes={firstToken?.attributes ?? []} /></TabsContent>\n {isOrganizer && onchain && (\n <TabsContent value=\"manage\" className=\"pt-6\">\n <DropManage\n contract={contract}\n indexed={indexed}\n onchain={onchain}\n mints={mints}\n run={async (params) => {\n await manageDrop(await deps(), { owner: walletAddress!, collection: contract, ...params });\n await Promise.all([chain.mutate(), refreshMints()]);\n }}\n saveExclusive={(value) => saveExclusiveContent(getClient(), contract, value)}\n />\n </TabsContent>\n )}\n </Tabs>\n\n {view && minting && (\n <DropMintDialog\n open\n onClose={() => setMinting(false)}\n name={name}\n quantity={quantity > view.maxQuantity ? view.maxQuantity : quantity}\n totalText={view.totalText}\n portfolioHref={props.portfolioHref ?? \"/portfolio\"}\n onMint={async () => {\n const res = await mintDrop(await deps(), { claimer: walletAddress!, collection: contract, quantity: quantity > view.maxQuantity ? view.maxQuantity : quantity, proof });\n await Promise.all([chain.mutate(), refreshMints()]);\n return res;\n }}\n />\n )}\n </div>\n );\n}\n"],"mappings":"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","names":["Image"]}
|
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
-
import { ResolvedFeeConfig } from '@medialane/sdk';
|
|
3
2
|
import { DropAppProps } from '../../../utils/drop/types.cjs';
|
|
4
3
|
import 'starknet';
|
|
5
4
|
import '@medialane/sdk/starknet';
|
|
6
5
|
import '../../fast-mint/types.cjs';
|
|
7
6
|
import 'react';
|
|
7
|
+
import '@medialane/sdk';
|
|
8
8
|
|
|
9
9
|
declare function DropPage(props: DropAppProps & {
|
|
10
10
|
contract: string;
|
|
11
|
-
feeConfig: ResolvedFeeConfig;
|
|
12
11
|
initialTab?: string;
|
|
13
12
|
portfolioHref?: string;
|
|
14
13
|
}): react_jsx_runtime.JSX.Element;
|
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
-
import { ResolvedFeeConfig } from '@medialane/sdk';
|
|
3
2
|
import { DropAppProps } from '../../../utils/drop/types.js';
|
|
4
3
|
import 'starknet';
|
|
5
4
|
import '@medialane/sdk/starknet';
|
|
6
5
|
import '../../fast-mint/types.js';
|
|
7
6
|
import 'react';
|
|
7
|
+
import '@medialane/sdk';
|
|
8
8
|
|
|
9
9
|
declare function DropPage(props: DropAppProps & {
|
|
10
10
|
contract: string;
|
|
11
|
-
feeConfig: ResolvedFeeConfig;
|
|
12
11
|
initialTab?: string;
|
|
13
12
|
portfolioHref?: string;
|
|
14
13
|
}): react_jsx_runtime.JSX.Element;
|
|
@@ -17,7 +17,7 @@ import { DropMintDialog } from "./drop-mint-dialog.js";
|
|
|
17
17
|
import { GradientButton } from "../../gradient-button.js";
|
|
18
18
|
import { ipfsToHttp } from "../../../utils/ipfs.js";
|
|
19
19
|
import { useCollectionTokens } from "../../../utils/use-collections.js";
|
|
20
|
-
import { useDrop, useDropChain, useDropFile, useDropMints } from "../../../utils/use-drops.js";
|
|
20
|
+
import { useDrop, useDropChain, useDropFee, useDropFile, useDropMints } from "../../../utils/use-drops.js";
|
|
21
21
|
import { useNow } from "../../../utils/drop/use-now.js";
|
|
22
22
|
import { actionBoxView } from "../../../utils/drop/view.js";
|
|
23
23
|
import { claimProofFor } from "../../../utils/drop/claim-proof.js";
|
|
@@ -27,9 +27,11 @@ function DropPage(props) {
|
|
|
27
27
|
const { drop: indexed, isLoading } = useDrop(getClient, contract);
|
|
28
28
|
const chain = useDropChain(provider, contract, walletAddress);
|
|
29
29
|
const { mints, mutate: refreshMints } = useDropMints(getClient, contract);
|
|
30
|
+
const feeBps = useDropFee(getClient);
|
|
30
31
|
const collectionFile = useDropFile(getClient, indexed?.baseUri ?? null, "collection.json");
|
|
32
|
+
const isCollection = collectionFile?.drop_kind === "collection";
|
|
31
33
|
const firstToken = useDropFile(getClient, indexed?.baseUri ?? null, "1");
|
|
32
|
-
const { tokens } = useCollectionTokens(getClient, contract, 1, 24);
|
|
34
|
+
const { tokens } = useCollectionTokens(getClient, isCollection ? contract : null, 1, 24);
|
|
33
35
|
const now = useNow();
|
|
34
36
|
const [quantity, setQuantity] = useState(1n);
|
|
35
37
|
const [minting, setMinting] = useState(false);
|
|
@@ -50,10 +52,10 @@ function DropPage(props) {
|
|
|
50
52
|
] });
|
|
51
53
|
}
|
|
52
54
|
const onchain = chain.drop;
|
|
53
|
-
const
|
|
54
|
-
const
|
|
55
|
+
const priced = feeBps === null ? null : onchain;
|
|
56
|
+
const mint = dropMintState({ drop: priced, wallet: walletAddress, claimed: chain.claimed, proof, balance: chain.balance, feeBps: feeBps ?? 0, now });
|
|
57
|
+
const view = priced ? actionBoxView({ drop: priced, mint, quantity, feeBps, now }) : null;
|
|
55
58
|
const isOrganizer = !!walletAddress && !!onchain && BigInt(walletAddress) === BigInt(onchain.organizer);
|
|
56
|
-
const isCollection = collectionFile?.drop_kind === "collection";
|
|
57
59
|
const art = firstToken?.image ?? indexed?.image ?? null;
|
|
58
60
|
const name = indexed?.name ?? "Drop";
|
|
59
61
|
const deps = async () => ({ client: getClient(), provider, signer: await props.getSigner() });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/drop/page/drop-page.tsx"],"sourcesContent":["\"use client\";\n\nimport { useMemo, useState } from \"react\";\nimport { Package } from \"lucide-react\";\nimport type { ResolvedFeeConfig } from \"@medialane/sdk\";\nimport { dropMintState } from \"@medialane/sdk/starknet\";\nimport Image from \"../../image.js\";\nimport { CreatorChip } from \"../../creator-chip.js\";\nimport { ShareButton } from \"../../share-button.js\";\nimport { Skeleton } from \"../../skeleton.js\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"../../tabs.js\";\nimport { AssetLicenseSummary } from \"../../asset-license-summary.js\";\nimport { TokenCard } from \"../../token-card.js\";\nimport { DropActionBox } from \"./drop-action-box.js\";\nimport { DropActivityList } from \"./drop-activity.js\";\nimport { DropManage } from \"./drop-manage.js\";\nimport { DropMintDialog } from \"./drop-mint-dialog.js\";\nimport { GradientButton } from \"../../gradient-button.js\";\nimport { ipfsToHttp } from \"../../../utils/ipfs.js\";\nimport { useCollectionTokens } from \"../../../utils/use-collections.js\";\nimport { useDrop, useDropChain, useDropFile, useDropMints } from \"../../../utils/use-drops.js\";\nimport { useNow } from \"../../../utils/drop/use-now.js\";\nimport { actionBoxView } from \"../../../utils/drop/view.js\";\nimport { claimProofFor } from \"../../../utils/drop/claim-proof.js\";\nimport { manageDrop, mintDrop, saveExclusiveContent } from \"../../../utils/drop/actions.js\";\nimport type { DropAppProps } from \"../../../utils/drop/types.js\";\n\ntype TokenFile = { image?: string; attributes?: { trait_type?: string; value?: string }[] };\n\nexport function DropPage(props: DropAppProps & { contract: string; feeConfig: ResolvedFeeConfig; initialTab?: string; portfolioHref?: string }) {\n const { contract, getClient, provider, walletAddress } = props;\n const { drop: indexed, isLoading } = useDrop(getClient, contract);\n const chain = useDropChain(provider, contract, walletAddress);\n const { mints, mutate: refreshMints } = useDropMints(getClient, contract);\n const collectionFile = useDropFile<{ drop_kind?: string }>(getClient, indexed?.baseUri ?? null, \"collection.json\");\n const firstToken = useDropFile<TokenFile>(getClient, indexed?.baseUri ?? null, \"1\");\n const { tokens } = useCollectionTokens(getClient, contract, 1, 24);\n const now = useNow();\n const [quantity, setQuantity] = useState(1n);\n const [minting, setMinting] = useState(false);\n const proof = useMemo(\n () => (typeof window === \"undefined\" ? null : claimProofFor(window.localStorage, contract, window.location.hash, \"drop-proof\")),\n [contract],\n );\n\n if (isLoading && !chain.drop) {\n return <div className=\"grid gap-8 lg:grid-cols-2\"><Skeleton className=\"aspect-square rounded-2xl\" /><Skeleton className=\"h-96 rounded-2xl\" /></div>;\n }\n if (!indexed && !chain.drop) {\n return (\n <div className=\"space-y-3 py-24 text-center\">\n <Package className=\"mx-auto h-10 w-10 text-muted-foreground/30\" />\n <p className=\"text-sm text-muted-foreground\">This drop wasn't found. A new drop can take a minute to appear.</p>\n </div>\n );\n }\n\n const onchain = chain.drop;\n const mint = dropMintState({ drop: onchain, wallet: walletAddress, claimed: chain.claimed, proof, balance: chain.balance, feeConfig: props.feeConfig, now });\n const view = onchain ? actionBoxView({ drop: onchain, mint, quantity, feeConfig: props.feeConfig, now }) : null;\n const isOrganizer = !!walletAddress && !!onchain && BigInt(walletAddress) === BigInt(onchain.organizer);\n const isCollection = collectionFile?.drop_kind === \"collection\";\n const art = firstToken?.image ?? indexed?.image ?? null;\n const name = indexed?.name ?? \"Drop\";\n const deps = async () => ({ client: getClient(), provider, signer: await props.getSigner() });\n\n const onAction = () => {\n if (!view) return;\n if (view.button.action === \"sign-in\") props.onRequireWallet();\n if (view.button.action === \"mint\") setMinting(true);\n };\n\n return (\n <div className=\"space-y-10 pb-28 lg:pb-0\">\n <div className=\"grid gap-8 lg:grid-cols-2 lg:gap-10\">\n <div className=\"relative aspect-square overflow-hidden rounded-2xl bg-muted\">\n {art && <Image src={ipfsToHttp(art)} alt={name} fill unoptimized className=\"object-cover\" />}\n </div>\n <div className=\"space-y-5\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"space-y-1\">\n <h1 className=\"text-3xl font-semibold\">{name}</h1>\n {onchain && <CreatorChip getClient={getClient} address={onchain.organizer} />}\n </div>\n <ShareButton title={name} variant=\"outline\" size=\"sm\" />\n </div>\n {view && onchain && (\n <div className=\"hidden lg:block\">\n <DropActionBox view={view} minted={onchain.totalMinted} maxSupply={onchain.maxSupply} quantity={quantity} onQuantity={setQuantity} onAction={onAction} />\n </div>\n )}\n </div>\n </div>\n\n {view && onchain && (\n <div className=\"lg:hidden\">\n <DropActionBox view={view} minted={onchain.totalMinted} maxSupply={onchain.maxSupply} quantity={quantity} onQuantity={setQuantity} onAction={onAction} />\n <div className=\"fixed inset-x-0 bottom-0 z-30 border-t border-border bg-background/95 p-3 backdrop-blur\">\n <GradientButton disabled={view.button.action === \"none\"} onClick={onAction}>{view.button.label}</GradientButton>\n </div>\n </div>\n )}\n\n <Tabs defaultValue={props.initialTab === \"manage\" && isOrganizer ? \"manage\" : \"about\"}>\n <TabsList>\n <TabsTrigger value=\"about\">About</TabsTrigger>\n {isCollection && <TabsTrigger value=\"items\">Items</TabsTrigger>}\n <TabsTrigger value=\"activity\">Activity</TabsTrigger>\n <TabsTrigger value=\"license\">License</TabsTrigger>\n {isOrganizer && <TabsTrigger value=\"manage\">Manage</TabsTrigger>}\n </TabsList>\n <TabsContent value=\"about\" className=\"pt-6\">\n <p className=\"whitespace-pre-line text-sm leading-relaxed text-muted-foreground\">{indexed?.description || \"No description.\"}</p>\n </TabsContent>\n {isCollection && (\n <TabsContent value=\"items\" className=\"pt-6\">\n <div className=\"grid grid-cols-2 gap-4 sm:grid-cols-3 lg:grid-cols-4\">{tokens.map((t) => <TokenCard key={t.tokenId} token={t} />)}</div>\n </TabsContent>\n )}\n <TabsContent value=\"activity\" className=\"pt-6\"><DropActivityList mints={mints} /></TabsContent>\n <TabsContent value=\"license\" className=\"pt-6\"><AssetLicenseSummary attributes={firstToken?.attributes ?? []} /></TabsContent>\n {isOrganizer && onchain && (\n <TabsContent value=\"manage\" className=\"pt-6\">\n <DropManage\n contract={contract}\n indexed={indexed}\n onchain={onchain}\n mints={mints}\n run={async (params) => {\n await manageDrop(await deps(), { owner: walletAddress!, collection: contract, ...params });\n await Promise.all([chain.mutate(), refreshMints()]);\n }}\n saveExclusive={(value) => saveExclusiveContent(getClient(), contract, value)}\n />\n </TabsContent>\n )}\n </Tabs>\n\n {view && minting && (\n <DropMintDialog\n open\n onClose={() => setMinting(false)}\n name={name}\n quantity={quantity > view.maxQuantity ? view.maxQuantity : quantity}\n totalText={view.totalText}\n portfolioHref={props.portfolioHref ?? \"/portfolio\"}\n onMint={async () => {\n const res = await mintDrop(await deps(), { claimer: walletAddress!, collection: contract, quantity: quantity > view.maxQuantity ? view.maxQuantity : quantity, proof });\n await Promise.all([chain.mutate(), refreshMints()]);\n return res;\n }}\n />\n )}\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/drop/page/drop-page.tsx"],"sourcesContent":["\"use client\";\n\nimport { useMemo, useState } from \"react\";\nimport { Package } from \"lucide-react\";\nimport { dropMintState } from \"@medialane/sdk/starknet\";\nimport Image from \"../../image.js\";\nimport { CreatorChip } from \"../../creator-chip.js\";\nimport { ShareButton } from \"../../share-button.js\";\nimport { Skeleton } from \"../../skeleton.js\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"../../tabs.js\";\nimport { AssetLicenseSummary } from \"../../asset-license-summary.js\";\nimport { TokenCard } from \"../../token-card.js\";\nimport { DropActionBox } from \"./drop-action-box.js\";\nimport { DropActivityList } from \"./drop-activity.js\";\nimport { DropManage } from \"./drop-manage.js\";\nimport { DropMintDialog } from \"./drop-mint-dialog.js\";\nimport { GradientButton } from \"../../gradient-button.js\";\nimport { ipfsToHttp } from \"../../../utils/ipfs.js\";\nimport { useCollectionTokens } from \"../../../utils/use-collections.js\";\nimport { useDrop, useDropChain, useDropFee, useDropFile, useDropMints } from \"../../../utils/use-drops.js\";\nimport { useNow } from \"../../../utils/drop/use-now.js\";\nimport { actionBoxView } from \"../../../utils/drop/view.js\";\nimport { claimProofFor } from \"../../../utils/drop/claim-proof.js\";\nimport { manageDrop, mintDrop, saveExclusiveContent } from \"../../../utils/drop/actions.js\";\nimport type { DropAppProps } from \"../../../utils/drop/types.js\";\n\ntype TokenFile = { image?: string; attributes?: { trait_type?: string; value?: string }[] };\n\nexport function DropPage(props: DropAppProps & { contract: string; initialTab?: string; portfolioHref?: string }) {\n const { contract, getClient, provider, walletAddress } = props;\n const { drop: indexed, isLoading } = useDrop(getClient, contract);\n const chain = useDropChain(provider, contract, walletAddress);\n const { mints, mutate: refreshMints } = useDropMints(getClient, contract);\n const feeBps = useDropFee(getClient);\n const collectionFile = useDropFile<{ drop_kind?: string }>(getClient, indexed?.baseUri ?? null, \"collection.json\");\n const isCollection = collectionFile?.drop_kind === \"collection\";\n const firstToken = useDropFile<TokenFile>(getClient, indexed?.baseUri ?? null, \"1\");\n const { tokens } = useCollectionTokens(getClient, isCollection ? contract : null, 1, 24);\n const now = useNow();\n const [quantity, setQuantity] = useState(1n);\n const [minting, setMinting] = useState(false);\n const proof = useMemo(\n () => (typeof window === \"undefined\" ? null : claimProofFor(window.localStorage, contract, window.location.hash, \"drop-proof\")),\n [contract],\n );\n\n if (isLoading && !chain.drop) {\n return <div className=\"grid gap-8 lg:grid-cols-2\"><Skeleton className=\"aspect-square rounded-2xl\" /><Skeleton className=\"h-96 rounded-2xl\" /></div>;\n }\n if (!indexed && !chain.drop) {\n return (\n <div className=\"space-y-3 py-24 text-center\">\n <Package className=\"mx-auto h-10 w-10 text-muted-foreground/30\" />\n <p className=\"text-sm text-muted-foreground\">This drop wasn't found. A new drop can take a minute to appear.</p>\n </div>\n );\n }\n\n const onchain = chain.drop;\n // Until the fee is known the mint box counts as loading: no total, no mint button on a guessed fee.\n const priced = feeBps === null ? null : onchain;\n const mint = dropMintState({ drop: priced, wallet: walletAddress, claimed: chain.claimed, proof, balance: chain.balance, feeBps: feeBps ?? 0, now });\n const view = priced ? actionBoxView({ drop: priced, mint, quantity, feeBps: feeBps!, now }) : null;\n const isOrganizer = !!walletAddress && !!onchain && BigInt(walletAddress) === BigInt(onchain.organizer);\n const art = firstToken?.image ?? indexed?.image ?? null;\n const name = indexed?.name ?? \"Drop\";\n const deps = async () => ({ client: getClient(), provider, signer: await props.getSigner() });\n\n const onAction = () => {\n if (!view) return;\n if (view.button.action === \"sign-in\") props.onRequireWallet();\n if (view.button.action === \"mint\") setMinting(true);\n };\n\n return (\n <div className=\"space-y-10 pb-28 lg:pb-0\">\n <div className=\"grid gap-8 lg:grid-cols-2 lg:gap-10\">\n <div className=\"relative aspect-square overflow-hidden rounded-2xl bg-muted\">\n {art && <Image src={ipfsToHttp(art)} alt={name} fill unoptimized className=\"object-cover\" />}\n </div>\n <div className=\"space-y-5\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"space-y-1\">\n <h1 className=\"text-3xl font-semibold\">{name}</h1>\n {onchain && <CreatorChip getClient={getClient} address={onchain.organizer} />}\n </div>\n <ShareButton title={name} variant=\"outline\" size=\"sm\" />\n </div>\n {view && onchain && (\n <div className=\"hidden lg:block\">\n <DropActionBox view={view} minted={onchain.totalMinted} maxSupply={onchain.maxSupply} quantity={quantity} onQuantity={setQuantity} onAction={onAction} />\n </div>\n )}\n </div>\n </div>\n\n {view && onchain && (\n <div className=\"lg:hidden\">\n <DropActionBox view={view} minted={onchain.totalMinted} maxSupply={onchain.maxSupply} quantity={quantity} onQuantity={setQuantity} onAction={onAction} />\n <div className=\"fixed inset-x-0 bottom-0 z-30 border-t border-border bg-background/95 p-3 backdrop-blur\">\n <GradientButton disabled={view.button.action === \"none\"} onClick={onAction}>{view.button.label}</GradientButton>\n </div>\n </div>\n )}\n\n <Tabs defaultValue={props.initialTab === \"manage\" && isOrganizer ? \"manage\" : \"about\"}>\n <TabsList>\n <TabsTrigger value=\"about\">About</TabsTrigger>\n {isCollection && <TabsTrigger value=\"items\">Items</TabsTrigger>}\n <TabsTrigger value=\"activity\">Activity</TabsTrigger>\n <TabsTrigger value=\"license\">License</TabsTrigger>\n {isOrganizer && <TabsTrigger value=\"manage\">Manage</TabsTrigger>}\n </TabsList>\n <TabsContent value=\"about\" className=\"pt-6\">\n <p className=\"whitespace-pre-line text-sm leading-relaxed text-muted-foreground\">{indexed?.description || \"No description.\"}</p>\n </TabsContent>\n {isCollection && (\n <TabsContent value=\"items\" className=\"pt-6\">\n <div className=\"grid grid-cols-2 gap-4 sm:grid-cols-3 lg:grid-cols-4\">{tokens.map((t) => <TokenCard key={t.tokenId} token={t} />)}</div>\n </TabsContent>\n )}\n <TabsContent value=\"activity\" className=\"pt-6\"><DropActivityList mints={mints} /></TabsContent>\n <TabsContent value=\"license\" className=\"pt-6\"><AssetLicenseSummary attributes={firstToken?.attributes ?? []} /></TabsContent>\n {isOrganizer && onchain && (\n <TabsContent value=\"manage\" className=\"pt-6\">\n <DropManage\n contract={contract}\n indexed={indexed}\n onchain={onchain}\n mints={mints}\n run={async (params) => {\n await manageDrop(await deps(), { owner: walletAddress!, collection: contract, ...params });\n await Promise.all([chain.mutate(), refreshMints()]);\n }}\n saveExclusive={(value) => saveExclusiveContent(getClient(), contract, value)}\n />\n </TabsContent>\n )}\n </Tabs>\n\n {view && minting && (\n <DropMintDialog\n open\n onClose={() => setMinting(false)}\n name={name}\n quantity={quantity > view.maxQuantity ? view.maxQuantity : quantity}\n totalText={view.totalText}\n portfolioHref={props.portfolioHref ?? \"/portfolio\"}\n onMint={async () => {\n const res = await mintDrop(await deps(), { claimer: walletAddress!, collection: contract, quantity: quantity > view.maxQuantity ? view.maxQuantity : quantity, proof });\n await Promise.all([chain.mutate(), refreshMints()]);\n return res;\n }}\n />\n )}\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|