@medialane/ui 0.258.0 → 0.259.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/comments-section.cjs +5 -4
- package/dist/components/comments-section.cjs.map +1 -1
- package/dist/components/comments-section.js +5 -4
- package/dist/components/comments-section.js.map +1 -1
- package/dist/components/launchpad/coin-create.cjs +9 -7
- package/dist/components/launchpad/coin-create.cjs.map +1 -1
- package/dist/components/launchpad/coin-create.js +9 -7
- package/dist/components/launchpad/coin-create.js.map +1 -1
- package/dist/components/launchpad/collection-create-form.cjs +11 -14
- package/dist/components/launchpad/collection-create-form.cjs.map +1 -1
- package/dist/components/launchpad/collection-create-form.js +12 -15
- package/dist/components/launchpad/collection-create-form.js.map +1 -1
- package/dist/components/launchpad/collection-create-presets.cjs +8 -8
- package/dist/components/launchpad/collection-create-presets.cjs.map +1 -1
- package/dist/components/launchpad/collection-create-presets.d.cts +2 -1
- package/dist/components/launchpad/collection-create-presets.d.ts +2 -1
- package/dist/components/launchpad/collection-create-presets.js +8 -8
- package/dist/components/launchpad/collection-create-presets.js.map +1 -1
- package/dist/components/launchpad/edition-mint.cjs +9 -7
- package/dist/components/launchpad/edition-mint.cjs.map +1 -1
- package/dist/components/launchpad/edition-mint.js +9 -7
- package/dist/components/launchpad/edition-mint.js.map +1 -1
- package/dist/components/launchpad/pop-create.cjs +5 -6
- package/dist/components/launchpad/pop-create.cjs.map +1 -1
- package/dist/components/launchpad/pop-create.js +5 -6
- package/dist/components/launchpad/pop-create.js.map +1 -1
- package/dist/components/launchpad/remix-mint.cjs +9 -7
- package/dist/components/launchpad/remix-mint.cjs.map +1 -1
- package/dist/components/launchpad/remix-mint.js +9 -7
- package/dist/components/launchpad/remix-mint.js.map +1 -1
- package/dist/components/launchpad/single-edition-mint.cjs +9 -7
- package/dist/components/launchpad/single-edition-mint.cjs.map +1 -1
- package/dist/components/launchpad/single-edition-mint.js +9 -7
- package/dist/components/launchpad/single-edition-mint.js.map +1 -1
- package/dist/components/launchpad/sponsorship-create.cjs +5 -6
- package/dist/components/launchpad/sponsorship-create.cjs.map +1 -1
- package/dist/components/launchpad/sponsorship-create.js +5 -6
- package/dist/components/launchpad/sponsorship-create.js.map +1 -1
- package/dist/components/launchpad/tier-mint-form.cjs +5 -6
- package/dist/components/launchpad/tier-mint-form.cjs.map +1 -1
- package/dist/components/launchpad/tier-mint-form.js +5 -6
- package/dist/components/launchpad/tier-mint-form.js.map +1 -1
- package/dist/components/launchpad/tier-mint-presets.cjs +2 -2
- package/dist/components/launchpad/tier-mint-presets.cjs.map +1 -1
- package/dist/components/launchpad/tier-mint-presets.d.cts +2 -1
- package/dist/components/launchpad/tier-mint-presets.d.ts +2 -1
- package/dist/components/launchpad/tier-mint-presets.js +2 -2
- package/dist/components/launchpad/tier-mint-presets.js.map +1 -1
- package/dist/components/marketplace-dialog-primitives.cjs +0 -30
- package/dist/components/marketplace-dialog-primitives.cjs.map +1 -1
- package/dist/components/marketplace-dialog-primitives.d.cts +1 -12
- package/dist/components/marketplace-dialog-primitives.d.ts +1 -12
- package/dist/components/marketplace-dialog-primitives.js +1 -30
- package/dist/components/marketplace-dialog-primitives.js.map +1 -1
- package/dist/components/pop-claim-button.cjs +5 -4
- package/dist/components/pop-claim-button.cjs.map +1 -1
- package/dist/components/pop-claim-button.js +5 -4
- package/dist/components/pop-claim-button.js.map +1 -1
- package/dist/components/pop-manage-page.cjs +2 -2
- package/dist/components/pop-manage-page.cjs.map +1 -1
- package/dist/components/pop-manage-page.js +2 -2
- package/dist/components/pop-manage-page.js.map +1 -1
- package/dist/components/portfolio-sponsorships.cjs +2 -2
- package/dist/components/portfolio-sponsorships.cjs.map +1 -1
- package/dist/components/portfolio-sponsorships.js +2 -2
- package/dist/components/portfolio-sponsorships.js.map +1 -1
- package/dist/components/sponsorship-offer-page.cjs +5 -4
- package/dist/components/sponsorship-offer-page.cjs.map +1 -1
- package/dist/components/sponsorship-offer-page.js +5 -4
- package/dist/components/sponsorship-offer-page.js.map +1 -1
- package/dist/components/{creation-success.cjs → transaction-success.cjs} +14 -15
- package/dist/components/transaction-success.cjs.map +1 -0
- package/dist/components/transaction-success.d.cts +20 -0
- package/dist/components/transaction-success.d.ts +20 -0
- package/dist/components/{creation-success.js → transaction-success.js} +10 -11
- package/dist/components/transaction-success.js.map +1 -0
- package/dist/components/transfer-collection-ownership.cjs +5 -4
- package/dist/components/transfer-collection-ownership.cjs.map +1 -1
- package/dist/components/transfer-collection-ownership.js +5 -4
- package/dist/components/transfer-collection-ownership.js.map +1 -1
- package/dist/index.cjs +6 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +4 -6
- package/dist/index.js.map +1 -1
- package/dist/utils/success-messages.cjs +54 -0
- package/dist/utils/success-messages.cjs.map +1 -0
- package/dist/utils/success-messages.d.cts +31 -0
- package/dist/utils/success-messages.d.ts +31 -0
- package/dist/utils/success-messages.js +30 -0
- package/dist/utils/success-messages.js.map +1 -0
- package/package.json +3 -3
- package/dist/components/creation-success.cjs.map +0 -1
- package/dist/components/creation-success.d.cts +0 -20
- package/dist/components/creation-success.d.ts +0 -20
- package/dist/components/creation-success.js.map +0 -1
- package/dist/components/transaction-done.cjs +0 -46
- package/dist/components/transaction-done.cjs.map +0 -1
- package/dist/components/transaction-done.d.cts +0 -18
- package/dist/components/transaction-done.d.ts +0 -18
- package/dist/components/transaction-done.js +0 -22
- package/dist/components/transaction-done.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/launchpad/sponsorship-create.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, type ReactNode } from \"react\";\nimport { AlertCircle, CheckCircle2, Handshake, Loader2, X } from \"lucide-react\";\nimport { SUPPORTED_TOKENS, getTokenBySymbol } from \"@medialane/sdk\";\nimport { Button } from \"../button.js\";\nimport { AssetPicker, type OwnedAsset } from \"../asset-picker.js\";\nimport { AssetSearchPicker } from \"../asset-search-picker.js\";\nimport { LicenseTermsBuilder, EMPTY_SPONSORSHIP_TERMS, toDurationDays, toLicenseMetadata, type SponsorshipTerms } from \"../license-terms-builder.js\";\nimport { ClaimRouteShell } from \"../claim-route-shell.js\";\nimport { CreationSuccess } from \"../creation-success.js\";\nimport { TransactionDialog } from \"../transaction-dialog.js\";\nimport { WalletRequired } from \"../wallet-required.js\";\nimport { useMedialaneApp } from \"../medialane-app.js\";\nimport { RewardEarned } from \"../rewards/reward-earned.js\";\nimport { runIntentCalls } from \"../../utils/run-intent-calls.js\";\nimport { uploadJsonToIpfs } from \"../../utils/ipfs-upload.js\";\nimport { useImageUrl } from \"../../utils/use-image-url.js\";\nimport { useTokensByOwner } from \"../../utils/use-tokens.js\";\nimport { usePendingProposalsForAsset } from \"../../utils/use-sponsorship.js\";\nimport { useTransaction } from \"../../utils/use-transaction.js\";\nimport { shortenAddress } from \"../../utils/address.js\";\n\ntype Mode = \"offer\" | \"propose\";\n\nconst TOKEN_SYMBOLS = SUPPORTED_TOKENS.filter((t) => t.listable).map((t) => t.symbol);\n\nfunction PendingProposalsPanel({ nftContract }: { nftContract: string }) {\n const app = useMedialaneApp();\n const walletAddress = app.walletAddress;\n const { proposals, isLoading, mutate } = usePendingProposalsForAsset(nftContract);\n const tx = useTransaction();\n const [activeId, setActiveId] = useState<string | null>(null);\n const busy = tx.phase === \"preparing\" || tx.phase === \"submitting\" || tx.phase === \"confirming\";\n\n const respond = (proposalId: string, decision: \"accept\" | \"reject\") => {\n if (!walletAddress) return;\n setActiveId(proposalId);\n void tx\n .run(async (signer) => {\n const api = app.getClient().api;\n await runIntentCalls(signer, () =>\n decision === \"accept\"\n ? api.intents.create(\"sponsorship-proposal-accept\", { owner: walletAddress, proposalId })\n : api.intents.create(\"sponsorship-proposal-reject\", { owner: walletAddress, proposalId }),\n );\n await mutate();\n })\n .finally(() => setActiveId(null));\n };\n\n if (isLoading || proposals.length === 0) return null;\n\n return (\n <div className=\"rounded-xl border border-border bg-card p-4 space-y-3\">\n <p className=\"text-sm font-semibold\">Pending proposals</p>\n {proposals.map((p) => (\n <div key={p.proposalId} className=\"flex items-center justify-between gap-3 text-sm\">\n <span className=\"truncate text-muted-foreground\">{shortenAddress(p.proposer)} — {p.amount}</span>\n <div className=\"flex gap-2 shrink-0\">\n <Button size=\"sm\" variant=\"outline\" disabled={busy} onClick={() => respond(p.proposalId, \"reject\")}>\n {busy && activeId === p.proposalId ? <Loader2 className=\"h-3 w-3 animate-spin\" /> : <X className=\"h-3 w-3\" />}\n Decline\n </Button>\n <Button size=\"sm\" className=\"bg-brand-rose hover:brightness-110 text-white\" disabled={busy} onClick={() => respond(p.proposalId, \"accept\")}>\n {busy && activeId === p.proposalId ? <Loader2 className=\"h-3 w-3 animate-spin\" /> : <CheckCircle2 className=\"h-3 w-3\" />}\n Accept\n </Button>\n </div>\n </div>\n ))}\n {tx.phase === \"error\" && (\n <div className=\"flex items-center gap-2 text-xs text-destructive\" role=\"alert\">\n <AlertCircle className=\"h-3.5 w-3.5\" />\n {tx.error}\n <button type=\"button\" className=\"underline\" onClick={tx.reset}>Dismiss</button>\n </div>\n )}\n </div>\n );\n}\n\nexport function SponsorshipCreate({ aside }: { aside?: ReactNode }) {\n const app = useMedialaneApp();\n const walletAddress = app.walletAddress;\n const resolveImage = useImageUrl();\n const tx = useTransaction();\n const [formError, setFormError] = useState<string | null>(null);\n const [mode, setMode] = useState<Mode>(\"propose\");\n const [selectedAsset, setSelectedAsset] = useState<OwnedAsset | null>(null);\n const [proposeAsset, setProposeAsset] = useState<OwnedAsset | null>(null);\n const [terms, setTerms] = useState<SponsorshipTerms>({ ...EMPTY_SPONSORSHIP_TERMS, paymentTokenSymbol: \"USDC\" });\n const busy = tx.phase !== \"idle\";\n\n const { tokens: ownedTokens, isLoading: assetsLoading } = useTokensByOwner(walletAddress ?? null, 1, 100);\n const ownedAssets: OwnedAsset[] = ownedTokens.map((t) => ({\n contractAddress: t.contractAddress,\n tokenId: t.tokenId,\n name: t.metadata?.name ?? `Token #${t.tokenId}`,\n image: resolveImage(t.metadata?.image),\n }));\n\n const searchAssets = async (query: string): Promise<OwnedAsset[]> => {\n const res = await app.getClient().api.search(query, 16);\n return res.data.tokens.map((t) => ({\n contractAddress: t.contractAddress,\n tokenId: t.tokenId,\n name: t.name ?? `Token #${t.tokenId}`,\n image: resolveImage(t.image),\n }));\n };\n\n const chosen = mode === \"offer\" ? selectedAsset : proposeAsset;\n\n const onSubmit = () => {\n setFormError(null);\n if (!walletAddress) return setFormError(\"Your account isn't ready yet. Refresh the page and try again.\");\n if (!chosen) return setFormError(mode === \"offer\" ? \"Choose which asset you're offering.\" : \"Search for the asset you want to sponsor, then pick it.\");\n if (!terms.amount || Number(terms.amount) <= 0) return setFormError(\"Add an amount before continuing.\");\n const token = getTokenBySymbol(terms.paymentTokenSymbol);\n if (!token) return setFormError(\"Pick a currency.\");\n const durationDays = toDurationDays(terms);\n if (!durationDays) return setFormError(\"Choose how long the license should last.\");\n\n void tx.run(async (signer) => {\n await app.ensureSignedIn?.();\n const api = app.getClient().api;\n const licenseTermsUri = await uploadJsonToIpfs(api, toLicenseMetadata(terms));\n const amount = BigInt(Math.round(Number(terms.amount) * 10 ** token.decimals)).toString();\n const duration = durationDays * 86400;\n const royaltyBps = Math.round(Number(terms.royaltyPercent || \"0\") * 100);\n await runIntentCalls(signer, () =>\n mode === \"offer\"\n ? api.intents.create(\"sponsorship-offer\", {\n author: walletAddress, nftContract: chosen.contractAddress, tokenId: chosen.tokenId, minAmount: amount,\n duration, paymentToken: token.address, licenseTermsUri, transferable: terms.transferable, royaltyBps,\n })\n : api.intents.create(\"sponsorship-proposal\", {\n proposer: walletAddress, nftContract: chosen.contractAddress, tokenId: chosen.tokenId, amount,\n duration, paymentToken: token.address, licenseTermsUri, transferable: terms.transferable, royaltyBps,\n }),\n );\n });\n };\n\n const handleAgain = () => {\n tx.reset();\n setSelectedAsset(null);\n setProposeAsset(null);\n setTerms({ ...EMPTY_SPONSORSHIP_TERMS, paymentTokenSymbol: \"USDC\" });\n };\n\n return (\n <WalletRequired\n icon={Handshake}\n iconClassName=\"text-brand-rose\"\n title=\"Secure your account to set up a sponsorship\"\n description=\"Secure your account to publish onchain.\"\n >\n <ClaimRouteShell\n icon={<Handshake className=\"h-4 w-4 text-white\" />}\n title=\"Set up a sponsorship\"\n subtitle=\"Found IP you'd like to back? Propose terms directly to its owner. Own something worth sponsoring? Post it and let sponsors bid.\"\n aside={aside}\n >\n <div className=\"space-y-6\">\n <div className=\"inline-flex rounded-full border border-border p-1 bg-card\">\n {([\"offer\", \"propose\"] as const).map((m) => (\n <button\n key={m}\n type=\"button\"\n onClick={() => setMode(m)}\n className={\n mode === m\n ? \"px-4 py-1.5 rounded-full text-sm font-semibold bg-gradient-to-r from-brand-purple to-brand-blue text-white\"\n : \"px-4 py-1.5 rounded-full text-sm font-semibold text-muted-foreground\"\n }\n >\n {m === \"offer\" ? \"Offer my asset\" : \"Propose to sponsor\"}\n </button>\n ))}\n </div>\n\n {mode === \"offer\" ? (\n <div className=\"space-y-2\">\n <p className=\"text-sm font-semibold\">Pick an asset you own</p>\n <AssetPicker\n assets={ownedAssets}\n isLoading={assetsLoading}\n selected={selectedAsset}\n onSelect={setSelectedAsset}\n emptyStateHref=\"/launchpad/single-editions\"\n emptyStateLabel=\"Create one\"\n />\n {selectedAsset ? <PendingProposalsPanel nftContract={selectedAsset.contractAddress} /> : null}\n </div>\n ) : (\n <div className=\"space-y-2\">\n <p className=\"text-sm font-semibold\">Which asset do you want to sponsor?</p>\n <AssetSearchPicker search={searchAssets} selected={proposeAsset} onSelect={setProposeAsset} placeholder=\"Search by asset name or creator\" />\n </div>\n )}\n\n <div className=\"pt-2 border-t border-border/30\">\n <LicenseTermsBuilder\n value={terms}\n onChange={setTerms}\n tokenOptions={TOKEN_SYMBOLS}\n amountLabel={mode === \"offer\" ? \"Minimum accepted bid\" : \"Amount you'll pay\"}\n disabled={busy}\n />\n </div>\n\n {formError && <p role=\"alert\" className=\"text-sm text-destructive\">{formError}</p>}\n\n <div className=\"btn-border-animated p-[1px] rounded-2xl\">\n <button\n type=\"button\"\n disabled={busy}\n onClick={onSubmit}\n className=\"w-full h-12 rounded-[15px] flex items-center justify-center gap-2 text-base font-semibold text-white bg-transparent transition-all hover:brightness-110 active:scale-[0.98] disabled:opacity-50\"\n >\n <Handshake className=\"h-4 w-4\" />\n {mode === \"offer\" ? \"Create Offer\" : \"Send proposal\"}\n </button>\n </div>\n </div>\n </ClaimRouteShell>\n\n <TransactionDialog\n tx={tx}\n title={mode === \"offer\" ? \"Create sponsorship offer\" : \"Send proposal\"}\n workingLabel={mode === \"offer\" ? \"Creating your sponsorship offer…\" : \"Sending your proposal…\"}\n firstStepLabel=\"Upload license terms\"\n >\n <CreationSuccess\n name={chosen?.name ?? \"Your sponsorship\"}\n image={chosen?.image ?? null}\n caption={mode === \"offer\" ? \"Your offer is live\" : \"Your proposal is sent\"}\n primary={{ href: \"/launchpad/sponsorship\", label: \"Back to Sponsorship launchpad\" }}\n onAgain={handleAgain}\n againLabel=\"Create another\"\n >\n {mode === \"offer\" && <RewardEarned actionType=\"create_sponsorship_offer\" />}\n </CreationSuccess>\n </TransactionDialog>\n </WalletRequired>\n );\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/launchpad/sponsorship-create.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, type ReactNode } from \"react\";\nimport { AlertCircle, CheckCircle2, Handshake, Loader2, X } from \"lucide-react\";\nimport { SUPPORTED_TOKENS, getTokenBySymbol } from \"@medialane/sdk\";\nimport { Button } from \"../button.js\";\nimport { AssetPicker, type OwnedAsset } from \"../asset-picker.js\";\nimport { AssetSearchPicker } from \"../asset-search-picker.js\";\nimport { LicenseTermsBuilder, EMPTY_SPONSORSHIP_TERMS, toDurationDays, toLicenseMetadata, type SponsorshipTerms } from \"../license-terms-builder.js\";\nimport { ClaimRouteShell } from \"../claim-route-shell.js\";\nimport { TransactionSuccess } from \"../transaction-success.js\";\nimport { TransactionDialog } from \"../transaction-dialog.js\";\nimport { WalletRequired } from \"../wallet-required.js\";\nimport { useMedialaneApp } from \"../medialane-app.js\";\nimport { RewardEarned } from \"../rewards/reward-earned.js\";\nimport { runIntentCalls } from \"../../utils/run-intent-calls.js\";\nimport { uploadJsonToIpfs } from \"../../utils/ipfs-upload.js\";\nimport { useImageUrl } from \"../../utils/use-image-url.js\";\nimport { useTokensByOwner } from \"../../utils/use-tokens.js\";\nimport { usePendingProposalsForAsset } from \"../../utils/use-sponsorship.js\";\nimport { useTransaction } from \"../../utils/use-transaction.js\";\nimport { shortenAddress } from \"../../utils/address.js\";\n\ntype Mode = \"offer\" | \"propose\";\n\nconst TOKEN_SYMBOLS = SUPPORTED_TOKENS.filter((t) => t.listable).map((t) => t.symbol);\n\nfunction PendingProposalsPanel({ nftContract }: { nftContract: string }) {\n const app = useMedialaneApp();\n const walletAddress = app.walletAddress;\n const { proposals, isLoading, mutate } = usePendingProposalsForAsset(nftContract);\n const tx = useTransaction();\n const [activeId, setActiveId] = useState<string | null>(null);\n const busy = tx.phase === \"preparing\" || tx.phase === \"submitting\" || tx.phase === \"confirming\";\n\n const respond = (proposalId: string, decision: \"accept\" | \"reject\") => {\n if (!walletAddress) return;\n setActiveId(proposalId);\n void tx\n .run(async (signer) => {\n const api = app.getClient().api;\n await runIntentCalls(signer, () =>\n decision === \"accept\"\n ? api.intents.create(\"sponsorship-proposal-accept\", { owner: walletAddress, proposalId })\n : api.intents.create(\"sponsorship-proposal-reject\", { owner: walletAddress, proposalId }),\n );\n await mutate();\n })\n .finally(() => setActiveId(null));\n };\n\n if (isLoading || proposals.length === 0) return null;\n\n return (\n <div className=\"rounded-xl border border-border bg-card p-4 space-y-3\">\n <p className=\"text-sm font-semibold\">Pending proposals</p>\n {proposals.map((p) => (\n <div key={p.proposalId} className=\"flex items-center justify-between gap-3 text-sm\">\n <span className=\"truncate text-muted-foreground\">{shortenAddress(p.proposer)} — {p.amount}</span>\n <div className=\"flex gap-2 shrink-0\">\n <Button size=\"sm\" variant=\"outline\" disabled={busy} onClick={() => respond(p.proposalId, \"reject\")}>\n {busy && activeId === p.proposalId ? <Loader2 className=\"h-3 w-3 animate-spin\" /> : <X className=\"h-3 w-3\" />}\n Decline\n </Button>\n <Button size=\"sm\" className=\"bg-brand-rose hover:brightness-110 text-white\" disabled={busy} onClick={() => respond(p.proposalId, \"accept\")}>\n {busy && activeId === p.proposalId ? <Loader2 className=\"h-3 w-3 animate-spin\" /> : <CheckCircle2 className=\"h-3 w-3\" />}\n Accept\n </Button>\n </div>\n </div>\n ))}\n {tx.phase === \"error\" && (\n <div className=\"flex items-center gap-2 text-xs text-destructive\" role=\"alert\">\n <AlertCircle className=\"h-3.5 w-3.5\" />\n {tx.error}\n <button type=\"button\" className=\"underline\" onClick={tx.reset}>Dismiss</button>\n </div>\n )}\n </div>\n );\n}\n\nexport function SponsorshipCreate({ aside }: { aside?: ReactNode }) {\n const app = useMedialaneApp();\n const walletAddress = app.walletAddress;\n const resolveImage = useImageUrl();\n const tx = useTransaction();\n const [formError, setFormError] = useState<string | null>(null);\n const [mode, setMode] = useState<Mode>(\"propose\");\n const [selectedAsset, setSelectedAsset] = useState<OwnedAsset | null>(null);\n const [proposeAsset, setProposeAsset] = useState<OwnedAsset | null>(null);\n const [terms, setTerms] = useState<SponsorshipTerms>({ ...EMPTY_SPONSORSHIP_TERMS, paymentTokenSymbol: \"USDC\" });\n const busy = tx.phase !== \"idle\";\n\n const { tokens: ownedTokens, isLoading: assetsLoading } = useTokensByOwner(walletAddress ?? null, 1, 100);\n const ownedAssets: OwnedAsset[] = ownedTokens.map((t) => ({\n contractAddress: t.contractAddress,\n tokenId: t.tokenId,\n name: t.metadata?.name ?? `Token #${t.tokenId}`,\n image: resolveImage(t.metadata?.image),\n }));\n\n const searchAssets = async (query: string): Promise<OwnedAsset[]> => {\n const res = await app.getClient().api.search(query, 16);\n return res.data.tokens.map((t) => ({\n contractAddress: t.contractAddress,\n tokenId: t.tokenId,\n name: t.name ?? `Token #${t.tokenId}`,\n image: resolveImage(t.image),\n }));\n };\n\n const chosen = mode === \"offer\" ? selectedAsset : proposeAsset;\n\n const onSubmit = () => {\n setFormError(null);\n if (!walletAddress) return setFormError(\"Your account isn't ready yet. Refresh the page and try again.\");\n if (!chosen) return setFormError(mode === \"offer\" ? \"Choose which asset you're offering.\" : \"Search for the asset you want to sponsor, then pick it.\");\n if (!terms.amount || Number(terms.amount) <= 0) return setFormError(\"Add an amount before continuing.\");\n const token = getTokenBySymbol(terms.paymentTokenSymbol);\n if (!token) return setFormError(\"Pick a currency.\");\n const durationDays = toDurationDays(terms);\n if (!durationDays) return setFormError(\"Choose how long the license should last.\");\n\n void tx.run(async (signer) => {\n await app.ensureSignedIn?.();\n const api = app.getClient().api;\n const licenseTermsUri = await uploadJsonToIpfs(api, toLicenseMetadata(terms));\n const amount = BigInt(Math.round(Number(terms.amount) * 10 ** token.decimals)).toString();\n const duration = durationDays * 86400;\n const royaltyBps = Math.round(Number(terms.royaltyPercent || \"0\") * 100);\n await runIntentCalls(signer, () =>\n mode === \"offer\"\n ? api.intents.create(\"sponsorship-offer\", {\n author: walletAddress, nftContract: chosen.contractAddress, tokenId: chosen.tokenId, minAmount: amount,\n duration, paymentToken: token.address, licenseTermsUri, transferable: terms.transferable, royaltyBps,\n })\n : api.intents.create(\"sponsorship-proposal\", {\n proposer: walletAddress, nftContract: chosen.contractAddress, tokenId: chosen.tokenId, amount,\n duration, paymentToken: token.address, licenseTermsUri, transferable: terms.transferable, royaltyBps,\n }),\n );\n });\n };\n\n const handleAgain = () => {\n tx.reset();\n setSelectedAsset(null);\n setProposeAsset(null);\n setTerms({ ...EMPTY_SPONSORSHIP_TERMS, paymentTokenSymbol: \"USDC\" });\n };\n\n return (\n <WalletRequired\n icon={Handshake}\n iconClassName=\"text-brand-rose\"\n title=\"Secure your account to set up a sponsorship\"\n description=\"Secure your account to publish onchain.\"\n >\n <ClaimRouteShell\n icon={<Handshake className=\"h-4 w-4 text-white\" />}\n title=\"Set up a sponsorship\"\n subtitle=\"Found IP you'd like to back? Propose terms directly to its owner. Own something worth sponsoring? Post it and let sponsors bid.\"\n aside={aside}\n >\n <div className=\"space-y-6\">\n <div className=\"inline-flex rounded-full border border-border p-1 bg-card\">\n {([\"offer\", \"propose\"] as const).map((m) => (\n <button\n key={m}\n type=\"button\"\n onClick={() => setMode(m)}\n className={\n mode === m\n ? \"px-4 py-1.5 rounded-full text-sm font-semibold bg-gradient-to-r from-brand-purple to-brand-blue text-white\"\n : \"px-4 py-1.5 rounded-full text-sm font-semibold text-muted-foreground\"\n }\n >\n {m === \"offer\" ? \"Offer my asset\" : \"Propose to sponsor\"}\n </button>\n ))}\n </div>\n\n {mode === \"offer\" ? (\n <div className=\"space-y-2\">\n <p className=\"text-sm font-semibold\">Pick an asset you own</p>\n <AssetPicker\n assets={ownedAssets}\n isLoading={assetsLoading}\n selected={selectedAsset}\n onSelect={setSelectedAsset}\n emptyStateHref=\"/launchpad/single-editions\"\n emptyStateLabel=\"Create one\"\n />\n {selectedAsset ? <PendingProposalsPanel nftContract={selectedAsset.contractAddress} /> : null}\n </div>\n ) : (\n <div className=\"space-y-2\">\n <p className=\"text-sm font-semibold\">Which asset do you want to sponsor?</p>\n <AssetSearchPicker search={searchAssets} selected={proposeAsset} onSelect={setProposeAsset} placeholder=\"Search by asset name or creator\" />\n </div>\n )}\n\n <div className=\"pt-2 border-t border-border/30\">\n <LicenseTermsBuilder\n value={terms}\n onChange={setTerms}\n tokenOptions={TOKEN_SYMBOLS}\n amountLabel={mode === \"offer\" ? \"Minimum accepted bid\" : \"Amount you'll pay\"}\n disabled={busy}\n />\n </div>\n\n {formError && <p role=\"alert\" className=\"text-sm text-destructive\">{formError}</p>}\n\n <div className=\"btn-border-animated p-[1px] rounded-2xl\">\n <button\n type=\"button\"\n disabled={busy}\n onClick={onSubmit}\n className=\"w-full h-12 rounded-[15px] flex items-center justify-center gap-2 text-base font-semibold text-white bg-transparent transition-all hover:brightness-110 active:scale-[0.98] disabled:opacity-50\"\n >\n <Handshake className=\"h-4 w-4\" />\n {mode === \"offer\" ? \"Create Offer\" : \"Send proposal\"}\n </button>\n </div>\n </div>\n </ClaimRouteShell>\n\n <TransactionDialog\n tx={tx}\n title={mode === \"offer\" ? \"Create sponsorship offer\" : \"Send proposal\"}\n workingLabel={mode === \"offer\" ? \"Creating your sponsorship offer…\" : \"Sending your proposal…\"}\n firstStepLabel=\"Upload license terms\"\n >\n <TransactionSuccess\n name={chosen?.name ?? \"Your sponsorship\"}\n image={chosen?.image ?? null}\n title={mode === \"offer\" ? \"Offer created\" : \"Proposal sent\"}\n description={\n mode === \"offer\"\n ? \"The offer is recorded onchain with the asset and terms you chose.\"\n : \"The proposal is recorded onchain with the amount and duration you chose.\"\n }\n actions={[{ href: \"/launchpad/sponsorship\", label: \"Back to Sponsorship launchpad\" }, { label: \"Create another\", onClick: handleAgain }]}\n >\n {mode === \"offer\" && <RewardEarned actionType=\"create_sponsorship_offer\" />}\n </TransactionSuccess>\n </TransactionDialog>\n </WalletRequired>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -52,7 +52,7 @@ var import_collapsible = require("../collapsible.js");
|
|
|
52
52
|
var import_form = require("../form.js");
|
|
53
53
|
var import_create_form_primitives = require("../create-form-primitives.js");
|
|
54
54
|
var import_claim_route_shell = require("../claim-route-shell.js");
|
|
55
|
-
var
|
|
55
|
+
var import_transaction_success = require("../transaction-success.js");
|
|
56
56
|
var import_medialane_collection_card = require("../medialane-collection-card.js");
|
|
57
57
|
var import_transaction_dialog = require("../transaction-dialog.js");
|
|
58
58
|
var import_wallet_required = require("../wallet-required.js");
|
|
@@ -206,14 +206,13 @@ function TierMintForm({ contract: rawContract, preset, aside }) {
|
|
|
206
206
|
}
|
|
207
207
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_wallet_required.WalletRequired, { ...gateProps, children: [
|
|
208
208
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_transaction_dialog.TransactionDialog, { tx, title: preset.dialog.title, workingLabel: preset.dialog.workingLabel, firstStepLabel: preset.dialog.firstStepLabel, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
209
|
-
|
|
209
|
+
import_transaction_success.TransactionSuccess,
|
|
210
210
|
{
|
|
211
211
|
name: form.getValues("name"),
|
|
212
212
|
image: imagePreview,
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
againLabel: preset.success.againLabel,
|
|
213
|
+
title: preset.success.title,
|
|
214
|
+
description: preset.success.description,
|
|
215
|
+
actions: [{ href: (0, import_sdk.collectionHref)("STARKNET", contract), label: "View collection" }, { label: preset.success.againLabel, onClick: handleAgain }],
|
|
217
216
|
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_reward_earned.RewardEarned, { actionType: "launch_launchpad" })
|
|
218
217
|
}
|
|
219
218
|
) }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/launchpad/tier-mint-form.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState, type ReactNode } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport * as z from \"zod\";\nimport { AlertCircle, ChevronDown, ImagePlus, Loader2, ShieldCheck, X } from \"lucide-react\";\nimport { collectionHref, normalizeAddress, profileHref } from \"@medialane/sdk\";\nimport { acceptFor } from \"../../utils/upload-limits.js\";\nimport { FIELD_LIMITS } from \"../../utils/field-limits.js\";\nimport Image from \"../image.js\";\nimport Link from \"../link.js\";\nimport { Button } from \"../button.js\";\nimport { Input } from \"../input.js\";\nimport { Textarea } from \"../textarea.js\";\nimport { Skeleton } from \"../skeleton.js\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"../select.js\";\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from \"../collapsible.js\";\nimport { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage } from \"../form.js\";\nimport { ToggleGroup } from \"../create-form-primitives.js\";\nimport { ClaimRouteShell } from \"../claim-route-shell.js\";\nimport { CreationSuccess } from \"../creation-success.js\";\nimport { MedialaneCollectionCard } from \"../medialane-collection-card.js\";\nimport { TransactionDialog } from \"../transaction-dialog.js\";\nimport { WalletRequired } from \"../wallet-required.js\";\nimport { useMedialaneApp } from \"../medialane-app.js\";\nimport { RewardEarned } from \"../rewards/reward-earned.js\";\nimport { AI_POLICIES, DERIVATIVES_OPTIONS, LICENSE_TYPES } from \"../../data/ip.js\";\nimport { cn } from \"../../utils/cn.js\";\nimport { runIntentsCalls } from \"../../utils/run-intent-calls.js\";\nimport { pinAssetMetadata } from \"../../utils/ipfs-upload.js\";\nimport { useCollection } from \"../../utils/use-collections.js\";\nimport { useCollectionProfile } from \"../../utils/use-profiles.js\";\nimport { useTransaction } from \"../../utils/use-transaction.js\";\nimport { useLaunchpadImageUpload } from \"../../utils/use-launchpad-image-upload.js\";\nimport type { TierMintPreset } from \"./tier-mint-presets.js\";\n\nfunction dateToUnixTimestamp(dateStr: string | undefined): number | undefined {\n if (!dateStr) return undefined;\n const d = new Date(dateStr);\n if (isNaN(d.getTime())) return undefined;\n return Math.floor(d.getTime() / 1000);\n}\n\nfunction makeSchema(preset: TierMintPreset) {\n return z.object({\n name: z.string().min(1, preset.copy.nameRequired).max(FIELD_LIMITS.name),\n description: z.string().max(FIELD_LIMITS.description).optional(),\n external_url: z\n .string()\n .max(500)\n .refine((v) => !v || v.startsWith(\"http://\") || v.startsWith(\"https://\"), { message: \"Must start with http:// or https://\" })\n .optional(),\n maxSupply: z\n .string()\n .min(1, \"Supply required\")\n .regex(/^\\d+$/, \"Must be a positive integer\")\n .refine((v) => parseInt(v, 10) >= 1, \"Minimum supply is 1\"),\n royalty: z.coerce.number().min(0).max(50).default(2.5),\n licenseType: z.string().min(1),\n commercialUse: z.enum([\"Yes\", \"No\"]),\n derivatives: z.enum([\"Allowed\", \"Not Allowed\", \"Share-Alike\"]),\n attribution: z.enum([\"Required\", \"Not Required\"]),\n geographicScope: z.string(),\n aiPolicy: z.enum([\"Allowed\", \"Not Allowed\", \"Training Only\"]),\n startDate: z.string().optional(),\n endDate: z.string().optional(),\n imageUri: z.string().min(1, preset.copy.imageRequired),\n });\n}\ntype FormValues = z.infer<ReturnType<typeof makeSchema>>;\n\nexport interface TierMintFormProps {\n contract: string;\n preset: TierMintPreset;\n aside?: ReactNode;\n}\n\nexport function TierMintForm({ contract: rawContract, preset, aside }: TierMintFormProps) {\n const app = useMedialaneApp();\n const address = app.walletAddress;\n const contract = normalizeAddress(\"STARKNET\", rawContract);\n const { collection, isLoading } = useCollection(contract);\n const { profile, isLoading: profileLoading } = useCollectionProfile(preset.suggestExternalLink ? contract : undefined);\n const tx = useTransaction();\n const upload = useLaunchpadImageUpload({ successMessage: \"Image uploaded\" });\n const { imagePreview, imageUri, imageUploading, uploadError, fileInputRef, handleImageSelect, clearImage } = upload;\n const [licensingOpen, setLicensingOpen] = useState(false);\n const [advancedOpen, setAdvancedOpen] = useState(false);\n const Icon = preset.icon;\n\n const form = useForm<FormValues>({\n resolver: zodResolver(makeSchema(preset)),\n defaultValues: {\n name: \"\", imageUri: \"\", description: \"\", external_url: \"\",\n maxSupply: \"100\", royalty: 2.5, licenseType: \"CC BY-SA\", commercialUse: \"Yes\",\n derivatives: \"Share-Alike\", attribution: \"Required\", geographicScope: \"Worldwide\", aiPolicy: \"Not Allowed\",\n },\n });\n\n useEffect(() => {\n form.setValue(\"imageUri\", imageUri ?? \"\", { shouldValidate: !!imageUri });\n }, [imageUri, form]);\n\n useEffect(() => {\n if (!preset.suggestExternalLink || profileLoading) return;\n const suggested = profile?.slug ? `https://medialane.io/collection/${profile.slug}` : `https://medialane.io${collectionHref(\"STARKNET\", contract)}`;\n if (!form.getValues(\"external_url\")) form.setValue(\"external_url\", suggested);\n }, [contract, profileLoading, profile?.slug, form, preset.suggestExternalLink]);\n\n const isOwner = !!address && !!collection?.owner && normalizeAddress(\"STARKNET\", address) === normalizeAddress(\"STARKNET\", collection.owner);\n\n const handleAgain = () => {\n tx.reset();\n form.reset({ ...form.getValues(), name: \"\", description: \"\", maxSupply: \"100\" });\n clearImage();\n };\n\n const onSubmit = (values: FormValues) => {\n if (!address) return;\n void tx.run(async (signer) => {\n await app.ensureSignedIn?.();\n const api = app.getClient().api;\n const pinned = await pinAssetMetadata(api, {\n name: values.name,\n description: values.description ?? \"\",\n imageUri: imageUri!,\n externalUrl: values.external_url,\n ipType: \"NFT\",\n licenseType: values.licenseType,\n commercialUse: values.commercialUse,\n derivatives: values.derivatives,\n attribution: values.attribution,\n geographicScope: values.geographicScope,\n aiPolicy: values.aiPolicy,\n royalty: String(values.royalty),\n creator: address,\n templateTraits: [\n { traitType: \"Type\", value: preset.traitType },\n { traitType: \"Token Standard\", value: \"ERC-1155\" },\n { traitType: \"Max Supply\", value: values.maxSupply },\n { traitType: \"Collection Contract\", value: contract },\n ],\n });\n const tierId = await preset.predictNextId(api, contract);\n const tierRes = await api.intents.create(\"create-tier\", {\n owner: address,\n collection: contract,\n service: preset.service,\n maxSupply: values.maxSupply,\n startTime: dateToUnixTimestamp(values.startDate),\n endTime: dateToUnixTimestamp(values.endDate),\n royaltyBps: Math.round(values.royalty * 100),\n metadataUri: pinned.uri,\n });\n const mintRes = await api.intents.create(\"mint\", {\n owner: address,\n recipient: address,\n collectionContract: contract,\n tokenId: String(tierId),\n amount: values.maxSupply,\n });\n await runIntentsCalls(signer, [tierRes, mintRes]);\n });\n };\n\n const gateProps = { icon: Icon, iconClassName: preset.iconClass, title: preset.signedOut.title, description: preset.signedOut.description };\n const inputId = `mint-${preset.service}-file-input`;\n const busy = tx.phase !== \"idle\" || imageUploading;\n\n if (isLoading) {\n return (\n <WalletRequired {...gateProps}>\n <div className=\"max-w-5xl mx-auto px-4 pt-10 pb-16 space-y-4\">\n <Skeleton className=\"h-6 w-24\" />\n <Skeleton className=\"h-32 w-full rounded-2xl\" />\n <Skeleton className=\"h-64 w-full rounded-2xl\" />\n </div>\n </WalletRequired>\n );\n }\n\n if (!collection) {\n return (\n <WalletRequired {...gateProps}>\n <div className=\"max-w-xl mx-auto px-4 pt-24 pb-8 text-center space-y-4\">\n <AlertCircle className=\"h-10 w-10 text-muted-foreground/20 mx-auto\" />\n <p className=\"text-muted-foreground\">Collection not found.</p>\n <Button asChild variant=\"outline\" size=\"sm\"><Link href={preset.back.href}>{preset.back.label}</Link></Button>\n </div>\n </WalletRequired>\n );\n }\n\n if (!isOwner) {\n return (\n <WalletRequired {...gateProps}>\n <div className=\"max-w-xl mx-auto px-4 pt-24 pb-8 text-center space-y-4\">\n <Icon className=\"h-10 w-10 text-muted-foreground/20 mx-auto\" />\n <p className=\"text-muted-foreground\">{preset.notOwner.message}</p>\n <Button asChild variant=\"outline\" size=\"sm\"><Link href={preset.notOwner.back.href}>{preset.notOwner.back.label}</Link></Button>\n </div>\n </WalletRequired>\n );\n }\n\n return (\n <WalletRequired {...gateProps}>\n <TransactionDialog tx={tx} title={preset.dialog.title} workingLabel={preset.dialog.workingLabel} firstStepLabel={preset.dialog.firstStepLabel}>\n <CreationSuccess\n name={form.getValues(\"name\")}\n image={imagePreview}\n caption={preset.success.caption}\n primary={{ href: collectionHref(\"STARKNET\", contract), label: \"View collection\" }}\n onAgain={handleAgain}\n againLabel={preset.success.againLabel}\n >\n <RewardEarned actionType=\"launch_launchpad\" />\n </CreationSuccess>\n </TransactionDialog>\n\n <ClaimRouteShell\n icon={<Icon className=\"h-4 w-4 text-white\" />}\n title={preset.shell.title}\n subtitle={preset.shell.subtitle(collection.name ?? null)}\n aside={\n <>\n <MedialaneCollectionCard\n image={imagePreview}\n name={form.watch(\"name\")}\n collection={collection.symbol || preset.cardFallbackSymbol}\n creator={address ? `${address.slice(0, 6)}…${address.slice(-4)}` : undefined}\n creatorHref={address ? profileHref({ address }) : undefined}\n />\n {aside}\n </>\n }\n >\n <Form {...form}>\n <form onSubmit={form.handleSubmit(onSubmit)} className=\"space-y-5\">\n <div className=\"space-y-2\">\n <p className=\"text-sm font-medium\">{preset.copy.imageHeading} <span className=\"text-destructive\">*</span></p>\n <div className=\"flex items-center gap-4\">\n <div\n role=\"button\"\n tabIndex={0}\n onClick={() => !imageUploading && fileInputRef.current?.click()}\n onKeyDown={(e) => { if (e.key === \"Enter\") fileInputRef.current?.click(); }}\n className={cn(\"relative h-20 w-20 rounded-2xl border-2 border-dashed border-border bg-muted flex items-center justify-center overflow-hidden shrink-0 cursor-pointer transition-colors\", preset.hoverBorderClass)}\n >\n {imagePreview ? <Image src={imagePreview} alt={preset.copy.imageAlt} fill unoptimized className=\"object-cover\" /> : <ImagePlus className=\"h-6 w-6 text-muted-foreground\" />}\n {imageUploading && <div className=\"absolute inset-0 bg-background/70 flex items-center justify-center\"><Loader2 className=\"h-4 w-4 animate-spin\" /></div>}\n </div>\n <div className=\"space-y-1.5\">\n <input id={inputId} ref={fileInputRef} type=\"file\" accept={acceptFor(\"image\")} className=\"hidden\" onChange={(e) => { const f = e.target.files?.[0]; if (f) void handleImageSelect(f); }} />\n <Button type=\"button\" variant=\"outline\" size=\"sm\" disabled={imageUploading} onClick={() => fileInputRef.current?.click()}>\n {imageUploading ? <><Loader2 className=\"h-3.5 w-3.5 mr-1.5 animate-spin\" />Uploading…</> : imagePreview ? \"Change\" : \"Upload image\"}\n </Button>\n {imagePreview && (\n <button type=\"button\" onClick={clearImage} className=\"flex items-center gap-1 text-xs text-muted-foreground hover:text-destructive transition-colors\">\n <X className=\"h-3 w-3\" /> Remove\n </button>\n )}\n <p className=\"text-xs text-muted-foreground\">{imageUri ? <span className={preset.uploadedClass}>✓ Uploaded</span> : \"JPG, PNG, SVG or WebP\"}</p>\n </div>\n </div>\n </div>\n\n {(uploadError || form.formState.errors.imageUri) && (\n <p role=\"alert\" className=\"text-sm text-destructive\">{uploadError ?? form.formState.errors.imageUri?.message}</p>\n )}\n\n <FormField control={form.control} name=\"name\" render={({ field }) => (\n <FormItem>\n <FormLabel>{preset.copy.nameLabel} <span className=\"text-destructive\">*</span></FormLabel>\n <FormControl><Input placeholder={preset.copy.namePlaceholder} {...field} /></FormControl>\n <FormMessage />\n </FormItem>\n )} />\n\n <FormField control={form.control} name=\"description\" render={({ field }) => (\n <FormItem>\n <FormLabel>Description <span className=\"text-muted-foreground font-normal\">(optional)</span></FormLabel>\n <FormControl><Textarea placeholder={preset.copy.descriptionPlaceholder} rows={3} {...field} /></FormControl>\n <FormMessage />\n </FormItem>\n )} />\n\n <FormField control={form.control} name=\"external_url\" render={({ field }) => (\n <FormItem>\n <FormLabel>External link <span className=\"text-muted-foreground font-normal\">(optional)</span></FormLabel>\n <FormControl><Input placeholder=\"https://yourwebsite.com\" {...field} /></FormControl>\n <FormMessage />\n </FormItem>\n )} />\n\n <Collapsible open={licensingOpen} onOpenChange={setLicensingOpen}>\n <div className=\"sm:overflow-hidden sm:rounded-xl sm:border sm:border-border\">\n <CollapsibleTrigger asChild>\n <button type=\"button\" className=\"w-full flex items-center justify-between px-0 py-3 sm:px-5 sm:py-4 hover:bg-muted/30 transition-colors\">\n <div className=\"flex items-center gap-2\">\n <ShieldCheck className=\"h-4 w-4 text-primary\" />\n <span className=\"text-sm font-semibold\">Licensing Terms</span>\n <span className=\"text-xs text-muted-foreground font-normal\">Optional · Berne Convention</span>\n </div>\n <ChevronDown className={cn(\"h-4 w-4 text-muted-foreground transition-transform\", licensingOpen && \"rotate-180\")} />\n </button>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <div className=\"px-0 pb-4 sm:px-5 sm:pb-5 space-y-4 border-t border-border/60 pt-4\">\n <FormField control={form.control} name=\"licenseType\" render={({ field }) => (\n <FormItem>\n <FormLabel>License</FormLabel>\n <Select value={field.value} onValueChange={(value) => {\n form.setValue(\"licenseType\", value);\n const def = LICENSE_TYPES.find((l) => l.value === value);\n if (def) {\n form.setValue(\"commercialUse\", def.commercialUse);\n form.setValue(\"derivatives\", def.derivatives);\n form.setValue(\"attribution\", def.attribution);\n }\n }}>\n <FormControl><SelectTrigger><SelectValue /></SelectTrigger></FormControl>\n <SelectContent>{LICENSE_TYPES.map((l) => <SelectItem key={l.value} value={l.value}>{l.label}</SelectItem>)}</SelectContent>\n </Select>\n {(() => { const def = LICENSE_TYPES.find((l) => l.value === field.value); return def ? <p className=\"text-xs text-muted-foreground mt-1\">{def.description}</p> : null; })()}\n <FormMessage />\n </FormItem>\n )} />\n <FormField control={form.control} name=\"commercialUse\" render={({ field }) => (\n <FormItem><FormLabel>Commercial Use</FormLabel><ToggleGroup value={field.value} options={[\"Yes\", \"No\"]} onChange={field.onChange} /></FormItem>\n )} />\n <FormField control={form.control} name=\"derivatives\" render={({ field }) => (\n <FormItem><FormLabel>Derivatives</FormLabel><ToggleGroup value={field.value} options={DERIVATIVES_OPTIONS} onChange={field.onChange} /></FormItem>\n )} />\n <FormField control={form.control} name=\"attribution\" render={({ field }) => (\n <FormItem><FormLabel>Attribution</FormLabel><ToggleGroup value={field.value} options={[\"Required\", \"Not Required\"]} onChange={field.onChange} /></FormItem>\n )} />\n <Collapsible open={advancedOpen} onOpenChange={setAdvancedOpen}>\n <CollapsibleTrigger asChild>\n <button type=\"button\" className=\"flex items-center gap-1.5 text-xs text-muted-foreground hover:text-foreground transition-colors\">\n <ChevronDown className={cn(\"h-3.5 w-3.5 transition-transform\", advancedOpen && \"rotate-180\")} />\n Advanced options\n </button>\n </CollapsibleTrigger>\n <CollapsibleContent className=\"space-y-4 pt-3\">\n <FormField control={form.control} name=\"geographicScope\" render={({ field }) => (\n <FormItem>\n <FormLabel>Territory</FormLabel>\n <FormControl><Input placeholder=\"Worldwide\" {...field} /></FormControl>\n </FormItem>\n )} />\n <FormField control={form.control} name=\"aiPolicy\" render={({ field }) => (\n <FormItem><FormLabel>AI & Data Mining</FormLabel><ToggleGroup value={field.value} options={AI_POLICIES} onChange={field.onChange} /></FormItem>\n )} />\n </CollapsibleContent>\n </Collapsible>\n </div>\n </CollapsibleContent>\n </div>\n </Collapsible>\n\n <div className=\"grid grid-cols-2 gap-4\">\n <FormField control={form.control} name=\"maxSupply\" render={({ field }) => (\n <FormItem>\n <FormLabel>Supply <span className=\"text-destructive\">*</span></FormLabel>\n <FormControl><Input type=\"number\" min=\"1\" placeholder=\"100\" {...field} /></FormControl>\n <FormDescription>Minted to your account.</FormDescription>\n <FormMessage />\n </FormItem>\n )} />\n <FormField control={form.control} name=\"royalty\" render={({ field }) => (\n <FormItem>\n <FormLabel>Royalty % (0–50)</FormLabel>\n <FormControl><Input type=\"number\" min={0} max={50} step={0.5} placeholder=\"2.5\" {...field} onChange={(e) => field.onChange(parseFloat(e.target.value) || 0)} /></FormControl>\n <FormDescription>On secondary sales.</FormDescription>\n <FormMessage />\n </FormItem>\n )} />\n </div>\n\n <div className=\"grid grid-cols-2 gap-4\">\n <FormField control={form.control} name=\"startDate\" render={({ field }) => (\n <FormItem>\n <FormLabel>Valid from <span className=\"text-muted-foreground font-normal\">(optional)</span></FormLabel>\n <FormControl><Input type=\"datetime-local\" {...field} /></FormControl>\n <FormDescription>You can mint and sell before it opens.</FormDescription>\n <FormMessage />\n </FormItem>\n )} />\n <FormField control={form.control} name=\"endDate\" render={({ field }) => (\n <FormItem>\n <FormLabel>Valid until <span className=\"text-muted-foreground font-normal\">(optional)</span></FormLabel>\n <FormControl><Input type=\"datetime-local\" {...field} /></FormControl>\n <FormDescription>{preset.copy.validUntilHint}</FormDescription>\n <FormMessage />\n </FormItem>\n )} />\n </div>\n\n <button\n type=\"submit\"\n disabled={busy}\n className={`w-full h-12 text-base font-semibold text-white rounded-xl flex items-center justify-center gap-2 transition-all hover:brightness-110 active:scale-[0.98] ${preset.buttonClass} ${busy ? \"opacity-40 pointer-events-none\" : \"\"}`}\n >\n <Icon className=\"h-4 w-4 mr-2\" />\n {preset.copy.submit}\n </button>\n </form>\n </Form>\n </ClaimRouteShell>\n </WalletRequired>\n );\n}\n"],"mappings":"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","names":["Link","Image"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/launchpad/tier-mint-form.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState, type ReactNode } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport * as z from \"zod\";\nimport { AlertCircle, ChevronDown, ImagePlus, Loader2, ShieldCheck, X } from \"lucide-react\";\nimport { collectionHref, normalizeAddress, profileHref } from \"@medialane/sdk\";\nimport { acceptFor } from \"../../utils/upload-limits.js\";\nimport { FIELD_LIMITS } from \"../../utils/field-limits.js\";\nimport Image from \"../image.js\";\nimport Link from \"../link.js\";\nimport { Button } from \"../button.js\";\nimport { Input } from \"../input.js\";\nimport { Textarea } from \"../textarea.js\";\nimport { Skeleton } from \"../skeleton.js\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"../select.js\";\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from \"../collapsible.js\";\nimport { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage } from \"../form.js\";\nimport { ToggleGroup } from \"../create-form-primitives.js\";\nimport { ClaimRouteShell } from \"../claim-route-shell.js\";\nimport { TransactionSuccess } from \"../transaction-success.js\";\nimport { MedialaneCollectionCard } from \"../medialane-collection-card.js\";\nimport { TransactionDialog } from \"../transaction-dialog.js\";\nimport { WalletRequired } from \"../wallet-required.js\";\nimport { useMedialaneApp } from \"../medialane-app.js\";\nimport { RewardEarned } from \"../rewards/reward-earned.js\";\nimport { AI_POLICIES, DERIVATIVES_OPTIONS, LICENSE_TYPES } from \"../../data/ip.js\";\nimport { cn } from \"../../utils/cn.js\";\nimport { runIntentsCalls } from \"../../utils/run-intent-calls.js\";\nimport { pinAssetMetadata } from \"../../utils/ipfs-upload.js\";\nimport { useCollection } from \"../../utils/use-collections.js\";\nimport { useCollectionProfile } from \"../../utils/use-profiles.js\";\nimport { useTransaction } from \"../../utils/use-transaction.js\";\nimport { useLaunchpadImageUpload } from \"../../utils/use-launchpad-image-upload.js\";\nimport type { TierMintPreset } from \"./tier-mint-presets.js\";\n\nfunction dateToUnixTimestamp(dateStr: string | undefined): number | undefined {\n if (!dateStr) return undefined;\n const d = new Date(dateStr);\n if (isNaN(d.getTime())) return undefined;\n return Math.floor(d.getTime() / 1000);\n}\n\nfunction makeSchema(preset: TierMintPreset) {\n return z.object({\n name: z.string().min(1, preset.copy.nameRequired).max(FIELD_LIMITS.name),\n description: z.string().max(FIELD_LIMITS.description).optional(),\n external_url: z\n .string()\n .max(500)\n .refine((v) => !v || v.startsWith(\"http://\") || v.startsWith(\"https://\"), { message: \"Must start with http:// or https://\" })\n .optional(),\n maxSupply: z\n .string()\n .min(1, \"Supply required\")\n .regex(/^\\d+$/, \"Must be a positive integer\")\n .refine((v) => parseInt(v, 10) >= 1, \"Minimum supply is 1\"),\n royalty: z.coerce.number().min(0).max(50).default(2.5),\n licenseType: z.string().min(1),\n commercialUse: z.enum([\"Yes\", \"No\"]),\n derivatives: z.enum([\"Allowed\", \"Not Allowed\", \"Share-Alike\"]),\n attribution: z.enum([\"Required\", \"Not Required\"]),\n geographicScope: z.string(),\n aiPolicy: z.enum([\"Allowed\", \"Not Allowed\", \"Training Only\"]),\n startDate: z.string().optional(),\n endDate: z.string().optional(),\n imageUri: z.string().min(1, preset.copy.imageRequired),\n });\n}\ntype FormValues = z.infer<ReturnType<typeof makeSchema>>;\n\nexport interface TierMintFormProps {\n contract: string;\n preset: TierMintPreset;\n aside?: ReactNode;\n}\n\nexport function TierMintForm({ contract: rawContract, preset, aside }: TierMintFormProps) {\n const app = useMedialaneApp();\n const address = app.walletAddress;\n const contract = normalizeAddress(\"STARKNET\", rawContract);\n const { collection, isLoading } = useCollection(contract);\n const { profile, isLoading: profileLoading } = useCollectionProfile(preset.suggestExternalLink ? contract : undefined);\n const tx = useTransaction();\n const upload = useLaunchpadImageUpload({ successMessage: \"Image uploaded\" });\n const { imagePreview, imageUri, imageUploading, uploadError, fileInputRef, handleImageSelect, clearImage } = upload;\n const [licensingOpen, setLicensingOpen] = useState(false);\n const [advancedOpen, setAdvancedOpen] = useState(false);\n const Icon = preset.icon;\n\n const form = useForm<FormValues>({\n resolver: zodResolver(makeSchema(preset)),\n defaultValues: {\n name: \"\", imageUri: \"\", description: \"\", external_url: \"\",\n maxSupply: \"100\", royalty: 2.5, licenseType: \"CC BY-SA\", commercialUse: \"Yes\",\n derivatives: \"Share-Alike\", attribution: \"Required\", geographicScope: \"Worldwide\", aiPolicy: \"Not Allowed\",\n },\n });\n\n useEffect(() => {\n form.setValue(\"imageUri\", imageUri ?? \"\", { shouldValidate: !!imageUri });\n }, [imageUri, form]);\n\n useEffect(() => {\n if (!preset.suggestExternalLink || profileLoading) return;\n const suggested = profile?.slug ? `https://medialane.io/collection/${profile.slug}` : `https://medialane.io${collectionHref(\"STARKNET\", contract)}`;\n if (!form.getValues(\"external_url\")) form.setValue(\"external_url\", suggested);\n }, [contract, profileLoading, profile?.slug, form, preset.suggestExternalLink]);\n\n const isOwner = !!address && !!collection?.owner && normalizeAddress(\"STARKNET\", address) === normalizeAddress(\"STARKNET\", collection.owner);\n\n const handleAgain = () => {\n tx.reset();\n form.reset({ ...form.getValues(), name: \"\", description: \"\", maxSupply: \"100\" });\n clearImage();\n };\n\n const onSubmit = (values: FormValues) => {\n if (!address) return;\n void tx.run(async (signer) => {\n await app.ensureSignedIn?.();\n const api = app.getClient().api;\n const pinned = await pinAssetMetadata(api, {\n name: values.name,\n description: values.description ?? \"\",\n imageUri: imageUri!,\n externalUrl: values.external_url,\n ipType: \"NFT\",\n licenseType: values.licenseType,\n commercialUse: values.commercialUse,\n derivatives: values.derivatives,\n attribution: values.attribution,\n geographicScope: values.geographicScope,\n aiPolicy: values.aiPolicy,\n royalty: String(values.royalty),\n creator: address,\n templateTraits: [\n { traitType: \"Type\", value: preset.traitType },\n { traitType: \"Token Standard\", value: \"ERC-1155\" },\n { traitType: \"Max Supply\", value: values.maxSupply },\n { traitType: \"Collection Contract\", value: contract },\n ],\n });\n const tierId = await preset.predictNextId(api, contract);\n const tierRes = await api.intents.create(\"create-tier\", {\n owner: address,\n collection: contract,\n service: preset.service,\n maxSupply: values.maxSupply,\n startTime: dateToUnixTimestamp(values.startDate),\n endTime: dateToUnixTimestamp(values.endDate),\n royaltyBps: Math.round(values.royalty * 100),\n metadataUri: pinned.uri,\n });\n const mintRes = await api.intents.create(\"mint\", {\n owner: address,\n recipient: address,\n collectionContract: contract,\n tokenId: String(tierId),\n amount: values.maxSupply,\n });\n await runIntentsCalls(signer, [tierRes, mintRes]);\n });\n };\n\n const gateProps = { icon: Icon, iconClassName: preset.iconClass, title: preset.signedOut.title, description: preset.signedOut.description };\n const inputId = `mint-${preset.service}-file-input`;\n const busy = tx.phase !== \"idle\" || imageUploading;\n\n if (isLoading) {\n return (\n <WalletRequired {...gateProps}>\n <div className=\"max-w-5xl mx-auto px-4 pt-10 pb-16 space-y-4\">\n <Skeleton className=\"h-6 w-24\" />\n <Skeleton className=\"h-32 w-full rounded-2xl\" />\n <Skeleton className=\"h-64 w-full rounded-2xl\" />\n </div>\n </WalletRequired>\n );\n }\n\n if (!collection) {\n return (\n <WalletRequired {...gateProps}>\n <div className=\"max-w-xl mx-auto px-4 pt-24 pb-8 text-center space-y-4\">\n <AlertCircle className=\"h-10 w-10 text-muted-foreground/20 mx-auto\" />\n <p className=\"text-muted-foreground\">Collection not found.</p>\n <Button asChild variant=\"outline\" size=\"sm\"><Link href={preset.back.href}>{preset.back.label}</Link></Button>\n </div>\n </WalletRequired>\n );\n }\n\n if (!isOwner) {\n return (\n <WalletRequired {...gateProps}>\n <div className=\"max-w-xl mx-auto px-4 pt-24 pb-8 text-center space-y-4\">\n <Icon className=\"h-10 w-10 text-muted-foreground/20 mx-auto\" />\n <p className=\"text-muted-foreground\">{preset.notOwner.message}</p>\n <Button asChild variant=\"outline\" size=\"sm\"><Link href={preset.notOwner.back.href}>{preset.notOwner.back.label}</Link></Button>\n </div>\n </WalletRequired>\n );\n }\n\n return (\n <WalletRequired {...gateProps}>\n <TransactionDialog tx={tx} title={preset.dialog.title} workingLabel={preset.dialog.workingLabel} firstStepLabel={preset.dialog.firstStepLabel}>\n <TransactionSuccess\n name={form.getValues(\"name\")}\n image={imagePreview}\n title={preset.success.title}\n description={preset.success.description}\n actions={[{ href: collectionHref(\"STARKNET\", contract), label: \"View collection\" }, { label: preset.success.againLabel, onClick: handleAgain }]}\n >\n <RewardEarned actionType=\"launch_launchpad\" />\n </TransactionSuccess>\n </TransactionDialog>\n\n <ClaimRouteShell\n icon={<Icon className=\"h-4 w-4 text-white\" />}\n title={preset.shell.title}\n subtitle={preset.shell.subtitle(collection.name ?? null)}\n aside={\n <>\n <MedialaneCollectionCard\n image={imagePreview}\n name={form.watch(\"name\")}\n collection={collection.symbol || preset.cardFallbackSymbol}\n creator={address ? `${address.slice(0, 6)}…${address.slice(-4)}` : undefined}\n creatorHref={address ? profileHref({ address }) : undefined}\n />\n {aside}\n </>\n }\n >\n <Form {...form}>\n <form onSubmit={form.handleSubmit(onSubmit)} className=\"space-y-5\">\n <div className=\"space-y-2\">\n <p className=\"text-sm font-medium\">{preset.copy.imageHeading} <span className=\"text-destructive\">*</span></p>\n <div className=\"flex items-center gap-4\">\n <div\n role=\"button\"\n tabIndex={0}\n onClick={() => !imageUploading && fileInputRef.current?.click()}\n onKeyDown={(e) => { if (e.key === \"Enter\") fileInputRef.current?.click(); }}\n className={cn(\"relative h-20 w-20 rounded-2xl border-2 border-dashed border-border bg-muted flex items-center justify-center overflow-hidden shrink-0 cursor-pointer transition-colors\", preset.hoverBorderClass)}\n >\n {imagePreview ? <Image src={imagePreview} alt={preset.copy.imageAlt} fill unoptimized className=\"object-cover\" /> : <ImagePlus className=\"h-6 w-6 text-muted-foreground\" />}\n {imageUploading && <div className=\"absolute inset-0 bg-background/70 flex items-center justify-center\"><Loader2 className=\"h-4 w-4 animate-spin\" /></div>}\n </div>\n <div className=\"space-y-1.5\">\n <input id={inputId} ref={fileInputRef} type=\"file\" accept={acceptFor(\"image\")} className=\"hidden\" onChange={(e) => { const f = e.target.files?.[0]; if (f) void handleImageSelect(f); }} />\n <Button type=\"button\" variant=\"outline\" size=\"sm\" disabled={imageUploading} onClick={() => fileInputRef.current?.click()}>\n {imageUploading ? <><Loader2 className=\"h-3.5 w-3.5 mr-1.5 animate-spin\" />Uploading…</> : imagePreview ? \"Change\" : \"Upload image\"}\n </Button>\n {imagePreview && (\n <button type=\"button\" onClick={clearImage} className=\"flex items-center gap-1 text-xs text-muted-foreground hover:text-destructive transition-colors\">\n <X className=\"h-3 w-3\" /> Remove\n </button>\n )}\n <p className=\"text-xs text-muted-foreground\">{imageUri ? <span className={preset.uploadedClass}>✓ Uploaded</span> : \"JPG, PNG, SVG or WebP\"}</p>\n </div>\n </div>\n </div>\n\n {(uploadError || form.formState.errors.imageUri) && (\n <p role=\"alert\" className=\"text-sm text-destructive\">{uploadError ?? form.formState.errors.imageUri?.message}</p>\n )}\n\n <FormField control={form.control} name=\"name\" render={({ field }) => (\n <FormItem>\n <FormLabel>{preset.copy.nameLabel} <span className=\"text-destructive\">*</span></FormLabel>\n <FormControl><Input placeholder={preset.copy.namePlaceholder} {...field} /></FormControl>\n <FormMessage />\n </FormItem>\n )} />\n\n <FormField control={form.control} name=\"description\" render={({ field }) => (\n <FormItem>\n <FormLabel>Description <span className=\"text-muted-foreground font-normal\">(optional)</span></FormLabel>\n <FormControl><Textarea placeholder={preset.copy.descriptionPlaceholder} rows={3} {...field} /></FormControl>\n <FormMessage />\n </FormItem>\n )} />\n\n <FormField control={form.control} name=\"external_url\" render={({ field }) => (\n <FormItem>\n <FormLabel>External link <span className=\"text-muted-foreground font-normal\">(optional)</span></FormLabel>\n <FormControl><Input placeholder=\"https://yourwebsite.com\" {...field} /></FormControl>\n <FormMessage />\n </FormItem>\n )} />\n\n <Collapsible open={licensingOpen} onOpenChange={setLicensingOpen}>\n <div className=\"sm:overflow-hidden sm:rounded-xl sm:border sm:border-border\">\n <CollapsibleTrigger asChild>\n <button type=\"button\" className=\"w-full flex items-center justify-between px-0 py-3 sm:px-5 sm:py-4 hover:bg-muted/30 transition-colors\">\n <div className=\"flex items-center gap-2\">\n <ShieldCheck className=\"h-4 w-4 text-primary\" />\n <span className=\"text-sm font-semibold\">Licensing Terms</span>\n <span className=\"text-xs text-muted-foreground font-normal\">Optional · Berne Convention</span>\n </div>\n <ChevronDown className={cn(\"h-4 w-4 text-muted-foreground transition-transform\", licensingOpen && \"rotate-180\")} />\n </button>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <div className=\"px-0 pb-4 sm:px-5 sm:pb-5 space-y-4 border-t border-border/60 pt-4\">\n <FormField control={form.control} name=\"licenseType\" render={({ field }) => (\n <FormItem>\n <FormLabel>License</FormLabel>\n <Select value={field.value} onValueChange={(value) => {\n form.setValue(\"licenseType\", value);\n const def = LICENSE_TYPES.find((l) => l.value === value);\n if (def) {\n form.setValue(\"commercialUse\", def.commercialUse);\n form.setValue(\"derivatives\", def.derivatives);\n form.setValue(\"attribution\", def.attribution);\n }\n }}>\n <FormControl><SelectTrigger><SelectValue /></SelectTrigger></FormControl>\n <SelectContent>{LICENSE_TYPES.map((l) => <SelectItem key={l.value} value={l.value}>{l.label}</SelectItem>)}</SelectContent>\n </Select>\n {(() => { const def = LICENSE_TYPES.find((l) => l.value === field.value); return def ? <p className=\"text-xs text-muted-foreground mt-1\">{def.description}</p> : null; })()}\n <FormMessage />\n </FormItem>\n )} />\n <FormField control={form.control} name=\"commercialUse\" render={({ field }) => (\n <FormItem><FormLabel>Commercial Use</FormLabel><ToggleGroup value={field.value} options={[\"Yes\", \"No\"]} onChange={field.onChange} /></FormItem>\n )} />\n <FormField control={form.control} name=\"derivatives\" render={({ field }) => (\n <FormItem><FormLabel>Derivatives</FormLabel><ToggleGroup value={field.value} options={DERIVATIVES_OPTIONS} onChange={field.onChange} /></FormItem>\n )} />\n <FormField control={form.control} name=\"attribution\" render={({ field }) => (\n <FormItem><FormLabel>Attribution</FormLabel><ToggleGroup value={field.value} options={[\"Required\", \"Not Required\"]} onChange={field.onChange} /></FormItem>\n )} />\n <Collapsible open={advancedOpen} onOpenChange={setAdvancedOpen}>\n <CollapsibleTrigger asChild>\n <button type=\"button\" className=\"flex items-center gap-1.5 text-xs text-muted-foreground hover:text-foreground transition-colors\">\n <ChevronDown className={cn(\"h-3.5 w-3.5 transition-transform\", advancedOpen && \"rotate-180\")} />\n Advanced options\n </button>\n </CollapsibleTrigger>\n <CollapsibleContent className=\"space-y-4 pt-3\">\n <FormField control={form.control} name=\"geographicScope\" render={({ field }) => (\n <FormItem>\n <FormLabel>Territory</FormLabel>\n <FormControl><Input placeholder=\"Worldwide\" {...field} /></FormControl>\n </FormItem>\n )} />\n <FormField control={form.control} name=\"aiPolicy\" render={({ field }) => (\n <FormItem><FormLabel>AI & Data Mining</FormLabel><ToggleGroup value={field.value} options={AI_POLICIES} onChange={field.onChange} /></FormItem>\n )} />\n </CollapsibleContent>\n </Collapsible>\n </div>\n </CollapsibleContent>\n </div>\n </Collapsible>\n\n <div className=\"grid grid-cols-2 gap-4\">\n <FormField control={form.control} name=\"maxSupply\" render={({ field }) => (\n <FormItem>\n <FormLabel>Supply <span className=\"text-destructive\">*</span></FormLabel>\n <FormControl><Input type=\"number\" min=\"1\" placeholder=\"100\" {...field} /></FormControl>\n <FormDescription>Minted to your account.</FormDescription>\n <FormMessage />\n </FormItem>\n )} />\n <FormField control={form.control} name=\"royalty\" render={({ field }) => (\n <FormItem>\n <FormLabel>Royalty % (0–50)</FormLabel>\n <FormControl><Input type=\"number\" min={0} max={50} step={0.5} placeholder=\"2.5\" {...field} onChange={(e) => field.onChange(parseFloat(e.target.value) || 0)} /></FormControl>\n <FormDescription>On secondary sales.</FormDescription>\n <FormMessage />\n </FormItem>\n )} />\n </div>\n\n <div className=\"grid grid-cols-2 gap-4\">\n <FormField control={form.control} name=\"startDate\" render={({ field }) => (\n <FormItem>\n <FormLabel>Valid from <span className=\"text-muted-foreground font-normal\">(optional)</span></FormLabel>\n <FormControl><Input type=\"datetime-local\" {...field} /></FormControl>\n <FormDescription>You can mint and sell before it opens.</FormDescription>\n <FormMessage />\n </FormItem>\n )} />\n <FormField control={form.control} name=\"endDate\" render={({ field }) => (\n <FormItem>\n <FormLabel>Valid until <span className=\"text-muted-foreground font-normal\">(optional)</span></FormLabel>\n <FormControl><Input type=\"datetime-local\" {...field} /></FormControl>\n <FormDescription>{preset.copy.validUntilHint}</FormDescription>\n <FormMessage />\n </FormItem>\n )} />\n </div>\n\n <button\n type=\"submit\"\n disabled={busy}\n className={`w-full h-12 text-base font-semibold text-white rounded-xl flex items-center justify-center gap-2 transition-all hover:brightness-110 active:scale-[0.98] ${preset.buttonClass} ${busy ? \"opacity-40 pointer-events-none\" : \"\"}`}\n >\n <Icon className=\"h-4 w-4 mr-2\" />\n {preset.copy.submit}\n </button>\n </form>\n </Form>\n </ClaimRouteShell>\n </WalletRequired>\n );\n}\n"],"mappings":"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","names":["Link","Image"]}
|
|
@@ -19,7 +19,7 @@ import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "../collapsi
|
|
|
19
19
|
import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage } from "../form.js";
|
|
20
20
|
import { ToggleGroup } from "../create-form-primitives.js";
|
|
21
21
|
import { ClaimRouteShell } from "../claim-route-shell.js";
|
|
22
|
-
import {
|
|
22
|
+
import { TransactionSuccess } from "../transaction-success.js";
|
|
23
23
|
import { MedialaneCollectionCard } from "../medialane-collection-card.js";
|
|
24
24
|
import { TransactionDialog } from "../transaction-dialog.js";
|
|
25
25
|
import { WalletRequired } from "../wallet-required.js";
|
|
@@ -173,14 +173,13 @@ function TierMintForm({ contract: rawContract, preset, aside }) {
|
|
|
173
173
|
}
|
|
174
174
|
return /* @__PURE__ */ jsxs(WalletRequired, { ...gateProps, children: [
|
|
175
175
|
/* @__PURE__ */ jsx(TransactionDialog, { tx, title: preset.dialog.title, workingLabel: preset.dialog.workingLabel, firstStepLabel: preset.dialog.firstStepLabel, children: /* @__PURE__ */ jsx(
|
|
176
|
-
|
|
176
|
+
TransactionSuccess,
|
|
177
177
|
{
|
|
178
178
|
name: form.getValues("name"),
|
|
179
179
|
image: imagePreview,
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
againLabel: preset.success.againLabel,
|
|
180
|
+
title: preset.success.title,
|
|
181
|
+
description: preset.success.description,
|
|
182
|
+
actions: [{ href: collectionHref("STARKNET", contract), label: "View collection" }, { label: preset.success.againLabel, onClick: handleAgain }],
|
|
184
183
|
children: /* @__PURE__ */ jsx(RewardEarned, { actionType: "launch_launchpad" })
|
|
185
184
|
}
|
|
186
185
|
) }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/launchpad/tier-mint-form.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState, type ReactNode } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport * as z from \"zod\";\nimport { AlertCircle, ChevronDown, ImagePlus, Loader2, ShieldCheck, X } from \"lucide-react\";\nimport { collectionHref, normalizeAddress, profileHref } from \"@medialane/sdk\";\nimport { acceptFor } from \"../../utils/upload-limits.js\";\nimport { FIELD_LIMITS } from \"../../utils/field-limits.js\";\nimport Image from \"../image.js\";\nimport Link from \"../link.js\";\nimport { Button } from \"../button.js\";\nimport { Input } from \"../input.js\";\nimport { Textarea } from \"../textarea.js\";\nimport { Skeleton } from \"../skeleton.js\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"../select.js\";\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from \"../collapsible.js\";\nimport { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage } from \"../form.js\";\nimport { ToggleGroup } from \"../create-form-primitives.js\";\nimport { ClaimRouteShell } from \"../claim-route-shell.js\";\nimport { CreationSuccess } from \"../creation-success.js\";\nimport { MedialaneCollectionCard } from \"../medialane-collection-card.js\";\nimport { TransactionDialog } from \"../transaction-dialog.js\";\nimport { WalletRequired } from \"../wallet-required.js\";\nimport { useMedialaneApp } from \"../medialane-app.js\";\nimport { RewardEarned } from \"../rewards/reward-earned.js\";\nimport { AI_POLICIES, DERIVATIVES_OPTIONS, LICENSE_TYPES } from \"../../data/ip.js\";\nimport { cn } from \"../../utils/cn.js\";\nimport { runIntentsCalls } from \"../../utils/run-intent-calls.js\";\nimport { pinAssetMetadata } from \"../../utils/ipfs-upload.js\";\nimport { useCollection } from \"../../utils/use-collections.js\";\nimport { useCollectionProfile } from \"../../utils/use-profiles.js\";\nimport { useTransaction } from \"../../utils/use-transaction.js\";\nimport { useLaunchpadImageUpload } from \"../../utils/use-launchpad-image-upload.js\";\nimport type { TierMintPreset } from \"./tier-mint-presets.js\";\n\nfunction dateToUnixTimestamp(dateStr: string | undefined): number | undefined {\n if (!dateStr) return undefined;\n const d = new Date(dateStr);\n if (isNaN(d.getTime())) return undefined;\n return Math.floor(d.getTime() / 1000);\n}\n\nfunction makeSchema(preset: TierMintPreset) {\n return z.object({\n name: z.string().min(1, preset.copy.nameRequired).max(FIELD_LIMITS.name),\n description: z.string().max(FIELD_LIMITS.description).optional(),\n external_url: z\n .string()\n .max(500)\n .refine((v) => !v || v.startsWith(\"http://\") || v.startsWith(\"https://\"), { message: \"Must start with http:// or https://\" })\n .optional(),\n maxSupply: z\n .string()\n .min(1, \"Supply required\")\n .regex(/^\\d+$/, \"Must be a positive integer\")\n .refine((v) => parseInt(v, 10) >= 1, \"Minimum supply is 1\"),\n royalty: z.coerce.number().min(0).max(50).default(2.5),\n licenseType: z.string().min(1),\n commercialUse: z.enum([\"Yes\", \"No\"]),\n derivatives: z.enum([\"Allowed\", \"Not Allowed\", \"Share-Alike\"]),\n attribution: z.enum([\"Required\", \"Not Required\"]),\n geographicScope: z.string(),\n aiPolicy: z.enum([\"Allowed\", \"Not Allowed\", \"Training Only\"]),\n startDate: z.string().optional(),\n endDate: z.string().optional(),\n imageUri: z.string().min(1, preset.copy.imageRequired),\n });\n}\ntype FormValues = z.infer<ReturnType<typeof makeSchema>>;\n\nexport interface TierMintFormProps {\n contract: string;\n preset: TierMintPreset;\n aside?: ReactNode;\n}\n\nexport function TierMintForm({ contract: rawContract, preset, aside }: TierMintFormProps) {\n const app = useMedialaneApp();\n const address = app.walletAddress;\n const contract = normalizeAddress(\"STARKNET\", rawContract);\n const { collection, isLoading } = useCollection(contract);\n const { profile, isLoading: profileLoading } = useCollectionProfile(preset.suggestExternalLink ? contract : undefined);\n const tx = useTransaction();\n const upload = useLaunchpadImageUpload({ successMessage: \"Image uploaded\" });\n const { imagePreview, imageUri, imageUploading, uploadError, fileInputRef, handleImageSelect, clearImage } = upload;\n const [licensingOpen, setLicensingOpen] = useState(false);\n const [advancedOpen, setAdvancedOpen] = useState(false);\n const Icon = preset.icon;\n\n const form = useForm<FormValues>({\n resolver: zodResolver(makeSchema(preset)),\n defaultValues: {\n name: \"\", imageUri: \"\", description: \"\", external_url: \"\",\n maxSupply: \"100\", royalty: 2.5, licenseType: \"CC BY-SA\", commercialUse: \"Yes\",\n derivatives: \"Share-Alike\", attribution: \"Required\", geographicScope: \"Worldwide\", aiPolicy: \"Not Allowed\",\n },\n });\n\n useEffect(() => {\n form.setValue(\"imageUri\", imageUri ?? \"\", { shouldValidate: !!imageUri });\n }, [imageUri, form]);\n\n useEffect(() => {\n if (!preset.suggestExternalLink || profileLoading) return;\n const suggested = profile?.slug ? `https://medialane.io/collection/${profile.slug}` : `https://medialane.io${collectionHref(\"STARKNET\", contract)}`;\n if (!form.getValues(\"external_url\")) form.setValue(\"external_url\", suggested);\n }, [contract, profileLoading, profile?.slug, form, preset.suggestExternalLink]);\n\n const isOwner = !!address && !!collection?.owner && normalizeAddress(\"STARKNET\", address) === normalizeAddress(\"STARKNET\", collection.owner);\n\n const handleAgain = () => {\n tx.reset();\n form.reset({ ...form.getValues(), name: \"\", description: \"\", maxSupply: \"100\" });\n clearImage();\n };\n\n const onSubmit = (values: FormValues) => {\n if (!address) return;\n void tx.run(async (signer) => {\n await app.ensureSignedIn?.();\n const api = app.getClient().api;\n const pinned = await pinAssetMetadata(api, {\n name: values.name,\n description: values.description ?? \"\",\n imageUri: imageUri!,\n externalUrl: values.external_url,\n ipType: \"NFT\",\n licenseType: values.licenseType,\n commercialUse: values.commercialUse,\n derivatives: values.derivatives,\n attribution: values.attribution,\n geographicScope: values.geographicScope,\n aiPolicy: values.aiPolicy,\n royalty: String(values.royalty),\n creator: address,\n templateTraits: [\n { traitType: \"Type\", value: preset.traitType },\n { traitType: \"Token Standard\", value: \"ERC-1155\" },\n { traitType: \"Max Supply\", value: values.maxSupply },\n { traitType: \"Collection Contract\", value: contract },\n ],\n });\n const tierId = await preset.predictNextId(api, contract);\n const tierRes = await api.intents.create(\"create-tier\", {\n owner: address,\n collection: contract,\n service: preset.service,\n maxSupply: values.maxSupply,\n startTime: dateToUnixTimestamp(values.startDate),\n endTime: dateToUnixTimestamp(values.endDate),\n royaltyBps: Math.round(values.royalty * 100),\n metadataUri: pinned.uri,\n });\n const mintRes = await api.intents.create(\"mint\", {\n owner: address,\n recipient: address,\n collectionContract: contract,\n tokenId: String(tierId),\n amount: values.maxSupply,\n });\n await runIntentsCalls(signer, [tierRes, mintRes]);\n });\n };\n\n const gateProps = { icon: Icon, iconClassName: preset.iconClass, title: preset.signedOut.title, description: preset.signedOut.description };\n const inputId = `mint-${preset.service}-file-input`;\n const busy = tx.phase !== \"idle\" || imageUploading;\n\n if (isLoading) {\n return (\n <WalletRequired {...gateProps}>\n <div className=\"max-w-5xl mx-auto px-4 pt-10 pb-16 space-y-4\">\n <Skeleton className=\"h-6 w-24\" />\n <Skeleton className=\"h-32 w-full rounded-2xl\" />\n <Skeleton className=\"h-64 w-full rounded-2xl\" />\n </div>\n </WalletRequired>\n );\n }\n\n if (!collection) {\n return (\n <WalletRequired {...gateProps}>\n <div className=\"max-w-xl mx-auto px-4 pt-24 pb-8 text-center space-y-4\">\n <AlertCircle className=\"h-10 w-10 text-muted-foreground/20 mx-auto\" />\n <p className=\"text-muted-foreground\">Collection not found.</p>\n <Button asChild variant=\"outline\" size=\"sm\"><Link href={preset.back.href}>{preset.back.label}</Link></Button>\n </div>\n </WalletRequired>\n );\n }\n\n if (!isOwner) {\n return (\n <WalletRequired {...gateProps}>\n <div className=\"max-w-xl mx-auto px-4 pt-24 pb-8 text-center space-y-4\">\n <Icon className=\"h-10 w-10 text-muted-foreground/20 mx-auto\" />\n <p className=\"text-muted-foreground\">{preset.notOwner.message}</p>\n <Button asChild variant=\"outline\" size=\"sm\"><Link href={preset.notOwner.back.href}>{preset.notOwner.back.label}</Link></Button>\n </div>\n </WalletRequired>\n );\n }\n\n return (\n <WalletRequired {...gateProps}>\n <TransactionDialog tx={tx} title={preset.dialog.title} workingLabel={preset.dialog.workingLabel} firstStepLabel={preset.dialog.firstStepLabel}>\n <CreationSuccess\n name={form.getValues(\"name\")}\n image={imagePreview}\n caption={preset.success.caption}\n primary={{ href: collectionHref(\"STARKNET\", contract), label: \"View collection\" }}\n onAgain={handleAgain}\n againLabel={preset.success.againLabel}\n >\n <RewardEarned actionType=\"launch_launchpad\" />\n </CreationSuccess>\n </TransactionDialog>\n\n <ClaimRouteShell\n icon={<Icon className=\"h-4 w-4 text-white\" />}\n title={preset.shell.title}\n subtitle={preset.shell.subtitle(collection.name ?? null)}\n aside={\n <>\n <MedialaneCollectionCard\n image={imagePreview}\n name={form.watch(\"name\")}\n collection={collection.symbol || preset.cardFallbackSymbol}\n creator={address ? `${address.slice(0, 6)}…${address.slice(-4)}` : undefined}\n creatorHref={address ? profileHref({ address }) : undefined}\n />\n {aside}\n </>\n }\n >\n <Form {...form}>\n <form onSubmit={form.handleSubmit(onSubmit)} className=\"space-y-5\">\n <div className=\"space-y-2\">\n <p className=\"text-sm font-medium\">{preset.copy.imageHeading} <span className=\"text-destructive\">*</span></p>\n <div className=\"flex items-center gap-4\">\n <div\n role=\"button\"\n tabIndex={0}\n onClick={() => !imageUploading && fileInputRef.current?.click()}\n onKeyDown={(e) => { if (e.key === \"Enter\") fileInputRef.current?.click(); }}\n className={cn(\"relative h-20 w-20 rounded-2xl border-2 border-dashed border-border bg-muted flex items-center justify-center overflow-hidden shrink-0 cursor-pointer transition-colors\", preset.hoverBorderClass)}\n >\n {imagePreview ? <Image src={imagePreview} alt={preset.copy.imageAlt} fill unoptimized className=\"object-cover\" /> : <ImagePlus className=\"h-6 w-6 text-muted-foreground\" />}\n {imageUploading && <div className=\"absolute inset-0 bg-background/70 flex items-center justify-center\"><Loader2 className=\"h-4 w-4 animate-spin\" /></div>}\n </div>\n <div className=\"space-y-1.5\">\n <input id={inputId} ref={fileInputRef} type=\"file\" accept={acceptFor(\"image\")} className=\"hidden\" onChange={(e) => { const f = e.target.files?.[0]; if (f) void handleImageSelect(f); }} />\n <Button type=\"button\" variant=\"outline\" size=\"sm\" disabled={imageUploading} onClick={() => fileInputRef.current?.click()}>\n {imageUploading ? <><Loader2 className=\"h-3.5 w-3.5 mr-1.5 animate-spin\" />Uploading…</> : imagePreview ? \"Change\" : \"Upload image\"}\n </Button>\n {imagePreview && (\n <button type=\"button\" onClick={clearImage} className=\"flex items-center gap-1 text-xs text-muted-foreground hover:text-destructive transition-colors\">\n <X className=\"h-3 w-3\" /> Remove\n </button>\n )}\n <p className=\"text-xs text-muted-foreground\">{imageUri ? <span className={preset.uploadedClass}>✓ Uploaded</span> : \"JPG, PNG, SVG or WebP\"}</p>\n </div>\n </div>\n </div>\n\n {(uploadError || form.formState.errors.imageUri) && (\n <p role=\"alert\" className=\"text-sm text-destructive\">{uploadError ?? form.formState.errors.imageUri?.message}</p>\n )}\n\n <FormField control={form.control} name=\"name\" render={({ field }) => (\n <FormItem>\n <FormLabel>{preset.copy.nameLabel} <span className=\"text-destructive\">*</span></FormLabel>\n <FormControl><Input placeholder={preset.copy.namePlaceholder} {...field} /></FormControl>\n <FormMessage />\n </FormItem>\n )} />\n\n <FormField control={form.control} name=\"description\" render={({ field }) => (\n <FormItem>\n <FormLabel>Description <span className=\"text-muted-foreground font-normal\">(optional)</span></FormLabel>\n <FormControl><Textarea placeholder={preset.copy.descriptionPlaceholder} rows={3} {...field} /></FormControl>\n <FormMessage />\n </FormItem>\n )} />\n\n <FormField control={form.control} name=\"external_url\" render={({ field }) => (\n <FormItem>\n <FormLabel>External link <span className=\"text-muted-foreground font-normal\">(optional)</span></FormLabel>\n <FormControl><Input placeholder=\"https://yourwebsite.com\" {...field} /></FormControl>\n <FormMessage />\n </FormItem>\n )} />\n\n <Collapsible open={licensingOpen} onOpenChange={setLicensingOpen}>\n <div className=\"sm:overflow-hidden sm:rounded-xl sm:border sm:border-border\">\n <CollapsibleTrigger asChild>\n <button type=\"button\" className=\"w-full flex items-center justify-between px-0 py-3 sm:px-5 sm:py-4 hover:bg-muted/30 transition-colors\">\n <div className=\"flex items-center gap-2\">\n <ShieldCheck className=\"h-4 w-4 text-primary\" />\n <span className=\"text-sm font-semibold\">Licensing Terms</span>\n <span className=\"text-xs text-muted-foreground font-normal\">Optional · Berne Convention</span>\n </div>\n <ChevronDown className={cn(\"h-4 w-4 text-muted-foreground transition-transform\", licensingOpen && \"rotate-180\")} />\n </button>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <div className=\"px-0 pb-4 sm:px-5 sm:pb-5 space-y-4 border-t border-border/60 pt-4\">\n <FormField control={form.control} name=\"licenseType\" render={({ field }) => (\n <FormItem>\n <FormLabel>License</FormLabel>\n <Select value={field.value} onValueChange={(value) => {\n form.setValue(\"licenseType\", value);\n const def = LICENSE_TYPES.find((l) => l.value === value);\n if (def) {\n form.setValue(\"commercialUse\", def.commercialUse);\n form.setValue(\"derivatives\", def.derivatives);\n form.setValue(\"attribution\", def.attribution);\n }\n }}>\n <FormControl><SelectTrigger><SelectValue /></SelectTrigger></FormControl>\n <SelectContent>{LICENSE_TYPES.map((l) => <SelectItem key={l.value} value={l.value}>{l.label}</SelectItem>)}</SelectContent>\n </Select>\n {(() => { const def = LICENSE_TYPES.find((l) => l.value === field.value); return def ? <p className=\"text-xs text-muted-foreground mt-1\">{def.description}</p> : null; })()}\n <FormMessage />\n </FormItem>\n )} />\n <FormField control={form.control} name=\"commercialUse\" render={({ field }) => (\n <FormItem><FormLabel>Commercial Use</FormLabel><ToggleGroup value={field.value} options={[\"Yes\", \"No\"]} onChange={field.onChange} /></FormItem>\n )} />\n <FormField control={form.control} name=\"derivatives\" render={({ field }) => (\n <FormItem><FormLabel>Derivatives</FormLabel><ToggleGroup value={field.value} options={DERIVATIVES_OPTIONS} onChange={field.onChange} /></FormItem>\n )} />\n <FormField control={form.control} name=\"attribution\" render={({ field }) => (\n <FormItem><FormLabel>Attribution</FormLabel><ToggleGroup value={field.value} options={[\"Required\", \"Not Required\"]} onChange={field.onChange} /></FormItem>\n )} />\n <Collapsible open={advancedOpen} onOpenChange={setAdvancedOpen}>\n <CollapsibleTrigger asChild>\n <button type=\"button\" className=\"flex items-center gap-1.5 text-xs text-muted-foreground hover:text-foreground transition-colors\">\n <ChevronDown className={cn(\"h-3.5 w-3.5 transition-transform\", advancedOpen && \"rotate-180\")} />\n Advanced options\n </button>\n </CollapsibleTrigger>\n <CollapsibleContent className=\"space-y-4 pt-3\">\n <FormField control={form.control} name=\"geographicScope\" render={({ field }) => (\n <FormItem>\n <FormLabel>Territory</FormLabel>\n <FormControl><Input placeholder=\"Worldwide\" {...field} /></FormControl>\n </FormItem>\n )} />\n <FormField control={form.control} name=\"aiPolicy\" render={({ field }) => (\n <FormItem><FormLabel>AI & Data Mining</FormLabel><ToggleGroup value={field.value} options={AI_POLICIES} onChange={field.onChange} /></FormItem>\n )} />\n </CollapsibleContent>\n </Collapsible>\n </div>\n </CollapsibleContent>\n </div>\n </Collapsible>\n\n <div className=\"grid grid-cols-2 gap-4\">\n <FormField control={form.control} name=\"maxSupply\" render={({ field }) => (\n <FormItem>\n <FormLabel>Supply <span className=\"text-destructive\">*</span></FormLabel>\n <FormControl><Input type=\"number\" min=\"1\" placeholder=\"100\" {...field} /></FormControl>\n <FormDescription>Minted to your account.</FormDescription>\n <FormMessage />\n </FormItem>\n )} />\n <FormField control={form.control} name=\"royalty\" render={({ field }) => (\n <FormItem>\n <FormLabel>Royalty % (0–50)</FormLabel>\n <FormControl><Input type=\"number\" min={0} max={50} step={0.5} placeholder=\"2.5\" {...field} onChange={(e) => field.onChange(parseFloat(e.target.value) || 0)} /></FormControl>\n <FormDescription>On secondary sales.</FormDescription>\n <FormMessage />\n </FormItem>\n )} />\n </div>\n\n <div className=\"grid grid-cols-2 gap-4\">\n <FormField control={form.control} name=\"startDate\" render={({ field }) => (\n <FormItem>\n <FormLabel>Valid from <span className=\"text-muted-foreground font-normal\">(optional)</span></FormLabel>\n <FormControl><Input type=\"datetime-local\" {...field} /></FormControl>\n <FormDescription>You can mint and sell before it opens.</FormDescription>\n <FormMessage />\n </FormItem>\n )} />\n <FormField control={form.control} name=\"endDate\" render={({ field }) => (\n <FormItem>\n <FormLabel>Valid until <span className=\"text-muted-foreground font-normal\">(optional)</span></FormLabel>\n <FormControl><Input type=\"datetime-local\" {...field} /></FormControl>\n <FormDescription>{preset.copy.validUntilHint}</FormDescription>\n <FormMessage />\n </FormItem>\n )} />\n </div>\n\n <button\n type=\"submit\"\n disabled={busy}\n className={`w-full h-12 text-base font-semibold text-white rounded-xl flex items-center justify-center gap-2 transition-all hover:brightness-110 active:scale-[0.98] ${preset.buttonClass} ${busy ? \"opacity-40 pointer-events-none\" : \"\"}`}\n >\n <Icon className=\"h-4 w-4 mr-2\" />\n {preset.copy.submit}\n </button>\n </form>\n </Form>\n </ClaimRouteShell>\n </WalletRequired>\n );\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/launchpad/tier-mint-form.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState, type ReactNode } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport * as z from \"zod\";\nimport { AlertCircle, ChevronDown, ImagePlus, Loader2, ShieldCheck, X } from \"lucide-react\";\nimport { collectionHref, normalizeAddress, profileHref } from \"@medialane/sdk\";\nimport { acceptFor } from \"../../utils/upload-limits.js\";\nimport { FIELD_LIMITS } from \"../../utils/field-limits.js\";\nimport Image from \"../image.js\";\nimport Link from \"../link.js\";\nimport { Button } from \"../button.js\";\nimport { Input } from \"../input.js\";\nimport { Textarea } from \"../textarea.js\";\nimport { Skeleton } from \"../skeleton.js\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"../select.js\";\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from \"../collapsible.js\";\nimport { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage } from \"../form.js\";\nimport { ToggleGroup } from \"../create-form-primitives.js\";\nimport { ClaimRouteShell } from \"../claim-route-shell.js\";\nimport { TransactionSuccess } from \"../transaction-success.js\";\nimport { MedialaneCollectionCard } from \"../medialane-collection-card.js\";\nimport { TransactionDialog } from \"../transaction-dialog.js\";\nimport { WalletRequired } from \"../wallet-required.js\";\nimport { useMedialaneApp } from \"../medialane-app.js\";\nimport { RewardEarned } from \"../rewards/reward-earned.js\";\nimport { AI_POLICIES, DERIVATIVES_OPTIONS, LICENSE_TYPES } from \"../../data/ip.js\";\nimport { cn } from \"../../utils/cn.js\";\nimport { runIntentsCalls } from \"../../utils/run-intent-calls.js\";\nimport { pinAssetMetadata } from \"../../utils/ipfs-upload.js\";\nimport { useCollection } from \"../../utils/use-collections.js\";\nimport { useCollectionProfile } from \"../../utils/use-profiles.js\";\nimport { useTransaction } from \"../../utils/use-transaction.js\";\nimport { useLaunchpadImageUpload } from \"../../utils/use-launchpad-image-upload.js\";\nimport type { TierMintPreset } from \"./tier-mint-presets.js\";\n\nfunction dateToUnixTimestamp(dateStr: string | undefined): number | undefined {\n if (!dateStr) return undefined;\n const d = new Date(dateStr);\n if (isNaN(d.getTime())) return undefined;\n return Math.floor(d.getTime() / 1000);\n}\n\nfunction makeSchema(preset: TierMintPreset) {\n return z.object({\n name: z.string().min(1, preset.copy.nameRequired).max(FIELD_LIMITS.name),\n description: z.string().max(FIELD_LIMITS.description).optional(),\n external_url: z\n .string()\n .max(500)\n .refine((v) => !v || v.startsWith(\"http://\") || v.startsWith(\"https://\"), { message: \"Must start with http:// or https://\" })\n .optional(),\n maxSupply: z\n .string()\n .min(1, \"Supply required\")\n .regex(/^\\d+$/, \"Must be a positive integer\")\n .refine((v) => parseInt(v, 10) >= 1, \"Minimum supply is 1\"),\n royalty: z.coerce.number().min(0).max(50).default(2.5),\n licenseType: z.string().min(1),\n commercialUse: z.enum([\"Yes\", \"No\"]),\n derivatives: z.enum([\"Allowed\", \"Not Allowed\", \"Share-Alike\"]),\n attribution: z.enum([\"Required\", \"Not Required\"]),\n geographicScope: z.string(),\n aiPolicy: z.enum([\"Allowed\", \"Not Allowed\", \"Training Only\"]),\n startDate: z.string().optional(),\n endDate: z.string().optional(),\n imageUri: z.string().min(1, preset.copy.imageRequired),\n });\n}\ntype FormValues = z.infer<ReturnType<typeof makeSchema>>;\n\nexport interface TierMintFormProps {\n contract: string;\n preset: TierMintPreset;\n aside?: ReactNode;\n}\n\nexport function TierMintForm({ contract: rawContract, preset, aside }: TierMintFormProps) {\n const app = useMedialaneApp();\n const address = app.walletAddress;\n const contract = normalizeAddress(\"STARKNET\", rawContract);\n const { collection, isLoading } = useCollection(contract);\n const { profile, isLoading: profileLoading } = useCollectionProfile(preset.suggestExternalLink ? contract : undefined);\n const tx = useTransaction();\n const upload = useLaunchpadImageUpload({ successMessage: \"Image uploaded\" });\n const { imagePreview, imageUri, imageUploading, uploadError, fileInputRef, handleImageSelect, clearImage } = upload;\n const [licensingOpen, setLicensingOpen] = useState(false);\n const [advancedOpen, setAdvancedOpen] = useState(false);\n const Icon = preset.icon;\n\n const form = useForm<FormValues>({\n resolver: zodResolver(makeSchema(preset)),\n defaultValues: {\n name: \"\", imageUri: \"\", description: \"\", external_url: \"\",\n maxSupply: \"100\", royalty: 2.5, licenseType: \"CC BY-SA\", commercialUse: \"Yes\",\n derivatives: \"Share-Alike\", attribution: \"Required\", geographicScope: \"Worldwide\", aiPolicy: \"Not Allowed\",\n },\n });\n\n useEffect(() => {\n form.setValue(\"imageUri\", imageUri ?? \"\", { shouldValidate: !!imageUri });\n }, [imageUri, form]);\n\n useEffect(() => {\n if (!preset.suggestExternalLink || profileLoading) return;\n const suggested = profile?.slug ? `https://medialane.io/collection/${profile.slug}` : `https://medialane.io${collectionHref(\"STARKNET\", contract)}`;\n if (!form.getValues(\"external_url\")) form.setValue(\"external_url\", suggested);\n }, [contract, profileLoading, profile?.slug, form, preset.suggestExternalLink]);\n\n const isOwner = !!address && !!collection?.owner && normalizeAddress(\"STARKNET\", address) === normalizeAddress(\"STARKNET\", collection.owner);\n\n const handleAgain = () => {\n tx.reset();\n form.reset({ ...form.getValues(), name: \"\", description: \"\", maxSupply: \"100\" });\n clearImage();\n };\n\n const onSubmit = (values: FormValues) => {\n if (!address) return;\n void tx.run(async (signer) => {\n await app.ensureSignedIn?.();\n const api = app.getClient().api;\n const pinned = await pinAssetMetadata(api, {\n name: values.name,\n description: values.description ?? \"\",\n imageUri: imageUri!,\n externalUrl: values.external_url,\n ipType: \"NFT\",\n licenseType: values.licenseType,\n commercialUse: values.commercialUse,\n derivatives: values.derivatives,\n attribution: values.attribution,\n geographicScope: values.geographicScope,\n aiPolicy: values.aiPolicy,\n royalty: String(values.royalty),\n creator: address,\n templateTraits: [\n { traitType: \"Type\", value: preset.traitType },\n { traitType: \"Token Standard\", value: \"ERC-1155\" },\n { traitType: \"Max Supply\", value: values.maxSupply },\n { traitType: \"Collection Contract\", value: contract },\n ],\n });\n const tierId = await preset.predictNextId(api, contract);\n const tierRes = await api.intents.create(\"create-tier\", {\n owner: address,\n collection: contract,\n service: preset.service,\n maxSupply: values.maxSupply,\n startTime: dateToUnixTimestamp(values.startDate),\n endTime: dateToUnixTimestamp(values.endDate),\n royaltyBps: Math.round(values.royalty * 100),\n metadataUri: pinned.uri,\n });\n const mintRes = await api.intents.create(\"mint\", {\n owner: address,\n recipient: address,\n collectionContract: contract,\n tokenId: String(tierId),\n amount: values.maxSupply,\n });\n await runIntentsCalls(signer, [tierRes, mintRes]);\n });\n };\n\n const gateProps = { icon: Icon, iconClassName: preset.iconClass, title: preset.signedOut.title, description: preset.signedOut.description };\n const inputId = `mint-${preset.service}-file-input`;\n const busy = tx.phase !== \"idle\" || imageUploading;\n\n if (isLoading) {\n return (\n <WalletRequired {...gateProps}>\n <div className=\"max-w-5xl mx-auto px-4 pt-10 pb-16 space-y-4\">\n <Skeleton className=\"h-6 w-24\" />\n <Skeleton className=\"h-32 w-full rounded-2xl\" />\n <Skeleton className=\"h-64 w-full rounded-2xl\" />\n </div>\n </WalletRequired>\n );\n }\n\n if (!collection) {\n return (\n <WalletRequired {...gateProps}>\n <div className=\"max-w-xl mx-auto px-4 pt-24 pb-8 text-center space-y-4\">\n <AlertCircle className=\"h-10 w-10 text-muted-foreground/20 mx-auto\" />\n <p className=\"text-muted-foreground\">Collection not found.</p>\n <Button asChild variant=\"outline\" size=\"sm\"><Link href={preset.back.href}>{preset.back.label}</Link></Button>\n </div>\n </WalletRequired>\n );\n }\n\n if (!isOwner) {\n return (\n <WalletRequired {...gateProps}>\n <div className=\"max-w-xl mx-auto px-4 pt-24 pb-8 text-center space-y-4\">\n <Icon className=\"h-10 w-10 text-muted-foreground/20 mx-auto\" />\n <p className=\"text-muted-foreground\">{preset.notOwner.message}</p>\n <Button asChild variant=\"outline\" size=\"sm\"><Link href={preset.notOwner.back.href}>{preset.notOwner.back.label}</Link></Button>\n </div>\n </WalletRequired>\n );\n }\n\n return (\n <WalletRequired {...gateProps}>\n <TransactionDialog tx={tx} title={preset.dialog.title} workingLabel={preset.dialog.workingLabel} firstStepLabel={preset.dialog.firstStepLabel}>\n <TransactionSuccess\n name={form.getValues(\"name\")}\n image={imagePreview}\n title={preset.success.title}\n description={preset.success.description}\n actions={[{ href: collectionHref(\"STARKNET\", contract), label: \"View collection\" }, { label: preset.success.againLabel, onClick: handleAgain }]}\n >\n <RewardEarned actionType=\"launch_launchpad\" />\n </TransactionSuccess>\n </TransactionDialog>\n\n <ClaimRouteShell\n icon={<Icon className=\"h-4 w-4 text-white\" />}\n title={preset.shell.title}\n subtitle={preset.shell.subtitle(collection.name ?? null)}\n aside={\n <>\n <MedialaneCollectionCard\n image={imagePreview}\n name={form.watch(\"name\")}\n collection={collection.symbol || preset.cardFallbackSymbol}\n creator={address ? `${address.slice(0, 6)}…${address.slice(-4)}` : undefined}\n creatorHref={address ? profileHref({ address }) : undefined}\n />\n {aside}\n </>\n }\n >\n <Form {...form}>\n <form onSubmit={form.handleSubmit(onSubmit)} className=\"space-y-5\">\n <div className=\"space-y-2\">\n <p className=\"text-sm font-medium\">{preset.copy.imageHeading} <span className=\"text-destructive\">*</span></p>\n <div className=\"flex items-center gap-4\">\n <div\n role=\"button\"\n tabIndex={0}\n onClick={() => !imageUploading && fileInputRef.current?.click()}\n onKeyDown={(e) => { if (e.key === \"Enter\") fileInputRef.current?.click(); }}\n className={cn(\"relative h-20 w-20 rounded-2xl border-2 border-dashed border-border bg-muted flex items-center justify-center overflow-hidden shrink-0 cursor-pointer transition-colors\", preset.hoverBorderClass)}\n >\n {imagePreview ? <Image src={imagePreview} alt={preset.copy.imageAlt} fill unoptimized className=\"object-cover\" /> : <ImagePlus className=\"h-6 w-6 text-muted-foreground\" />}\n {imageUploading && <div className=\"absolute inset-0 bg-background/70 flex items-center justify-center\"><Loader2 className=\"h-4 w-4 animate-spin\" /></div>}\n </div>\n <div className=\"space-y-1.5\">\n <input id={inputId} ref={fileInputRef} type=\"file\" accept={acceptFor(\"image\")} className=\"hidden\" onChange={(e) => { const f = e.target.files?.[0]; if (f) void handleImageSelect(f); }} />\n <Button type=\"button\" variant=\"outline\" size=\"sm\" disabled={imageUploading} onClick={() => fileInputRef.current?.click()}>\n {imageUploading ? <><Loader2 className=\"h-3.5 w-3.5 mr-1.5 animate-spin\" />Uploading…</> : imagePreview ? \"Change\" : \"Upload image\"}\n </Button>\n {imagePreview && (\n <button type=\"button\" onClick={clearImage} className=\"flex items-center gap-1 text-xs text-muted-foreground hover:text-destructive transition-colors\">\n <X className=\"h-3 w-3\" /> Remove\n </button>\n )}\n <p className=\"text-xs text-muted-foreground\">{imageUri ? <span className={preset.uploadedClass}>✓ Uploaded</span> : \"JPG, PNG, SVG or WebP\"}</p>\n </div>\n </div>\n </div>\n\n {(uploadError || form.formState.errors.imageUri) && (\n <p role=\"alert\" className=\"text-sm text-destructive\">{uploadError ?? form.formState.errors.imageUri?.message}</p>\n )}\n\n <FormField control={form.control} name=\"name\" render={({ field }) => (\n <FormItem>\n <FormLabel>{preset.copy.nameLabel} <span className=\"text-destructive\">*</span></FormLabel>\n <FormControl><Input placeholder={preset.copy.namePlaceholder} {...field} /></FormControl>\n <FormMessage />\n </FormItem>\n )} />\n\n <FormField control={form.control} name=\"description\" render={({ field }) => (\n <FormItem>\n <FormLabel>Description <span className=\"text-muted-foreground font-normal\">(optional)</span></FormLabel>\n <FormControl><Textarea placeholder={preset.copy.descriptionPlaceholder} rows={3} {...field} /></FormControl>\n <FormMessage />\n </FormItem>\n )} />\n\n <FormField control={form.control} name=\"external_url\" render={({ field }) => (\n <FormItem>\n <FormLabel>External link <span className=\"text-muted-foreground font-normal\">(optional)</span></FormLabel>\n <FormControl><Input placeholder=\"https://yourwebsite.com\" {...field} /></FormControl>\n <FormMessage />\n </FormItem>\n )} />\n\n <Collapsible open={licensingOpen} onOpenChange={setLicensingOpen}>\n <div className=\"sm:overflow-hidden sm:rounded-xl sm:border sm:border-border\">\n <CollapsibleTrigger asChild>\n <button type=\"button\" className=\"w-full flex items-center justify-between px-0 py-3 sm:px-5 sm:py-4 hover:bg-muted/30 transition-colors\">\n <div className=\"flex items-center gap-2\">\n <ShieldCheck className=\"h-4 w-4 text-primary\" />\n <span className=\"text-sm font-semibold\">Licensing Terms</span>\n <span className=\"text-xs text-muted-foreground font-normal\">Optional · Berne Convention</span>\n </div>\n <ChevronDown className={cn(\"h-4 w-4 text-muted-foreground transition-transform\", licensingOpen && \"rotate-180\")} />\n </button>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <div className=\"px-0 pb-4 sm:px-5 sm:pb-5 space-y-4 border-t border-border/60 pt-4\">\n <FormField control={form.control} name=\"licenseType\" render={({ field }) => (\n <FormItem>\n <FormLabel>License</FormLabel>\n <Select value={field.value} onValueChange={(value) => {\n form.setValue(\"licenseType\", value);\n const def = LICENSE_TYPES.find((l) => l.value === value);\n if (def) {\n form.setValue(\"commercialUse\", def.commercialUse);\n form.setValue(\"derivatives\", def.derivatives);\n form.setValue(\"attribution\", def.attribution);\n }\n }}>\n <FormControl><SelectTrigger><SelectValue /></SelectTrigger></FormControl>\n <SelectContent>{LICENSE_TYPES.map((l) => <SelectItem key={l.value} value={l.value}>{l.label}</SelectItem>)}</SelectContent>\n </Select>\n {(() => { const def = LICENSE_TYPES.find((l) => l.value === field.value); return def ? <p className=\"text-xs text-muted-foreground mt-1\">{def.description}</p> : null; })()}\n <FormMessage />\n </FormItem>\n )} />\n <FormField control={form.control} name=\"commercialUse\" render={({ field }) => (\n <FormItem><FormLabel>Commercial Use</FormLabel><ToggleGroup value={field.value} options={[\"Yes\", \"No\"]} onChange={field.onChange} /></FormItem>\n )} />\n <FormField control={form.control} name=\"derivatives\" render={({ field }) => (\n <FormItem><FormLabel>Derivatives</FormLabel><ToggleGroup value={field.value} options={DERIVATIVES_OPTIONS} onChange={field.onChange} /></FormItem>\n )} />\n <FormField control={form.control} name=\"attribution\" render={({ field }) => (\n <FormItem><FormLabel>Attribution</FormLabel><ToggleGroup value={field.value} options={[\"Required\", \"Not Required\"]} onChange={field.onChange} /></FormItem>\n )} />\n <Collapsible open={advancedOpen} onOpenChange={setAdvancedOpen}>\n <CollapsibleTrigger asChild>\n <button type=\"button\" className=\"flex items-center gap-1.5 text-xs text-muted-foreground hover:text-foreground transition-colors\">\n <ChevronDown className={cn(\"h-3.5 w-3.5 transition-transform\", advancedOpen && \"rotate-180\")} />\n Advanced options\n </button>\n </CollapsibleTrigger>\n <CollapsibleContent className=\"space-y-4 pt-3\">\n <FormField control={form.control} name=\"geographicScope\" render={({ field }) => (\n <FormItem>\n <FormLabel>Territory</FormLabel>\n <FormControl><Input placeholder=\"Worldwide\" {...field} /></FormControl>\n </FormItem>\n )} />\n <FormField control={form.control} name=\"aiPolicy\" render={({ field }) => (\n <FormItem><FormLabel>AI & Data Mining</FormLabel><ToggleGroup value={field.value} options={AI_POLICIES} onChange={field.onChange} /></FormItem>\n )} />\n </CollapsibleContent>\n </Collapsible>\n </div>\n </CollapsibleContent>\n </div>\n </Collapsible>\n\n <div className=\"grid grid-cols-2 gap-4\">\n <FormField control={form.control} name=\"maxSupply\" render={({ field }) => (\n <FormItem>\n <FormLabel>Supply <span className=\"text-destructive\">*</span></FormLabel>\n <FormControl><Input type=\"number\" min=\"1\" placeholder=\"100\" {...field} /></FormControl>\n <FormDescription>Minted to your account.</FormDescription>\n <FormMessage />\n </FormItem>\n )} />\n <FormField control={form.control} name=\"royalty\" render={({ field }) => (\n <FormItem>\n <FormLabel>Royalty % (0–50)</FormLabel>\n <FormControl><Input type=\"number\" min={0} max={50} step={0.5} placeholder=\"2.5\" {...field} onChange={(e) => field.onChange(parseFloat(e.target.value) || 0)} /></FormControl>\n <FormDescription>On secondary sales.</FormDescription>\n <FormMessage />\n </FormItem>\n )} />\n </div>\n\n <div className=\"grid grid-cols-2 gap-4\">\n <FormField control={form.control} name=\"startDate\" render={({ field }) => (\n <FormItem>\n <FormLabel>Valid from <span className=\"text-muted-foreground font-normal\">(optional)</span></FormLabel>\n <FormControl><Input type=\"datetime-local\" {...field} /></FormControl>\n <FormDescription>You can mint and sell before it opens.</FormDescription>\n <FormMessage />\n </FormItem>\n )} />\n <FormField control={form.control} name=\"endDate\" render={({ field }) => (\n <FormItem>\n <FormLabel>Valid until <span className=\"text-muted-foreground font-normal\">(optional)</span></FormLabel>\n <FormControl><Input type=\"datetime-local\" {...field} /></FormControl>\n <FormDescription>{preset.copy.validUntilHint}</FormDescription>\n <FormMessage />\n </FormItem>\n )} />\n </div>\n\n <button\n type=\"submit\"\n disabled={busy}\n className={`w-full h-12 text-base font-semibold text-white rounded-xl flex items-center justify-center gap-2 transition-all hover:brightness-110 active:scale-[0.98] ${preset.buttonClass} ${busy ? \"opacity-40 pointer-events-none\" : \"\"}`}\n >\n <Icon className=\"h-4 w-4 mr-2\" />\n {preset.copy.submit}\n </button>\n </form>\n </Form>\n </ClaimRouteShell>\n </WalletRequired>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -38,7 +38,7 @@ const CLUB_TIER_PRESET = {
|
|
|
38
38
|
back: { href: "/launchpad/club", label: "\u2190 Back" },
|
|
39
39
|
notOwner: { message: "You don't own this club.", back: { href: "/launchpad/club", label: "\u2190 Back to clubs" } },
|
|
40
40
|
dialog: { title: "Create membership", workingLabel: "Creating your membership\u2026", firstStepLabel: "Upload membership metadata" },
|
|
41
|
-
success: {
|
|
41
|
+
success: { title: "Membership created", description: "The supply is minted to your wallet and ready to list.", againLabel: "Create another membership" },
|
|
42
42
|
shell: {
|
|
43
43
|
title: "Create Membership",
|
|
44
44
|
subtitle: (name) => `Add a new membership tier to ${name ?? "your club"} and mint its supply to your wallet, ready to list.`
|
|
@@ -70,7 +70,7 @@ const TICKETS_TIER_PRESET = {
|
|
|
70
70
|
back: { href: "/launchpad/tickets", label: "\u2190 Back" },
|
|
71
71
|
notOwner: { message: "You don't own this tickets collection.", back: { href: "/launchpad/tickets", label: "\u2190 Back to tickets" } },
|
|
72
72
|
dialog: { title: "Mint tickets", workingLabel: "Minting your tickets\u2026", firstStepLabel: "Upload ticket metadata" },
|
|
73
|
-
success: {
|
|
73
|
+
success: { title: "Tickets minted", description: "Each ticket is recorded onchain under your wallet.", againLabel: "Mint another ticket" },
|
|
74
74
|
shell: {
|
|
75
75
|
title: "Mint Tickets",
|
|
76
76
|
subtitle: (name) => `Add a new ticket type to ${name ?? "your collection"} and mint its supply to your wallet, ready to list.`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/launchpad/tier-mint-presets.ts"],"sourcesContent":["import { Ticket, Users } from \"lucide-react\";\nimport type { ElementType } from \"react\";\nimport type { ApiClient } from \"@medialane/sdk\";\nimport { predictNextMembershipId, predictNextTicketId } from \"../../utils/use-tiers.js\";\n\nexport interface TierMintPreset {\n service: \"ip-club\" | \"ip-tickets\";\n predictNextId: (api: ApiClient, contract: string) => Promise<number>;\n traitType: string;\n icon: ElementType;\n iconClass: string;\n buttonClass: string;\n hoverBorderClass: string;\n uploadedClass: string;\n suggestExternalLink: boolean;\n signedOut: { title: string; description: string };\n back: { href: string; label: string };\n notOwner: { message: string; back: { href: string; label: string } };\n dialog: { title: string; workingLabel: string; firstStepLabel: string };\n success: {
|
|
1
|
+
{"version":3,"sources":["../../../src/components/launchpad/tier-mint-presets.ts"],"sourcesContent":["import { Ticket, Users } from \"lucide-react\";\nimport type { ElementType } from \"react\";\nimport type { ApiClient } from \"@medialane/sdk\";\nimport { predictNextMembershipId, predictNextTicketId } from \"../../utils/use-tiers.js\";\n\nexport interface TierMintPreset {\n service: \"ip-club\" | \"ip-tickets\";\n predictNextId: (api: ApiClient, contract: string) => Promise<number>;\n traitType: string;\n icon: ElementType;\n iconClass: string;\n buttonClass: string;\n hoverBorderClass: string;\n uploadedClass: string;\n suggestExternalLink: boolean;\n signedOut: { title: string; description: string };\n back: { href: string; label: string };\n notOwner: { message: string; back: { href: string; label: string } };\n dialog: { title: string; workingLabel: string; firstStepLabel: string };\n success: { title: string; description: string; againLabel: string };\n shell: { title: string; subtitle: (collectionName: string | null) => string };\n cardFallbackSymbol: string;\n copy: {\n imageHeading: string;\n imageAlt: string;\n imageRequired: string;\n nameLabel: string;\n nameRequired: string;\n namePlaceholder: string;\n descriptionPlaceholder: string;\n validUntilHint: string;\n submit: string;\n };\n}\n\nexport const CLUB_TIER_PRESET: TierMintPreset = {\n service: \"ip-club\",\n predictNextId: predictNextMembershipId,\n traitType: \"IP Club Membership\",\n icon: Users,\n iconClass: \"text-brand-purple\",\n buttonClass: \"bg-brand-purple\",\n hoverBorderClass: \"hover:border-brand-purple/50\",\n uploadedClass: \"text-brand-purple\",\n suggestExternalLink: false,\n signedOut: { title: \"Secure your account to create memberships\", description: \"Create a membership tier and mint its supply to your account.\" },\n back: { href: \"/launchpad/club\", label: \"← Back\" },\n notOwner: { message: \"You don't own this club.\", back: { href: \"/launchpad/club\", label: \"← Back to clubs\" } },\n dialog: { title: \"Create membership\", workingLabel: \"Creating your membership…\", firstStepLabel: \"Upload membership metadata\" },\n success: { title: \"Membership created\", description: \"The supply is minted to your wallet and ready to list.\", againLabel: \"Create another membership\" },\n shell: {\n title: \"Create Membership\",\n subtitle: (name) => `Add a new membership tier to ${name ?? \"your club\"} and mint its supply to your wallet, ready to list.`,\n },\n cardFallbackSymbol: \"Club\",\n copy: {\n imageHeading: \"Membership image\",\n imageAlt: \"Membership\",\n imageRequired: \"Add a membership image.\",\n nameLabel: \"Membership name\",\n nameRequired: \"Membership name required\",\n namePlaceholder: \"Kalamaha Fan Club — 2026 Season Pass\",\n descriptionPlaceholder: \"What does this membership unlock?\",\n validUntilHint: \"Blank = lifetime membership.\",\n submit: \"Create Membership\",\n },\n};\n\nexport const TICKETS_TIER_PRESET: TierMintPreset = {\n service: \"ip-tickets\",\n predictNextId: predictNextTicketId,\n traitType: \"IP Ticket\",\n icon: Ticket,\n iconClass: \"text-teal-500\",\n buttonClass: \"bg-teal-600\",\n hoverBorderClass: \"hover:border-teal-500/50\",\n uploadedClass: \"text-teal-500\",\n suggestExternalLink: true,\n signedOut: { title: \"Secure your account to mint tickets\", description: \"Create a ticket type and mint its supply to your account.\" },\n back: { href: \"/launchpad/tickets\", label: \"← Back\" },\n notOwner: { message: \"You don't own this tickets collection.\", back: { href: \"/launchpad/tickets\", label: \"← Back to tickets\" } },\n dialog: { title: \"Mint tickets\", workingLabel: \"Minting your tickets…\", firstStepLabel: \"Upload ticket metadata\" },\n success: { title: \"Tickets minted\", description: \"Each ticket is recorded onchain under your wallet.\", againLabel: \"Mint another ticket\" },\n shell: {\n title: \"Mint Tickets\",\n subtitle: (name) => `Add a new ticket type to ${name ?? \"your collection\"} and mint its supply to your wallet, ready to list.`,\n },\n cardFallbackSymbol: \"Tickets\",\n copy: {\n imageHeading: \"Ticket image\",\n imageAlt: \"Ticket\",\n imageRequired: \"Add a ticket image.\",\n nameLabel: \"Ticket name\",\n nameRequired: \"Ticket name required\",\n namePlaceholder: \"Summer Concert 2026 — General Admission\",\n descriptionPlaceholder: \"What does this ticket admit or unlock?\",\n validUntilHint: \"Blank = always valid.\",\n submit: \"Mint Tickets\",\n },\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAA8B;AAG9B,uBAA6D;AAgCtD,MAAM,mBAAmC;AAAA,EAC9C,SAAS;AAAA,EACT,eAAe;AAAA,EACf,WAAW;AAAA,EACX,MAAM;AAAA,EACN,WAAW;AAAA,EACX,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,eAAe;AAAA,EACf,qBAAqB;AAAA,EACrB,WAAW,EAAE,OAAO,6CAA6C,aAAa,gEAAgE;AAAA,EAC9I,MAAM,EAAE,MAAM,mBAAmB,OAAO,cAAS;AAAA,EACjD,UAAU,EAAE,SAAS,4BAA4B,MAAM,EAAE,MAAM,mBAAmB,OAAO,uBAAkB,EAAE;AAAA,EAC7G,QAAQ,EAAE,OAAO,qBAAqB,cAAc,kCAA6B,gBAAgB,6BAA6B;AAAA,EAC9H,SAAS,EAAE,OAAO,sBAAsB,aAAa,0DAA0D,YAAY,4BAA4B;AAAA,EACvJ,OAAO;AAAA,IACL,OAAO;AAAA,IACP,UAAU,CAAC,SAAS,gCAAgC,QAAQ,WAAW;AAAA,EACzE;AAAA,EACA,oBAAoB;AAAA,EACpB,MAAM;AAAA,IACJ,cAAc;AAAA,IACd,UAAU;AAAA,IACV,eAAe;AAAA,IACf,WAAW;AAAA,IACX,cAAc;AAAA,IACd,iBAAiB;AAAA,IACjB,wBAAwB;AAAA,IACxB,gBAAgB;AAAA,IAChB,QAAQ;AAAA,EACV;AACF;AAEO,MAAM,sBAAsC;AAAA,EACjD,SAAS;AAAA,EACT,eAAe;AAAA,EACf,WAAW;AAAA,EACX,MAAM;AAAA,EACN,WAAW;AAAA,EACX,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,eAAe;AAAA,EACf,qBAAqB;AAAA,EACrB,WAAW,EAAE,OAAO,uCAAuC,aAAa,4DAA4D;AAAA,EACpI,MAAM,EAAE,MAAM,sBAAsB,OAAO,cAAS;AAAA,EACpD,UAAU,EAAE,SAAS,0CAA0C,MAAM,EAAE,MAAM,sBAAsB,OAAO,yBAAoB,EAAE;AAAA,EAChI,QAAQ,EAAE,OAAO,gBAAgB,cAAc,8BAAyB,gBAAgB,yBAAyB;AAAA,EACjH,SAAS,EAAE,OAAO,kBAAkB,aAAa,sDAAsD,YAAY,sBAAsB;AAAA,EACzI,OAAO;AAAA,IACL,OAAO;AAAA,IACP,UAAU,CAAC,SAAS,4BAA4B,QAAQ,iBAAiB;AAAA,EAC3E;AAAA,EACA,oBAAoB;AAAA,EACpB,MAAM;AAAA,IACJ,cAAc;AAAA,IACd,UAAU;AAAA,IACV,eAAe;AAAA,IACf,WAAW;AAAA,IACX,cAAc;AAAA,IACd,iBAAiB;AAAA,IACjB,wBAAwB;AAAA,IACxB,gBAAgB;AAAA,IAChB,QAAQ;AAAA,EACV;AACF;","names":[]}
|