@medialane/ui 0.263.0 → 0.265.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/account/input-otp.d.cts +2 -2
- package/dist/components/account/input-otp.d.ts +2 -2
- package/dist/components/asset-access-cards.cjs +26 -21
- package/dist/components/asset-access-cards.cjs.map +1 -1
- package/dist/components/asset-access-cards.d.cts +2 -1
- package/dist/components/asset-access-cards.d.ts +2 -1
- package/dist/components/asset-access-cards.js +26 -21
- package/dist/components/asset-access-cards.js.map +1 -1
- package/dist/components/asset-marketplace-panel.cjs +2 -2
- package/dist/components/asset-marketplace-panel.cjs.map +1 -1
- package/dist/components/asset-marketplace-panel.js +2 -2
- package/dist/components/asset-marketplace-panel.js.map +1 -1
- package/dist/components/asset-overview-content.cjs +1 -1
- package/dist/components/asset-overview-content.cjs.map +1 -1
- package/dist/components/asset-overview-content.js +1 -1
- package/dist/components/asset-overview-content.js.map +1 -1
- package/dist/components/button.d.cts +2 -2
- package/dist/components/button.d.ts +2 -2
- package/dist/components/collection-card.cjs +5 -5
- package/dist/components/collection-card.cjs.map +1 -1
- package/dist/components/collection-card.js +5 -5
- package/dist/components/collection-card.js.map +1 -1
- package/dist/components/collections-page.cjs +3 -3
- package/dist/components/collections-page.cjs.map +1 -1
- package/dist/components/collections-page.js +3 -3
- package/dist/components/collections-page.js.map +1 -1
- package/dist/components/dialog.cjs +1 -1
- package/dist/components/dialog.cjs.map +1 -1
- package/dist/components/dialog.js +1 -1
- package/dist/components/dialog.js.map +1 -1
- package/dist/components/fast-mint/fast-mint.cjs +1 -1
- package/dist/components/fast-mint/fast-mint.cjs.map +1 -1
- package/dist/components/fast-mint/fast-mint.d.cts +2 -2
- package/dist/components/fast-mint/fast-mint.d.ts +2 -2
- package/dist/components/fast-mint/fast-mint.js +1 -1
- package/dist/components/fast-mint/fast-mint.js.map +1 -1
- package/dist/components/launchpad/edition-mint-schema.d.cts +2 -2
- package/dist/components/launchpad/edition-mint-schema.d.ts +2 -2
- package/dist/components/launchpad/edition-mint.cjs +1 -1
- package/dist/components/launchpad/edition-mint.cjs.map +1 -1
- package/dist/components/launchpad/edition-mint.js +1 -1
- package/dist/components/launchpad/edition-mint.js.map +1 -1
- package/dist/components/launchpad/single-edition-mint.cjs +1 -1
- package/dist/components/launchpad/single-edition-mint.cjs.map +1 -1
- package/dist/components/launchpad/single-edition-mint.js +1 -1
- package/dist/components/launchpad/single-edition-mint.js.map +1 -1
- package/dist/components/launchpad/tier-mint-form.cjs +1 -1
- package/dist/components/launchpad/tier-mint-form.cjs.map +1 -1
- package/dist/components/launchpad/tier-mint-form.js +1 -1
- package/dist/components/launchpad/tier-mint-form.js.map +1 -1
- package/dist/components/medialane-app.cjs.map +1 -1
- package/dist/components/medialane-app.d.cts +0 -1
- package/dist/components/medialane-app.d.ts +0 -1
- package/dist/components/medialane-app.js.map +1 -1
- package/dist/components/sheet.d.cts +1 -1
- package/dist/components/sheet.d.ts +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/launchpad/single-edition-mint.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport * as z from \"zod\";\nimport { Boxes, ChevronDown, ImagePlus, Layers, ShieldCheck, Upload } from \"lucide-react\";\nimport { assetHref, collectionHref, getService, profileHref } from \"@medialane/sdk\";\nimport { acceptFor, uploadError } from \"../../utils/upload-limits.js\";\nimport { FIELD_LIMITS } from \"../../utils/field-limits.js\";\nimport { mintedTokenIdFromReceipt } from \"@medialane/sdk/starknet\";\nimport Image from \"../image.js\";\nimport { Input } from \"../input.js\";\nimport { Textarea } from \"../textarea.js\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"../select.js\";\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from \"../collapsible.js\";\nimport { CollapsibleSection } from \"../collapsible-section.js\";\nimport { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from \"../form.js\";\nimport { ToggleGroup } from \"../create-form-primitives.js\";\nimport { IPTypeFields } from \"../ip-type-fields.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 { CollectionPicker } from \"./collection-picker.js\";\nimport { AI_POLICIES, DERIVATIVES_OPTIONS, IP_TYPES, LICENSE_TYPES, type IPType } from \"../../data/ip.js\";\nimport { cn } from \"../../utils/cn.js\";\nimport { runIntentCalls } from \"../../utils/run-intent-calls.js\";\nimport { pinAssetMetadata, uploadFileToIpfs } from \"../../utils/ipfs-upload.js\";\nimport { useCollectionsByOwner } from \"../../utils/use-collections.js\";\nimport { useTransaction } from \"../../utils/use-transaction.js\";\nimport { invalidatePortfolioCache } from \"../../utils/portfolio-cache.js\";\nimport type { MetadataField } from \"../ip-type-fields.js\";\n\nconst schema = z.object({\n collectionId: z.string().min(1, \"Select a collection\"),\n name: z.string().min(1, \"Name required\").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 ipType: z.enum(IP_TYPES),\n licenseType: z.string().min(1, \"License required\"),\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 royalty: z.coerce.number().min(0).max(50),\n image: z.instanceof(File).optional(),\n});\ntype FormValues = z.infer<typeof schema>;\n\nconst DEFAULTS: FormValues = {\n collectionId: \"\",\n name: \"\",\n description: \"\",\n external_url: \"\",\n ipType: \"NFT\",\n licenseType: \"CC BY-SA\",\n commercialUse: \"Yes\",\n derivatives: \"Share-Alike\",\n attribution: \"Required\",\n geographicScope: \"Worldwide\",\n aiPolicy: \"Not Allowed\",\n royalty: 0,\n};\n\nexport function SingleEditionMint({ aside }: { aside?: ReactNode }) {\n const app = useMedialaneApp();\n const walletAddress = app.walletAddress;\n const tx = useTransaction();\n const { collections: allCollections, isLoading: collectionsLoading } = useCollectionsByOwner(walletAddress ?? null);\n const collections = allCollections.filter((c) => getService(c.service)?.id === \"mip-erc721\" && c.collectionId != null);\n\n const [imageFile, setImageFile] = useState<File | null>(null);\n const [imagePreview, setImagePreview] = useState<string | null>(null);\n const [advancedOpen, setAdvancedOpen] = useState(false);\n const [licensingOpen, setLicensingOpen] = useState(false);\n const [ipTypeOpen, setIpTypeOpen] = useState(false);\n const [metadataResetKey, setMetadataResetKey] = useState(0);\n const metadataFieldsRef = useRef<MetadataField[]>([]);\n const previewUrlRef = useRef<string | null>(null);\n const imageInputRef = useRef<HTMLInputElement | null>(null);\n\n useEffect(() => {\n return () => {\n if (previewUrlRef.current) URL.revokeObjectURL(previewUrlRef.current);\n };\n }, []);\n\n const form = useForm<FormValues>({ resolver: zodResolver(schema), defaultValues: DEFAULTS });\n const selectedCollectionId = form.watch(\"collectionId\");\n const selectedCollection = collections.find((c) => c.collectionId === selectedCollectionId) ?? null;\n\n useEffect(() => {\n if (collections.length > 0 && !form.getValues(\"collectionId\")) form.setValue(\"collectionId\", collections[0]!.collectionId!);\n }, [collections, form]);\n\n useEffect(() => {\n if (selectedCollection?.contractAddress && !form.getValues(\"external_url\")) {\n form.setValue(\"external_url\", `https://medialane.io${collectionHref(\"STARKNET\", selectedCollection.contractAddress)}`);\n }\n }, [selectedCollection?.contractAddress, form]);\n\n const handleLicenseChange = (value: string) => {\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\n const uploadDocument = async (file: File) => {\n await app.ensureSignedIn?.();\n return (await uploadFileToIpfs(app.getClient().api, file, \"document\")).uri;\n };\n\n const handleAgain = () => {\n tx.reset();\n form.reset({ ...DEFAULTS, collectionId: collections[0]?.collectionId ?? \"\" });\n metadataFieldsRef.current = [];\n setMetadataResetKey((key) => key + 1);\n setImageFile(null);\n setImagePreview(null);\n if (imageInputRef.current) imageInputRef.current.value = \"\";\n };\n\n const onSubmit = (values: FormValues) => {\n if (!walletAddress) 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 externalUrl: values.external_url,\n creator: walletAddress,\n ipType: values.ipType,\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 imageFile,\n templateTraits: metadataFieldsRef.current.filter((f) => f.traitType.trim() && f.value.trim()).map((f) => ({ traitType: f.traitType.trim(), value: f.value.trim() })),\n });\n await runIntentCalls(signer, () =>\n api.intents.create(\"mint\", {\n owner: walletAddress,\n collectionId: values.collectionId,\n recipient: walletAddress,\n tokenUri: pinned.uri,\n royaltyBps: Math.round(values.royalty * 100),\n }),\n );\n invalidatePortfolioCache(walletAddress);\n });\n };\n\n const mintedTokenId = tx.receipt && selectedCollection ? mintedTokenIdFromReceipt(tx.receipt, selectedCollection.contractAddress) : null;\n const mintedHref = mintedTokenId && selectedCollection ? assetHref(\"STARKNET\", selectedCollection.contractAddress, mintedTokenId) : null;\n const busy = tx.phase !== \"idle\" || collectionsLoading || collections.length === 0;\n\n return (\n <WalletRequired\n icon={ImagePlus}\n iconClassName=\"text-brand-blue\"\n title=\"Secure your account to create\"\n description=\"Publish your creative work as a single-copy NFT in a collection you own.\"\n >\n <TransactionDialog tx={tx} title=\"Mint NFT\" workingLabel=\"Minting your work…\" firstStepLabel=\"Upload to IPFS\">\n <TransactionSuccess\n name={form.getValues(\"name\") || \"Your asset\"}\n image={imagePreview}\n title=\"Asset minted\"\n description=\"Your wallet is the owner. The license terms and royalty are recorded in its metadata.\"\n actions={[\n ...(mintedHref ? [{ href: mintedHref, label: \"View asset\" }] : []),\n { href: \"/portfolio/assets\", label: \"View portfolio\" },\n { label: \"Mint another\", onClick: handleAgain },\n ]}\n >\n <RewardEarned actionType=\"mint_asset\" />\n </TransactionSuccess>\n </TransactionDialog>\n\n <ClaimRouteShell\n icon={<ImagePlus className=\"h-4 w-4 text-white\" />}\n title=\"Mint NFT\"\n subtitle=\"Publish your creative work as a single-copy NFT in a collection you own — free to mint, and it's yours.\"\n aside={\n <>\n <MedialaneCollectionCard\n image={imagePreview}\n name={form.watch(\"name\")}\n collection={selectedCollection?.name || \"IP Asset\"}\n creator={walletAddress ? `${walletAddress.slice(0, 6)}…${walletAddress.slice(-4)}` : undefined}\n creatorHref={walletAddress ? profileHref({ address: walletAddress }) : undefined}\n />\n {aside}\n </>\n }\n >\n <Form {...form}>\n <form onSubmit={form.handleSubmit(onSubmit)} className=\"space-y-6\">\n <FormField control={form.control} name=\"collectionId\" render={({ field }) => (\n <FormItem>\n <FormLabel className=\"flex items-center gap-1.5\"><Boxes className=\"h-4 w-4\" />Collection *</FormLabel>\n <CollectionPicker\n collections={collections}\n loading={collectionsLoading}\n value={field.value}\n onChange={field.onChange}\n newCollectionHref=\"/launchpad/single-editions/collection\"\n />\n <FormMessage />\n </FormItem>\n )} />\n\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">Cover image</label>\n <div\n className=\"border-2 border-dashed border-border rounded-xl p-8 text-center cursor-pointer hover:border-primary/50 transition-colors\"\n role=\"button\"\n tabIndex={0}\n aria-label=\"Upload image\"\n onClick={() => imageInputRef.current?.click()}\n onKeyDown={(e) => { if (e.key === \"Enter\" || e.key === \" \") { e.preventDefault(); imageInputRef.current?.click(); } }}\n >\n {imagePreview ? (\n <div className=\"relative mx-auto h-48 w-48 overflow-hidden rounded-lg\">\n <Image src={imagePreview} alt=\"Preview\" fill unoptimized className=\"object-cover\" />\n </div>\n ) : (\n <div className=\"flex flex-col items-center gap-2 text-muted-foreground\">\n <Upload className=\"h-8 w-8\" />\n <p className=\"text-sm\">Click to upload (JPG, PNG, GIF, SVG, WebP)</p>\n </div>\n )}\n <input\n ref={imageInputRef}\n type=\"file\"\n accept={acceptFor(\"image\")}\n className=\"hidden\"\n onChange={(e) => {\n const file = e.target.files?.[0];\n if (!file) return;\n const fileError = uploadError(file, \"image\");\n if (fileError) {\n form.setError(\"image\", { message: fileError });\n e.target.value = \"\";\n return;\n }\n form.clearErrors(\"image\");\n setImageFile(file);\n form.setValue(\"image\", file);\n if (previewUrlRef.current) URL.revokeObjectURL(previewUrlRef.current);\n const objectUrl = URL.createObjectURL(file);\n previewUrlRef.current = objectUrl;\n setImagePreview(objectUrl);\n }}\n />\n </div>\n {form.formState.errors.image && <p role=\"alert\" className=\"text-sm text-destructive\">{form.formState.errors.image.message}</p>}\n </div>\n\n <FormField control={form.control} name=\"name\" render={({ field }) => (\n <FormItem>\n <FormLabel>Name *</FormLabel>\n <FormControl><Input placeholder=\"My Creative Work\" {...field} /></FormControl>\n <FormMessage />\n </FormItem>\n )} />\n\n <FormField control={form.control} name=\"description\" render={({ field }) => (\n <FormItem>\n <FormLabel>Description</FormLabel>\n <FormControl><Textarea placeholder=\"Describe your work, its story, and any context for buyers…\" rows={4} {...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 <CollapsibleSection\n open={licensingOpen}\n onOpenChange={setLicensingOpen}\n icon={<ShieldCheck className=\"h-4 w-4 text-primary\" />}\n label=\"Licensing Terms\"\n hint=\"Optional · Berne Convention\"\n >\n <p className=\"text-xs text-muted-foreground\">Set how others can use your work. These terms are saved permanently with it as proof of authorship.</p>\n <FormField control={form.control} name=\"licenseType\" render={({ field }) => (\n <FormItem>\n <FormLabel>License</FormLabel>\n <Select value={field.value} onValueChange={handleLicenseChange}>\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 <FormField control={form.control} name=\"royalty\" render={({ field }) => (\n <FormItem>\n <FormLabel>Royalty % (0–50)</FormLabel>\n <FormControl>\n <Input type=\"number\" min={0} max={50} step={0.5} placeholder=\"0\" {...field} onChange={(e) => field.onChange(parseFloat(e.target.value) || 0)} />\n </FormControl>\n <FormMessage />\n </FormItem>\n )} />\n </CollapsibleContent>\n </Collapsible>\n </CollapsibleSection>\n\n <CollapsibleSection\n open={ipTypeOpen}\n onOpenChange={setIpTypeOpen}\n icon={<Layers className=\"h-4 w-4 text-primary\" />}\n label=\"IP Type & Metadata\"\n hint=\"Optional\"\n >\n <p className=\"text-xs text-muted-foreground\">Choose a content type, fill suggested metadata, or add your own trait pairs.</p>\n <FormField control={form.control} name=\"ipType\" render={({ field }) => (\n <FormItem>\n <FormLabel>IP Type</FormLabel>\n <Select onValueChange={field.onChange} value={field.value}>\n <FormControl><SelectTrigger><SelectValue /></SelectTrigger></FormControl>\n <SelectContent>{IP_TYPES.map((t) => <SelectItem key={t} value={t}>{t}</SelectItem>)}</SelectContent>\n </Select>\n </FormItem>\n )} />\n <IPTypeFields\n key={metadataResetKey}\n ipType={form.watch(\"ipType\") as IPType}\n onChange={(fields) => { metadataFieldsRef.current = fields; }}\n uploadDocument={uploadDocument}\n />\n </CollapsibleSection>\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] bg-brand-blue ${busy ? \"opacity-40 pointer-events-none\" : \"\"}`}\n >\n Mint NFT\n </button>\n <p className=\"text-xs text-center text-muted-foreground\">Free to mint — protocol fee is zero.</p>\n </form>\n </Form>\n </ClaimRouteShell>\n </WalletRequired>\n );\n}\n"],"mappings":"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","names":["Image"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/launchpad/single-edition-mint.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport * as z from \"zod\";\nimport { Boxes, ChevronDown, ImagePlus, Layers, ShieldCheck, Upload } from \"lucide-react\";\nimport { assetHref, collectionHref, getService, profileHref } from \"@medialane/sdk\";\nimport { acceptFor, uploadError } from \"../../utils/upload-limits.js\";\nimport { FIELD_LIMITS } from \"../../utils/field-limits.js\";\nimport { mintedTokenIdFromReceipt } from \"@medialane/sdk/starknet\";\nimport Image from \"../image.js\";\nimport { Input } from \"../input.js\";\nimport { Textarea } from \"../textarea.js\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"../select.js\";\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from \"../collapsible.js\";\nimport { CollapsibleSection } from \"../collapsible-section.js\";\nimport { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from \"../form.js\";\nimport { ToggleGroup } from \"../create-form-primitives.js\";\nimport { IPTypeFields } from \"../ip-type-fields.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 { CollectionPicker } from \"./collection-picker.js\";\nimport { AI_POLICIES, DERIVATIVES_OPTIONS, IP_TYPES, LICENSE_TYPES, type IPType } from \"../../data/ip.js\";\nimport { cn } from \"../../utils/cn.js\";\nimport { runIntentCalls } from \"../../utils/run-intent-calls.js\";\nimport { pinAssetMetadata, uploadFileToIpfs } from \"../../utils/ipfs-upload.js\";\nimport { useCollectionsByOwner } from \"../../utils/use-collections.js\";\nimport { useTransaction } from \"../../utils/use-transaction.js\";\nimport { invalidatePortfolioCache } from \"../../utils/portfolio-cache.js\";\nimport type { MetadataField } from \"../ip-type-fields.js\";\n\nconst schema = z.object({\n collectionId: z.string().min(1, \"Select a collection\"),\n name: z.string().min(1, \"Name required\").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 ipType: z.enum(IP_TYPES),\n licenseType: z.string().min(1, \"License required\"),\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 royalty: z.coerce.number().min(0).max(50),\n image: z.instanceof(File).optional(),\n});\ntype FormValues = z.infer<typeof schema>;\n\nconst DEFAULTS: FormValues = {\n collectionId: \"\",\n name: \"\",\n description: \"\",\n external_url: \"\",\n ipType: \"NFT\",\n licenseType: \"CC BY-SA\",\n commercialUse: \"Yes\",\n derivatives: \"Share-Alike\",\n attribution: \"Required\",\n geographicScope: \"Worldwide\",\n aiPolicy: \"Allowed\",\n royalty: 0,\n};\n\nexport function SingleEditionMint({ aside }: { aside?: ReactNode }) {\n const app = useMedialaneApp();\n const walletAddress = app.walletAddress;\n const tx = useTransaction();\n const { collections: allCollections, isLoading: collectionsLoading } = useCollectionsByOwner(walletAddress ?? null);\n const collections = allCollections.filter((c) => getService(c.service)?.id === \"mip-erc721\" && c.collectionId != null);\n\n const [imageFile, setImageFile] = useState<File | null>(null);\n const [imagePreview, setImagePreview] = useState<string | null>(null);\n const [advancedOpen, setAdvancedOpen] = useState(false);\n const [licensingOpen, setLicensingOpen] = useState(false);\n const [ipTypeOpen, setIpTypeOpen] = useState(false);\n const [metadataResetKey, setMetadataResetKey] = useState(0);\n const metadataFieldsRef = useRef<MetadataField[]>([]);\n const previewUrlRef = useRef<string | null>(null);\n const imageInputRef = useRef<HTMLInputElement | null>(null);\n\n useEffect(() => {\n return () => {\n if (previewUrlRef.current) URL.revokeObjectURL(previewUrlRef.current);\n };\n }, []);\n\n const form = useForm<FormValues>({ resolver: zodResolver(schema), defaultValues: DEFAULTS });\n const selectedCollectionId = form.watch(\"collectionId\");\n const selectedCollection = collections.find((c) => c.collectionId === selectedCollectionId) ?? null;\n\n useEffect(() => {\n if (collections.length > 0 && !form.getValues(\"collectionId\")) form.setValue(\"collectionId\", collections[0]!.collectionId!);\n }, [collections, form]);\n\n useEffect(() => {\n if (selectedCollection?.contractAddress && !form.getValues(\"external_url\")) {\n form.setValue(\"external_url\", `https://medialane.io${collectionHref(\"STARKNET\", selectedCollection.contractAddress)}`);\n }\n }, [selectedCollection?.contractAddress, form]);\n\n const handleLicenseChange = (value: string) => {\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\n const uploadDocument = async (file: File) => {\n await app.ensureSignedIn?.();\n return (await uploadFileToIpfs(app.getClient().api, file, \"document\")).uri;\n };\n\n const handleAgain = () => {\n tx.reset();\n form.reset({ ...DEFAULTS, collectionId: collections[0]?.collectionId ?? \"\" });\n metadataFieldsRef.current = [];\n setMetadataResetKey((key) => key + 1);\n setImageFile(null);\n setImagePreview(null);\n if (imageInputRef.current) imageInputRef.current.value = \"\";\n };\n\n const onSubmit = (values: FormValues) => {\n if (!walletAddress) 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 externalUrl: values.external_url,\n creator: walletAddress,\n ipType: values.ipType,\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 imageFile,\n templateTraits: metadataFieldsRef.current.filter((f) => f.traitType.trim() && f.value.trim()).map((f) => ({ traitType: f.traitType.trim(), value: f.value.trim() })),\n });\n await runIntentCalls(signer, () =>\n api.intents.create(\"mint\", {\n owner: walletAddress,\n collectionId: values.collectionId,\n recipient: walletAddress,\n tokenUri: pinned.uri,\n royaltyBps: Math.round(values.royalty * 100),\n }),\n );\n invalidatePortfolioCache(walletAddress);\n });\n };\n\n const mintedTokenId = tx.receipt && selectedCollection ? mintedTokenIdFromReceipt(tx.receipt, selectedCollection.contractAddress) : null;\n const mintedHref = mintedTokenId && selectedCollection ? assetHref(\"STARKNET\", selectedCollection.contractAddress, mintedTokenId) : null;\n const busy = tx.phase !== \"idle\" || collectionsLoading || collections.length === 0;\n\n return (\n <WalletRequired\n icon={ImagePlus}\n iconClassName=\"text-brand-blue\"\n title=\"Secure your account to create\"\n description=\"Publish your creative work as a single-copy NFT in a collection you own.\"\n >\n <TransactionDialog tx={tx} title=\"Mint NFT\" workingLabel=\"Minting your work…\" firstStepLabel=\"Upload to IPFS\">\n <TransactionSuccess\n name={form.getValues(\"name\") || \"Your asset\"}\n image={imagePreview}\n title=\"Asset minted\"\n description=\"Your wallet is the owner. The license terms and royalty are recorded in its metadata.\"\n actions={[\n ...(mintedHref ? [{ href: mintedHref, label: \"View asset\" }] : []),\n { href: \"/portfolio/assets\", label: \"View portfolio\" },\n { label: \"Mint another\", onClick: handleAgain },\n ]}\n >\n <RewardEarned actionType=\"mint_asset\" />\n </TransactionSuccess>\n </TransactionDialog>\n\n <ClaimRouteShell\n icon={<ImagePlus className=\"h-4 w-4 text-white\" />}\n title=\"Mint NFT\"\n subtitle=\"Publish your creative work as a single-copy NFT in a collection you own — free to mint, and it's yours.\"\n aside={\n <>\n <MedialaneCollectionCard\n image={imagePreview}\n name={form.watch(\"name\")}\n collection={selectedCollection?.name || \"IP Asset\"}\n creator={walletAddress ? `${walletAddress.slice(0, 6)}…${walletAddress.slice(-4)}` : undefined}\n creatorHref={walletAddress ? profileHref({ address: walletAddress }) : undefined}\n />\n {aside}\n </>\n }\n >\n <Form {...form}>\n <form onSubmit={form.handleSubmit(onSubmit)} className=\"space-y-6\">\n <FormField control={form.control} name=\"collectionId\" render={({ field }) => (\n <FormItem>\n <FormLabel className=\"flex items-center gap-1.5\"><Boxes className=\"h-4 w-4\" />Collection *</FormLabel>\n <CollectionPicker\n collections={collections}\n loading={collectionsLoading}\n value={field.value}\n onChange={field.onChange}\n newCollectionHref=\"/launchpad/single-editions/collection\"\n />\n <FormMessage />\n </FormItem>\n )} />\n\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">Cover image</label>\n <div\n className=\"border-2 border-dashed border-border rounded-xl p-8 text-center cursor-pointer hover:border-primary/50 transition-colors\"\n role=\"button\"\n tabIndex={0}\n aria-label=\"Upload image\"\n onClick={() => imageInputRef.current?.click()}\n onKeyDown={(e) => { if (e.key === \"Enter\" || e.key === \" \") { e.preventDefault(); imageInputRef.current?.click(); } }}\n >\n {imagePreview ? (\n <div className=\"relative mx-auto h-48 w-48 overflow-hidden rounded-lg\">\n <Image src={imagePreview} alt=\"Preview\" fill unoptimized className=\"object-cover\" />\n </div>\n ) : (\n <div className=\"flex flex-col items-center gap-2 text-muted-foreground\">\n <Upload className=\"h-8 w-8\" />\n <p className=\"text-sm\">Click to upload (JPG, PNG, GIF, SVG, WebP)</p>\n </div>\n )}\n <input\n ref={imageInputRef}\n type=\"file\"\n accept={acceptFor(\"image\")}\n className=\"hidden\"\n onChange={(e) => {\n const file = e.target.files?.[0];\n if (!file) return;\n const fileError = uploadError(file, \"image\");\n if (fileError) {\n form.setError(\"image\", { message: fileError });\n e.target.value = \"\";\n return;\n }\n form.clearErrors(\"image\");\n setImageFile(file);\n form.setValue(\"image\", file);\n if (previewUrlRef.current) URL.revokeObjectURL(previewUrlRef.current);\n const objectUrl = URL.createObjectURL(file);\n previewUrlRef.current = objectUrl;\n setImagePreview(objectUrl);\n }}\n />\n </div>\n {form.formState.errors.image && <p role=\"alert\" className=\"text-sm text-destructive\">{form.formState.errors.image.message}</p>}\n </div>\n\n <FormField control={form.control} name=\"name\" render={({ field }) => (\n <FormItem>\n <FormLabel>Name *</FormLabel>\n <FormControl><Input placeholder=\"My Creative Work\" {...field} /></FormControl>\n <FormMessage />\n </FormItem>\n )} />\n\n <FormField control={form.control} name=\"description\" render={({ field }) => (\n <FormItem>\n <FormLabel>Description</FormLabel>\n <FormControl><Textarea placeholder=\"Describe your work, its story, and any context for buyers…\" rows={4} {...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 <CollapsibleSection\n open={licensingOpen}\n onOpenChange={setLicensingOpen}\n icon={<ShieldCheck className=\"h-4 w-4 text-primary\" />}\n label=\"Licensing Terms\"\n hint=\"Optional · Berne Convention\"\n >\n <p className=\"text-xs text-muted-foreground\">Set how others can use your work. These terms are saved permanently with it as proof of authorship.</p>\n <FormField control={form.control} name=\"licenseType\" render={({ field }) => (\n <FormItem>\n <FormLabel>License</FormLabel>\n <Select value={field.value} onValueChange={handleLicenseChange}>\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 <FormField control={form.control} name=\"royalty\" render={({ field }) => (\n <FormItem>\n <FormLabel>Royalty % (0–50)</FormLabel>\n <FormControl>\n <Input type=\"number\" min={0} max={50} step={0.5} placeholder=\"0\" {...field} onChange={(e) => field.onChange(parseFloat(e.target.value) || 0)} />\n </FormControl>\n <FormMessage />\n </FormItem>\n )} />\n </CollapsibleContent>\n </Collapsible>\n </CollapsibleSection>\n\n <CollapsibleSection\n open={ipTypeOpen}\n onOpenChange={setIpTypeOpen}\n icon={<Layers className=\"h-4 w-4 text-primary\" />}\n label=\"IP Type & Metadata\"\n hint=\"Optional\"\n >\n <p className=\"text-xs text-muted-foreground\">Choose a content type, fill suggested metadata, or add your own trait pairs.</p>\n <FormField control={form.control} name=\"ipType\" render={({ field }) => (\n <FormItem>\n <FormLabel>IP Type</FormLabel>\n <Select onValueChange={field.onChange} value={field.value}>\n <FormControl><SelectTrigger><SelectValue /></SelectTrigger></FormControl>\n <SelectContent>{IP_TYPES.map((t) => <SelectItem key={t} value={t}>{t}</SelectItem>)}</SelectContent>\n </Select>\n </FormItem>\n )} />\n <IPTypeFields\n key={metadataResetKey}\n ipType={form.watch(\"ipType\") as IPType}\n onChange={(fields) => { metadataFieldsRef.current = fields; }}\n uploadDocument={uploadDocument}\n />\n </CollapsibleSection>\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] bg-brand-blue ${busy ? \"opacity-40 pointer-events-none\" : \"\"}`}\n >\n Mint NFT\n </button>\n <p className=\"text-xs text-center text-muted-foreground\">Free to mint — protocol fee is zero.</p>\n </form>\n </Form>\n </ClaimRouteShell>\n </WalletRequired>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAgMU;AA9LV,mBAA4D;AAC5D,6BAAwB;AACxB,iBAA4B;AAC5B,QAAmB;AACnB,0BAA2E;AAC3E,iBAAmE;AACnE,2BAAuC;AACvC,0BAA6B;AAC7B,sBAAyC;AACzC,mBAAkB;AAClB,mBAAsB;AACtB,sBAAyB;AACzB,oBAA8E;AAC9E,yBAAoE;AACpE,iCAAmC;AACnC,kBAA+E;AAC/E,oCAA4B;AAC5B,4BAA6B;AAC7B,+BAAgC;AAChC,iCAAmC;AACnC,uCAAwC;AACxC,gCAAkC;AAClC,6BAA+B;AAC/B,2BAAgC;AAChC,2BAA6B;AAC7B,+BAAiC;AACjC,gBAAuF;AACvF,gBAAmB;AACnB,8BAA+B;AAC/B,yBAAmD;AACnD,6BAAsC;AACtC,6BAA+B;AAC/B,6BAAyC;AAGzC,MAAM,SAAS,EAAE,OAAO;AAAA,EACtB,cAAc,EAAE,OAAO,EAAE,IAAI,GAAG,qBAAqB;AAAA,EACrD,MAAM,EAAE,OAAO,EAAE,IAAI,GAAG,eAAe,EAAE,IAAI,iCAAa,IAAI;AAAA,EAC9D,aAAa,EAAE,OAAO,EAAE,IAAI,iCAAa,WAAW,EAAE,SAAS;AAAA,EAC/D,cAAc,EACX,OAAO,EACP,IAAI,GAAG,EACP,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,WAAW,SAAS,KAAK,EAAE,WAAW,UAAU,GAAG,EAAE,SAAS,sCAAsC,CAAC,EAC3H,SAAS;AAAA,EACZ,QAAQ,EAAE,KAAK,kBAAQ;AAAA,EACvB,aAAa,EAAE,OAAO,EAAE,IAAI,GAAG,kBAAkB;AAAA,EACjD,eAAe,EAAE,KAAK,CAAC,OAAO,IAAI,CAAC;AAAA,EACnC,aAAa,EAAE,KAAK,CAAC,WAAW,eAAe,aAAa,CAAC;AAAA,EAC7D,aAAa,EAAE,KAAK,CAAC,YAAY,cAAc,CAAC;AAAA,EAChD,iBAAiB,EAAE,OAAO;AAAA,EAC1B,UAAU,EAAE,KAAK,CAAC,WAAW,eAAe,eAAe,CAAC;AAAA,EAC5D,SAAS,EAAE,OAAO,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE;AAAA,EACxC,OAAO,EAAE,WAAW,IAAI,EAAE,SAAS;AACrC,CAAC;AAGD,MAAM,WAAuB;AAAA,EAC3B,cAAc;AAAA,EACd,MAAM;AAAA,EACN,aAAa;AAAA,EACb,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,eAAe;AAAA,EACf,aAAa;AAAA,EACb,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,UAAU;AAAA,EACV,SAAS;AACX;AAEO,SAAS,kBAAkB,EAAE,MAAM,GAA0B;AAClE,QAAM,UAAM,sCAAgB;AAC5B,QAAM,gBAAgB,IAAI;AAC1B,QAAM,SAAK,uCAAe;AAC1B,QAAM,EAAE,aAAa,gBAAgB,WAAW,mBAAmB,QAAI,8CAAsB,iBAAiB,IAAI;AAClH,QAAM,cAAc,eAAe,OAAO,CAAC,UAAM,uBAAW,EAAE,OAAO,GAAG,OAAO,gBAAgB,EAAE,gBAAgB,IAAI;AAErH,QAAM,CAAC,WAAW,YAAY,QAAI,uBAAsB,IAAI;AAC5D,QAAM,CAAC,cAAc,eAAe,QAAI,uBAAwB,IAAI;AACpE,QAAM,CAAC,cAAc,eAAe,QAAI,uBAAS,KAAK;AACtD,QAAM,CAAC,eAAe,gBAAgB,QAAI,uBAAS,KAAK;AACxD,QAAM,CAAC,YAAY,aAAa,QAAI,uBAAS,KAAK;AAClD,QAAM,CAAC,kBAAkB,mBAAmB,QAAI,uBAAS,CAAC;AAC1D,QAAM,wBAAoB,qBAAwB,CAAC,CAAC;AACpD,QAAM,oBAAgB,qBAAsB,IAAI;AAChD,QAAM,oBAAgB,qBAAgC,IAAI;AAE1D,8BAAU,MAAM;AACd,WAAO,MAAM;AACX,UAAI,cAAc,QAAS,KAAI,gBAAgB,cAAc,OAAO;AAAA,IACtE;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,WAAO,gCAAoB,EAAE,cAAU,wBAAY,MAAM,GAAG,eAAe,SAAS,CAAC;AAC3F,QAAM,uBAAuB,KAAK,MAAM,cAAc;AACtD,QAAM,qBAAqB,YAAY,KAAK,CAAC,MAAM,EAAE,iBAAiB,oBAAoB,KAAK;AAE/F,8BAAU,MAAM;AACd,QAAI,YAAY,SAAS,KAAK,CAAC,KAAK,UAAU,cAAc,EAAG,MAAK,SAAS,gBAAgB,YAAY,CAAC,EAAG,YAAa;AAAA,EAC5H,GAAG,CAAC,aAAa,IAAI,CAAC;AAEtB,8BAAU,MAAM;AACd,QAAI,oBAAoB,mBAAmB,CAAC,KAAK,UAAU,cAAc,GAAG;AAC1E,WAAK,SAAS,gBAAgB,2BAAuB,2BAAe,YAAY,mBAAmB,eAAe,CAAC,EAAE;AAAA,IACvH;AAAA,EACF,GAAG,CAAC,oBAAoB,iBAAiB,IAAI,CAAC;AAE9C,QAAM,sBAAsB,CAAC,UAAkB;AAC7C,SAAK,SAAS,eAAe,KAAK;AAClC,UAAM,MAAM,wBAAc,KAAK,CAAC,MAAM,EAAE,UAAU,KAAK;AACvD,QAAI,KAAK;AACP,WAAK,SAAS,iBAAiB,IAAI,aAAa;AAChD,WAAK,SAAS,eAAe,IAAI,WAAW;AAC5C,WAAK,SAAS,eAAe,IAAI,WAAW;AAAA,IAC9C;AAAA,EACF;AAEA,QAAM,iBAAiB,OAAO,SAAe;AAC3C,UAAM,IAAI,iBAAiB;AAC3B,YAAQ,UAAM,qCAAiB,IAAI,UAAU,EAAE,KAAK,MAAM,UAAU,GAAG;AAAA,EACzE;AAEA,QAAM,cAAc,MAAM;AACxB,OAAG,MAAM;AACT,SAAK,MAAM,EAAE,GAAG,UAAU,cAAc,YAAY,CAAC,GAAG,gBAAgB,GAAG,CAAC;AAC5E,sBAAkB,UAAU,CAAC;AAC7B,wBAAoB,CAAC,QAAQ,MAAM,CAAC;AACpC,iBAAa,IAAI;AACjB,oBAAgB,IAAI;AACpB,QAAI,cAAc,QAAS,eAAc,QAAQ,QAAQ;AAAA,EAC3D;AAEA,QAAM,WAAW,CAAC,WAAuB;AACvC,QAAI,CAAC,cAAe;AACpB,SAAK,GAAG,IAAI,OAAO,WAAW;AAC5B,YAAM,IAAI,iBAAiB;AAC3B,YAAM,MAAM,IAAI,UAAU,EAAE;AAC5B,YAAM,SAAS,UAAM,qCAAiB,KAAK;AAAA,QACzC,MAAM,OAAO;AAAA,QACb,aAAa,OAAO,eAAe;AAAA,QACnC,aAAa,OAAO;AAAA,QACpB,SAAS;AAAA,QACT,QAAQ,OAAO;AAAA,QACf,aAAa,OAAO;AAAA,QACpB,eAAe,OAAO;AAAA,QACtB,aAAa,OAAO;AAAA,QACpB,aAAa,OAAO;AAAA,QACpB,iBAAiB,OAAO;AAAA,QACxB,UAAU,OAAO;AAAA,QACjB,SAAS,OAAO,OAAO,OAAO;AAAA,QAC9B;AAAA,QACA,gBAAgB,kBAAkB,QAAQ,OAAO,CAAC,MAAM,EAAE,UAAU,KAAK,KAAK,EAAE,MAAM,KAAK,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,UAAU,KAAK,GAAG,OAAO,EAAE,MAAM,KAAK,EAAE,EAAE;AAAA,MACrK,CAAC;AACD,gBAAM;AAAA,QAAe;AAAA,QAAQ,MAC3B,IAAI,QAAQ,OAAO,QAAQ;AAAA,UACzB,OAAO;AAAA,UACP,cAAc,OAAO;AAAA,UACrB,WAAW;AAAA,UACX,UAAU,OAAO;AAAA,UACjB,YAAY,KAAK,MAAM,OAAO,UAAU,GAAG;AAAA,QAC7C,CAAC;AAAA,MACH;AACA,2DAAyB,aAAa;AAAA,IACxC,CAAC;AAAA,EACH;AAEA,QAAM,gBAAgB,GAAG,WAAW,yBAAqB,0CAAyB,GAAG,SAAS,mBAAmB,eAAe,IAAI;AACpI,QAAM,aAAa,iBAAiB,yBAAqB,sBAAU,YAAY,mBAAmB,iBAAiB,aAAa,IAAI;AACpI,QAAM,OAAO,GAAG,UAAU,UAAU,sBAAsB,YAAY,WAAW;AAEjF,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAM;AAAA,MACN,eAAc;AAAA,MACd,OAAM;AAAA,MACN,aAAY;AAAA,MAEZ;AAAA,oDAAC,+CAAkB,IAAQ,OAAM,YAAW,cAAa,2BAAqB,gBAAe,kBAC3F;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,KAAK,UAAU,MAAM,KAAK;AAAA,YAChC,OAAO;AAAA,YACP,OAAM;AAAA,YACN,aAAY;AAAA,YACZ,SAAS;AAAA,cACP,GAAI,aAAa,CAAC,EAAE,MAAM,YAAY,OAAO,aAAa,CAAC,IAAI,CAAC;AAAA,cAChE,EAAE,MAAM,qBAAqB,OAAO,iBAAiB;AAAA,cACrD,EAAE,OAAO,gBAAgB,SAAS,YAAY;AAAA,YAChD;AAAA,YAEA,sDAAC,qCAAa,YAAW,cAAa;AAAA;AAAA,QACxC,GACF;AAAA,QAEA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,4CAAC,iCAAU,WAAU,sBAAqB;AAAA,YAChD,OAAM;AAAA,YACN,UAAS;AAAA,YACT,OACE,4EACE;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,kBACP,MAAM,KAAK,MAAM,MAAM;AAAA,kBACvB,YAAY,oBAAoB,QAAQ;AAAA,kBACxC,SAAS,gBAAgB,GAAG,cAAc,MAAM,GAAG,CAAC,CAAC,SAAI,cAAc,MAAM,EAAE,CAAC,KAAK;AAAA,kBACrF,aAAa,oBAAgB,wBAAY,EAAE,SAAS,cAAc,CAAC,IAAI;AAAA;AAAA,cACzE;AAAA,cACC;AAAA,eACH;AAAA,YAGF,sDAAC,oBAAM,GAAG,MACR,uDAAC,UAAK,UAAU,KAAK,aAAa,QAAQ,GAAG,WAAU,aACrD;AAAA,0DAAC,yBAAU,SAAS,KAAK,SAAS,MAAK,gBAAe,QAAQ,CAAC,EAAE,MAAM,MACrE,6CAAC,wBACC;AAAA,6DAAC,yBAAU,WAAU,6BAA4B;AAAA,8DAAC,6BAAM,WAAU,WAAU;AAAA,kBAAE;AAAA,mBAAY;AAAA,gBAC1F;AAAA,kBAAC;AAAA;AAAA,oBACC;AAAA,oBACA,SAAS;AAAA,oBACT,OAAO,MAAM;AAAA,oBACb,UAAU,MAAM;AAAA,oBAChB,mBAAkB;AAAA;AAAA,gBACpB;AAAA,gBACA,4CAAC,2BAAY;AAAA,iBACf,GACC;AAAA,cAEH,6CAAC,SAAI,WAAU,aACb;AAAA,4DAAC,WAAM,WAAU,uBAAsB,yBAAW;AAAA,gBAClD;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAU;AAAA,oBACV,MAAK;AAAA,oBACL,UAAU;AAAA,oBACV,cAAW;AAAA,oBACX,SAAS,MAAM,cAAc,SAAS,MAAM;AAAA,oBAC5C,WAAW,CAAC,MAAM;AAAE,0BAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AAAE,0BAAE,eAAe;AAAG,sCAAc,SAAS,MAAM;AAAA,sBAAG;AAAA,oBAAE;AAAA,oBAEnH;AAAA,qCACC,4CAAC,SAAI,WAAU,yDACb,sDAAC,aAAAA,SAAA,EAAM,KAAK,cAAc,KAAI,WAAU,MAAI,MAAC,aAAW,MAAC,WAAU,gBAAe,GACpF,IAEA,6CAAC,SAAI,WAAU,0DACb;AAAA,oEAAC,8BAAO,WAAU,WAAU;AAAA,wBAC5B,4CAAC,OAAE,WAAU,WAAU,wDAA0C;AAAA,yBACnE;AAAA,sBAEF;AAAA,wBAAC;AAAA;AAAA,0BACC,KAAK;AAAA,0BACL,MAAK;AAAA,0BACL,YAAQ,gCAAU,OAAO;AAAA,0BACzB,WAAU;AAAA,0BACV,UAAU,CAAC,MAAM;AACf,kCAAM,OAAO,EAAE,OAAO,QAAQ,CAAC;AAC/B,gCAAI,CAAC,KAAM;AACX,kCAAM,gBAAY,kCAAY,MAAM,OAAO;AAC3C,gCAAI,WAAW;AACb,mCAAK,SAAS,SAAS,EAAE,SAAS,UAAU,CAAC;AAC7C,gCAAE,OAAO,QAAQ;AACjB;AAAA,4BACF;AACA,iCAAK,YAAY,OAAO;AACxB,yCAAa,IAAI;AACjB,iCAAK,SAAS,SAAS,IAAI;AAC3B,gCAAI,cAAc,QAAS,KAAI,gBAAgB,cAAc,OAAO;AACpE,kCAAM,YAAY,IAAI,gBAAgB,IAAI;AAC1C,0CAAc,UAAU;AACxB,4CAAgB,SAAS;AAAA,0BAC3B;AAAA;AAAA,sBACF;AAAA;AAAA;AAAA,gBACF;AAAA,gBACC,KAAK,UAAU,OAAO,SAAS,4CAAC,OAAE,MAAK,SAAQ,WAAU,4BAA4B,eAAK,UAAU,OAAO,MAAM,SAAQ;AAAA,iBAC5H;AAAA,cAEA,4CAAC,yBAAU,SAAS,KAAK,SAAS,MAAK,QAAO,QAAQ,CAAC,EAAE,MAAM,MAC7D,6CAAC,wBACC;AAAA,4DAAC,yBAAU,oBAAM;AAAA,gBACjB,4CAAC,2BAAY,sDAAC,sBAAM,aAAY,oBAAoB,GAAG,OAAO,GAAE;AAAA,gBAChE,4CAAC,2BAAY;AAAA,iBACf,GACC;AAAA,cAEH,4CAAC,yBAAU,SAAS,KAAK,SAAS,MAAK,eAAc,QAAQ,CAAC,EAAE,MAAM,MACpE,6CAAC,wBACC;AAAA,4DAAC,yBAAU,yBAAW;AAAA,gBACtB,4CAAC,2BAAY,sDAAC,4BAAS,aAAY,mEAA6D,MAAM,GAAI,GAAG,OAAO,GAAE;AAAA,gBACtH,4CAAC,2BAAY;AAAA,iBACf,GACC;AAAA,cAEH,4CAAC,yBAAU,SAAS,KAAK,SAAS,MAAK,gBAAe,QAAQ,CAAC,EAAE,MAAM,MACrE,6CAAC,wBACC;AAAA,6DAAC,yBAAU;AAAA;AAAA,kBAAc,4CAAC,UAAK,WAAU,qCAAoC,wBAAU;AAAA,mBAAO;AAAA,gBAC9F,4CAAC,2BAAY,sDAAC,sBAAM,aAAY,2BAA2B,GAAG,OAAO,GAAE;AAAA,gBACvE,4CAAC,2BAAY;AAAA,iBACf,GACC;AAAA,cAEH;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAM;AAAA,kBACN,cAAc;AAAA,kBACd,MAAM,4CAAC,mCAAY,WAAU,wBAAuB;AAAA,kBACpD,OAAM;AAAA,kBACN,MAAK;AAAA,kBAEL;AAAA,gEAAC,OAAE,WAAU,iCAAgC,iHAAmG;AAAA,oBAChJ,4CAAC,yBAAU,SAAS,KAAK,SAAS,MAAK,eAAc,QAAQ,CAAC,EAAE,MAAM,MACpE,6CAAC,wBACC;AAAA,kEAAC,yBAAU,qBAAO;AAAA,sBAClB,6CAAC,wBAAO,OAAO,MAAM,OAAO,eAAe,qBACzC;AAAA,oEAAC,2BAAY,sDAAC,+BAAc,sDAAC,6BAAY,GAAE,GAAgB;AAAA,wBAC3D,4CAAC,+BAAe,kCAAc,IAAI,CAAC,MAAM,4CAAC,4BAAyB,OAAO,EAAE,OAAQ,YAAE,SAA5B,EAAE,KAAgC,CAAa,GAAE;AAAA,yBAC7G;AAAA,uBACE,MAAM;AAAE,8BAAM,MAAM,wBAAc,KAAK,CAAC,MAAM,EAAE,UAAU,MAAM,KAAK;AAAG,+BAAO,MAAM,4CAAC,OAAE,WAAU,sCAAsC,cAAI,aAAY,IAAO;AAAA,sBAAM,GAAG;AAAA,sBAC1K,4CAAC,2BAAY;AAAA,uBACf,GACC;AAAA,oBACH,4CAAC,yBAAU,SAAS,KAAK,SAAS,MAAK,iBAAgB,QAAQ,CAAC,EAAE,MAAM,MACtE,6CAAC,wBAAS;AAAA,kEAAC,yBAAU,4BAAc;AAAA,sBAAY,4CAAC,6CAAY,OAAO,MAAM,OAAO,SAAS,CAAC,OAAO,IAAI,GAAG,UAAU,MAAM,UAAU;AAAA,uBAAE,GACnI;AAAA,oBACH,4CAAC,yBAAU,SAAS,KAAK,SAAS,MAAK,eAAc,QAAQ,CAAC,EAAE,MAAM,MACpE,6CAAC,wBAAS;AAAA,kEAAC,yBAAU,yBAAW;AAAA,sBAAY,4CAAC,6CAAY,OAAO,MAAM,OAAO,SAAS,+BAAqB,UAAU,MAAM,UAAU;AAAA,uBAAE,GACtI;AAAA,oBACH,4CAAC,yBAAU,SAAS,KAAK,SAAS,MAAK,eAAc,QAAQ,CAAC,EAAE,MAAM,MACpE,6CAAC,wBAAS;AAAA,kEAAC,yBAAU,yBAAW;AAAA,sBAAY,4CAAC,6CAAY,OAAO,MAAM,OAAO,SAAS,CAAC,YAAY,cAAc,GAAG,UAAU,MAAM,UAAU;AAAA,uBAAE,GAC/I;AAAA,oBACH,6CAAC,kCAAY,MAAM,cAAc,cAAc,iBAC7C;AAAA,kEAAC,yCAAmB,SAAO,MACzB,uDAAC,YAAO,MAAK,UAAS,WAAU,mGAC9B;AAAA,oEAAC,mCAAY,eAAW,cAAG,oCAAoC,gBAAgB,YAAY,GAAG;AAAA,wBAAE;AAAA,yBAElG,GACF;AAAA,sBACA,6CAAC,yCAAmB,WAAU,kBAC5B;AAAA,oEAAC,yBAAU,SAAS,KAAK,SAAS,MAAK,mBAAkB,QAAQ,CAAC,EAAE,MAAM,MACxE,6CAAC,wBACC;AAAA,sEAAC,yBAAU,uBAAS;AAAA,0BACpB,4CAAC,2BAAY,sDAAC,sBAAM,aAAY,aAAa,GAAG,OAAO,GAAE;AAAA,2BAC3D,GACC;AAAA,wBACH,4CAAC,yBAAU,SAAS,KAAK,SAAS,MAAK,YAAW,QAAQ,CAAC,EAAE,MAAM,MACjE,6CAAC,wBAAS;AAAA,sEAAC,yBAAU,8BAAoB;AAAA,0BAAY,4CAAC,6CAAY,OAAO,MAAM,OAAO,SAAS,uBAAa,UAAU,MAAM,UAAU;AAAA,2BAAE,GACvI;AAAA,wBACH,4CAAC,yBAAU,SAAS,KAAK,SAAS,MAAK,WAAU,QAAQ,CAAC,EAAE,MAAM,MAChE,6CAAC,wBACC;AAAA,sEAAC,yBAAU,mCAAgB;AAAA,0BAC3B,4CAAC,2BACC,sDAAC,sBAAM,MAAK,UAAS,KAAK,GAAG,KAAK,IAAI,MAAM,KAAK,aAAY,KAAK,GAAG,OAAO,UAAU,CAAC,MAAM,MAAM,SAAS,WAAW,EAAE,OAAO,KAAK,KAAK,CAAC,GAAG,GAChJ;AAAA,0BACA,4CAAC,2BAAY;AAAA,2BACf,GACC;AAAA,yBACL;AAAA,uBACF;AAAA;AAAA;AAAA,cACF;AAAA,cAEA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAM;AAAA,kBACN,cAAc;AAAA,kBACd,MAAM,4CAAC,8BAAO,WAAU,wBAAuB;AAAA,kBAC/C,OAAM;AAAA,kBACN,MAAK;AAAA,kBAEL;AAAA,gEAAC,OAAE,WAAU,iCAAgC,0FAA4E;AAAA,oBACzH,4CAAC,yBAAU,SAAS,KAAK,SAAS,MAAK,UAAS,QAAQ,CAAC,EAAE,MAAM,MAC/D,6CAAC,wBACC;AAAA,kEAAC,yBAAU,qBAAO;AAAA,sBAClB,6CAAC,wBAAO,eAAe,MAAM,UAAU,OAAO,MAAM,OAClD;AAAA,oEAAC,2BAAY,sDAAC,+BAAc,sDAAC,6BAAY,GAAE,GAAgB;AAAA,wBAC3D,4CAAC,+BAAe,6BAAS,IAAI,CAAC,MAAM,4CAAC,4BAAmB,OAAO,GAAI,eAAd,CAAgB,CAAa,GAAE;AAAA,yBACtF;AAAA,uBACF,GACC;AAAA,oBACH;AAAA,sBAAC;AAAA;AAAA,wBAEC,QAAQ,KAAK,MAAM,QAAQ;AAAA,wBAC3B,UAAU,CAAC,WAAW;AAAE,4CAAkB,UAAU;AAAA,wBAAQ;AAAA,wBAC5D;AAAA;AAAA,sBAHK;AAAA,oBAIP;AAAA;AAAA;AAAA,cACF;AAAA,cAEA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,UAAU;AAAA,kBACV,WAAW,0KAA0K,OAAO,mCAAmC,EAAE;AAAA,kBAClO;AAAA;AAAA,cAED;AAAA,cACA,4CAAC,OAAE,WAAU,6CAA4C,uDAAoC;AAAA,eAC/F,GACF;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF;AAEJ;","names":["Image"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/launchpad/single-edition-mint.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport * as z from \"zod\";\nimport { Boxes, ChevronDown, ImagePlus, Layers, ShieldCheck, Upload } from \"lucide-react\";\nimport { assetHref, collectionHref, getService, profileHref } from \"@medialane/sdk\";\nimport { acceptFor, uploadError } from \"../../utils/upload-limits.js\";\nimport { FIELD_LIMITS } from \"../../utils/field-limits.js\";\nimport { mintedTokenIdFromReceipt } from \"@medialane/sdk/starknet\";\nimport Image from \"../image.js\";\nimport { Input } from \"../input.js\";\nimport { Textarea } from \"../textarea.js\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"../select.js\";\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from \"../collapsible.js\";\nimport { CollapsibleSection } from \"../collapsible-section.js\";\nimport { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from \"../form.js\";\nimport { ToggleGroup } from \"../create-form-primitives.js\";\nimport { IPTypeFields } from \"../ip-type-fields.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 { CollectionPicker } from \"./collection-picker.js\";\nimport { AI_POLICIES, DERIVATIVES_OPTIONS, IP_TYPES, LICENSE_TYPES, type IPType } from \"../../data/ip.js\";\nimport { cn } from \"../../utils/cn.js\";\nimport { runIntentCalls } from \"../../utils/run-intent-calls.js\";\nimport { pinAssetMetadata, uploadFileToIpfs } from \"../../utils/ipfs-upload.js\";\nimport { useCollectionsByOwner } from \"../../utils/use-collections.js\";\nimport { useTransaction } from \"../../utils/use-transaction.js\";\nimport { invalidatePortfolioCache } from \"../../utils/portfolio-cache.js\";\nimport type { MetadataField } from \"../ip-type-fields.js\";\n\nconst schema = z.object({\n collectionId: z.string().min(1, \"Select a collection\"),\n name: z.string().min(1, \"Name required\").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 ipType: z.enum(IP_TYPES),\n licenseType: z.string().min(1, \"License required\"),\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 royalty: z.coerce.number().min(0).max(50),\n image: z.instanceof(File).optional(),\n});\ntype FormValues = z.infer<typeof schema>;\n\nconst DEFAULTS: FormValues = {\n collectionId: \"\",\n name: \"\",\n description: \"\",\n external_url: \"\",\n ipType: \"NFT\",\n licenseType: \"CC BY-SA\",\n commercialUse: \"Yes\",\n derivatives: \"Share-Alike\",\n attribution: \"Required\",\n geographicScope: \"Worldwide\",\n aiPolicy: \"Not Allowed\",\n royalty: 0,\n};\n\nexport function SingleEditionMint({ aside }: { aside?: ReactNode }) {\n const app = useMedialaneApp();\n const walletAddress = app.walletAddress;\n const tx = useTransaction();\n const { collections: allCollections, isLoading: collectionsLoading } = useCollectionsByOwner(walletAddress ?? null);\n const collections = allCollections.filter((c) => getService(c.service)?.id === \"mip-erc721\" && c.collectionId != null);\n\n const [imageFile, setImageFile] = useState<File | null>(null);\n const [imagePreview, setImagePreview] = useState<string | null>(null);\n const [advancedOpen, setAdvancedOpen] = useState(false);\n const [licensingOpen, setLicensingOpen] = useState(false);\n const [ipTypeOpen, setIpTypeOpen] = useState(false);\n const [metadataResetKey, setMetadataResetKey] = useState(0);\n const metadataFieldsRef = useRef<MetadataField[]>([]);\n const previewUrlRef = useRef<string | null>(null);\n const imageInputRef = useRef<HTMLInputElement | null>(null);\n\n useEffect(() => {\n return () => {\n if (previewUrlRef.current) URL.revokeObjectURL(previewUrlRef.current);\n };\n }, []);\n\n const form = useForm<FormValues>({ resolver: zodResolver(schema), defaultValues: DEFAULTS });\n const selectedCollectionId = form.watch(\"collectionId\");\n const selectedCollection = collections.find((c) => c.collectionId === selectedCollectionId) ?? null;\n\n useEffect(() => {\n if (collections.length > 0 && !form.getValues(\"collectionId\")) form.setValue(\"collectionId\", collections[0]!.collectionId!);\n }, [collections, form]);\n\n useEffect(() => {\n if (selectedCollection?.contractAddress && !form.getValues(\"external_url\")) {\n form.setValue(\"external_url\", `https://medialane.io${collectionHref(\"STARKNET\", selectedCollection.contractAddress)}`);\n }\n }, [selectedCollection?.contractAddress, form]);\n\n const handleLicenseChange = (value: string) => {\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\n const uploadDocument = async (file: File) => {\n await app.ensureSignedIn?.();\n return (await uploadFileToIpfs(app.getClient().api, file, \"document\")).uri;\n };\n\n const handleAgain = () => {\n tx.reset();\n form.reset({ ...DEFAULTS, collectionId: collections[0]?.collectionId ?? \"\" });\n metadataFieldsRef.current = [];\n setMetadataResetKey((key) => key + 1);\n setImageFile(null);\n setImagePreview(null);\n if (imageInputRef.current) imageInputRef.current.value = \"\";\n };\n\n const onSubmit = (values: FormValues) => {\n if (!walletAddress) 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 externalUrl: values.external_url,\n creator: walletAddress,\n ipType: values.ipType,\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 imageFile,\n templateTraits: metadataFieldsRef.current.filter((f) => f.traitType.trim() && f.value.trim()).map((f) => ({ traitType: f.traitType.trim(), value: f.value.trim() })),\n });\n await runIntentCalls(signer, () =>\n api.intents.create(\"mint\", {\n owner: walletAddress,\n collectionId: values.collectionId,\n recipient: walletAddress,\n tokenUri: pinned.uri,\n royaltyBps: Math.round(values.royalty * 100),\n }),\n );\n invalidatePortfolioCache(walletAddress);\n });\n };\n\n const mintedTokenId = tx.receipt && selectedCollection ? mintedTokenIdFromReceipt(tx.receipt, selectedCollection.contractAddress) : null;\n const mintedHref = mintedTokenId && selectedCollection ? assetHref(\"STARKNET\", selectedCollection.contractAddress, mintedTokenId) : null;\n const busy = tx.phase !== \"idle\" || collectionsLoading || collections.length === 0;\n\n return (\n <WalletRequired\n icon={ImagePlus}\n iconClassName=\"text-brand-blue\"\n title=\"Secure your account to create\"\n description=\"Publish your creative work as a single-copy NFT in a collection you own.\"\n >\n <TransactionDialog tx={tx} title=\"Mint NFT\" workingLabel=\"Minting your work…\" firstStepLabel=\"Upload to IPFS\">\n <TransactionSuccess\n name={form.getValues(\"name\") || \"Your asset\"}\n image={imagePreview}\n title=\"Asset minted\"\n description=\"Your wallet is the owner. The license terms and royalty are recorded in its metadata.\"\n actions={[\n ...(mintedHref ? [{ href: mintedHref, label: \"View asset\" }] : []),\n { href: \"/portfolio/assets\", label: \"View portfolio\" },\n { label: \"Mint another\", onClick: handleAgain },\n ]}\n >\n <RewardEarned actionType=\"mint_asset\" />\n </TransactionSuccess>\n </TransactionDialog>\n\n <ClaimRouteShell\n icon={<ImagePlus className=\"h-4 w-4 text-white\" />}\n title=\"Mint NFT\"\n subtitle=\"Publish your creative work as a single-copy NFT in a collection you own — free to mint, and it's yours.\"\n aside={\n <>\n <MedialaneCollectionCard\n image={imagePreview}\n name={form.watch(\"name\")}\n collection={selectedCollection?.name || \"IP Asset\"}\n creator={walletAddress ? `${walletAddress.slice(0, 6)}…${walletAddress.slice(-4)}` : undefined}\n creatorHref={walletAddress ? profileHref({ address: walletAddress }) : undefined}\n />\n {aside}\n </>\n }\n >\n <Form {...form}>\n <form onSubmit={form.handleSubmit(onSubmit)} className=\"space-y-6\">\n <FormField control={form.control} name=\"collectionId\" render={({ field }) => (\n <FormItem>\n <FormLabel className=\"flex items-center gap-1.5\"><Boxes className=\"h-4 w-4\" />Collection *</FormLabel>\n <CollectionPicker\n collections={collections}\n loading={collectionsLoading}\n value={field.value}\n onChange={field.onChange}\n newCollectionHref=\"/launchpad/single-editions/collection\"\n />\n <FormMessage />\n </FormItem>\n )} />\n\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">Cover image</label>\n <div\n className=\"border-2 border-dashed border-border rounded-xl p-8 text-center cursor-pointer hover:border-primary/50 transition-colors\"\n role=\"button\"\n tabIndex={0}\n aria-label=\"Upload image\"\n onClick={() => imageInputRef.current?.click()}\n onKeyDown={(e) => { if (e.key === \"Enter\" || e.key === \" \") { e.preventDefault(); imageInputRef.current?.click(); } }}\n >\n {imagePreview ? (\n <div className=\"relative mx-auto h-48 w-48 overflow-hidden rounded-lg\">\n <Image src={imagePreview} alt=\"Preview\" fill unoptimized className=\"object-cover\" />\n </div>\n ) : (\n <div className=\"flex flex-col items-center gap-2 text-muted-foreground\">\n <Upload className=\"h-8 w-8\" />\n <p className=\"text-sm\">Click to upload (JPG, PNG, GIF, SVG, WebP)</p>\n </div>\n )}\n <input\n ref={imageInputRef}\n type=\"file\"\n accept={acceptFor(\"image\")}\n className=\"hidden\"\n onChange={(e) => {\n const file = e.target.files?.[0];\n if (!file) return;\n const fileError = uploadError(file, \"image\");\n if (fileError) {\n form.setError(\"image\", { message: fileError });\n e.target.value = \"\";\n return;\n }\n form.clearErrors(\"image\");\n setImageFile(file);\n form.setValue(\"image\", file);\n if (previewUrlRef.current) URL.revokeObjectURL(previewUrlRef.current);\n const objectUrl = URL.createObjectURL(file);\n previewUrlRef.current = objectUrl;\n setImagePreview(objectUrl);\n }}\n />\n </div>\n {form.formState.errors.image && <p role=\"alert\" className=\"text-sm text-destructive\">{form.formState.errors.image.message}</p>}\n </div>\n\n <FormField control={form.control} name=\"name\" render={({ field }) => (\n <FormItem>\n <FormLabel>Name *</FormLabel>\n <FormControl><Input placeholder=\"My Creative Work\" {...field} /></FormControl>\n <FormMessage />\n </FormItem>\n )} />\n\n <FormField control={form.control} name=\"description\" render={({ field }) => (\n <FormItem>\n <FormLabel>Description</FormLabel>\n <FormControl><Textarea placeholder=\"Describe your work, its story, and any context for buyers…\" rows={4} {...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 <CollapsibleSection\n open={licensingOpen}\n onOpenChange={setLicensingOpen}\n icon={<ShieldCheck className=\"h-4 w-4 text-primary\" />}\n label=\"Licensing Terms\"\n hint=\"Optional · Berne Convention\"\n >\n <p className=\"text-xs text-muted-foreground\">Set how others can use your work. These terms are saved permanently with it as proof of authorship.</p>\n <FormField control={form.control} name=\"licenseType\" render={({ field }) => (\n <FormItem>\n <FormLabel>License</FormLabel>\n <Select value={field.value} onValueChange={handleLicenseChange}>\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 <FormField control={form.control} name=\"royalty\" render={({ field }) => (\n <FormItem>\n <FormLabel>Royalty % (0–50)</FormLabel>\n <FormControl>\n <Input type=\"number\" min={0} max={50} step={0.5} placeholder=\"0\" {...field} onChange={(e) => field.onChange(parseFloat(e.target.value) || 0)} />\n </FormControl>\n <FormMessage />\n </FormItem>\n )} />\n </CollapsibleContent>\n </Collapsible>\n </CollapsibleSection>\n\n <CollapsibleSection\n open={ipTypeOpen}\n onOpenChange={setIpTypeOpen}\n icon={<Layers className=\"h-4 w-4 text-primary\" />}\n label=\"IP Type & Metadata\"\n hint=\"Optional\"\n >\n <p className=\"text-xs text-muted-foreground\">Choose a content type, fill suggested metadata, or add your own trait pairs.</p>\n <FormField control={form.control} name=\"ipType\" render={({ field }) => (\n <FormItem>\n <FormLabel>IP Type</FormLabel>\n <Select onValueChange={field.onChange} value={field.value}>\n <FormControl><SelectTrigger><SelectValue /></SelectTrigger></FormControl>\n <SelectContent>{IP_TYPES.map((t) => <SelectItem key={t} value={t}>{t}</SelectItem>)}</SelectContent>\n </Select>\n </FormItem>\n )} />\n <IPTypeFields\n key={metadataResetKey}\n ipType={form.watch(\"ipType\") as IPType}\n onChange={(fields) => { metadataFieldsRef.current = fields; }}\n uploadDocument={uploadDocument}\n />\n </CollapsibleSection>\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] bg-brand-blue ${busy ? \"opacity-40 pointer-events-none\" : \"\"}`}\n >\n Mint NFT\n </button>\n <p className=\"text-xs text-center text-muted-foreground\">Free to mint — protocol fee is zero.</p>\n </form>\n </Form>\n </ClaimRouteShell>\n </WalletRequired>\n );\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/launchpad/single-edition-mint.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport * as z from \"zod\";\nimport { Boxes, ChevronDown, ImagePlus, Layers, ShieldCheck, Upload } from \"lucide-react\";\nimport { assetHref, collectionHref, getService, profileHref } from \"@medialane/sdk\";\nimport { acceptFor, uploadError } from \"../../utils/upload-limits.js\";\nimport { FIELD_LIMITS } from \"../../utils/field-limits.js\";\nimport { mintedTokenIdFromReceipt } from \"@medialane/sdk/starknet\";\nimport Image from \"../image.js\";\nimport { Input } from \"../input.js\";\nimport { Textarea } from \"../textarea.js\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"../select.js\";\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from \"../collapsible.js\";\nimport { CollapsibleSection } from \"../collapsible-section.js\";\nimport { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from \"../form.js\";\nimport { ToggleGroup } from \"../create-form-primitives.js\";\nimport { IPTypeFields } from \"../ip-type-fields.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 { CollectionPicker } from \"./collection-picker.js\";\nimport { AI_POLICIES, DERIVATIVES_OPTIONS, IP_TYPES, LICENSE_TYPES, type IPType } from \"../../data/ip.js\";\nimport { cn } from \"../../utils/cn.js\";\nimport { runIntentCalls } from \"../../utils/run-intent-calls.js\";\nimport { pinAssetMetadata, uploadFileToIpfs } from \"../../utils/ipfs-upload.js\";\nimport { useCollectionsByOwner } from \"../../utils/use-collections.js\";\nimport { useTransaction } from \"../../utils/use-transaction.js\";\nimport { invalidatePortfolioCache } from \"../../utils/portfolio-cache.js\";\nimport type { MetadataField } from \"../ip-type-fields.js\";\n\nconst schema = z.object({\n collectionId: z.string().min(1, \"Select a collection\"),\n name: z.string().min(1, \"Name required\").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 ipType: z.enum(IP_TYPES),\n licenseType: z.string().min(1, \"License required\"),\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 royalty: z.coerce.number().min(0).max(50),\n image: z.instanceof(File).optional(),\n});\ntype FormValues = z.infer<typeof schema>;\n\nconst DEFAULTS: FormValues = {\n collectionId: \"\",\n name: \"\",\n description: \"\",\n external_url: \"\",\n ipType: \"NFT\",\n licenseType: \"CC BY-SA\",\n commercialUse: \"Yes\",\n derivatives: \"Share-Alike\",\n attribution: \"Required\",\n geographicScope: \"Worldwide\",\n aiPolicy: \"Allowed\",\n royalty: 0,\n};\n\nexport function SingleEditionMint({ aside }: { aside?: ReactNode }) {\n const app = useMedialaneApp();\n const walletAddress = app.walletAddress;\n const tx = useTransaction();\n const { collections: allCollections, isLoading: collectionsLoading } = useCollectionsByOwner(walletAddress ?? null);\n const collections = allCollections.filter((c) => getService(c.service)?.id === \"mip-erc721\" && c.collectionId != null);\n\n const [imageFile, setImageFile] = useState<File | null>(null);\n const [imagePreview, setImagePreview] = useState<string | null>(null);\n const [advancedOpen, setAdvancedOpen] = useState(false);\n const [licensingOpen, setLicensingOpen] = useState(false);\n const [ipTypeOpen, setIpTypeOpen] = useState(false);\n const [metadataResetKey, setMetadataResetKey] = useState(0);\n const metadataFieldsRef = useRef<MetadataField[]>([]);\n const previewUrlRef = useRef<string | null>(null);\n const imageInputRef = useRef<HTMLInputElement | null>(null);\n\n useEffect(() => {\n return () => {\n if (previewUrlRef.current) URL.revokeObjectURL(previewUrlRef.current);\n };\n }, []);\n\n const form = useForm<FormValues>({ resolver: zodResolver(schema), defaultValues: DEFAULTS });\n const selectedCollectionId = form.watch(\"collectionId\");\n const selectedCollection = collections.find((c) => c.collectionId === selectedCollectionId) ?? null;\n\n useEffect(() => {\n if (collections.length > 0 && !form.getValues(\"collectionId\")) form.setValue(\"collectionId\", collections[0]!.collectionId!);\n }, [collections, form]);\n\n useEffect(() => {\n if (selectedCollection?.contractAddress && !form.getValues(\"external_url\")) {\n form.setValue(\"external_url\", `https://medialane.io${collectionHref(\"STARKNET\", selectedCollection.contractAddress)}`);\n }\n }, [selectedCollection?.contractAddress, form]);\n\n const handleLicenseChange = (value: string) => {\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\n const uploadDocument = async (file: File) => {\n await app.ensureSignedIn?.();\n return (await uploadFileToIpfs(app.getClient().api, file, \"document\")).uri;\n };\n\n const handleAgain = () => {\n tx.reset();\n form.reset({ ...DEFAULTS, collectionId: collections[0]?.collectionId ?? \"\" });\n metadataFieldsRef.current = [];\n setMetadataResetKey((key) => key + 1);\n setImageFile(null);\n setImagePreview(null);\n if (imageInputRef.current) imageInputRef.current.value = \"\";\n };\n\n const onSubmit = (values: FormValues) => {\n if (!walletAddress) 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 externalUrl: values.external_url,\n creator: walletAddress,\n ipType: values.ipType,\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 imageFile,\n templateTraits: metadataFieldsRef.current.filter((f) => f.traitType.trim() && f.value.trim()).map((f) => ({ traitType: f.traitType.trim(), value: f.value.trim() })),\n });\n await runIntentCalls(signer, () =>\n api.intents.create(\"mint\", {\n owner: walletAddress,\n collectionId: values.collectionId,\n recipient: walletAddress,\n tokenUri: pinned.uri,\n royaltyBps: Math.round(values.royalty * 100),\n }),\n );\n invalidatePortfolioCache(walletAddress);\n });\n };\n\n const mintedTokenId = tx.receipt && selectedCollection ? mintedTokenIdFromReceipt(tx.receipt, selectedCollection.contractAddress) : null;\n const mintedHref = mintedTokenId && selectedCollection ? assetHref(\"STARKNET\", selectedCollection.contractAddress, mintedTokenId) : null;\n const busy = tx.phase !== \"idle\" || collectionsLoading || collections.length === 0;\n\n return (\n <WalletRequired\n icon={ImagePlus}\n iconClassName=\"text-brand-blue\"\n title=\"Secure your account to create\"\n description=\"Publish your creative work as a single-copy NFT in a collection you own.\"\n >\n <TransactionDialog tx={tx} title=\"Mint NFT\" workingLabel=\"Minting your work…\" firstStepLabel=\"Upload to IPFS\">\n <TransactionSuccess\n name={form.getValues(\"name\") || \"Your asset\"}\n image={imagePreview}\n title=\"Asset minted\"\n description=\"Your wallet is the owner. The license terms and royalty are recorded in its metadata.\"\n actions={[\n ...(mintedHref ? [{ href: mintedHref, label: \"View asset\" }] : []),\n { href: \"/portfolio/assets\", label: \"View portfolio\" },\n { label: \"Mint another\", onClick: handleAgain },\n ]}\n >\n <RewardEarned actionType=\"mint_asset\" />\n </TransactionSuccess>\n </TransactionDialog>\n\n <ClaimRouteShell\n icon={<ImagePlus className=\"h-4 w-4 text-white\" />}\n title=\"Mint NFT\"\n subtitle=\"Publish your creative work as a single-copy NFT in a collection you own — free to mint, and it's yours.\"\n aside={\n <>\n <MedialaneCollectionCard\n image={imagePreview}\n name={form.watch(\"name\")}\n collection={selectedCollection?.name || \"IP Asset\"}\n creator={walletAddress ? `${walletAddress.slice(0, 6)}…${walletAddress.slice(-4)}` : undefined}\n creatorHref={walletAddress ? profileHref({ address: walletAddress }) : undefined}\n />\n {aside}\n </>\n }\n >\n <Form {...form}>\n <form onSubmit={form.handleSubmit(onSubmit)} className=\"space-y-6\">\n <FormField control={form.control} name=\"collectionId\" render={({ field }) => (\n <FormItem>\n <FormLabel className=\"flex items-center gap-1.5\"><Boxes className=\"h-4 w-4\" />Collection *</FormLabel>\n <CollectionPicker\n collections={collections}\n loading={collectionsLoading}\n value={field.value}\n onChange={field.onChange}\n newCollectionHref=\"/launchpad/single-editions/collection\"\n />\n <FormMessage />\n </FormItem>\n )} />\n\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">Cover image</label>\n <div\n className=\"border-2 border-dashed border-border rounded-xl p-8 text-center cursor-pointer hover:border-primary/50 transition-colors\"\n role=\"button\"\n tabIndex={0}\n aria-label=\"Upload image\"\n onClick={() => imageInputRef.current?.click()}\n onKeyDown={(e) => { if (e.key === \"Enter\" || e.key === \" \") { e.preventDefault(); imageInputRef.current?.click(); } }}\n >\n {imagePreview ? (\n <div className=\"relative mx-auto h-48 w-48 overflow-hidden rounded-lg\">\n <Image src={imagePreview} alt=\"Preview\" fill unoptimized className=\"object-cover\" />\n </div>\n ) : (\n <div className=\"flex flex-col items-center gap-2 text-muted-foreground\">\n <Upload className=\"h-8 w-8\" />\n <p className=\"text-sm\">Click to upload (JPG, PNG, GIF, SVG, WebP)</p>\n </div>\n )}\n <input\n ref={imageInputRef}\n type=\"file\"\n accept={acceptFor(\"image\")}\n className=\"hidden\"\n onChange={(e) => {\n const file = e.target.files?.[0];\n if (!file) return;\n const fileError = uploadError(file, \"image\");\n if (fileError) {\n form.setError(\"image\", { message: fileError });\n e.target.value = \"\";\n return;\n }\n form.clearErrors(\"image\");\n setImageFile(file);\n form.setValue(\"image\", file);\n if (previewUrlRef.current) URL.revokeObjectURL(previewUrlRef.current);\n const objectUrl = URL.createObjectURL(file);\n previewUrlRef.current = objectUrl;\n setImagePreview(objectUrl);\n }}\n />\n </div>\n {form.formState.errors.image && <p role=\"alert\" className=\"text-sm text-destructive\">{form.formState.errors.image.message}</p>}\n </div>\n\n <FormField control={form.control} name=\"name\" render={({ field }) => (\n <FormItem>\n <FormLabel>Name *</FormLabel>\n <FormControl><Input placeholder=\"My Creative Work\" {...field} /></FormControl>\n <FormMessage />\n </FormItem>\n )} />\n\n <FormField control={form.control} name=\"description\" render={({ field }) => (\n <FormItem>\n <FormLabel>Description</FormLabel>\n <FormControl><Textarea placeholder=\"Describe your work, its story, and any context for buyers…\" rows={4} {...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 <CollapsibleSection\n open={licensingOpen}\n onOpenChange={setLicensingOpen}\n icon={<ShieldCheck className=\"h-4 w-4 text-primary\" />}\n label=\"Licensing Terms\"\n hint=\"Optional · Berne Convention\"\n >\n <p className=\"text-xs text-muted-foreground\">Set how others can use your work. These terms are saved permanently with it as proof of authorship.</p>\n <FormField control={form.control} name=\"licenseType\" render={({ field }) => (\n <FormItem>\n <FormLabel>License</FormLabel>\n <Select value={field.value} onValueChange={handleLicenseChange}>\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 <FormField control={form.control} name=\"royalty\" render={({ field }) => (\n <FormItem>\n <FormLabel>Royalty % (0–50)</FormLabel>\n <FormControl>\n <Input type=\"number\" min={0} max={50} step={0.5} placeholder=\"0\" {...field} onChange={(e) => field.onChange(parseFloat(e.target.value) || 0)} />\n </FormControl>\n <FormMessage />\n </FormItem>\n )} />\n </CollapsibleContent>\n </Collapsible>\n </CollapsibleSection>\n\n <CollapsibleSection\n open={ipTypeOpen}\n onOpenChange={setIpTypeOpen}\n icon={<Layers className=\"h-4 w-4 text-primary\" />}\n label=\"IP Type & Metadata\"\n hint=\"Optional\"\n >\n <p className=\"text-xs text-muted-foreground\">Choose a content type, fill suggested metadata, or add your own trait pairs.</p>\n <FormField control={form.control} name=\"ipType\" render={({ field }) => (\n <FormItem>\n <FormLabel>IP Type</FormLabel>\n <Select onValueChange={field.onChange} value={field.value}>\n <FormControl><SelectTrigger><SelectValue /></SelectTrigger></FormControl>\n <SelectContent>{IP_TYPES.map((t) => <SelectItem key={t} value={t}>{t}</SelectItem>)}</SelectContent>\n </Select>\n </FormItem>\n )} />\n <IPTypeFields\n key={metadataResetKey}\n ipType={form.watch(\"ipType\") as IPType}\n onChange={(fields) => { metadataFieldsRef.current = fields; }}\n uploadDocument={uploadDocument}\n />\n </CollapsibleSection>\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] bg-brand-blue ${busy ? \"opacity-40 pointer-events-none\" : \"\"}`}\n >\n Mint NFT\n </button>\n <p className=\"text-xs text-center text-muted-foreground\">Free to mint — protocol fee is zero.</p>\n </form>\n </Form>\n </ClaimRouteShell>\n </WalletRequired>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -116,7 +116,7 @@ function TierMintForm({ contract: rawContract, preset, aside }) {
|
|
|
116
116
|
derivatives: "Share-Alike",
|
|
117
117
|
attribution: "Required",
|
|
118
118
|
geographicScope: "Worldwide",
|
|
119
|
-
aiPolicy: "
|
|
119
|
+
aiPolicy: "Allowed"
|
|
120
120
|
}
|
|
121
121
|
});
|
|
122
122
|
(0, import_react.useEffect)(() => {
|
|
@@ -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 { 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"]}
|
|
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: \"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"]}
|