@medialane/ui 0.184.0 → 0.186.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/drop/create/drop-create.cjs +6 -4
- package/dist/components/drop/create/drop-create.cjs.map +1 -1
- package/dist/components/drop/create/drop-create.d.cts +4 -6
- package/dist/components/drop/create/drop-create.d.ts +4 -6
- package/dist/components/drop/create/drop-create.js +6 -4
- package/dist/components/drop/create/drop-create.js.map +1 -1
- package/dist/components/drop/create/launch-dialog.cjs +4 -1
- package/dist/components/drop/create/launch-dialog.cjs.map +1 -1
- package/dist/components/drop/create/launch-dialog.js +5 -2
- package/dist/components/drop/create/launch-dialog.js.map +1 -1
- package/dist/components/drop/create/sale-section.cjs +2 -2
- package/dist/components/drop/create/sale-section.cjs.map +1 -1
- package/dist/components/drop/create/sale-section.d.cts +3 -3
- package/dist/components/drop/create/sale-section.d.ts +3 -3
- package/dist/components/drop/create/sale-section.js +2 -2
- package/dist/components/drop/create/sale-section.js.map +1 -1
- package/dist/components/drop/drop-card.cjs +2 -2
- package/dist/components/drop/drop-card.cjs.map +1 -1
- package/dist/components/drop/drop-card.js +1 -1
- package/dist/components/drop/drop-card.js.map +1 -1
- package/dist/components/drop/drop-features.cjs +44 -0
- package/dist/components/drop/drop-features.cjs.map +1 -0
- package/dist/components/drop/drop-features.d.cts +5 -0
- package/dist/components/drop/drop-features.d.ts +5 -0
- package/dist/components/drop/drop-features.js +20 -0
- package/dist/components/drop/drop-features.js.map +1 -0
- package/dist/components/{drop-status-display.cjs → drop/drop-status.cjs} +5 -5
- package/dist/components/drop/drop-status.cjs.map +1 -0
- package/dist/components/{drop-status-display.d.ts → drop/drop-status.d.cts} +1 -2
- package/dist/components/{drop-status-display.d.cts → drop/drop-status.d.ts} +1 -2
- package/dist/components/{drop-status-display.js → drop/drop-status.js} +2 -2
- package/dist/components/drop/drop-status.js.map +1 -0
- package/dist/components/drop/page/drop-action-box.cjs +3 -3
- package/dist/components/drop/page/drop-action-box.cjs.map +1 -1
- package/dist/components/drop/page/drop-action-box.d.cts +0 -1
- package/dist/components/drop/page/drop-action-box.d.ts +0 -1
- package/dist/components/drop/page/drop-action-box.js +1 -1
- package/dist/components/drop/page/drop-action-box.js.map +1 -1
- package/dist/components/drop/page/drop-page.cjs +6 -4
- package/dist/components/drop/page/drop-page.cjs.map +1 -1
- package/dist/components/drop/page/drop-page.d.cts +1 -2
- package/dist/components/drop/page/drop-page.d.ts +1 -2
- package/dist/components/drop/page/drop-page.js +7 -5
- package/dist/components/drop/page/drop-page.js.map +1 -1
- package/dist/components/media-wallet/action-button.cjs +54 -0
- package/dist/components/media-wallet/action-button.cjs.map +1 -0
- package/dist/components/media-wallet/action-button.d.cts +10 -0
- package/dist/components/media-wallet/action-button.d.ts +10 -0
- package/dist/components/media-wallet/action-button.js +28 -0
- package/dist/components/media-wallet/action-button.js.map +1 -0
- package/dist/components/media-wallet/action-modal.cjs +84 -0
- package/dist/components/media-wallet/action-modal.cjs.map +1 -0
- package/dist/components/media-wallet/action-modal.d.cts +20 -0
- package/dist/components/media-wallet/action-modal.d.ts +20 -0
- package/dist/components/media-wallet/action-modal.js +56 -0
- package/dist/components/media-wallet/action-modal.js.map +1 -0
- package/dist/components/media-wallet/activate-card.cjs +72 -0
- package/dist/components/media-wallet/activate-card.cjs.map +1 -0
- package/dist/components/media-wallet/activate-card.d.cts +7 -0
- package/dist/components/media-wallet/activate-card.d.ts +7 -0
- package/dist/components/media-wallet/activate-card.js +48 -0
- package/dist/components/media-wallet/activate-card.js.map +1 -0
- package/dist/components/media-wallet/address-qr.cjs +64 -0
- package/dist/components/media-wallet/address-qr.cjs.map +1 -0
- package/dist/components/media-wallet/address-qr.d.cts +8 -0
- package/dist/components/media-wallet/address-qr.d.ts +8 -0
- package/dist/components/media-wallet/address-qr.js +30 -0
- package/dist/components/media-wallet/address-qr.js.map +1 -0
- package/dist/components/media-wallet/back-button.cjs +41 -0
- package/dist/components/media-wallet/back-button.cjs.map +1 -0
- package/dist/components/media-wallet/back-button.d.cts +7 -0
- package/dist/components/media-wallet/back-button.d.ts +7 -0
- package/dist/components/media-wallet/back-button.js +17 -0
- package/dist/components/media-wallet/back-button.js.map +1 -0
- package/dist/components/media-wallet/copy-icon.cjs +49 -0
- package/dist/components/media-wallet/copy-icon.cjs.map +1 -0
- package/dist/components/media-wallet/copy-icon.d.cts +7 -0
- package/dist/components/media-wallet/copy-icon.d.ts +7 -0
- package/dist/components/media-wallet/copy-icon.js +25 -0
- package/dist/components/media-wallet/copy-icon.js.map +1 -0
- package/dist/components/media-wallet/currency-sheet.cjs +54 -0
- package/dist/components/media-wallet/currency-sheet.cjs.map +1 -0
- package/dist/components/media-wallet/currency-sheet.d.cts +12 -0
- package/dist/components/media-wallet/currency-sheet.d.ts +12 -0
- package/dist/components/media-wallet/currency-sheet.js +30 -0
- package/dist/components/media-wallet/currency-sheet.js.map +1 -0
- package/dist/components/media-wallet/media-wallet-activity.cjs +223 -0
- package/dist/components/media-wallet/media-wallet-activity.cjs.map +1 -0
- package/dist/components/media-wallet/media-wallet-activity.d.cts +12 -0
- package/dist/components/media-wallet/media-wallet-activity.d.ts +12 -0
- package/dist/components/media-wallet/media-wallet-activity.js +189 -0
- package/dist/components/media-wallet/media-wallet-activity.js.map +1 -0
- package/dist/components/media-wallet/media-wallet-header.cjs +97 -0
- package/dist/components/media-wallet/media-wallet-header.cjs.map +1 -0
- package/dist/components/media-wallet/media-wallet-header.d.cts +8 -0
- package/dist/components/media-wallet/media-wallet-header.d.ts +8 -0
- package/dist/components/media-wallet/media-wallet-header.js +63 -0
- package/dist/components/media-wallet/media-wallet-header.js.map +1 -0
- package/dist/components/media-wallet/media-wallet-home.cjs +258 -0
- package/dist/components/media-wallet/media-wallet-home.cjs.map +1 -0
- package/dist/components/media-wallet/media-wallet-home.d.cts +14 -0
- package/dist/components/media-wallet/media-wallet-home.d.ts +14 -0
- package/dist/components/media-wallet/media-wallet-home.js +224 -0
- package/dist/components/media-wallet/media-wallet-home.js.map +1 -0
- package/dist/components/media-wallet/media-wallet-overlay.cjs +137 -0
- package/dist/components/media-wallet/media-wallet-overlay.cjs.map +1 -0
- package/dist/components/media-wallet/media-wallet-overlay.d.cts +14 -0
- package/dist/components/media-wallet/media-wallet-overlay.d.ts +14 -0
- package/dist/components/media-wallet/media-wallet-overlay.js +102 -0
- package/dist/components/media-wallet/media-wallet-overlay.js.map +1 -0
- package/dist/components/media-wallet/media-wallet-send.cjs +313 -0
- package/dist/components/media-wallet/media-wallet-send.cjs.map +1 -0
- package/dist/components/media-wallet/media-wallet-send.d.cts +14 -0
- package/dist/components/media-wallet/media-wallet-send.d.ts +14 -0
- package/dist/components/media-wallet/media-wallet-send.js +289 -0
- package/dist/components/media-wallet/media-wallet-send.js.map +1 -0
- package/dist/components/media-wallet/media-wallet-token-detail.cjs +164 -0
- package/dist/components/media-wallet/media-wallet-token-detail.cjs.map +1 -0
- package/dist/components/media-wallet/media-wallet-token-detail.d.cts +13 -0
- package/dist/components/media-wallet/media-wallet-token-detail.d.ts +13 -0
- package/dist/components/media-wallet/media-wallet-token-detail.js +140 -0
- package/dist/components/media-wallet/media-wallet-token-detail.js.map +1 -0
- package/dist/components/media-wallet/media-wallet.cjs +51 -0
- package/dist/components/media-wallet/media-wallet.cjs.map +1 -0
- package/dist/components/media-wallet/media-wallet.d.cts +13 -0
- package/dist/components/media-wallet/media-wallet.d.ts +13 -0
- package/dist/components/media-wallet/media-wallet.js +27 -0
- package/dist/components/media-wallet/media-wallet.js.map +1 -0
- package/dist/components/media-wallet/nft-strip.cjs +85 -0
- package/dist/components/media-wallet/nft-strip.cjs.map +1 -0
- package/dist/components/media-wallet/nft-strip.d.cts +12 -0
- package/dist/components/media-wallet/nft-strip.d.ts +12 -0
- package/dist/components/media-wallet/nft-strip.js +51 -0
- package/dist/components/media-wallet/nft-strip.js.map +1 -0
- package/dist/components/media-wallet/quick-action.cjs +59 -0
- package/dist/components/media-wallet/quick-action.cjs.map +1 -0
- package/dist/components/media-wallet/quick-action.d.cts +12 -0
- package/dist/components/media-wallet/quick-action.d.ts +12 -0
- package/dist/components/media-wallet/quick-action.js +35 -0
- package/dist/components/media-wallet/quick-action.js.map +1 -0
- package/dist/components/media-wallet/receive-card.cjs +86 -0
- package/dist/components/media-wallet/receive-card.cjs.map +1 -0
- package/dist/components/media-wallet/receive-card.d.cts +7 -0
- package/dist/components/media-wallet/receive-card.d.ts +7 -0
- package/dist/components/media-wallet/receive-card.js +52 -0
- package/dist/components/media-wallet/receive-card.js.map +1 -0
- package/dist/components/media-wallet/section-header.cjs +32 -0
- package/dist/components/media-wallet/section-header.cjs.map +1 -0
- package/dist/components/media-wallet/section-header.d.cts +7 -0
- package/dist/components/media-wallet/section-header.d.ts +7 -0
- package/dist/components/media-wallet/section-header.js +8 -0
- package/dist/components/media-wallet/section-header.js.map +1 -0
- package/dist/components/media-wallet/success-dialog.cjs +75 -0
- package/dist/components/media-wallet/success-dialog.cjs.map +1 -0
- package/dist/components/media-wallet/success-dialog.d.cts +11 -0
- package/dist/components/media-wallet/success-dialog.d.ts +11 -0
- package/dist/components/media-wallet/success-dialog.js +51 -0
- package/dist/components/media-wallet/success-dialog.js.map +1 -0
- package/dist/components/media-wallet/types.cjs +37 -0
- package/dist/components/media-wallet/types.cjs.map +1 -0
- package/dist/components/media-wallet/types.d.cts +66 -0
- package/dist/components/media-wallet/types.d.ts +66 -0
- package/dist/components/media-wallet/types.js +12 -0
- package/dist/components/media-wallet/types.js.map +1 -0
- package/dist/components/media-wallet/wallet-activity-icon.cjs +69 -0
- package/dist/components/media-wallet/wallet-activity-icon.cjs.map +1 -0
- package/dist/components/media-wallet/wallet-activity-icon.d.cts +8 -0
- package/dist/components/media-wallet/wallet-activity-icon.d.ts +8 -0
- package/dist/components/media-wallet/wallet-activity-icon.js +45 -0
- package/dist/components/media-wallet/wallet-activity-icon.js.map +1 -0
- package/dist/index.cjs +13 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +6 -2
- package/dist/index.d.ts +6 -2
- package/dist/index.js +8 -2
- package/dist/index.js.map +1 -1
- package/dist/utils/drop/sale.cjs +3 -3
- package/dist/utils/drop/sale.cjs.map +1 -1
- package/dist/utils/drop/sale.d.cts +2 -2
- package/dist/utils/drop/sale.d.ts +2 -2
- package/dist/utils/drop/sale.js +4 -4
- package/dist/utils/drop/sale.js.map +1 -1
- package/dist/utils/drop/view.cjs +2 -2
- package/dist/utils/drop/view.cjs.map +1 -1
- package/dist/utils/drop/view.d.cts +2 -2
- package/dist/utils/drop/view.d.ts +2 -2
- package/dist/utils/drop/view.js +2 -2
- package/dist/utils/drop/view.js.map +1 -1
- package/dist/utils/media-wallet/activity-feed.cjs +35 -0
- package/dist/utils/media-wallet/activity-feed.cjs.map +1 -0
- package/dist/utils/media-wallet/activity-feed.d.cts +14 -0
- package/dist/utils/media-wallet/activity-feed.d.ts +14 -0
- package/dist/utils/media-wallet/activity-feed.js +11 -0
- package/dist/utils/media-wallet/activity-feed.js.map +1 -0
- package/dist/utils/media-wallet/confetti.cjs +51 -0
- package/dist/utils/media-wallet/confetti.cjs.map +1 -0
- package/dist/utils/media-wallet/confetti.d.cts +3 -0
- package/dist/utils/media-wallet/confetti.d.ts +3 -0
- package/dist/utils/media-wallet/confetti.js +17 -0
- package/dist/utils/media-wallet/confetti.js.map +1 -0
- package/dist/utils/media-wallet/nft-items.cjs +38 -0
- package/dist/utils/media-wallet/nft-items.cjs.map +1 -0
- package/dist/utils/media-wallet/nft-items.d.cts +13 -0
- package/dist/utils/media-wallet/nft-items.d.ts +13 -0
- package/dist/utils/media-wallet/nft-items.js +14 -0
- package/dist/utils/media-wallet/nft-items.js.map +1 -0
- package/dist/utils/media-wallet/run-intent-calls.cjs +32 -0
- package/dist/utils/media-wallet/run-intent-calls.cjs.map +1 -0
- package/dist/utils/media-wallet/run-intent-calls.d.cts +16 -0
- package/dist/utils/media-wallet/run-intent-calls.d.ts +16 -0
- package/dist/utils/media-wallet/run-intent-calls.js +8 -0
- package/dist/utils/media-wallet/run-intent-calls.js.map +1 -0
- package/dist/utils/media-wallet/use-erc20-balance.cjs +75 -0
- package/dist/utils/media-wallet/use-erc20-balance.cjs.map +1 -0
- package/dist/utils/media-wallet/use-erc20-balance.d.cts +15 -0
- package/dist/utils/media-wallet/use-erc20-balance.d.ts +15 -0
- package/dist/utils/media-wallet/use-erc20-balance.js +40 -0
- package/dist/utils/media-wallet/use-erc20-balance.js.map +1 -0
- package/dist/utils/media-wallet/use-tokens-by-owner.cjs +52 -0
- package/dist/utils/media-wallet/use-tokens-by-owner.cjs.map +1 -0
- package/dist/utils/media-wallet/use-tokens-by-owner.d.cts +10 -0
- package/dist/utils/media-wallet/use-tokens-by-owner.d.ts +10 -0
- package/dist/utils/media-wallet/use-tokens-by-owner.js +18 -0
- package/dist/utils/media-wallet/use-tokens-by-owner.js.map +1 -0
- package/dist/utils/media-wallet/wallet-activity.cjs +83 -0
- package/dist/utils/media-wallet/wallet-activity.cjs.map +1 -0
- package/dist/utils/media-wallet/wallet-activity.d.cts +7 -0
- package/dist/utils/media-wallet/wallet-activity.d.ts +7 -0
- package/dist/utils/media-wallet/wallet-activity.js +57 -0
- package/dist/utils/media-wallet/wallet-activity.js.map +1 -0
- package/dist/utils/media-wallet/wallet-format.cjs +59 -0
- package/dist/utils/media-wallet/wallet-format.cjs.map +1 -0
- package/dist/utils/media-wallet/wallet-format.d.cts +9 -0
- package/dist/utils/media-wallet/wallet-format.d.ts +9 -0
- package/dist/utils/media-wallet/wallet-format.js +29 -0
- package/dist/utils/media-wallet/wallet-format.js.map +1 -0
- package/dist/utils/media-wallet/wallet-tokens.cjs +39 -0
- package/dist/utils/media-wallet/wallet-tokens.cjs.map +1 -0
- package/dist/utils/media-wallet/wallet-tokens.d.cts +10 -0
- package/dist/utils/media-wallet/wallet-tokens.d.ts +10 -0
- package/dist/utils/media-wallet/wallet-tokens.js +15 -0
- package/dist/utils/media-wallet/wallet-tokens.js.map +1 -0
- package/dist/utils/use-drops.cjs +7 -0
- package/dist/utils/use-drops.cjs.map +1 -1
- package/dist/utils/use-drops.d.cts +3 -1
- package/dist/utils/use-drops.d.ts +3 -1
- package/dist/utils/use-drops.js +6 -0
- package/dist/utils/use-drops.js.map +1 -1
- package/package.json +11 -3
- package/dist/components/drop-status-display.cjs.map +0 -1
- package/dist/components/drop-status-display.js.map +0 -1
|
@@ -49,7 +49,9 @@ var import_artwork_section2 = require("./artwork-section.js");
|
|
|
49
49
|
var import_draft = require("../../../utils/drop/draft.js");
|
|
50
50
|
var import_sale = require("../../../utils/drop/sale.js");
|
|
51
51
|
var import_preview = require("../../../utils/drop/preview.js");
|
|
52
|
+
var import_use_drops = require("../../../utils/use-drops.js");
|
|
52
53
|
function DropCreate(props) {
|
|
54
|
+
const feeBps = (0, import_use_drops.useDropFee)(props.getClient);
|
|
53
55
|
const [draft, setDraftState] = (0, import_react.useState)(import_draft.EMPTY_DRAFT);
|
|
54
56
|
const [tried, setTried] = (0, import_react.useState)(false);
|
|
55
57
|
const [launching, setLaunching] = (0, import_react.useState)(false);
|
|
@@ -64,7 +66,7 @@ function DropCreate(props) {
|
|
|
64
66
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-5 lg:order-1 order-2", children: [
|
|
65
67
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_artwork_section.ArtworkSection, { draft, setDraft, errors }),
|
|
66
68
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_details_section.DetailsSection, { draft, setDraft, errors }),
|
|
67
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_sale_section.SaleSection, { draft, setDraft, errors,
|
|
69
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_sale_section.SaleSection, { draft, setDraft, errors, feeBps }),
|
|
68
70
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_list_section.ListSection, { draft, setDraft, errors }),
|
|
69
71
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
70
72
|
import_collapsible_section.CollapsibleSection,
|
|
@@ -84,10 +86,10 @@ function DropCreate(props) {
|
|
|
84
86
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_gradient_button.GradientButton, { big: true, onClick: launch, children: props.walletAddress ? "Review and launch" : props.connectLabel ?? "Sign in to launch" }),
|
|
85
87
|
launching && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_launch_dialog.LaunchDialog, { open: true, onClose: () => setLaunching(false), draft, app: props })
|
|
86
88
|
] }),
|
|
87
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "order-1 lg:order-2", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "lg:sticky lg:top-24", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(DraftSummary, { draft,
|
|
89
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "order-1 lg:order-2", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "lg:sticky lg:top-24", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(DraftSummary, { draft, feeBps }) }) })
|
|
88
90
|
] });
|
|
89
91
|
}
|
|
90
|
-
function DraftSummary({ draft,
|
|
92
|
+
function DraftSummary({ draft, feeBps }) {
|
|
91
93
|
const art = draft.cover ?? (draft.kind === "edition" ? draft.edition : draft.items[0]?.file ?? null);
|
|
92
94
|
const preview = art ? (0, import_preview.previewUrl)(art) : null;
|
|
93
95
|
const supply = (0, import_draft.draftSupply)(draft);
|
|
@@ -95,7 +97,7 @@ function DraftSummary({ draft, feeConfig }) {
|
|
|
95
97
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "relative aspect-square bg-muted", children: preview && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_image.default, { src: preview, alt: draft.name || "Drop", fill: true, unoptimized: true, className: "object-cover" }) }),
|
|
96
98
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-1 p-4", children: [
|
|
97
99
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "truncate font-semibold", children: draft.name || "Untitled drop" }),
|
|
98
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-xs text-muted-foreground", children: draft.sale.paid ? (0, import_sale.collectorPriceLine)(draft.sale,
|
|
100
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-xs text-muted-foreground", children: draft.sale.paid ? feeBps === null ? "\u2026" : (0, import_sale.collectorPriceLine)(draft.sale, feeBps) ?? "Set a price" : "Free" }),
|
|
99
101
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", { className: "text-xs text-muted-foreground", children: [
|
|
100
102
|
Number.isFinite(supply) && supply > 0 ? `${supply.toLocaleString("en-US")} ${draft.kind === "edition" ? "copies" : "items"}` : "Supply not set",
|
|
101
103
|
" \xB7 ",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/drop/create/drop-create.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { Lock } from \"lucide-react\";\nimport
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/drop/create/drop-create.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { Lock } from \"lucide-react\";\nimport Image from \"../../image.js\";\nimport { GradientButton } from \"../../gradient-button.js\";\nimport { CollapsibleSection } from \"../../collapsible-section.js\";\nimport { ArtworkSection } from \"./artwork-section.js\";\nimport { DetailsSection } from \"./details-section.js\";\nimport { SaleSection } from \"./sale-section.js\";\nimport { ListSection } from \"./list-section.js\";\nimport { ExclusiveFields } from \"./exclusive-fields.js\";\nimport { LaunchDialog } from \"./launch-dialog.js\";\nimport { FieldError } from \"./artwork-section.js\";\nimport { EMPTY_DRAFT, draftSupply, validateDropDraft, type DropDraft } from \"../../../utils/drop/draft.js\";\nimport { collectorPriceLine } from \"../../../utils/drop/sale.js\";\nimport { previewUrl } from \"../../../utils/drop/preview.js\";\nimport type { DropAppProps } from \"../../../utils/drop/types.js\";\nimport { useDropFee } from \"../../../utils/use-drops.js\";\n\nexport function DropCreate(props: DropAppProps) {\n const feeBps = useDropFee(props.getClient);\n const [draft, setDraftState] = useState<DropDraft>(EMPTY_DRAFT);\n const [tried, setTried] = useState(false);\n const [launching, setLaunching] = useState(false);\n const setDraft = (patch: Partial<DropDraft>) => setDraftState((d) => ({ ...d, ...patch }));\n const errors = tried ? validateDropDraft(draft, Math.floor(Date.now() / 1000)) : {};\n\n const launch = () => {\n if (!props.walletAddress) return props.onRequireWallet();\n setTried(true);\n if (Object.keys(validateDropDraft(draft, Math.floor(Date.now() / 1000))).length === 0) setLaunching(true);\n };\n\n return (\n <div className=\"grid gap-6 lg:grid-cols-[minmax(0,1fr)_320px]\">\n <div className=\"space-y-5 lg:order-1 order-2\">\n <ArtworkSection draft={draft} setDraft={setDraft} errors={errors} />\n <DetailsSection draft={draft} setDraft={setDraft} errors={errors} />\n <SaleSection draft={draft} setDraft={setDraft} errors={errors} feeBps={feeBps} />\n <ListSection draft={draft} setDraft={setDraft} errors={errors} />\n <CollapsibleSection\n open={draft.gated.enabled}\n onOpenChange={(enabled) => setDraft({ gated: { ...draft.gated, enabled } })}\n icon={<Lock className=\"h-4 w-4 text-primary\" />}\n label=\"Exclusive content\"\n hint=\"Optional · a private link only holders can open\"\n >\n <ExclusiveFields value={draft.gated} onChange={(v) => setDraft({ gated: { ...draft.gated, ...v } })} />\n <FieldError message={errors.gated} />\n </CollapsibleSection>\n {tried && Object.keys(errors).length > 0 && <p className=\"text-sm font-medium text-destructive\">Check the highlighted fields.</p>}\n <GradientButton big onClick={launch}>\n {props.walletAddress ? \"Review and launch\" : props.connectLabel ?? \"Sign in to launch\"}\n </GradientButton>\n {launching && <LaunchDialog open onClose={() => setLaunching(false)} draft={draft} app={props} />}\n </div>\n <div className=\"order-1 lg:order-2\">\n <div className=\"lg:sticky lg:top-24\"><DraftSummary draft={draft} feeBps={feeBps} /></div>\n </div>\n </div>\n );\n}\n\n/** The drop as collectors will see it, updated as the form changes. */\nexport function DraftSummary({ draft, feeBps }: { draft: DropDraft; feeBps: number | null }) {\n const art = draft.cover ?? (draft.kind === \"edition\" ? draft.edition : draft.items[0]?.file ?? null);\n const preview = art ? previewUrl(art) : null;\n const supply = draftSupply(draft);\n return (\n <div className=\"overflow-hidden rounded-2xl border border-border bg-card\">\n <div className=\"relative aspect-square bg-muted\">\n {preview && <Image src={preview} alt={draft.name || \"Drop\"} fill unoptimized className=\"object-cover\" />}\n </div>\n <div className=\"space-y-1 p-4\">\n <p className=\"truncate font-semibold\">{draft.name || \"Untitled drop\"}</p>\n <p className=\"text-xs text-muted-foreground\">\n {draft.sale.paid ? (feeBps === null ? \"…\" : collectorPriceLine(draft.sale, feeBps) ?? \"Set a price\") : \"Free\"}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {Number.isFinite(supply) && supply > 0 ? `${supply.toLocaleString(\"en-US\")} ${draft.kind === \"edition\" ? \"copies\" : \"items\"}` : \"Supply not set\"}\n {\" · \"}{draft.listOnly ? \"List only\" : \"Open to everyone\"}\n </p>\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["import_artwork_section","Image"]}
|
|
@@ -1,22 +1,20 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
-
import { ResolvedFeeConfig } from '@medialane/sdk';
|
|
3
2
|
import { DropDraft } from '../../../utils/drop/draft.cjs';
|
|
4
3
|
import { DropAppProps } from '../../../utils/drop/types.cjs';
|
|
5
4
|
import '../../drop-item-list.cjs';
|
|
6
5
|
import '../../../utils/drop/metadata.cjs';
|
|
6
|
+
import '@medialane/sdk';
|
|
7
7
|
import '../../../utils/drop/sale.cjs';
|
|
8
8
|
import 'starknet';
|
|
9
9
|
import '@medialane/sdk/starknet';
|
|
10
10
|
import '../../fast-mint/types.cjs';
|
|
11
11
|
import 'react';
|
|
12
12
|
|
|
13
|
-
declare function DropCreate(props: DropAppProps
|
|
14
|
-
feeConfig: ResolvedFeeConfig;
|
|
15
|
-
}): react_jsx_runtime.JSX.Element;
|
|
13
|
+
declare function DropCreate(props: DropAppProps): react_jsx_runtime.JSX.Element;
|
|
16
14
|
/** The drop as collectors will see it, updated as the form changes. */
|
|
17
|
-
declare function DraftSummary({ draft,
|
|
15
|
+
declare function DraftSummary({ draft, feeBps }: {
|
|
18
16
|
draft: DropDraft;
|
|
19
|
-
|
|
17
|
+
feeBps: number | null;
|
|
20
18
|
}): react_jsx_runtime.JSX.Element;
|
|
21
19
|
|
|
22
20
|
export { DraftSummary, DropCreate };
|
|
@@ -1,22 +1,20 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
-
import { ResolvedFeeConfig } from '@medialane/sdk';
|
|
3
2
|
import { DropDraft } from '../../../utils/drop/draft.js';
|
|
4
3
|
import { DropAppProps } from '../../../utils/drop/types.js';
|
|
5
4
|
import '../../drop-item-list.js';
|
|
6
5
|
import '../../../utils/drop/metadata.js';
|
|
6
|
+
import '@medialane/sdk';
|
|
7
7
|
import '../../../utils/drop/sale.js';
|
|
8
8
|
import 'starknet';
|
|
9
9
|
import '@medialane/sdk/starknet';
|
|
10
10
|
import '../../fast-mint/types.js';
|
|
11
11
|
import 'react';
|
|
12
12
|
|
|
13
|
-
declare function DropCreate(props: DropAppProps
|
|
14
|
-
feeConfig: ResolvedFeeConfig;
|
|
15
|
-
}): react_jsx_runtime.JSX.Element;
|
|
13
|
+
declare function DropCreate(props: DropAppProps): react_jsx_runtime.JSX.Element;
|
|
16
14
|
/** The drop as collectors will see it, updated as the form changes. */
|
|
17
|
-
declare function DraftSummary({ draft,
|
|
15
|
+
declare function DraftSummary({ draft, feeBps }: {
|
|
18
16
|
draft: DropDraft;
|
|
19
|
-
|
|
17
|
+
feeBps: number | null;
|
|
20
18
|
}): react_jsx_runtime.JSX.Element;
|
|
21
19
|
|
|
22
20
|
export { DraftSummary, DropCreate };
|
|
@@ -15,7 +15,9 @@ import { FieldError } from "./artwork-section.js";
|
|
|
15
15
|
import { EMPTY_DRAFT, draftSupply, validateDropDraft } from "../../../utils/drop/draft.js";
|
|
16
16
|
import { collectorPriceLine } from "../../../utils/drop/sale.js";
|
|
17
17
|
import { previewUrl } from "../../../utils/drop/preview.js";
|
|
18
|
+
import { useDropFee } from "../../../utils/use-drops.js";
|
|
18
19
|
function DropCreate(props) {
|
|
20
|
+
const feeBps = useDropFee(props.getClient);
|
|
19
21
|
const [draft, setDraftState] = useState(EMPTY_DRAFT);
|
|
20
22
|
const [tried, setTried] = useState(false);
|
|
21
23
|
const [launching, setLaunching] = useState(false);
|
|
@@ -30,7 +32,7 @@ function DropCreate(props) {
|
|
|
30
32
|
/* @__PURE__ */ jsxs("div", { className: "space-y-5 lg:order-1 order-2", children: [
|
|
31
33
|
/* @__PURE__ */ jsx(ArtworkSection, { draft, setDraft, errors }),
|
|
32
34
|
/* @__PURE__ */ jsx(DetailsSection, { draft, setDraft, errors }),
|
|
33
|
-
/* @__PURE__ */ jsx(SaleSection, { draft, setDraft, errors,
|
|
35
|
+
/* @__PURE__ */ jsx(SaleSection, { draft, setDraft, errors, feeBps }),
|
|
34
36
|
/* @__PURE__ */ jsx(ListSection, { draft, setDraft, errors }),
|
|
35
37
|
/* @__PURE__ */ jsxs(
|
|
36
38
|
CollapsibleSection,
|
|
@@ -50,10 +52,10 @@ function DropCreate(props) {
|
|
|
50
52
|
/* @__PURE__ */ jsx(GradientButton, { big: true, onClick: launch, children: props.walletAddress ? "Review and launch" : props.connectLabel ?? "Sign in to launch" }),
|
|
51
53
|
launching && /* @__PURE__ */ jsx(LaunchDialog, { open: true, onClose: () => setLaunching(false), draft, app: props })
|
|
52
54
|
] }),
|
|
53
|
-
/* @__PURE__ */ jsx("div", { className: "order-1 lg:order-2", children: /* @__PURE__ */ jsx("div", { className: "lg:sticky lg:top-24", children: /* @__PURE__ */ jsx(DraftSummary, { draft,
|
|
55
|
+
/* @__PURE__ */ jsx("div", { className: "order-1 lg:order-2", children: /* @__PURE__ */ jsx("div", { className: "lg:sticky lg:top-24", children: /* @__PURE__ */ jsx(DraftSummary, { draft, feeBps }) }) })
|
|
54
56
|
] });
|
|
55
57
|
}
|
|
56
|
-
function DraftSummary({ draft,
|
|
58
|
+
function DraftSummary({ draft, feeBps }) {
|
|
57
59
|
const art = draft.cover ?? (draft.kind === "edition" ? draft.edition : draft.items[0]?.file ?? null);
|
|
58
60
|
const preview = art ? previewUrl(art) : null;
|
|
59
61
|
const supply = draftSupply(draft);
|
|
@@ -61,7 +63,7 @@ function DraftSummary({ draft, feeConfig }) {
|
|
|
61
63
|
/* @__PURE__ */ jsx("div", { className: "relative aspect-square bg-muted", children: preview && /* @__PURE__ */ jsx(Image, { src: preview, alt: draft.name || "Drop", fill: true, unoptimized: true, className: "object-cover" }) }),
|
|
62
64
|
/* @__PURE__ */ jsxs("div", { className: "space-y-1 p-4", children: [
|
|
63
65
|
/* @__PURE__ */ jsx("p", { className: "truncate font-semibold", children: draft.name || "Untitled drop" }),
|
|
64
|
-
/* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: draft.sale.paid ? collectorPriceLine(draft.sale,
|
|
66
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: draft.sale.paid ? feeBps === null ? "\u2026" : collectorPriceLine(draft.sale, feeBps) ?? "Set a price" : "Free" }),
|
|
65
67
|
/* @__PURE__ */ jsxs("p", { className: "text-xs text-muted-foreground", children: [
|
|
66
68
|
Number.isFinite(supply) && supply > 0 ? `${supply.toLocaleString("en-US")} ${draft.kind === "edition" ? "copies" : "items"}` : "Supply not set",
|
|
67
69
|
" \xB7 ",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/drop/create/drop-create.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { Lock } from \"lucide-react\";\nimport
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/drop/create/drop-create.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { Lock } from \"lucide-react\";\nimport Image from \"../../image.js\";\nimport { GradientButton } from \"../../gradient-button.js\";\nimport { CollapsibleSection } from \"../../collapsible-section.js\";\nimport { ArtworkSection } from \"./artwork-section.js\";\nimport { DetailsSection } from \"./details-section.js\";\nimport { SaleSection } from \"./sale-section.js\";\nimport { ListSection } from \"./list-section.js\";\nimport { ExclusiveFields } from \"./exclusive-fields.js\";\nimport { LaunchDialog } from \"./launch-dialog.js\";\nimport { FieldError } from \"./artwork-section.js\";\nimport { EMPTY_DRAFT, draftSupply, validateDropDraft, type DropDraft } from \"../../../utils/drop/draft.js\";\nimport { collectorPriceLine } from \"../../../utils/drop/sale.js\";\nimport { previewUrl } from \"../../../utils/drop/preview.js\";\nimport type { DropAppProps } from \"../../../utils/drop/types.js\";\nimport { useDropFee } from \"../../../utils/use-drops.js\";\n\nexport function DropCreate(props: DropAppProps) {\n const feeBps = useDropFee(props.getClient);\n const [draft, setDraftState] = useState<DropDraft>(EMPTY_DRAFT);\n const [tried, setTried] = useState(false);\n const [launching, setLaunching] = useState(false);\n const setDraft = (patch: Partial<DropDraft>) => setDraftState((d) => ({ ...d, ...patch }));\n const errors = tried ? validateDropDraft(draft, Math.floor(Date.now() / 1000)) : {};\n\n const launch = () => {\n if (!props.walletAddress) return props.onRequireWallet();\n setTried(true);\n if (Object.keys(validateDropDraft(draft, Math.floor(Date.now() / 1000))).length === 0) setLaunching(true);\n };\n\n return (\n <div className=\"grid gap-6 lg:grid-cols-[minmax(0,1fr)_320px]\">\n <div className=\"space-y-5 lg:order-1 order-2\">\n <ArtworkSection draft={draft} setDraft={setDraft} errors={errors} />\n <DetailsSection draft={draft} setDraft={setDraft} errors={errors} />\n <SaleSection draft={draft} setDraft={setDraft} errors={errors} feeBps={feeBps} />\n <ListSection draft={draft} setDraft={setDraft} errors={errors} />\n <CollapsibleSection\n open={draft.gated.enabled}\n onOpenChange={(enabled) => setDraft({ gated: { ...draft.gated, enabled } })}\n icon={<Lock className=\"h-4 w-4 text-primary\" />}\n label=\"Exclusive content\"\n hint=\"Optional · a private link only holders can open\"\n >\n <ExclusiveFields value={draft.gated} onChange={(v) => setDraft({ gated: { ...draft.gated, ...v } })} />\n <FieldError message={errors.gated} />\n </CollapsibleSection>\n {tried && Object.keys(errors).length > 0 && <p className=\"text-sm font-medium text-destructive\">Check the highlighted fields.</p>}\n <GradientButton big onClick={launch}>\n {props.walletAddress ? \"Review and launch\" : props.connectLabel ?? \"Sign in to launch\"}\n </GradientButton>\n {launching && <LaunchDialog open onClose={() => setLaunching(false)} draft={draft} app={props} />}\n </div>\n <div className=\"order-1 lg:order-2\">\n <div className=\"lg:sticky lg:top-24\"><DraftSummary draft={draft} feeBps={feeBps} /></div>\n </div>\n </div>\n );\n}\n\n/** The drop as collectors will see it, updated as the form changes. */\nexport function DraftSummary({ draft, feeBps }: { draft: DropDraft; feeBps: number | null }) {\n const art = draft.cover ?? (draft.kind === \"edition\" ? draft.edition : draft.items[0]?.file ?? null);\n const preview = art ? previewUrl(art) : null;\n const supply = draftSupply(draft);\n return (\n <div className=\"overflow-hidden rounded-2xl border border-border bg-card\">\n <div className=\"relative aspect-square bg-muted\">\n {preview && <Image src={preview} alt={draft.name || \"Drop\"} fill unoptimized className=\"object-cover\" />}\n </div>\n <div className=\"space-y-1 p-4\">\n <p className=\"truncate font-semibold\">{draft.name || \"Untitled drop\"}</p>\n <p className=\"text-xs text-muted-foreground\">\n {draft.sale.paid ? (feeBps === null ? \"…\" : collectorPriceLine(draft.sale, feeBps) ?? \"Set a price\") : \"Free\"}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {Number.isFinite(supply) && supply > 0 ? `${supply.toLocaleString(\"en-US\")} ${draft.kind === \"edition\" ? \"copies\" : \"items\"}` : \"Supply not set\"}\n {\" · \"}{draft.listOnly ? \"List only\" : \"Open to everyone\"}\n </p>\n </div>\n </div>\n );\n}\n"],"mappings":";AAqCM,cAIA,YAJA;AAnCN,SAAS,gBAAgB;AACzB,SAAS,YAAY;AACrB,OAAO,WAAW;AAClB,SAAS,sBAAsB;AAC/B,SAAS,0BAA0B;AACnC,SAAS,sBAAsB;AAC/B,SAAS,sBAAsB;AAC/B,SAAS,mBAAmB;AAC5B,SAAS,mBAAmB;AAC5B,SAAS,uBAAuB;AAChC,SAAS,oBAAoB;AAC7B,SAAS,kBAAkB;AAC3B,SAAS,aAAa,aAAa,yBAAyC;AAC5E,SAAS,0BAA0B;AACnC,SAAS,kBAAkB;AAE3B,SAAS,kBAAkB;AAEpB,SAAS,WAAW,OAAqB;AAC9C,QAAM,SAAS,WAAW,MAAM,SAAS;AACzC,QAAM,CAAC,OAAO,aAAa,IAAI,SAAoB,WAAW;AAC9D,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,KAAK;AACxC,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAChD,QAAM,WAAW,CAAC,UAA8B,cAAc,CAAC,OAAO,EAAE,GAAG,GAAG,GAAG,MAAM,EAAE;AACzF,QAAM,SAAS,QAAQ,kBAAkB,OAAO,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI,CAAC,IAAI,CAAC;AAElF,QAAM,SAAS,MAAM;AACnB,QAAI,CAAC,MAAM,cAAe,QAAO,MAAM,gBAAgB;AACvD,aAAS,IAAI;AACb,QAAI,OAAO,KAAK,kBAAkB,OAAO,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI,CAAC,CAAC,EAAE,WAAW,EAAG,cAAa,IAAI;AAAA,EAC1G;AAEA,SACE,qBAAC,SAAI,WAAU,iDACf;AAAA,yBAAC,SAAI,WAAU,gCACb;AAAA,0BAAC,kBAAe,OAAc,UAAoB,QAAgB;AAAA,MAClE,oBAAC,kBAAe,OAAc,UAAoB,QAAgB;AAAA,MAClE,oBAAC,eAAY,OAAc,UAAoB,QAAgB,QAAgB;AAAA,MAC/E,oBAAC,eAAY,OAAc,UAAoB,QAAgB;AAAA,MAC/D;AAAA,QAAC;AAAA;AAAA,UACC,MAAM,MAAM,MAAM;AAAA,UAClB,cAAc,CAAC,YAAY,SAAS,EAAE,OAAO,EAAE,GAAG,MAAM,OAAO,QAAQ,EAAE,CAAC;AAAA,UAC1E,MAAM,oBAAC,QAAK,WAAU,wBAAuB;AAAA,UAC7C,OAAM;AAAA,UACN,MAAK;AAAA,UAEL;AAAA,gCAAC,mBAAgB,OAAO,MAAM,OAAO,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,EAAE,GAAG,MAAM,OAAO,GAAG,EAAE,EAAE,CAAC,GAAG;AAAA,YACrG,oBAAC,cAAW,SAAS,OAAO,OAAO;AAAA;AAAA;AAAA,MACrC;AAAA,MACC,SAAS,OAAO,KAAK,MAAM,EAAE,SAAS,KAAK,oBAAC,OAAE,WAAU,wCAAuC,2CAA6B;AAAA,MAC7H,oBAAC,kBAAe,KAAG,MAAC,SAAS,QAC1B,gBAAM,gBAAgB,sBAAsB,MAAM,gBAAgB,qBACrE;AAAA,MACC,aAAa,oBAAC,gBAAa,MAAI,MAAC,SAAS,MAAM,aAAa,KAAK,GAAG,OAAc,KAAK,OAAO;AAAA,OACjG;AAAA,IACA,oBAAC,SAAI,WAAU,sBACb,8BAAC,SAAI,WAAU,uBAAsB,8BAAC,gBAAa,OAAc,QAAgB,GAAE,GACrF;AAAA,KACA;AAEJ;AAGO,SAAS,aAAa,EAAE,OAAO,OAAO,GAAgD;AAC3F,QAAM,MAAM,MAAM,UAAU,MAAM,SAAS,YAAY,MAAM,UAAU,MAAM,MAAM,CAAC,GAAG,QAAQ;AAC/F,QAAM,UAAU,MAAM,WAAW,GAAG,IAAI;AACxC,QAAM,SAAS,YAAY,KAAK;AAChC,SACE,qBAAC,SAAI,WAAU,4DACb;AAAA,wBAAC,SAAI,WAAU,mCACZ,qBAAW,oBAAC,SAAM,KAAK,SAAS,KAAK,MAAM,QAAQ,QAAQ,MAAI,MAAC,aAAW,MAAC,WAAU,gBAAe,GACxG;AAAA,IACA,qBAAC,SAAI,WAAU,iBACb;AAAA,0BAAC,OAAE,WAAU,0BAA0B,gBAAM,QAAQ,iBAAgB;AAAA,MACrE,oBAAC,OAAE,WAAU,iCACV,gBAAM,KAAK,OAAQ,WAAW,OAAO,WAAM,mBAAmB,MAAM,MAAM,MAAM,KAAK,gBAAiB,QACzG;AAAA,MACA,qBAAC,OAAE,WAAU,iCACV;AAAA,eAAO,SAAS,MAAM,KAAK,SAAS,IAAI,GAAG,OAAO,eAAe,OAAO,CAAC,IAAI,MAAM,SAAS,YAAY,WAAW,OAAO,KAAK;AAAA,QAC/H;AAAA,QAAO,MAAM,WAAW,cAAc;AAAA,SACzC;AAAA,OACF;AAAA,KACF;AAEJ;","names":[]}
|
|
@@ -47,7 +47,10 @@ function LaunchDialog({ open, onClose, draft, app }) {
|
|
|
47
47
|
const client = app.getClient();
|
|
48
48
|
const files = draft.kind === "edition" ? draft.edition ? [draft.edition] : [] : draft.items.map((i) => i.file);
|
|
49
49
|
const terms = (0, import_sale.toDropTerms)(draft.sale);
|
|
50
|
-
const list =
|
|
50
|
+
const list = (0, import_react.useMemo)(
|
|
51
|
+
() => draft.listOnly ? (0, import_starknet.buildPopAllowlist)((0, import_allowlist.parseAllowlist)(draft.allowlist).addresses) : null,
|
|
52
|
+
[draft.listOnly, draft.allowlist]
|
|
53
|
+
);
|
|
51
54
|
const run = async () => {
|
|
52
55
|
try {
|
|
53
56
|
let uri = baseUri;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/drop/create/launch-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { CheckCircle2, Loader2, RotateCcw, XCircle } from \"lucide-react\";\nimport { dropHref } from \"@medialane/sdk\";\nimport { buildPopAllowlist, dropClaimLinks, popClaimLinksCsv, type PopClaimLink } from \"@medialane/sdk/starknet\";\nimport { ActionDialog } from \"../../action-dialog.js\";\nimport { GradientButton } from \"../../gradient-button.js\";\nimport { Button } from \"../../button.js\";\nimport { ShareButton } from \"../../share-button.js\";\nimport { describeError } from \"../../../utils/describe-error.js\";\nimport { uploadDirectoryToIpfs, uploadFileToIpfs } from \"../../../utils/ipfs-upload.js\";\nimport { parseAllowlist } from \"../../../utils/drop/allowlist.js\";\nimport { buildDropMetadataFiles, metadataBytes, MAX_DROP_METADATA_BYTES } from \"../../../utils/drop/metadata.js\";\nimport { toDropTerms, priceLabel } from \"../../../utils/drop/sale.js\";\nimport { draftSupply, type DropDraft } from \"../../../utils/drop/draft.js\";\nimport { uploadAll, type UploadTask } from \"../../../utils/drop/upload.js\";\nimport { launchDrop, saveExclusiveContent } from \"../../../utils/drop/actions.js\";\nimport type { DropAppProps } from \"../../../utils/drop/types.js\";\n\ntype Step =\n | { kind: \"review\" }\n | { kind: \"uploading\" }\n | { kind: \"launching\" }\n | { kind: \"done\"; collection: string; links: PopClaimLink[]; warning: string | null }\n | { kind: \"error\"; message: string };\n\nexport function LaunchDialog({ open, onClose, draft, app }: { open: boolean; onClose: () => void; draft: DropDraft; app: DropAppProps }) {\n const [step, setStep] = useState<Step>({ kind: \"review\" });\n const [tasks, setTasks] = useState<UploadTask[]>([]);\n const [baseUri, setBaseUri] = useState<string | null>(null);\n const client = app.getClient();\n const files = draft.kind === \"edition\" ? (draft.edition ? [draft.edition] : []) : draft.items.map((i) => i.file);\n const terms = toDropTerms(draft.sale);\n const list = draft.listOnly ? buildPopAllowlist(parseAllowlist(draft.allowlist).addresses) : null;\n\n const run = async () => {\n try {\n let uri = baseUri;\n if (!uri) {\n setStep({ kind: \"uploading\" });\n const initial = tasks.length > 0 ? tasks : [\n ...files.map((file, i) => ({ id: `art-${i}`, file, status: \"pending\" as const, uri: null, error: null })),\n ...(draft.cover ? [{ id: \"cover\", file: draft.cover, status: \"pending\" as const, uri: null, error: null }] : []),\n ];\n const done = await uploadAll(initial, async (f) => (await uploadFileToIpfs(client.api, f, \"image\")).uri, setTasks);\n setTasks(done);\n if (done.some((t) => t.status !== \"done\")) {\n setStep({ kind: \"error\", message: \"Some files didn't upload. Retry to send only those.\" });\n return;\n }\n const art = done.filter((t) => t.id.startsWith(\"art-\"));\n const metadata = buildDropMetadataFiles({\n kind: draft.kind,\n name: draft.name.trim(),\n description: draft.description.trim(),\n creator: app.walletAddress!,\n coverUri: done.find((t) => t.id === \"cover\")?.uri ?? null,\n license: draft.license,\n registrationDate: new Date().toISOString().slice(0, 10),\n items: draft.kind === \"edition\"\n ? [{ name: \"\", description: \"\", imageUri: art[0]!.uri! }]\n : draft.items.map((it, i) => ({ name: it.name, description: it.description, imageUri: art[i]!.uri! })),\n supply: draftSupply(draft),\n });\n if (metadataBytes(metadata) > MAX_DROP_METADATA_BYTES) {\n setStep({ kind: \"error\", message: \"The descriptions are too long for this many tokens. Shorten them and try again.\" });\n return;\n }\n uri = (await uploadDirectoryToIpfs(client.api, metadata)).baseUri;\n setBaseUri(uri);\n }\n setStep({ kind: \"launching\" });\n const signer = await app.getSigner();\n const { collection } = await launchDrop({ client, provider: app.provider, signer }, {\n owner: app.walletAddress!,\n name: draft.name.trim(),\n symbol: draft.symbol,\n baseUri: uri!,\n maxSupply: draftSupply(draft),\n terms,\n allowlistRoot: list?.root,\n description: draft.description.trim() || undefined,\n });\n let warning: string | null = null;\n if (draft.gated.enabled) {\n try {\n await saveExclusiveContent(client, collection, draft.gated);\n } catch {\n warning = \"Your drop launched, but the exclusive content wasn't saved. You can add it from Manage.\";\n }\n }\n setStep({ kind: \"done\", collection, links: list ? dropClaimLinks(window.location.origin, collection, list) : [], warning });\n } catch (err) {\n setStep({ kind: \"error\", message: describeError(err, \"We couldn't launch your drop. Please try again.\").message });\n }\n };\n\n const close = () => {\n if (step.kind === \"uploading\" || step.kind === \"launching\") return;\n onClose();\n };\n\n return (\n <ActionDialog open={open} onClose={close}>\n <div className=\"space-y-5 p-6\">\n {step.kind === \"review\" && (\n <>\n <h2 className=\"text-lg font-semibold\">Review and launch</h2>\n <div className=\"space-y-2 rounded-xl border border-border p-4 text-sm\">\n <p className=\"font-semibold\">{draft.name}</p>\n <p className=\"text-xs font-semibold uppercase tracking-widest text-muted-foreground\">Fixed after launch</p>\n <Row label=\"Price\" value={priceLabel(terms.price, terms.paymentToken)} />\n <Row label=\"Supply\" value={`${draftSupply(draft).toLocaleString(\"en-US\")} ${draft.kind === \"edition\" ? \"copies\" : \"items\"}`} />\n <Row label=\"Starts\" value={terms.startTime === 0 ? \"At launch\" : new Date(terms.startTime * 1000).toLocaleString()} />\n <Row label=\"Ends\" value={terms.endTime === 0 ? \"No end date\" : new Date(terms.endTime * 1000).toLocaleString()} />\n <Row label=\"Per wallet\" value={terms.maxPerWallet === \"0\" ? \"No limit\" : terms.maxPerWallet} />\n <Row label=\"Who can mint\" value={list ? `${Object.keys(list.proofs).length} wallets on a list` : \"Everyone\"} />\n <p className=\"pt-1 text-xs text-muted-foreground\">The artwork and these terms can't be changed after launch. You can change the list later.</p>\n </div>\n <GradientButton big onClick={() => void run()}>Launch drop</GradientButton>\n </>\n )}\n {step.kind === \"uploading\" && (\n <>\n <h2 className=\"flex items-center gap-2 text-lg font-semibold\"><Loader2 className=\"h-4 w-4 animate-spin\" />Uploading</h2>\n <p className=\"text-sm text-muted-foreground\">{tasks.filter((t) => t.status === \"done\").length} of {tasks.length} files</p>\n </>\n )}\n {step.kind === \"launching\" && (\n <h2 className=\"flex items-center gap-2 text-lg font-semibold\"><Loader2 className=\"h-4 w-4 animate-spin\" />Launching your drop…</h2>\n )}\n {step.kind === \"error\" && (\n <>\n <h2 className=\"flex items-center gap-2 text-lg font-semibold\"><XCircle className=\"h-4 w-4 text-destructive\" />Not launched</h2>\n <p className=\"text-sm text-muted-foreground\">{step.message}</p>\n {tasks.some((t) => t.status === \"failed\") && (\n <ul className=\"space-y-1 text-xs text-muted-foreground\">\n {tasks.filter((t) => t.status === \"failed\").map((t) => <li key={t.id}>{t.file.name}: {t.error}</li>)}\n </ul>\n )}\n <Button onClick={() => void run()} className=\"gap-1.5\"><RotateCcw className=\"h-3.5 w-3.5\" />Try again</Button>\n </>\n )}\n {step.kind === \"done\" && (\n <>\n <h2 className=\"flex items-center gap-2 text-lg font-semibold\"><CheckCircle2 className=\"h-5 w-5 text-green-500\" />Your drop is live</h2>\n {step.warning && <p className=\"text-sm text-brand-orange\">{step.warning}</p>}\n <div className=\"flex flex-wrap gap-2\">\n <ShareButton title={draft.name} url={`${window.location.origin}${dropHref(step.collection)}`} variant=\"outline\" />\n <Button asChild variant=\"outline\"><a href={dropHref(step.collection)}>View drop</a></Button>\n {step.links.length > 0 && (\n <Button variant=\"outline\" onClick={() => downloadCsv(popClaimLinksCsv(step.links), \"claim-links.csv\")}>Download claim links</Button>\n )}\n </div>\n {step.links.length > 0 && <p className=\"text-xs text-muted-foreground\">Send each wallet its link — the link is what lets it mint.</p>}\n </>\n )}\n </div>\n </ActionDialog>\n );\n}\n\nfunction Row({ label, value }: { label: string; value: string }) {\n return <div className=\"flex justify-between gap-3\"><span className=\"text-muted-foreground\">{label}</span><span className=\"text-right font-medium\">{value}</span></div>;\n}\n\nexport function downloadCsv(csv: string, name: string) {\n const href = URL.createObjectURL(new Blob([csv], { type: \"text/csv\" }));\n Object.assign(document.createElement(\"a\"), { href, download: name }).click();\n URL.revokeObjectURL(href);\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/drop/create/launch-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { useMemo, useState } from \"react\";\nimport { CheckCircle2, Loader2, RotateCcw, XCircle } from \"lucide-react\";\nimport { dropHref } from \"@medialane/sdk\";\nimport { buildPopAllowlist, dropClaimLinks, popClaimLinksCsv, type PopClaimLink } from \"@medialane/sdk/starknet\";\nimport { ActionDialog } from \"../../action-dialog.js\";\nimport { GradientButton } from \"../../gradient-button.js\";\nimport { Button } from \"../../button.js\";\nimport { ShareButton } from \"../../share-button.js\";\nimport { describeError } from \"../../../utils/describe-error.js\";\nimport { uploadDirectoryToIpfs, uploadFileToIpfs } from \"../../../utils/ipfs-upload.js\";\nimport { parseAllowlist } from \"../../../utils/drop/allowlist.js\";\nimport { buildDropMetadataFiles, metadataBytes, MAX_DROP_METADATA_BYTES } from \"../../../utils/drop/metadata.js\";\nimport { toDropTerms, priceLabel } from \"../../../utils/drop/sale.js\";\nimport { draftSupply, type DropDraft } from \"../../../utils/drop/draft.js\";\nimport { uploadAll, type UploadTask } from \"../../../utils/drop/upload.js\";\nimport { launchDrop, saveExclusiveContent } from \"../../../utils/drop/actions.js\";\nimport type { DropAppProps } from \"../../../utils/drop/types.js\";\n\ntype Step =\n | { kind: \"review\" }\n | { kind: \"uploading\" }\n | { kind: \"launching\" }\n | { kind: \"done\"; collection: string; links: PopClaimLink[]; warning: string | null }\n | { kind: \"error\"; message: string };\n\nexport function LaunchDialog({ open, onClose, draft, app }: { open: boolean; onClose: () => void; draft: DropDraft; app: DropAppProps }) {\n const [step, setStep] = useState<Step>({ kind: \"review\" });\n const [tasks, setTasks] = useState<UploadTask[]>([]);\n const [baseUri, setBaseUri] = useState<string | null>(null);\n const client = app.getClient();\n const files = draft.kind === \"edition\" ? (draft.edition ? [draft.edition] : []) : draft.items.map((i) => i.file);\n const terms = toDropTerms(draft.sale);\n const list = useMemo(\n () => (draft.listOnly ? buildPopAllowlist(parseAllowlist(draft.allowlist).addresses) : null),\n [draft.listOnly, draft.allowlist],\n );\n\n const run = async () => {\n try {\n let uri = baseUri;\n if (!uri) {\n setStep({ kind: \"uploading\" });\n const initial = tasks.length > 0 ? tasks : [\n ...files.map((file, i) => ({ id: `art-${i}`, file, status: \"pending\" as const, uri: null, error: null })),\n ...(draft.cover ? [{ id: \"cover\", file: draft.cover, status: \"pending\" as const, uri: null, error: null }] : []),\n ];\n const done = await uploadAll(initial, async (f) => (await uploadFileToIpfs(client.api, f, \"image\")).uri, setTasks);\n setTasks(done);\n if (done.some((t) => t.status !== \"done\")) {\n setStep({ kind: \"error\", message: \"Some files didn't upload. Retry to send only those.\" });\n return;\n }\n const art = done.filter((t) => t.id.startsWith(\"art-\"));\n const metadata = buildDropMetadataFiles({\n kind: draft.kind,\n name: draft.name.trim(),\n description: draft.description.trim(),\n creator: app.walletAddress!,\n coverUri: done.find((t) => t.id === \"cover\")?.uri ?? null,\n license: draft.license,\n registrationDate: new Date().toISOString().slice(0, 10),\n items: draft.kind === \"edition\"\n ? [{ name: \"\", description: \"\", imageUri: art[0]!.uri! }]\n : draft.items.map((it, i) => ({ name: it.name, description: it.description, imageUri: art[i]!.uri! })),\n supply: draftSupply(draft),\n });\n if (metadataBytes(metadata) > MAX_DROP_METADATA_BYTES) {\n setStep({ kind: \"error\", message: \"The descriptions are too long for this many tokens. Shorten them and try again.\" });\n return;\n }\n uri = (await uploadDirectoryToIpfs(client.api, metadata)).baseUri;\n setBaseUri(uri);\n }\n setStep({ kind: \"launching\" });\n const signer = await app.getSigner();\n const { collection } = await launchDrop({ client, provider: app.provider, signer }, {\n owner: app.walletAddress!,\n name: draft.name.trim(),\n symbol: draft.symbol,\n baseUri: uri!,\n maxSupply: draftSupply(draft),\n terms,\n allowlistRoot: list?.root,\n description: draft.description.trim() || undefined,\n });\n let warning: string | null = null;\n if (draft.gated.enabled) {\n try {\n await saveExclusiveContent(client, collection, draft.gated);\n } catch {\n warning = \"Your drop launched, but the exclusive content wasn't saved. You can add it from Manage.\";\n }\n }\n setStep({ kind: \"done\", collection, links: list ? dropClaimLinks(window.location.origin, collection, list) : [], warning });\n } catch (err) {\n setStep({ kind: \"error\", message: describeError(err, \"We couldn't launch your drop. Please try again.\").message });\n }\n };\n\n const close = () => {\n if (step.kind === \"uploading\" || step.kind === \"launching\") return;\n onClose();\n };\n\n return (\n <ActionDialog open={open} onClose={close}>\n <div className=\"space-y-5 p-6\">\n {step.kind === \"review\" && (\n <>\n <h2 className=\"text-lg font-semibold\">Review and launch</h2>\n <div className=\"space-y-2 rounded-xl border border-border p-4 text-sm\">\n <p className=\"font-semibold\">{draft.name}</p>\n <p className=\"text-xs font-semibold uppercase tracking-widest text-muted-foreground\">Fixed after launch</p>\n <Row label=\"Price\" value={priceLabel(terms.price, terms.paymentToken)} />\n <Row label=\"Supply\" value={`${draftSupply(draft).toLocaleString(\"en-US\")} ${draft.kind === \"edition\" ? \"copies\" : \"items\"}`} />\n <Row label=\"Starts\" value={terms.startTime === 0 ? \"At launch\" : new Date(terms.startTime * 1000).toLocaleString()} />\n <Row label=\"Ends\" value={terms.endTime === 0 ? \"No end date\" : new Date(terms.endTime * 1000).toLocaleString()} />\n <Row label=\"Per wallet\" value={terms.maxPerWallet === \"0\" ? \"No limit\" : terms.maxPerWallet} />\n <Row label=\"Who can mint\" value={list ? `${Object.keys(list.proofs).length} wallets on a list` : \"Everyone\"} />\n <p className=\"pt-1 text-xs text-muted-foreground\">The artwork and these terms can't be changed after launch. You can change the list later.</p>\n </div>\n <GradientButton big onClick={() => void run()}>Launch drop</GradientButton>\n </>\n )}\n {step.kind === \"uploading\" && (\n <>\n <h2 className=\"flex items-center gap-2 text-lg font-semibold\"><Loader2 className=\"h-4 w-4 animate-spin\" />Uploading</h2>\n <p className=\"text-sm text-muted-foreground\">{tasks.filter((t) => t.status === \"done\").length} of {tasks.length} files</p>\n </>\n )}\n {step.kind === \"launching\" && (\n <h2 className=\"flex items-center gap-2 text-lg font-semibold\"><Loader2 className=\"h-4 w-4 animate-spin\" />Launching your drop…</h2>\n )}\n {step.kind === \"error\" && (\n <>\n <h2 className=\"flex items-center gap-2 text-lg font-semibold\"><XCircle className=\"h-4 w-4 text-destructive\" />Not launched</h2>\n <p className=\"text-sm text-muted-foreground\">{step.message}</p>\n {tasks.some((t) => t.status === \"failed\") && (\n <ul className=\"space-y-1 text-xs text-muted-foreground\">\n {tasks.filter((t) => t.status === \"failed\").map((t) => <li key={t.id}>{t.file.name}: {t.error}</li>)}\n </ul>\n )}\n <Button onClick={() => void run()} className=\"gap-1.5\"><RotateCcw className=\"h-3.5 w-3.5\" />Try again</Button>\n </>\n )}\n {step.kind === \"done\" && (\n <>\n <h2 className=\"flex items-center gap-2 text-lg font-semibold\"><CheckCircle2 className=\"h-5 w-5 text-green-500\" />Your drop is live</h2>\n {step.warning && <p className=\"text-sm text-brand-orange\">{step.warning}</p>}\n <div className=\"flex flex-wrap gap-2\">\n <ShareButton title={draft.name} url={`${window.location.origin}${dropHref(step.collection)}`} variant=\"outline\" />\n <Button asChild variant=\"outline\"><a href={dropHref(step.collection)}>View drop</a></Button>\n {step.links.length > 0 && (\n <Button variant=\"outline\" onClick={() => downloadCsv(popClaimLinksCsv(step.links), \"claim-links.csv\")}>Download claim links</Button>\n )}\n </div>\n {step.links.length > 0 && <p className=\"text-xs text-muted-foreground\">Send each wallet its link — the link is what lets it mint.</p>}\n </>\n )}\n </div>\n </ActionDialog>\n );\n}\n\nfunction Row({ label, value }: { label: string; value: string }) {\n return <div className=\"flex justify-between gap-3\"><span className=\"text-muted-foreground\">{label}</span><span className=\"text-right font-medium\">{value}</span></div>;\n}\n\nexport function downloadCsv(csv: string, name: string) {\n const href = URL.createObjectURL(new Blob([csv], { type: \"text/csv\" }));\n Object.assign(document.createElement(\"a\"), { href, download: name }).click();\n URL.revokeObjectURL(href);\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { useState } from "react";
|
|
3
|
+
import { useMemo, useState } from "react";
|
|
4
4
|
import { CheckCircle2, Loader2, RotateCcw, XCircle } from "lucide-react";
|
|
5
5
|
import { dropHref } from "@medialane/sdk";
|
|
6
6
|
import { buildPopAllowlist, dropClaimLinks, popClaimLinksCsv } from "@medialane/sdk/starknet";
|
|
@@ -23,7 +23,10 @@ function LaunchDialog({ open, onClose, draft, app }) {
|
|
|
23
23
|
const client = app.getClient();
|
|
24
24
|
const files = draft.kind === "edition" ? draft.edition ? [draft.edition] : [] : draft.items.map((i) => i.file);
|
|
25
25
|
const terms = toDropTerms(draft.sale);
|
|
26
|
-
const list =
|
|
26
|
+
const list = useMemo(
|
|
27
|
+
() => draft.listOnly ? buildPopAllowlist(parseAllowlist(draft.allowlist).addresses) : null,
|
|
28
|
+
[draft.listOnly, draft.allowlist]
|
|
29
|
+
);
|
|
27
30
|
const run = async () => {
|
|
28
31
|
try {
|
|
29
32
|
let uri = baseUri;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/drop/create/launch-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { CheckCircle2, Loader2, RotateCcw, XCircle } from \"lucide-react\";\nimport { dropHref } from \"@medialane/sdk\";\nimport { buildPopAllowlist, dropClaimLinks, popClaimLinksCsv, type PopClaimLink } from \"@medialane/sdk/starknet\";\nimport { ActionDialog } from \"../../action-dialog.js\";\nimport { GradientButton } from \"../../gradient-button.js\";\nimport { Button } from \"../../button.js\";\nimport { ShareButton } from \"../../share-button.js\";\nimport { describeError } from \"../../../utils/describe-error.js\";\nimport { uploadDirectoryToIpfs, uploadFileToIpfs } from \"../../../utils/ipfs-upload.js\";\nimport { parseAllowlist } from \"../../../utils/drop/allowlist.js\";\nimport { buildDropMetadataFiles, metadataBytes, MAX_DROP_METADATA_BYTES } from \"../../../utils/drop/metadata.js\";\nimport { toDropTerms, priceLabel } from \"../../../utils/drop/sale.js\";\nimport { draftSupply, type DropDraft } from \"../../../utils/drop/draft.js\";\nimport { uploadAll, type UploadTask } from \"../../../utils/drop/upload.js\";\nimport { launchDrop, saveExclusiveContent } from \"../../../utils/drop/actions.js\";\nimport type { DropAppProps } from \"../../../utils/drop/types.js\";\n\ntype Step =\n | { kind: \"review\" }\n | { kind: \"uploading\" }\n | { kind: \"launching\" }\n | { kind: \"done\"; collection: string; links: PopClaimLink[]; warning: string | null }\n | { kind: \"error\"; message: string };\n\nexport function LaunchDialog({ open, onClose, draft, app }: { open: boolean; onClose: () => void; draft: DropDraft; app: DropAppProps }) {\n const [step, setStep] = useState<Step>({ kind: \"review\" });\n const [tasks, setTasks] = useState<UploadTask[]>([]);\n const [baseUri, setBaseUri] = useState<string | null>(null);\n const client = app.getClient();\n const files = draft.kind === \"edition\" ? (draft.edition ? [draft.edition] : []) : draft.items.map((i) => i.file);\n const terms = toDropTerms(draft.sale);\n const list = draft.listOnly ? buildPopAllowlist(parseAllowlist(draft.allowlist).addresses) : null;\n\n const run = async () => {\n try {\n let uri = baseUri;\n if (!uri) {\n setStep({ kind: \"uploading\" });\n const initial = tasks.length > 0 ? tasks : [\n ...files.map((file, i) => ({ id: `art-${i}`, file, status: \"pending\" as const, uri: null, error: null })),\n ...(draft.cover ? [{ id: \"cover\", file: draft.cover, status: \"pending\" as const, uri: null, error: null }] : []),\n ];\n const done = await uploadAll(initial, async (f) => (await uploadFileToIpfs(client.api, f, \"image\")).uri, setTasks);\n setTasks(done);\n if (done.some((t) => t.status !== \"done\")) {\n setStep({ kind: \"error\", message: \"Some files didn't upload. Retry to send only those.\" });\n return;\n }\n const art = done.filter((t) => t.id.startsWith(\"art-\"));\n const metadata = buildDropMetadataFiles({\n kind: draft.kind,\n name: draft.name.trim(),\n description: draft.description.trim(),\n creator: app.walletAddress!,\n coverUri: done.find((t) => t.id === \"cover\")?.uri ?? null,\n license: draft.license,\n registrationDate: new Date().toISOString().slice(0, 10),\n items: draft.kind === \"edition\"\n ? [{ name: \"\", description: \"\", imageUri: art[0]!.uri! }]\n : draft.items.map((it, i) => ({ name: it.name, description: it.description, imageUri: art[i]!.uri! })),\n supply: draftSupply(draft),\n });\n if (metadataBytes(metadata) > MAX_DROP_METADATA_BYTES) {\n setStep({ kind: \"error\", message: \"The descriptions are too long for this many tokens. Shorten them and try again.\" });\n return;\n }\n uri = (await uploadDirectoryToIpfs(client.api, metadata)).baseUri;\n setBaseUri(uri);\n }\n setStep({ kind: \"launching\" });\n const signer = await app.getSigner();\n const { collection } = await launchDrop({ client, provider: app.provider, signer }, {\n owner: app.walletAddress!,\n name: draft.name.trim(),\n symbol: draft.symbol,\n baseUri: uri!,\n maxSupply: draftSupply(draft),\n terms,\n allowlistRoot: list?.root,\n description: draft.description.trim() || undefined,\n });\n let warning: string | null = null;\n if (draft.gated.enabled) {\n try {\n await saveExclusiveContent(client, collection, draft.gated);\n } catch {\n warning = \"Your drop launched, but the exclusive content wasn't saved. You can add it from Manage.\";\n }\n }\n setStep({ kind: \"done\", collection, links: list ? dropClaimLinks(window.location.origin, collection, list) : [], warning });\n } catch (err) {\n setStep({ kind: \"error\", message: describeError(err, \"We couldn't launch your drop. Please try again.\").message });\n }\n };\n\n const close = () => {\n if (step.kind === \"uploading\" || step.kind === \"launching\") return;\n onClose();\n };\n\n return (\n <ActionDialog open={open} onClose={close}>\n <div className=\"space-y-5 p-6\">\n {step.kind === \"review\" && (\n <>\n <h2 className=\"text-lg font-semibold\">Review and launch</h2>\n <div className=\"space-y-2 rounded-xl border border-border p-4 text-sm\">\n <p className=\"font-semibold\">{draft.name}</p>\n <p className=\"text-xs font-semibold uppercase tracking-widest text-muted-foreground\">Fixed after launch</p>\n <Row label=\"Price\" value={priceLabel(terms.price, terms.paymentToken)} />\n <Row label=\"Supply\" value={`${draftSupply(draft).toLocaleString(\"en-US\")} ${draft.kind === \"edition\" ? \"copies\" : \"items\"}`} />\n <Row label=\"Starts\" value={terms.startTime === 0 ? \"At launch\" : new Date(terms.startTime * 1000).toLocaleString()} />\n <Row label=\"Ends\" value={terms.endTime === 0 ? \"No end date\" : new Date(terms.endTime * 1000).toLocaleString()} />\n <Row label=\"Per wallet\" value={terms.maxPerWallet === \"0\" ? \"No limit\" : terms.maxPerWallet} />\n <Row label=\"Who can mint\" value={list ? `${Object.keys(list.proofs).length} wallets on a list` : \"Everyone\"} />\n <p className=\"pt-1 text-xs text-muted-foreground\">The artwork and these terms can't be changed after launch. You can change the list later.</p>\n </div>\n <GradientButton big onClick={() => void run()}>Launch drop</GradientButton>\n </>\n )}\n {step.kind === \"uploading\" && (\n <>\n <h2 className=\"flex items-center gap-2 text-lg font-semibold\"><Loader2 className=\"h-4 w-4 animate-spin\" />Uploading</h2>\n <p className=\"text-sm text-muted-foreground\">{tasks.filter((t) => t.status === \"done\").length} of {tasks.length} files</p>\n </>\n )}\n {step.kind === \"launching\" && (\n <h2 className=\"flex items-center gap-2 text-lg font-semibold\"><Loader2 className=\"h-4 w-4 animate-spin\" />Launching your drop…</h2>\n )}\n {step.kind === \"error\" && (\n <>\n <h2 className=\"flex items-center gap-2 text-lg font-semibold\"><XCircle className=\"h-4 w-4 text-destructive\" />Not launched</h2>\n <p className=\"text-sm text-muted-foreground\">{step.message}</p>\n {tasks.some((t) => t.status === \"failed\") && (\n <ul className=\"space-y-1 text-xs text-muted-foreground\">\n {tasks.filter((t) => t.status === \"failed\").map((t) => <li key={t.id}>{t.file.name}: {t.error}</li>)}\n </ul>\n )}\n <Button onClick={() => void run()} className=\"gap-1.5\"><RotateCcw className=\"h-3.5 w-3.5\" />Try again</Button>\n </>\n )}\n {step.kind === \"done\" && (\n <>\n <h2 className=\"flex items-center gap-2 text-lg font-semibold\"><CheckCircle2 className=\"h-5 w-5 text-green-500\" />Your drop is live</h2>\n {step.warning && <p className=\"text-sm text-brand-orange\">{step.warning}</p>}\n <div className=\"flex flex-wrap gap-2\">\n <ShareButton title={draft.name} url={`${window.location.origin}${dropHref(step.collection)}`} variant=\"outline\" />\n <Button asChild variant=\"outline\"><a href={dropHref(step.collection)}>View drop</a></Button>\n {step.links.length > 0 && (\n <Button variant=\"outline\" onClick={() => downloadCsv(popClaimLinksCsv(step.links), \"claim-links.csv\")}>Download claim links</Button>\n )}\n </div>\n {step.links.length > 0 && <p className=\"text-xs text-muted-foreground\">Send each wallet its link — the link is what lets it mint.</p>}\n </>\n )}\n </div>\n </ActionDialog>\n );\n}\n\nfunction Row({ label, value }: { label: string; value: string }) {\n return <div className=\"flex justify-between gap-3\"><span className=\"text-muted-foreground\">{label}</span><span className=\"text-right font-medium\">{value}</span></div>;\n}\n\nexport function downloadCsv(csv: string, name: string) {\n const href = URL.createObjectURL(new Blob([csv], { type: \"text/csv\" }));\n Object.assign(document.createElement(\"a\"), { href, download: name }).click();\n URL.revokeObjectURL(href);\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/drop/create/launch-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { useMemo, useState } from \"react\";\nimport { CheckCircle2, Loader2, RotateCcw, XCircle } from \"lucide-react\";\nimport { dropHref } from \"@medialane/sdk\";\nimport { buildPopAllowlist, dropClaimLinks, popClaimLinksCsv, type PopClaimLink } from \"@medialane/sdk/starknet\";\nimport { ActionDialog } from \"../../action-dialog.js\";\nimport { GradientButton } from \"../../gradient-button.js\";\nimport { Button } from \"../../button.js\";\nimport { ShareButton } from \"../../share-button.js\";\nimport { describeError } from \"../../../utils/describe-error.js\";\nimport { uploadDirectoryToIpfs, uploadFileToIpfs } from \"../../../utils/ipfs-upload.js\";\nimport { parseAllowlist } from \"../../../utils/drop/allowlist.js\";\nimport { buildDropMetadataFiles, metadataBytes, MAX_DROP_METADATA_BYTES } from \"../../../utils/drop/metadata.js\";\nimport { toDropTerms, priceLabel } from \"../../../utils/drop/sale.js\";\nimport { draftSupply, type DropDraft } from \"../../../utils/drop/draft.js\";\nimport { uploadAll, type UploadTask } from \"../../../utils/drop/upload.js\";\nimport { launchDrop, saveExclusiveContent } from \"../../../utils/drop/actions.js\";\nimport type { DropAppProps } from \"../../../utils/drop/types.js\";\n\ntype Step =\n | { kind: \"review\" }\n | { kind: \"uploading\" }\n | { kind: \"launching\" }\n | { kind: \"done\"; collection: string; links: PopClaimLink[]; warning: string | null }\n | { kind: \"error\"; message: string };\n\nexport function LaunchDialog({ open, onClose, draft, app }: { open: boolean; onClose: () => void; draft: DropDraft; app: DropAppProps }) {\n const [step, setStep] = useState<Step>({ kind: \"review\" });\n const [tasks, setTasks] = useState<UploadTask[]>([]);\n const [baseUri, setBaseUri] = useState<string | null>(null);\n const client = app.getClient();\n const files = draft.kind === \"edition\" ? (draft.edition ? [draft.edition] : []) : draft.items.map((i) => i.file);\n const terms = toDropTerms(draft.sale);\n const list = useMemo(\n () => (draft.listOnly ? buildPopAllowlist(parseAllowlist(draft.allowlist).addresses) : null),\n [draft.listOnly, draft.allowlist],\n );\n\n const run = async () => {\n try {\n let uri = baseUri;\n if (!uri) {\n setStep({ kind: \"uploading\" });\n const initial = tasks.length > 0 ? tasks : [\n ...files.map((file, i) => ({ id: `art-${i}`, file, status: \"pending\" as const, uri: null, error: null })),\n ...(draft.cover ? [{ id: \"cover\", file: draft.cover, status: \"pending\" as const, uri: null, error: null }] : []),\n ];\n const done = await uploadAll(initial, async (f) => (await uploadFileToIpfs(client.api, f, \"image\")).uri, setTasks);\n setTasks(done);\n if (done.some((t) => t.status !== \"done\")) {\n setStep({ kind: \"error\", message: \"Some files didn't upload. Retry to send only those.\" });\n return;\n }\n const art = done.filter((t) => t.id.startsWith(\"art-\"));\n const metadata = buildDropMetadataFiles({\n kind: draft.kind,\n name: draft.name.trim(),\n description: draft.description.trim(),\n creator: app.walletAddress!,\n coverUri: done.find((t) => t.id === \"cover\")?.uri ?? null,\n license: draft.license,\n registrationDate: new Date().toISOString().slice(0, 10),\n items: draft.kind === \"edition\"\n ? [{ name: \"\", description: \"\", imageUri: art[0]!.uri! }]\n : draft.items.map((it, i) => ({ name: it.name, description: it.description, imageUri: art[i]!.uri! })),\n supply: draftSupply(draft),\n });\n if (metadataBytes(metadata) > MAX_DROP_METADATA_BYTES) {\n setStep({ kind: \"error\", message: \"The descriptions are too long for this many tokens. Shorten them and try again.\" });\n return;\n }\n uri = (await uploadDirectoryToIpfs(client.api, metadata)).baseUri;\n setBaseUri(uri);\n }\n setStep({ kind: \"launching\" });\n const signer = await app.getSigner();\n const { collection } = await launchDrop({ client, provider: app.provider, signer }, {\n owner: app.walletAddress!,\n name: draft.name.trim(),\n symbol: draft.symbol,\n baseUri: uri!,\n maxSupply: draftSupply(draft),\n terms,\n allowlistRoot: list?.root,\n description: draft.description.trim() || undefined,\n });\n let warning: string | null = null;\n if (draft.gated.enabled) {\n try {\n await saveExclusiveContent(client, collection, draft.gated);\n } catch {\n warning = \"Your drop launched, but the exclusive content wasn't saved. You can add it from Manage.\";\n }\n }\n setStep({ kind: \"done\", collection, links: list ? dropClaimLinks(window.location.origin, collection, list) : [], warning });\n } catch (err) {\n setStep({ kind: \"error\", message: describeError(err, \"We couldn't launch your drop. Please try again.\").message });\n }\n };\n\n const close = () => {\n if (step.kind === \"uploading\" || step.kind === \"launching\") return;\n onClose();\n };\n\n return (\n <ActionDialog open={open} onClose={close}>\n <div className=\"space-y-5 p-6\">\n {step.kind === \"review\" && (\n <>\n <h2 className=\"text-lg font-semibold\">Review and launch</h2>\n <div className=\"space-y-2 rounded-xl border border-border p-4 text-sm\">\n <p className=\"font-semibold\">{draft.name}</p>\n <p className=\"text-xs font-semibold uppercase tracking-widest text-muted-foreground\">Fixed after launch</p>\n <Row label=\"Price\" value={priceLabel(terms.price, terms.paymentToken)} />\n <Row label=\"Supply\" value={`${draftSupply(draft).toLocaleString(\"en-US\")} ${draft.kind === \"edition\" ? \"copies\" : \"items\"}`} />\n <Row label=\"Starts\" value={terms.startTime === 0 ? \"At launch\" : new Date(terms.startTime * 1000).toLocaleString()} />\n <Row label=\"Ends\" value={terms.endTime === 0 ? \"No end date\" : new Date(terms.endTime * 1000).toLocaleString()} />\n <Row label=\"Per wallet\" value={terms.maxPerWallet === \"0\" ? \"No limit\" : terms.maxPerWallet} />\n <Row label=\"Who can mint\" value={list ? `${Object.keys(list.proofs).length} wallets on a list` : \"Everyone\"} />\n <p className=\"pt-1 text-xs text-muted-foreground\">The artwork and these terms can't be changed after launch. You can change the list later.</p>\n </div>\n <GradientButton big onClick={() => void run()}>Launch drop</GradientButton>\n </>\n )}\n {step.kind === \"uploading\" && (\n <>\n <h2 className=\"flex items-center gap-2 text-lg font-semibold\"><Loader2 className=\"h-4 w-4 animate-spin\" />Uploading</h2>\n <p className=\"text-sm text-muted-foreground\">{tasks.filter((t) => t.status === \"done\").length} of {tasks.length} files</p>\n </>\n )}\n {step.kind === \"launching\" && (\n <h2 className=\"flex items-center gap-2 text-lg font-semibold\"><Loader2 className=\"h-4 w-4 animate-spin\" />Launching your drop…</h2>\n )}\n {step.kind === \"error\" && (\n <>\n <h2 className=\"flex items-center gap-2 text-lg font-semibold\"><XCircle className=\"h-4 w-4 text-destructive\" />Not launched</h2>\n <p className=\"text-sm text-muted-foreground\">{step.message}</p>\n {tasks.some((t) => t.status === \"failed\") && (\n <ul className=\"space-y-1 text-xs text-muted-foreground\">\n {tasks.filter((t) => t.status === \"failed\").map((t) => <li key={t.id}>{t.file.name}: {t.error}</li>)}\n </ul>\n )}\n <Button onClick={() => void run()} className=\"gap-1.5\"><RotateCcw className=\"h-3.5 w-3.5\" />Try again</Button>\n </>\n )}\n {step.kind === \"done\" && (\n <>\n <h2 className=\"flex items-center gap-2 text-lg font-semibold\"><CheckCircle2 className=\"h-5 w-5 text-green-500\" />Your drop is live</h2>\n {step.warning && <p className=\"text-sm text-brand-orange\">{step.warning}</p>}\n <div className=\"flex flex-wrap gap-2\">\n <ShareButton title={draft.name} url={`${window.location.origin}${dropHref(step.collection)}`} variant=\"outline\" />\n <Button asChild variant=\"outline\"><a href={dropHref(step.collection)}>View drop</a></Button>\n {step.links.length > 0 && (\n <Button variant=\"outline\" onClick={() => downloadCsv(popClaimLinksCsv(step.links), \"claim-links.csv\")}>Download claim links</Button>\n )}\n </div>\n {step.links.length > 0 && <p className=\"text-xs text-muted-foreground\">Send each wallet its link — the link is what lets it mint.</p>}\n </>\n )}\n </div>\n </ActionDialog>\n );\n}\n\nfunction Row({ label, value }: { label: string; value: string }) {\n return <div className=\"flex justify-between gap-3\"><span className=\"text-muted-foreground\">{label}</span><span className=\"text-right font-medium\">{value}</span></div>;\n}\n\nexport function downloadCsv(csv: string, name: string) {\n const href = URL.createObjectURL(new Blob([csv], { type: \"text/csv\" }));\n Object.assign(document.createElement(\"a\"), { href, download: name }).click();\n URL.revokeObjectURL(href);\n}\n"],"mappings":"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","names":[]}
|
|
@@ -31,10 +31,10 @@ var import_create_form_primitives = require("../../create-form-primitives.js");
|
|
|
31
31
|
var import_select = require("../../select.js");
|
|
32
32
|
var import_sale = require("../../../utils/drop/sale.js");
|
|
33
33
|
var import_artwork_section = require("./artwork-section.js");
|
|
34
|
-
function SaleSection({ draft, setDraft, errors,
|
|
34
|
+
function SaleSection({ draft, setDraft, errors, feeBps }) {
|
|
35
35
|
const sale = draft.sale;
|
|
36
36
|
const set = (patch) => setDraft({ sale: { ...sale, ...patch } });
|
|
37
|
-
const line = (0, import_sale.collectorPriceLine)(sale,
|
|
37
|
+
const line = feeBps === null ? null : (0, import_sale.collectorPriceLine)(sale, feeBps);
|
|
38
38
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_create_form_primitives.Section, { title: "Sale", icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Tag, { className: "h-4 w-4" }), children: [
|
|
39
39
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_create_form_primitives.ToggleGroup, { value: sale.paid ? "Paid" : "Free", options: ["Free", "Paid"], onChange: (v) => set({ paid: v === "Paid" }) }),
|
|
40
40
|
sale.paid && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-1.5", children: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/drop/create/sale-section.tsx"],"sourcesContent":["\"use client\";\n\nimport { Tag } from \"lucide-react\";\nimport { getListableTokens
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/drop/create/sale-section.tsx"],"sourcesContent":["\"use client\";\n\nimport { Tag } from \"lucide-react\";\nimport { getListableTokens } from \"@medialane/sdk\";\nimport { Input } from \"../../input.js\";\nimport { Switch } from \"../../switch.js\";\nimport { Section, ToggleGroup } from \"../../create-form-primitives.js\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"../../select.js\";\nimport { collectorPriceLine, type SaleDraft } from \"../../../utils/drop/sale.js\";\nimport { FieldError, type SectionProps } from \"./artwork-section.js\";\n\nexport function SaleSection({ draft, setDraft, errors, feeBps }: SectionProps & { feeBps: number | null }) {\n const sale = draft.sale;\n const set = (patch: Partial<SaleDraft>) => setDraft({ sale: { ...sale, ...patch } });\n const line = feeBps === null ? null : collectorPriceLine(sale, feeBps);\n return (\n <Section title=\"Sale\" icon={<Tag className=\"h-4 w-4\" />}>\n <ToggleGroup value={sale.paid ? \"Paid\" : \"Free\"} options={[\"Free\", \"Paid\"]} onChange={(v) => set({ paid: v === \"Paid\" })} />\n {sale.paid && (\n <div className=\"space-y-1.5\">\n <div className=\"flex gap-2\">\n <Input inputMode=\"decimal\" placeholder=\"Price per token\" value={sale.price} onChange={(e) => set({ price: e.target.value.trim() })} />\n <Select value={sale.tokenSymbol} onValueChange={(v) => set({ tokenSymbol: v })}>\n <SelectTrigger className=\"w-28\"><SelectValue /></SelectTrigger>\n <SelectContent>{getListableTokens().map((t) => <SelectItem key={t.symbol} value={t.symbol}>{t.symbol}</SelectItem>)}</SelectContent>\n </Select>\n </div>\n {line && <p className=\"text-xs text-muted-foreground\">{line}</p>}\n <FieldError message={errors.price} />\n </div>\n )}\n <Toggle label=\"Starts now\" checked={sale.startNow} onChange={(v) => set({ startNow: v })} />\n {!sale.startNow && (\n <div className=\"space-y-1.5\">\n <Input type=\"datetime-local\" value={sale.start} onChange={(e) => set({ start: e.target.value })} />\n <FieldError message={errors.start} />\n </div>\n )}\n <Toggle label=\"Has an end date\" checked={sale.hasEnd} onChange={(v) => set({ hasEnd: v })} />\n {sale.hasEnd && (\n <div className=\"space-y-1.5\">\n <Input type=\"datetime-local\" value={sale.end} onChange={(e) => set({ end: e.target.value })} />\n <FieldError message={errors.end} />\n </div>\n )}\n <Toggle label=\"Limit per wallet\" checked={sale.limitPerWallet} onChange={(v) => set({ limitPerWallet: v })} />\n {sale.limitPerWallet && (\n <div className=\"space-y-1.5\">\n <Input inputMode=\"numeric\" className=\"max-w-[10rem]\" value={sale.perWallet} onChange={(e) => set({ perWallet: e.target.value.trim() })} />\n <FieldError message={errors.perWallet} />\n </div>\n )}\n </Section>\n );\n}\n\nfunction Toggle({ label, checked, onChange }: { label: string; checked: boolean; onChange: (v: boolean) => void }) {\n return (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm\">{label}</span>\n <Switch checked={checked} onCheckedChange={onChange} />\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
-
import { ResolvedFeeConfig } from '@medialane/sdk';
|
|
3
2
|
import { SectionProps } from './artwork-section.cjs';
|
|
4
3
|
import '../../../utils/drop/draft.cjs';
|
|
5
4
|
import '../../drop-item-list.cjs';
|
|
6
5
|
import '../../../utils/drop/metadata.cjs';
|
|
6
|
+
import '@medialane/sdk';
|
|
7
7
|
import '../../../utils/drop/sale.cjs';
|
|
8
8
|
|
|
9
|
-
declare function SaleSection({ draft, setDraft, errors,
|
|
10
|
-
|
|
9
|
+
declare function SaleSection({ draft, setDraft, errors, feeBps }: SectionProps & {
|
|
10
|
+
feeBps: number | null;
|
|
11
11
|
}): react_jsx_runtime.JSX.Element;
|
|
12
12
|
|
|
13
13
|
export { SaleSection };
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
-
import { ResolvedFeeConfig } from '@medialane/sdk';
|
|
3
2
|
import { SectionProps } from './artwork-section.js';
|
|
4
3
|
import '../../../utils/drop/draft.js';
|
|
5
4
|
import '../../drop-item-list.js';
|
|
6
5
|
import '../../../utils/drop/metadata.js';
|
|
6
|
+
import '@medialane/sdk';
|
|
7
7
|
import '../../../utils/drop/sale.js';
|
|
8
8
|
|
|
9
|
-
declare function SaleSection({ draft, setDraft, errors,
|
|
10
|
-
|
|
9
|
+
declare function SaleSection({ draft, setDraft, errors, feeBps }: SectionProps & {
|
|
10
|
+
feeBps: number | null;
|
|
11
11
|
}): react_jsx_runtime.JSX.Element;
|
|
12
12
|
|
|
13
13
|
export { SaleSection };
|
|
@@ -8,10 +8,10 @@ import { Section, ToggleGroup } from "../../create-form-primitives.js";
|
|
|
8
8
|
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "../../select.js";
|
|
9
9
|
import { collectorPriceLine } from "../../../utils/drop/sale.js";
|
|
10
10
|
import { FieldError } from "./artwork-section.js";
|
|
11
|
-
function SaleSection({ draft, setDraft, errors,
|
|
11
|
+
function SaleSection({ draft, setDraft, errors, feeBps }) {
|
|
12
12
|
const sale = draft.sale;
|
|
13
13
|
const set = (patch) => setDraft({ sale: { ...sale, ...patch } });
|
|
14
|
-
const line = collectorPriceLine(sale,
|
|
14
|
+
const line = feeBps === null ? null : collectorPriceLine(sale, feeBps);
|
|
15
15
|
return /* @__PURE__ */ jsxs(Section, { title: "Sale", icon: /* @__PURE__ */ jsx(Tag, { className: "h-4 w-4" }), children: [
|
|
16
16
|
/* @__PURE__ */ jsx(ToggleGroup, { value: sale.paid ? "Paid" : "Free", options: ["Free", "Paid"], onChange: (v) => set({ paid: v === "Paid" }) }),
|
|
17
17
|
sale.paid && /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/drop/create/sale-section.tsx"],"sourcesContent":["\"use client\";\n\nimport { Tag } from \"lucide-react\";\nimport { getListableTokens
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/drop/create/sale-section.tsx"],"sourcesContent":["\"use client\";\n\nimport { Tag } from \"lucide-react\";\nimport { getListableTokens } from \"@medialane/sdk\";\nimport { Input } from \"../../input.js\";\nimport { Switch } from \"../../switch.js\";\nimport { Section, ToggleGroup } from \"../../create-form-primitives.js\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"../../select.js\";\nimport { collectorPriceLine, type SaleDraft } from \"../../../utils/drop/sale.js\";\nimport { FieldError, type SectionProps } from \"./artwork-section.js\";\n\nexport function SaleSection({ draft, setDraft, errors, feeBps }: SectionProps & { feeBps: number | null }) {\n const sale = draft.sale;\n const set = (patch: Partial<SaleDraft>) => setDraft({ sale: { ...sale, ...patch } });\n const line = feeBps === null ? null : collectorPriceLine(sale, feeBps);\n return (\n <Section title=\"Sale\" icon={<Tag className=\"h-4 w-4\" />}>\n <ToggleGroup value={sale.paid ? \"Paid\" : \"Free\"} options={[\"Free\", \"Paid\"]} onChange={(v) => set({ paid: v === \"Paid\" })} />\n {sale.paid && (\n <div className=\"space-y-1.5\">\n <div className=\"flex gap-2\">\n <Input inputMode=\"decimal\" placeholder=\"Price per token\" value={sale.price} onChange={(e) => set({ price: e.target.value.trim() })} />\n <Select value={sale.tokenSymbol} onValueChange={(v) => set({ tokenSymbol: v })}>\n <SelectTrigger className=\"w-28\"><SelectValue /></SelectTrigger>\n <SelectContent>{getListableTokens().map((t) => <SelectItem key={t.symbol} value={t.symbol}>{t.symbol}</SelectItem>)}</SelectContent>\n </Select>\n </div>\n {line && <p className=\"text-xs text-muted-foreground\">{line}</p>}\n <FieldError message={errors.price} />\n </div>\n )}\n <Toggle label=\"Starts now\" checked={sale.startNow} onChange={(v) => set({ startNow: v })} />\n {!sale.startNow && (\n <div className=\"space-y-1.5\">\n <Input type=\"datetime-local\" value={sale.start} onChange={(e) => set({ start: e.target.value })} />\n <FieldError message={errors.start} />\n </div>\n )}\n <Toggle label=\"Has an end date\" checked={sale.hasEnd} onChange={(v) => set({ hasEnd: v })} />\n {sale.hasEnd && (\n <div className=\"space-y-1.5\">\n <Input type=\"datetime-local\" value={sale.end} onChange={(e) => set({ end: e.target.value })} />\n <FieldError message={errors.end} />\n </div>\n )}\n <Toggle label=\"Limit per wallet\" checked={sale.limitPerWallet} onChange={(v) => set({ limitPerWallet: v })} />\n {sale.limitPerWallet && (\n <div className=\"space-y-1.5\">\n <Input inputMode=\"numeric\" className=\"max-w-[10rem]\" value={sale.perWallet} onChange={(e) => set({ perWallet: e.target.value.trim() })} />\n <FieldError message={errors.perWallet} />\n </div>\n )}\n </Section>\n );\n}\n\nfunction Toggle({ label, checked, onChange }: { label: string; checked: boolean; onChange: (v: boolean) => void }) {\n return (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm\">{label}</span>\n <Switch checked={checked} onCheckedChange={onChange} />\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -38,7 +38,7 @@ var import_jsx_runtime = require("react/jsx-runtime");
|
|
|
38
38
|
var import_sdk = require("@medialane/sdk");
|
|
39
39
|
var import_image = __toESM(require("../image.js"), 1);
|
|
40
40
|
var import_link = __toESM(require("../link.js"), 1);
|
|
41
|
-
var
|
|
41
|
+
var import_drop_status = require("./drop-status.js");
|
|
42
42
|
var import_ipfs = require("../../utils/ipfs.js");
|
|
43
43
|
var import_view = require("../../utils/drop/view.js");
|
|
44
44
|
var import_sale = require("../../utils/drop/sale.js");
|
|
@@ -52,7 +52,7 @@ function DropCard({ drop, now, manage }) {
|
|
|
52
52
|
children: [
|
|
53
53
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "relative aspect-square bg-muted", children: [
|
|
54
54
|
drop.image && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_image.default, { src: (0, import_ipfs.ipfsToHttp)(drop.image), alt: drop.name ?? "Drop", fill: true, unoptimized: true, className: "object-cover transition-transform group-hover:scale-[1.02]" }),
|
|
55
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "absolute left-3 top-3", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
55
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "absolute left-3 top-3", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_drop_status.DropStatusBadge, { phase }) })
|
|
56
56
|
] }),
|
|
57
57
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-1 p-4", children: [
|
|
58
58
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "truncate font-semibold", children: drop.name ?? "Untitled drop" }),
|