@medialane/ui 0.258.0 → 0.260.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.
Files changed (167) hide show
  1. package/dist/components/activities-feed.cjs +5 -1
  2. package/dist/components/activities-feed.cjs.map +1 -1
  3. package/dist/components/activities-feed.js +5 -1
  4. package/dist/components/activities-feed.js.map +1 -1
  5. package/dist/components/activity-feed-shell.cjs +3 -1
  6. package/dist/components/activity-feed-shell.cjs.map +1 -1
  7. package/dist/components/activity-feed-shell.js +3 -1
  8. package/dist/components/activity-feed-shell.js.map +1 -1
  9. package/dist/components/button.d.cts +1 -1
  10. package/dist/components/button.d.ts +1 -1
  11. package/dist/components/coins-explorer.cjs +5 -1
  12. package/dist/components/coins-explorer.cjs.map +1 -1
  13. package/dist/components/coins-explorer.js +6 -2
  14. package/dist/components/coins-explorer.js.map +1 -1
  15. package/dist/components/comments-section.cjs +7 -6
  16. package/dist/components/comments-section.cjs.map +1 -1
  17. package/dist/components/comments-section.js +7 -6
  18. package/dist/components/comments-section.js.map +1 -1
  19. package/dist/components/discover-community-section.cjs +5 -1
  20. package/dist/components/discover-community-section.cjs.map +1 -1
  21. package/dist/components/discover-community-section.js +5 -1
  22. package/dist/components/discover-community-section.js.map +1 -1
  23. package/dist/components/discover-feed-section.cjs +5 -1
  24. package/dist/components/discover-feed-section.cjs.map +1 -1
  25. package/dist/components/discover-feed-section.js +5 -1
  26. package/dist/components/discover-feed-section.js.map +1 -1
  27. package/dist/components/fast-mint/fast-mint.d.cts +2 -2
  28. package/dist/components/fast-mint/fast-mint.d.ts +2 -2
  29. package/dist/components/fast-mint/success-view.cjs +2 -2
  30. package/dist/components/fast-mint/success-view.cjs.map +1 -1
  31. package/dist/components/fast-mint/success-view.js +2 -2
  32. package/dist/components/fast-mint/success-view.js.map +1 -1
  33. package/dist/components/ip-type-page.cjs +3 -2
  34. package/dist/components/ip-type-page.cjs.map +1 -1
  35. package/dist/components/ip-type-page.js +3 -2
  36. package/dist/components/ip-type-page.js.map +1 -1
  37. package/dist/components/launchpad/coin-create.cjs +9 -7
  38. package/dist/components/launchpad/coin-create.cjs.map +1 -1
  39. package/dist/components/launchpad/coin-create.js +9 -7
  40. package/dist/components/launchpad/coin-create.js.map +1 -1
  41. package/dist/components/launchpad/collection-create-form.cjs +11 -14
  42. package/dist/components/launchpad/collection-create-form.cjs.map +1 -1
  43. package/dist/components/launchpad/collection-create-form.js +12 -15
  44. package/dist/components/launchpad/collection-create-form.js.map +1 -1
  45. package/dist/components/launchpad/collection-create-presets.cjs +8 -8
  46. package/dist/components/launchpad/collection-create-presets.cjs.map +1 -1
  47. package/dist/components/launchpad/collection-create-presets.d.cts +2 -1
  48. package/dist/components/launchpad/collection-create-presets.d.ts +2 -1
  49. package/dist/components/launchpad/collection-create-presets.js +8 -8
  50. package/dist/components/launchpad/collection-create-presets.js.map +1 -1
  51. package/dist/components/launchpad/edition-mint.cjs +9 -7
  52. package/dist/components/launchpad/edition-mint.cjs.map +1 -1
  53. package/dist/components/launchpad/edition-mint.js +9 -7
  54. package/dist/components/launchpad/edition-mint.js.map +1 -1
  55. package/dist/components/launchpad/pop-create.cjs +5 -6
  56. package/dist/components/launchpad/pop-create.cjs.map +1 -1
  57. package/dist/components/launchpad/pop-create.js +5 -6
  58. package/dist/components/launchpad/pop-create.js.map +1 -1
  59. package/dist/components/launchpad/remix-mint.cjs +9 -7
  60. package/dist/components/launchpad/remix-mint.cjs.map +1 -1
  61. package/dist/components/launchpad/remix-mint.js +9 -7
  62. package/dist/components/launchpad/remix-mint.js.map +1 -1
  63. package/dist/components/launchpad/single-edition-mint.cjs +9 -7
  64. package/dist/components/launchpad/single-edition-mint.cjs.map +1 -1
  65. package/dist/components/launchpad/single-edition-mint.js +9 -7
  66. package/dist/components/launchpad/single-edition-mint.js.map +1 -1
  67. package/dist/components/launchpad/sponsorship-create.cjs +5 -6
  68. package/dist/components/launchpad/sponsorship-create.cjs.map +1 -1
  69. package/dist/components/launchpad/sponsorship-create.js +5 -6
  70. package/dist/components/launchpad/sponsorship-create.js.map +1 -1
  71. package/dist/components/launchpad/tier-mint-form.cjs +5 -6
  72. package/dist/components/launchpad/tier-mint-form.cjs.map +1 -1
  73. package/dist/components/launchpad/tier-mint-form.js +5 -6
  74. package/dist/components/launchpad/tier-mint-form.js.map +1 -1
  75. package/dist/components/launchpad/tier-mint-presets.cjs +2 -2
  76. package/dist/components/launchpad/tier-mint-presets.cjs.map +1 -1
  77. package/dist/components/launchpad/tier-mint-presets.d.cts +2 -1
  78. package/dist/components/launchpad/tier-mint-presets.d.ts +2 -1
  79. package/dist/components/launchpad/tier-mint-presets.js +2 -2
  80. package/dist/components/launchpad/tier-mint-presets.js.map +1 -1
  81. package/dist/components/marketplace-dialog-primitives.cjs +1 -31
  82. package/dist/components/marketplace-dialog-primitives.cjs.map +1 -1
  83. package/dist/components/marketplace-dialog-primitives.d.cts +1 -12
  84. package/dist/components/marketplace-dialog-primitives.d.ts +1 -12
  85. package/dist/components/marketplace-dialog-primitives.js +2 -31
  86. package/dist/components/marketplace-dialog-primitives.js.map +1 -1
  87. package/dist/components/media-wallet/media-wallet-activity.cjs +5 -1
  88. package/dist/components/media-wallet/media-wallet-activity.cjs.map +1 -1
  89. package/dist/components/media-wallet/media-wallet-activity.js +5 -1
  90. package/dist/components/media-wallet/media-wallet-activity.js.map +1 -1
  91. package/dist/components/media-wallet/media-wallet-home.cjs +3 -2
  92. package/dist/components/media-wallet/media-wallet-home.cjs.map +1 -1
  93. package/dist/components/media-wallet/media-wallet-home.js +3 -2
  94. package/dist/components/media-wallet/media-wallet-home.js.map +1 -1
  95. package/dist/components/media-wallet/media-wallet-send.cjs +5 -2
  96. package/dist/components/media-wallet/media-wallet-send.cjs.map +1 -1
  97. package/dist/components/media-wallet/media-wallet-send.js +5 -2
  98. package/dist/components/media-wallet/media-wallet-send.js.map +1 -1
  99. package/dist/components/media-wallet/success-dialog.cjs +5 -11
  100. package/dist/components/media-wallet/success-dialog.cjs.map +1 -1
  101. package/dist/components/media-wallet/success-dialog.js +5 -11
  102. package/dist/components/media-wallet/success-dialog.js.map +1 -1
  103. package/dist/components/pop-claim-button.cjs +7 -6
  104. package/dist/components/pop-claim-button.cjs.map +1 -1
  105. package/dist/components/pop-claim-button.js +7 -6
  106. package/dist/components/pop-claim-button.js.map +1 -1
  107. package/dist/components/pop-manage-page.cjs +5 -4
  108. package/dist/components/pop-manage-page.cjs.map +1 -1
  109. package/dist/components/pop-manage-page.js +5 -4
  110. package/dist/components/pop-manage-page.js.map +1 -1
  111. package/dist/components/portfolio-sponsorships.cjs +15 -8
  112. package/dist/components/portfolio-sponsorships.cjs.map +1 -1
  113. package/dist/components/portfolio-sponsorships.js +15 -8
  114. package/dist/components/portfolio-sponsorships.js.map +1 -1
  115. package/dist/components/service-collections-page.cjs +2 -2
  116. package/dist/components/service-collections-page.cjs.map +1 -1
  117. package/dist/components/service-collections-page.d.cts +2 -2
  118. package/dist/components/service-collections-page.d.ts +2 -2
  119. package/dist/components/service-collections-page.js +2 -2
  120. package/dist/components/service-collections-page.js.map +1 -1
  121. package/dist/components/sheet.d.cts +1 -1
  122. package/dist/components/sheet.d.ts +1 -1
  123. package/dist/components/sponsorship-offer-page.cjs +9 -8
  124. package/dist/components/sponsorship-offer-page.cjs.map +1 -1
  125. package/dist/components/sponsorship-offer-page.js +9 -8
  126. package/dist/components/sponsorship-offer-page.js.map +1 -1
  127. package/dist/components/transaction-success.cjs +60 -0
  128. package/dist/components/transaction-success.cjs.map +1 -0
  129. package/dist/components/transaction-success.d.cts +20 -0
  130. package/dist/components/transaction-success.d.ts +20 -0
  131. package/dist/components/transaction-success.js +26 -0
  132. package/dist/components/transaction-success.js.map +1 -0
  133. package/dist/components/transfer-collection-ownership.cjs +6 -8
  134. package/dist/components/transfer-collection-ownership.cjs.map +1 -1
  135. package/dist/components/transfer-collection-ownership.js +6 -8
  136. package/dist/components/transfer-collection-ownership.js.map +1 -1
  137. package/dist/index.cjs +9 -8
  138. package/dist/index.cjs.map +1 -1
  139. package/dist/index.d.cts +4 -3
  140. package/dist/index.d.ts +4 -3
  141. package/dist/index.js +6 -6
  142. package/dist/index.js.map +1 -1
  143. package/dist/utils/empty-messages.cjs +62 -0
  144. package/dist/utils/empty-messages.cjs.map +1 -0
  145. package/dist/utils/empty-messages.d.cts +40 -0
  146. package/dist/utils/empty-messages.d.ts +40 -0
  147. package/dist/utils/empty-messages.js +38 -0
  148. package/dist/utils/empty-messages.js.map +1 -0
  149. package/dist/utils/success-messages.cjs +106 -0
  150. package/dist/utils/success-messages.cjs.map +1 -0
  151. package/dist/utils/success-messages.d.cts +58 -0
  152. package/dist/utils/success-messages.d.ts +58 -0
  153. package/dist/utils/success-messages.js +82 -0
  154. package/dist/utils/success-messages.js.map +1 -0
  155. package/package.json +3 -3
  156. package/dist/components/creation-success.cjs +0 -64
  157. package/dist/components/creation-success.cjs.map +0 -1
  158. package/dist/components/creation-success.d.cts +0 -20
  159. package/dist/components/creation-success.d.ts +0 -20
  160. package/dist/components/creation-success.js +0 -30
  161. package/dist/components/creation-success.js.map +0 -1
  162. package/dist/components/transaction-done.cjs +0 -46
  163. package/dist/components/transaction-done.cjs.map +0 -1
  164. package/dist/components/transaction-done.d.cts +0 -18
  165. package/dist/components/transaction-done.d.ts +0 -18
  166. package/dist/components/transaction-done.js +0 -22
  167. package/dist/components/transaction-done.js.map +0 -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 { CreationSuccess } from \"../creation-success.js\";\nimport { MedialaneCollectionCard } from \"../medialane-collection-card.js\";\nimport { TransactionDialog } from \"../transaction-dialog.js\";\nimport { WalletRequired } from \"../wallet-required.js\";\nimport { useMedialaneApp } from \"../medialane-app.js\";\nimport { RewardEarned } from \"../rewards/reward-earned.js\";\nimport { 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 <CreationSuccess\n name={form.getValues(\"name\") || \"Your asset\"}\n image={imagePreview}\n caption=\"Your work is live\"\n primary={mintedHref ? { href: mintedHref, label: \"View asset\" } : { href: \"/portfolio/assets\", label: \"View portfolio\" }}\n secondary={mintedHref ? { href: \"/portfolio/assets\", label: \"View portfolio\" } : undefined}\n onAgain={handleAgain}\n againLabel=\"Mint another\"\n >\n <RewardEarned actionType=\"mint_asset\" />\n </CreationSuccess>\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 &amp; 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 &amp; 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: \"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 &amp; 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 &amp; 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"]}
@@ -19,7 +19,7 @@ import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from "
19
19
  import { ToggleGroup } from "../create-form-primitives.js";
20
20
  import { IPTypeFields } from "../ip-type-fields.js";
21
21
  import { ClaimRouteShell } from "../claim-route-shell.js";
22
- import { CreationSuccess } from "../creation-success.js";
22
+ import { TransactionSuccess } from "../transaction-success.js";
23
23
  import { MedialaneCollectionCard } from "../medialane-collection-card.js";
24
24
  import { TransactionDialog } from "../transaction-dialog.js";
25
25
  import { WalletRequired } from "../wallet-required.js";
@@ -161,15 +161,17 @@ function SingleEditionMint({ aside }) {
161
161
  description: "Publish your creative work as a single-copy NFT in a collection you own.",
162
162
  children: [
163
163
  /* @__PURE__ */ jsx(TransactionDialog, { tx, title: "Mint NFT", workingLabel: "Minting your work\u2026", firstStepLabel: "Upload to IPFS", children: /* @__PURE__ */ jsx(
164
- CreationSuccess,
164
+ TransactionSuccess,
165
165
  {
166
166
  name: form.getValues("name") || "Your asset",
167
167
  image: imagePreview,
168
- caption: "Your work is live",
169
- primary: mintedHref ? { href: mintedHref, label: "View asset" } : { href: "/portfolio/assets", label: "View portfolio" },
170
- secondary: mintedHref ? { href: "/portfolio/assets", label: "View portfolio" } : void 0,
171
- onAgain: handleAgain,
172
- againLabel: "Mint another",
168
+ title: "Asset minted",
169
+ description: "Your wallet is the owner. The license terms and royalty are recorded in its metadata.",
170
+ actions: [
171
+ ...mintedHref ? [{ href: mintedHref, label: "View asset" }] : [],
172
+ { href: "/portfolio/assets", label: "View portfolio" },
173
+ { label: "Mint another", onClick: handleAgain }
174
+ ],
173
175
  children: /* @__PURE__ */ jsx(RewardEarned, { actionType: "mint_asset" })
174
176
  }
175
177
  ) }),
@@ -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 { CreationSuccess } from \"../creation-success.js\";\nimport { MedialaneCollectionCard } from \"../medialane-collection-card.js\";\nimport { TransactionDialog } from \"../transaction-dialog.js\";\nimport { WalletRequired } from \"../wallet-required.js\";\nimport { useMedialaneApp } from \"../medialane-app.js\";\nimport { RewardEarned } from \"../rewards/reward-earned.js\";\nimport { 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 <CreationSuccess\n name={form.getValues(\"name\") || \"Your asset\"}\n image={imagePreview}\n caption=\"Your work is live\"\n primary={mintedHref ? { href: mintedHref, label: \"View asset\" } : { href: \"/portfolio/assets\", label: \"View portfolio\" }}\n secondary={mintedHref ? { href: \"/portfolio/assets\", label: \"View portfolio\" } : undefined}\n onAgain={handleAgain}\n againLabel=\"Mint another\"\n >\n <RewardEarned actionType=\"mint_asset\" />\n </CreationSuccess>\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 &amp; 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 &amp; 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: \"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 &amp; 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 &amp; 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":[]}
@@ -31,7 +31,7 @@ var import_asset_picker = require("../asset-picker.js");
31
31
  var import_asset_search_picker = require("../asset-search-picker.js");
32
32
  var import_license_terms_builder = require("../license-terms-builder.js");
33
33
  var import_claim_route_shell = require("../claim-route-shell.js");
34
- var import_creation_success = require("../creation-success.js");
34
+ var import_transaction_success = require("../transaction-success.js");
35
35
  var import_transaction_dialog = require("../transaction-dialog.js");
36
36
  var import_wallet_required = require("../wallet-required.js");
37
37
  var import_medialane_app = require("../medialane-app.js");
@@ -245,14 +245,13 @@ function SponsorshipCreate({ aside }) {
245
245
  workingLabel: mode === "offer" ? "Creating your sponsorship offer\u2026" : "Sending your proposal\u2026",
246
246
  firstStepLabel: "Upload license terms",
247
247
  children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
248
- import_creation_success.CreationSuccess,
248
+ import_transaction_success.TransactionSuccess,
249
249
  {
250
250
  name: chosen?.name ?? "Your sponsorship",
251
251
  image: chosen?.image ?? null,
252
- caption: mode === "offer" ? "Your offer is live" : "Your proposal is sent",
253
- primary: { href: "/launchpad/sponsorship", label: "Back to Sponsorship launchpad" },
254
- onAgain: handleAgain,
255
- againLabel: "Create another",
252
+ title: mode === "offer" ? "Offer created" : "Proposal sent",
253
+ description: mode === "offer" ? "The offer is recorded onchain with the asset and terms you chose." : "The proposal is recorded onchain with the amount and duration you chose.",
254
+ actions: [{ href: "/launchpad/sponsorship", label: "Back to Sponsorship launchpad" }, { label: "Create another", onClick: handleAgain }],
256
255
  children: mode === "offer" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_reward_earned.RewardEarned, { actionType: "create_sponsorship_offer" })
257
256
  }
258
257
  )
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/launchpad/sponsorship-create.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, type ReactNode } from \"react\";\nimport { AlertCircle, CheckCircle2, Handshake, Loader2, X } from \"lucide-react\";\nimport { SUPPORTED_TOKENS, getTokenBySymbol } from \"@medialane/sdk\";\nimport { Button } from \"../button.js\";\nimport { AssetPicker, type OwnedAsset } from \"../asset-picker.js\";\nimport { AssetSearchPicker } from \"../asset-search-picker.js\";\nimport { LicenseTermsBuilder, EMPTY_SPONSORSHIP_TERMS, toDurationDays, toLicenseMetadata, type SponsorshipTerms } from \"../license-terms-builder.js\";\nimport { ClaimRouteShell } from \"../claim-route-shell.js\";\nimport { CreationSuccess } from \"../creation-success.js\";\nimport { TransactionDialog } from \"../transaction-dialog.js\";\nimport { WalletRequired } from \"../wallet-required.js\";\nimport { useMedialaneApp } from \"../medialane-app.js\";\nimport { RewardEarned } from \"../rewards/reward-earned.js\";\nimport { runIntentCalls } from \"../../utils/run-intent-calls.js\";\nimport { uploadJsonToIpfs } from \"../../utils/ipfs-upload.js\";\nimport { useImageUrl } from \"../../utils/use-image-url.js\";\nimport { useTokensByOwner } from \"../../utils/use-tokens.js\";\nimport { usePendingProposalsForAsset } from \"../../utils/use-sponsorship.js\";\nimport { useTransaction } from \"../../utils/use-transaction.js\";\nimport { shortenAddress } from \"../../utils/address.js\";\n\ntype Mode = \"offer\" | \"propose\";\n\nconst TOKEN_SYMBOLS = SUPPORTED_TOKENS.filter((t) => t.listable).map((t) => t.symbol);\n\nfunction PendingProposalsPanel({ nftContract }: { nftContract: string }) {\n const app = useMedialaneApp();\n const walletAddress = app.walletAddress;\n const { proposals, isLoading, mutate } = usePendingProposalsForAsset(nftContract);\n const tx = useTransaction();\n const [activeId, setActiveId] = useState<string | null>(null);\n const busy = tx.phase === \"preparing\" || tx.phase === \"submitting\" || tx.phase === \"confirming\";\n\n const respond = (proposalId: string, decision: \"accept\" | \"reject\") => {\n if (!walletAddress) return;\n setActiveId(proposalId);\n void tx\n .run(async (signer) => {\n const api = app.getClient().api;\n await runIntentCalls(signer, () =>\n decision === \"accept\"\n ? api.intents.create(\"sponsorship-proposal-accept\", { owner: walletAddress, proposalId })\n : api.intents.create(\"sponsorship-proposal-reject\", { owner: walletAddress, proposalId }),\n );\n await mutate();\n })\n .finally(() => setActiveId(null));\n };\n\n if (isLoading || proposals.length === 0) return null;\n\n return (\n <div className=\"rounded-xl border border-border bg-card p-4 space-y-3\">\n <p className=\"text-sm font-semibold\">Pending proposals</p>\n {proposals.map((p) => (\n <div key={p.proposalId} className=\"flex items-center justify-between gap-3 text-sm\">\n <span className=\"truncate text-muted-foreground\">{shortenAddress(p.proposer)} — {p.amount}</span>\n <div className=\"flex gap-2 shrink-0\">\n <Button size=\"sm\" variant=\"outline\" disabled={busy} onClick={() => respond(p.proposalId, \"reject\")}>\n {busy && activeId === p.proposalId ? <Loader2 className=\"h-3 w-3 animate-spin\" /> : <X className=\"h-3 w-3\" />}\n Decline\n </Button>\n <Button size=\"sm\" className=\"bg-brand-rose hover:brightness-110 text-white\" disabled={busy} onClick={() => respond(p.proposalId, \"accept\")}>\n {busy && activeId === p.proposalId ? <Loader2 className=\"h-3 w-3 animate-spin\" /> : <CheckCircle2 className=\"h-3 w-3\" />}\n Accept\n </Button>\n </div>\n </div>\n ))}\n {tx.phase === \"error\" && (\n <div className=\"flex items-center gap-2 text-xs text-destructive\" role=\"alert\">\n <AlertCircle className=\"h-3.5 w-3.5\" />\n {tx.error}\n <button type=\"button\" className=\"underline\" onClick={tx.reset}>Dismiss</button>\n </div>\n )}\n </div>\n );\n}\n\nexport function SponsorshipCreate({ aside }: { aside?: ReactNode }) {\n const app = useMedialaneApp();\n const walletAddress = app.walletAddress;\n const resolveImage = useImageUrl();\n const tx = useTransaction();\n const [formError, setFormError] = useState<string | null>(null);\n const [mode, setMode] = useState<Mode>(\"propose\");\n const [selectedAsset, setSelectedAsset] = useState<OwnedAsset | null>(null);\n const [proposeAsset, setProposeAsset] = useState<OwnedAsset | null>(null);\n const [terms, setTerms] = useState<SponsorshipTerms>({ ...EMPTY_SPONSORSHIP_TERMS, paymentTokenSymbol: \"USDC\" });\n const busy = tx.phase !== \"idle\";\n\n const { tokens: ownedTokens, isLoading: assetsLoading } = useTokensByOwner(walletAddress ?? null, 1, 100);\n const ownedAssets: OwnedAsset[] = ownedTokens.map((t) => ({\n contractAddress: t.contractAddress,\n tokenId: t.tokenId,\n name: t.metadata?.name ?? `Token #${t.tokenId}`,\n image: resolveImage(t.metadata?.image),\n }));\n\n const searchAssets = async (query: string): Promise<OwnedAsset[]> => {\n const res = await app.getClient().api.search(query, 16);\n return res.data.tokens.map((t) => ({\n contractAddress: t.contractAddress,\n tokenId: t.tokenId,\n name: t.name ?? `Token #${t.tokenId}`,\n image: resolveImage(t.image),\n }));\n };\n\n const chosen = mode === \"offer\" ? selectedAsset : proposeAsset;\n\n const onSubmit = () => {\n setFormError(null);\n if (!walletAddress) return setFormError(\"Your account isn't ready yet. Refresh the page and try again.\");\n if (!chosen) return setFormError(mode === \"offer\" ? \"Choose which asset you're offering.\" : \"Search for the asset you want to sponsor, then pick it.\");\n if (!terms.amount || Number(terms.amount) <= 0) return setFormError(\"Add an amount before continuing.\");\n const token = getTokenBySymbol(terms.paymentTokenSymbol);\n if (!token) return setFormError(\"Pick a currency.\");\n const durationDays = toDurationDays(terms);\n if (!durationDays) return setFormError(\"Choose how long the license should last.\");\n\n void tx.run(async (signer) => {\n await app.ensureSignedIn?.();\n const api = app.getClient().api;\n const licenseTermsUri = await uploadJsonToIpfs(api, toLicenseMetadata(terms));\n const amount = BigInt(Math.round(Number(terms.amount) * 10 ** token.decimals)).toString();\n const duration = durationDays * 86400;\n const royaltyBps = Math.round(Number(terms.royaltyPercent || \"0\") * 100);\n await runIntentCalls(signer, () =>\n mode === \"offer\"\n ? api.intents.create(\"sponsorship-offer\", {\n author: walletAddress, nftContract: chosen.contractAddress, tokenId: chosen.tokenId, minAmount: amount,\n duration, paymentToken: token.address, licenseTermsUri, transferable: terms.transferable, royaltyBps,\n })\n : api.intents.create(\"sponsorship-proposal\", {\n proposer: walletAddress, nftContract: chosen.contractAddress, tokenId: chosen.tokenId, amount,\n duration, paymentToken: token.address, licenseTermsUri, transferable: terms.transferable, royaltyBps,\n }),\n );\n });\n };\n\n const handleAgain = () => {\n tx.reset();\n setSelectedAsset(null);\n setProposeAsset(null);\n setTerms({ ...EMPTY_SPONSORSHIP_TERMS, paymentTokenSymbol: \"USDC\" });\n };\n\n return (\n <WalletRequired\n icon={Handshake}\n iconClassName=\"text-brand-rose\"\n title=\"Secure your account to set up a sponsorship\"\n description=\"Secure your account to publish onchain.\"\n >\n <ClaimRouteShell\n icon={<Handshake className=\"h-4 w-4 text-white\" />}\n title=\"Set up a sponsorship\"\n subtitle=\"Found IP you'd like to back? Propose terms directly to its owner. Own something worth sponsoring? Post it and let sponsors bid.\"\n aside={aside}\n >\n <div className=\"space-y-6\">\n <div className=\"inline-flex rounded-full border border-border p-1 bg-card\">\n {([\"offer\", \"propose\"] as const).map((m) => (\n <button\n key={m}\n type=\"button\"\n onClick={() => setMode(m)}\n className={\n mode === m\n ? \"px-4 py-1.5 rounded-full text-sm font-semibold bg-gradient-to-r from-brand-purple to-brand-blue text-white\"\n : \"px-4 py-1.5 rounded-full text-sm font-semibold text-muted-foreground\"\n }\n >\n {m === \"offer\" ? \"Offer my asset\" : \"Propose to sponsor\"}\n </button>\n ))}\n </div>\n\n {mode === \"offer\" ? (\n <div className=\"space-y-2\">\n <p className=\"text-sm font-semibold\">Pick an asset you own</p>\n <AssetPicker\n assets={ownedAssets}\n isLoading={assetsLoading}\n selected={selectedAsset}\n onSelect={setSelectedAsset}\n emptyStateHref=\"/launchpad/single-editions\"\n emptyStateLabel=\"Create one\"\n />\n {selectedAsset ? <PendingProposalsPanel nftContract={selectedAsset.contractAddress} /> : null}\n </div>\n ) : (\n <div className=\"space-y-2\">\n <p className=\"text-sm font-semibold\">Which asset do you want to sponsor?</p>\n <AssetSearchPicker search={searchAssets} selected={proposeAsset} onSelect={setProposeAsset} placeholder=\"Search by asset name or creator\" />\n </div>\n )}\n\n <div className=\"pt-2 border-t border-border/30\">\n <LicenseTermsBuilder\n value={terms}\n onChange={setTerms}\n tokenOptions={TOKEN_SYMBOLS}\n amountLabel={mode === \"offer\" ? \"Minimum accepted bid\" : \"Amount you'll pay\"}\n disabled={busy}\n />\n </div>\n\n {formError && <p role=\"alert\" className=\"text-sm text-destructive\">{formError}</p>}\n\n <div className=\"btn-border-animated p-[1px] rounded-2xl\">\n <button\n type=\"button\"\n disabled={busy}\n onClick={onSubmit}\n className=\"w-full h-12 rounded-[15px] flex items-center justify-center gap-2 text-base font-semibold text-white bg-transparent transition-all hover:brightness-110 active:scale-[0.98] disabled:opacity-50\"\n >\n <Handshake className=\"h-4 w-4\" />\n {mode === \"offer\" ? \"Create Offer\" : \"Send proposal\"}\n </button>\n </div>\n </div>\n </ClaimRouteShell>\n\n <TransactionDialog\n tx={tx}\n title={mode === \"offer\" ? \"Create sponsorship offer\" : \"Send proposal\"}\n workingLabel={mode === \"offer\" ? \"Creating your sponsorship offer…\" : \"Sending your proposal…\"}\n firstStepLabel=\"Upload license terms\"\n >\n <CreationSuccess\n name={chosen?.name ?? \"Your sponsorship\"}\n image={chosen?.image ?? null}\n caption={mode === \"offer\" ? \"Your offer is live\" : \"Your proposal is sent\"}\n primary={{ href: \"/launchpad/sponsorship\", label: \"Back to Sponsorship launchpad\" }}\n onAgain={handleAgain}\n againLabel=\"Create another\"\n >\n {mode === \"offer\" && <RewardEarned actionType=\"create_sponsorship_offer\" />}\n </CreationSuccess>\n </TransactionDialog>\n </WalletRequired>\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/components/launchpad/sponsorship-create.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, type ReactNode } from \"react\";\nimport { AlertCircle, CheckCircle2, Handshake, Loader2, X } from \"lucide-react\";\nimport { SUPPORTED_TOKENS, getTokenBySymbol } from \"@medialane/sdk\";\nimport { Button } from \"../button.js\";\nimport { AssetPicker, type OwnedAsset } from \"../asset-picker.js\";\nimport { AssetSearchPicker } from \"../asset-search-picker.js\";\nimport { LicenseTermsBuilder, EMPTY_SPONSORSHIP_TERMS, toDurationDays, toLicenseMetadata, type SponsorshipTerms } from \"../license-terms-builder.js\";\nimport { ClaimRouteShell } from \"../claim-route-shell.js\";\nimport { TransactionSuccess } from \"../transaction-success.js\";\nimport { TransactionDialog } from \"../transaction-dialog.js\";\nimport { WalletRequired } from \"../wallet-required.js\";\nimport { useMedialaneApp } from \"../medialane-app.js\";\nimport { RewardEarned } from \"../rewards/reward-earned.js\";\nimport { runIntentCalls } from \"../../utils/run-intent-calls.js\";\nimport { uploadJsonToIpfs } from \"../../utils/ipfs-upload.js\";\nimport { useImageUrl } from \"../../utils/use-image-url.js\";\nimport { useTokensByOwner } from \"../../utils/use-tokens.js\";\nimport { usePendingProposalsForAsset } from \"../../utils/use-sponsorship.js\";\nimport { useTransaction } from \"../../utils/use-transaction.js\";\nimport { shortenAddress } from \"../../utils/address.js\";\n\ntype Mode = \"offer\" | \"propose\";\n\nconst TOKEN_SYMBOLS = SUPPORTED_TOKENS.filter((t) => t.listable).map((t) => t.symbol);\n\nfunction PendingProposalsPanel({ nftContract }: { nftContract: string }) {\n const app = useMedialaneApp();\n const walletAddress = app.walletAddress;\n const { proposals, isLoading, mutate } = usePendingProposalsForAsset(nftContract);\n const tx = useTransaction();\n const [activeId, setActiveId] = useState<string | null>(null);\n const busy = tx.phase === \"preparing\" || tx.phase === \"submitting\" || tx.phase === \"confirming\";\n\n const respond = (proposalId: string, decision: \"accept\" | \"reject\") => {\n if (!walletAddress) return;\n setActiveId(proposalId);\n void tx\n .run(async (signer) => {\n const api = app.getClient().api;\n await runIntentCalls(signer, () =>\n decision === \"accept\"\n ? api.intents.create(\"sponsorship-proposal-accept\", { owner: walletAddress, proposalId })\n : api.intents.create(\"sponsorship-proposal-reject\", { owner: walletAddress, proposalId }),\n );\n await mutate();\n })\n .finally(() => setActiveId(null));\n };\n\n if (isLoading || proposals.length === 0) return null;\n\n return (\n <div className=\"rounded-xl border border-border bg-card p-4 space-y-3\">\n <p className=\"text-sm font-semibold\">Pending proposals</p>\n {proposals.map((p) => (\n <div key={p.proposalId} className=\"flex items-center justify-between gap-3 text-sm\">\n <span className=\"truncate text-muted-foreground\">{shortenAddress(p.proposer)} — {p.amount}</span>\n <div className=\"flex gap-2 shrink-0\">\n <Button size=\"sm\" variant=\"outline\" disabled={busy} onClick={() => respond(p.proposalId, \"reject\")}>\n {busy && activeId === p.proposalId ? <Loader2 className=\"h-3 w-3 animate-spin\" /> : <X className=\"h-3 w-3\" />}\n Decline\n </Button>\n <Button size=\"sm\" className=\"bg-brand-rose hover:brightness-110 text-white\" disabled={busy} onClick={() => respond(p.proposalId, \"accept\")}>\n {busy && activeId === p.proposalId ? <Loader2 className=\"h-3 w-3 animate-spin\" /> : <CheckCircle2 className=\"h-3 w-3\" />}\n Accept\n </Button>\n </div>\n </div>\n ))}\n {tx.phase === \"error\" && (\n <div className=\"flex items-center gap-2 text-xs text-destructive\" role=\"alert\">\n <AlertCircle className=\"h-3.5 w-3.5\" />\n {tx.error}\n <button type=\"button\" className=\"underline\" onClick={tx.reset}>Dismiss</button>\n </div>\n )}\n </div>\n );\n}\n\nexport function SponsorshipCreate({ aside }: { aside?: ReactNode }) {\n const app = useMedialaneApp();\n const walletAddress = app.walletAddress;\n const resolveImage = useImageUrl();\n const tx = useTransaction();\n const [formError, setFormError] = useState<string | null>(null);\n const [mode, setMode] = useState<Mode>(\"propose\");\n const [selectedAsset, setSelectedAsset] = useState<OwnedAsset | null>(null);\n const [proposeAsset, setProposeAsset] = useState<OwnedAsset | null>(null);\n const [terms, setTerms] = useState<SponsorshipTerms>({ ...EMPTY_SPONSORSHIP_TERMS, paymentTokenSymbol: \"USDC\" });\n const busy = tx.phase !== \"idle\";\n\n const { tokens: ownedTokens, isLoading: assetsLoading } = useTokensByOwner(walletAddress ?? null, 1, 100);\n const ownedAssets: OwnedAsset[] = ownedTokens.map((t) => ({\n contractAddress: t.contractAddress,\n tokenId: t.tokenId,\n name: t.metadata?.name ?? `Token #${t.tokenId}`,\n image: resolveImage(t.metadata?.image),\n }));\n\n const searchAssets = async (query: string): Promise<OwnedAsset[]> => {\n const res = await app.getClient().api.search(query, 16);\n return res.data.tokens.map((t) => ({\n contractAddress: t.contractAddress,\n tokenId: t.tokenId,\n name: t.name ?? `Token #${t.tokenId}`,\n image: resolveImage(t.image),\n }));\n };\n\n const chosen = mode === \"offer\" ? selectedAsset : proposeAsset;\n\n const onSubmit = () => {\n setFormError(null);\n if (!walletAddress) return setFormError(\"Your account isn't ready yet. Refresh the page and try again.\");\n if (!chosen) return setFormError(mode === \"offer\" ? \"Choose which asset you're offering.\" : \"Search for the asset you want to sponsor, then pick it.\");\n if (!terms.amount || Number(terms.amount) <= 0) return setFormError(\"Add an amount before continuing.\");\n const token = getTokenBySymbol(terms.paymentTokenSymbol);\n if (!token) return setFormError(\"Pick a currency.\");\n const durationDays = toDurationDays(terms);\n if (!durationDays) return setFormError(\"Choose how long the license should last.\");\n\n void tx.run(async (signer) => {\n await app.ensureSignedIn?.();\n const api = app.getClient().api;\n const licenseTermsUri = await uploadJsonToIpfs(api, toLicenseMetadata(terms));\n const amount = BigInt(Math.round(Number(terms.amount) * 10 ** token.decimals)).toString();\n const duration = durationDays * 86400;\n const royaltyBps = Math.round(Number(terms.royaltyPercent || \"0\") * 100);\n await runIntentCalls(signer, () =>\n mode === \"offer\"\n ? api.intents.create(\"sponsorship-offer\", {\n author: walletAddress, nftContract: chosen.contractAddress, tokenId: chosen.tokenId, minAmount: amount,\n duration, paymentToken: token.address, licenseTermsUri, transferable: terms.transferable, royaltyBps,\n })\n : api.intents.create(\"sponsorship-proposal\", {\n proposer: walletAddress, nftContract: chosen.contractAddress, tokenId: chosen.tokenId, amount,\n duration, paymentToken: token.address, licenseTermsUri, transferable: terms.transferable, royaltyBps,\n }),\n );\n });\n };\n\n const handleAgain = () => {\n tx.reset();\n setSelectedAsset(null);\n setProposeAsset(null);\n setTerms({ ...EMPTY_SPONSORSHIP_TERMS, paymentTokenSymbol: \"USDC\" });\n };\n\n return (\n <WalletRequired\n icon={Handshake}\n iconClassName=\"text-brand-rose\"\n title=\"Secure your account to set up a sponsorship\"\n description=\"Secure your account to publish onchain.\"\n >\n <ClaimRouteShell\n icon={<Handshake className=\"h-4 w-4 text-white\" />}\n title=\"Set up a sponsorship\"\n subtitle=\"Found IP you'd like to back? Propose terms directly to its owner. Own something worth sponsoring? Post it and let sponsors bid.\"\n aside={aside}\n >\n <div className=\"space-y-6\">\n <div className=\"inline-flex rounded-full border border-border p-1 bg-card\">\n {([\"offer\", \"propose\"] as const).map((m) => (\n <button\n key={m}\n type=\"button\"\n onClick={() => setMode(m)}\n className={\n mode === m\n ? \"px-4 py-1.5 rounded-full text-sm font-semibold bg-gradient-to-r from-brand-purple to-brand-blue text-white\"\n : \"px-4 py-1.5 rounded-full text-sm font-semibold text-muted-foreground\"\n }\n >\n {m === \"offer\" ? \"Offer my asset\" : \"Propose to sponsor\"}\n </button>\n ))}\n </div>\n\n {mode === \"offer\" ? (\n <div className=\"space-y-2\">\n <p className=\"text-sm font-semibold\">Pick an asset you own</p>\n <AssetPicker\n assets={ownedAssets}\n isLoading={assetsLoading}\n selected={selectedAsset}\n onSelect={setSelectedAsset}\n emptyStateHref=\"/launchpad/single-editions\"\n emptyStateLabel=\"Create one\"\n />\n {selectedAsset ? <PendingProposalsPanel nftContract={selectedAsset.contractAddress} /> : null}\n </div>\n ) : (\n <div className=\"space-y-2\">\n <p className=\"text-sm font-semibold\">Which asset do you want to sponsor?</p>\n <AssetSearchPicker search={searchAssets} selected={proposeAsset} onSelect={setProposeAsset} placeholder=\"Search by asset name or creator\" />\n </div>\n )}\n\n <div className=\"pt-2 border-t border-border/30\">\n <LicenseTermsBuilder\n value={terms}\n onChange={setTerms}\n tokenOptions={TOKEN_SYMBOLS}\n amountLabel={mode === \"offer\" ? \"Minimum accepted bid\" : \"Amount you'll pay\"}\n disabled={busy}\n />\n </div>\n\n {formError && <p role=\"alert\" className=\"text-sm text-destructive\">{formError}</p>}\n\n <div className=\"btn-border-animated p-[1px] rounded-2xl\">\n <button\n type=\"button\"\n disabled={busy}\n onClick={onSubmit}\n className=\"w-full h-12 rounded-[15px] flex items-center justify-center gap-2 text-base font-semibold text-white bg-transparent transition-all hover:brightness-110 active:scale-[0.98] disabled:opacity-50\"\n >\n <Handshake className=\"h-4 w-4\" />\n {mode === \"offer\" ? \"Create Offer\" : \"Send proposal\"}\n </button>\n </div>\n </div>\n </ClaimRouteShell>\n\n <TransactionDialog\n tx={tx}\n title={mode === \"offer\" ? \"Create sponsorship offer\" : \"Send proposal\"}\n workingLabel={mode === \"offer\" ? \"Creating your sponsorship offer…\" : \"Sending your proposal…\"}\n firstStepLabel=\"Upload license terms\"\n >\n <TransactionSuccess\n name={chosen?.name ?? \"Your sponsorship\"}\n image={chosen?.image ?? null}\n title={mode === \"offer\" ? \"Offer created\" : \"Proposal sent\"}\n description={\n mode === \"offer\"\n ? \"The offer is recorded onchain with the asset and terms you chose.\"\n : \"The proposal is recorded onchain with the amount and duration you chose.\"\n }\n actions={[{ href: \"/launchpad/sponsorship\", label: \"Back to Sponsorship launchpad\" }, { label: \"Create another\", onClick: handleAgain }]}\n >\n {mode === \"offer\" && <RewardEarned actionType=\"create_sponsorship_offer\" />}\n </TransactionSuccess>\n </TransactionDialog>\n </WalletRequired>\n );\n}\n"],"mappings":"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","names":[]}
@@ -8,7 +8,7 @@ import { AssetPicker } from "../asset-picker.js";
8
8
  import { AssetSearchPicker } from "../asset-search-picker.js";
9
9
  import { LicenseTermsBuilder, EMPTY_SPONSORSHIP_TERMS, toDurationDays, toLicenseMetadata } from "../license-terms-builder.js";
10
10
  import { ClaimRouteShell } from "../claim-route-shell.js";
11
- import { CreationSuccess } from "../creation-success.js";
11
+ import { TransactionSuccess } from "../transaction-success.js";
12
12
  import { TransactionDialog } from "../transaction-dialog.js";
13
13
  import { WalletRequired } from "../wallet-required.js";
14
14
  import { useMedialaneApp } from "../medialane-app.js";
@@ -222,14 +222,13 @@ function SponsorshipCreate({ aside }) {
222
222
  workingLabel: mode === "offer" ? "Creating your sponsorship offer\u2026" : "Sending your proposal\u2026",
223
223
  firstStepLabel: "Upload license terms",
224
224
  children: /* @__PURE__ */ jsx(
225
- CreationSuccess,
225
+ TransactionSuccess,
226
226
  {
227
227
  name: chosen?.name ?? "Your sponsorship",
228
228
  image: chosen?.image ?? null,
229
- caption: mode === "offer" ? "Your offer is live" : "Your proposal is sent",
230
- primary: { href: "/launchpad/sponsorship", label: "Back to Sponsorship launchpad" },
231
- onAgain: handleAgain,
232
- againLabel: "Create another",
229
+ title: mode === "offer" ? "Offer created" : "Proposal sent",
230
+ description: mode === "offer" ? "The offer is recorded onchain with the asset and terms you chose." : "The proposal is recorded onchain with the amount and duration you chose.",
231
+ actions: [{ href: "/launchpad/sponsorship", label: "Back to Sponsorship launchpad" }, { label: "Create another", onClick: handleAgain }],
233
232
  children: mode === "offer" && /* @__PURE__ */ jsx(RewardEarned, { actionType: "create_sponsorship_offer" })
234
233
  }
235
234
  )