@medialane/ui 0.187.0 → 0.189.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.d.cts +1 -1
- package/dist/components/drop/create/drop-create.d.ts +1 -1
- package/dist/components/drop/create/launch-dialog.cjs +1 -1
- package/dist/components/drop/create/launch-dialog.cjs.map +1 -1
- package/dist/components/drop/create/launch-dialog.d.cts +1 -1
- package/dist/components/drop/create/launch-dialog.d.ts +1 -1
- package/dist/components/drop/create/launch-dialog.js +1 -1
- package/dist/components/drop/create/launch-dialog.js.map +1 -1
- package/dist/components/drop/page/drop-page.cjs +3 -3
- package/dist/components/drop/page/drop-page.cjs.map +1 -1
- package/dist/components/drop/page/drop-page.d.cts +1 -1
- package/dist/components/drop/page/drop-page.d.ts +1 -1
- package/dist/components/drop/page/drop-page.js +3 -3
- package/dist/components/drop/page/drop-page.js.map +1 -1
- package/dist/components/fast-mint/fast-mint.cjs +4 -5
- package/dist/components/fast-mint/fast-mint.cjs.map +1 -1
- package/dist/components/fast-mint/fast-mint.js +4 -5
- package/dist/components/fast-mint/fast-mint.js.map +1 -1
- package/dist/components/fast-mint/types.cjs.map +1 -1
- package/dist/components/fast-mint/types.d.cts +1 -2
- package/dist/components/fast-mint/types.d.ts +1 -2
- package/dist/components/media-wallet/media-wallet-activity.d.cts +0 -1
- package/dist/components/media-wallet/media-wallet-activity.d.ts +0 -1
- package/dist/components/media-wallet/media-wallet-home.cjs +5 -5
- package/dist/components/media-wallet/media-wallet-home.cjs.map +1 -1
- package/dist/components/media-wallet/media-wallet-home.d.cts +0 -1
- package/dist/components/media-wallet/media-wallet-home.d.ts +0 -1
- package/dist/components/media-wallet/media-wallet-home.js +5 -5
- package/dist/components/media-wallet/media-wallet-home.js.map +1 -1
- package/dist/components/media-wallet/media-wallet-overlay.d.cts +0 -1
- package/dist/components/media-wallet/media-wallet-overlay.d.ts +0 -1
- package/dist/components/media-wallet/media-wallet-send.cjs +7 -7
- package/dist/components/media-wallet/media-wallet-send.cjs.map +1 -1
- package/dist/components/media-wallet/media-wallet-send.d.cts +0 -1
- package/dist/components/media-wallet/media-wallet-send.d.ts +0 -1
- package/dist/components/media-wallet/media-wallet-send.js +7 -7
- package/dist/components/media-wallet/media-wallet-send.js.map +1 -1
- package/dist/components/media-wallet/media-wallet-token-detail.cjs +2 -2
- package/dist/components/media-wallet/media-wallet-token-detail.cjs.map +1 -1
- package/dist/components/media-wallet/media-wallet-token-detail.d.cts +0 -1
- package/dist/components/media-wallet/media-wallet-token-detail.d.ts +0 -1
- package/dist/components/media-wallet/media-wallet-token-detail.js +2 -2
- package/dist/components/media-wallet/media-wallet-token-detail.js.map +1 -1
- package/dist/components/media-wallet/media-wallet.d.cts +0 -1
- package/dist/components/media-wallet/media-wallet.d.ts +0 -1
- package/dist/components/media-wallet/types.cjs.map +1 -1
- package/dist/components/media-wallet/types.d.cts +0 -2
- package/dist/components/media-wallet/types.d.ts +0 -2
- package/dist/components/media-wallet/types.js.map +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js.map +1 -1
- package/dist/utils/app-wallet.cjs +4 -3
- package/dist/utils/app-wallet.cjs.map +1 -1
- package/dist/utils/app-wallet.d.cts +2 -2
- package/dist/utils/app-wallet.d.ts +2 -2
- package/dist/utils/app-wallet.js +4 -3
- package/dist/utils/app-wallet.js.map +1 -1
- package/dist/utils/drop/actions.cjs +3 -3
- package/dist/utils/drop/actions.cjs.map +1 -1
- package/dist/utils/drop/actions.d.cts +2 -3
- package/dist/utils/drop/actions.d.ts +2 -3
- package/dist/utils/drop/actions.js +3 -3
- package/dist/utils/drop/actions.js.map +1 -1
- package/dist/utils/drop/types.cjs.map +1 -1
- package/dist/utils/drop/types.d.cts +3 -6
- package/dist/utils/drop/types.d.ts +3 -6
- package/dist/utils/media-wallet/use-erc20-balance.cjs +14 -17
- package/dist/utils/media-wallet/use-erc20-balance.cjs.map +1 -1
- package/dist/utils/media-wallet/use-erc20-balance.d.cts +5 -4
- package/dist/utils/media-wallet/use-erc20-balance.d.ts +5 -4
- package/dist/utils/media-wallet/use-erc20-balance.js +14 -18
- package/dist/utils/media-wallet/use-erc20-balance.js.map +1 -1
- package/dist/utils/use-drops.cjs +19 -10
- package/dist/utils/use-drops.cjs.map +1 -1
- package/dist/utils/use-drops.d.cts +3 -7
- package/dist/utils/use-drops.d.ts +3 -7
- package/dist/utils/use-drops.js +19 -11
- package/dist/utils/use-drops.js.map +1 -1
- package/dist/utils/use-pop.cjs +3 -2
- package/dist/utils/use-pop.cjs.map +1 -1
- package/dist/utils/use-pop.d.cts +1 -2
- package/dist/utils/use-pop.d.ts +1 -2
- package/dist/utils/use-pop.js +3 -2
- package/dist/utils/use-pop.js.map +1 -1
- package/package.json +3 -3
- package/dist/utils/drop/chain.cjs +0 -37
- package/dist/utils/drop/chain.cjs.map +0 -1
- package/dist/utils/drop/chain.d.cts +0 -5
- package/dist/utils/drop/chain.d.ts +0 -5
- package/dist/utils/drop/chain.js +0 -13
- package/dist/utils/drop/chain.js.map +0 -1
|
@@ -5,10 +5,10 @@ import '../../drop-item-list.cjs';
|
|
|
5
5
|
import '../../../utils/drop/metadata.cjs';
|
|
6
6
|
import '@medialane/sdk';
|
|
7
7
|
import '../../../utils/drop/sale.cjs';
|
|
8
|
-
import 'starknet';
|
|
9
8
|
import '@medialane/sdk/starknet';
|
|
10
9
|
import '../../fast-mint/types.cjs';
|
|
11
10
|
import 'react';
|
|
11
|
+
import 'starknet';
|
|
12
12
|
|
|
13
13
|
declare function DropCreate(props: DropAppProps): react_jsx_runtime.JSX.Element;
|
|
14
14
|
/** The drop as collectors will see it, updated as the form changes. */
|
|
@@ -5,10 +5,10 @@ import '../../drop-item-list.js';
|
|
|
5
5
|
import '../../../utils/drop/metadata.js';
|
|
6
6
|
import '@medialane/sdk';
|
|
7
7
|
import '../../../utils/drop/sale.js';
|
|
8
|
-
import 'starknet';
|
|
9
8
|
import '@medialane/sdk/starknet';
|
|
10
9
|
import '../../fast-mint/types.js';
|
|
11
10
|
import 'react';
|
|
11
|
+
import 'starknet';
|
|
12
12
|
|
|
13
13
|
declare function DropCreate(props: DropAppProps): react_jsx_runtime.JSX.Element;
|
|
14
14
|
/** The drop as collectors will see it, updated as the form changes. */
|
|
@@ -87,7 +87,7 @@ function LaunchDialog({ open, onClose, draft, app }) {
|
|
|
87
87
|
}
|
|
88
88
|
setStep({ kind: "launching" });
|
|
89
89
|
const signer = await app.getSigner();
|
|
90
|
-
const { collection } = await (0, import_actions.launchDrop)({ client,
|
|
90
|
+
const { collection } = await (0, import_actions.launchDrop)({ client, signer }, {
|
|
91
91
|
owner: app.walletAddress,
|
|
92
92
|
name: draft.name.trim(),
|
|
93
93
|
symbol: draft.symbol,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/drop/create/launch-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { useMemo, useState } from \"react\";\nimport { CheckCircle2, Loader2, RotateCcw, XCircle } from \"lucide-react\";\nimport { dropHref } from \"@medialane/sdk\";\nimport { buildPopAllowlist, dropClaimLinks, popClaimLinksCsv, type PopClaimLink } from \"@medialane/sdk/starknet\";\nimport { ActionDialog } from \"../../action-dialog.js\";\nimport { GradientButton } from \"../../gradient-button.js\";\nimport { Button } from \"../../button.js\";\nimport { ShareButton } from \"../../share-button.js\";\nimport { describeError } from \"../../../utils/describe-error.js\";\nimport { uploadDirectoryToIpfs, uploadFileToIpfs } from \"../../../utils/ipfs-upload.js\";\nimport { parseAllowlist } from \"../../../utils/drop/allowlist.js\";\nimport { buildDropMetadataFiles, metadataBytes, MAX_DROP_METADATA_BYTES } from \"../../../utils/drop/metadata.js\";\nimport { toDropTerms, priceLabel } from \"../../../utils/drop/sale.js\";\nimport { draftSupply, type DropDraft } from \"../../../utils/drop/draft.js\";\nimport { uploadAll, type UploadTask } from \"../../../utils/drop/upload.js\";\nimport { launchDrop, saveExclusiveContent } from \"../../../utils/drop/actions.js\";\nimport type { DropAppProps } from \"../../../utils/drop/types.js\";\n\ntype Step =\n | { kind: \"review\" }\n | { kind: \"uploading\" }\n | { kind: \"launching\" }\n | { kind: \"done\"; collection: string; links: PopClaimLink[]; warning: string | null }\n | { kind: \"error\"; message: string };\n\nexport function LaunchDialog({ open, onClose, draft, app }: { open: boolean; onClose: () => void; draft: DropDraft; app: DropAppProps }) {\n const [step, setStep] = useState<Step>({ kind: \"review\" });\n const [tasks, setTasks] = useState<UploadTask[]>([]);\n const [baseUri, setBaseUri] = useState<string | null>(null);\n const client = app.getClient();\n const files = draft.kind === \"edition\" ? (draft.edition ? [draft.edition] : []) : draft.items.map((i) => i.file);\n const terms = toDropTerms(draft.sale);\n const list = useMemo(\n () => (draft.listOnly ? buildPopAllowlist(parseAllowlist(draft.allowlist).addresses) : null),\n [draft.listOnly, draft.allowlist],\n );\n\n const run = async () => {\n try {\n let uri = baseUri;\n if (!uri) {\n setStep({ kind: \"uploading\" });\n const initial = tasks.length > 0 ? tasks : [\n ...files.map((file, i) => ({ id: `art-${i}`, file, status: \"pending\" as const, uri: null, error: null })),\n ...(draft.cover ? [{ id: \"cover\", file: draft.cover, status: \"pending\" as const, uri: null, error: null }] : []),\n ];\n const done = await uploadAll(initial, async (f) => (await uploadFileToIpfs(client.api, f, \"image\")).uri, setTasks);\n setTasks(done);\n if (done.some((t) => t.status !== \"done\")) {\n setStep({ kind: \"error\", message: \"Some files didn't upload. Retry to send only those.\" });\n return;\n }\n const art = done.filter((t) => t.id.startsWith(\"art-\"));\n const metadata = buildDropMetadataFiles({\n kind: draft.kind,\n name: draft.name.trim(),\n description: draft.description.trim(),\n creator: app.walletAddress!,\n coverUri: done.find((t) => t.id === \"cover\")?.uri ?? null,\n license: draft.license,\n registrationDate: new Date().toISOString().slice(0, 10),\n items: draft.kind === \"edition\"\n ? [{ name: \"\", description: \"\", imageUri: art[0]!.uri! }]\n : draft.items.map((it, i) => ({ name: it.name, description: it.description, imageUri: art[i]!.uri! })),\n supply: draftSupply(draft),\n });\n if (metadataBytes(metadata) > MAX_DROP_METADATA_BYTES) {\n setStep({ kind: \"error\", message: \"The descriptions are too long for this many tokens. Shorten them and try again.\" });\n return;\n }\n uri = (await uploadDirectoryToIpfs(client.api, metadata)).baseUri;\n setBaseUri(uri);\n }\n setStep({ kind: \"launching\" });\n const signer = await app.getSigner();\n const { collection } = await launchDrop({ client, provider: app.provider, signer }, {\n owner: app.walletAddress!,\n name: draft.name.trim(),\n symbol: draft.symbol,\n baseUri: uri!,\n maxSupply: draftSupply(draft),\n terms,\n allowlistRoot: list?.root,\n description: draft.description.trim() || undefined,\n });\n let warning: string | null = null;\n if (draft.gated.enabled) {\n try {\n await saveExclusiveContent(client, collection, draft.gated);\n } catch {\n warning = \"Your drop launched, but the exclusive content wasn't saved. You can add it from Manage.\";\n }\n }\n setStep({ kind: \"done\", collection, links: list ? dropClaimLinks(window.location.origin, collection, list) : [], warning });\n } catch (err) {\n setStep({ kind: \"error\", message: describeError(err, \"We couldn't launch your drop. Please try again.\").message });\n }\n };\n\n const close = () => {\n if (step.kind === \"uploading\" || step.kind === \"launching\") return;\n onClose();\n };\n\n return (\n <ActionDialog open={open} onClose={close}>\n <div className=\"space-y-5 p-6\">\n {step.kind === \"review\" && (\n <>\n <h2 className=\"text-lg font-semibold\">Review and launch</h2>\n <div className=\"space-y-2 rounded-xl border border-border p-4 text-sm\">\n <p className=\"font-semibold\">{draft.name}</p>\n <p className=\"text-xs font-semibold uppercase tracking-widest text-muted-foreground\">Fixed after launch</p>\n <Row label=\"Price\" value={priceLabel(terms.price, terms.paymentToken)} />\n <Row label=\"Supply\" value={`${draftSupply(draft).toLocaleString(\"en-US\")} ${draft.kind === \"edition\" ? \"copies\" : \"items\"}`} />\n <Row label=\"Starts\" value={terms.startTime === 0 ? \"At launch\" : new Date(terms.startTime * 1000).toLocaleString()} />\n <Row label=\"Ends\" value={terms.endTime === 0 ? \"No end date\" : new Date(terms.endTime * 1000).toLocaleString()} />\n <Row label=\"Per wallet\" value={terms.maxPerWallet === \"0\" ? \"No limit\" : terms.maxPerWallet} />\n <Row label=\"Who can mint\" value={list ? `${Object.keys(list.proofs).length} wallets on a list` : \"Everyone\"} />\n <p className=\"pt-1 text-xs text-muted-foreground\">The artwork and these terms can't be changed after launch. You can change the list later.</p>\n </div>\n <GradientButton big onClick={() => void run()}>Launch drop</GradientButton>\n </>\n )}\n {step.kind === \"uploading\" && (\n <>\n <h2 className=\"flex items-center gap-2 text-lg font-semibold\"><Loader2 className=\"h-4 w-4 animate-spin\" />Uploading</h2>\n <p className=\"text-sm text-muted-foreground\">{tasks.filter((t) => t.status === \"done\").length} of {tasks.length} files</p>\n </>\n )}\n {step.kind === \"launching\" && (\n <h2 className=\"flex items-center gap-2 text-lg font-semibold\"><Loader2 className=\"h-4 w-4 animate-spin\" />Launching your drop…</h2>\n )}\n {step.kind === \"error\" && (\n <>\n <h2 className=\"flex items-center gap-2 text-lg font-semibold\"><XCircle className=\"h-4 w-4 text-destructive\" />Not launched</h2>\n <p className=\"text-sm text-muted-foreground\">{step.message}</p>\n {tasks.some((t) => t.status === \"failed\") && (\n <ul className=\"space-y-1 text-xs text-muted-foreground\">\n {tasks.filter((t) => t.status === \"failed\").map((t) => <li key={t.id}>{t.file.name}: {t.error}</li>)}\n </ul>\n )}\n <Button onClick={() => void run()} className=\"gap-1.5\"><RotateCcw className=\"h-3.5 w-3.5\" />Try again</Button>\n </>\n )}\n {step.kind === \"done\" && (\n <>\n <h2 className=\"flex items-center gap-2 text-lg font-semibold\"><CheckCircle2 className=\"h-5 w-5 text-green-500\" />Your drop is live</h2>\n {step.warning && <p className=\"text-sm text-brand-orange\">{step.warning}</p>}\n <div className=\"flex flex-wrap gap-2\">\n <ShareButton title={draft.name} url={`${window.location.origin}${dropHref(step.collection)}`} variant=\"outline\" />\n <Button asChild variant=\"outline\"><a href={dropHref(step.collection)}>View drop</a></Button>\n {step.links.length > 0 && (\n <Button variant=\"outline\" onClick={() => downloadCsv(popClaimLinksCsv(step.links), \"claim-links.csv\")}>Download claim links</Button>\n )}\n </div>\n {step.links.length > 0 && <p className=\"text-xs text-muted-foreground\">Send each wallet its link — the link is what lets it mint.</p>}\n </>\n )}\n </div>\n </ActionDialog>\n );\n}\n\nfunction Row({ label, value }: { label: string; value: string }) {\n return <div className=\"flex justify-between gap-3\"><span className=\"text-muted-foreground\">{label}</span><span className=\"text-right font-medium\">{value}</span></div>;\n}\n\nexport function downloadCsv(csv: string, name: string) {\n const href = URL.createObjectURL(new Blob([csv], { type: \"text/csv\" }));\n Object.assign(document.createElement(\"a\"), { href, download: name }).click();\n URL.revokeObjectURL(href);\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/drop/create/launch-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { useMemo, useState } from \"react\";\nimport { CheckCircle2, Loader2, RotateCcw, XCircle } from \"lucide-react\";\nimport { dropHref } from \"@medialane/sdk\";\nimport { buildPopAllowlist, dropClaimLinks, popClaimLinksCsv, type PopClaimLink } from \"@medialane/sdk/starknet\";\nimport { ActionDialog } from \"../../action-dialog.js\";\nimport { GradientButton } from \"../../gradient-button.js\";\nimport { Button } from \"../../button.js\";\nimport { ShareButton } from \"../../share-button.js\";\nimport { describeError } from \"../../../utils/describe-error.js\";\nimport { uploadDirectoryToIpfs, uploadFileToIpfs } from \"../../../utils/ipfs-upload.js\";\nimport { parseAllowlist } from \"../../../utils/drop/allowlist.js\";\nimport { buildDropMetadataFiles, metadataBytes, MAX_DROP_METADATA_BYTES } from \"../../../utils/drop/metadata.js\";\nimport { toDropTerms, priceLabel } from \"../../../utils/drop/sale.js\";\nimport { draftSupply, type DropDraft } from \"../../../utils/drop/draft.js\";\nimport { uploadAll, type UploadTask } from \"../../../utils/drop/upload.js\";\nimport { launchDrop, saveExclusiveContent } from \"../../../utils/drop/actions.js\";\nimport type { DropAppProps } from \"../../../utils/drop/types.js\";\n\ntype Step =\n | { kind: \"review\" }\n | { kind: \"uploading\" }\n | { kind: \"launching\" }\n | { kind: \"done\"; collection: string; links: PopClaimLink[]; warning: string | null }\n | { kind: \"error\"; message: string };\n\nexport function LaunchDialog({ open, onClose, draft, app }: { open: boolean; onClose: () => void; draft: DropDraft; app: DropAppProps }) {\n const [step, setStep] = useState<Step>({ kind: \"review\" });\n const [tasks, setTasks] = useState<UploadTask[]>([]);\n const [baseUri, setBaseUri] = useState<string | null>(null);\n const client = app.getClient();\n const files = draft.kind === \"edition\" ? (draft.edition ? [draft.edition] : []) : draft.items.map((i) => i.file);\n const terms = toDropTerms(draft.sale);\n const list = useMemo(\n () => (draft.listOnly ? buildPopAllowlist(parseAllowlist(draft.allowlist).addresses) : null),\n [draft.listOnly, draft.allowlist],\n );\n\n const run = async () => {\n try {\n let uri = baseUri;\n if (!uri) {\n setStep({ kind: \"uploading\" });\n const initial = tasks.length > 0 ? tasks : [\n ...files.map((file, i) => ({ id: `art-${i}`, file, status: \"pending\" as const, uri: null, error: null })),\n ...(draft.cover ? [{ id: \"cover\", file: draft.cover, status: \"pending\" as const, uri: null, error: null }] : []),\n ];\n const done = await uploadAll(initial, async (f) => (await uploadFileToIpfs(client.api, f, \"image\")).uri, setTasks);\n setTasks(done);\n if (done.some((t) => t.status !== \"done\")) {\n setStep({ kind: \"error\", message: \"Some files didn't upload. Retry to send only those.\" });\n return;\n }\n const art = done.filter((t) => t.id.startsWith(\"art-\"));\n const metadata = buildDropMetadataFiles({\n kind: draft.kind,\n name: draft.name.trim(),\n description: draft.description.trim(),\n creator: app.walletAddress!,\n coverUri: done.find((t) => t.id === \"cover\")?.uri ?? null,\n license: draft.license,\n registrationDate: new Date().toISOString().slice(0, 10),\n items: draft.kind === \"edition\"\n ? [{ name: \"\", description: \"\", imageUri: art[0]!.uri! }]\n : draft.items.map((it, i) => ({ name: it.name, description: it.description, imageUri: art[i]!.uri! })),\n supply: draftSupply(draft),\n });\n if (metadataBytes(metadata) > MAX_DROP_METADATA_BYTES) {\n setStep({ kind: \"error\", message: \"The descriptions are too long for this many tokens. Shorten them and try again.\" });\n return;\n }\n uri = (await uploadDirectoryToIpfs(client.api, metadata)).baseUri;\n setBaseUri(uri);\n }\n setStep({ kind: \"launching\" });\n const signer = await app.getSigner();\n const { collection } = await launchDrop({ client, signer }, {\n owner: app.walletAddress!,\n name: draft.name.trim(),\n symbol: draft.symbol,\n baseUri: uri!,\n maxSupply: draftSupply(draft),\n terms,\n allowlistRoot: list?.root,\n description: draft.description.trim() || undefined,\n });\n let warning: string | null = null;\n if (draft.gated.enabled) {\n try {\n await saveExclusiveContent(client, collection, draft.gated);\n } catch {\n warning = \"Your drop launched, but the exclusive content wasn't saved. You can add it from Manage.\";\n }\n }\n setStep({ kind: \"done\", collection, links: list ? dropClaimLinks(window.location.origin, collection, list) : [], warning });\n } catch (err) {\n setStep({ kind: \"error\", message: describeError(err, \"We couldn't launch your drop. Please try again.\").message });\n }\n };\n\n const close = () => {\n if (step.kind === \"uploading\" || step.kind === \"launching\") return;\n onClose();\n };\n\n return (\n <ActionDialog open={open} onClose={close}>\n <div className=\"space-y-5 p-6\">\n {step.kind === \"review\" && (\n <>\n <h2 className=\"text-lg font-semibold\">Review and launch</h2>\n <div className=\"space-y-2 rounded-xl border border-border p-4 text-sm\">\n <p className=\"font-semibold\">{draft.name}</p>\n <p className=\"text-xs font-semibold uppercase tracking-widest text-muted-foreground\">Fixed after launch</p>\n <Row label=\"Price\" value={priceLabel(terms.price, terms.paymentToken)} />\n <Row label=\"Supply\" value={`${draftSupply(draft).toLocaleString(\"en-US\")} ${draft.kind === \"edition\" ? \"copies\" : \"items\"}`} />\n <Row label=\"Starts\" value={terms.startTime === 0 ? \"At launch\" : new Date(terms.startTime * 1000).toLocaleString()} />\n <Row label=\"Ends\" value={terms.endTime === 0 ? \"No end date\" : new Date(terms.endTime * 1000).toLocaleString()} />\n <Row label=\"Per wallet\" value={terms.maxPerWallet === \"0\" ? \"No limit\" : terms.maxPerWallet} />\n <Row label=\"Who can mint\" value={list ? `${Object.keys(list.proofs).length} wallets on a list` : \"Everyone\"} />\n <p className=\"pt-1 text-xs text-muted-foreground\">The artwork and these terms can't be changed after launch. You can change the list later.</p>\n </div>\n <GradientButton big onClick={() => void run()}>Launch drop</GradientButton>\n </>\n )}\n {step.kind === \"uploading\" && (\n <>\n <h2 className=\"flex items-center gap-2 text-lg font-semibold\"><Loader2 className=\"h-4 w-4 animate-spin\" />Uploading</h2>\n <p className=\"text-sm text-muted-foreground\">{tasks.filter((t) => t.status === \"done\").length} of {tasks.length} files</p>\n </>\n )}\n {step.kind === \"launching\" && (\n <h2 className=\"flex items-center gap-2 text-lg font-semibold\"><Loader2 className=\"h-4 w-4 animate-spin\" />Launching your drop…</h2>\n )}\n {step.kind === \"error\" && (\n <>\n <h2 className=\"flex items-center gap-2 text-lg font-semibold\"><XCircle className=\"h-4 w-4 text-destructive\" />Not launched</h2>\n <p className=\"text-sm text-muted-foreground\">{step.message}</p>\n {tasks.some((t) => t.status === \"failed\") && (\n <ul className=\"space-y-1 text-xs text-muted-foreground\">\n {tasks.filter((t) => t.status === \"failed\").map((t) => <li key={t.id}>{t.file.name}: {t.error}</li>)}\n </ul>\n )}\n <Button onClick={() => void run()} className=\"gap-1.5\"><RotateCcw className=\"h-3.5 w-3.5\" />Try again</Button>\n </>\n )}\n {step.kind === \"done\" && (\n <>\n <h2 className=\"flex items-center gap-2 text-lg font-semibold\"><CheckCircle2 className=\"h-5 w-5 text-green-500\" />Your drop is live</h2>\n {step.warning && <p className=\"text-sm text-brand-orange\">{step.warning}</p>}\n <div className=\"flex flex-wrap gap-2\">\n <ShareButton title={draft.name} url={`${window.location.origin}${dropHref(step.collection)}`} variant=\"outline\" />\n <Button asChild variant=\"outline\"><a href={dropHref(step.collection)}>View drop</a></Button>\n {step.links.length > 0 && (\n <Button variant=\"outline\" onClick={() => downloadCsv(popClaimLinksCsv(step.links), \"claim-links.csv\")}>Download claim links</Button>\n )}\n </div>\n {step.links.length > 0 && <p className=\"text-xs text-muted-foreground\">Send each wallet its link — the link is what lets it mint.</p>}\n </>\n )}\n </div>\n </ActionDialog>\n );\n}\n\nfunction Row({ label, value }: { label: string; value: string }) {\n return <div className=\"flex justify-between gap-3\"><span className=\"text-muted-foreground\">{label}</span><span className=\"text-right font-medium\">{value}</span></div>;\n}\n\nexport function downloadCsv(csv: string, name: string) {\n const href = URL.createObjectURL(new Blob([csv], { type: \"text/csv\" }));\n Object.assign(document.createElement(\"a\"), { href, download: name }).click();\n URL.revokeObjectURL(href);\n}\n"],"mappings":"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","names":[]}
|
|
@@ -5,10 +5,10 @@ import '../../drop-item-list.cjs';
|
|
|
5
5
|
import '../../../utils/drop/metadata.cjs';
|
|
6
6
|
import '@medialane/sdk';
|
|
7
7
|
import '../../../utils/drop/sale.cjs';
|
|
8
|
-
import 'starknet';
|
|
9
8
|
import '@medialane/sdk/starknet';
|
|
10
9
|
import '../../fast-mint/types.cjs';
|
|
11
10
|
import 'react';
|
|
11
|
+
import 'starknet';
|
|
12
12
|
|
|
13
13
|
declare function LaunchDialog({ open, onClose, draft, app }: {
|
|
14
14
|
open: boolean;
|
|
@@ -5,10 +5,10 @@ import '../../drop-item-list.js';
|
|
|
5
5
|
import '../../../utils/drop/metadata.js';
|
|
6
6
|
import '@medialane/sdk';
|
|
7
7
|
import '../../../utils/drop/sale.js';
|
|
8
|
-
import 'starknet';
|
|
9
8
|
import '@medialane/sdk/starknet';
|
|
10
9
|
import '../../fast-mint/types.js';
|
|
11
10
|
import 'react';
|
|
11
|
+
import 'starknet';
|
|
12
12
|
|
|
13
13
|
declare function LaunchDialog({ open, onClose, draft, app }: {
|
|
14
14
|
open: boolean;
|
|
@@ -63,7 +63,7 @@ function LaunchDialog({ open, onClose, draft, app }) {
|
|
|
63
63
|
}
|
|
64
64
|
setStep({ kind: "launching" });
|
|
65
65
|
const signer = await app.getSigner();
|
|
66
|
-
const { collection } = await launchDrop({ client,
|
|
66
|
+
const { collection } = await launchDrop({ client, signer }, {
|
|
67
67
|
owner: app.walletAddress,
|
|
68
68
|
name: draft.name.trim(),
|
|
69
69
|
symbol: draft.symbol,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/drop/create/launch-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { useMemo, useState } from \"react\";\nimport { CheckCircle2, Loader2, RotateCcw, XCircle } from \"lucide-react\";\nimport { dropHref } from \"@medialane/sdk\";\nimport { buildPopAllowlist, dropClaimLinks, popClaimLinksCsv, type PopClaimLink } from \"@medialane/sdk/starknet\";\nimport { ActionDialog } from \"../../action-dialog.js\";\nimport { GradientButton } from \"../../gradient-button.js\";\nimport { Button } from \"../../button.js\";\nimport { ShareButton } from \"../../share-button.js\";\nimport { describeError } from \"../../../utils/describe-error.js\";\nimport { uploadDirectoryToIpfs, uploadFileToIpfs } from \"../../../utils/ipfs-upload.js\";\nimport { parseAllowlist } from \"../../../utils/drop/allowlist.js\";\nimport { buildDropMetadataFiles, metadataBytes, MAX_DROP_METADATA_BYTES } from \"../../../utils/drop/metadata.js\";\nimport { toDropTerms, priceLabel } from \"../../../utils/drop/sale.js\";\nimport { draftSupply, type DropDraft } from \"../../../utils/drop/draft.js\";\nimport { uploadAll, type UploadTask } from \"../../../utils/drop/upload.js\";\nimport { launchDrop, saveExclusiveContent } from \"../../../utils/drop/actions.js\";\nimport type { DropAppProps } from \"../../../utils/drop/types.js\";\n\ntype Step =\n | { kind: \"review\" }\n | { kind: \"uploading\" }\n | { kind: \"launching\" }\n | { kind: \"done\"; collection: string; links: PopClaimLink[]; warning: string | null }\n | { kind: \"error\"; message: string };\n\nexport function LaunchDialog({ open, onClose, draft, app }: { open: boolean; onClose: () => void; draft: DropDraft; app: DropAppProps }) {\n const [step, setStep] = useState<Step>({ kind: \"review\" });\n const [tasks, setTasks] = useState<UploadTask[]>([]);\n const [baseUri, setBaseUri] = useState<string | null>(null);\n const client = app.getClient();\n const files = draft.kind === \"edition\" ? (draft.edition ? [draft.edition] : []) : draft.items.map((i) => i.file);\n const terms = toDropTerms(draft.sale);\n const list = useMemo(\n () => (draft.listOnly ? buildPopAllowlist(parseAllowlist(draft.allowlist).addresses) : null),\n [draft.listOnly, draft.allowlist],\n );\n\n const run = async () => {\n try {\n let uri = baseUri;\n if (!uri) {\n setStep({ kind: \"uploading\" });\n const initial = tasks.length > 0 ? tasks : [\n ...files.map((file, i) => ({ id: `art-${i}`, file, status: \"pending\" as const, uri: null, error: null })),\n ...(draft.cover ? [{ id: \"cover\", file: draft.cover, status: \"pending\" as const, uri: null, error: null }] : []),\n ];\n const done = await uploadAll(initial, async (f) => (await uploadFileToIpfs(client.api, f, \"image\")).uri, setTasks);\n setTasks(done);\n if (done.some((t) => t.status !== \"done\")) {\n setStep({ kind: \"error\", message: \"Some files didn't upload. Retry to send only those.\" });\n return;\n }\n const art = done.filter((t) => t.id.startsWith(\"art-\"));\n const metadata = buildDropMetadataFiles({\n kind: draft.kind,\n name: draft.name.trim(),\n description: draft.description.trim(),\n creator: app.walletAddress!,\n coverUri: done.find((t) => t.id === \"cover\")?.uri ?? null,\n license: draft.license,\n registrationDate: new Date().toISOString().slice(0, 10),\n items: draft.kind === \"edition\"\n ? [{ name: \"\", description: \"\", imageUri: art[0]!.uri! }]\n : draft.items.map((it, i) => ({ name: it.name, description: it.description, imageUri: art[i]!.uri! })),\n supply: draftSupply(draft),\n });\n if (metadataBytes(metadata) > MAX_DROP_METADATA_BYTES) {\n setStep({ kind: \"error\", message: \"The descriptions are too long for this many tokens. Shorten them and try again.\" });\n return;\n }\n uri = (await uploadDirectoryToIpfs(client.api, metadata)).baseUri;\n setBaseUri(uri);\n }\n setStep({ kind: \"launching\" });\n const signer = await app.getSigner();\n const { collection } = await launchDrop({ client, provider: app.provider, signer }, {\n owner: app.walletAddress!,\n name: draft.name.trim(),\n symbol: draft.symbol,\n baseUri: uri!,\n maxSupply: draftSupply(draft),\n terms,\n allowlistRoot: list?.root,\n description: draft.description.trim() || undefined,\n });\n let warning: string | null = null;\n if (draft.gated.enabled) {\n try {\n await saveExclusiveContent(client, collection, draft.gated);\n } catch {\n warning = \"Your drop launched, but the exclusive content wasn't saved. You can add it from Manage.\";\n }\n }\n setStep({ kind: \"done\", collection, links: list ? dropClaimLinks(window.location.origin, collection, list) : [], warning });\n } catch (err) {\n setStep({ kind: \"error\", message: describeError(err, \"We couldn't launch your drop. Please try again.\").message });\n }\n };\n\n const close = () => {\n if (step.kind === \"uploading\" || step.kind === \"launching\") return;\n onClose();\n };\n\n return (\n <ActionDialog open={open} onClose={close}>\n <div className=\"space-y-5 p-6\">\n {step.kind === \"review\" && (\n <>\n <h2 className=\"text-lg font-semibold\">Review and launch</h2>\n <div className=\"space-y-2 rounded-xl border border-border p-4 text-sm\">\n <p className=\"font-semibold\">{draft.name}</p>\n <p className=\"text-xs font-semibold uppercase tracking-widest text-muted-foreground\">Fixed after launch</p>\n <Row label=\"Price\" value={priceLabel(terms.price, terms.paymentToken)} />\n <Row label=\"Supply\" value={`${draftSupply(draft).toLocaleString(\"en-US\")} ${draft.kind === \"edition\" ? \"copies\" : \"items\"}`} />\n <Row label=\"Starts\" value={terms.startTime === 0 ? \"At launch\" : new Date(terms.startTime * 1000).toLocaleString()} />\n <Row label=\"Ends\" value={terms.endTime === 0 ? \"No end date\" : new Date(terms.endTime * 1000).toLocaleString()} />\n <Row label=\"Per wallet\" value={terms.maxPerWallet === \"0\" ? \"No limit\" : terms.maxPerWallet} />\n <Row label=\"Who can mint\" value={list ? `${Object.keys(list.proofs).length} wallets on a list` : \"Everyone\"} />\n <p className=\"pt-1 text-xs text-muted-foreground\">The artwork and these terms can't be changed after launch. You can change the list later.</p>\n </div>\n <GradientButton big onClick={() => void run()}>Launch drop</GradientButton>\n </>\n )}\n {step.kind === \"uploading\" && (\n <>\n <h2 className=\"flex items-center gap-2 text-lg font-semibold\"><Loader2 className=\"h-4 w-4 animate-spin\" />Uploading</h2>\n <p className=\"text-sm text-muted-foreground\">{tasks.filter((t) => t.status === \"done\").length} of {tasks.length} files</p>\n </>\n )}\n {step.kind === \"launching\" && (\n <h2 className=\"flex items-center gap-2 text-lg font-semibold\"><Loader2 className=\"h-4 w-4 animate-spin\" />Launching your drop…</h2>\n )}\n {step.kind === \"error\" && (\n <>\n <h2 className=\"flex items-center gap-2 text-lg font-semibold\"><XCircle className=\"h-4 w-4 text-destructive\" />Not launched</h2>\n <p className=\"text-sm text-muted-foreground\">{step.message}</p>\n {tasks.some((t) => t.status === \"failed\") && (\n <ul className=\"space-y-1 text-xs text-muted-foreground\">\n {tasks.filter((t) => t.status === \"failed\").map((t) => <li key={t.id}>{t.file.name}: {t.error}</li>)}\n </ul>\n )}\n <Button onClick={() => void run()} className=\"gap-1.5\"><RotateCcw className=\"h-3.5 w-3.5\" />Try again</Button>\n </>\n )}\n {step.kind === \"done\" && (\n <>\n <h2 className=\"flex items-center gap-2 text-lg font-semibold\"><CheckCircle2 className=\"h-5 w-5 text-green-500\" />Your drop is live</h2>\n {step.warning && <p className=\"text-sm text-brand-orange\">{step.warning}</p>}\n <div className=\"flex flex-wrap gap-2\">\n <ShareButton title={draft.name} url={`${window.location.origin}${dropHref(step.collection)}`} variant=\"outline\" />\n <Button asChild variant=\"outline\"><a href={dropHref(step.collection)}>View drop</a></Button>\n {step.links.length > 0 && (\n <Button variant=\"outline\" onClick={() => downloadCsv(popClaimLinksCsv(step.links), \"claim-links.csv\")}>Download claim links</Button>\n )}\n </div>\n {step.links.length > 0 && <p className=\"text-xs text-muted-foreground\">Send each wallet its link — the link is what lets it mint.</p>}\n </>\n )}\n </div>\n </ActionDialog>\n );\n}\n\nfunction Row({ label, value }: { label: string; value: string }) {\n return <div className=\"flex justify-between gap-3\"><span className=\"text-muted-foreground\">{label}</span><span className=\"text-right font-medium\">{value}</span></div>;\n}\n\nexport function downloadCsv(csv: string, name: string) {\n const href = URL.createObjectURL(new Blob([csv], { type: \"text/csv\" }));\n Object.assign(document.createElement(\"a\"), { href, download: name }).click();\n URL.revokeObjectURL(href);\n}\n"],"mappings":";AA8GU,mBACE,KACA,YAFF;AA5GV,SAAS,SAAS,gBAAgB;AAClC,SAAS,cAAc,SAAS,WAAW,eAAe;AAC1D,SAAS,gBAAgB;AACzB,SAAS,mBAAmB,gBAAgB,wBAA2C;AACvF,SAAS,oBAAoB;AAC7B,SAAS,sBAAsB;AAC/B,SAAS,cAAc;AACvB,SAAS,mBAAmB;AAC5B,SAAS,qBAAqB;AAC9B,SAAS,uBAAuB,wBAAwB;AACxD,SAAS,sBAAsB;AAC/B,SAAS,wBAAwB,eAAe,+BAA+B;AAC/E,SAAS,aAAa,kBAAkB;AACxC,SAAS,mBAAmC;AAC5C,SAAS,iBAAkC;AAC3C,SAAS,YAAY,4BAA4B;AAU1C,SAAS,aAAa,EAAE,MAAM,SAAS,OAAO,IAAI,GAAgF;AACvI,QAAM,CAAC,MAAM,OAAO,IAAI,SAAe,EAAE,MAAM,SAAS,CAAC;AACzD,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAuB,CAAC,CAAC;AACnD,QAAM,CAAC,SAAS,UAAU,IAAI,SAAwB,IAAI;AAC1D,QAAM,SAAS,IAAI,UAAU;AAC7B,QAAM,QAAQ,MAAM,SAAS,YAAa,MAAM,UAAU,CAAC,MAAM,OAAO,IAAI,CAAC,IAAK,MAAM,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI;AAC/G,QAAM,QAAQ,YAAY,MAAM,IAAI;AACpC,QAAM,OAAO;AAAA,IACX,MAAO,MAAM,WAAW,kBAAkB,eAAe,MAAM,SAAS,EAAE,SAAS,IAAI;AAAA,IACvF,CAAC,MAAM,UAAU,MAAM,SAAS;AAAA,EAClC;AAEA,QAAM,MAAM,YAAY;AACtB,QAAI;AACF,UAAI,MAAM;AACV,UAAI,CAAC,KAAK;AACR,gBAAQ,EAAE,MAAM,YAAY,CAAC;AAC7B,cAAM,UAAU,MAAM,SAAS,IAAI,QAAQ;AAAA,UACzC,GAAG,MAAM,IAAI,CAAC,MAAM,OAAO,EAAE,IAAI,OAAO,CAAC,IAAI,MAAM,QAAQ,WAAoB,KAAK,MAAM,OAAO,KAAK,EAAE;AAAA,UACxG,GAAI,MAAM,QAAQ,CAAC,EAAE,IAAI,SAAS,MAAM,MAAM,OAAO,QAAQ,WAAoB,KAAK,MAAM,OAAO,KAAK,CAAC,IAAI,CAAC;AAAA,QAChH;AACA,cAAM,OAAO,MAAM,UAAU,SAAS,OAAO,OAAO,MAAM,iBAAiB,OAAO,KAAK,GAAG,OAAO,GAAG,KAAK,QAAQ;AACjH,iBAAS,IAAI;AACb,YAAI,KAAK,KAAK,CAAC,MAAM,EAAE,WAAW,MAAM,GAAG;AACzC,kBAAQ,EAAE,MAAM,SAAS,SAAS,sDAAsD,CAAC;AACzF;AAAA,QACF;AACA,cAAM,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,GAAG,WAAW,MAAM,CAAC;AACtD,cAAM,WAAW,uBAAuB;AAAA,UACtC,MAAM,MAAM;AAAA,UACZ,MAAM,MAAM,KAAK,KAAK;AAAA,UACtB,aAAa,MAAM,YAAY,KAAK;AAAA,UACpC,SAAS,IAAI;AAAA,UACb,UAAU,KAAK,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO,GAAG,OAAO;AAAA,UACrD,SAAS,MAAM;AAAA,UACf,mBAAkB,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAAA,UACtD,OAAO,MAAM,SAAS,YAClB,CAAC,EAAE,MAAM,IAAI,aAAa,IAAI,UAAU,IAAI,CAAC,EAAG,IAAK,CAAC,IACtD,MAAM,MAAM,IAAI,CAAC,IAAI,OAAO,EAAE,MAAM,GAAG,MAAM,aAAa,GAAG,aAAa,UAAU,IAAI,CAAC,EAAG,IAAK,EAAE;AAAA,UACvG,QAAQ,YAAY,KAAK;AAAA,QAC3B,CAAC;AACD,YAAI,cAAc,QAAQ,IAAI,yBAAyB;AACrD,kBAAQ,EAAE,MAAM,SAAS,SAAS,kFAAkF,CAAC;AACrH;AAAA,QACF;AACA,eAAO,MAAM,sBAAsB,OAAO,KAAK,QAAQ,GAAG;AAC1D,mBAAW,GAAG;AAAA,MAChB;AACA,cAAQ,EAAE,MAAM,YAAY,CAAC;AAC7B,YAAM,SAAS,MAAM,IAAI,UAAU;AACnC,YAAM,EAAE,WAAW,IAAI,MAAM,WAAW,EAAE,QAAQ,UAAU,IAAI,UAAU,OAAO,GAAG;AAAA,QAClF,OAAO,IAAI;AAAA,QACX,MAAM,MAAM,KAAK,KAAK;AAAA,QACtB,QAAQ,MAAM;AAAA,QACd,SAAS;AAAA,QACT,WAAW,YAAY,KAAK;AAAA,QAC5B;AAAA,QACA,eAAe,MAAM;AAAA,QACrB,aAAa,MAAM,YAAY,KAAK,KAAK;AAAA,MAC3C,CAAC;AACD,UAAI,UAAyB;AAC7B,UAAI,MAAM,MAAM,SAAS;AACvB,YAAI;AACF,gBAAM,qBAAqB,QAAQ,YAAY,MAAM,KAAK;AAAA,QAC5D,QAAQ;AACN,oBAAU;AAAA,QACZ;AAAA,MACF;AACA,cAAQ,EAAE,MAAM,QAAQ,YAAY,OAAO,OAAO,eAAe,OAAO,SAAS,QAAQ,YAAY,IAAI,IAAI,CAAC,GAAG,QAAQ,CAAC;AAAA,IAC5H,SAAS,KAAK;AACZ,cAAQ,EAAE,MAAM,SAAS,SAAS,cAAc,KAAK,iDAAiD,EAAE,QAAQ,CAAC;AAAA,IACnH;AAAA,EACF;AAEA,QAAM,QAAQ,MAAM;AAClB,QAAI,KAAK,SAAS,eAAe,KAAK,SAAS,YAAa;AAC5D,YAAQ;AAAA,EACV;AAEA,SACE,oBAAC,gBAAa,MAAY,SAAS,OACjC,+BAAC,SAAI,WAAU,iBACZ;AAAA,SAAK,SAAS,YACb,iCACE;AAAA,0BAAC,QAAG,WAAU,yBAAwB,+BAAiB;AAAA,MACvD,qBAAC,SAAI,WAAU,yDACb;AAAA,4BAAC,OAAE,WAAU,iBAAiB,gBAAM,MAAK;AAAA,QACzC,oBAAC,OAAE,WAAU,yEAAwE,gCAAkB;AAAA,QACvG,oBAAC,OAAI,OAAM,SAAQ,OAAO,WAAW,MAAM,OAAO,MAAM,YAAY,GAAG;AAAA,QACvE,oBAAC,OAAI,OAAM,UAAS,OAAO,GAAG,YAAY,KAAK,EAAE,eAAe,OAAO,CAAC,IAAI,MAAM,SAAS,YAAY,WAAW,OAAO,IAAI;AAAA,QAC7H,oBAAC,OAAI,OAAM,UAAS,OAAO,MAAM,cAAc,IAAI,cAAc,IAAI,KAAK,MAAM,YAAY,GAAI,EAAE,eAAe,GAAG;AAAA,QACpH,oBAAC,OAAI,OAAM,QAAO,OAAO,MAAM,YAAY,IAAI,gBAAgB,IAAI,KAAK,MAAM,UAAU,GAAI,EAAE,eAAe,GAAG;AAAA,QAChH,oBAAC,OAAI,OAAM,cAAa,OAAO,MAAM,iBAAiB,MAAM,aAAa,MAAM,cAAc;AAAA,QAC7F,oBAAC,OAAI,OAAM,gBAAe,OAAO,OAAO,GAAG,OAAO,KAAK,KAAK,MAAM,EAAE,MAAM,uBAAuB,YAAY;AAAA,QAC7G,oBAAC,OAAE,WAAU,sCAAqC,uGAAyF;AAAA,SAC7I;AAAA,MACA,oBAAC,kBAAe,KAAG,MAAC,SAAS,MAAM,KAAK,IAAI,GAAG,yBAAW;AAAA,OAC5D;AAAA,IAED,KAAK,SAAS,eACb,iCACE;AAAA,2BAAC,QAAG,WAAU,iDAAgD;AAAA,4BAAC,WAAQ,WAAU,wBAAuB;AAAA,QAAE;AAAA,SAAS;AAAA,MACnH,qBAAC,OAAE,WAAU,iCAAiC;AAAA,cAAM,OAAO,CAAC,MAAM,EAAE,WAAW,MAAM,EAAE;AAAA,QAAO;AAAA,QAAK,MAAM;AAAA,QAAO;AAAA,SAAM;AAAA,OACxH;AAAA,IAED,KAAK,SAAS,eACb,qBAAC,QAAG,WAAU,iDAAgD;AAAA,0BAAC,WAAQ,WAAU,wBAAuB;AAAA,MAAE;AAAA,OAAoB;AAAA,IAE/H,KAAK,SAAS,WACb,iCACE;AAAA,2BAAC,QAAG,WAAU,iDAAgD;AAAA,4BAAC,WAAQ,WAAU,4BAA2B;AAAA,QAAE;AAAA,SAAY;AAAA,MAC1H,oBAAC,OAAE,WAAU,iCAAiC,eAAK,SAAQ;AAAA,MAC1D,MAAM,KAAK,CAAC,MAAM,EAAE,WAAW,QAAQ,KACtC,oBAAC,QAAG,WAAU,2CACX,gBAAM,OAAO,CAAC,MAAM,EAAE,WAAW,QAAQ,EAAE,IAAI,CAAC,MAAM,qBAAC,QAAe;AAAA,UAAE,KAAK;AAAA,QAAK;AAAA,QAAG,EAAE;AAAA,WAAxB,EAAE,EAA4B,CAAK,GACrG;AAAA,MAEF,qBAAC,UAAO,SAAS,MAAM,KAAK,IAAI,GAAG,WAAU,WAAU;AAAA,4BAAC,aAAU,WAAU,eAAc;AAAA,QAAE;AAAA,SAAS;AAAA,OACvG;AAAA,IAED,KAAK,SAAS,UACb,iCACE;AAAA,2BAAC,QAAG,WAAU,iDAAgD;AAAA,4BAAC,gBAAa,WAAU,0BAAyB;AAAA,QAAE;AAAA,SAAiB;AAAA,MACjI,KAAK,WAAW,oBAAC,OAAE,WAAU,6BAA6B,eAAK,SAAQ;AAAA,MACxE,qBAAC,SAAI,WAAU,wBACb;AAAA,4BAAC,eAAY,OAAO,MAAM,MAAM,KAAK,GAAG,OAAO,SAAS,MAAM,GAAG,SAAS,KAAK,UAAU,CAAC,IAAI,SAAQ,WAAU;AAAA,QAChH,oBAAC,UAAO,SAAO,MAAC,SAAQ,WAAU,8BAAC,OAAE,MAAM,SAAS,KAAK,UAAU,GAAG,uBAAS,GAAI;AAAA,QAClF,KAAK,MAAM,SAAS,KACnB,oBAAC,UAAO,SAAQ,WAAU,SAAS,MAAM,YAAY,iBAAiB,KAAK,KAAK,GAAG,iBAAiB,GAAG,kCAAoB;AAAA,SAE/H;AAAA,MACC,KAAK,MAAM,SAAS,KAAK,oBAAC,OAAE,WAAU,iCAAgC,6EAA0D;AAAA,OACnI;AAAA,KAEJ,GACF;AAEJ;AAEA,SAAS,IAAI,EAAE,OAAO,MAAM,GAAqC;AAC/D,SAAO,qBAAC,SAAI,WAAU,8BAA6B;AAAA,wBAAC,UAAK,WAAU,yBAAyB,iBAAM;AAAA,IAAO,oBAAC,UAAK,WAAU,0BAA0B,iBAAM;AAAA,KAAO;AAClK;AAEO,SAAS,YAAY,KAAa,MAAc;AACrD,QAAM,OAAO,IAAI,gBAAgB,IAAI,KAAK,CAAC,GAAG,GAAG,EAAE,MAAM,WAAW,CAAC,CAAC;AACtE,SAAO,OAAO,SAAS,cAAc,GAAG,GAAG,EAAE,MAAM,UAAU,KAAK,CAAC,EAAE,MAAM;AAC3E,MAAI,gBAAgB,IAAI;AAC1B;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/drop/create/launch-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { useMemo, useState } from \"react\";\nimport { CheckCircle2, Loader2, RotateCcw, XCircle } from \"lucide-react\";\nimport { dropHref } from \"@medialane/sdk\";\nimport { buildPopAllowlist, dropClaimLinks, popClaimLinksCsv, type PopClaimLink } from \"@medialane/sdk/starknet\";\nimport { ActionDialog } from \"../../action-dialog.js\";\nimport { GradientButton } from \"../../gradient-button.js\";\nimport { Button } from \"../../button.js\";\nimport { ShareButton } from \"../../share-button.js\";\nimport { describeError } from \"../../../utils/describe-error.js\";\nimport { uploadDirectoryToIpfs, uploadFileToIpfs } from \"../../../utils/ipfs-upload.js\";\nimport { parseAllowlist } from \"../../../utils/drop/allowlist.js\";\nimport { buildDropMetadataFiles, metadataBytes, MAX_DROP_METADATA_BYTES } from \"../../../utils/drop/metadata.js\";\nimport { toDropTerms, priceLabel } from \"../../../utils/drop/sale.js\";\nimport { draftSupply, type DropDraft } from \"../../../utils/drop/draft.js\";\nimport { uploadAll, type UploadTask } from \"../../../utils/drop/upload.js\";\nimport { launchDrop, saveExclusiveContent } from \"../../../utils/drop/actions.js\";\nimport type { DropAppProps } from \"../../../utils/drop/types.js\";\n\ntype Step =\n | { kind: \"review\" }\n | { kind: \"uploading\" }\n | { kind: \"launching\" }\n | { kind: \"done\"; collection: string; links: PopClaimLink[]; warning: string | null }\n | { kind: \"error\"; message: string };\n\nexport function LaunchDialog({ open, onClose, draft, app }: { open: boolean; onClose: () => void; draft: DropDraft; app: DropAppProps }) {\n const [step, setStep] = useState<Step>({ kind: \"review\" });\n const [tasks, setTasks] = useState<UploadTask[]>([]);\n const [baseUri, setBaseUri] = useState<string | null>(null);\n const client = app.getClient();\n const files = draft.kind === \"edition\" ? (draft.edition ? [draft.edition] : []) : draft.items.map((i) => i.file);\n const terms = toDropTerms(draft.sale);\n const list = useMemo(\n () => (draft.listOnly ? buildPopAllowlist(parseAllowlist(draft.allowlist).addresses) : null),\n [draft.listOnly, draft.allowlist],\n );\n\n const run = async () => {\n try {\n let uri = baseUri;\n if (!uri) {\n setStep({ kind: \"uploading\" });\n const initial = tasks.length > 0 ? tasks : [\n ...files.map((file, i) => ({ id: `art-${i}`, file, status: \"pending\" as const, uri: null, error: null })),\n ...(draft.cover ? [{ id: \"cover\", file: draft.cover, status: \"pending\" as const, uri: null, error: null }] : []),\n ];\n const done = await uploadAll(initial, async (f) => (await uploadFileToIpfs(client.api, f, \"image\")).uri, setTasks);\n setTasks(done);\n if (done.some((t) => t.status !== \"done\")) {\n setStep({ kind: \"error\", message: \"Some files didn't upload. Retry to send only those.\" });\n return;\n }\n const art = done.filter((t) => t.id.startsWith(\"art-\"));\n const metadata = buildDropMetadataFiles({\n kind: draft.kind,\n name: draft.name.trim(),\n description: draft.description.trim(),\n creator: app.walletAddress!,\n coverUri: done.find((t) => t.id === \"cover\")?.uri ?? null,\n license: draft.license,\n registrationDate: new Date().toISOString().slice(0, 10),\n items: draft.kind === \"edition\"\n ? [{ name: \"\", description: \"\", imageUri: art[0]!.uri! }]\n : draft.items.map((it, i) => ({ name: it.name, description: it.description, imageUri: art[i]!.uri! })),\n supply: draftSupply(draft),\n });\n if (metadataBytes(metadata) > MAX_DROP_METADATA_BYTES) {\n setStep({ kind: \"error\", message: \"The descriptions are too long for this many tokens. Shorten them and try again.\" });\n return;\n }\n uri = (await uploadDirectoryToIpfs(client.api, metadata)).baseUri;\n setBaseUri(uri);\n }\n setStep({ kind: \"launching\" });\n const signer = await app.getSigner();\n const { collection } = await launchDrop({ client, signer }, {\n owner: app.walletAddress!,\n name: draft.name.trim(),\n symbol: draft.symbol,\n baseUri: uri!,\n maxSupply: draftSupply(draft),\n terms,\n allowlistRoot: list?.root,\n description: draft.description.trim() || undefined,\n });\n let warning: string | null = null;\n if (draft.gated.enabled) {\n try {\n await saveExclusiveContent(client, collection, draft.gated);\n } catch {\n warning = \"Your drop launched, but the exclusive content wasn't saved. You can add it from Manage.\";\n }\n }\n setStep({ kind: \"done\", collection, links: list ? dropClaimLinks(window.location.origin, collection, list) : [], warning });\n } catch (err) {\n setStep({ kind: \"error\", message: describeError(err, \"We couldn't launch your drop. Please try again.\").message });\n }\n };\n\n const close = () => {\n if (step.kind === \"uploading\" || step.kind === \"launching\") return;\n onClose();\n };\n\n return (\n <ActionDialog open={open} onClose={close}>\n <div className=\"space-y-5 p-6\">\n {step.kind === \"review\" && (\n <>\n <h2 className=\"text-lg font-semibold\">Review and launch</h2>\n <div className=\"space-y-2 rounded-xl border border-border p-4 text-sm\">\n <p className=\"font-semibold\">{draft.name}</p>\n <p className=\"text-xs font-semibold uppercase tracking-widest text-muted-foreground\">Fixed after launch</p>\n <Row label=\"Price\" value={priceLabel(terms.price, terms.paymentToken)} />\n <Row label=\"Supply\" value={`${draftSupply(draft).toLocaleString(\"en-US\")} ${draft.kind === \"edition\" ? \"copies\" : \"items\"}`} />\n <Row label=\"Starts\" value={terms.startTime === 0 ? \"At launch\" : new Date(terms.startTime * 1000).toLocaleString()} />\n <Row label=\"Ends\" value={terms.endTime === 0 ? \"No end date\" : new Date(terms.endTime * 1000).toLocaleString()} />\n <Row label=\"Per wallet\" value={terms.maxPerWallet === \"0\" ? \"No limit\" : terms.maxPerWallet} />\n <Row label=\"Who can mint\" value={list ? `${Object.keys(list.proofs).length} wallets on a list` : \"Everyone\"} />\n <p className=\"pt-1 text-xs text-muted-foreground\">The artwork and these terms can't be changed after launch. You can change the list later.</p>\n </div>\n <GradientButton big onClick={() => void run()}>Launch drop</GradientButton>\n </>\n )}\n {step.kind === \"uploading\" && (\n <>\n <h2 className=\"flex items-center gap-2 text-lg font-semibold\"><Loader2 className=\"h-4 w-4 animate-spin\" />Uploading</h2>\n <p className=\"text-sm text-muted-foreground\">{tasks.filter((t) => t.status === \"done\").length} of {tasks.length} files</p>\n </>\n )}\n {step.kind === \"launching\" && (\n <h2 className=\"flex items-center gap-2 text-lg font-semibold\"><Loader2 className=\"h-4 w-4 animate-spin\" />Launching your drop…</h2>\n )}\n {step.kind === \"error\" && (\n <>\n <h2 className=\"flex items-center gap-2 text-lg font-semibold\"><XCircle className=\"h-4 w-4 text-destructive\" />Not launched</h2>\n <p className=\"text-sm text-muted-foreground\">{step.message}</p>\n {tasks.some((t) => t.status === \"failed\") && (\n <ul className=\"space-y-1 text-xs text-muted-foreground\">\n {tasks.filter((t) => t.status === \"failed\").map((t) => <li key={t.id}>{t.file.name}: {t.error}</li>)}\n </ul>\n )}\n <Button onClick={() => void run()} className=\"gap-1.5\"><RotateCcw className=\"h-3.5 w-3.5\" />Try again</Button>\n </>\n )}\n {step.kind === \"done\" && (\n <>\n <h2 className=\"flex items-center gap-2 text-lg font-semibold\"><CheckCircle2 className=\"h-5 w-5 text-green-500\" />Your drop is live</h2>\n {step.warning && <p className=\"text-sm text-brand-orange\">{step.warning}</p>}\n <div className=\"flex flex-wrap gap-2\">\n <ShareButton title={draft.name} url={`${window.location.origin}${dropHref(step.collection)}`} variant=\"outline\" />\n <Button asChild variant=\"outline\"><a href={dropHref(step.collection)}>View drop</a></Button>\n {step.links.length > 0 && (\n <Button variant=\"outline\" onClick={() => downloadCsv(popClaimLinksCsv(step.links), \"claim-links.csv\")}>Download claim links</Button>\n )}\n </div>\n {step.links.length > 0 && <p className=\"text-xs text-muted-foreground\">Send each wallet its link — the link is what lets it mint.</p>}\n </>\n )}\n </div>\n </ActionDialog>\n );\n}\n\nfunction Row({ label, value }: { label: string; value: string }) {\n return <div className=\"flex justify-between gap-3\"><span className=\"text-muted-foreground\">{label}</span><span className=\"text-right font-medium\">{value}</span></div>;\n}\n\nexport function downloadCsv(csv: string, name: string) {\n const href = URL.createObjectURL(new Blob([csv], { type: \"text/csv\" }));\n Object.assign(document.createElement(\"a\"), { href, download: name }).click();\n URL.revokeObjectURL(href);\n}\n"],"mappings":"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","names":[]}
|
|
@@ -56,9 +56,9 @@ var import_view = require("../../../utils/drop/view.js");
|
|
|
56
56
|
var import_claim_proof = require("../../../utils/drop/claim-proof.js");
|
|
57
57
|
var import_actions = require("../../../utils/drop/actions.js");
|
|
58
58
|
function DropPage(props) {
|
|
59
|
-
const { contract, getClient,
|
|
59
|
+
const { contract, getClient, walletAddress } = props;
|
|
60
60
|
const { drop: indexed, isLoading } = (0, import_use_drops.useDrop)(getClient, contract);
|
|
61
|
-
const chain = (0, import_use_drops.useDropChain)(
|
|
61
|
+
const chain = (0, import_use_drops.useDropChain)(getClient, contract, walletAddress);
|
|
62
62
|
const { mints, mutate: refreshMints } = (0, import_use_drops.useDropMints)(getClient, contract);
|
|
63
63
|
const feeBps = (0, import_use_drops.useDropFee)(getClient);
|
|
64
64
|
const collectionFile = (0, import_use_drops.useDropFile)(getClient, indexed?.baseUri ?? null, "collection.json");
|
|
@@ -91,7 +91,7 @@ function DropPage(props) {
|
|
|
91
91
|
const isOrganizer = !!walletAddress && !!onchain && BigInt(walletAddress) === BigInt(onchain.organizer);
|
|
92
92
|
const art = firstToken?.image ?? indexed?.image ?? null;
|
|
93
93
|
const name = indexed?.name ?? "Drop";
|
|
94
|
-
const deps = async () => ({ client: getClient(),
|
|
94
|
+
const deps = async () => ({ client: getClient(), signer: await props.getSigner() });
|
|
95
95
|
const onAction = () => {
|
|
96
96
|
if (!view) return;
|
|
97
97
|
if (view.button.action === "sign-in") props.onRequireWallet();
|
|
@@ -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 { 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
|
+
{"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, walletAddress } = props;\n const { drop: indexed, isLoading } = useDrop(getClient, contract);\n const chain = useDropChain(getClient, 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(), 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,9 +1,9 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
2
|
import { DropAppProps } from '../../../utils/drop/types.cjs';
|
|
3
|
-
import 'starknet';
|
|
4
3
|
import '@medialane/sdk/starknet';
|
|
5
4
|
import '../../fast-mint/types.cjs';
|
|
6
5
|
import 'react';
|
|
6
|
+
import 'starknet';
|
|
7
7
|
import '@medialane/sdk';
|
|
8
8
|
|
|
9
9
|
declare function DropPage(props: DropAppProps & {
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
2
|
import { DropAppProps } from '../../../utils/drop/types.js';
|
|
3
|
-
import 'starknet';
|
|
4
3
|
import '@medialane/sdk/starknet';
|
|
5
4
|
import '../../fast-mint/types.js';
|
|
6
5
|
import 'react';
|
|
6
|
+
import 'starknet';
|
|
7
7
|
import '@medialane/sdk';
|
|
8
8
|
|
|
9
9
|
declare function DropPage(props: DropAppProps & {
|
|
@@ -23,9 +23,9 @@ import { actionBoxView } from "../../../utils/drop/view.js";
|
|
|
23
23
|
import { claimProofFor } from "../../../utils/drop/claim-proof.js";
|
|
24
24
|
import { manageDrop, mintDrop, saveExclusiveContent } from "../../../utils/drop/actions.js";
|
|
25
25
|
function DropPage(props) {
|
|
26
|
-
const { contract, getClient,
|
|
26
|
+
const { contract, getClient, walletAddress } = props;
|
|
27
27
|
const { drop: indexed, isLoading } = useDrop(getClient, contract);
|
|
28
|
-
const chain = useDropChain(
|
|
28
|
+
const chain = useDropChain(getClient, contract, walletAddress);
|
|
29
29
|
const { mints, mutate: refreshMints } = useDropMints(getClient, contract);
|
|
30
30
|
const feeBps = useDropFee(getClient);
|
|
31
31
|
const collectionFile = useDropFile(getClient, indexed?.baseUri ?? null, "collection.json");
|
|
@@ -58,7 +58,7 @@ function DropPage(props) {
|
|
|
58
58
|
const isOrganizer = !!walletAddress && !!onchain && BigInt(walletAddress) === BigInt(onchain.organizer);
|
|
59
59
|
const art = firstToken?.image ?? indexed?.image ?? null;
|
|
60
60
|
const name = indexed?.name ?? "Drop";
|
|
61
|
-
const deps = async () => ({ client: getClient(),
|
|
61
|
+
const deps = async () => ({ client: getClient(), signer: await props.getSigner() });
|
|
62
62
|
const onAction = () => {
|
|
63
63
|
if (!view) return;
|
|
64
64
|
if (view.button.action === "sign-in") props.onRequireWallet();
|
|
@@ -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 { 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":[]}
|
|
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, walletAddress } = props;\n const { drop: indexed, isLoading } = useDrop(getClient, contract);\n const chain = useDropChain(getClient, 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(), 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":[]}
|
|
@@ -202,7 +202,6 @@ function FastMint(props) {
|
|
|
202
202
|
getUploadToken,
|
|
203
203
|
getSigner,
|
|
204
204
|
client,
|
|
205
|
-
provider,
|
|
206
205
|
successFooter
|
|
207
206
|
} = props;
|
|
208
207
|
const [status, setStatus] = (0, import_react.useState)("idle");
|
|
@@ -412,7 +411,7 @@ function FastMint(props) {
|
|
|
412
411
|
description: newCollectionDescription || void 0,
|
|
413
412
|
image
|
|
414
413
|
});
|
|
415
|
-
await (0, import_starknet.executeIntent)(
|
|
414
|
+
await (0, import_starknet.executeIntent)(signer, client, intentRes2.data);
|
|
416
415
|
const found = await pollForNewCollection(newCollectionName, newCollectionSymbol);
|
|
417
416
|
if (!found) throw new Error("Collection created, but it's still indexing \u2014 try minting again in a moment from My Collections.");
|
|
418
417
|
collectionId = found.collectionId;
|
|
@@ -425,7 +424,7 @@ function FastMint(props) {
|
|
|
425
424
|
tokenUri,
|
|
426
425
|
royaltyBps: Math.round(values.royalty * 100)
|
|
427
426
|
});
|
|
428
|
-
result = await (0, import_starknet.executeIntent)(
|
|
427
|
+
result = await (0, import_starknet.executeIntent)(signer, client, intentRes.data);
|
|
429
428
|
finalContractAddress = contractAddress;
|
|
430
429
|
if (finalContractAddress) {
|
|
431
430
|
finalTokenId = (0, import_starknet.mintedTokenIdFromReceipt)(result.receipt, finalContractAddress);
|
|
@@ -442,7 +441,7 @@ function FastMint(props) {
|
|
|
442
441
|
baseUri: "",
|
|
443
442
|
service: "mip-erc1155"
|
|
444
443
|
});
|
|
445
|
-
const deployResult = await (0, import_starknet.executeIntent)(
|
|
444
|
+
const deployResult = await (0, import_starknet.executeIntent)(signer, client, intentRes2.data);
|
|
446
445
|
const deployed = (0, import_starknet.deployedCollectionFromReceipt)(deployResult.receipt, "mip-erc1155");
|
|
447
446
|
if (!deployed) throw new Error("Collection deployed, but its address couldn't be read \u2014 check My Collections to mint into it.");
|
|
448
447
|
collectionContract = deployed;
|
|
@@ -455,7 +454,7 @@ function FastMint(props) {
|
|
|
455
454
|
value: editionCount,
|
|
456
455
|
royaltyBps: Math.round(values.royalty * 100)
|
|
457
456
|
});
|
|
458
|
-
result = await (0, import_starknet.executeIntent)(
|
|
457
|
+
result = await (0, import_starknet.executeIntent)(signer, client, intentRes.data);
|
|
459
458
|
finalContractAddress = collectionContract;
|
|
460
459
|
finalTokenId = (0, import_starknet.mintedTokenIdFromReceipt)(result.receipt, collectionContract);
|
|
461
460
|
}
|