@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.
- package/dist/components/activities-feed.cjs +5 -1
- package/dist/components/activities-feed.cjs.map +1 -1
- package/dist/components/activities-feed.js +5 -1
- package/dist/components/activities-feed.js.map +1 -1
- package/dist/components/activity-feed-shell.cjs +3 -1
- package/dist/components/activity-feed-shell.cjs.map +1 -1
- package/dist/components/activity-feed-shell.js +3 -1
- package/dist/components/activity-feed-shell.js.map +1 -1
- package/dist/components/button.d.cts +1 -1
- package/dist/components/button.d.ts +1 -1
- package/dist/components/coins-explorer.cjs +5 -1
- package/dist/components/coins-explorer.cjs.map +1 -1
- package/dist/components/coins-explorer.js +6 -2
- package/dist/components/coins-explorer.js.map +1 -1
- package/dist/components/comments-section.cjs +7 -6
- package/dist/components/comments-section.cjs.map +1 -1
- package/dist/components/comments-section.js +7 -6
- package/dist/components/comments-section.js.map +1 -1
- package/dist/components/discover-community-section.cjs +5 -1
- package/dist/components/discover-community-section.cjs.map +1 -1
- package/dist/components/discover-community-section.js +5 -1
- package/dist/components/discover-community-section.js.map +1 -1
- package/dist/components/discover-feed-section.cjs +5 -1
- package/dist/components/discover-feed-section.cjs.map +1 -1
- package/dist/components/discover-feed-section.js +5 -1
- package/dist/components/discover-feed-section.js.map +1 -1
- package/dist/components/fast-mint/fast-mint.d.cts +2 -2
- package/dist/components/fast-mint/fast-mint.d.ts +2 -2
- package/dist/components/fast-mint/success-view.cjs +2 -2
- package/dist/components/fast-mint/success-view.cjs.map +1 -1
- package/dist/components/fast-mint/success-view.js +2 -2
- package/dist/components/fast-mint/success-view.js.map +1 -1
- package/dist/components/ip-type-page.cjs +3 -2
- package/dist/components/ip-type-page.cjs.map +1 -1
- package/dist/components/ip-type-page.js +3 -2
- package/dist/components/ip-type-page.js.map +1 -1
- package/dist/components/launchpad/coin-create.cjs +9 -7
- package/dist/components/launchpad/coin-create.cjs.map +1 -1
- package/dist/components/launchpad/coin-create.js +9 -7
- package/dist/components/launchpad/coin-create.js.map +1 -1
- package/dist/components/launchpad/collection-create-form.cjs +11 -14
- package/dist/components/launchpad/collection-create-form.cjs.map +1 -1
- package/dist/components/launchpad/collection-create-form.js +12 -15
- package/dist/components/launchpad/collection-create-form.js.map +1 -1
- package/dist/components/launchpad/collection-create-presets.cjs +8 -8
- package/dist/components/launchpad/collection-create-presets.cjs.map +1 -1
- package/dist/components/launchpad/collection-create-presets.d.cts +2 -1
- package/dist/components/launchpad/collection-create-presets.d.ts +2 -1
- package/dist/components/launchpad/collection-create-presets.js +8 -8
- package/dist/components/launchpad/collection-create-presets.js.map +1 -1
- package/dist/components/launchpad/edition-mint.cjs +9 -7
- package/dist/components/launchpad/edition-mint.cjs.map +1 -1
- package/dist/components/launchpad/edition-mint.js +9 -7
- package/dist/components/launchpad/edition-mint.js.map +1 -1
- package/dist/components/launchpad/pop-create.cjs +5 -6
- package/dist/components/launchpad/pop-create.cjs.map +1 -1
- package/dist/components/launchpad/pop-create.js +5 -6
- package/dist/components/launchpad/pop-create.js.map +1 -1
- package/dist/components/launchpad/remix-mint.cjs +9 -7
- package/dist/components/launchpad/remix-mint.cjs.map +1 -1
- package/dist/components/launchpad/remix-mint.js +9 -7
- package/dist/components/launchpad/remix-mint.js.map +1 -1
- package/dist/components/launchpad/single-edition-mint.cjs +9 -7
- package/dist/components/launchpad/single-edition-mint.cjs.map +1 -1
- package/dist/components/launchpad/single-edition-mint.js +9 -7
- package/dist/components/launchpad/single-edition-mint.js.map +1 -1
- package/dist/components/launchpad/sponsorship-create.cjs +5 -6
- package/dist/components/launchpad/sponsorship-create.cjs.map +1 -1
- package/dist/components/launchpad/sponsorship-create.js +5 -6
- package/dist/components/launchpad/sponsorship-create.js.map +1 -1
- package/dist/components/launchpad/tier-mint-form.cjs +5 -6
- package/dist/components/launchpad/tier-mint-form.cjs.map +1 -1
- package/dist/components/launchpad/tier-mint-form.js +5 -6
- package/dist/components/launchpad/tier-mint-form.js.map +1 -1
- package/dist/components/launchpad/tier-mint-presets.cjs +2 -2
- package/dist/components/launchpad/tier-mint-presets.cjs.map +1 -1
- package/dist/components/launchpad/tier-mint-presets.d.cts +2 -1
- package/dist/components/launchpad/tier-mint-presets.d.ts +2 -1
- package/dist/components/launchpad/tier-mint-presets.js +2 -2
- package/dist/components/launchpad/tier-mint-presets.js.map +1 -1
- package/dist/components/marketplace-dialog-primitives.cjs +1 -31
- package/dist/components/marketplace-dialog-primitives.cjs.map +1 -1
- package/dist/components/marketplace-dialog-primitives.d.cts +1 -12
- package/dist/components/marketplace-dialog-primitives.d.ts +1 -12
- package/dist/components/marketplace-dialog-primitives.js +2 -31
- package/dist/components/marketplace-dialog-primitives.js.map +1 -1
- package/dist/components/media-wallet/media-wallet-activity.cjs +5 -1
- package/dist/components/media-wallet/media-wallet-activity.cjs.map +1 -1
- package/dist/components/media-wallet/media-wallet-activity.js +5 -1
- package/dist/components/media-wallet/media-wallet-activity.js.map +1 -1
- package/dist/components/media-wallet/media-wallet-home.cjs +3 -2
- package/dist/components/media-wallet/media-wallet-home.cjs.map +1 -1
- package/dist/components/media-wallet/media-wallet-home.js +3 -2
- package/dist/components/media-wallet/media-wallet-home.js.map +1 -1
- package/dist/components/media-wallet/media-wallet-send.cjs +5 -2
- package/dist/components/media-wallet/media-wallet-send.cjs.map +1 -1
- package/dist/components/media-wallet/media-wallet-send.js +5 -2
- package/dist/components/media-wallet/media-wallet-send.js.map +1 -1
- package/dist/components/media-wallet/success-dialog.cjs +5 -11
- package/dist/components/media-wallet/success-dialog.cjs.map +1 -1
- package/dist/components/media-wallet/success-dialog.js +5 -11
- package/dist/components/media-wallet/success-dialog.js.map +1 -1
- package/dist/components/pop-claim-button.cjs +7 -6
- package/dist/components/pop-claim-button.cjs.map +1 -1
- package/dist/components/pop-claim-button.js +7 -6
- package/dist/components/pop-claim-button.js.map +1 -1
- package/dist/components/pop-manage-page.cjs +5 -4
- package/dist/components/pop-manage-page.cjs.map +1 -1
- package/dist/components/pop-manage-page.js +5 -4
- package/dist/components/pop-manage-page.js.map +1 -1
- package/dist/components/portfolio-sponsorships.cjs +15 -8
- package/dist/components/portfolio-sponsorships.cjs.map +1 -1
- package/dist/components/portfolio-sponsorships.js +15 -8
- package/dist/components/portfolio-sponsorships.js.map +1 -1
- package/dist/components/service-collections-page.cjs +2 -2
- package/dist/components/service-collections-page.cjs.map +1 -1
- package/dist/components/service-collections-page.d.cts +2 -2
- package/dist/components/service-collections-page.d.ts +2 -2
- package/dist/components/service-collections-page.js +2 -2
- package/dist/components/service-collections-page.js.map +1 -1
- package/dist/components/sheet.d.cts +1 -1
- package/dist/components/sheet.d.ts +1 -1
- package/dist/components/sponsorship-offer-page.cjs +9 -8
- package/dist/components/sponsorship-offer-page.cjs.map +1 -1
- package/dist/components/sponsorship-offer-page.js +9 -8
- package/dist/components/sponsorship-offer-page.js.map +1 -1
- package/dist/components/transaction-success.cjs +60 -0
- package/dist/components/transaction-success.cjs.map +1 -0
- package/dist/components/transaction-success.d.cts +20 -0
- package/dist/components/transaction-success.d.ts +20 -0
- package/dist/components/transaction-success.js +26 -0
- package/dist/components/transaction-success.js.map +1 -0
- package/dist/components/transfer-collection-ownership.cjs +6 -8
- package/dist/components/transfer-collection-ownership.cjs.map +1 -1
- package/dist/components/transfer-collection-ownership.js +6 -8
- package/dist/components/transfer-collection-ownership.js.map +1 -1
- package/dist/index.cjs +9 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -3
- package/dist/index.d.ts +4 -3
- package/dist/index.js +6 -6
- package/dist/index.js.map +1 -1
- package/dist/utils/empty-messages.cjs +62 -0
- package/dist/utils/empty-messages.cjs.map +1 -0
- package/dist/utils/empty-messages.d.cts +40 -0
- package/dist/utils/empty-messages.d.ts +40 -0
- package/dist/utils/empty-messages.js +38 -0
- package/dist/utils/empty-messages.js.map +1 -0
- package/dist/utils/success-messages.cjs +106 -0
- package/dist/utils/success-messages.cjs.map +1 -0
- package/dist/utils/success-messages.d.cts +58 -0
- package/dist/utils/success-messages.d.ts +58 -0
- package/dist/utils/success-messages.js +82 -0
- package/dist/utils/success-messages.js.map +1 -0
- package/package.json +3 -3
- package/dist/components/creation-success.cjs +0 -64
- package/dist/components/creation-success.cjs.map +0 -1
- package/dist/components/creation-success.d.cts +0 -20
- package/dist/components/creation-success.d.ts +0 -20
- package/dist/components/creation-success.js +0 -30
- package/dist/components/creation-success.js.map +0 -1
- package/dist/components/transaction-done.cjs +0 -46
- package/dist/components/transaction-done.cjs.map +0 -1
- package/dist/components/transaction-done.d.cts +0 -18
- package/dist/components/transaction-done.d.ts +0 -18
- package/dist/components/transaction-done.js +0 -22
- package/dist/components/transaction-done.js.map +0 -1
|
@@ -51,6 +51,7 @@ var import_nft_items = require("../../utils/media-wallet/nft-items.js");
|
|
|
51
51
|
var import_nft_strip = require("./nft-strip.js");
|
|
52
52
|
var import_use_usd_prices = require("../../utils/use-usd-prices.js");
|
|
53
53
|
var import_wallet_format = require("../../utils/media-wallet/wallet-format.js");
|
|
54
|
+
var import_success_messages = require("../../utils/success-messages.js");
|
|
54
55
|
var import_types = require("./types.js");
|
|
55
56
|
function MediaWalletHome({
|
|
56
57
|
onNavigate,
|
|
@@ -210,8 +211,8 @@ function MediaWalletHome({
|
|
|
210
211
|
activated && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
211
212
|
import_success_dialog.SuccessDialog,
|
|
212
213
|
{
|
|
213
|
-
title:
|
|
214
|
-
message:
|
|
214
|
+
title: import_success_messages.successMessages.walletActivated().title,
|
|
215
|
+
message: import_success_messages.successMessages.walletActivated().description,
|
|
215
216
|
onClose: () => setActivated(false)
|
|
216
217
|
}
|
|
217
218
|
),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/media-wallet/media-wallet-home.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport Link from \"../link.js\";\nimport { useRouter } from \"../router.js\";\nimport { CurrencyIcon } from \"../currency-icon.js\";\nimport { useTokenBalance } from \"../../utils/media-wallet/use-erc20-balance.js\";\nimport { useTokensByOwner } from \"../../utils/use-tokens.js\";\nimport { ActivateCard } from \"./activate-card.js\";\nimport { QuickAction } from \"./quick-action.js\";\nimport { ReceiveCard } from \"./receive-card.js\";\nimport { ActionModal } from \"./action-modal.js\";\nimport { SectionHeader } from \"./section-header.js\";\nimport { SuccessDialog } from \"./success-dialog.js\";\nimport { MediaWalletHeader } from \"./media-wallet-header.js\";\nimport { WALLET_TOKENS, type WalletToken } from \"../../utils/media-wallet/wallet-tokens.js\";\nimport { pickNftItems } from \"../../utils/media-wallet/nft-items.js\";\nimport { NftStrip } from \"./nft-strip.js\";\nimport { useUsdPrices, usdPriceFor } from \"../../utils/use-usd-prices.js\";\nimport { fmt, fmtUsd, rawToNumber } from \"../../utils/media-wallet/wallet-format.js\";\nimport { useMediaWalletApp, type MediaWalletView } from \"./types.js\";\n\nexport function MediaWalletHome({\n onNavigate,\n onClose,\n autoOpenReceive,\n}: {\n onNavigate: (view: MediaWalletView) => void;\n onClose: () => void;\n autoOpenReceive?: boolean;\n}) {\n const { useWalletSession, useEmailStatus, resolveImage, emailBanner, externalWallet } = useMediaWalletApp();\n const { address, isDeployed } = useWalletSession();\n const emailStatus = useEmailStatus();\n const router = useRouter();\n const needsEmailVerification = !!emailStatus?.email && !emailStatus.emailVerified;\n\n const balances: Record<WalletToken[\"symbol\"], ReturnType<typeof useTokenBalance>> = {\n STRK: useTokenBalance(\"STRK\", address),\n ETH: useTokenBalance(\"ETH\", address),\n USDC: useTokenBalance(\"USDC\", address),\n WBTC: useTokenBalance(\"WBTC\", address),\n };\n\n const { tokens, isLoading: loadingNfts } = useTokensByOwner(address, 1, 6);\n const nftItems = pickNftItems(tokens, 6);\n\n const usdPrices = useUsdPrices();\n const [panel, setPanel] = useState<\"receive\" | null>(autoOpenReceive ? \"receive\" : null);\n const [hideBalances, setHideBalances] = useState(false);\n const [activated, setActivated] = useState(false);\n const [pull, setPull] = useState(0);\n const startY = useRef<number | null>(null);\n const mainRef = useRef<HTMLElement>(null);\n\n useEffect(() => {\n setHideBalances(localStorage.getItem(\"mediawallet.hideBalances\") === \"1\");\n }, []);\n\n const scrollParent = () => mainRef.current?.parentElement ?? null;\n const onTouchStart = (e: React.TouchEvent) => {\n const sc = scrollParent();\n startY.current = sc && sc.scrollTop <= 0 ? e.touches[0].clientY : null;\n };\n const onTouchMove = (e: React.TouchEvent) => {\n if (startY.current == null) return;\n const dy = e.touches[0].clientY - startY.current;\n if (dy > 0) setPull(Math.min(dy * 0.5, 90));\n };\n const onTouchEnd = () => {\n setPull(0);\n startY.current = null;\n };\n\n const usd = (symbol: WalletToken[\"symbol\"]) => {\n const { rawBalance, decimals } = balances[symbol];\n return rawToNumber(rawBalance, decimals) * (usdPriceFor(usdPrices, symbol) ?? 0);\n };\n const totalUsd = WALLET_TOKENS.reduce((sum, t) => sum + usd(t.symbol), 0);\n const heldTokens = WALLET_TOKENS.filter((t) => (balances[t.symbol].rawBalance ?? 0n) > 0n);\n\n const strkBalance = balances.STRK.rawBalance;\n const funded = strkBalance != null && strkBalance > 0n;\n const canSend = isDeployed === true && funded;\n\n const goLaunch = () => {\n onClose();\n router.push(\"/launchpad\");\n };\n\n return (\n <main\n ref={mainRef}\n onTouchStart={onTouchStart}\n onTouchMove={onTouchMove}\n onTouchEnd={onTouchEnd}\n className=\"relative flex min-h-full flex-col gap-6 px-5 pb-8 pt-2\"\n style={{ transform: pull ? `translateY(${pull}px)` : undefined, transition: pull ? \"none\" : \"transform 0.2s ease\" }}\n >\n {address && (\n <div className=\"flex flex-col items-center gap-4\">\n <MediaWalletHeader address={address} onNavigate={onClose} />\n {(funded || isDeployed === false) && (\n <span className=\"font-[family-name:var(--font-display)] text-5xl font-extrabold tracking-tight tabular-nums\">\n {hideBalances ? \"••••\" : usdPrices === null ? \"…\" : fmtUsd(totalUsd)}\n </span>\n )}\n </div>\n )}\n\n {funded ? (\n <div className=\"grid grid-cols-4 gap-2\">\n <QuickAction label=\"Send\" action=\"buy\" disabled={!canSend} onClick={() => onNavigate({ name: \"send\" })} icon={<ArrowUp />} />\n <QuickAction label=\"Receive\" action=\"offer\" onClick={() => setPanel(panel === \"receive\" ? null : \"receive\")} icon={<ArrowDown />} />\n <QuickAction label=\"Launch\" action=\"remix\" onClick={goLaunch} icon={<RocketIcon />} />\n <QuickAction label=\"Activity\" action=\"submit\" onClick={() => onNavigate({ name: \"activity\" })} icon={<ActivityIcon />} />\n </div>\n ) : isDeployed === null ? (\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex flex-col items-center gap-3 py-2\">\n <div className=\"h-3 w-16 animate-pulse rounded bg-foreground/[0.06]\" />\n <div className=\"h-11 w-32 animate-pulse rounded bg-foreground/[0.06]\" />\n <div className=\"h-[48px] w-40 animate-pulse rounded-[13px] bg-foreground/[0.06]\" />\n </div>\n <div className=\"h-[148px] animate-pulse rounded-[20px] bg-foreground/[0.04]\" />\n </div>\n ) : (\n isDeployed === true && (\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex flex-col items-center gap-3 py-2\">\n <span className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">Balance</span>\n <span className=\"font-[family-name:var(--font-display)] text-5xl font-extrabold tracking-tight tabular-nums\">\n {hideBalances ? \"••••\" : usdPrices === null ? \"…\" : fmtUsd(totalUsd)}\n </span>\n <button\n onClick={() => setPanel(panel === \"receive\" ? null : \"receive\")}\n className=\"h-[48px] rounded-[13px] px-8 text-[15px] font-semibold text-white transition-transform active:scale-[0.99]\"\n style={{ background: \"linear-gradient(115deg,#3b7bff,#5b4ce6)\" }}\n >\n Fund your account\n </button>\n </div>\n <button\n onClick={goLaunch}\n className=\"flex flex-col items-center gap-2 rounded-[20px] border-2 border-dashed border-border px-6 py-8 text-center transition-colors hover:border-primary/50 active:scale-[0.99]\"\n >\n <div className=\"grid h-11 w-11 place-items-center rounded-full bg-foreground/[0.06]\">\n <RocketIcon />\n </div>\n <span className=\"text-[15px] font-semibold text-foreground\">Creator Launchpad</span>\n <span className=\"text-xs text-muted-foreground\">Protect and monetize your work</span>\n </button>\n </div>\n )\n )}\n\n {isDeployed === false && <ActivateCard onActivated={() => setActivated(true)} />}\n\n {needsEmailVerification && (\n <Link\n href={emailBanner.href}\n onClick={onClose}\n className=\"flex items-center gap-3 rounded-2xl px-4 py-3 transition-opacity hover:opacity-90\"\n style={{ background: \"linear-gradient(115deg, hsl(var(--brand-orange) / 0.12), hsl(var(--brand-maeve, 327 64% 67%) / 0.12))\" }}\n >\n <div className=\"grid h-9 w-9 shrink-0 place-items-center rounded-full bg-brand-orange/15\">\n <MailIcon />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm font-semibold\">Verify your email</div>\n <div className=\"text-xs text-muted-foreground\">{emailBanner.text(emailStatus?.deadline)}</div>\n </div>\n </Link>\n )}\n\n {panel === \"receive\" && address && (\n <ActionModal onClose={() => setPanel(null)}>\n <ReceiveCard address={address} />\n </ActionModal>\n )}\n\n {heldTokens.length > 0 && (\n <section>\n <SectionHeader title=\"Tokens\" />\n <div className=\"mt-2 flex flex-col gap-2\">\n {heldTokens.map((t) => {\n const { rawBalance, decimals } = balances[t.symbol];\n return (\n <button\n key={t.symbol}\n onClick={() => onNavigate({ name: \"token\", token: t })}\n className=\"flex items-center gap-3 rounded-2xl bg-card/40 px-4 py-3 text-left backdrop-blur-sm transition-colors hover:bg-card/60\"\n >\n <div className=\"grid h-11 w-11 shrink-0 place-items-center rounded-full bg-foreground/[0.06]\">\n <CurrencyIcon symbol={t.symbol} size={24} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm font-semibold\">{t.symbol}</div>\n <div className=\"text-xs text-muted-foreground\">{t.name}</div>\n </div>\n <div className=\"text-right\">\n <div className=\"text-sm font-semibold tabular-nums\">{hideBalances ? \"••••\" : fmt(rawBalance, decimals)}</div>\n {!hideBalances && usdPrices !== null && (\n <div className=\"text-xs text-muted-foreground tabular-nums\">{fmtUsd(usd(t.symbol))}</div>\n )}\n </div>\n </button>\n );\n })}\n </div>\n </section>\n )}\n\n {(nftItems.length > 0 || loadingNfts) && (\n <section>\n <SectionHeader title=\"NFTs\" />\n <div className=\"mt-2\">\n <NftStrip items={nftItems} isLoading={loadingNfts} onNavigate={onClose} resolveImage={resolveImage} />\n </div>\n </section>\n )}\n\n {activated && (\n <SuccessDialog\n title=\"Account activated\"\n message=\"Your account is live and ready to use\"\n onClose={() => setActivated(false)}\n />\n )}\n\n <a\n href={externalWallet.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"mt-auto text-center text-xs text-muted-foreground/60 transition-colors hover:text-muted-foreground\"\n >\n {externalWallet.label}\n </a>\n </main>\n );\n}\n\nfunction ArrowUp() {\n return (\n <svg width=\"19\" height=\"19\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 19V5M5 12l7-7 7 7\" />\n </svg>\n );\n}\nfunction ArrowDown() {\n return (\n <svg width=\"19\" height=\"19\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 5v14M19 12l-7 7-7-7\" />\n </svg>\n );\n}\nfunction ActivityIcon() {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.1\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M22 12h-4l-3 9L9 3l-3 9H2\" />\n </svg>\n );\n}\nfunction MailIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"text-brand-orange\">\n <rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"2\" />\n <path d=\"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7\" />\n </svg>\n );\n}\nfunction RocketIcon() {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.1\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 00-2.91-.09z\" />\n <path d=\"M12 15l-3-3a22 22 0 012-3.95A12.88 12.88 0 0122 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 01-4 2z\" />\n <path d=\"M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5\" />\n </svg>\n );\n}\n"],"mappings":"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","names":["Link"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/media-wallet/media-wallet-home.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport Link from \"../link.js\";\nimport { useRouter } from \"../router.js\";\nimport { CurrencyIcon } from \"../currency-icon.js\";\nimport { useTokenBalance } from \"../../utils/media-wallet/use-erc20-balance.js\";\nimport { useTokensByOwner } from \"../../utils/use-tokens.js\";\nimport { ActivateCard } from \"./activate-card.js\";\nimport { QuickAction } from \"./quick-action.js\";\nimport { ReceiveCard } from \"./receive-card.js\";\nimport { ActionModal } from \"./action-modal.js\";\nimport { SectionHeader } from \"./section-header.js\";\nimport { SuccessDialog } from \"./success-dialog.js\";\nimport { MediaWalletHeader } from \"./media-wallet-header.js\";\nimport { WALLET_TOKENS, type WalletToken } from \"../../utils/media-wallet/wallet-tokens.js\";\nimport { pickNftItems } from \"../../utils/media-wallet/nft-items.js\";\nimport { NftStrip } from \"./nft-strip.js\";\nimport { useUsdPrices, usdPriceFor } from \"../../utils/use-usd-prices.js\";\nimport { fmt, fmtUsd, rawToNumber } from \"../../utils/media-wallet/wallet-format.js\";\nimport { successMessages } from \"../../utils/success-messages.js\";\nimport { useMediaWalletApp, type MediaWalletView } from \"./types.js\";\n\nexport function MediaWalletHome({\n onNavigate,\n onClose,\n autoOpenReceive,\n}: {\n onNavigate: (view: MediaWalletView) => void;\n onClose: () => void;\n autoOpenReceive?: boolean;\n}) {\n const { useWalletSession, useEmailStatus, resolveImage, emailBanner, externalWallet } = useMediaWalletApp();\n const { address, isDeployed } = useWalletSession();\n const emailStatus = useEmailStatus();\n const router = useRouter();\n const needsEmailVerification = !!emailStatus?.email && !emailStatus.emailVerified;\n\n const balances: Record<WalletToken[\"symbol\"], ReturnType<typeof useTokenBalance>> = {\n STRK: useTokenBalance(\"STRK\", address),\n ETH: useTokenBalance(\"ETH\", address),\n USDC: useTokenBalance(\"USDC\", address),\n WBTC: useTokenBalance(\"WBTC\", address),\n };\n\n const { tokens, isLoading: loadingNfts } = useTokensByOwner(address, 1, 6);\n const nftItems = pickNftItems(tokens, 6);\n\n const usdPrices = useUsdPrices();\n const [panel, setPanel] = useState<\"receive\" | null>(autoOpenReceive ? \"receive\" : null);\n const [hideBalances, setHideBalances] = useState(false);\n const [activated, setActivated] = useState(false);\n const [pull, setPull] = useState(0);\n const startY = useRef<number | null>(null);\n const mainRef = useRef<HTMLElement>(null);\n\n useEffect(() => {\n setHideBalances(localStorage.getItem(\"mediawallet.hideBalances\") === \"1\");\n }, []);\n\n const scrollParent = () => mainRef.current?.parentElement ?? null;\n const onTouchStart = (e: React.TouchEvent) => {\n const sc = scrollParent();\n startY.current = sc && sc.scrollTop <= 0 ? e.touches[0].clientY : null;\n };\n const onTouchMove = (e: React.TouchEvent) => {\n if (startY.current == null) return;\n const dy = e.touches[0].clientY - startY.current;\n if (dy > 0) setPull(Math.min(dy * 0.5, 90));\n };\n const onTouchEnd = () => {\n setPull(0);\n startY.current = null;\n };\n\n const usd = (symbol: WalletToken[\"symbol\"]) => {\n const { rawBalance, decimals } = balances[symbol];\n return rawToNumber(rawBalance, decimals) * (usdPriceFor(usdPrices, symbol) ?? 0);\n };\n const totalUsd = WALLET_TOKENS.reduce((sum, t) => sum + usd(t.symbol), 0);\n const heldTokens = WALLET_TOKENS.filter((t) => (balances[t.symbol].rawBalance ?? 0n) > 0n);\n\n const strkBalance = balances.STRK.rawBalance;\n const funded = strkBalance != null && strkBalance > 0n;\n const canSend = isDeployed === true && funded;\n\n const goLaunch = () => {\n onClose();\n router.push(\"/launchpad\");\n };\n\n return (\n <main\n ref={mainRef}\n onTouchStart={onTouchStart}\n onTouchMove={onTouchMove}\n onTouchEnd={onTouchEnd}\n className=\"relative flex min-h-full flex-col gap-6 px-5 pb-8 pt-2\"\n style={{ transform: pull ? `translateY(${pull}px)` : undefined, transition: pull ? \"none\" : \"transform 0.2s ease\" }}\n >\n {address && (\n <div className=\"flex flex-col items-center gap-4\">\n <MediaWalletHeader address={address} onNavigate={onClose} />\n {(funded || isDeployed === false) && (\n <span className=\"font-[family-name:var(--font-display)] text-5xl font-extrabold tracking-tight tabular-nums\">\n {hideBalances ? \"••••\" : usdPrices === null ? \"…\" : fmtUsd(totalUsd)}\n </span>\n )}\n </div>\n )}\n\n {funded ? (\n <div className=\"grid grid-cols-4 gap-2\">\n <QuickAction label=\"Send\" action=\"buy\" disabled={!canSend} onClick={() => onNavigate({ name: \"send\" })} icon={<ArrowUp />} />\n <QuickAction label=\"Receive\" action=\"offer\" onClick={() => setPanel(panel === \"receive\" ? null : \"receive\")} icon={<ArrowDown />} />\n <QuickAction label=\"Launch\" action=\"remix\" onClick={goLaunch} icon={<RocketIcon />} />\n <QuickAction label=\"Activity\" action=\"submit\" onClick={() => onNavigate({ name: \"activity\" })} icon={<ActivityIcon />} />\n </div>\n ) : isDeployed === null ? (\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex flex-col items-center gap-3 py-2\">\n <div className=\"h-3 w-16 animate-pulse rounded bg-foreground/[0.06]\" />\n <div className=\"h-11 w-32 animate-pulse rounded bg-foreground/[0.06]\" />\n <div className=\"h-[48px] w-40 animate-pulse rounded-[13px] bg-foreground/[0.06]\" />\n </div>\n <div className=\"h-[148px] animate-pulse rounded-[20px] bg-foreground/[0.04]\" />\n </div>\n ) : (\n isDeployed === true && (\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex flex-col items-center gap-3 py-2\">\n <span className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">Balance</span>\n <span className=\"font-[family-name:var(--font-display)] text-5xl font-extrabold tracking-tight tabular-nums\">\n {hideBalances ? \"••••\" : usdPrices === null ? \"…\" : fmtUsd(totalUsd)}\n </span>\n <button\n onClick={() => setPanel(panel === \"receive\" ? null : \"receive\")}\n className=\"h-[48px] rounded-[13px] px-8 text-[15px] font-semibold text-white transition-transform active:scale-[0.99]\"\n style={{ background: \"linear-gradient(115deg,#3b7bff,#5b4ce6)\" }}\n >\n Fund your account\n </button>\n </div>\n <button\n onClick={goLaunch}\n className=\"flex flex-col items-center gap-2 rounded-[20px] border-2 border-dashed border-border px-6 py-8 text-center transition-colors hover:border-primary/50 active:scale-[0.99]\"\n >\n <div className=\"grid h-11 w-11 place-items-center rounded-full bg-foreground/[0.06]\">\n <RocketIcon />\n </div>\n <span className=\"text-[15px] font-semibold text-foreground\">Creator Launchpad</span>\n <span className=\"text-xs text-muted-foreground\">Protect and monetize your work</span>\n </button>\n </div>\n )\n )}\n\n {isDeployed === false && <ActivateCard onActivated={() => setActivated(true)} />}\n\n {needsEmailVerification && (\n <Link\n href={emailBanner.href}\n onClick={onClose}\n className=\"flex items-center gap-3 rounded-2xl px-4 py-3 transition-opacity hover:opacity-90\"\n style={{ background: \"linear-gradient(115deg, hsl(var(--brand-orange) / 0.12), hsl(var(--brand-maeve, 327 64% 67%) / 0.12))\" }}\n >\n <div className=\"grid h-9 w-9 shrink-0 place-items-center rounded-full bg-brand-orange/15\">\n <MailIcon />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm font-semibold\">Verify your email</div>\n <div className=\"text-xs text-muted-foreground\">{emailBanner.text(emailStatus?.deadline)}</div>\n </div>\n </Link>\n )}\n\n {panel === \"receive\" && address && (\n <ActionModal onClose={() => setPanel(null)}>\n <ReceiveCard address={address} />\n </ActionModal>\n )}\n\n {heldTokens.length > 0 && (\n <section>\n <SectionHeader title=\"Tokens\" />\n <div className=\"mt-2 flex flex-col gap-2\">\n {heldTokens.map((t) => {\n const { rawBalance, decimals } = balances[t.symbol];\n return (\n <button\n key={t.symbol}\n onClick={() => onNavigate({ name: \"token\", token: t })}\n className=\"flex items-center gap-3 rounded-2xl bg-card/40 px-4 py-3 text-left backdrop-blur-sm transition-colors hover:bg-card/60\"\n >\n <div className=\"grid h-11 w-11 shrink-0 place-items-center rounded-full bg-foreground/[0.06]\">\n <CurrencyIcon symbol={t.symbol} size={24} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm font-semibold\">{t.symbol}</div>\n <div className=\"text-xs text-muted-foreground\">{t.name}</div>\n </div>\n <div className=\"text-right\">\n <div className=\"text-sm font-semibold tabular-nums\">{hideBalances ? \"••••\" : fmt(rawBalance, decimals)}</div>\n {!hideBalances && usdPrices !== null && (\n <div className=\"text-xs text-muted-foreground tabular-nums\">{fmtUsd(usd(t.symbol))}</div>\n )}\n </div>\n </button>\n );\n })}\n </div>\n </section>\n )}\n\n {(nftItems.length > 0 || loadingNfts) && (\n <section>\n <SectionHeader title=\"NFTs\" />\n <div className=\"mt-2\">\n <NftStrip items={nftItems} isLoading={loadingNfts} onNavigate={onClose} resolveImage={resolveImage} />\n </div>\n </section>\n )}\n\n {activated && (\n <SuccessDialog\n title={successMessages.walletActivated().title}\n message={successMessages.walletActivated().description}\n onClose={() => setActivated(false)}\n />\n )}\n\n <a\n href={externalWallet.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"mt-auto text-center text-xs text-muted-foreground/60 transition-colors hover:text-muted-foreground\"\n >\n {externalWallet.label}\n </a>\n </main>\n );\n}\n\nfunction ArrowUp() {\n return (\n <svg width=\"19\" height=\"19\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 19V5M5 12l7-7 7 7\" />\n </svg>\n );\n}\nfunction ArrowDown() {\n return (\n <svg width=\"19\" height=\"19\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 5v14M19 12l-7 7-7-7\" />\n </svg>\n );\n}\nfunction ActivityIcon() {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.1\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M22 12h-4l-3 9L9 3l-3 9H2\" />\n </svg>\n );\n}\nfunction MailIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"text-brand-orange\">\n <rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"2\" />\n <path d=\"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7\" />\n </svg>\n );\n}\nfunction RocketIcon() {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.1\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 00-2.91-.09z\" />\n <path d=\"M12 15l-3-3a22 22 0 012-3.95A12.88 12.88 0 0122 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 01-4 2z\" />\n <path d=\"M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5\" />\n </svg>\n );\n}\n"],"mappings":"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","names":["Link"]}
|
|
@@ -18,6 +18,7 @@ import { pickNftItems } from "../../utils/media-wallet/nft-items.js";
|
|
|
18
18
|
import { NftStrip } from "./nft-strip.js";
|
|
19
19
|
import { useUsdPrices, usdPriceFor } from "../../utils/use-usd-prices.js";
|
|
20
20
|
import { fmt, fmtUsd, rawToNumber } from "../../utils/media-wallet/wallet-format.js";
|
|
21
|
+
import { successMessages } from "../../utils/success-messages.js";
|
|
21
22
|
import { useMediaWalletApp } from "./types.js";
|
|
22
23
|
function MediaWalletHome({
|
|
23
24
|
onNavigate,
|
|
@@ -177,8 +178,8 @@ function MediaWalletHome({
|
|
|
177
178
|
activated && /* @__PURE__ */ jsx(
|
|
178
179
|
SuccessDialog,
|
|
179
180
|
{
|
|
180
|
-
title:
|
|
181
|
-
message:
|
|
181
|
+
title: successMessages.walletActivated().title,
|
|
182
|
+
message: successMessages.walletActivated().description,
|
|
182
183
|
onClose: () => setActivated(false)
|
|
183
184
|
}
|
|
184
185
|
),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/media-wallet/media-wallet-home.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport Link from \"../link.js\";\nimport { useRouter } from \"../router.js\";\nimport { CurrencyIcon } from \"../currency-icon.js\";\nimport { useTokenBalance } from \"../../utils/media-wallet/use-erc20-balance.js\";\nimport { useTokensByOwner } from \"../../utils/use-tokens.js\";\nimport { ActivateCard } from \"./activate-card.js\";\nimport { QuickAction } from \"./quick-action.js\";\nimport { ReceiveCard } from \"./receive-card.js\";\nimport { ActionModal } from \"./action-modal.js\";\nimport { SectionHeader } from \"./section-header.js\";\nimport { SuccessDialog } from \"./success-dialog.js\";\nimport { MediaWalletHeader } from \"./media-wallet-header.js\";\nimport { WALLET_TOKENS, type WalletToken } from \"../../utils/media-wallet/wallet-tokens.js\";\nimport { pickNftItems } from \"../../utils/media-wallet/nft-items.js\";\nimport { NftStrip } from \"./nft-strip.js\";\nimport { useUsdPrices, usdPriceFor } from \"../../utils/use-usd-prices.js\";\nimport { fmt, fmtUsd, rawToNumber } from \"../../utils/media-wallet/wallet-format.js\";\nimport { useMediaWalletApp, type MediaWalletView } from \"./types.js\";\n\nexport function MediaWalletHome({\n onNavigate,\n onClose,\n autoOpenReceive,\n}: {\n onNavigate: (view: MediaWalletView) => void;\n onClose: () => void;\n autoOpenReceive?: boolean;\n}) {\n const { useWalletSession, useEmailStatus, resolveImage, emailBanner, externalWallet } = useMediaWalletApp();\n const { address, isDeployed } = useWalletSession();\n const emailStatus = useEmailStatus();\n const router = useRouter();\n const needsEmailVerification = !!emailStatus?.email && !emailStatus.emailVerified;\n\n const balances: Record<WalletToken[\"symbol\"], ReturnType<typeof useTokenBalance>> = {\n STRK: useTokenBalance(\"STRK\", address),\n ETH: useTokenBalance(\"ETH\", address),\n USDC: useTokenBalance(\"USDC\", address),\n WBTC: useTokenBalance(\"WBTC\", address),\n };\n\n const { tokens, isLoading: loadingNfts } = useTokensByOwner(address, 1, 6);\n const nftItems = pickNftItems(tokens, 6);\n\n const usdPrices = useUsdPrices();\n const [panel, setPanel] = useState<\"receive\" | null>(autoOpenReceive ? \"receive\" : null);\n const [hideBalances, setHideBalances] = useState(false);\n const [activated, setActivated] = useState(false);\n const [pull, setPull] = useState(0);\n const startY = useRef<number | null>(null);\n const mainRef = useRef<HTMLElement>(null);\n\n useEffect(() => {\n setHideBalances(localStorage.getItem(\"mediawallet.hideBalances\") === \"1\");\n }, []);\n\n const scrollParent = () => mainRef.current?.parentElement ?? null;\n const onTouchStart = (e: React.TouchEvent) => {\n const sc = scrollParent();\n startY.current = sc && sc.scrollTop <= 0 ? e.touches[0].clientY : null;\n };\n const onTouchMove = (e: React.TouchEvent) => {\n if (startY.current == null) return;\n const dy = e.touches[0].clientY - startY.current;\n if (dy > 0) setPull(Math.min(dy * 0.5, 90));\n };\n const onTouchEnd = () => {\n setPull(0);\n startY.current = null;\n };\n\n const usd = (symbol: WalletToken[\"symbol\"]) => {\n const { rawBalance, decimals } = balances[symbol];\n return rawToNumber(rawBalance, decimals) * (usdPriceFor(usdPrices, symbol) ?? 0);\n };\n const totalUsd = WALLET_TOKENS.reduce((sum, t) => sum + usd(t.symbol), 0);\n const heldTokens = WALLET_TOKENS.filter((t) => (balances[t.symbol].rawBalance ?? 0n) > 0n);\n\n const strkBalance = balances.STRK.rawBalance;\n const funded = strkBalance != null && strkBalance > 0n;\n const canSend = isDeployed === true && funded;\n\n const goLaunch = () => {\n onClose();\n router.push(\"/launchpad\");\n };\n\n return (\n <main\n ref={mainRef}\n onTouchStart={onTouchStart}\n onTouchMove={onTouchMove}\n onTouchEnd={onTouchEnd}\n className=\"relative flex min-h-full flex-col gap-6 px-5 pb-8 pt-2\"\n style={{ transform: pull ? `translateY(${pull}px)` : undefined, transition: pull ? \"none\" : \"transform 0.2s ease\" }}\n >\n {address && (\n <div className=\"flex flex-col items-center gap-4\">\n <MediaWalletHeader address={address} onNavigate={onClose} />\n {(funded || isDeployed === false) && (\n <span className=\"font-[family-name:var(--font-display)] text-5xl font-extrabold tracking-tight tabular-nums\">\n {hideBalances ? \"••••\" : usdPrices === null ? \"…\" : fmtUsd(totalUsd)}\n </span>\n )}\n </div>\n )}\n\n {funded ? (\n <div className=\"grid grid-cols-4 gap-2\">\n <QuickAction label=\"Send\" action=\"buy\" disabled={!canSend} onClick={() => onNavigate({ name: \"send\" })} icon={<ArrowUp />} />\n <QuickAction label=\"Receive\" action=\"offer\" onClick={() => setPanel(panel === \"receive\" ? null : \"receive\")} icon={<ArrowDown />} />\n <QuickAction label=\"Launch\" action=\"remix\" onClick={goLaunch} icon={<RocketIcon />} />\n <QuickAction label=\"Activity\" action=\"submit\" onClick={() => onNavigate({ name: \"activity\" })} icon={<ActivityIcon />} />\n </div>\n ) : isDeployed === null ? (\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex flex-col items-center gap-3 py-2\">\n <div className=\"h-3 w-16 animate-pulse rounded bg-foreground/[0.06]\" />\n <div className=\"h-11 w-32 animate-pulse rounded bg-foreground/[0.06]\" />\n <div className=\"h-[48px] w-40 animate-pulse rounded-[13px] bg-foreground/[0.06]\" />\n </div>\n <div className=\"h-[148px] animate-pulse rounded-[20px] bg-foreground/[0.04]\" />\n </div>\n ) : (\n isDeployed === true && (\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex flex-col items-center gap-3 py-2\">\n <span className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">Balance</span>\n <span className=\"font-[family-name:var(--font-display)] text-5xl font-extrabold tracking-tight tabular-nums\">\n {hideBalances ? \"••••\" : usdPrices === null ? \"…\" : fmtUsd(totalUsd)}\n </span>\n <button\n onClick={() => setPanel(panel === \"receive\" ? null : \"receive\")}\n className=\"h-[48px] rounded-[13px] px-8 text-[15px] font-semibold text-white transition-transform active:scale-[0.99]\"\n style={{ background: \"linear-gradient(115deg,#3b7bff,#5b4ce6)\" }}\n >\n Fund your account\n </button>\n </div>\n <button\n onClick={goLaunch}\n className=\"flex flex-col items-center gap-2 rounded-[20px] border-2 border-dashed border-border px-6 py-8 text-center transition-colors hover:border-primary/50 active:scale-[0.99]\"\n >\n <div className=\"grid h-11 w-11 place-items-center rounded-full bg-foreground/[0.06]\">\n <RocketIcon />\n </div>\n <span className=\"text-[15px] font-semibold text-foreground\">Creator Launchpad</span>\n <span className=\"text-xs text-muted-foreground\">Protect and monetize your work</span>\n </button>\n </div>\n )\n )}\n\n {isDeployed === false && <ActivateCard onActivated={() => setActivated(true)} />}\n\n {needsEmailVerification && (\n <Link\n href={emailBanner.href}\n onClick={onClose}\n className=\"flex items-center gap-3 rounded-2xl px-4 py-3 transition-opacity hover:opacity-90\"\n style={{ background: \"linear-gradient(115deg, hsl(var(--brand-orange) / 0.12), hsl(var(--brand-maeve, 327 64% 67%) / 0.12))\" }}\n >\n <div className=\"grid h-9 w-9 shrink-0 place-items-center rounded-full bg-brand-orange/15\">\n <MailIcon />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm font-semibold\">Verify your email</div>\n <div className=\"text-xs text-muted-foreground\">{emailBanner.text(emailStatus?.deadline)}</div>\n </div>\n </Link>\n )}\n\n {panel === \"receive\" && address && (\n <ActionModal onClose={() => setPanel(null)}>\n <ReceiveCard address={address} />\n </ActionModal>\n )}\n\n {heldTokens.length > 0 && (\n <section>\n <SectionHeader title=\"Tokens\" />\n <div className=\"mt-2 flex flex-col gap-2\">\n {heldTokens.map((t) => {\n const { rawBalance, decimals } = balances[t.symbol];\n return (\n <button\n key={t.symbol}\n onClick={() => onNavigate({ name: \"token\", token: t })}\n className=\"flex items-center gap-3 rounded-2xl bg-card/40 px-4 py-3 text-left backdrop-blur-sm transition-colors hover:bg-card/60\"\n >\n <div className=\"grid h-11 w-11 shrink-0 place-items-center rounded-full bg-foreground/[0.06]\">\n <CurrencyIcon symbol={t.symbol} size={24} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm font-semibold\">{t.symbol}</div>\n <div className=\"text-xs text-muted-foreground\">{t.name}</div>\n </div>\n <div className=\"text-right\">\n <div className=\"text-sm font-semibold tabular-nums\">{hideBalances ? \"••••\" : fmt(rawBalance, decimals)}</div>\n {!hideBalances && usdPrices !== null && (\n <div className=\"text-xs text-muted-foreground tabular-nums\">{fmtUsd(usd(t.symbol))}</div>\n )}\n </div>\n </button>\n );\n })}\n </div>\n </section>\n )}\n\n {(nftItems.length > 0 || loadingNfts) && (\n <section>\n <SectionHeader title=\"NFTs\" />\n <div className=\"mt-2\">\n <NftStrip items={nftItems} isLoading={loadingNfts} onNavigate={onClose} resolveImage={resolveImage} />\n </div>\n </section>\n )}\n\n {activated && (\n <SuccessDialog\n title=\"Account activated\"\n message=\"Your account is live and ready to use\"\n onClose={() => setActivated(false)}\n />\n )}\n\n <a\n href={externalWallet.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"mt-auto text-center text-xs text-muted-foreground/60 transition-colors hover:text-muted-foreground\"\n >\n {externalWallet.label}\n </a>\n </main>\n );\n}\n\nfunction ArrowUp() {\n return (\n <svg width=\"19\" height=\"19\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 19V5M5 12l7-7 7 7\" />\n </svg>\n );\n}\nfunction ArrowDown() {\n return (\n <svg width=\"19\" height=\"19\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 5v14M19 12l-7 7-7-7\" />\n </svg>\n );\n}\nfunction ActivityIcon() {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.1\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M22 12h-4l-3 9L9 3l-3 9H2\" />\n </svg>\n );\n}\nfunction MailIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"text-brand-orange\">\n <rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"2\" />\n <path d=\"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7\" />\n </svg>\n );\n}\nfunction RocketIcon() {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.1\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 00-2.91-.09z\" />\n <path d=\"M12 15l-3-3a22 22 0 012-3.95A12.88 12.88 0 0122 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 01-4 2z\" />\n <path d=\"M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5\" />\n </svg>\n );\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/media-wallet/media-wallet-home.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport Link from \"../link.js\";\nimport { useRouter } from \"../router.js\";\nimport { CurrencyIcon } from \"../currency-icon.js\";\nimport { useTokenBalance } from \"../../utils/media-wallet/use-erc20-balance.js\";\nimport { useTokensByOwner } from \"../../utils/use-tokens.js\";\nimport { ActivateCard } from \"./activate-card.js\";\nimport { QuickAction } from \"./quick-action.js\";\nimport { ReceiveCard } from \"./receive-card.js\";\nimport { ActionModal } from \"./action-modal.js\";\nimport { SectionHeader } from \"./section-header.js\";\nimport { SuccessDialog } from \"./success-dialog.js\";\nimport { MediaWalletHeader } from \"./media-wallet-header.js\";\nimport { WALLET_TOKENS, type WalletToken } from \"../../utils/media-wallet/wallet-tokens.js\";\nimport { pickNftItems } from \"../../utils/media-wallet/nft-items.js\";\nimport { NftStrip } from \"./nft-strip.js\";\nimport { useUsdPrices, usdPriceFor } from \"../../utils/use-usd-prices.js\";\nimport { fmt, fmtUsd, rawToNumber } from \"../../utils/media-wallet/wallet-format.js\";\nimport { successMessages } from \"../../utils/success-messages.js\";\nimport { useMediaWalletApp, type MediaWalletView } from \"./types.js\";\n\nexport function MediaWalletHome({\n onNavigate,\n onClose,\n autoOpenReceive,\n}: {\n onNavigate: (view: MediaWalletView) => void;\n onClose: () => void;\n autoOpenReceive?: boolean;\n}) {\n const { useWalletSession, useEmailStatus, resolveImage, emailBanner, externalWallet } = useMediaWalletApp();\n const { address, isDeployed } = useWalletSession();\n const emailStatus = useEmailStatus();\n const router = useRouter();\n const needsEmailVerification = !!emailStatus?.email && !emailStatus.emailVerified;\n\n const balances: Record<WalletToken[\"symbol\"], ReturnType<typeof useTokenBalance>> = {\n STRK: useTokenBalance(\"STRK\", address),\n ETH: useTokenBalance(\"ETH\", address),\n USDC: useTokenBalance(\"USDC\", address),\n WBTC: useTokenBalance(\"WBTC\", address),\n };\n\n const { tokens, isLoading: loadingNfts } = useTokensByOwner(address, 1, 6);\n const nftItems = pickNftItems(tokens, 6);\n\n const usdPrices = useUsdPrices();\n const [panel, setPanel] = useState<\"receive\" | null>(autoOpenReceive ? \"receive\" : null);\n const [hideBalances, setHideBalances] = useState(false);\n const [activated, setActivated] = useState(false);\n const [pull, setPull] = useState(0);\n const startY = useRef<number | null>(null);\n const mainRef = useRef<HTMLElement>(null);\n\n useEffect(() => {\n setHideBalances(localStorage.getItem(\"mediawallet.hideBalances\") === \"1\");\n }, []);\n\n const scrollParent = () => mainRef.current?.parentElement ?? null;\n const onTouchStart = (e: React.TouchEvent) => {\n const sc = scrollParent();\n startY.current = sc && sc.scrollTop <= 0 ? e.touches[0].clientY : null;\n };\n const onTouchMove = (e: React.TouchEvent) => {\n if (startY.current == null) return;\n const dy = e.touches[0].clientY - startY.current;\n if (dy > 0) setPull(Math.min(dy * 0.5, 90));\n };\n const onTouchEnd = () => {\n setPull(0);\n startY.current = null;\n };\n\n const usd = (symbol: WalletToken[\"symbol\"]) => {\n const { rawBalance, decimals } = balances[symbol];\n return rawToNumber(rawBalance, decimals) * (usdPriceFor(usdPrices, symbol) ?? 0);\n };\n const totalUsd = WALLET_TOKENS.reduce((sum, t) => sum + usd(t.symbol), 0);\n const heldTokens = WALLET_TOKENS.filter((t) => (balances[t.symbol].rawBalance ?? 0n) > 0n);\n\n const strkBalance = balances.STRK.rawBalance;\n const funded = strkBalance != null && strkBalance > 0n;\n const canSend = isDeployed === true && funded;\n\n const goLaunch = () => {\n onClose();\n router.push(\"/launchpad\");\n };\n\n return (\n <main\n ref={mainRef}\n onTouchStart={onTouchStart}\n onTouchMove={onTouchMove}\n onTouchEnd={onTouchEnd}\n className=\"relative flex min-h-full flex-col gap-6 px-5 pb-8 pt-2\"\n style={{ transform: pull ? `translateY(${pull}px)` : undefined, transition: pull ? \"none\" : \"transform 0.2s ease\" }}\n >\n {address && (\n <div className=\"flex flex-col items-center gap-4\">\n <MediaWalletHeader address={address} onNavigate={onClose} />\n {(funded || isDeployed === false) && (\n <span className=\"font-[family-name:var(--font-display)] text-5xl font-extrabold tracking-tight tabular-nums\">\n {hideBalances ? \"••••\" : usdPrices === null ? \"…\" : fmtUsd(totalUsd)}\n </span>\n )}\n </div>\n )}\n\n {funded ? (\n <div className=\"grid grid-cols-4 gap-2\">\n <QuickAction label=\"Send\" action=\"buy\" disabled={!canSend} onClick={() => onNavigate({ name: \"send\" })} icon={<ArrowUp />} />\n <QuickAction label=\"Receive\" action=\"offer\" onClick={() => setPanel(panel === \"receive\" ? null : \"receive\")} icon={<ArrowDown />} />\n <QuickAction label=\"Launch\" action=\"remix\" onClick={goLaunch} icon={<RocketIcon />} />\n <QuickAction label=\"Activity\" action=\"submit\" onClick={() => onNavigate({ name: \"activity\" })} icon={<ActivityIcon />} />\n </div>\n ) : isDeployed === null ? (\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex flex-col items-center gap-3 py-2\">\n <div className=\"h-3 w-16 animate-pulse rounded bg-foreground/[0.06]\" />\n <div className=\"h-11 w-32 animate-pulse rounded bg-foreground/[0.06]\" />\n <div className=\"h-[48px] w-40 animate-pulse rounded-[13px] bg-foreground/[0.06]\" />\n </div>\n <div className=\"h-[148px] animate-pulse rounded-[20px] bg-foreground/[0.04]\" />\n </div>\n ) : (\n isDeployed === true && (\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex flex-col items-center gap-3 py-2\">\n <span className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">Balance</span>\n <span className=\"font-[family-name:var(--font-display)] text-5xl font-extrabold tracking-tight tabular-nums\">\n {hideBalances ? \"••••\" : usdPrices === null ? \"…\" : fmtUsd(totalUsd)}\n </span>\n <button\n onClick={() => setPanel(panel === \"receive\" ? null : \"receive\")}\n className=\"h-[48px] rounded-[13px] px-8 text-[15px] font-semibold text-white transition-transform active:scale-[0.99]\"\n style={{ background: \"linear-gradient(115deg,#3b7bff,#5b4ce6)\" }}\n >\n Fund your account\n </button>\n </div>\n <button\n onClick={goLaunch}\n className=\"flex flex-col items-center gap-2 rounded-[20px] border-2 border-dashed border-border px-6 py-8 text-center transition-colors hover:border-primary/50 active:scale-[0.99]\"\n >\n <div className=\"grid h-11 w-11 place-items-center rounded-full bg-foreground/[0.06]\">\n <RocketIcon />\n </div>\n <span className=\"text-[15px] font-semibold text-foreground\">Creator Launchpad</span>\n <span className=\"text-xs text-muted-foreground\">Protect and monetize your work</span>\n </button>\n </div>\n )\n )}\n\n {isDeployed === false && <ActivateCard onActivated={() => setActivated(true)} />}\n\n {needsEmailVerification && (\n <Link\n href={emailBanner.href}\n onClick={onClose}\n className=\"flex items-center gap-3 rounded-2xl px-4 py-3 transition-opacity hover:opacity-90\"\n style={{ background: \"linear-gradient(115deg, hsl(var(--brand-orange) / 0.12), hsl(var(--brand-maeve, 327 64% 67%) / 0.12))\" }}\n >\n <div className=\"grid h-9 w-9 shrink-0 place-items-center rounded-full bg-brand-orange/15\">\n <MailIcon />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm font-semibold\">Verify your email</div>\n <div className=\"text-xs text-muted-foreground\">{emailBanner.text(emailStatus?.deadline)}</div>\n </div>\n </Link>\n )}\n\n {panel === \"receive\" && address && (\n <ActionModal onClose={() => setPanel(null)}>\n <ReceiveCard address={address} />\n </ActionModal>\n )}\n\n {heldTokens.length > 0 && (\n <section>\n <SectionHeader title=\"Tokens\" />\n <div className=\"mt-2 flex flex-col gap-2\">\n {heldTokens.map((t) => {\n const { rawBalance, decimals } = balances[t.symbol];\n return (\n <button\n key={t.symbol}\n onClick={() => onNavigate({ name: \"token\", token: t })}\n className=\"flex items-center gap-3 rounded-2xl bg-card/40 px-4 py-3 text-left backdrop-blur-sm transition-colors hover:bg-card/60\"\n >\n <div className=\"grid h-11 w-11 shrink-0 place-items-center rounded-full bg-foreground/[0.06]\">\n <CurrencyIcon symbol={t.symbol} size={24} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm font-semibold\">{t.symbol}</div>\n <div className=\"text-xs text-muted-foreground\">{t.name}</div>\n </div>\n <div className=\"text-right\">\n <div className=\"text-sm font-semibold tabular-nums\">{hideBalances ? \"••••\" : fmt(rawBalance, decimals)}</div>\n {!hideBalances && usdPrices !== null && (\n <div className=\"text-xs text-muted-foreground tabular-nums\">{fmtUsd(usd(t.symbol))}</div>\n )}\n </div>\n </button>\n );\n })}\n </div>\n </section>\n )}\n\n {(nftItems.length > 0 || loadingNfts) && (\n <section>\n <SectionHeader title=\"NFTs\" />\n <div className=\"mt-2\">\n <NftStrip items={nftItems} isLoading={loadingNfts} onNavigate={onClose} resolveImage={resolveImage} />\n </div>\n </section>\n )}\n\n {activated && (\n <SuccessDialog\n title={successMessages.walletActivated().title}\n message={successMessages.walletActivated().description}\n onClose={() => setActivated(false)}\n />\n )}\n\n <a\n href={externalWallet.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"mt-auto text-center text-xs text-muted-foreground/60 transition-colors hover:text-muted-foreground\"\n >\n {externalWallet.label}\n </a>\n </main>\n );\n}\n\nfunction ArrowUp() {\n return (\n <svg width=\"19\" height=\"19\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 19V5M5 12l7-7 7 7\" />\n </svg>\n );\n}\nfunction ArrowDown() {\n return (\n <svg width=\"19\" height=\"19\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 5v14M19 12l-7 7-7-7\" />\n </svg>\n );\n}\nfunction ActivityIcon() {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.1\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M22 12h-4l-3 9L9 3l-3 9H2\" />\n </svg>\n );\n}\nfunction MailIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"text-brand-orange\">\n <rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"2\" />\n <path d=\"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7\" />\n </svg>\n );\n}\nfunction RocketIcon() {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.1\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 00-2.91-.09z\" />\n <path d=\"M12 15l-3-3a22 22 0 012-3.95A12.88 12.88 0 0122 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 01-4 2z\" />\n <path d=\"M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5\" />\n </svg>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -38,7 +38,9 @@ var import_currency_sheet = require("./currency-sheet.js");
|
|
|
38
38
|
var import_wallet_tokens = require("../../utils/media-wallet/wallet-tokens.js");
|
|
39
39
|
var import_success_dialog = require("./success-dialog.js");
|
|
40
40
|
var import_types = require("./types.js");
|
|
41
|
+
var import_address = require("../../utils/address.js");
|
|
41
42
|
var import_run_intent_calls = require("../../utils/run-intent-calls.js");
|
|
43
|
+
var import_success_messages = require("../../utils/success-messages.js");
|
|
42
44
|
var import_medialane_app = require("../medialane-app.js");
|
|
43
45
|
function isValidStarknetAddress(address) {
|
|
44
46
|
try {
|
|
@@ -87,6 +89,7 @@ function MediaWalletSend({
|
|
|
87
89
|
const [fee, setFee] = (0, import_react.useState)(null);
|
|
88
90
|
const [feeError, setFeeError] = (0, import_react.useState)(null);
|
|
89
91
|
const recipientValid = isValidStarknetAddress(to);
|
|
92
|
+
const sentMessage = import_success_messages.successMessages.sent({ amount: amount.trim(), symbol: currency.symbol, to: (0, import_address.shortenAddress)(to.trim()) });
|
|
90
93
|
let amountRaw;
|
|
91
94
|
try {
|
|
92
95
|
amountRaw = amount.trim() ? BigInt((0, import_sdk.parseAmount)(amount.trim(), currency.decimals)) : null;
|
|
@@ -293,8 +296,8 @@ function MediaWalletSend({
|
|
|
293
296
|
status === "success" && txHash && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
294
297
|
import_success_dialog.SuccessDialog,
|
|
295
298
|
{
|
|
296
|
-
title:
|
|
297
|
-
message:
|
|
299
|
+
title: sentMessage.title,
|
|
300
|
+
message: sentMessage.description,
|
|
298
301
|
txHash,
|
|
299
302
|
onClose: () => {
|
|
300
303
|
reset();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/media-wallet/media-wallet-send.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { Account, CallData, cairo, validateAndParseAddress, type Call, type ProviderInterface } from \"starknet\";\nimport { parseAmount, formatAmount } from \"@medialane/sdk\";\nimport { ActionButton } from \"../action-button.js\";\nimport { CurrencyIcon } from \"../currency-icon.js\";\nimport { describeError } from \"../../utils/describe-error.js\";\nimport { useErc20Balance, useTokenBalance } from \"../../utils/media-wallet/use-erc20-balance.js\";\nimport { fmt, short } from \"../../utils/media-wallet/wallet-format.js\";\nimport { BackButton } from \"./back-button.js\";\nimport { TrustNote } from \"./action-button.js\";\nimport { ActionModal, BusyOverlay } from \"./action-modal.js\";\nimport { CurrencySheet } from \"./currency-sheet.js\";\nimport { WALLET_TOKENS, type WalletToken } from \"../../utils/media-wallet/wallet-tokens.js\";\nimport { SuccessDialog } from \"./success-dialog.js\";\nimport { useMediaWalletApp, type MediaWalletView } from \"./types.js\";\nimport { runIntentCalls } from \"../../utils/run-intent-calls.js\";\nimport { useMedialaneApp } from \"../medialane-app.js\";\n\nfunction isValidStarknetAddress(address: string): boolean {\n try {\n validateAndParseAddress(address.trim());\n return true;\n } catch {\n return false;\n }\n}\n\nasync function estimateSendFee(provider: ProviderInterface, address: string, token: string, to: string, amountRaw: bigint) {\n const account = new Account({ provider, address, signer: \"0x1\", cairoVersion: \"1\" });\n const call: Call = {\n contractAddress: token,\n entrypoint: \"transfer\",\n calldata: CallData.compile({ recipient: to, amount: cairo.uint256(amountRaw) }),\n };\n const est = await account.estimateInvokeFee(call);\n return { feeRaw: est.overall_fee, unit: est.unit };\n}\n\nexport function MediaWalletSend({\n initialToken,\n onNavigate,\n onDone,\n}: {\n initialToken?: WalletToken;\n onNavigate: (view: MediaWalletView) => void;\n onDone: () => void;\n}) {\n const { useWalletSession, useWriteAction } = useMediaWalletApp();\n const { getClient } = useMedialaneApp();\n const { address } = useWalletSession();\n const { run, status, reset, error } = useWriteAction();\n\n const [currency, setCurrency] = useState<WalletToken>(initialToken ?? WALLET_TOKENS[0]);\n const [pickerOpen, setPickerOpen] = useState(false);\n const strk = useTokenBalance(\"STRK\", address);\n const eth = useTokenBalance(\"ETH\", address);\n const usdc = useTokenBalance(\"USDC\", address);\n const wbtc = useTokenBalance(\"WBTC\", address);\n \n const pinnedBalancesBySymbol: Record<string, bigint | null> = {\n STRK: strk.rawBalance, ETH: eth.rawBalance, USDC: usdc.rawBalance, WBTC: wbtc.rawBalance,\n };\n const { rawBalance: currencyBalance } = useErc20Balance(currency.address, address);\n\n const [to, setTo] = useState(\"\");\n const [amount, setAmount] = useState(\"\");\n const [txHash, setTxHash] = useState<string | null>(null);\n\n const [confirmOpen, setConfirmOpen] = useState(false);\n const [fee, setFee] = useState<{ raw: bigint; unit: string } | null>(null);\n const [feeError, setFeeError] = useState<string | null>(null);\n\n const recipientValid = isValidStarknetAddress(to);\n let amountRaw: bigint | null;\n try {\n amountRaw = amount.trim() ? BigInt(parseAmount(amount.trim(), currency.decimals)) : null;\n } catch {\n amountRaw = null;\n }\n const amountOverBalance = amountRaw != null && currencyBalance != null && amountRaw > currencyBalance;\n const composeReady = recipientValid && amountRaw != null && amountRaw > 0n && !amountOverBalance;\n\n const pasteRecipient = async () => {\n try {\n const text = await navigator.clipboard.readText();\n if (text) setTo(text.trim());\n } catch {\n\n }\n };\n\n const setMax = () => {\n if (currencyBalance == null) return;\n setAmount(formatAmount(currencyBalance.toString(), currency.decimals));\n };\n\n const openReview = () => {\n if (!address || !composeReady || amountRaw == null) return;\n setFeeError(null);\n setFee(null);\n setConfirmOpen(true);\n estimateSendFee(getClient().provider, address, currency.address, to.trim(), amountRaw)\n .then((f) => setFee({ raw: f.feeRaw, unit: f.unit }))\n .catch((e) => setFeeError(describeError(e).message));\n };\n\n const send = async () => {\n if (!composeReady || amountRaw == null) return;\n setConfirmOpen(false);\n const dest = to.trim();\n const amt = amountRaw;\n await run(async (signer) => {\n const result = await runIntentCalls(signer, () =>\n getClient().api.intents.create(\"transfer-token\", { owner: signer.address, token: currency.address, recipient: dest, amount: amt.toString() }),\n );\n setTxHash(result.txHash);\n return result;\n });\n };\n\n return (\n <main className=\"flex flex-col gap-6 px-5 pb-8 pt-2\">\n <div className=\"flex items-center gap-3\">\n <BackButton onBack={() => onNavigate({ name: \"home\" })} />\n <h1 className=\"font-[family-name:var(--font-display)] text-2xl font-extrabold tracking-tight\">Send</h1>\n </div>\n\n {error && (\n <div className=\"rounded-2xl border border-destructive/40 bg-destructive/10 p-3 text-xs leading-relaxed\">\n {error}\n </div>\n )}\n\n <div className=\"flex flex-col gap-3\">\n <div>\n <div className=\"flex items-center gap-2\">\n <input\n value={to}\n onChange={(e) => setTo(e.target.value)}\n placeholder=\"Recipient 0x…\"\n spellCheck={false}\n className=\"w-0 flex-1 rounded-2xl border border-border bg-foreground/[0.05] px-4 py-3 font-mono text-sm outline-none transition-colors focus:border-brand-purple\"\n />\n {to.trim() === \"\" && (\n <button\n onClick={pasteRecipient}\n className=\"shrink-0 rounded-2xl border border-border bg-foreground/[0.05] px-3 py-3 text-xs font-semibold text-muted-foreground transition-colors hover:text-foreground\"\n >\n Paste\n </button>\n )}\n </div>\n {to.trim() !== \"\" && !recipientValid && (\n <p className=\"mt-1.5 px-1 text-xs text-destructive\">Not a valid Starknet address.</p>\n )}\n </div>\n\n <div>\n <div className=\"relative\">\n <input\n value={amount}\n onChange={(e) => setAmount(e.target.value.replace(/[^0-9.]/g, \"\"))}\n placeholder=\"0.00\"\n inputMode=\"decimal\"\n className=\"w-full rounded-2xl border border-border bg-foreground/[0.05] px-4 py-3 pr-36 text-sm outline-none transition-colors focus:border-brand-purple\"\n />\n <div className=\"absolute right-2.5 top-1/2 flex -translate-y-1/2 items-center gap-1.5\">\n <button\n onClick={setMax}\n className=\"rounded-full bg-foreground/[0.06] px-2 py-1 text-2xs font-bold text-muted-foreground transition-colors hover:text-foreground\"\n >\n MAX\n </button>\n <button\n onClick={() => setPickerOpen(true)}\n className=\"flex items-center gap-1.5 rounded-full bg-foreground/[0.06] px-2.5 py-1 text-xs font-semibold\"\n >\n <CurrencyIcon symbol={currency.symbol} size={16} /> {currency.symbol}\n </button>\n </div>\n </div>\n <div className=\"mt-1.5 flex items-center justify-between px-1\">\n <span className=\"text-xs text-muted-foreground\">\n Balance: {currencyBalance != null ? fmt(currencyBalance, currency.decimals) : \"…\"}\n </span>\n {amountOverBalance && <span className=\"text-xs text-destructive\">Amount exceeds balance.</span>}\n </div>\n </div>\n\n <ActionButton\n action=\"offer\"\n big\n onClick={openReview}\n disabled={status === \"processing\" || !composeReady}\n className=\"mt-1 w-full disabled:pointer-events-none disabled:opacity-40\"\n >\n Review Transfer\n </ActionButton>\n <TrustNote>Gas paid from your balance. Transfers are permanent and recorded onchain.</TrustNote>\n </div>\n\n {pickerOpen && (\n <CurrencySheet\n title=\"Choose currency\"\n tokens={WALLET_TOKENS}\n balances={pinnedBalancesBySymbol}\n onSelect={(t) => {\n setCurrency(t);\n setPickerOpen(false);\n }}\n onClose={() => setPickerOpen(false)}\n />\n )}\n\n {confirmOpen && (\n <ActionModal title=\"Review Transfer\" onClose={() => setConfirmOpen(false)}>\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"grid h-10 w-10 shrink-0 place-items-center rounded-full bg-foreground/[0.06]\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M22 2L11 13M22 2l-7 20-4-9-9-4 20-7z\" />\n </svg>\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"font-semibold\">Send</div>\n <div className=\"truncate font-mono text-xs text-muted-foreground\">To: {short(to.trim())}</div>\n </div>\n </div>\n\n <div className=\"flex items-center gap-3 rounded-2xl bg-foreground/[0.05] p-4\">\n <CurrencyIcon symbol={currency.symbol} size={28} />\n <div className=\"min-w-0 flex-1 font-semibold\">{currency.symbol}</div>\n <div className=\"text-right font-semibold tabular-nums\">\n −{amount.trim()} {currency.symbol}\n </div>\n </div>\n\n <div className=\"flex flex-col divide-y divide-border/40 rounded-2xl bg-foreground/[0.05] px-4\">\n <div className=\"flex items-center justify-between py-3 text-sm\">\n <span className=\"text-muted-foreground\">Amount</span>\n <span className=\"font-medium\">{amount.trim()} {currency.symbol}</span>\n </div>\n <div className=\"flex items-center justify-between py-3 text-sm\">\n <span className=\"text-muted-foreground\">Recipient</span>\n <span className=\"font-mono font-medium\">{short(to.trim())}</span>\n </div>\n <div className=\"flex items-center justify-between py-3 text-sm\">\n <span className=\"text-muted-foreground\">Contract</span>\n <span className=\"font-medium\">{currency.symbol}</span>\n </div>\n <div className=\"flex items-center justify-between py-3 text-sm\">\n <span className=\"text-muted-foreground\">Call</span>\n <span className=\"font-medium underline\">transfer</span>\n </div>\n </div>\n\n <div className=\"flex items-center justify-between rounded-2xl border border-border px-4 py-3 text-sm\">\n <span className=\"text-muted-foreground\">Estimated fee</span>\n <span className=\"font-medium\">\n {feeError ? \"Unavailable\" : fee ? `${fmt(fee.raw, 18, 6)} ${fee.unit === \"FRI\" ? \"STRK\" : \"ETH\"}` : \"Estimating…\"}\n </span>\n </div>\n {feeError && <p className=\"px-1 text-xs text-destructive\">Fee estimate failed: {feeError}</p>}\n\n <div className=\"flex gap-3\">\n <button\n onClick={() => setConfirmOpen(false)}\n className=\"flex-1 rounded-2xl border border-border py-3 text-sm font-semibold text-muted-foreground transition-colors hover:text-foreground\"\n >\n Reject\n </button>\n <ActionButton action=\"offer\" big onClick={send} className=\"flex-1\">\n Confirm\n </ActionButton>\n </div>\n </div>\n </ActionModal>\n )}\n\n {status === \"processing\" && <BusyOverlay label=\"Signing & sending…\" />}\n {status === \"success\" && txHash && (\n <SuccessDialog\n title=\"Sent\"\n message={`${amount.trim()} ${currency.symbol} is on its way.`}\n txHash={txHash}\n onClose={() => {\n reset();\n onDone();\n }}\n />\n )}\n </main>\n );\n}\n"],"mappings":"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","names":["import_action_button"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/media-wallet/media-wallet-send.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { Account, CallData, cairo, validateAndParseAddress, type Call, type ProviderInterface } from \"starknet\";\nimport { parseAmount, formatAmount } from \"@medialane/sdk\";\nimport { ActionButton } from \"../action-button.js\";\nimport { CurrencyIcon } from \"../currency-icon.js\";\nimport { describeError } from \"../../utils/describe-error.js\";\nimport { useErc20Balance, useTokenBalance } from \"../../utils/media-wallet/use-erc20-balance.js\";\nimport { fmt, short } from \"../../utils/media-wallet/wallet-format.js\";\nimport { BackButton } from \"./back-button.js\";\nimport { TrustNote } from \"./action-button.js\";\nimport { ActionModal, BusyOverlay } from \"./action-modal.js\";\nimport { CurrencySheet } from \"./currency-sheet.js\";\nimport { WALLET_TOKENS, type WalletToken } from \"../../utils/media-wallet/wallet-tokens.js\";\nimport { SuccessDialog } from \"./success-dialog.js\";\nimport { useMediaWalletApp, type MediaWalletView } from \"./types.js\";\nimport { shortenAddress } from \"../../utils/address.js\";\nimport { runIntentCalls } from \"../../utils/run-intent-calls.js\";\nimport { successMessages } from \"../../utils/success-messages.js\";\nimport { useMedialaneApp } from \"../medialane-app.js\";\n\nfunction isValidStarknetAddress(address: string): boolean {\n try {\n validateAndParseAddress(address.trim());\n return true;\n } catch {\n return false;\n }\n}\n\nasync function estimateSendFee(provider: ProviderInterface, address: string, token: string, to: string, amountRaw: bigint) {\n const account = new Account({ provider, address, signer: \"0x1\", cairoVersion: \"1\" });\n const call: Call = {\n contractAddress: token,\n entrypoint: \"transfer\",\n calldata: CallData.compile({ recipient: to, amount: cairo.uint256(amountRaw) }),\n };\n const est = await account.estimateInvokeFee(call);\n return { feeRaw: est.overall_fee, unit: est.unit };\n}\n\nexport function MediaWalletSend({\n initialToken,\n onNavigate,\n onDone,\n}: {\n initialToken?: WalletToken;\n onNavigate: (view: MediaWalletView) => void;\n onDone: () => void;\n}) {\n const { useWalletSession, useWriteAction } = useMediaWalletApp();\n const { getClient } = useMedialaneApp();\n const { address } = useWalletSession();\n const { run, status, reset, error } = useWriteAction();\n\n const [currency, setCurrency] = useState<WalletToken>(initialToken ?? WALLET_TOKENS[0]);\n const [pickerOpen, setPickerOpen] = useState(false);\n const strk = useTokenBalance(\"STRK\", address);\n const eth = useTokenBalance(\"ETH\", address);\n const usdc = useTokenBalance(\"USDC\", address);\n const wbtc = useTokenBalance(\"WBTC\", address);\n \n const pinnedBalancesBySymbol: Record<string, bigint | null> = {\n STRK: strk.rawBalance, ETH: eth.rawBalance, USDC: usdc.rawBalance, WBTC: wbtc.rawBalance,\n };\n const { rawBalance: currencyBalance } = useErc20Balance(currency.address, address);\n\n const [to, setTo] = useState(\"\");\n const [amount, setAmount] = useState(\"\");\n const [txHash, setTxHash] = useState<string | null>(null);\n\n const [confirmOpen, setConfirmOpen] = useState(false);\n const [fee, setFee] = useState<{ raw: bigint; unit: string } | null>(null);\n const [feeError, setFeeError] = useState<string | null>(null);\n\n const recipientValid = isValidStarknetAddress(to);\n const sentMessage = successMessages.sent({ amount: amount.trim(), symbol: currency.symbol, to: shortenAddress(to.trim()) });\n let amountRaw: bigint | null;\n try {\n amountRaw = amount.trim() ? BigInt(parseAmount(amount.trim(), currency.decimals)) : null;\n } catch {\n amountRaw = null;\n }\n const amountOverBalance = amountRaw != null && currencyBalance != null && amountRaw > currencyBalance;\n const composeReady = recipientValid && amountRaw != null && amountRaw > 0n && !amountOverBalance;\n\n const pasteRecipient = async () => {\n try {\n const text = await navigator.clipboard.readText();\n if (text) setTo(text.trim());\n } catch {\n\n }\n };\n\n const setMax = () => {\n if (currencyBalance == null) return;\n setAmount(formatAmount(currencyBalance.toString(), currency.decimals));\n };\n\n const openReview = () => {\n if (!address || !composeReady || amountRaw == null) return;\n setFeeError(null);\n setFee(null);\n setConfirmOpen(true);\n estimateSendFee(getClient().provider, address, currency.address, to.trim(), amountRaw)\n .then((f) => setFee({ raw: f.feeRaw, unit: f.unit }))\n .catch((e) => setFeeError(describeError(e).message));\n };\n\n const send = async () => {\n if (!composeReady || amountRaw == null) return;\n setConfirmOpen(false);\n const dest = to.trim();\n const amt = amountRaw;\n await run(async (signer) => {\n const result = await runIntentCalls(signer, () =>\n getClient().api.intents.create(\"transfer-token\", { owner: signer.address, token: currency.address, recipient: dest, amount: amt.toString() }),\n );\n setTxHash(result.txHash);\n return result;\n });\n };\n\n return (\n <main className=\"flex flex-col gap-6 px-5 pb-8 pt-2\">\n <div className=\"flex items-center gap-3\">\n <BackButton onBack={() => onNavigate({ name: \"home\" })} />\n <h1 className=\"font-[family-name:var(--font-display)] text-2xl font-extrabold tracking-tight\">Send</h1>\n </div>\n\n {error && (\n <div className=\"rounded-2xl border border-destructive/40 bg-destructive/10 p-3 text-xs leading-relaxed\">\n {error}\n </div>\n )}\n\n <div className=\"flex flex-col gap-3\">\n <div>\n <div className=\"flex items-center gap-2\">\n <input\n value={to}\n onChange={(e) => setTo(e.target.value)}\n placeholder=\"Recipient 0x…\"\n spellCheck={false}\n className=\"w-0 flex-1 rounded-2xl border border-border bg-foreground/[0.05] px-4 py-3 font-mono text-sm outline-none transition-colors focus:border-brand-purple\"\n />\n {to.trim() === \"\" && (\n <button\n onClick={pasteRecipient}\n className=\"shrink-0 rounded-2xl border border-border bg-foreground/[0.05] px-3 py-3 text-xs font-semibold text-muted-foreground transition-colors hover:text-foreground\"\n >\n Paste\n </button>\n )}\n </div>\n {to.trim() !== \"\" && !recipientValid && (\n <p className=\"mt-1.5 px-1 text-xs text-destructive\">Not a valid Starknet address.</p>\n )}\n </div>\n\n <div>\n <div className=\"relative\">\n <input\n value={amount}\n onChange={(e) => setAmount(e.target.value.replace(/[^0-9.]/g, \"\"))}\n placeholder=\"0.00\"\n inputMode=\"decimal\"\n className=\"w-full rounded-2xl border border-border bg-foreground/[0.05] px-4 py-3 pr-36 text-sm outline-none transition-colors focus:border-brand-purple\"\n />\n <div className=\"absolute right-2.5 top-1/2 flex -translate-y-1/2 items-center gap-1.5\">\n <button\n onClick={setMax}\n className=\"rounded-full bg-foreground/[0.06] px-2 py-1 text-2xs font-bold text-muted-foreground transition-colors hover:text-foreground\"\n >\n MAX\n </button>\n <button\n onClick={() => setPickerOpen(true)}\n className=\"flex items-center gap-1.5 rounded-full bg-foreground/[0.06] px-2.5 py-1 text-xs font-semibold\"\n >\n <CurrencyIcon symbol={currency.symbol} size={16} /> {currency.symbol}\n </button>\n </div>\n </div>\n <div className=\"mt-1.5 flex items-center justify-between px-1\">\n <span className=\"text-xs text-muted-foreground\">\n Balance: {currencyBalance != null ? fmt(currencyBalance, currency.decimals) : \"…\"}\n </span>\n {amountOverBalance && <span className=\"text-xs text-destructive\">Amount exceeds balance.</span>}\n </div>\n </div>\n\n <ActionButton\n action=\"offer\"\n big\n onClick={openReview}\n disabled={status === \"processing\" || !composeReady}\n className=\"mt-1 w-full disabled:pointer-events-none disabled:opacity-40\"\n >\n Review Transfer\n </ActionButton>\n <TrustNote>Gas paid from your balance. Transfers are permanent and recorded onchain.</TrustNote>\n </div>\n\n {pickerOpen && (\n <CurrencySheet\n title=\"Choose currency\"\n tokens={WALLET_TOKENS}\n balances={pinnedBalancesBySymbol}\n onSelect={(t) => {\n setCurrency(t);\n setPickerOpen(false);\n }}\n onClose={() => setPickerOpen(false)}\n />\n )}\n\n {confirmOpen && (\n <ActionModal title=\"Review Transfer\" onClose={() => setConfirmOpen(false)}>\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"grid h-10 w-10 shrink-0 place-items-center rounded-full bg-foreground/[0.06]\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M22 2L11 13M22 2l-7 20-4-9-9-4 20-7z\" />\n </svg>\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"font-semibold\">Send</div>\n <div className=\"truncate font-mono text-xs text-muted-foreground\">To: {short(to.trim())}</div>\n </div>\n </div>\n\n <div className=\"flex items-center gap-3 rounded-2xl bg-foreground/[0.05] p-4\">\n <CurrencyIcon symbol={currency.symbol} size={28} />\n <div className=\"min-w-0 flex-1 font-semibold\">{currency.symbol}</div>\n <div className=\"text-right font-semibold tabular-nums\">\n −{amount.trim()} {currency.symbol}\n </div>\n </div>\n\n <div className=\"flex flex-col divide-y divide-border/40 rounded-2xl bg-foreground/[0.05] px-4\">\n <div className=\"flex items-center justify-between py-3 text-sm\">\n <span className=\"text-muted-foreground\">Amount</span>\n <span className=\"font-medium\">{amount.trim()} {currency.symbol}</span>\n </div>\n <div className=\"flex items-center justify-between py-3 text-sm\">\n <span className=\"text-muted-foreground\">Recipient</span>\n <span className=\"font-mono font-medium\">{short(to.trim())}</span>\n </div>\n <div className=\"flex items-center justify-between py-3 text-sm\">\n <span className=\"text-muted-foreground\">Contract</span>\n <span className=\"font-medium\">{currency.symbol}</span>\n </div>\n <div className=\"flex items-center justify-between py-3 text-sm\">\n <span className=\"text-muted-foreground\">Call</span>\n <span className=\"font-medium underline\">transfer</span>\n </div>\n </div>\n\n <div className=\"flex items-center justify-between rounded-2xl border border-border px-4 py-3 text-sm\">\n <span className=\"text-muted-foreground\">Estimated fee</span>\n <span className=\"font-medium\">\n {feeError ? \"Unavailable\" : fee ? `${fmt(fee.raw, 18, 6)} ${fee.unit === \"FRI\" ? \"STRK\" : \"ETH\"}` : \"Estimating…\"}\n </span>\n </div>\n {feeError && <p className=\"px-1 text-xs text-destructive\">Fee estimate failed: {feeError}</p>}\n\n <div className=\"flex gap-3\">\n <button\n onClick={() => setConfirmOpen(false)}\n className=\"flex-1 rounded-2xl border border-border py-3 text-sm font-semibold text-muted-foreground transition-colors hover:text-foreground\"\n >\n Reject\n </button>\n <ActionButton action=\"offer\" big onClick={send} className=\"flex-1\">\n Confirm\n </ActionButton>\n </div>\n </div>\n </ActionModal>\n )}\n\n {status === \"processing\" && <BusyOverlay label=\"Signing & sending…\" />}\n {status === \"success\" && txHash && (\n <SuccessDialog\n title={sentMessage.title}\n message={sentMessage.description}\n txHash={txHash}\n onClose={() => {\n reset();\n onDone();\n }}\n />\n )}\n </main>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA+HM;AA7HN,mBAAyB;AACzB,sBAAqG;AACrG,iBAA0C;AAC1C,2BAA6B;AAC7B,2BAA6B;AAC7B,4BAA8B;AAC9B,+BAAiD;AACjD,2BAA2B;AAC3B,yBAA2B;AAC3B,IAAAA,wBAA0B;AAC1B,0BAAyC;AACzC,4BAA8B;AAC9B,2BAAgD;AAChD,4BAA8B;AAC9B,mBAAwD;AACxD,qBAA+B;AAC/B,8BAA+B;AAC/B,8BAAgC;AAChC,2BAAgC;AAEhC,SAAS,uBAAuB,SAA0B;AACxD,MAAI;AACF,iDAAwB,QAAQ,KAAK,CAAC;AACtC,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,gBAAgB,UAA6B,SAAiB,OAAe,IAAY,WAAmB;AACzH,QAAM,UAAU,IAAI,wBAAQ,EAAE,UAAU,SAAS,QAAQ,OAAO,cAAc,IAAI,CAAC;AACnF,QAAM,OAAa;AAAA,IACjB,iBAAiB;AAAA,IACjB,YAAY;AAAA,IACZ,UAAU,yBAAS,QAAQ,EAAE,WAAW,IAAI,QAAQ,sBAAM,QAAQ,SAAS,EAAE,CAAC;AAAA,EAChF;AACA,QAAM,MAAM,MAAM,QAAQ,kBAAkB,IAAI;AAChD,SAAO,EAAE,QAAQ,IAAI,aAAa,MAAM,IAAI,KAAK;AACnD;AAEO,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,EAAE,kBAAkB,eAAe,QAAI,gCAAkB;AAC/D,QAAM,EAAE,UAAU,QAAI,sCAAgB;AACtC,QAAM,EAAE,QAAQ,IAAI,iBAAiB;AACrC,QAAM,EAAE,KAAK,QAAQ,OAAO,MAAM,IAAI,eAAe;AAErD,QAAM,CAAC,UAAU,WAAW,QAAI,uBAAsB,gBAAgB,mCAAc,CAAC,CAAC;AACtF,QAAM,CAAC,YAAY,aAAa,QAAI,uBAAS,KAAK;AAClD,QAAM,WAAO,0CAAgB,QAAQ,OAAO;AAC5C,QAAM,UAAM,0CAAgB,OAAO,OAAO;AAC1C,QAAM,WAAO,0CAAgB,QAAQ,OAAO;AAC5C,QAAM,WAAO,0CAAgB,QAAQ,OAAO;AAE5C,QAAM,yBAAwD;AAAA,IAC5D,MAAM,KAAK;AAAA,IAAY,KAAK,IAAI;AAAA,IAAY,MAAM,KAAK;AAAA,IAAY,MAAM,KAAK;AAAA,EAChF;AACA,QAAM,EAAE,YAAY,gBAAgB,QAAI,0CAAgB,SAAS,SAAS,OAAO;AAEjF,QAAM,CAAC,IAAI,KAAK,QAAI,uBAAS,EAAE;AAC/B,QAAM,CAAC,QAAQ,SAAS,QAAI,uBAAS,EAAE;AACvC,QAAM,CAAC,QAAQ,SAAS,QAAI,uBAAwB,IAAI;AAExD,QAAM,CAAC,aAAa,cAAc,QAAI,uBAAS,KAAK;AACpD,QAAM,CAAC,KAAK,MAAM,QAAI,uBAA+C,IAAI;AACzE,QAAM,CAAC,UAAU,WAAW,QAAI,uBAAwB,IAAI;AAE5D,QAAM,iBAAiB,uBAAuB,EAAE;AAChD,QAAM,cAAc,wCAAgB,KAAK,EAAE,QAAQ,OAAO,KAAK,GAAG,QAAQ,SAAS,QAAQ,QAAI,+BAAe,GAAG,KAAK,CAAC,EAAE,CAAC;AAC1H,MAAI;AACJ,MAAI;AACF,gBAAY,OAAO,KAAK,IAAI,WAAO,wBAAY,OAAO,KAAK,GAAG,SAAS,QAAQ,CAAC,IAAI;AAAA,EACtF,QAAQ;AACN,gBAAY;AAAA,EACd;AACA,QAAM,oBAAoB,aAAa,QAAQ,mBAAmB,QAAQ,YAAY;AACtF,QAAM,eAAe,kBAAkB,aAAa,QAAQ,YAAY,MAAM,CAAC;AAE/E,QAAM,iBAAiB,YAAY;AACjC,QAAI;AACF,YAAM,OAAO,MAAM,UAAU,UAAU,SAAS;AAChD,UAAI,KAAM,OAAM,KAAK,KAAK,CAAC;AAAA,IAC7B,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,QAAM,SAAS,MAAM;AACnB,QAAI,mBAAmB,KAAM;AAC7B,kBAAU,yBAAa,gBAAgB,SAAS,GAAG,SAAS,QAAQ,CAAC;AAAA,EACvE;AAEA,QAAM,aAAa,MAAM;AACvB,QAAI,CAAC,WAAW,CAAC,gBAAgB,aAAa,KAAM;AACpD,gBAAY,IAAI;AAChB,WAAO,IAAI;AACX,mBAAe,IAAI;AACnB,oBAAgB,UAAU,EAAE,UAAU,SAAS,SAAS,SAAS,GAAG,KAAK,GAAG,SAAS,EAClF,KAAK,CAAC,MAAM,OAAO,EAAE,KAAK,EAAE,QAAQ,MAAM,EAAE,KAAK,CAAC,CAAC,EACnD,MAAM,CAAC,MAAM,gBAAY,qCAAc,CAAC,EAAE,OAAO,CAAC;AAAA,EACvD;AAEA,QAAM,OAAO,YAAY;AACvB,QAAI,CAAC,gBAAgB,aAAa,KAAM;AACxC,mBAAe,KAAK;AACpB,UAAM,OAAO,GAAG,KAAK;AACrB,UAAM,MAAM;AACZ,UAAM,IAAI,OAAO,WAAW;AAC1B,YAAM,SAAS,UAAM;AAAA,QAAe;AAAA,QAAQ,MAC1C,UAAU,EAAE,IAAI,QAAQ,OAAO,kBAAkB,EAAE,OAAO,OAAO,SAAS,OAAO,SAAS,SAAS,WAAW,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;AAAA,MAC9I;AACA,gBAAU,OAAO,MAAM;AACvB,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,SACE,6CAAC,UAAK,WAAU,sCACd;AAAA,iDAAC,SAAI,WAAU,2BACb;AAAA,kDAAC,iCAAW,QAAQ,MAAM,WAAW,EAAE,MAAM,OAAO,CAAC,GAAG;AAAA,MACxD,4CAAC,QAAG,WAAU,iFAAgF,kBAAI;AAAA,OACpG;AAAA,IAEC,SACC,4CAAC,SAAI,WAAU,0FACZ,iBACH;AAAA,IAGF,6CAAC,SAAI,WAAU,uBACb;AAAA,mDAAC,SACC;AAAA,qDAAC,SAAI,WAAU,2BACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,MAAM,EAAE,OAAO,KAAK;AAAA,cACrC,aAAY;AAAA,cACZ,YAAY;AAAA,cACZ,WAAU;AAAA;AAAA,UACZ;AAAA,UACC,GAAG,KAAK,MAAM,MACb;AAAA,YAAC;AAAA;AAAA,cACC,SAAS;AAAA,cACT,WAAU;AAAA,cACX;AAAA;AAAA,UAED;AAAA,WAEJ;AAAA,QACC,GAAG,KAAK,MAAM,MAAM,CAAC,kBACpB,4CAAC,OAAE,WAAU,wCAAuC,2CAA6B;AAAA,SAErF;AAAA,MAEA,6CAAC,SACC;AAAA,qDAAC,SAAI,WAAU,YACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,UAAU,EAAE,OAAO,MAAM,QAAQ,YAAY,EAAE,CAAC;AAAA,cACjE,aAAY;AAAA,cACZ,WAAU;AAAA,cACV,WAAU;AAAA;AAAA,UACZ;AAAA,UACA,6CAAC,SAAI,WAAU,yEACb;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS;AAAA,gBACT,WAAU;AAAA,gBACX;AAAA;AAAA,YAED;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS,MAAM,cAAc,IAAI;AAAA,gBACjC,WAAU;AAAA,gBAEV;AAAA,8DAAC,qCAAa,QAAQ,SAAS,QAAQ,MAAM,IAAI;AAAA,kBAAE;AAAA,kBAAE,SAAS;AAAA;AAAA;AAAA,YAChE;AAAA,aACF;AAAA,WACF;AAAA,QACA,6CAAC,SAAI,WAAU,iDACb;AAAA,uDAAC,UAAK,WAAU,iCAAgC;AAAA;AAAA,YACpC,mBAAmB,WAAO,0BAAI,iBAAiB,SAAS,QAAQ,IAAI;AAAA,aAChF;AAAA,UACC,qBAAqB,4CAAC,UAAK,WAAU,4BAA2B,qCAAuB;AAAA,WAC1F;AAAA,SACF;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,QAAO;AAAA,UACP,KAAG;AAAA,UACH,SAAS;AAAA,UACT,UAAU,WAAW,gBAAgB,CAAC;AAAA,UACtC,WAAU;AAAA,UACX;AAAA;AAAA,MAED;AAAA,MACA,4CAAC,mCAAU,uFAAyE;AAAA,OACtF;AAAA,IAEC,cACC;AAAA,MAAC;AAAA;AAAA,QACC,OAAM;AAAA,QACN,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,UAAU,CAAC,MAAM;AACf,sBAAY,CAAC;AACb,wBAAc,KAAK;AAAA,QACrB;AAAA,QACA,SAAS,MAAM,cAAc,KAAK;AAAA;AAAA,IACpC;AAAA,IAGD,eACC,4CAAC,mCAAY,OAAM,mBAAkB,SAAS,MAAM,eAAe,KAAK,GACtE,uDAAC,SAAI,WAAU,uBACb;AAAA,mDAAC,SAAI,WAAU,2BACb;AAAA,oDAAC,SAAI,WAAU,gFACb,sDAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,KAAI,eAAc,SAAQ,gBAAe,SACrI,sDAAC,UAAK,GAAE,wCAAuC,GACjD,GACF;AAAA,QACA,6CAAC,SAAI,WAAU,kBACb;AAAA,sDAAC,SAAI,WAAU,iBAAgB,kBAAI;AAAA,UACnC,6CAAC,SAAI,WAAU,oDAAmD;AAAA;AAAA,gBAAK,4BAAM,GAAG,KAAK,CAAC;AAAA,aAAE;AAAA,WAC1F;AAAA,SACF;AAAA,MAEA,6CAAC,SAAI,WAAU,gEACb;AAAA,oDAAC,qCAAa,QAAQ,SAAS,QAAQ,MAAM,IAAI;AAAA,QACjD,4CAAC,SAAI,WAAU,gCAAgC,mBAAS,QAAO;AAAA,QAC/D,6CAAC,SAAI,WAAU,yCAAwC;AAAA;AAAA,UACnD,OAAO,KAAK;AAAA,UAAE;AAAA,UAAE,SAAS;AAAA,WAC7B;AAAA,SACF;AAAA,MAEA,6CAAC,SAAI,WAAU,iFACb;AAAA,qDAAC,SAAI,WAAU,kDACb;AAAA,sDAAC,UAAK,WAAU,yBAAwB,oBAAM;AAAA,UAC9C,6CAAC,UAAK,WAAU,eAAe;AAAA,mBAAO,KAAK;AAAA,YAAE;AAAA,YAAE,SAAS;AAAA,aAAO;AAAA,WACjE;AAAA,QACA,6CAAC,SAAI,WAAU,kDACb;AAAA,sDAAC,UAAK,WAAU,yBAAwB,uBAAS;AAAA,UACjD,4CAAC,UAAK,WAAU,yBAAyB,0CAAM,GAAG,KAAK,CAAC,GAAE;AAAA,WAC5D;AAAA,QACA,6CAAC,SAAI,WAAU,kDACb;AAAA,sDAAC,UAAK,WAAU,yBAAwB,sBAAQ;AAAA,UAChD,4CAAC,UAAK,WAAU,eAAe,mBAAS,QAAO;AAAA,WACjD;AAAA,QACA,6CAAC,SAAI,WAAU,kDACb;AAAA,sDAAC,UAAK,WAAU,yBAAwB,kBAAI;AAAA,UAC5C,4CAAC,UAAK,WAAU,yBAAwB,sBAAQ;AAAA,WAClD;AAAA,SACF;AAAA,MAEA,6CAAC,SAAI,WAAU,wFACb;AAAA,oDAAC,UAAK,WAAU,yBAAwB,2BAAa;AAAA,QACrD,4CAAC,UAAK,WAAU,eACb,qBAAW,gBAAgB,MAAM,OAAG,0BAAI,IAAI,KAAK,IAAI,CAAC,CAAC,IAAI,IAAI,SAAS,QAAQ,SAAS,KAAK,KAAK,oBACtG;AAAA,SACF;AAAA,MACC,YAAY,6CAAC,OAAE,WAAU,iCAAgC;AAAA;AAAA,QAAsB;AAAA,SAAS;AAAA,MAEzF,6CAAC,SAAI,WAAU,cACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS,MAAM,eAAe,KAAK;AAAA,YACnC,WAAU;AAAA,YACX;AAAA;AAAA,QAED;AAAA,QACA,4CAAC,qCAAa,QAAO,SAAQ,KAAG,MAAC,SAAS,MAAM,WAAU,UAAS,qBAEnE;AAAA,SACF;AAAA,OACF,GACF;AAAA,IAGD,WAAW,gBAAgB,4CAAC,mCAAY,OAAM,2BAAqB;AAAA,IACnE,WAAW,aAAa,UACvB;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,YAAY;AAAA,QACnB,SAAS,YAAY;AAAA,QACrB;AAAA,QACA,SAAS,MAAM;AACb,gBAAM;AACN,iBAAO;AAAA,QACT;AAAA;AAAA,IACF;AAAA,KAEJ;AAEJ;","names":["import_action_button"]}
|
|
@@ -15,7 +15,9 @@ import { CurrencySheet } from "./currency-sheet.js";
|
|
|
15
15
|
import { WALLET_TOKENS } from "../../utils/media-wallet/wallet-tokens.js";
|
|
16
16
|
import { SuccessDialog } from "./success-dialog.js";
|
|
17
17
|
import { useMediaWalletApp } from "./types.js";
|
|
18
|
+
import { shortenAddress } from "../../utils/address.js";
|
|
18
19
|
import { runIntentCalls } from "../../utils/run-intent-calls.js";
|
|
20
|
+
import { successMessages } from "../../utils/success-messages.js";
|
|
19
21
|
import { useMedialaneApp } from "../medialane-app.js";
|
|
20
22
|
function isValidStarknetAddress(address) {
|
|
21
23
|
try {
|
|
@@ -64,6 +66,7 @@ function MediaWalletSend({
|
|
|
64
66
|
const [fee, setFee] = useState(null);
|
|
65
67
|
const [feeError, setFeeError] = useState(null);
|
|
66
68
|
const recipientValid = isValidStarknetAddress(to);
|
|
69
|
+
const sentMessage = successMessages.sent({ amount: amount.trim(), symbol: currency.symbol, to: shortenAddress(to.trim()) });
|
|
67
70
|
let amountRaw;
|
|
68
71
|
try {
|
|
69
72
|
amountRaw = amount.trim() ? BigInt(parseAmount(amount.trim(), currency.decimals)) : null;
|
|
@@ -270,8 +273,8 @@ function MediaWalletSend({
|
|
|
270
273
|
status === "success" && txHash && /* @__PURE__ */ jsx(
|
|
271
274
|
SuccessDialog,
|
|
272
275
|
{
|
|
273
|
-
title:
|
|
274
|
-
message:
|
|
276
|
+
title: sentMessage.title,
|
|
277
|
+
message: sentMessage.description,
|
|
275
278
|
txHash,
|
|
276
279
|
onClose: () => {
|
|
277
280
|
reset();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/media-wallet/media-wallet-send.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { Account, CallData, cairo, validateAndParseAddress, type Call, type ProviderInterface } from \"starknet\";\nimport { parseAmount, formatAmount } from \"@medialane/sdk\";\nimport { ActionButton } from \"../action-button.js\";\nimport { CurrencyIcon } from \"../currency-icon.js\";\nimport { describeError } from \"../../utils/describe-error.js\";\nimport { useErc20Balance, useTokenBalance } from \"../../utils/media-wallet/use-erc20-balance.js\";\nimport { fmt, short } from \"../../utils/media-wallet/wallet-format.js\";\nimport { BackButton } from \"./back-button.js\";\nimport { TrustNote } from \"./action-button.js\";\nimport { ActionModal, BusyOverlay } from \"./action-modal.js\";\nimport { CurrencySheet } from \"./currency-sheet.js\";\nimport { WALLET_TOKENS, type WalletToken } from \"../../utils/media-wallet/wallet-tokens.js\";\nimport { SuccessDialog } from \"./success-dialog.js\";\nimport { useMediaWalletApp, type MediaWalletView } from \"./types.js\";\nimport { runIntentCalls } from \"../../utils/run-intent-calls.js\";\nimport { useMedialaneApp } from \"../medialane-app.js\";\n\nfunction isValidStarknetAddress(address: string): boolean {\n try {\n validateAndParseAddress(address.trim());\n return true;\n } catch {\n return false;\n }\n}\n\nasync function estimateSendFee(provider: ProviderInterface, address: string, token: string, to: string, amountRaw: bigint) {\n const account = new Account({ provider, address, signer: \"0x1\", cairoVersion: \"1\" });\n const call: Call = {\n contractAddress: token,\n entrypoint: \"transfer\",\n calldata: CallData.compile({ recipient: to, amount: cairo.uint256(amountRaw) }),\n };\n const est = await account.estimateInvokeFee(call);\n return { feeRaw: est.overall_fee, unit: est.unit };\n}\n\nexport function MediaWalletSend({\n initialToken,\n onNavigate,\n onDone,\n}: {\n initialToken?: WalletToken;\n onNavigate: (view: MediaWalletView) => void;\n onDone: () => void;\n}) {\n const { useWalletSession, useWriteAction } = useMediaWalletApp();\n const { getClient } = useMedialaneApp();\n const { address } = useWalletSession();\n const { run, status, reset, error } = useWriteAction();\n\n const [currency, setCurrency] = useState<WalletToken>(initialToken ?? WALLET_TOKENS[0]);\n const [pickerOpen, setPickerOpen] = useState(false);\n const strk = useTokenBalance(\"STRK\", address);\n const eth = useTokenBalance(\"ETH\", address);\n const usdc = useTokenBalance(\"USDC\", address);\n const wbtc = useTokenBalance(\"WBTC\", address);\n \n const pinnedBalancesBySymbol: Record<string, bigint | null> = {\n STRK: strk.rawBalance, ETH: eth.rawBalance, USDC: usdc.rawBalance, WBTC: wbtc.rawBalance,\n };\n const { rawBalance: currencyBalance } = useErc20Balance(currency.address, address);\n\n const [to, setTo] = useState(\"\");\n const [amount, setAmount] = useState(\"\");\n const [txHash, setTxHash] = useState<string | null>(null);\n\n const [confirmOpen, setConfirmOpen] = useState(false);\n const [fee, setFee] = useState<{ raw: bigint; unit: string } | null>(null);\n const [feeError, setFeeError] = useState<string | null>(null);\n\n const recipientValid = isValidStarknetAddress(to);\n let amountRaw: bigint | null;\n try {\n amountRaw = amount.trim() ? BigInt(parseAmount(amount.trim(), currency.decimals)) : null;\n } catch {\n amountRaw = null;\n }\n const amountOverBalance = amountRaw != null && currencyBalance != null && amountRaw > currencyBalance;\n const composeReady = recipientValid && amountRaw != null && amountRaw > 0n && !amountOverBalance;\n\n const pasteRecipient = async () => {\n try {\n const text = await navigator.clipboard.readText();\n if (text) setTo(text.trim());\n } catch {\n\n }\n };\n\n const setMax = () => {\n if (currencyBalance == null) return;\n setAmount(formatAmount(currencyBalance.toString(), currency.decimals));\n };\n\n const openReview = () => {\n if (!address || !composeReady || amountRaw == null) return;\n setFeeError(null);\n setFee(null);\n setConfirmOpen(true);\n estimateSendFee(getClient().provider, address, currency.address, to.trim(), amountRaw)\n .then((f) => setFee({ raw: f.feeRaw, unit: f.unit }))\n .catch((e) => setFeeError(describeError(e).message));\n };\n\n const send = async () => {\n if (!composeReady || amountRaw == null) return;\n setConfirmOpen(false);\n const dest = to.trim();\n const amt = amountRaw;\n await run(async (signer) => {\n const result = await runIntentCalls(signer, () =>\n getClient().api.intents.create(\"transfer-token\", { owner: signer.address, token: currency.address, recipient: dest, amount: amt.toString() }),\n );\n setTxHash(result.txHash);\n return result;\n });\n };\n\n return (\n <main className=\"flex flex-col gap-6 px-5 pb-8 pt-2\">\n <div className=\"flex items-center gap-3\">\n <BackButton onBack={() => onNavigate({ name: \"home\" })} />\n <h1 className=\"font-[family-name:var(--font-display)] text-2xl font-extrabold tracking-tight\">Send</h1>\n </div>\n\n {error && (\n <div className=\"rounded-2xl border border-destructive/40 bg-destructive/10 p-3 text-xs leading-relaxed\">\n {error}\n </div>\n )}\n\n <div className=\"flex flex-col gap-3\">\n <div>\n <div className=\"flex items-center gap-2\">\n <input\n value={to}\n onChange={(e) => setTo(e.target.value)}\n placeholder=\"Recipient 0x…\"\n spellCheck={false}\n className=\"w-0 flex-1 rounded-2xl border border-border bg-foreground/[0.05] px-4 py-3 font-mono text-sm outline-none transition-colors focus:border-brand-purple\"\n />\n {to.trim() === \"\" && (\n <button\n onClick={pasteRecipient}\n className=\"shrink-0 rounded-2xl border border-border bg-foreground/[0.05] px-3 py-3 text-xs font-semibold text-muted-foreground transition-colors hover:text-foreground\"\n >\n Paste\n </button>\n )}\n </div>\n {to.trim() !== \"\" && !recipientValid && (\n <p className=\"mt-1.5 px-1 text-xs text-destructive\">Not a valid Starknet address.</p>\n )}\n </div>\n\n <div>\n <div className=\"relative\">\n <input\n value={amount}\n onChange={(e) => setAmount(e.target.value.replace(/[^0-9.]/g, \"\"))}\n placeholder=\"0.00\"\n inputMode=\"decimal\"\n className=\"w-full rounded-2xl border border-border bg-foreground/[0.05] px-4 py-3 pr-36 text-sm outline-none transition-colors focus:border-brand-purple\"\n />\n <div className=\"absolute right-2.5 top-1/2 flex -translate-y-1/2 items-center gap-1.5\">\n <button\n onClick={setMax}\n className=\"rounded-full bg-foreground/[0.06] px-2 py-1 text-2xs font-bold text-muted-foreground transition-colors hover:text-foreground\"\n >\n MAX\n </button>\n <button\n onClick={() => setPickerOpen(true)}\n className=\"flex items-center gap-1.5 rounded-full bg-foreground/[0.06] px-2.5 py-1 text-xs font-semibold\"\n >\n <CurrencyIcon symbol={currency.symbol} size={16} /> {currency.symbol}\n </button>\n </div>\n </div>\n <div className=\"mt-1.5 flex items-center justify-between px-1\">\n <span className=\"text-xs text-muted-foreground\">\n Balance: {currencyBalance != null ? fmt(currencyBalance, currency.decimals) : \"…\"}\n </span>\n {amountOverBalance && <span className=\"text-xs text-destructive\">Amount exceeds balance.</span>}\n </div>\n </div>\n\n <ActionButton\n action=\"offer\"\n big\n onClick={openReview}\n disabled={status === \"processing\" || !composeReady}\n className=\"mt-1 w-full disabled:pointer-events-none disabled:opacity-40\"\n >\n Review Transfer\n </ActionButton>\n <TrustNote>Gas paid from your balance. Transfers are permanent and recorded onchain.</TrustNote>\n </div>\n\n {pickerOpen && (\n <CurrencySheet\n title=\"Choose currency\"\n tokens={WALLET_TOKENS}\n balances={pinnedBalancesBySymbol}\n onSelect={(t) => {\n setCurrency(t);\n setPickerOpen(false);\n }}\n onClose={() => setPickerOpen(false)}\n />\n )}\n\n {confirmOpen && (\n <ActionModal title=\"Review Transfer\" onClose={() => setConfirmOpen(false)}>\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"grid h-10 w-10 shrink-0 place-items-center rounded-full bg-foreground/[0.06]\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M22 2L11 13M22 2l-7 20-4-9-9-4 20-7z\" />\n </svg>\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"font-semibold\">Send</div>\n <div className=\"truncate font-mono text-xs text-muted-foreground\">To: {short(to.trim())}</div>\n </div>\n </div>\n\n <div className=\"flex items-center gap-3 rounded-2xl bg-foreground/[0.05] p-4\">\n <CurrencyIcon symbol={currency.symbol} size={28} />\n <div className=\"min-w-0 flex-1 font-semibold\">{currency.symbol}</div>\n <div className=\"text-right font-semibold tabular-nums\">\n −{amount.trim()} {currency.symbol}\n </div>\n </div>\n\n <div className=\"flex flex-col divide-y divide-border/40 rounded-2xl bg-foreground/[0.05] px-4\">\n <div className=\"flex items-center justify-between py-3 text-sm\">\n <span className=\"text-muted-foreground\">Amount</span>\n <span className=\"font-medium\">{amount.trim()} {currency.symbol}</span>\n </div>\n <div className=\"flex items-center justify-between py-3 text-sm\">\n <span className=\"text-muted-foreground\">Recipient</span>\n <span className=\"font-mono font-medium\">{short(to.trim())}</span>\n </div>\n <div className=\"flex items-center justify-between py-3 text-sm\">\n <span className=\"text-muted-foreground\">Contract</span>\n <span className=\"font-medium\">{currency.symbol}</span>\n </div>\n <div className=\"flex items-center justify-between py-3 text-sm\">\n <span className=\"text-muted-foreground\">Call</span>\n <span className=\"font-medium underline\">transfer</span>\n </div>\n </div>\n\n <div className=\"flex items-center justify-between rounded-2xl border border-border px-4 py-3 text-sm\">\n <span className=\"text-muted-foreground\">Estimated fee</span>\n <span className=\"font-medium\">\n {feeError ? \"Unavailable\" : fee ? `${fmt(fee.raw, 18, 6)} ${fee.unit === \"FRI\" ? \"STRK\" : \"ETH\"}` : \"Estimating…\"}\n </span>\n </div>\n {feeError && <p className=\"px-1 text-xs text-destructive\">Fee estimate failed: {feeError}</p>}\n\n <div className=\"flex gap-3\">\n <button\n onClick={() => setConfirmOpen(false)}\n className=\"flex-1 rounded-2xl border border-border py-3 text-sm font-semibold text-muted-foreground transition-colors hover:text-foreground\"\n >\n Reject\n </button>\n <ActionButton action=\"offer\" big onClick={send} className=\"flex-1\">\n Confirm\n </ActionButton>\n </div>\n </div>\n </ActionModal>\n )}\n\n {status === \"processing\" && <BusyOverlay label=\"Signing & sending…\" />}\n {status === \"success\" && txHash && (\n <SuccessDialog\n title=\"Sent\"\n message={`${amount.trim()} ${currency.symbol} is on its way.`}\n txHash={txHash}\n onClose={() => {\n reset();\n onDone();\n }}\n />\n )}\n </main>\n );\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/media-wallet/media-wallet-send.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { Account, CallData, cairo, validateAndParseAddress, type Call, type ProviderInterface } from \"starknet\";\nimport { parseAmount, formatAmount } from \"@medialane/sdk\";\nimport { ActionButton } from \"../action-button.js\";\nimport { CurrencyIcon } from \"../currency-icon.js\";\nimport { describeError } from \"../../utils/describe-error.js\";\nimport { useErc20Balance, useTokenBalance } from \"../../utils/media-wallet/use-erc20-balance.js\";\nimport { fmt, short } from \"../../utils/media-wallet/wallet-format.js\";\nimport { BackButton } from \"./back-button.js\";\nimport { TrustNote } from \"./action-button.js\";\nimport { ActionModal, BusyOverlay } from \"./action-modal.js\";\nimport { CurrencySheet } from \"./currency-sheet.js\";\nimport { WALLET_TOKENS, type WalletToken } from \"../../utils/media-wallet/wallet-tokens.js\";\nimport { SuccessDialog } from \"./success-dialog.js\";\nimport { useMediaWalletApp, type MediaWalletView } from \"./types.js\";\nimport { shortenAddress } from \"../../utils/address.js\";\nimport { runIntentCalls } from \"../../utils/run-intent-calls.js\";\nimport { successMessages } from \"../../utils/success-messages.js\";\nimport { useMedialaneApp } from \"../medialane-app.js\";\n\nfunction isValidStarknetAddress(address: string): boolean {\n try {\n validateAndParseAddress(address.trim());\n return true;\n } catch {\n return false;\n }\n}\n\nasync function estimateSendFee(provider: ProviderInterface, address: string, token: string, to: string, amountRaw: bigint) {\n const account = new Account({ provider, address, signer: \"0x1\", cairoVersion: \"1\" });\n const call: Call = {\n contractAddress: token,\n entrypoint: \"transfer\",\n calldata: CallData.compile({ recipient: to, amount: cairo.uint256(amountRaw) }),\n };\n const est = await account.estimateInvokeFee(call);\n return { feeRaw: est.overall_fee, unit: est.unit };\n}\n\nexport function MediaWalletSend({\n initialToken,\n onNavigate,\n onDone,\n}: {\n initialToken?: WalletToken;\n onNavigate: (view: MediaWalletView) => void;\n onDone: () => void;\n}) {\n const { useWalletSession, useWriteAction } = useMediaWalletApp();\n const { getClient } = useMedialaneApp();\n const { address } = useWalletSession();\n const { run, status, reset, error } = useWriteAction();\n\n const [currency, setCurrency] = useState<WalletToken>(initialToken ?? WALLET_TOKENS[0]);\n const [pickerOpen, setPickerOpen] = useState(false);\n const strk = useTokenBalance(\"STRK\", address);\n const eth = useTokenBalance(\"ETH\", address);\n const usdc = useTokenBalance(\"USDC\", address);\n const wbtc = useTokenBalance(\"WBTC\", address);\n \n const pinnedBalancesBySymbol: Record<string, bigint | null> = {\n STRK: strk.rawBalance, ETH: eth.rawBalance, USDC: usdc.rawBalance, WBTC: wbtc.rawBalance,\n };\n const { rawBalance: currencyBalance } = useErc20Balance(currency.address, address);\n\n const [to, setTo] = useState(\"\");\n const [amount, setAmount] = useState(\"\");\n const [txHash, setTxHash] = useState<string | null>(null);\n\n const [confirmOpen, setConfirmOpen] = useState(false);\n const [fee, setFee] = useState<{ raw: bigint; unit: string } | null>(null);\n const [feeError, setFeeError] = useState<string | null>(null);\n\n const recipientValid = isValidStarknetAddress(to);\n const sentMessage = successMessages.sent({ amount: amount.trim(), symbol: currency.symbol, to: shortenAddress(to.trim()) });\n let amountRaw: bigint | null;\n try {\n amountRaw = amount.trim() ? BigInt(parseAmount(amount.trim(), currency.decimals)) : null;\n } catch {\n amountRaw = null;\n }\n const amountOverBalance = amountRaw != null && currencyBalance != null && amountRaw > currencyBalance;\n const composeReady = recipientValid && amountRaw != null && amountRaw > 0n && !amountOverBalance;\n\n const pasteRecipient = async () => {\n try {\n const text = await navigator.clipboard.readText();\n if (text) setTo(text.trim());\n } catch {\n\n }\n };\n\n const setMax = () => {\n if (currencyBalance == null) return;\n setAmount(formatAmount(currencyBalance.toString(), currency.decimals));\n };\n\n const openReview = () => {\n if (!address || !composeReady || amountRaw == null) return;\n setFeeError(null);\n setFee(null);\n setConfirmOpen(true);\n estimateSendFee(getClient().provider, address, currency.address, to.trim(), amountRaw)\n .then((f) => setFee({ raw: f.feeRaw, unit: f.unit }))\n .catch((e) => setFeeError(describeError(e).message));\n };\n\n const send = async () => {\n if (!composeReady || amountRaw == null) return;\n setConfirmOpen(false);\n const dest = to.trim();\n const amt = amountRaw;\n await run(async (signer) => {\n const result = await runIntentCalls(signer, () =>\n getClient().api.intents.create(\"transfer-token\", { owner: signer.address, token: currency.address, recipient: dest, amount: amt.toString() }),\n );\n setTxHash(result.txHash);\n return result;\n });\n };\n\n return (\n <main className=\"flex flex-col gap-6 px-5 pb-8 pt-2\">\n <div className=\"flex items-center gap-3\">\n <BackButton onBack={() => onNavigate({ name: \"home\" })} />\n <h1 className=\"font-[family-name:var(--font-display)] text-2xl font-extrabold tracking-tight\">Send</h1>\n </div>\n\n {error && (\n <div className=\"rounded-2xl border border-destructive/40 bg-destructive/10 p-3 text-xs leading-relaxed\">\n {error}\n </div>\n )}\n\n <div className=\"flex flex-col gap-3\">\n <div>\n <div className=\"flex items-center gap-2\">\n <input\n value={to}\n onChange={(e) => setTo(e.target.value)}\n placeholder=\"Recipient 0x…\"\n spellCheck={false}\n className=\"w-0 flex-1 rounded-2xl border border-border bg-foreground/[0.05] px-4 py-3 font-mono text-sm outline-none transition-colors focus:border-brand-purple\"\n />\n {to.trim() === \"\" && (\n <button\n onClick={pasteRecipient}\n className=\"shrink-0 rounded-2xl border border-border bg-foreground/[0.05] px-3 py-3 text-xs font-semibold text-muted-foreground transition-colors hover:text-foreground\"\n >\n Paste\n </button>\n )}\n </div>\n {to.trim() !== \"\" && !recipientValid && (\n <p className=\"mt-1.5 px-1 text-xs text-destructive\">Not a valid Starknet address.</p>\n )}\n </div>\n\n <div>\n <div className=\"relative\">\n <input\n value={amount}\n onChange={(e) => setAmount(e.target.value.replace(/[^0-9.]/g, \"\"))}\n placeholder=\"0.00\"\n inputMode=\"decimal\"\n className=\"w-full rounded-2xl border border-border bg-foreground/[0.05] px-4 py-3 pr-36 text-sm outline-none transition-colors focus:border-brand-purple\"\n />\n <div className=\"absolute right-2.5 top-1/2 flex -translate-y-1/2 items-center gap-1.5\">\n <button\n onClick={setMax}\n className=\"rounded-full bg-foreground/[0.06] px-2 py-1 text-2xs font-bold text-muted-foreground transition-colors hover:text-foreground\"\n >\n MAX\n </button>\n <button\n onClick={() => setPickerOpen(true)}\n className=\"flex items-center gap-1.5 rounded-full bg-foreground/[0.06] px-2.5 py-1 text-xs font-semibold\"\n >\n <CurrencyIcon symbol={currency.symbol} size={16} /> {currency.symbol}\n </button>\n </div>\n </div>\n <div className=\"mt-1.5 flex items-center justify-between px-1\">\n <span className=\"text-xs text-muted-foreground\">\n Balance: {currencyBalance != null ? fmt(currencyBalance, currency.decimals) : \"…\"}\n </span>\n {amountOverBalance && <span className=\"text-xs text-destructive\">Amount exceeds balance.</span>}\n </div>\n </div>\n\n <ActionButton\n action=\"offer\"\n big\n onClick={openReview}\n disabled={status === \"processing\" || !composeReady}\n className=\"mt-1 w-full disabled:pointer-events-none disabled:opacity-40\"\n >\n Review Transfer\n </ActionButton>\n <TrustNote>Gas paid from your balance. Transfers are permanent and recorded onchain.</TrustNote>\n </div>\n\n {pickerOpen && (\n <CurrencySheet\n title=\"Choose currency\"\n tokens={WALLET_TOKENS}\n balances={pinnedBalancesBySymbol}\n onSelect={(t) => {\n setCurrency(t);\n setPickerOpen(false);\n }}\n onClose={() => setPickerOpen(false)}\n />\n )}\n\n {confirmOpen && (\n <ActionModal title=\"Review Transfer\" onClose={() => setConfirmOpen(false)}>\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"grid h-10 w-10 shrink-0 place-items-center rounded-full bg-foreground/[0.06]\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M22 2L11 13M22 2l-7 20-4-9-9-4 20-7z\" />\n </svg>\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"font-semibold\">Send</div>\n <div className=\"truncate font-mono text-xs text-muted-foreground\">To: {short(to.trim())}</div>\n </div>\n </div>\n\n <div className=\"flex items-center gap-3 rounded-2xl bg-foreground/[0.05] p-4\">\n <CurrencyIcon symbol={currency.symbol} size={28} />\n <div className=\"min-w-0 flex-1 font-semibold\">{currency.symbol}</div>\n <div className=\"text-right font-semibold tabular-nums\">\n −{amount.trim()} {currency.symbol}\n </div>\n </div>\n\n <div className=\"flex flex-col divide-y divide-border/40 rounded-2xl bg-foreground/[0.05] px-4\">\n <div className=\"flex items-center justify-between py-3 text-sm\">\n <span className=\"text-muted-foreground\">Amount</span>\n <span className=\"font-medium\">{amount.trim()} {currency.symbol}</span>\n </div>\n <div className=\"flex items-center justify-between py-3 text-sm\">\n <span className=\"text-muted-foreground\">Recipient</span>\n <span className=\"font-mono font-medium\">{short(to.trim())}</span>\n </div>\n <div className=\"flex items-center justify-between py-3 text-sm\">\n <span className=\"text-muted-foreground\">Contract</span>\n <span className=\"font-medium\">{currency.symbol}</span>\n </div>\n <div className=\"flex items-center justify-between py-3 text-sm\">\n <span className=\"text-muted-foreground\">Call</span>\n <span className=\"font-medium underline\">transfer</span>\n </div>\n </div>\n\n <div className=\"flex items-center justify-between rounded-2xl border border-border px-4 py-3 text-sm\">\n <span className=\"text-muted-foreground\">Estimated fee</span>\n <span className=\"font-medium\">\n {feeError ? \"Unavailable\" : fee ? `${fmt(fee.raw, 18, 6)} ${fee.unit === \"FRI\" ? \"STRK\" : \"ETH\"}` : \"Estimating…\"}\n </span>\n </div>\n {feeError && <p className=\"px-1 text-xs text-destructive\">Fee estimate failed: {feeError}</p>}\n\n <div className=\"flex gap-3\">\n <button\n onClick={() => setConfirmOpen(false)}\n className=\"flex-1 rounded-2xl border border-border py-3 text-sm font-semibold text-muted-foreground transition-colors hover:text-foreground\"\n >\n Reject\n </button>\n <ActionButton action=\"offer\" big onClick={send} className=\"flex-1\">\n Confirm\n </ActionButton>\n </div>\n </div>\n </ActionModal>\n )}\n\n {status === \"processing\" && <BusyOverlay label=\"Signing & sending…\" />}\n {status === \"success\" && txHash && (\n <SuccessDialog\n title={sentMessage.title}\n message={sentMessage.description}\n txHash={txHash}\n onClose={() => {\n reset();\n onDone();\n }}\n />\n )}\n </main>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -44,16 +44,10 @@ function SuccessDialog({
|
|
|
44
44
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_action_modal.CanvasPortal, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "absolute inset-0 z-[70] grid place-items-center p-6", onClick: onClose, children: [
|
|
45
45
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_action_modal.ActionBackdrop, {}),
|
|
46
46
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "card-base relative z-10 w-full max-w-[320px] p-6 text-center", onClick: (e) => e.stopPropagation(), children: [
|
|
47
|
-
/* @__PURE__ */ (0, import_jsx_runtime.
|
|
48
|
-
"
|
|
49
|
-
{
|
|
50
|
-
|
|
51
|
-
style: { background: BRAND_GRADIENT },
|
|
52
|
-
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { width: "30", height: "30", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.6", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M20 6L9 17l-5-5" }) })
|
|
53
|
-
}
|
|
54
|
-
),
|
|
55
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("h2", { className: "mt-4 font-[family-name:var(--font-display)] text-xl font-extrabold tracking-tight", children: title }),
|
|
56
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "mt-1.5 text-sm leading-relaxed text-muted-foreground", children: message }),
|
|
47
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { role: "status", children: [
|
|
48
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("h2", { className: "font-[family-name:var(--font-display)] text-xl font-extrabold tracking-tight", children: title }),
|
|
49
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "mt-1.5 text-sm leading-relaxed text-muted-foreground", children: message })
|
|
50
|
+
] }),
|
|
57
51
|
txHash && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
58
52
|
"a",
|
|
59
53
|
{
|
|
@@ -61,7 +55,7 @@ function SuccessDialog({
|
|
|
61
55
|
target: "_blank",
|
|
62
56
|
rel: "noopener noreferrer",
|
|
63
57
|
className: "mt-3 inline-block text-xs text-brand-blue hover:underline",
|
|
64
|
-
children: "View
|
|
58
|
+
children: "View transaction \u2197"
|
|
65
59
|
}
|
|
66
60
|
),
|
|
67
61
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_action_button.ActionButton, { big: true, onClick: onClose, className: "mt-5 w-full", style: { "--ml-grad": BRAND_GRADIENT }, children: actionLabel })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/media-wallet/success-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect } from \"react\";\nimport { ActionButton } from \"../action-button.js\";\nimport { ActionBackdrop, CanvasPortal } from \"./action-modal.js\";\nimport { fireConfetti } from \"../../utils/media-wallet/confetti.js\";\nimport { explorerTxUrl } from \"../../utils/media-wallet/wallet-format.js\";\nimport { useMediaWalletApp } from \"./types.js\";\n\nconst BRAND_GRADIENT = \"linear-gradient(115deg, #3b7bff, #8a5cf6, #f6608f, #fb8b46, #3b7bff)\";\n\nexport function SuccessDialog({\n title,\n message,\n actionLabel = \"Done\",\n txHash,\n onClose,\n}: {\n title: string;\n message: string;\n actionLabel?: string;\n txHash?: string;\n onClose: () => void;\n}) {\n const { explorerUrl } = useMediaWalletApp();\n useEffect(() => {\n fireConfetti();\n }, []);\n return (\n <CanvasPortal>\n <div className=\"absolute inset-0 z-[70] grid place-items-center p-6\" onClick={onClose}>\n <ActionBackdrop />\n <div className=\"card-base relative z-10 w-full max-w-[320px] p-6 text-center\" onClick={(e) => e.stopPropagation()}>\n <div
|
|
1
|
+
{"version":3,"sources":["../../../src/components/media-wallet/success-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect } from \"react\";\nimport { ActionButton } from \"../action-button.js\";\nimport { ActionBackdrop, CanvasPortal } from \"./action-modal.js\";\nimport { fireConfetti } from \"../../utils/media-wallet/confetti.js\";\nimport { explorerTxUrl } from \"../../utils/media-wallet/wallet-format.js\";\nimport { useMediaWalletApp } from \"./types.js\";\n\nconst BRAND_GRADIENT = \"linear-gradient(115deg, #3b7bff, #8a5cf6, #f6608f, #fb8b46, #3b7bff)\";\n\nexport function SuccessDialog({\n title,\n message,\n actionLabel = \"Done\",\n txHash,\n onClose,\n}: {\n title: string;\n message: string;\n actionLabel?: string;\n txHash?: string;\n onClose: () => void;\n}) {\n const { explorerUrl } = useMediaWalletApp();\n useEffect(() => {\n fireConfetti();\n }, []);\n return (\n <CanvasPortal>\n <div className=\"absolute inset-0 z-[70] grid place-items-center p-6\" onClick={onClose}>\n <ActionBackdrop />\n <div className=\"card-base relative z-10 w-full max-w-[320px] p-6 text-center\" onClick={(e) => e.stopPropagation()}>\n <div role=\"status\">\n <h2 className=\"font-[family-name:var(--font-display)] text-xl font-extrabold tracking-tight\">{title}</h2>\n <p className=\"mt-1.5 text-sm leading-relaxed text-muted-foreground\">{message}</p>\n </div>\n {txHash && (\n <a\n href={explorerTxUrl(explorerUrl, txHash)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"mt-3 inline-block text-xs text-brand-blue hover:underline\"\n >\n View transaction ↗\n </a>\n )}\n <ActionButton big onClick={onClose} className=\"mt-5 w-full\" style={{ \"--ml-grad\": BRAND_GRADIENT } as React.CSSProperties}>\n {actionLabel}\n </ActionButton>\n </div>\n </div>\n </CanvasPortal>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA+BQ;AA7BR,mBAA0B;AAC1B,2BAA6B;AAC7B,0BAA6C;AAC7C,sBAA6B;AAC7B,2BAA8B;AAC9B,mBAAkC;AAElC,MAAM,iBAAiB;AAEhB,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AACF,GAMG;AACD,QAAM,EAAE,YAAY,QAAI,gCAAkB;AAC1C,8BAAU,MAAM;AACd,sCAAa;AAAA,EACf,GAAG,CAAC,CAAC;AACL,SACE,4CAAC,oCACC,uDAAC,SAAI,WAAU,uDAAsD,SAAS,SAC5E;AAAA,gDAAC,sCAAe;AAAA,IAChB,6CAAC,SAAI,WAAU,gEAA+D,SAAS,CAAC,MAAM,EAAE,gBAAgB,GAC9G;AAAA,mDAAC,SAAI,MAAK,UACR;AAAA,oDAAC,QAAG,WAAU,gFAAgF,iBAAM;AAAA,QACpG,4CAAC,OAAE,WAAU,wDAAwD,mBAAQ;AAAA,SAC/E;AAAA,MACC,UACC;AAAA,QAAC;AAAA;AAAA,UACC,UAAM,oCAAc,aAAa,MAAM;AAAA,UACvC,QAAO;AAAA,UACP,KAAI;AAAA,UACJ,WAAU;AAAA,UACX;AAAA;AAAA,MAED;AAAA,MAEF,4CAAC,qCAAa,KAAG,MAAC,SAAS,SAAS,WAAU,eAAc,OAAO,EAAE,aAAa,eAAe,GAC9F,uBACH;AAAA,OACF;AAAA,KACF,GACF;AAEJ;","names":[]}
|