@medialane/ui 0.291.0 → 0.293.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/account/input-otp.d.cts +2 -2
- package/dist/components/account/input-otp.d.ts +2 -2
- package/dist/components/action-button.cjs +3 -30
- package/dist/components/action-button.cjs.map +1 -1
- package/dist/components/action-button.d.cts +1 -2
- package/dist/components/action-button.d.ts +1 -2
- package/dist/components/action-button.js +1 -28
- package/dist/components/action-button.js.map +1 -1
- package/dist/components/button.d.cts +2 -2
- package/dist/components/button.d.ts +2 -2
- package/dist/components/drop/create/launch-dialog.cjs +10 -7
- package/dist/components/drop/create/launch-dialog.cjs.map +1 -1
- package/dist/components/drop/create/launch-dialog.js +10 -7
- package/dist/components/drop/create/launch-dialog.js.map +1 -1
- package/dist/components/drop/page/drop-manage.cjs +6 -3
- package/dist/components/drop/page/drop-manage.cjs.map +1 -1
- package/dist/components/drop/page/drop-manage.js +6 -3
- package/dist/components/drop/page/drop-manage.js.map +1 -1
- package/dist/components/drop/page/drop-mint-dialog.cjs +9 -6
- package/dist/components/drop/page/drop-mint-dialog.cjs.map +1 -1
- package/dist/components/drop/page/drop-mint-dialog.js +9 -6
- package/dist/components/drop/page/drop-mint-dialog.js.map +1 -1
- package/dist/components/fast-mint/fast-mint.cjs +6 -13
- package/dist/components/fast-mint/fast-mint.cjs.map +1 -1
- package/dist/components/fast-mint/fast-mint.d.cts +2 -2
- package/dist/components/fast-mint/fast-mint.d.ts +2 -2
- package/dist/components/fast-mint/fast-mint.js +7 -15
- package/dist/components/fast-mint/fast-mint.js.map +1 -1
- package/dist/components/gated-content.cjs +2 -1
- package/dist/components/gated-content.cjs.map +1 -1
- package/dist/components/gated-content.js +2 -1
- package/dist/components/gated-content.js.map +1 -1
- package/dist/components/launchpad/edition-mint-schema.d.cts +2 -2
- package/dist/components/launchpad/edition-mint-schema.d.ts +2 -2
- package/dist/components/media-wallet/action-button.cjs +0 -18
- package/dist/components/media-wallet/action-button.cjs.map +1 -1
- package/dist/components/media-wallet/action-button.d.cts +1 -3
- package/dist/components/media-wallet/action-button.d.ts +1 -3
- package/dist/components/media-wallet/action-button.js +0 -16
- package/dist/components/media-wallet/action-button.js.map +1 -1
- package/dist/components/media-wallet/activate-card.cjs +2 -2
- package/dist/components/media-wallet/activate-card.cjs.map +1 -1
- package/dist/components/media-wallet/activate-card.js +1 -1
- package/dist/components/media-wallet/activate-card.js.map +1 -1
- package/dist/components/media-wallet/media-wallet-activity.cjs +4 -6
- package/dist/components/media-wallet/media-wallet-activity.cjs.map +1 -1
- package/dist/components/media-wallet/media-wallet-activity.js +4 -6
- package/dist/components/media-wallet/media-wallet-activity.js.map +1 -1
- package/dist/components/media-wallet/media-wallet-home.cjs +2 -1
- package/dist/components/media-wallet/media-wallet-home.cjs.map +1 -1
- package/dist/components/media-wallet/media-wallet-home.js +2 -1
- package/dist/components/media-wallet/media-wallet-home.js.map +1 -1
- package/dist/components/media-wallet/quick-action.cjs +3 -3
- package/dist/components/media-wallet/quick-action.cjs.map +1 -1
- package/dist/components/media-wallet/quick-action.d.cts +1 -1
- package/dist/components/media-wallet/quick-action.d.ts +1 -1
- package/dist/components/media-wallet/quick-action.js +1 -1
- package/dist/components/media-wallet/quick-action.js.map +1 -1
- package/dist/components/media-wallet/success-dialog.cjs +2 -2
- package/dist/components/media-wallet/success-dialog.cjs.map +1 -1
- package/dist/components/media-wallet/success-dialog.js +1 -1
- package/dist/components/media-wallet/success-dialog.js.map +1 -1
- package/dist/components/media-wallet/wallet-activity-icon.cjs +5 -4
- package/dist/components/media-wallet/wallet-activity-icon.cjs.map +1 -1
- package/dist/components/media-wallet/wallet-activity-icon.js +5 -4
- package/dist/components/media-wallet/wallet-activity-icon.js.map +1 -1
- package/dist/components/medialane-collection-card.cjs +6 -6
- package/dist/components/medialane-collection-card.cjs.map +1 -1
- package/dist/components/medialane-collection-card.js +6 -6
- package/dist/components/medialane-collection-card.js.map +1 -1
- package/dist/components/sheet.d.cts +1 -1
- package/dist/components/sheet.d.ts +1 -1
- package/dist/components/transaction-dialog.cjs +2 -10
- package/dist/components/transaction-dialog.cjs.map +1 -1
- package/dist/components/transaction-dialog.js +2 -10
- package/dist/components/transaction-dialog.js.map +1 -1
- package/dist/components/wallet/self-fund-consent-dialog.cjs +6 -4
- package/dist/components/wallet/self-fund-consent-dialog.cjs.map +1 -1
- package/dist/components/wallet/self-fund-consent-dialog.js +6 -4
- package/dist/components/wallet/self-fund-consent-dialog.js.map +1 -1
- package/dist/data/brand.cjs +54 -2
- package/dist/data/brand.cjs.map +1 -1
- package/dist/data/brand.d.cts +16 -1
- package/dist/data/brand.d.ts +16 -1
- package/dist/data/brand.js +47 -1
- package/dist/data/brand.js.map +1 -1
- package/dist/index.cjs +14 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -2
- package/dist/index.d.ts +3 -2
- package/dist/index.js +9 -3
- package/dist/index.js.map +1 -1
- package/dist/medialane.css +14 -23
- package/dist/utils/use-confetti.cjs +36 -0
- package/dist/utils/use-confetti.cjs.map +1 -0
- package/dist/utils/use-confetti.d.cts +3 -0
- package/dist/utils/use-confetti.d.ts +3 -0
- package/dist/utils/use-confetti.js +12 -0
- package/dist/utils/use-confetti.js.map +1 -0
- package/package.json +1 -1
- package/dist/components/action-dialog.cjs +0 -70
- package/dist/components/action-dialog.cjs.map +0 -1
- package/dist/components/action-dialog.d.cts +0 -12
- package/dist/components/action-dialog.d.ts +0 -12
- package/dist/components/action-dialog.js +0 -46
- package/dist/components/action-dialog.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/drop/page/drop-manage.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { buildPopAllowlist, dropClaimLinks, popClaimLinksCsv, type DropOnchain } from \"@medialane/sdk/starknet\";\nimport { dropHref, type ApiDrop, type ApiDropMint } from \"@medialane/sdk\";\nimport { ActionDialog } from \"../../action-dialog.js\";\nimport { Button } from \"../../button.js\";\nimport { Input } from \"../../input.js\";\nimport { Textarea } from \"../../textarea.js\";\nimport { ShareButton } from \"../../share-button.js\";\nimport { StatTile } from \"../../stat-tile.js\";\nimport { DropActivityList } from \"./drop-activity.js\";\nimport { ExclusiveFields, type ExclusiveValue } from \"../create/exclusive-fields.js\";\nimport { downloadCsv } from \"../create/launch-dialog.js\";\nimport { describeError } from \"../../../utils/describe-error.js\";\nimport { parseAllowlist } from \"../../../utils/drop/allowlist.js\";\nimport { priceLabel, supplyLabel } from \"../../../utils/drop/sale.js\";\n\nexport interface DropManageProps {\n contract: string;\n indexed: ApiDrop | null;\n onchain: DropOnchain;\n mints: ApiDropMint[];\n /** Runs a manage action as one transaction; resolves when confirmed. */\n run: (params: { action: \"issue\"; recipient: string; quantity: string } | { action: \"set_allowlist_root\"; root: string }) => Promise<void>;\n saveExclusive: (value: ExclusiveValue | null) => Promise<void>;\n}\n\ntype Pending = { title: string; body: string; act: () => Promise<void> } | null;\n\nexport function DropManage({ contract, indexed, onchain, mints, run, saveExclusive }: DropManageProps) {\n const [pending, setPending] = useState<Pending>(null);\n const [busy, setBusy] = useState(false);\n const [message, setMessage] = useState<string | null>(null);\n const [listText, setListText] = useState(\"\");\n const [links, setLinks] = useState<ReturnType<typeof dropClaimLinks>>([]);\n const [gift, setGift] = useState({ to: \"\", quantity: \"1\" });\n const [exclusive, setExclusive] = useState<ExclusiveValue>({ title: \"\", url: \"\", type: \"\" });\n const listed = BigInt(onchain.allowlistRoot) !== 0n;\n const left = onchain.maxSupply === 0n ? null : onchain.maxSupply - onchain.totalMinted;\n const shareUrl = typeof window === \"undefined\" ? dropHref(contract) : `${window.location.origin}${dropHref(contract)}`;\n\n const confirm = async () => {\n if (!pending) return;\n setBusy(true);\n try {\n await pending.act();\n setMessage(`${pending.title} — done.`);\n } catch (err) {\n setMessage(describeError(err).message);\n } finally {\n setBusy(false);\n setPending(null);\n }\n };\n\n const parsed = parseAllowlist(listText);\n const list = parsed.addresses.length > 0 ? buildPopAllowlist(parsed.addresses) : null;\n const sameList = list !== null && BigInt(list.root) === BigInt(onchain.allowlistRoot);\n\n return (\n <div className=\"space-y-8\">\n {message && <p className=\"rounded-lg bg-muted/50 px-3 py-2 text-sm\">{message}</p>}\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold\">Overview</h3>\n <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-3\">\n <StatTile label=\"Minted\" value={supplyLabel(onchain.totalMinted.toString(), onchain.maxSupply.toString())} />\n <StatTile label=\"Revenue\" value={priceLabel(indexed?.revenue ?? \"0\", onchain.paymentToken)} />\n <StatTile label=\"Collectors\" value={indexed?.collectors ?? 0} />\n </div>\n <DropActivityList mints={mints} />\n </section>\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold\">Who can mint</h3>\n <p className=\"text-sm text-muted-foreground\">{listed ? \"Only wallets on your list can mint.\" : \"Everyone can mint.\"}</p>\n <Textarea rows={5} placeholder=\"Paste wallet addresses, one per line\" value={listText} onChange={(e) => { setListText(e.target.value); setLinks([]); }} />\n {parsed.invalid.length > 0 && <p className=\"text-xs text-destructive\">{parsed.invalid.length} line(s) aren't wallet addresses: {parsed.invalid.slice(0, 3).join(\", \")}</p>}\n <div className=\"flex flex-wrap gap-2\">\n {list && sameList && (\n <Button variant=\"outline\" onClick={() => setLinks(dropClaimLinks(window.location.origin, contract, list))}>This is your current list — get its claim links</Button>\n )}\n {list && !sameList && parsed.invalid.length === 0 && (\n <Button onClick={() => setPending({\n title: \"List published\",\n body: `Only these ${parsed.addresses.length} wallets will be able to mint. Claim links for your previous list stop working for wallets not on this one.`,\n act: async () => { await run({ action: \"set_allowlist_root\", root: list.root }); setLinks(dropClaimLinks(window.location.origin, contract, list)); },\n })}>Publish this list</Button>\n )}\n {listed && (\n <Button variant=\"outline\" onClick={() => setPending({\n title: \"Drop opened to everyone\",\n body: \"Anyone will be able to mint, with or without a claim link.\",\n act: () => run({ action: \"set_allowlist_root\", root: \"0x0\" }),\n })}>Open to everyone</Button>\n )}\n {links.length > 0 && <Button variant=\"outline\" onClick={() => downloadCsv(popClaimLinksCsv(links), \"claim-links.csv\")}>Download claim links</Button>}\n </div>\n </section>\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold\">Gift</h3>\n <p className=\"text-sm text-muted-foreground\">\n Mint free tokens to a wallet{left !== null ? ` · ${left.toString()} left` : \"\"}. Gifts don't count toward that wallet's limit.\n </p>\n <div className=\"flex gap-2\">\n <Input placeholder=\"Wallet address\" value={gift.to} onChange={(e) => setGift({ ...gift, to: e.target.value.trim() })} />\n <Input className=\"w-20\" inputMode=\"numeric\" value={gift.quantity} onChange={(e) => setGift({ ...gift, quantity: e.target.value.trim() })} />\n </div>\n <Button\n disabled={parseAllowlist(gift.to).addresses.length !== 1 || !/^[1-9]\\d*$/.test(gift.quantity)}\n onClick={() => setPending({\n title: \"Gift sent\",\n body: `Mint ${gift.quantity} free token(s) to ${gift.to}.`,\n act: () => run({ action: \"issue\", recipient: gift.to, quantity: gift.quantity }),\n })}\n >Send gift</Button>\n </section>\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold\">Share</h3>\n <div className=\"flex gap-2\">\n <Input readOnly value={shareUrl} />\n <ShareButton title={indexed?.name ?? \"Drop\"} url={shareUrl} variant=\"outline\" />\n </div>\n </section>\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold\">Exclusive content</h3>\n <ExclusiveFields value={exclusive} onChange={setExclusive} />\n <div className=\"flex gap-2\">\n <Button disabled={!/^https:\\/\\//.test(exclusive.url)} onClick={() => setPending({ title: \"Exclusive content saved\", body: \"Holders will see this link.\", act: () => saveExclusive(exclusive) })}>Save</Button>\n <Button variant=\"outline\" onClick={() => setPending({ title: \"Exclusive content removed\", body: \"Holders will no longer see a link.\", act: () => saveExclusive(null) })}>Remove</Button>\n </div>\n </section>\n\n <ActionDialog open={pending !== null} onClose={() => !busy && setPending(null)} width={460}>\n <div className=\"space-y-4 p-6\">\n <p className=\"text-sm\">{pending?.body}</p>\n <div className=\"flex justify-end gap-2\">\n <Button variant=\"outline\" disabled={busy} onClick={() => setPending(null)}>Cancel</Button>\n <Button disabled={busy} onClick={() => void confirm()}>{busy ? \"Working…\" : \"Confirm\"}</Button>\n </div>\n </div>\n </ActionDialog>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/drop/page/drop-manage.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { buildPopAllowlist, dropClaimLinks, popClaimLinksCsv, type DropOnchain } from \"@medialane/sdk/starknet\";\nimport { dropHref, type ApiDrop, type ApiDropMint } from \"@medialane/sdk\";\nimport { Dialog, DialogContent, DialogDescription, DialogTitle } from \"../../dialog.js\";\nimport { Button } from \"../../button.js\";\nimport { Input } from \"../../input.js\";\nimport { Textarea } from \"../../textarea.js\";\nimport { ShareButton } from \"../../share-button.js\";\nimport { StatTile } from \"../../stat-tile.js\";\nimport { DropActivityList } from \"./drop-activity.js\";\nimport { ExclusiveFields, type ExclusiveValue } from \"../create/exclusive-fields.js\";\nimport { downloadCsv } from \"../create/launch-dialog.js\";\nimport { describeError } from \"../../../utils/describe-error.js\";\nimport { parseAllowlist } from \"../../../utils/drop/allowlist.js\";\nimport { priceLabel, supplyLabel } from \"../../../utils/drop/sale.js\";\n\nexport interface DropManageProps {\n contract: string;\n indexed: ApiDrop | null;\n onchain: DropOnchain;\n mints: ApiDropMint[];\n /** Runs a manage action as one transaction; resolves when confirmed. */\n run: (params: { action: \"issue\"; recipient: string; quantity: string } | { action: \"set_allowlist_root\"; root: string }) => Promise<void>;\n saveExclusive: (value: ExclusiveValue | null) => Promise<void>;\n}\n\ntype Pending = { title: string; body: string; act: () => Promise<void> } | null;\n\nexport function DropManage({ contract, indexed, onchain, mints, run, saveExclusive }: DropManageProps) {\n const [pending, setPending] = useState<Pending>(null);\n const [busy, setBusy] = useState(false);\n const [message, setMessage] = useState<string | null>(null);\n const [listText, setListText] = useState(\"\");\n const [links, setLinks] = useState<ReturnType<typeof dropClaimLinks>>([]);\n const [gift, setGift] = useState({ to: \"\", quantity: \"1\" });\n const [exclusive, setExclusive] = useState<ExclusiveValue>({ title: \"\", url: \"\", type: \"\" });\n const listed = BigInt(onchain.allowlistRoot) !== 0n;\n const left = onchain.maxSupply === 0n ? null : onchain.maxSupply - onchain.totalMinted;\n const shareUrl = typeof window === \"undefined\" ? dropHref(contract) : `${window.location.origin}${dropHref(contract)}`;\n\n const confirm = async () => {\n if (!pending) return;\n setBusy(true);\n try {\n await pending.act();\n setMessage(`${pending.title} — done.`);\n } catch (err) {\n setMessage(describeError(err).message);\n } finally {\n setBusy(false);\n setPending(null);\n }\n };\n\n const parsed = parseAllowlist(listText);\n const list = parsed.addresses.length > 0 ? buildPopAllowlist(parsed.addresses) : null;\n const sameList = list !== null && BigInt(list.root) === BigInt(onchain.allowlistRoot);\n\n return (\n <div className=\"space-y-8\">\n {message && <p className=\"rounded-lg bg-muted/50 px-3 py-2 text-sm\">{message}</p>}\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold\">Overview</h3>\n <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-3\">\n <StatTile label=\"Minted\" value={supplyLabel(onchain.totalMinted.toString(), onchain.maxSupply.toString())} />\n <StatTile label=\"Revenue\" value={priceLabel(indexed?.revenue ?? \"0\", onchain.paymentToken)} />\n <StatTile label=\"Collectors\" value={indexed?.collectors ?? 0} />\n </div>\n <DropActivityList mints={mints} />\n </section>\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold\">Who can mint</h3>\n <p className=\"text-sm text-muted-foreground\">{listed ? \"Only wallets on your list can mint.\" : \"Everyone can mint.\"}</p>\n <Textarea rows={5} placeholder=\"Paste wallet addresses, one per line\" value={listText} onChange={(e) => { setListText(e.target.value); setLinks([]); }} />\n {parsed.invalid.length > 0 && <p className=\"text-xs text-destructive\">{parsed.invalid.length} line(s) aren't wallet addresses: {parsed.invalid.slice(0, 3).join(\", \")}</p>}\n <div className=\"flex flex-wrap gap-2\">\n {list && sameList && (\n <Button variant=\"outline\" onClick={() => setLinks(dropClaimLinks(window.location.origin, contract, list))}>This is your current list — get its claim links</Button>\n )}\n {list && !sameList && parsed.invalid.length === 0 && (\n <Button onClick={() => setPending({\n title: \"List published\",\n body: `Only these ${parsed.addresses.length} wallets will be able to mint. Claim links for your previous list stop working for wallets not on this one.`,\n act: async () => { await run({ action: \"set_allowlist_root\", root: list.root }); setLinks(dropClaimLinks(window.location.origin, contract, list)); },\n })}>Publish this list</Button>\n )}\n {listed && (\n <Button variant=\"outline\" onClick={() => setPending({\n title: \"Drop opened to everyone\",\n body: \"Anyone will be able to mint, with or without a claim link.\",\n act: () => run({ action: \"set_allowlist_root\", root: \"0x0\" }),\n })}>Open to everyone</Button>\n )}\n {links.length > 0 && <Button variant=\"outline\" onClick={() => downloadCsv(popClaimLinksCsv(links), \"claim-links.csv\")}>Download claim links</Button>}\n </div>\n </section>\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold\">Gift</h3>\n <p className=\"text-sm text-muted-foreground\">\n Mint free tokens to a wallet{left !== null ? ` · ${left.toString()} left` : \"\"}. Gifts don't count toward that wallet's limit.\n </p>\n <div className=\"flex gap-2\">\n <Input placeholder=\"Wallet address\" value={gift.to} onChange={(e) => setGift({ ...gift, to: e.target.value.trim() })} />\n <Input className=\"w-20\" inputMode=\"numeric\" value={gift.quantity} onChange={(e) => setGift({ ...gift, quantity: e.target.value.trim() })} />\n </div>\n <Button\n disabled={parseAllowlist(gift.to).addresses.length !== 1 || !/^[1-9]\\d*$/.test(gift.quantity)}\n onClick={() => setPending({\n title: \"Gift sent\",\n body: `Mint ${gift.quantity} free token(s) to ${gift.to}.`,\n act: () => run({ action: \"issue\", recipient: gift.to, quantity: gift.quantity }),\n })}\n >Send gift</Button>\n </section>\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold\">Share</h3>\n <div className=\"flex gap-2\">\n <Input readOnly value={shareUrl} />\n <ShareButton title={indexed?.name ?? \"Drop\"} url={shareUrl} variant=\"outline\" />\n </div>\n </section>\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold\">Exclusive content</h3>\n <ExclusiveFields value={exclusive} onChange={setExclusive} />\n <div className=\"flex gap-2\">\n <Button disabled={!/^https:\\/\\//.test(exclusive.url)} onClick={() => setPending({ title: \"Exclusive content saved\", body: \"Holders will see this link.\", act: () => saveExclusive(exclusive) })}>Save</Button>\n <Button variant=\"outline\" onClick={() => setPending({ title: \"Exclusive content removed\", body: \"Holders will no longer see a link.\", act: () => saveExclusive(null) })}>Remove</Button>\n </div>\n </section>\n\n <Dialog open={pending !== null} onOpenChange={(next) => { if (!next && !busy) setPending(null); }}>\n <DialogContent className=\"sm:max-w-md\" hideClose={busy}>\n <DialogTitle className=\"sr-only\">Confirm</DialogTitle>\n <DialogDescription className=\"text-sm text-foreground\">{pending?.body}</DialogDescription>\n <div className=\"flex justify-end gap-2\">\n <Button variant=\"outline\" disabled={busy} onClick={() => setPending(null)}>Cancel</Button>\n <Button disabled={busy} onClick={() => void confirm()}>{busy ? \"Working…\" : \"Confirm\"}</Button>\n </div>\n </DialogContent>\n </Dialog>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -3,7 +3,7 @@ import { jsx, jsxs } from "react/jsx-runtime";
|
|
|
3
3
|
import { useState } from "react";
|
|
4
4
|
import { buildPopAllowlist, dropClaimLinks, popClaimLinksCsv } from "@medialane/sdk/starknet";
|
|
5
5
|
import { dropHref } from "@medialane/sdk";
|
|
6
|
-
import {
|
|
6
|
+
import { Dialog, DialogContent, DialogDescription, DialogTitle } from "../../dialog.js";
|
|
7
7
|
import { Button } from "../../button.js";
|
|
8
8
|
import { Input } from "../../input.js";
|
|
9
9
|
import { Textarea } from "../../textarea.js";
|
|
@@ -122,8 +122,11 @@ function DropManage({ contract, indexed, onchain, mints, run, saveExclusive }) {
|
|
|
122
122
|
/* @__PURE__ */ jsx(Button, { variant: "outline", onClick: () => setPending({ title: "Exclusive content removed", body: "Holders will no longer see a link.", act: () => saveExclusive(null) }), children: "Remove" })
|
|
123
123
|
] })
|
|
124
124
|
] }),
|
|
125
|
-
/* @__PURE__ */ jsx(
|
|
126
|
-
|
|
125
|
+
/* @__PURE__ */ jsx(Dialog, { open: pending !== null, onOpenChange: (next) => {
|
|
126
|
+
if (!next && !busy) setPending(null);
|
|
127
|
+
}, children: /* @__PURE__ */ jsxs(DialogContent, { className: "sm:max-w-md", hideClose: busy, children: [
|
|
128
|
+
/* @__PURE__ */ jsx(DialogTitle, { className: "sr-only", children: "Confirm" }),
|
|
129
|
+
/* @__PURE__ */ jsx(DialogDescription, { className: "text-sm text-foreground", children: pending?.body }),
|
|
127
130
|
/* @__PURE__ */ jsxs("div", { className: "flex justify-end gap-2", children: [
|
|
128
131
|
/* @__PURE__ */ jsx(Button, { variant: "outline", disabled: busy, onClick: () => setPending(null), children: "Cancel" }),
|
|
129
132
|
/* @__PURE__ */ jsx(Button, { disabled: busy, onClick: () => void confirm(), children: busy ? "Working\u2026" : "Confirm" })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/drop/page/drop-manage.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { buildPopAllowlist, dropClaimLinks, popClaimLinksCsv, type DropOnchain } from \"@medialane/sdk/starknet\";\nimport { dropHref, type ApiDrop, type ApiDropMint } from \"@medialane/sdk\";\nimport { ActionDialog } from \"../../action-dialog.js\";\nimport { Button } from \"../../button.js\";\nimport { Input } from \"../../input.js\";\nimport { Textarea } from \"../../textarea.js\";\nimport { ShareButton } from \"../../share-button.js\";\nimport { StatTile } from \"../../stat-tile.js\";\nimport { DropActivityList } from \"./drop-activity.js\";\nimport { ExclusiveFields, type ExclusiveValue } from \"../create/exclusive-fields.js\";\nimport { downloadCsv } from \"../create/launch-dialog.js\";\nimport { describeError } from \"../../../utils/describe-error.js\";\nimport { parseAllowlist } from \"../../../utils/drop/allowlist.js\";\nimport { priceLabel, supplyLabel } from \"../../../utils/drop/sale.js\";\n\nexport interface DropManageProps {\n contract: string;\n indexed: ApiDrop | null;\n onchain: DropOnchain;\n mints: ApiDropMint[];\n /** Runs a manage action as one transaction; resolves when confirmed. */\n run: (params: { action: \"issue\"; recipient: string; quantity: string } | { action: \"set_allowlist_root\"; root: string }) => Promise<void>;\n saveExclusive: (value: ExclusiveValue | null) => Promise<void>;\n}\n\ntype Pending = { title: string; body: string; act: () => Promise<void> } | null;\n\nexport function DropManage({ contract, indexed, onchain, mints, run, saveExclusive }: DropManageProps) {\n const [pending, setPending] = useState<Pending>(null);\n const [busy, setBusy] = useState(false);\n const [message, setMessage] = useState<string | null>(null);\n const [listText, setListText] = useState(\"\");\n const [links, setLinks] = useState<ReturnType<typeof dropClaimLinks>>([]);\n const [gift, setGift] = useState({ to: \"\", quantity: \"1\" });\n const [exclusive, setExclusive] = useState<ExclusiveValue>({ title: \"\", url: \"\", type: \"\" });\n const listed = BigInt(onchain.allowlistRoot) !== 0n;\n const left = onchain.maxSupply === 0n ? null : onchain.maxSupply - onchain.totalMinted;\n const shareUrl = typeof window === \"undefined\" ? dropHref(contract) : `${window.location.origin}${dropHref(contract)}`;\n\n const confirm = async () => {\n if (!pending) return;\n setBusy(true);\n try {\n await pending.act();\n setMessage(`${pending.title} — done.`);\n } catch (err) {\n setMessage(describeError(err).message);\n } finally {\n setBusy(false);\n setPending(null);\n }\n };\n\n const parsed = parseAllowlist(listText);\n const list = parsed.addresses.length > 0 ? buildPopAllowlist(parsed.addresses) : null;\n const sameList = list !== null && BigInt(list.root) === BigInt(onchain.allowlistRoot);\n\n return (\n <div className=\"space-y-8\">\n {message && <p className=\"rounded-lg bg-muted/50 px-3 py-2 text-sm\">{message}</p>}\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold\">Overview</h3>\n <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-3\">\n <StatTile label=\"Minted\" value={supplyLabel(onchain.totalMinted.toString(), onchain.maxSupply.toString())} />\n <StatTile label=\"Revenue\" value={priceLabel(indexed?.revenue ?? \"0\", onchain.paymentToken)} />\n <StatTile label=\"Collectors\" value={indexed?.collectors ?? 0} />\n </div>\n <DropActivityList mints={mints} />\n </section>\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold\">Who can mint</h3>\n <p className=\"text-sm text-muted-foreground\">{listed ? \"Only wallets on your list can mint.\" : \"Everyone can mint.\"}</p>\n <Textarea rows={5} placeholder=\"Paste wallet addresses, one per line\" value={listText} onChange={(e) => { setListText(e.target.value); setLinks([]); }} />\n {parsed.invalid.length > 0 && <p className=\"text-xs text-destructive\">{parsed.invalid.length} line(s) aren't wallet addresses: {parsed.invalid.slice(0, 3).join(\", \")}</p>}\n <div className=\"flex flex-wrap gap-2\">\n {list && sameList && (\n <Button variant=\"outline\" onClick={() => setLinks(dropClaimLinks(window.location.origin, contract, list))}>This is your current list — get its claim links</Button>\n )}\n {list && !sameList && parsed.invalid.length === 0 && (\n <Button onClick={() => setPending({\n title: \"List published\",\n body: `Only these ${parsed.addresses.length} wallets will be able to mint. Claim links for your previous list stop working for wallets not on this one.`,\n act: async () => { await run({ action: \"set_allowlist_root\", root: list.root }); setLinks(dropClaimLinks(window.location.origin, contract, list)); },\n })}>Publish this list</Button>\n )}\n {listed && (\n <Button variant=\"outline\" onClick={() => setPending({\n title: \"Drop opened to everyone\",\n body: \"Anyone will be able to mint, with or without a claim link.\",\n act: () => run({ action: \"set_allowlist_root\", root: \"0x0\" }),\n })}>Open to everyone</Button>\n )}\n {links.length > 0 && <Button variant=\"outline\" onClick={() => downloadCsv(popClaimLinksCsv(links), \"claim-links.csv\")}>Download claim links</Button>}\n </div>\n </section>\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold\">Gift</h3>\n <p className=\"text-sm text-muted-foreground\">\n Mint free tokens to a wallet{left !== null ? ` · ${left.toString()} left` : \"\"}. Gifts don't count toward that wallet's limit.\n </p>\n <div className=\"flex gap-2\">\n <Input placeholder=\"Wallet address\" value={gift.to} onChange={(e) => setGift({ ...gift, to: e.target.value.trim() })} />\n <Input className=\"w-20\" inputMode=\"numeric\" value={gift.quantity} onChange={(e) => setGift({ ...gift, quantity: e.target.value.trim() })} />\n </div>\n <Button\n disabled={parseAllowlist(gift.to).addresses.length !== 1 || !/^[1-9]\\d*$/.test(gift.quantity)}\n onClick={() => setPending({\n title: \"Gift sent\",\n body: `Mint ${gift.quantity} free token(s) to ${gift.to}.`,\n act: () => run({ action: \"issue\", recipient: gift.to, quantity: gift.quantity }),\n })}\n >Send gift</Button>\n </section>\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold\">Share</h3>\n <div className=\"flex gap-2\">\n <Input readOnly value={shareUrl} />\n <ShareButton title={indexed?.name ?? \"Drop\"} url={shareUrl} variant=\"outline\" />\n </div>\n </section>\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold\">Exclusive content</h3>\n <ExclusiveFields value={exclusive} onChange={setExclusive} />\n <div className=\"flex gap-2\">\n <Button disabled={!/^https:\\/\\//.test(exclusive.url)} onClick={() => setPending({ title: \"Exclusive content saved\", body: \"Holders will see this link.\", act: () => saveExclusive(exclusive) })}>Save</Button>\n <Button variant=\"outline\" onClick={() => setPending({ title: \"Exclusive content removed\", body: \"Holders will no longer see a link.\", act: () => saveExclusive(null) })}>Remove</Button>\n </div>\n </section>\n\n <ActionDialog open={pending !== null} onClose={() => !busy && setPending(null)} width={460}>\n <div className=\"space-y-4 p-6\">\n <p className=\"text-sm\">{pending?.body}</p>\n <div className=\"flex justify-end gap-2\">\n <Button variant=\"outline\" disabled={busy} onClick={() => setPending(null)}>Cancel</Button>\n <Button disabled={busy} onClick={() => void confirm()}>{busy ? \"Working…\" : \"Confirm\"}</Button>\n </div>\n </div>\n </ActionDialog>\n </div>\n );\n}\n"],"mappings":";AA8DkB,cAIV,YAJU;AA5DlB,SAAS,gBAAgB;AACzB,SAAS,mBAAmB,gBAAgB,wBAA0C;AACtF,SAAS,gBAAgD;AACzD,SAAS,oBAAoB;AAC7B,SAAS,cAAc;AACvB,SAAS,aAAa;AACtB,SAAS,gBAAgB;AACzB,SAAS,mBAAmB;AAC5B,SAAS,gBAAgB;AACzB,SAAS,wBAAwB;AACjC,SAAS,uBAA4C;AACrD,SAAS,mBAAmB;AAC5B,SAAS,qBAAqB;AAC9B,SAAS,sBAAsB;AAC/B,SAAS,YAAY,mBAAmB;AAcjC,SAAS,WAAW,EAAE,UAAU,SAAS,SAAS,OAAO,KAAK,cAAc,GAAoB;AACrG,QAAM,CAAC,SAAS,UAAU,IAAI,SAAkB,IAAI;AACpD,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AACtC,QAAM,CAAC,SAAS,UAAU,IAAI,SAAwB,IAAI;AAC1D,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,EAAE;AAC3C,QAAM,CAAC,OAAO,QAAQ,IAAI,SAA4C,CAAC,CAAC;AACxE,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,EAAE,IAAI,IAAI,UAAU,IAAI,CAAC;AAC1D,QAAM,CAAC,WAAW,YAAY,IAAI,SAAyB,EAAE,OAAO,IAAI,KAAK,IAAI,MAAM,GAAG,CAAC;AAC3F,QAAM,SAAS,OAAO,QAAQ,aAAa,MAAM;AACjD,QAAM,OAAO,QAAQ,cAAc,KAAK,OAAO,QAAQ,YAAY,QAAQ;AAC3E,QAAM,WAAW,OAAO,WAAW,cAAc,SAAS,QAAQ,IAAI,GAAG,OAAO,SAAS,MAAM,GAAG,SAAS,QAAQ,CAAC;AAEpH,QAAM,UAAU,YAAY;AAC1B,QAAI,CAAC,QAAS;AACd,YAAQ,IAAI;AACZ,QAAI;AACF,YAAM,QAAQ,IAAI;AAClB,iBAAW,GAAG,QAAQ,KAAK,eAAU;AAAA,IACvC,SAAS,KAAK;AACZ,iBAAW,cAAc,GAAG,EAAE,OAAO;AAAA,IACvC,UAAE;AACA,cAAQ,KAAK;AACb,iBAAW,IAAI;AAAA,IACjB;AAAA,EACF;AAEA,QAAM,SAAS,eAAe,QAAQ;AACtC,QAAM,OAAO,OAAO,UAAU,SAAS,IAAI,kBAAkB,OAAO,SAAS,IAAI;AACjF,QAAM,WAAW,SAAS,QAAQ,OAAO,KAAK,IAAI,MAAM,OAAO,QAAQ,aAAa;AAEpF,SACE,qBAAC,SAAI,WAAU,aACZ;AAAA,eAAW,oBAAC,OAAE,WAAU,4CAA4C,mBAAQ;AAAA,IAE7E,qBAAC,aAAQ,WAAU,aACjB;AAAA,0BAAC,QAAG,WAAU,yBAAwB,sBAAQ;AAAA,MAC9C,qBAAC,SAAI,WAAU,yCACb;AAAA,4BAAC,YAAS,OAAM,UAAS,OAAO,YAAY,QAAQ,YAAY,SAAS,GAAG,QAAQ,UAAU,SAAS,CAAC,GAAG;AAAA,QAC3G,oBAAC,YAAS,OAAM,WAAU,OAAO,WAAW,SAAS,WAAW,KAAK,QAAQ,YAAY,GAAG;AAAA,QAC5F,oBAAC,YAAS,OAAM,cAAa,OAAO,SAAS,cAAc,GAAG;AAAA,SAChE;AAAA,MACA,oBAAC,oBAAiB,OAAc;AAAA,OAClC;AAAA,IAEA,qBAAC,aAAQ,WAAU,aACjB;AAAA,0BAAC,QAAG,WAAU,yBAAwB,0BAAY;AAAA,MAClD,oBAAC,OAAE,WAAU,iCAAiC,mBAAS,wCAAwC,sBAAqB;AAAA,MACpH,oBAAC,YAAS,MAAM,GAAG,aAAY,wCAAuC,OAAO,UAAU,UAAU,CAAC,MAAM;AAAE,oBAAY,EAAE,OAAO,KAAK;AAAG,iBAAS,CAAC,CAAC;AAAA,MAAG,GAAG;AAAA,MACvJ,OAAO,QAAQ,SAAS,KAAK,qBAAC,OAAE,WAAU,4BAA4B;AAAA,eAAO,QAAQ;AAAA,QAAO;AAAA,QAAmC,OAAO,QAAQ,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI;AAAA,SAAE;AAAA,MACtK,qBAAC,SAAI,WAAU,wBACZ;AAAA,gBAAQ,YACP,oBAAC,UAAO,SAAQ,WAAU,SAAS,MAAM,SAAS,eAAe,OAAO,SAAS,QAAQ,UAAU,IAAI,CAAC,GAAG,kEAA+C;AAAA,QAE3J,QAAQ,CAAC,YAAY,OAAO,QAAQ,WAAW,KAC9C,oBAAC,UAAO,SAAS,MAAM,WAAW;AAAA,UAChC,OAAO;AAAA,UACP,MAAM,cAAc,OAAO,UAAU,MAAM;AAAA,UAC3C,KAAK,YAAY;AAAE,kBAAM,IAAI,EAAE,QAAQ,sBAAsB,MAAM,KAAK,KAAK,CAAC;AAAG,qBAAS,eAAe,OAAO,SAAS,QAAQ,UAAU,IAAI,CAAC;AAAA,UAAG;AAAA,QACrJ,CAAC,GAAG,+BAAiB;AAAA,QAEtB,UACC,oBAAC,UAAO,SAAQ,WAAU,SAAS,MAAM,WAAW;AAAA,UAClD,OAAO;AAAA,UACP,MAAM;AAAA,UACN,KAAK,MAAM,IAAI,EAAE,QAAQ,sBAAsB,MAAM,MAAM,CAAC;AAAA,QAC9D,CAAC,GAAG,8BAAgB;AAAA,QAErB,MAAM,SAAS,KAAK,oBAAC,UAAO,SAAQ,WAAU,SAAS,MAAM,YAAY,iBAAiB,KAAK,GAAG,iBAAiB,GAAG,kCAAoB;AAAA,SAC7I;AAAA,OACF;AAAA,IAEA,qBAAC,aAAQ,WAAU,aACjB;AAAA,0BAAC,QAAG,WAAU,yBAAwB,kBAAI;AAAA,MAC1C,qBAAC,OAAE,WAAU,iCAAgC;AAAA;AAAA,QACd,SAAS,OAAO,SAAM,KAAK,SAAS,CAAC,UAAU;AAAA,QAAG;AAAA,SACjF;AAAA,MACA,qBAAC,SAAI,WAAU,cACb;AAAA,4BAAC,SAAM,aAAY,kBAAiB,OAAO,KAAK,IAAI,UAAU,CAAC,MAAM,QAAQ,EAAE,GAAG,MAAM,IAAI,EAAE,OAAO,MAAM,KAAK,EAAE,CAAC,GAAG;AAAA,QACtH,oBAAC,SAAM,WAAU,QAAO,WAAU,WAAU,OAAO,KAAK,UAAU,UAAU,CAAC,MAAM,QAAQ,EAAE,GAAG,MAAM,UAAU,EAAE,OAAO,MAAM,KAAK,EAAE,CAAC,GAAG;AAAA,SAC5I;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,UAAU,eAAe,KAAK,EAAE,EAAE,UAAU,WAAW,KAAK,CAAC,aAAa,KAAK,KAAK,QAAQ;AAAA,UAC5F,SAAS,MAAM,WAAW;AAAA,YACxB,OAAO;AAAA,YACP,MAAM,QAAQ,KAAK,QAAQ,qBAAqB,KAAK,EAAE;AAAA,YACvD,KAAK,MAAM,IAAI,EAAE,QAAQ,SAAS,WAAW,KAAK,IAAI,UAAU,KAAK,SAAS,CAAC;AAAA,UACjF,CAAC;AAAA,UACF;AAAA;AAAA,MAAS;AAAA,OACZ;AAAA,IAEA,qBAAC,aAAQ,WAAU,aACjB;AAAA,0BAAC,QAAG,WAAU,yBAAwB,mBAAK;AAAA,MAC3C,qBAAC,SAAI,WAAU,cACb;AAAA,4BAAC,SAAM,UAAQ,MAAC,OAAO,UAAU;AAAA,QACjC,oBAAC,eAAY,OAAO,SAAS,QAAQ,QAAQ,KAAK,UAAU,SAAQ,WAAU;AAAA,SAChF;AAAA,OACF;AAAA,IAEA,qBAAC,aAAQ,WAAU,aACjB;AAAA,0BAAC,QAAG,WAAU,yBAAwB,+BAAiB;AAAA,MACvD,oBAAC,mBAAgB,OAAO,WAAW,UAAU,cAAc;AAAA,MAC3D,qBAAC,SAAI,WAAU,cACb;AAAA,4BAAC,UAAO,UAAU,CAAC,cAAc,KAAK,UAAU,GAAG,GAAG,SAAS,MAAM,WAAW,EAAE,OAAO,2BAA2B,MAAM,+BAA+B,KAAK,MAAM,cAAc,SAAS,EAAE,CAAC,GAAG,kBAAI;AAAA,QACrM,oBAAC,UAAO,SAAQ,WAAU,SAAS,MAAM,WAAW,EAAE,OAAO,6BAA6B,MAAM,sCAAsC,KAAK,MAAM,cAAc,IAAI,EAAE,CAAC,GAAG,oBAAM;AAAA,SACjL;AAAA,OACF;AAAA,IAEA,oBAAC,gBAAa,MAAM,YAAY,MAAM,SAAS,MAAM,CAAC,QAAQ,WAAW,IAAI,GAAG,OAAO,KACrF,+BAAC,SAAI,WAAU,iBACb;AAAA,0BAAC,OAAE,WAAU,WAAW,mBAAS,MAAK;AAAA,MACtC,qBAAC,SAAI,WAAU,0BACb;AAAA,4BAAC,UAAO,SAAQ,WAAU,UAAU,MAAM,SAAS,MAAM,WAAW,IAAI,GAAG,oBAAM;AAAA,QACjF,oBAAC,UAAO,UAAU,MAAM,SAAS,MAAM,KAAK,QAAQ,GAAI,iBAAO,kBAAa,WAAU;AAAA,SACxF;AAAA,OACF,GACF;AAAA,KACF;AAEJ;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/drop/page/drop-manage.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { buildPopAllowlist, dropClaimLinks, popClaimLinksCsv, type DropOnchain } from \"@medialane/sdk/starknet\";\nimport { dropHref, type ApiDrop, type ApiDropMint } from \"@medialane/sdk\";\nimport { Dialog, DialogContent, DialogDescription, DialogTitle } from \"../../dialog.js\";\nimport { Button } from \"../../button.js\";\nimport { Input } from \"../../input.js\";\nimport { Textarea } from \"../../textarea.js\";\nimport { ShareButton } from \"../../share-button.js\";\nimport { StatTile } from \"../../stat-tile.js\";\nimport { DropActivityList } from \"./drop-activity.js\";\nimport { ExclusiveFields, type ExclusiveValue } from \"../create/exclusive-fields.js\";\nimport { downloadCsv } from \"../create/launch-dialog.js\";\nimport { describeError } from \"../../../utils/describe-error.js\";\nimport { parseAllowlist } from \"../../../utils/drop/allowlist.js\";\nimport { priceLabel, supplyLabel } from \"../../../utils/drop/sale.js\";\n\nexport interface DropManageProps {\n contract: string;\n indexed: ApiDrop | null;\n onchain: DropOnchain;\n mints: ApiDropMint[];\n /** Runs a manage action as one transaction; resolves when confirmed. */\n run: (params: { action: \"issue\"; recipient: string; quantity: string } | { action: \"set_allowlist_root\"; root: string }) => Promise<void>;\n saveExclusive: (value: ExclusiveValue | null) => Promise<void>;\n}\n\ntype Pending = { title: string; body: string; act: () => Promise<void> } | null;\n\nexport function DropManage({ contract, indexed, onchain, mints, run, saveExclusive }: DropManageProps) {\n const [pending, setPending] = useState<Pending>(null);\n const [busy, setBusy] = useState(false);\n const [message, setMessage] = useState<string | null>(null);\n const [listText, setListText] = useState(\"\");\n const [links, setLinks] = useState<ReturnType<typeof dropClaimLinks>>([]);\n const [gift, setGift] = useState({ to: \"\", quantity: \"1\" });\n const [exclusive, setExclusive] = useState<ExclusiveValue>({ title: \"\", url: \"\", type: \"\" });\n const listed = BigInt(onchain.allowlistRoot) !== 0n;\n const left = onchain.maxSupply === 0n ? null : onchain.maxSupply - onchain.totalMinted;\n const shareUrl = typeof window === \"undefined\" ? dropHref(contract) : `${window.location.origin}${dropHref(contract)}`;\n\n const confirm = async () => {\n if (!pending) return;\n setBusy(true);\n try {\n await pending.act();\n setMessage(`${pending.title} — done.`);\n } catch (err) {\n setMessage(describeError(err).message);\n } finally {\n setBusy(false);\n setPending(null);\n }\n };\n\n const parsed = parseAllowlist(listText);\n const list = parsed.addresses.length > 0 ? buildPopAllowlist(parsed.addresses) : null;\n const sameList = list !== null && BigInt(list.root) === BigInt(onchain.allowlistRoot);\n\n return (\n <div className=\"space-y-8\">\n {message && <p className=\"rounded-lg bg-muted/50 px-3 py-2 text-sm\">{message}</p>}\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold\">Overview</h3>\n <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-3\">\n <StatTile label=\"Minted\" value={supplyLabel(onchain.totalMinted.toString(), onchain.maxSupply.toString())} />\n <StatTile label=\"Revenue\" value={priceLabel(indexed?.revenue ?? \"0\", onchain.paymentToken)} />\n <StatTile label=\"Collectors\" value={indexed?.collectors ?? 0} />\n </div>\n <DropActivityList mints={mints} />\n </section>\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold\">Who can mint</h3>\n <p className=\"text-sm text-muted-foreground\">{listed ? \"Only wallets on your list can mint.\" : \"Everyone can mint.\"}</p>\n <Textarea rows={5} placeholder=\"Paste wallet addresses, one per line\" value={listText} onChange={(e) => { setListText(e.target.value); setLinks([]); }} />\n {parsed.invalid.length > 0 && <p className=\"text-xs text-destructive\">{parsed.invalid.length} line(s) aren't wallet addresses: {parsed.invalid.slice(0, 3).join(\", \")}</p>}\n <div className=\"flex flex-wrap gap-2\">\n {list && sameList && (\n <Button variant=\"outline\" onClick={() => setLinks(dropClaimLinks(window.location.origin, contract, list))}>This is your current list — get its claim links</Button>\n )}\n {list && !sameList && parsed.invalid.length === 0 && (\n <Button onClick={() => setPending({\n title: \"List published\",\n body: `Only these ${parsed.addresses.length} wallets will be able to mint. Claim links for your previous list stop working for wallets not on this one.`,\n act: async () => { await run({ action: \"set_allowlist_root\", root: list.root }); setLinks(dropClaimLinks(window.location.origin, contract, list)); },\n })}>Publish this list</Button>\n )}\n {listed && (\n <Button variant=\"outline\" onClick={() => setPending({\n title: \"Drop opened to everyone\",\n body: \"Anyone will be able to mint, with or without a claim link.\",\n act: () => run({ action: \"set_allowlist_root\", root: \"0x0\" }),\n })}>Open to everyone</Button>\n )}\n {links.length > 0 && <Button variant=\"outline\" onClick={() => downloadCsv(popClaimLinksCsv(links), \"claim-links.csv\")}>Download claim links</Button>}\n </div>\n </section>\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold\">Gift</h3>\n <p className=\"text-sm text-muted-foreground\">\n Mint free tokens to a wallet{left !== null ? ` · ${left.toString()} left` : \"\"}. Gifts don't count toward that wallet's limit.\n </p>\n <div className=\"flex gap-2\">\n <Input placeholder=\"Wallet address\" value={gift.to} onChange={(e) => setGift({ ...gift, to: e.target.value.trim() })} />\n <Input className=\"w-20\" inputMode=\"numeric\" value={gift.quantity} onChange={(e) => setGift({ ...gift, quantity: e.target.value.trim() })} />\n </div>\n <Button\n disabled={parseAllowlist(gift.to).addresses.length !== 1 || !/^[1-9]\\d*$/.test(gift.quantity)}\n onClick={() => setPending({\n title: \"Gift sent\",\n body: `Mint ${gift.quantity} free token(s) to ${gift.to}.`,\n act: () => run({ action: \"issue\", recipient: gift.to, quantity: gift.quantity }),\n })}\n >Send gift</Button>\n </section>\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold\">Share</h3>\n <div className=\"flex gap-2\">\n <Input readOnly value={shareUrl} />\n <ShareButton title={indexed?.name ?? \"Drop\"} url={shareUrl} variant=\"outline\" />\n </div>\n </section>\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold\">Exclusive content</h3>\n <ExclusiveFields value={exclusive} onChange={setExclusive} />\n <div className=\"flex gap-2\">\n <Button disabled={!/^https:\\/\\//.test(exclusive.url)} onClick={() => setPending({ title: \"Exclusive content saved\", body: \"Holders will see this link.\", act: () => saveExclusive(exclusive) })}>Save</Button>\n <Button variant=\"outline\" onClick={() => setPending({ title: \"Exclusive content removed\", body: \"Holders will no longer see a link.\", act: () => saveExclusive(null) })}>Remove</Button>\n </div>\n </section>\n\n <Dialog open={pending !== null} onOpenChange={(next) => { if (!next && !busy) setPending(null); }}>\n <DialogContent className=\"sm:max-w-md\" hideClose={busy}>\n <DialogTitle className=\"sr-only\">Confirm</DialogTitle>\n <DialogDescription className=\"text-sm text-foreground\">{pending?.body}</DialogDescription>\n <div className=\"flex justify-end gap-2\">\n <Button variant=\"outline\" disabled={busy} onClick={() => setPending(null)}>Cancel</Button>\n <Button disabled={busy} onClick={() => void confirm()}>{busy ? \"Working…\" : \"Confirm\"}</Button>\n </div>\n </DialogContent>\n </Dialog>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -25,7 +25,7 @@ module.exports = __toCommonJS(drop_mint_dialog_exports);
|
|
|
25
25
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
26
26
|
var import_react = require("react");
|
|
27
27
|
var import_lucide_react = require("lucide-react");
|
|
28
|
-
var
|
|
28
|
+
var import_dialog = require("../../dialog.js");
|
|
29
29
|
var import_gradient_button = require("../../gradient-button.js");
|
|
30
30
|
var import_button = require("../../button.js");
|
|
31
31
|
var import_describe_error = require("../../../utils/describe-error.js");
|
|
@@ -52,9 +52,12 @@ function DropMintDialog({
|
|
|
52
52
|
setStep({ kind: "confirm" });
|
|
53
53
|
onClose();
|
|
54
54
|
};
|
|
55
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
55
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dialog.Dialog, { open, onOpenChange: (next) => {
|
|
56
|
+
if (!next) close();
|
|
57
|
+
}, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_dialog.DialogContent, { className: "gap-5 sm:max-w-md", hideClose: step.kind === "minting", children: [
|
|
58
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dialog.DialogDescription, { className: "sr-only", children: "Mint from this drop." }),
|
|
56
59
|
step.kind === "confirm" && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
|
57
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
60
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_dialog.DialogTitle, { className: "text-lg font-semibold", children: [
|
|
58
61
|
"Mint ",
|
|
59
62
|
quantity.toString(),
|
|
60
63
|
" from ",
|
|
@@ -63,19 +66,19 @@ function DropMintDialog({
|
|
|
63
66
|
totalText && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm text-muted-foreground", children: totalText }),
|
|
64
67
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_gradient_button.GradientButton, { big: true, onClick: () => void mint(), children: "Confirm mint" })
|
|
65
68
|
] }),
|
|
66
|
-
step.kind === "minting" && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
69
|
+
step.kind === "minting" && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_dialog.DialogTitle, { className: "flex items-center gap-2 text-lg font-semibold", children: [
|
|
67
70
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Loader2, { className: "h-4 w-4 animate-spin" }),
|
|
68
71
|
"Minting\u2026"
|
|
69
72
|
] }),
|
|
70
73
|
step.kind === "done" && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
|
71
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
74
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_dialog.DialogTitle, { className: "flex items-center gap-2 text-lg font-semibold", children: [
|
|
72
75
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.CheckCircle2, { className: "h-5 w-5 text-green-500" }),
|
|
73
76
|
"Minted"
|
|
74
77
|
] }),
|
|
75
78
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_button.Button, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("a", { href: portfolioHref, children: "View in portfolio" }) })
|
|
76
79
|
] }),
|
|
77
80
|
step.kind === "error" && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
|
78
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
81
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_dialog.DialogTitle, { className: "flex items-center gap-2 text-lg font-semibold", children: [
|
|
79
82
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.XCircle, { className: "h-4 w-4 text-destructive" }),
|
|
80
83
|
"Not minted"
|
|
81
84
|
] }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/drop/page/drop-mint-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { CheckCircle2, Loader2, XCircle } from \"lucide-react\";\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/drop/page/drop-mint-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { CheckCircle2, Loader2, XCircle } from \"lucide-react\";\nimport { Dialog, DialogContent, DialogDescription, DialogTitle } from \"../../dialog.js\";\nimport { GradientButton } from \"../../gradient-button.js\";\nimport { Button } from \"../../button.js\";\nimport { describeError } from \"../../../utils/describe-error.js\";\n\ntype Step = { kind: \"confirm\" } | { kind: \"minting\" } | { kind: \"done\"; tokenIds: string[] } | { kind: \"error\"; message: string };\n\nexport function DropMintDialog({\n open, onClose, name, quantity, totalText, onMint, portfolioHref,\n}: {\n open: boolean;\n onClose: () => void;\n name: string;\n quantity: bigint;\n totalText: string | null;\n onMint: () => Promise<{ tokenIds: string[] }>;\n portfolioHref: string;\n}) {\n const [step, setStep] = useState<Step>({ kind: \"confirm\" });\n const mint = async () => {\n setStep({ kind: \"minting\" });\n try {\n setStep({ kind: \"done\", tokenIds: (await onMint()).tokenIds });\n } catch (err) {\n setStep({ kind: \"error\", message: describeError(err).message });\n }\n };\n const close = () => {\n if (step.kind === \"minting\") return;\n setStep({ kind: \"confirm\" });\n onClose();\n };\n return (\n <Dialog open={open} onOpenChange={(next) => { if (!next) close(); }}>\n <DialogContent className=\"gap-5 sm:max-w-md\" hideClose={step.kind === \"minting\"}>\n <DialogDescription className=\"sr-only\">Mint from this drop.</DialogDescription>\n {step.kind === \"confirm\" && (\n <>\n <DialogTitle className=\"text-lg font-semibold\">Mint {quantity.toString()} from {name}</DialogTitle>\n {totalText && <p className=\"text-sm text-muted-foreground\">{totalText}</p>}\n <GradientButton big onClick={() => void mint()}>Confirm mint</GradientButton>\n </>\n )}\n {step.kind === \"minting\" && <DialogTitle className=\"flex items-center gap-2 text-lg font-semibold\"><Loader2 className=\"h-4 w-4 animate-spin\" />Minting…</DialogTitle>}\n {step.kind === \"done\" && (\n <>\n <DialogTitle className=\"flex items-center gap-2 text-lg font-semibold\"><CheckCircle2 className=\"h-5 w-5 text-green-500\" />Minted</DialogTitle>\n <Button asChild><a href={portfolioHref}>View in portfolio</a></Button>\n </>\n )}\n {step.kind === \"error\" && (\n <>\n <DialogTitle className=\"flex items-center gap-2 text-lg font-semibold\"><XCircle className=\"h-4 w-4 text-destructive\" />Not minted</DialogTitle>\n <p className=\"text-sm text-muted-foreground\">{step.message}</p>\n <Button onClick={() => void mint()}>Try again</Button>\n </>\n )}\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAuCQ;AArCR,mBAAyB;AACzB,0BAA+C;AAC/C,oBAAsE;AACtE,6BAA+B;AAC/B,oBAAuB;AACvB,4BAA8B;AAIvB,SAAS,eAAe;AAAA,EAC7B;AAAA,EAAM;AAAA,EAAS;AAAA,EAAM;AAAA,EAAU;AAAA,EAAW;AAAA,EAAQ;AACpD,GAQG;AACD,QAAM,CAAC,MAAM,OAAO,QAAI,uBAAe,EAAE,MAAM,UAAU,CAAC;AAC1D,QAAM,OAAO,YAAY;AACvB,YAAQ,EAAE,MAAM,UAAU,CAAC;AAC3B,QAAI;AACF,cAAQ,EAAE,MAAM,QAAQ,WAAW,MAAM,OAAO,GAAG,SAAS,CAAC;AAAA,IAC/D,SAAS,KAAK;AACZ,cAAQ,EAAE,MAAM,SAAS,aAAS,qCAAc,GAAG,EAAE,QAAQ,CAAC;AAAA,IAChE;AAAA,EACF;AACA,QAAM,QAAQ,MAAM;AAClB,QAAI,KAAK,SAAS,UAAW;AAC7B,YAAQ,EAAE,MAAM,UAAU,CAAC;AAC3B,YAAQ;AAAA,EACV;AACA,SACE,4CAAC,wBAAO,MAAY,cAAc,CAAC,SAAS;AAAE,QAAI,CAAC,KAAM,OAAM;AAAA,EAAG,GAChE,uDAAC,+BAAc,WAAU,qBAAoB,WAAW,KAAK,SAAS,WACpE;AAAA,gDAAC,mCAAkB,WAAU,WAAU,kCAAoB;AAAA,IAC1D,KAAK,SAAS,aACb,4EACE;AAAA,mDAAC,6BAAY,WAAU,yBAAwB;AAAA;AAAA,QAAM,SAAS,SAAS;AAAA,QAAE;AAAA,QAAO;AAAA,SAAK;AAAA,MACpF,aAAa,4CAAC,OAAE,WAAU,iCAAiC,qBAAU;AAAA,MACtE,4CAAC,yCAAe,KAAG,MAAC,SAAS,MAAM,KAAK,KAAK,GAAG,0BAAY;AAAA,OAC9D;AAAA,IAED,KAAK,SAAS,aAAa,6CAAC,6BAAY,WAAU,iDAAgD;AAAA,kDAAC,+BAAQ,WAAU,wBAAuB;AAAA,MAAE;AAAA,OAAQ;AAAA,IACtJ,KAAK,SAAS,UACb,4EACE;AAAA,mDAAC,6BAAY,WAAU,iDAAgD;AAAA,oDAAC,oCAAa,WAAU,0BAAyB;AAAA,QAAE;AAAA,SAAM;AAAA,MAChI,4CAAC,wBAAO,SAAO,MAAC,sDAAC,OAAE,MAAM,eAAe,+BAAiB,GAAI;AAAA,OAC/D;AAAA,IAED,KAAK,SAAS,WACb,4EACE;AAAA,mDAAC,6BAAY,WAAU,iDAAgD;AAAA,oDAAC,+BAAQ,WAAU,4BAA2B;AAAA,QAAE;AAAA,SAAU;AAAA,MACjI,4CAAC,OAAE,WAAU,iCAAiC,eAAK,SAAQ;AAAA,MAC3D,4CAAC,wBAAO,SAAS,MAAM,KAAK,KAAK,GAAG,uBAAS;AAAA,OAC/C;AAAA,KAEJ,GACF;AAEJ;","names":[]}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { useState } from "react";
|
|
4
4
|
import { CheckCircle2, Loader2, XCircle } from "lucide-react";
|
|
5
|
-
import {
|
|
5
|
+
import { Dialog, DialogContent, DialogDescription, DialogTitle } from "../../dialog.js";
|
|
6
6
|
import { GradientButton } from "../../gradient-button.js";
|
|
7
7
|
import { Button } from "../../button.js";
|
|
8
8
|
import { describeError } from "../../../utils/describe-error.js";
|
|
@@ -29,9 +29,12 @@ function DropMintDialog({
|
|
|
29
29
|
setStep({ kind: "confirm" });
|
|
30
30
|
onClose();
|
|
31
31
|
};
|
|
32
|
-
return /* @__PURE__ */ jsx(
|
|
32
|
+
return /* @__PURE__ */ jsx(Dialog, { open, onOpenChange: (next) => {
|
|
33
|
+
if (!next) close();
|
|
34
|
+
}, children: /* @__PURE__ */ jsxs(DialogContent, { className: "gap-5 sm:max-w-md", hideClose: step.kind === "minting", children: [
|
|
35
|
+
/* @__PURE__ */ jsx(DialogDescription, { className: "sr-only", children: "Mint from this drop." }),
|
|
33
36
|
step.kind === "confirm" && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
34
|
-
/* @__PURE__ */ jsxs(
|
|
37
|
+
/* @__PURE__ */ jsxs(DialogTitle, { className: "text-lg font-semibold", children: [
|
|
35
38
|
"Mint ",
|
|
36
39
|
quantity.toString(),
|
|
37
40
|
" from ",
|
|
@@ -40,19 +43,19 @@ function DropMintDialog({
|
|
|
40
43
|
totalText && /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: totalText }),
|
|
41
44
|
/* @__PURE__ */ jsx(GradientButton, { big: true, onClick: () => void mint(), children: "Confirm mint" })
|
|
42
45
|
] }),
|
|
43
|
-
step.kind === "minting" && /* @__PURE__ */ jsxs(
|
|
46
|
+
step.kind === "minting" && /* @__PURE__ */ jsxs(DialogTitle, { className: "flex items-center gap-2 text-lg font-semibold", children: [
|
|
44
47
|
/* @__PURE__ */ jsx(Loader2, { className: "h-4 w-4 animate-spin" }),
|
|
45
48
|
"Minting\u2026"
|
|
46
49
|
] }),
|
|
47
50
|
step.kind === "done" && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
48
|
-
/* @__PURE__ */ jsxs(
|
|
51
|
+
/* @__PURE__ */ jsxs(DialogTitle, { className: "flex items-center gap-2 text-lg font-semibold", children: [
|
|
49
52
|
/* @__PURE__ */ jsx(CheckCircle2, { className: "h-5 w-5 text-green-500" }),
|
|
50
53
|
"Minted"
|
|
51
54
|
] }),
|
|
52
55
|
/* @__PURE__ */ jsx(Button, { asChild: true, children: /* @__PURE__ */ jsx("a", { href: portfolioHref, children: "View in portfolio" }) })
|
|
53
56
|
] }),
|
|
54
57
|
step.kind === "error" && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
55
|
-
/* @__PURE__ */ jsxs(
|
|
58
|
+
/* @__PURE__ */ jsxs(DialogTitle, { className: "flex items-center gap-2 text-lg font-semibold", children: [
|
|
56
59
|
/* @__PURE__ */ jsx(XCircle, { className: "h-4 w-4 text-destructive" }),
|
|
57
60
|
"Not minted"
|
|
58
61
|
] }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/drop/page/drop-mint-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { CheckCircle2, Loader2, XCircle } from \"lucide-react\";\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/drop/page/drop-mint-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { CheckCircle2, Loader2, XCircle } from \"lucide-react\";\nimport { Dialog, DialogContent, DialogDescription, DialogTitle } from \"../../dialog.js\";\nimport { GradientButton } from \"../../gradient-button.js\";\nimport { Button } from \"../../button.js\";\nimport { describeError } from \"../../../utils/describe-error.js\";\n\ntype Step = { kind: \"confirm\" } | { kind: \"minting\" } | { kind: \"done\"; tokenIds: string[] } | { kind: \"error\"; message: string };\n\nexport function DropMintDialog({\n open, onClose, name, quantity, totalText, onMint, portfolioHref,\n}: {\n open: boolean;\n onClose: () => void;\n name: string;\n quantity: bigint;\n totalText: string | null;\n onMint: () => Promise<{ tokenIds: string[] }>;\n portfolioHref: string;\n}) {\n const [step, setStep] = useState<Step>({ kind: \"confirm\" });\n const mint = async () => {\n setStep({ kind: \"minting\" });\n try {\n setStep({ kind: \"done\", tokenIds: (await onMint()).tokenIds });\n } catch (err) {\n setStep({ kind: \"error\", message: describeError(err).message });\n }\n };\n const close = () => {\n if (step.kind === \"minting\") return;\n setStep({ kind: \"confirm\" });\n onClose();\n };\n return (\n <Dialog open={open} onOpenChange={(next) => { if (!next) close(); }}>\n <DialogContent className=\"gap-5 sm:max-w-md\" hideClose={step.kind === \"minting\"}>\n <DialogDescription className=\"sr-only\">Mint from this drop.</DialogDescription>\n {step.kind === \"confirm\" && (\n <>\n <DialogTitle className=\"text-lg font-semibold\">Mint {quantity.toString()} from {name}</DialogTitle>\n {totalText && <p className=\"text-sm text-muted-foreground\">{totalText}</p>}\n <GradientButton big onClick={() => void mint()}>Confirm mint</GradientButton>\n </>\n )}\n {step.kind === \"minting\" && <DialogTitle className=\"flex items-center gap-2 text-lg font-semibold\"><Loader2 className=\"h-4 w-4 animate-spin\" />Minting…</DialogTitle>}\n {step.kind === \"done\" && (\n <>\n <DialogTitle className=\"flex items-center gap-2 text-lg font-semibold\"><CheckCircle2 className=\"h-5 w-5 text-green-500\" />Minted</DialogTitle>\n <Button asChild><a href={portfolioHref}>View in portfolio</a></Button>\n </>\n )}\n {step.kind === \"error\" && (\n <>\n <DialogTitle className=\"flex items-center gap-2 text-lg font-semibold\"><XCircle className=\"h-4 w-4 text-destructive\" />Not minted</DialogTitle>\n <p className=\"text-sm text-muted-foreground\">{step.message}</p>\n <Button onClick={() => void mint()}>Try again</Button>\n </>\n )}\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":";AAuCQ,SAEE,UAFF,KAGI,YAHJ;AArCR,SAAS,gBAAgB;AACzB,SAAS,cAAc,SAAS,eAAe;AAC/C,SAAS,QAAQ,eAAe,mBAAmB,mBAAmB;AACtE,SAAS,sBAAsB;AAC/B,SAAS,cAAc;AACvB,SAAS,qBAAqB;AAIvB,SAAS,eAAe;AAAA,EAC7B;AAAA,EAAM;AAAA,EAAS;AAAA,EAAM;AAAA,EAAU;AAAA,EAAW;AAAA,EAAQ;AACpD,GAQG;AACD,QAAM,CAAC,MAAM,OAAO,IAAI,SAAe,EAAE,MAAM,UAAU,CAAC;AAC1D,QAAM,OAAO,YAAY;AACvB,YAAQ,EAAE,MAAM,UAAU,CAAC;AAC3B,QAAI;AACF,cAAQ,EAAE,MAAM,QAAQ,WAAW,MAAM,OAAO,GAAG,SAAS,CAAC;AAAA,IAC/D,SAAS,KAAK;AACZ,cAAQ,EAAE,MAAM,SAAS,SAAS,cAAc,GAAG,EAAE,QAAQ,CAAC;AAAA,IAChE;AAAA,EACF;AACA,QAAM,QAAQ,MAAM;AAClB,QAAI,KAAK,SAAS,UAAW;AAC7B,YAAQ,EAAE,MAAM,UAAU,CAAC;AAC3B,YAAQ;AAAA,EACV;AACA,SACE,oBAAC,UAAO,MAAY,cAAc,CAAC,SAAS;AAAE,QAAI,CAAC,KAAM,OAAM;AAAA,EAAG,GAChE,+BAAC,iBAAc,WAAU,qBAAoB,WAAW,KAAK,SAAS,WACpE;AAAA,wBAAC,qBAAkB,WAAU,WAAU,kCAAoB;AAAA,IAC1D,KAAK,SAAS,aACb,iCACE;AAAA,2BAAC,eAAY,WAAU,yBAAwB;AAAA;AAAA,QAAM,SAAS,SAAS;AAAA,QAAE;AAAA,QAAO;AAAA,SAAK;AAAA,MACpF,aAAa,oBAAC,OAAE,WAAU,iCAAiC,qBAAU;AAAA,MACtE,oBAAC,kBAAe,KAAG,MAAC,SAAS,MAAM,KAAK,KAAK,GAAG,0BAAY;AAAA,OAC9D;AAAA,IAED,KAAK,SAAS,aAAa,qBAAC,eAAY,WAAU,iDAAgD;AAAA,0BAAC,WAAQ,WAAU,wBAAuB;AAAA,MAAE;AAAA,OAAQ;AAAA,IACtJ,KAAK,SAAS,UACb,iCACE;AAAA,2BAAC,eAAY,WAAU,iDAAgD;AAAA,4BAAC,gBAAa,WAAU,0BAAyB;AAAA,QAAE;AAAA,SAAM;AAAA,MAChI,oBAAC,UAAO,SAAO,MAAC,8BAAC,OAAE,MAAM,eAAe,+BAAiB,GAAI;AAAA,OAC/D;AAAA,IAED,KAAK,SAAS,WACb,iCACE;AAAA,2BAAC,eAAY,WAAU,iDAAgD;AAAA,4BAAC,WAAQ,WAAU,4BAA2B;AAAA,QAAE;AAAA,SAAU;AAAA,MACjI,oBAAC,OAAE,WAAU,iCAAiC,eAAK,SAAQ;AAAA,MAC3D,oBAAC,UAAO,SAAS,MAAM,KAAK,KAAK,GAAG,uBAAS;AAAA,OAC/C;AAAA,KAEJ,GACF;AAEJ;","names":[]}
|
|
@@ -48,7 +48,7 @@ var import_select = require("../select.js");
|
|
|
48
48
|
var import_collapsible = require("../collapsible.js");
|
|
49
49
|
var import_popover = require("../popover.js");
|
|
50
50
|
var import_medialane_collection_card = require("../medialane-collection-card.js");
|
|
51
|
-
var
|
|
51
|
+
var import_dialog = require("../dialog.js");
|
|
52
52
|
var import_ip_type_fields = require("../ip-type-fields.js");
|
|
53
53
|
var import_ip = require("../../data/ip.js");
|
|
54
54
|
var import_ip_templates = require("../../data/ip-templates.js");
|
|
@@ -475,18 +475,11 @@ function FastMint(props) {
|
|
|
475
475
|
const collectionLabel = mediaUri ? collectionMode === "new" ? newCollectionName || "New collection" : selectedExistingCollection?.name || "IP Asset" : void 0;
|
|
476
476
|
const wrap = (node) => {
|
|
477
477
|
if (presentation !== "dialog") return node;
|
|
478
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
type: "button",
|
|
484
|
-
onClick: onClose,
|
|
485
|
-
"aria-label": "Close",
|
|
486
|
-
className: "absolute top-4 right-4 h-8 w-8 rounded-full hover:bg-muted flex items-center justify-center text-muted-foreground",
|
|
487
|
-
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.X, { className: "h-4 w-4" })
|
|
488
|
-
}
|
|
489
|
-
),
|
|
478
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dialog.Dialog, { open, onOpenChange: (next) => {
|
|
479
|
+
if (!next) onClose?.();
|
|
480
|
+
}, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_dialog.DialogContent, { className: "gap-0 p-6 sm:max-w-2xl sm:p-8", children: [
|
|
481
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dialog.DialogTitle, { className: "sr-only", children: "Create" }),
|
|
482
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dialog.DialogDescription, { className: "sr-only", children: "Add media, describe it and publish it as an asset." }),
|
|
490
483
|
node
|
|
491
484
|
] }) });
|
|
492
485
|
};
|