@medialane/ui 0.291.0 → 0.293.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/account/input-otp.d.cts +2 -2
- package/dist/components/account/input-otp.d.ts +2 -2
- package/dist/components/action-button.cjs +3 -30
- package/dist/components/action-button.cjs.map +1 -1
- package/dist/components/action-button.d.cts +1 -2
- package/dist/components/action-button.d.ts +1 -2
- package/dist/components/action-button.js +1 -28
- package/dist/components/action-button.js.map +1 -1
- package/dist/components/button.d.cts +2 -2
- package/dist/components/button.d.ts +2 -2
- package/dist/components/drop/create/launch-dialog.cjs +10 -7
- package/dist/components/drop/create/launch-dialog.cjs.map +1 -1
- package/dist/components/drop/create/launch-dialog.js +10 -7
- package/dist/components/drop/create/launch-dialog.js.map +1 -1
- package/dist/components/drop/page/drop-manage.cjs +6 -3
- package/dist/components/drop/page/drop-manage.cjs.map +1 -1
- package/dist/components/drop/page/drop-manage.js +6 -3
- package/dist/components/drop/page/drop-manage.js.map +1 -1
- package/dist/components/drop/page/drop-mint-dialog.cjs +9 -6
- package/dist/components/drop/page/drop-mint-dialog.cjs.map +1 -1
- package/dist/components/drop/page/drop-mint-dialog.js +9 -6
- package/dist/components/drop/page/drop-mint-dialog.js.map +1 -1
- package/dist/components/fast-mint/fast-mint.cjs +6 -13
- package/dist/components/fast-mint/fast-mint.cjs.map +1 -1
- package/dist/components/fast-mint/fast-mint.d.cts +2 -2
- package/dist/components/fast-mint/fast-mint.d.ts +2 -2
- package/dist/components/fast-mint/fast-mint.js +7 -15
- package/dist/components/fast-mint/fast-mint.js.map +1 -1
- package/dist/components/gated-content.cjs +2 -1
- package/dist/components/gated-content.cjs.map +1 -1
- package/dist/components/gated-content.js +2 -1
- package/dist/components/gated-content.js.map +1 -1
- package/dist/components/launchpad/edition-mint-schema.d.cts +2 -2
- package/dist/components/launchpad/edition-mint-schema.d.ts +2 -2
- package/dist/components/media-wallet/action-button.cjs +0 -18
- package/dist/components/media-wallet/action-button.cjs.map +1 -1
- package/dist/components/media-wallet/action-button.d.cts +1 -3
- package/dist/components/media-wallet/action-button.d.ts +1 -3
- package/dist/components/media-wallet/action-button.js +0 -16
- package/dist/components/media-wallet/action-button.js.map +1 -1
- package/dist/components/media-wallet/activate-card.cjs +2 -2
- package/dist/components/media-wallet/activate-card.cjs.map +1 -1
- package/dist/components/media-wallet/activate-card.js +1 -1
- package/dist/components/media-wallet/activate-card.js.map +1 -1
- package/dist/components/media-wallet/media-wallet-activity.cjs +4 -6
- package/dist/components/media-wallet/media-wallet-activity.cjs.map +1 -1
- package/dist/components/media-wallet/media-wallet-activity.js +4 -6
- package/dist/components/media-wallet/media-wallet-activity.js.map +1 -1
- package/dist/components/media-wallet/media-wallet-home.cjs +2 -1
- package/dist/components/media-wallet/media-wallet-home.cjs.map +1 -1
- package/dist/components/media-wallet/media-wallet-home.js +2 -1
- package/dist/components/media-wallet/media-wallet-home.js.map +1 -1
- package/dist/components/media-wallet/quick-action.cjs +3 -3
- package/dist/components/media-wallet/quick-action.cjs.map +1 -1
- package/dist/components/media-wallet/quick-action.d.cts +1 -1
- package/dist/components/media-wallet/quick-action.d.ts +1 -1
- package/dist/components/media-wallet/quick-action.js +1 -1
- package/dist/components/media-wallet/quick-action.js.map +1 -1
- package/dist/components/media-wallet/success-dialog.cjs +2 -2
- package/dist/components/media-wallet/success-dialog.cjs.map +1 -1
- package/dist/components/media-wallet/success-dialog.js +1 -1
- package/dist/components/media-wallet/success-dialog.js.map +1 -1
- package/dist/components/media-wallet/wallet-activity-icon.cjs +5 -4
- package/dist/components/media-wallet/wallet-activity-icon.cjs.map +1 -1
- package/dist/components/media-wallet/wallet-activity-icon.js +5 -4
- package/dist/components/media-wallet/wallet-activity-icon.js.map +1 -1
- package/dist/components/medialane-collection-card.cjs +6 -6
- package/dist/components/medialane-collection-card.cjs.map +1 -1
- package/dist/components/medialane-collection-card.js +6 -6
- package/dist/components/medialane-collection-card.js.map +1 -1
- package/dist/components/sheet.d.cts +1 -1
- package/dist/components/sheet.d.ts +1 -1
- package/dist/components/transaction-dialog.cjs +2 -10
- package/dist/components/transaction-dialog.cjs.map +1 -1
- package/dist/components/transaction-dialog.js +2 -10
- package/dist/components/transaction-dialog.js.map +1 -1
- package/dist/components/wallet/self-fund-consent-dialog.cjs +6 -4
- package/dist/components/wallet/self-fund-consent-dialog.cjs.map +1 -1
- package/dist/components/wallet/self-fund-consent-dialog.js +6 -4
- package/dist/components/wallet/self-fund-consent-dialog.js.map +1 -1
- package/dist/data/brand.cjs +54 -2
- package/dist/data/brand.cjs.map +1 -1
- package/dist/data/brand.d.cts +16 -1
- package/dist/data/brand.d.ts +16 -1
- package/dist/data/brand.js +47 -1
- package/dist/data/brand.js.map +1 -1
- package/dist/index.cjs +14 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -2
- package/dist/index.d.ts +3 -2
- package/dist/index.js +9 -3
- package/dist/index.js.map +1 -1
- package/dist/medialane.css +14 -23
- package/dist/utils/use-confetti.cjs +36 -0
- package/dist/utils/use-confetti.cjs.map +1 -0
- package/dist/utils/use-confetti.d.cts +3 -0
- package/dist/utils/use-confetti.d.ts +3 -0
- package/dist/utils/use-confetti.js +12 -0
- package/dist/utils/use-confetti.js.map +1 -0
- package/package.json +1 -1
- package/dist/components/action-dialog.cjs +0 -70
- package/dist/components/action-dialog.cjs.map +0 -1
- package/dist/components/action-dialog.d.cts +0 -12
- package/dist/components/action-dialog.d.ts +0 -12
- package/dist/components/action-dialog.js +0 -46
- package/dist/components/action-dialog.js.map +0 -1
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
2
|
|
|
3
|
-
declare const ACTION_GRADIENTS: Record<string, [string, string, string]>;
|
|
4
|
-
declare const ACTION_FOREGROUNDS: Record<string, string>;
|
|
5
3
|
declare function TrustNote({ children, center }: {
|
|
6
4
|
children: React.ReactNode;
|
|
7
5
|
center?: boolean;
|
|
8
6
|
}): react_jsx_runtime.JSX.Element;
|
|
9
7
|
|
|
10
|
-
export {
|
|
8
|
+
export { TrustNote };
|
|
@@ -1,19 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
-
const ACTION_GRADIENTS = {
|
|
4
|
-
buy: ["#3b7bff", "#8a5cf6", "#3b7bff"],
|
|
5
|
-
submit: ["#d6359a", "#5b4ce6", "#d6359a"],
|
|
6
|
-
offer: ["#f6608f", "#fb8b46", "#f6608f"],
|
|
7
|
-
remix: ["#8a5cf6", "#f6608f", "#8a5cf6"],
|
|
8
|
-
license: ["#3b7bff", "#5b4ce6", "#3b7bff"]
|
|
9
|
-
};
|
|
10
|
-
const ACTION_FOREGROUNDS = {
|
|
11
|
-
buy: "#3b7bff",
|
|
12
|
-
submit: "#5b4ce6",
|
|
13
|
-
offer: "#fb7a32",
|
|
14
|
-
remix: "#8a3ff0",
|
|
15
|
-
license: "#3b7bff"
|
|
16
|
-
};
|
|
17
3
|
function TrustNote({ children, center }) {
|
|
18
4
|
return /* @__PURE__ */ jsxs("div", { className: `flex items-center gap-1.5 text-2xs leading-relaxed text-muted-foreground ${center ? "justify-center" : ""}`, children: [
|
|
19
5
|
/* @__PURE__ */ jsx("svg", { width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", className: "flex-shrink-0", children: /* @__PURE__ */ jsx("path", { d: "M12 2l7 4v6c0 5-3.5 8-7 10-3.5-2-7-5-7-10V6z" }) }),
|
|
@@ -21,8 +7,6 @@ function TrustNote({ children, center }) {
|
|
|
21
7
|
] });
|
|
22
8
|
}
|
|
23
9
|
export {
|
|
24
|
-
ACTION_FOREGROUNDS,
|
|
25
|
-
ACTION_GRADIENTS,
|
|
26
10
|
TrustNote
|
|
27
11
|
};
|
|
28
12
|
//# sourceMappingURL=action-button.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/media-wallet/action-button.tsx"],"sourcesContent":["\"use client\";\n\nexport
|
|
1
|
+
{"version":3,"sources":["../../../src/components/media-wallet/action-button.tsx"],"sourcesContent":["\"use client\";\n\nexport function TrustNote({ children, center }: { children: React.ReactNode; center?: boolean }) {\n return (\n <div className={`flex items-center gap-1.5 text-2xs leading-relaxed text-muted-foreground ${center ? \"justify-center\" : \"\"}`}>\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" className=\"flex-shrink-0\">\n <path d=\"M12 2l7 4v6c0 5-3.5 8-7 10-3.5-2-7-5-7-10V6z\" />\n </svg>\n <span>{children}</span>\n </div>\n );\n}\n"],"mappings":";AAII,SAEI,KAFJ;AAFG,SAAS,UAAU,EAAE,UAAU,OAAO,GAAoD;AAC/F,SACE,qBAAC,SAAI,WAAW,4EAA4E,SAAS,mBAAmB,EAAE,IACxH;AAAA,wBAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,KAAI,WAAU,iBAC1G,8BAAC,UAAK,GAAE,gDAA+C,GACzD;AAAA,IACA,oBAAC,UAAM,UAAS;AAAA,KAClB;AAEJ;","names":[]}
|
|
@@ -26,8 +26,8 @@ var import_jsx_runtime = require("react/jsx-runtime");
|
|
|
26
26
|
var import_react = require("react");
|
|
27
27
|
var import_action_button = require("../action-button.js");
|
|
28
28
|
var import_describe_error = require("../../utils/describe-error.js");
|
|
29
|
+
var import_brand = require("../../data/brand.js");
|
|
29
30
|
var import_types = require("./types.js");
|
|
30
|
-
const BRAND_GRADIENT = "linear-gradient(115deg,#3b7bff,#8a5cf6,#f6608f,#fb8b46,#3b7bff)";
|
|
31
31
|
function ActivateCard({ onActivated }) {
|
|
32
32
|
const { wallet } = (0, import_types.useMediaWalletApp)();
|
|
33
33
|
const [busy, setBusy] = (0, import_react.useState)(false);
|
|
@@ -54,7 +54,7 @@ function ActivateCard({ onActivated }) {
|
|
|
54
54
|
onClick: activate,
|
|
55
55
|
disabled: busy,
|
|
56
56
|
className: "w-full disabled:opacity-40 disabled:pointer-events-none",
|
|
57
|
-
style: { "--ml-grad": BRAND_GRADIENT },
|
|
57
|
+
style: { "--ml-grad": import_brand.BRAND_GRADIENT },
|
|
58
58
|
children: [
|
|
59
59
|
busy && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "h-4 w-4 animate-spin rounded-full border-2 border-foreground/25 border-t-foreground" }),
|
|
60
60
|
"Activate my wallet"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/media-wallet/activate-card.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { ActionButton } from \"../action-button.js\";\nimport { describeError } from \"../../utils/describe-error.js\";\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../src/components/media-wallet/activate-card.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { ActionButton } from \"../action-button.js\";\nimport { describeError } from \"../../utils/describe-error.js\";\nimport { BRAND_GRADIENT } from \"../../data/brand.js\";\nimport { useMediaWalletApp } from \"./types.js\";\n\nexport function ActivateCard({ onActivated }: { onActivated: (txHash?: string) => void }) {\n const { wallet } = useMediaWalletApp();\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const activate = async () => {\n setError(null);\n setBusy(true);\n try {\n await wallet.completeDeployment(() => {});\n onActivated();\n } catch (e) {\n setError(describeError(e).message);\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <div className=\"card-base p-5\">\n <div className=\"flex flex-col items-center gap-3 text-center\">\n <ActionButton\n action=\"buy\"\n big\n onClick={activate}\n disabled={busy}\n className=\"w-full disabled:opacity-40 disabled:pointer-events-none\"\n style={{ \"--ml-grad\": BRAND_GRADIENT } as React.CSSProperties}\n >\n {busy && <span className=\"h-4 w-4 animate-spin rounded-full border-2 border-foreground/25 border-t-foreground\" />}\n Activate my wallet\n </ActionButton>\n <p className=\"mx-auto max-w-[22rem] text-sm leading-relaxed text-muted-foreground\">\n Your account is stored securely and ready whenever you need it. Activating is free — no gas fees.\n </p>\n {error && <p className=\"text-xs text-destructive\">{error}</p>}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA6BQ;AA3BR,mBAAyB;AACzB,2BAA6B;AAC7B,4BAA8B;AAC9B,mBAA+B;AAC/B,mBAAkC;AAE3B,SAAS,aAAa,EAAE,YAAY,GAA+C;AACxF,QAAM,EAAE,OAAO,QAAI,gCAAkB;AACrC,QAAM,CAAC,MAAM,OAAO,QAAI,uBAAS,KAAK;AACtC,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAwB,IAAI;AAEtD,QAAM,WAAW,YAAY;AAC3B,aAAS,IAAI;AACb,YAAQ,IAAI;AACZ,QAAI;AACF,YAAM,OAAO,mBAAmB,MAAM;AAAA,MAAC,CAAC;AACxC,kBAAY;AAAA,IACd,SAAS,GAAG;AACV,mBAAS,qCAAc,CAAC,EAAE,OAAO;AAAA,IACnC,UAAE;AACA,cAAQ,KAAK;AAAA,IACf;AAAA,EACF;AAEA,SACE,4CAAC,SAAI,WAAU,iBACb,uDAAC,SAAI,WAAU,gDACb;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,QAAO;AAAA,QACP,KAAG;AAAA,QACH,SAAS;AAAA,QACT,UAAU;AAAA,QACV,WAAU;AAAA,QACV,OAAO,EAAE,aAAa,4BAAe;AAAA,QAEpC;AAAA,kBAAQ,4CAAC,UAAK,WAAU,uFAAsF;AAAA,UAAG;AAAA;AAAA;AAAA,IAEpH;AAAA,IACA,4CAAC,OAAE,WAAU,uEAAsE,oHAEnF;AAAA,IACC,SAAS,4CAAC,OAAE,WAAU,4BAA4B,iBAAM;AAAA,KAC3D,GACF;AAEJ;","names":[]}
|
|
@@ -3,8 +3,8 @@ import { jsx, jsxs } from "react/jsx-runtime";
|
|
|
3
3
|
import { useState } from "react";
|
|
4
4
|
import { ActionButton } from "../action-button.js";
|
|
5
5
|
import { describeError } from "../../utils/describe-error.js";
|
|
6
|
+
import { BRAND_GRADIENT } from "../../data/brand.js";
|
|
6
7
|
import { useMediaWalletApp } from "./types.js";
|
|
7
|
-
const BRAND_GRADIENT = "linear-gradient(115deg,#3b7bff,#8a5cf6,#f6608f,#fb8b46,#3b7bff)";
|
|
8
8
|
function ActivateCard({ onActivated }) {
|
|
9
9
|
const { wallet } = useMediaWalletApp();
|
|
10
10
|
const [busy, setBusy] = useState(false);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/media-wallet/activate-card.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { ActionButton } from \"../action-button.js\";\nimport { describeError } from \"../../utils/describe-error.js\";\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../src/components/media-wallet/activate-card.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { ActionButton } from \"../action-button.js\";\nimport { describeError } from \"../../utils/describe-error.js\";\nimport { BRAND_GRADIENT } from \"../../data/brand.js\";\nimport { useMediaWalletApp } from \"./types.js\";\n\nexport function ActivateCard({ onActivated }: { onActivated: (txHash?: string) => void }) {\n const { wallet } = useMediaWalletApp();\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const activate = async () => {\n setError(null);\n setBusy(true);\n try {\n await wallet.completeDeployment(() => {});\n onActivated();\n } catch (e) {\n setError(describeError(e).message);\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <div className=\"card-base p-5\">\n <div className=\"flex flex-col items-center gap-3 text-center\">\n <ActionButton\n action=\"buy\"\n big\n onClick={activate}\n disabled={busy}\n className=\"w-full disabled:opacity-40 disabled:pointer-events-none\"\n style={{ \"--ml-grad\": BRAND_GRADIENT } as React.CSSProperties}\n >\n {busy && <span className=\"h-4 w-4 animate-spin rounded-full border-2 border-foreground/25 border-t-foreground\" />}\n Activate my wallet\n </ActionButton>\n <p className=\"mx-auto max-w-[22rem] text-sm leading-relaxed text-muted-foreground\">\n Your account is stored securely and ready whenever you need it. Activating is free — no gas fees.\n </p>\n {error && <p className=\"text-xs text-destructive\">{error}</p>}\n </div>\n </div>\n );\n}\n"],"mappings":";AA6BQ,SAQW,KARX;AA3BR,SAAS,gBAAgB;AACzB,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAC9B,SAAS,sBAAsB;AAC/B,SAAS,yBAAyB;AAE3B,SAAS,aAAa,EAAE,YAAY,GAA+C;AACxF,QAAM,EAAE,OAAO,IAAI,kBAAkB;AACrC,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AACtC,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAwB,IAAI;AAEtD,QAAM,WAAW,YAAY;AAC3B,aAAS,IAAI;AACb,YAAQ,IAAI;AACZ,QAAI;AACF,YAAM,OAAO,mBAAmB,MAAM;AAAA,MAAC,CAAC;AACxC,kBAAY;AAAA,IACd,SAAS,GAAG;AACV,eAAS,cAAc,CAAC,EAAE,OAAO;AAAA,IACnC,UAAE;AACA,cAAQ,KAAK;AAAA,IACf;AAAA,EACF;AAEA,SACE,oBAAC,SAAI,WAAU,iBACb,+BAAC,SAAI,WAAU,gDACb;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,QAAO;AAAA,QACP,KAAG;AAAA,QACH,SAAS;AAAA,QACT,UAAU;AAAA,QACV,WAAU;AAAA,QACV,OAAO,EAAE,aAAa,eAAe;AAAA,QAEpC;AAAA,kBAAQ,oBAAC,UAAK,WAAU,uFAAsF;AAAA,UAAG;AAAA;AAAA;AAAA,IAEpH;AAAA,IACA,oBAAC,OAAE,WAAU,uEAAsE,oHAEnF;AAAA,IACC,SAAS,oBAAC,OAAE,WAAU,4BAA4B,iBAAM;AAAA,KAC3D,GACF;AAEJ;","names":[]}
|
|
@@ -45,13 +45,11 @@ var import_wallet_activity_icon = require("./wallet-activity-icon.js");
|
|
|
45
45
|
var import_action_modal = require("./action-modal.js");
|
|
46
46
|
var import_types = require("./types.js");
|
|
47
47
|
var import_medialane_app = require("../medialane-app.js");
|
|
48
|
+
var import_brand = require("../../data/brand.js");
|
|
48
49
|
var import_empty_messages = require("../../utils/empty-messages.js");
|
|
49
|
-
const GRADS = [
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
"linear-gradient(135deg,#f6608f,#fb8b46)",
|
|
53
|
-
"linear-gradient(135deg,#5b4ce6,#3b7bff)"
|
|
54
|
-
];
|
|
50
|
+
const GRADS = [["blue", "purple"], ["purple", "rose"], ["rose", "orange"], ["purple", "blue"]].map(
|
|
51
|
+
([from, to]) => `linear-gradient(135deg, ${import_brand.BRAND_COLOR[from]}, ${import_brand.BRAND_COLOR[to]})`
|
|
52
|
+
);
|
|
55
53
|
const gradFor = (seed) => {
|
|
56
54
|
let h = 0;
|
|
57
55
|
for (let i = 0; i < seed.length; i++) h = h * 31 + seed.charCodeAt(i) | 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/media-wallet/media-wallet-activity.tsx"],"sourcesContent":["\"use client\";\n\nimport { describeError } from \"../../utils/describe-error.js\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport Image from \"../image.js\";\nimport type { ApiWalletActivity, ApiActivity } from \"@medialane/sdk\";\nimport { getTokenBySymbol } from \"@medialane/sdk\";\nimport { mergeActivityFeeds, type MergedActivityItem } from \"../../utils/media-wallet/activity-feed.js\";\nimport { walletActivityTitle, walletActivitySubtitle, walletActivityAmount } from \"../../utils/media-wallet/wallet-activity.js\";\nimport { short, when, explorerTxUrl, fmt } from \"../../utils/media-wallet/wallet-format.js\";\nimport { BackButton } from \"./back-button.js\";\nimport { WalletActivityIcon } from \"./wallet-activity-icon.js\";\nimport { ActionModal } from \"./action-modal.js\";\nimport { useMediaWalletApp, type MediaWalletView } from \"./types.js\";\nimport { useMedialaneApp } from \"../medialane-app.js\";\nimport { emptyMessages } from \"../../utils/empty-messages.js\";\n\nconst GRADS = [\n \"linear-gradient(135deg,#3b7bff,#8a5cf6)\",\n \"linear-gradient(135deg,#8a5cf6,#f6608f)\",\n \"linear-gradient(135deg,#f6608f,#fb8b46)\",\n \"linear-gradient(135deg,#5b4ce6,#3b7bff)\",\n];\nconst gradFor = (seed: string) => {\n let h = 0;\n for (let i = 0; i < seed.length; i++) h = (h * 31 + seed.charCodeAt(i)) | 0;\n return GRADS[Math.abs(h) % GRADS.length];\n};\n\nexport function MediaWalletActivity({ onNavigate }: { onNavigate: (view: MediaWalletView) => void }) {\n const { useWalletSession } = useMediaWalletApp();\n const { getClient } = useMedialaneApp();\n const { address } = useWalletSession();\n const [items, setItems] = useState<MergedActivityItem[] | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(false);\n const [selected, setSelected] = useState<ApiWalletActivity | null>(null);\n\n const load = useCallback(() => {\n if (!address) return;\n let live = true;\n setLoading(true);\n setError(null);\n (async () => {\n try {\n const client = getClient().api;\n const [walletRes, protocolRes] = await Promise.all([\n client.activity.wallet(address),\n client.activity.byAddress(address, { page: 1, limit: 50 }),\n ]);\n if (live) setItems(mergeActivityFeeds(walletRes.data, protocolRes.data));\n } catch (e) {\n if (live) setError(describeError(e).message);\n } finally {\n if (live) setLoading(false);\n }\n })();\n return () => { live = false; };\n }, [address, getClient]);\n\n useEffect(() => load(), [load]);\n\n return (\n <main className=\"flex flex-col gap-4 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\">Activity</h1>\n </div>\n\n {!address && <div className=\"text-sm text-muted-foreground\">No wallet found on this device.</div>}\n {error && <ActivityLoadError onRetry={load} />}\n {loading && !items && !error && <ActivityLoading />}\n {items && items.length === 0 && (\n <div>\n <p className=\"text-sm font-medium\">{emptyMessages.walletActivity.title}</p>\n <p className=\"text-sm text-muted-foreground\">{emptyMessages.walletActivity.description}</p>\n </div>\n )}\n\n {items && items.length > 0 && (\n <div className=\"flex flex-col gap-2\">\n {items.map((item) =>\n item.source === \"wallet\" ? (\n <WalletActivityRow key={item.data.id} a={item.data} timestamp={item.timestamp} onOpen={setSelected} />\n ) : (\n <ProtocolActivityRow key={`${item.data.txHash}-${item.data.type}`} item={item.data} />\n ),\n )}\n </div>\n )}\n\n {selected && <ActivityDetailModal a={selected} onClose={() => setSelected(null)} />}\n </main>\n );\n}\n\nfunction WalletActivityRow({\n a,\n timestamp,\n onOpen,\n}: {\n a: ApiWalletActivity;\n timestamp: string;\n onOpen: (a: ApiWalletActivity) => void;\n}) {\n const subtitle = walletActivitySubtitle(a);\n const amount = walletActivityAmount(a);\n return (\n <button\n onClick={() => onOpen(a)}\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 <WalletActivityIcon a={a} />\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm font-semibold\">{walletActivityTitle(a)}</div>\n {subtitle && <div className=\"truncate text-xs text-muted-foreground\">{subtitle}</div>}\n </div>\n <div className=\"shrink-0 text-right\">\n {amount && <div className=\"text-sm font-semibold tabular-nums\">{amount}</div>}\n <div className=\"text-xs text-muted-foreground\">{when(timestamp)}</div>\n </div>\n </button>\n );\n}\n\nfunction ActivityDetailModal({ a, onClose }: { a: ApiWalletActivity; onClose: () => void }) {\n const { explorerUrl } = useMediaWalletApp();\n const [copied, setCopied] = useState(false);\n const subtitle = walletActivitySubtitle(a);\n const amount = walletActivityAmount(a);\n const fullDate = new Date(a.timestamp).toLocaleString(undefined, {\n dateStyle: \"medium\",\n timeStyle: \"short\",\n });\n\n const copyHash = () => {\n navigator.clipboard?.writeText(a.txHash).catch(() => {});\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n };\n\n return (\n <ActionModal title={walletActivityTitle(a)} onClose={onClose}>\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex flex-col items-center gap-2 py-2 text-center\">\n <WalletActivityIcon a={a} />\n {amount && <div className=\"text-2xl font-bold tabular-nums\">{amount}</div>}\n {subtitle && <div className=\"text-sm text-muted-foreground\">{subtitle}</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\">\n <span className=\"text-xs text-muted-foreground\">Date</span>\n <span className=\"text-sm font-medium\">{fullDate}</span>\n </div>\n <div className=\"flex items-center justify-between py-3\">\n <span className=\"text-xs text-muted-foreground\">Transaction</span>\n <button onClick={copyHash} className=\"font-mono text-sm font-medium transition-opacity active:opacity-60\">\n {copied ? \"Copied ✓\" : short(a.txHash)}\n </button>\n </div>\n </div>\n\n <a\n href={explorerTxUrl(explorerUrl, a.txHash)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-center text-xs font-medium text-muted-foreground underline underline-offset-2\"\n >\n View on Voyager ↗\n </a>\n </div>\n </ActionModal>\n );\n}\n\nfunction ProtocolActivityRow({ item }: { item: ApiActivity }) {\n const { resolveImage } = useMediaWalletApp();\n const img = resolveImage(item.token?.image ?? null);\n const seed = item.txHash ?? item.orderHash ?? item.type;\n return (\n <div className=\"flex items-center gap-3 rounded-2xl bg-card/40 px-4 py-3 backdrop-blur-sm\">\n <div className=\"relative h-11 w-11 shrink-0 overflow-hidden rounded-2xl\" style={img ? undefined : { background: gradFor(seed) }}>\n {img && (\n <Image src={img} alt=\"\" fill className=\"object-cover\" />\n )}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm font-semibold capitalize\">{item.type}</div>\n {item.token?.name && <div className=\"truncate text-xs text-muted-foreground\">{item.token.name}</div>}\n </div>\n <div className=\"shrink-0 text-right\">\n {item.price?.raw && item.price.currency && (\n <div className=\"text-sm font-semibold tabular-nums\">\n {fmt(BigInt(item.price.raw), getTokenBySymbol(item.price.currency)?.decimals ?? 18)} <span className=\"text-xs text-muted-foreground\">{item.price.currency}</span>\n </div>\n )}\n <div className=\"text-xs text-muted-foreground\">{when(item.timestamp)}</div>\n </div>\n </div>\n );\n}\n\nfunction ActivityLoading() {\n return (\n <div className=\"flex min-h-[40vh] flex-col items-center justify-center gap-3\">\n <span className=\"h-6 w-6 animate-spin rounded-full border-2 border-border border-t-foreground\" />\n <div className=\"text-sm text-muted-foreground\">Loading your activity…</div>\n </div>\n );\n}\n\nfunction ActivityLoadError({ onRetry }: { onRetry: () => void }) {\n return (\n <div className=\"card-base flex flex-col items-center gap-3 px-6 py-8 text-center\">\n <div className=\"grid h-11 w-11 place-items-center rounded-2xl bg-destructive/10 text-destructive\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M10.3 3.9L2.3 18a2 2 0 001.7 3h16a2 2 0 001.7-3L13.7 3.9a2 2 0 00-3.4 0z\" />\n <path d=\"M12 9v4M12 17h.01\" />\n </svg>\n </div>\n <div>\n <div className=\"text-sm font-semibold\">Couldn't load your activity</div>\n <p className=\"mx-auto mt-1 max-w-[16rem] text-xs leading-relaxed text-muted-foreground\">\n There was a problem reaching the server. Check your connection and try again.\n </p>\n </div>\n <button\n onClick={onRetry}\n className=\"rounded-full border border-border px-4 py-2 text-xs font-semibold text-foreground transition-colors hover:bg-card\"\n >\n Try again\n </button>\n </div>\n );\n}\n"],"mappings":"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","names":["Image"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/media-wallet/media-wallet-activity.tsx"],"sourcesContent":["\"use client\";\n\nimport { describeError } from \"../../utils/describe-error.js\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport Image from \"../image.js\";\nimport type { ApiWalletActivity, ApiActivity } from \"@medialane/sdk\";\nimport { getTokenBySymbol } from \"@medialane/sdk\";\nimport { mergeActivityFeeds, type MergedActivityItem } from \"../../utils/media-wallet/activity-feed.js\";\nimport { walletActivityTitle, walletActivitySubtitle, walletActivityAmount } from \"../../utils/media-wallet/wallet-activity.js\";\nimport { short, when, explorerTxUrl, fmt } from \"../../utils/media-wallet/wallet-format.js\";\nimport { BackButton } from \"./back-button.js\";\nimport { WalletActivityIcon } from \"./wallet-activity-icon.js\";\nimport { ActionModal } from \"./action-modal.js\";\nimport { useMediaWalletApp, type MediaWalletView } from \"./types.js\";\nimport { useMedialaneApp } from \"../medialane-app.js\";\nimport { BRAND_COLOR } from \"../../data/brand.js\";\nimport { emptyMessages } from \"../../utils/empty-messages.js\";\n\nconst GRADS = ([[\"blue\", \"purple\"], [\"purple\", \"rose\"], [\"rose\", \"orange\"], [\"purple\", \"blue\"]] as const).map(\n ([from, to]) => `linear-gradient(135deg, ${BRAND_COLOR[from]}, ${BRAND_COLOR[to]})`,\n);\nconst gradFor = (seed: string) => {\n let h = 0;\n for (let i = 0; i < seed.length; i++) h = (h * 31 + seed.charCodeAt(i)) | 0;\n return GRADS[Math.abs(h) % GRADS.length];\n};\n\nexport function MediaWalletActivity({ onNavigate }: { onNavigate: (view: MediaWalletView) => void }) {\n const { useWalletSession } = useMediaWalletApp();\n const { getClient } = useMedialaneApp();\n const { address } = useWalletSession();\n const [items, setItems] = useState<MergedActivityItem[] | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(false);\n const [selected, setSelected] = useState<ApiWalletActivity | null>(null);\n\n const load = useCallback(() => {\n if (!address) return;\n let live = true;\n setLoading(true);\n setError(null);\n (async () => {\n try {\n const client = getClient().api;\n const [walletRes, protocolRes] = await Promise.all([\n client.activity.wallet(address),\n client.activity.byAddress(address, { page: 1, limit: 50 }),\n ]);\n if (live) setItems(mergeActivityFeeds(walletRes.data, protocolRes.data));\n } catch (e) {\n if (live) setError(describeError(e).message);\n } finally {\n if (live) setLoading(false);\n }\n })();\n return () => { live = false; };\n }, [address, getClient]);\n\n useEffect(() => load(), [load]);\n\n return (\n <main className=\"flex flex-col gap-4 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\">Activity</h1>\n </div>\n\n {!address && <div className=\"text-sm text-muted-foreground\">No wallet found on this device.</div>}\n {error && <ActivityLoadError onRetry={load} />}\n {loading && !items && !error && <ActivityLoading />}\n {items && items.length === 0 && (\n <div>\n <p className=\"text-sm font-medium\">{emptyMessages.walletActivity.title}</p>\n <p className=\"text-sm text-muted-foreground\">{emptyMessages.walletActivity.description}</p>\n </div>\n )}\n\n {items && items.length > 0 && (\n <div className=\"flex flex-col gap-2\">\n {items.map((item) =>\n item.source === \"wallet\" ? (\n <WalletActivityRow key={item.data.id} a={item.data} timestamp={item.timestamp} onOpen={setSelected} />\n ) : (\n <ProtocolActivityRow key={`${item.data.txHash}-${item.data.type}`} item={item.data} />\n ),\n )}\n </div>\n )}\n\n {selected && <ActivityDetailModal a={selected} onClose={() => setSelected(null)} />}\n </main>\n );\n}\n\nfunction WalletActivityRow({\n a,\n timestamp,\n onOpen,\n}: {\n a: ApiWalletActivity;\n timestamp: string;\n onOpen: (a: ApiWalletActivity) => void;\n}) {\n const subtitle = walletActivitySubtitle(a);\n const amount = walletActivityAmount(a);\n return (\n <button\n onClick={() => onOpen(a)}\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 <WalletActivityIcon a={a} />\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm font-semibold\">{walletActivityTitle(a)}</div>\n {subtitle && <div className=\"truncate text-xs text-muted-foreground\">{subtitle}</div>}\n </div>\n <div className=\"shrink-0 text-right\">\n {amount && <div className=\"text-sm font-semibold tabular-nums\">{amount}</div>}\n <div className=\"text-xs text-muted-foreground\">{when(timestamp)}</div>\n </div>\n </button>\n );\n}\n\nfunction ActivityDetailModal({ a, onClose }: { a: ApiWalletActivity; onClose: () => void }) {\n const { explorerUrl } = useMediaWalletApp();\n const [copied, setCopied] = useState(false);\n const subtitle = walletActivitySubtitle(a);\n const amount = walletActivityAmount(a);\n const fullDate = new Date(a.timestamp).toLocaleString(undefined, {\n dateStyle: \"medium\",\n timeStyle: \"short\",\n });\n\n const copyHash = () => {\n navigator.clipboard?.writeText(a.txHash).catch(() => {});\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n };\n\n return (\n <ActionModal title={walletActivityTitle(a)} onClose={onClose}>\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex flex-col items-center gap-2 py-2 text-center\">\n <WalletActivityIcon a={a} />\n {amount && <div className=\"text-2xl font-bold tabular-nums\">{amount}</div>}\n {subtitle && <div className=\"text-sm text-muted-foreground\">{subtitle}</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\">\n <span className=\"text-xs text-muted-foreground\">Date</span>\n <span className=\"text-sm font-medium\">{fullDate}</span>\n </div>\n <div className=\"flex items-center justify-between py-3\">\n <span className=\"text-xs text-muted-foreground\">Transaction</span>\n <button onClick={copyHash} className=\"font-mono text-sm font-medium transition-opacity active:opacity-60\">\n {copied ? \"Copied ✓\" : short(a.txHash)}\n </button>\n </div>\n </div>\n\n <a\n href={explorerTxUrl(explorerUrl, a.txHash)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-center text-xs font-medium text-muted-foreground underline underline-offset-2\"\n >\n View on Voyager ↗\n </a>\n </div>\n </ActionModal>\n );\n}\n\nfunction ProtocolActivityRow({ item }: { item: ApiActivity }) {\n const { resolveImage } = useMediaWalletApp();\n const img = resolveImage(item.token?.image ?? null);\n const seed = item.txHash ?? item.orderHash ?? item.type;\n return (\n <div className=\"flex items-center gap-3 rounded-2xl bg-card/40 px-4 py-3 backdrop-blur-sm\">\n <div className=\"relative h-11 w-11 shrink-0 overflow-hidden rounded-2xl\" style={img ? undefined : { background: gradFor(seed) }}>\n {img && (\n <Image src={img} alt=\"\" fill className=\"object-cover\" />\n )}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm font-semibold capitalize\">{item.type}</div>\n {item.token?.name && <div className=\"truncate text-xs text-muted-foreground\">{item.token.name}</div>}\n </div>\n <div className=\"shrink-0 text-right\">\n {item.price?.raw && item.price.currency && (\n <div className=\"text-sm font-semibold tabular-nums\">\n {fmt(BigInt(item.price.raw), getTokenBySymbol(item.price.currency)?.decimals ?? 18)} <span className=\"text-xs text-muted-foreground\">{item.price.currency}</span>\n </div>\n )}\n <div className=\"text-xs text-muted-foreground\">{when(item.timestamp)}</div>\n </div>\n </div>\n );\n}\n\nfunction ActivityLoading() {\n return (\n <div className=\"flex min-h-[40vh] flex-col items-center justify-center gap-3\">\n <span className=\"h-6 w-6 animate-spin rounded-full border-2 border-border border-t-foreground\" />\n <div className=\"text-sm text-muted-foreground\">Loading your activity…</div>\n </div>\n );\n}\n\nfunction ActivityLoadError({ onRetry }: { onRetry: () => void }) {\n return (\n <div className=\"card-base flex flex-col items-center gap-3 px-6 py-8 text-center\">\n <div className=\"grid h-11 w-11 place-items-center rounded-2xl bg-destructive/10 text-destructive\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M10.3 3.9L2.3 18a2 2 0 001.7 3h16a2 2 0 001.7-3L13.7 3.9a2 2 0 00-3.4 0z\" />\n <path d=\"M12 9v4M12 17h.01\" />\n </svg>\n </div>\n <div>\n <div className=\"text-sm font-semibold\">Couldn't load your activity</div>\n <p className=\"mx-auto mt-1 max-w-[16rem] text-xs leading-relaxed text-muted-foreground\">\n There was a problem reaching the server. Check your connection and try again.\n </p>\n </div>\n <button\n onClick={onRetry}\n className=\"rounded-full border border-border px-4 py-2 text-xs font-semibold text-foreground transition-colors hover:bg-card\"\n >\n Try again\n </button>\n </div>\n );\n}\n"],"mappings":"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","names":["Image"]}
|
|
@@ -12,13 +12,11 @@ import { WalletActivityIcon } from "./wallet-activity-icon.js";
|
|
|
12
12
|
import { ActionModal } from "./action-modal.js";
|
|
13
13
|
import { useMediaWalletApp } from "./types.js";
|
|
14
14
|
import { useMedialaneApp } from "../medialane-app.js";
|
|
15
|
+
import { BRAND_COLOR } from "../../data/brand.js";
|
|
15
16
|
import { emptyMessages } from "../../utils/empty-messages.js";
|
|
16
|
-
const GRADS = [
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
"linear-gradient(135deg,#f6608f,#fb8b46)",
|
|
20
|
-
"linear-gradient(135deg,#5b4ce6,#3b7bff)"
|
|
21
|
-
];
|
|
17
|
+
const GRADS = [["blue", "purple"], ["purple", "rose"], ["rose", "orange"], ["purple", "blue"]].map(
|
|
18
|
+
([from, to]) => `linear-gradient(135deg, ${BRAND_COLOR[from]}, ${BRAND_COLOR[to]})`
|
|
19
|
+
);
|
|
22
20
|
const gradFor = (seed) => {
|
|
23
21
|
let h = 0;
|
|
24
22
|
for (let i = 0; i < seed.length; i++) h = h * 31 + seed.charCodeAt(i) | 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/media-wallet/media-wallet-activity.tsx"],"sourcesContent":["\"use client\";\n\nimport { describeError } from \"../../utils/describe-error.js\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport Image from \"../image.js\";\nimport type { ApiWalletActivity, ApiActivity } from \"@medialane/sdk\";\nimport { getTokenBySymbol } from \"@medialane/sdk\";\nimport { mergeActivityFeeds, type MergedActivityItem } from \"../../utils/media-wallet/activity-feed.js\";\nimport { walletActivityTitle, walletActivitySubtitle, walletActivityAmount } from \"../../utils/media-wallet/wallet-activity.js\";\nimport { short, when, explorerTxUrl, fmt } from \"../../utils/media-wallet/wallet-format.js\";\nimport { BackButton } from \"./back-button.js\";\nimport { WalletActivityIcon } from \"./wallet-activity-icon.js\";\nimport { ActionModal } from \"./action-modal.js\";\nimport { useMediaWalletApp, type MediaWalletView } from \"./types.js\";\nimport { useMedialaneApp } from \"../medialane-app.js\";\nimport { emptyMessages } from \"../../utils/empty-messages.js\";\n\nconst GRADS = [\n \"linear-gradient(135deg,#3b7bff,#8a5cf6)\",\n \"linear-gradient(135deg,#8a5cf6,#f6608f)\",\n \"linear-gradient(135deg,#f6608f,#fb8b46)\",\n \"linear-gradient(135deg,#5b4ce6,#3b7bff)\",\n];\nconst gradFor = (seed: string) => {\n let h = 0;\n for (let i = 0; i < seed.length; i++) h = (h * 31 + seed.charCodeAt(i)) | 0;\n return GRADS[Math.abs(h) % GRADS.length];\n};\n\nexport function MediaWalletActivity({ onNavigate }: { onNavigate: (view: MediaWalletView) => void }) {\n const { useWalletSession } = useMediaWalletApp();\n const { getClient } = useMedialaneApp();\n const { address } = useWalletSession();\n const [items, setItems] = useState<MergedActivityItem[] | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(false);\n const [selected, setSelected] = useState<ApiWalletActivity | null>(null);\n\n const load = useCallback(() => {\n if (!address) return;\n let live = true;\n setLoading(true);\n setError(null);\n (async () => {\n try {\n const client = getClient().api;\n const [walletRes, protocolRes] = await Promise.all([\n client.activity.wallet(address),\n client.activity.byAddress(address, { page: 1, limit: 50 }),\n ]);\n if (live) setItems(mergeActivityFeeds(walletRes.data, protocolRes.data));\n } catch (e) {\n if (live) setError(describeError(e).message);\n } finally {\n if (live) setLoading(false);\n }\n })();\n return () => { live = false; };\n }, [address, getClient]);\n\n useEffect(() => load(), [load]);\n\n return (\n <main className=\"flex flex-col gap-4 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\">Activity</h1>\n </div>\n\n {!address && <div className=\"text-sm text-muted-foreground\">No wallet found on this device.</div>}\n {error && <ActivityLoadError onRetry={load} />}\n {loading && !items && !error && <ActivityLoading />}\n {items && items.length === 0 && (\n <div>\n <p className=\"text-sm font-medium\">{emptyMessages.walletActivity.title}</p>\n <p className=\"text-sm text-muted-foreground\">{emptyMessages.walletActivity.description}</p>\n </div>\n )}\n\n {items && items.length > 0 && (\n <div className=\"flex flex-col gap-2\">\n {items.map((item) =>\n item.source === \"wallet\" ? (\n <WalletActivityRow key={item.data.id} a={item.data} timestamp={item.timestamp} onOpen={setSelected} />\n ) : (\n <ProtocolActivityRow key={`${item.data.txHash}-${item.data.type}`} item={item.data} />\n ),\n )}\n </div>\n )}\n\n {selected && <ActivityDetailModal a={selected} onClose={() => setSelected(null)} />}\n </main>\n );\n}\n\nfunction WalletActivityRow({\n a,\n timestamp,\n onOpen,\n}: {\n a: ApiWalletActivity;\n timestamp: string;\n onOpen: (a: ApiWalletActivity) => void;\n}) {\n const subtitle = walletActivitySubtitle(a);\n const amount = walletActivityAmount(a);\n return (\n <button\n onClick={() => onOpen(a)}\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 <WalletActivityIcon a={a} />\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm font-semibold\">{walletActivityTitle(a)}</div>\n {subtitle && <div className=\"truncate text-xs text-muted-foreground\">{subtitle}</div>}\n </div>\n <div className=\"shrink-0 text-right\">\n {amount && <div className=\"text-sm font-semibold tabular-nums\">{amount}</div>}\n <div className=\"text-xs text-muted-foreground\">{when(timestamp)}</div>\n </div>\n </button>\n );\n}\n\nfunction ActivityDetailModal({ a, onClose }: { a: ApiWalletActivity; onClose: () => void }) {\n const { explorerUrl } = useMediaWalletApp();\n const [copied, setCopied] = useState(false);\n const subtitle = walletActivitySubtitle(a);\n const amount = walletActivityAmount(a);\n const fullDate = new Date(a.timestamp).toLocaleString(undefined, {\n dateStyle: \"medium\",\n timeStyle: \"short\",\n });\n\n const copyHash = () => {\n navigator.clipboard?.writeText(a.txHash).catch(() => {});\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n };\n\n return (\n <ActionModal title={walletActivityTitle(a)} onClose={onClose}>\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex flex-col items-center gap-2 py-2 text-center\">\n <WalletActivityIcon a={a} />\n {amount && <div className=\"text-2xl font-bold tabular-nums\">{amount}</div>}\n {subtitle && <div className=\"text-sm text-muted-foreground\">{subtitle}</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\">\n <span className=\"text-xs text-muted-foreground\">Date</span>\n <span className=\"text-sm font-medium\">{fullDate}</span>\n </div>\n <div className=\"flex items-center justify-between py-3\">\n <span className=\"text-xs text-muted-foreground\">Transaction</span>\n <button onClick={copyHash} className=\"font-mono text-sm font-medium transition-opacity active:opacity-60\">\n {copied ? \"Copied ✓\" : short(a.txHash)}\n </button>\n </div>\n </div>\n\n <a\n href={explorerTxUrl(explorerUrl, a.txHash)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-center text-xs font-medium text-muted-foreground underline underline-offset-2\"\n >\n View on Voyager ↗\n </a>\n </div>\n </ActionModal>\n );\n}\n\nfunction ProtocolActivityRow({ item }: { item: ApiActivity }) {\n const { resolveImage } = useMediaWalletApp();\n const img = resolveImage(item.token?.image ?? null);\n const seed = item.txHash ?? item.orderHash ?? item.type;\n return (\n <div className=\"flex items-center gap-3 rounded-2xl bg-card/40 px-4 py-3 backdrop-blur-sm\">\n <div className=\"relative h-11 w-11 shrink-0 overflow-hidden rounded-2xl\" style={img ? undefined : { background: gradFor(seed) }}>\n {img && (\n <Image src={img} alt=\"\" fill className=\"object-cover\" />\n )}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm font-semibold capitalize\">{item.type}</div>\n {item.token?.name && <div className=\"truncate text-xs text-muted-foreground\">{item.token.name}</div>}\n </div>\n <div className=\"shrink-0 text-right\">\n {item.price?.raw && item.price.currency && (\n <div className=\"text-sm font-semibold tabular-nums\">\n {fmt(BigInt(item.price.raw), getTokenBySymbol(item.price.currency)?.decimals ?? 18)} <span className=\"text-xs text-muted-foreground\">{item.price.currency}</span>\n </div>\n )}\n <div className=\"text-xs text-muted-foreground\">{when(item.timestamp)}</div>\n </div>\n </div>\n );\n}\n\nfunction ActivityLoading() {\n return (\n <div className=\"flex min-h-[40vh] flex-col items-center justify-center gap-3\">\n <span className=\"h-6 w-6 animate-spin rounded-full border-2 border-border border-t-foreground\" />\n <div className=\"text-sm text-muted-foreground\">Loading your activity…</div>\n </div>\n );\n}\n\nfunction ActivityLoadError({ onRetry }: { onRetry: () => void }) {\n return (\n <div className=\"card-base flex flex-col items-center gap-3 px-6 py-8 text-center\">\n <div className=\"grid h-11 w-11 place-items-center rounded-2xl bg-destructive/10 text-destructive\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M10.3 3.9L2.3 18a2 2 0 001.7 3h16a2 2 0 001.7-3L13.7 3.9a2 2 0 00-3.4 0z\" />\n <path d=\"M12 9v4M12 17h.01\" />\n </svg>\n </div>\n <div>\n <div className=\"text-sm font-semibold\">Couldn't load your activity</div>\n <p className=\"mx-auto mt-1 max-w-[16rem] text-xs leading-relaxed text-muted-foreground\">\n There was a problem reaching the server. Check your connection and try again.\n </p>\n </div>\n <button\n onClick={onRetry}\n className=\"rounded-full border border-border px-4 py-2 text-xs font-semibold text-foreground transition-colors hover:bg-card\"\n >\n Try again\n </button>\n </div>\n );\n}\n"],"mappings":";AAgEM,SACE,KADF;AA9DN,SAAS,qBAAqB;AAC9B,SAAS,aAAa,WAAW,gBAAgB;AACjD,OAAO,WAAW;AAElB,SAAS,wBAAwB;AACjC,SAAS,0BAAmD;AAC5D,SAAS,qBAAqB,wBAAwB,4BAA4B;AAClF,SAAS,OAAO,MAAM,eAAe,WAAW;AAChD,SAAS,kBAAkB;AAC3B,SAAS,0BAA0B;AACnC,SAAS,mBAAmB;AAC5B,SAAS,yBAA+C;AACxD,SAAS,uBAAuB;AAChC,SAAS,qBAAqB;AAE9B,MAAM,QAAQ;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACA,MAAM,UAAU,CAAC,SAAiB;AAChC,MAAI,IAAI;AACR,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,IAAK,KAAK,IAAI,KAAK,KAAK,WAAW,CAAC,IAAK;AAC1E,SAAO,MAAM,KAAK,IAAI,CAAC,IAAI,MAAM,MAAM;AACzC;AAEO,SAAS,oBAAoB,EAAE,WAAW,GAAoD;AACnG,QAAM,EAAE,iBAAiB,IAAI,kBAAkB;AAC/C,QAAM,EAAE,UAAU,IAAI,gBAAgB;AACtC,QAAM,EAAE,QAAQ,IAAI,iBAAiB;AACrC,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAsC,IAAI;AACpE,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAwB,IAAI;AACtD,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,QAAM,CAAC,UAAU,WAAW,IAAI,SAAmC,IAAI;AAEvE,QAAM,OAAO,YAAY,MAAM;AAC7B,QAAI,CAAC,QAAS;AACd,QAAI,OAAO;AACX,eAAW,IAAI;AACf,aAAS,IAAI;AACb,KAAC,YAAY;AACX,UAAI;AACF,cAAM,SAAS,UAAU,EAAE;AAC3B,cAAM,CAAC,WAAW,WAAW,IAAI,MAAM,QAAQ,IAAI;AAAA,UACjD,OAAO,SAAS,OAAO,OAAO;AAAA,UAC9B,OAAO,SAAS,UAAU,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,CAAC;AAAA,QAC3D,CAAC;AACD,YAAI,KAAM,UAAS,mBAAmB,UAAU,MAAM,YAAY,IAAI,CAAC;AAAA,MACzE,SAAS,GAAG;AACV,YAAI,KAAM,UAAS,cAAc,CAAC,EAAE,OAAO;AAAA,MAC7C,UAAE;AACA,YAAI,KAAM,YAAW,KAAK;AAAA,MAC5B;AAAA,IACF,GAAG;AACH,WAAO,MAAM;AAAE,aAAO;AAAA,IAAO;AAAA,EAC/B,GAAG,CAAC,SAAS,SAAS,CAAC;AAEvB,YAAU,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC;AAE9B,SACE,qBAAC,UAAK,WAAU,sCACd;AAAA,yBAAC,SAAI,WAAU,2BACb;AAAA,0BAAC,cAAW,QAAQ,MAAM,WAAW,EAAE,MAAM,OAAO,CAAC,GAAG;AAAA,MACxD,oBAAC,QAAG,WAAU,iFAAgF,sBAAQ;AAAA,OACxG;AAAA,IAEC,CAAC,WAAW,oBAAC,SAAI,WAAU,iCAAgC,6CAA+B;AAAA,IAC1F,SAAS,oBAAC,qBAAkB,SAAS,MAAM;AAAA,IAC3C,WAAW,CAAC,SAAS,CAAC,SAAS,oBAAC,mBAAgB;AAAA,IAChD,SAAS,MAAM,WAAW,KACzB,qBAAC,SACC;AAAA,0BAAC,OAAE,WAAU,uBAAuB,wBAAc,eAAe,OAAM;AAAA,MACvE,oBAAC,OAAE,WAAU,iCAAiC,wBAAc,eAAe,aAAY;AAAA,OACzF;AAAA,IAGD,SAAS,MAAM,SAAS,KACvB,oBAAC,SAAI,WAAU,uBACZ,gBAAM;AAAA,MAAI,CAAC,SACV,KAAK,WAAW,WACd,oBAAC,qBAAqC,GAAG,KAAK,MAAM,WAAW,KAAK,WAAW,QAAQ,eAA/D,KAAK,KAAK,EAAkE,IAEpG,oBAAC,uBAAkE,MAAM,KAAK,QAApD,GAAG,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,IAAI,EAAqB;AAAA,IAExF,GACF;AAAA,IAGD,YAAY,oBAAC,uBAAoB,GAAG,UAAU,SAAS,MAAM,YAAY,IAAI,GAAG;AAAA,KACnF;AAEJ;AAEA,SAAS,kBAAkB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,WAAW,uBAAuB,CAAC;AACzC,QAAM,SAAS,qBAAqB,CAAC;AACrC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,SAAS,MAAM,OAAO,CAAC;AAAA,MACvB,WAAU;AAAA,MAEV;AAAA,4BAAC,sBAAmB,GAAM;AAAA,QAC1B,qBAAC,SAAI,WAAU,kBACb;AAAA,8BAAC,SAAI,WAAU,yBAAyB,8BAAoB,CAAC,GAAE;AAAA,UAC9D,YAAY,oBAAC,SAAI,WAAU,0CAA0C,oBAAS;AAAA,WACjF;AAAA,QACA,qBAAC,SAAI,WAAU,uBACZ;AAAA,oBAAU,oBAAC,SAAI,WAAU,sCAAsC,kBAAO;AAAA,UACvE,oBAAC,SAAI,WAAU,iCAAiC,eAAK,SAAS,GAAE;AAAA,WAClE;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,oBAAoB,EAAE,GAAG,QAAQ,GAAkD;AAC1F,QAAM,EAAE,YAAY,IAAI,kBAAkB;AAC1C,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAC1C,QAAM,WAAW,uBAAuB,CAAC;AACzC,QAAM,SAAS,qBAAqB,CAAC;AACrC,QAAM,WAAW,IAAI,KAAK,EAAE,SAAS,EAAE,eAAe,QAAW;AAAA,IAC/D,WAAW;AAAA,IACX,WAAW;AAAA,EACb,CAAC;AAED,QAAM,WAAW,MAAM;AACrB,cAAU,WAAW,UAAU,EAAE,MAAM,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AACvD,cAAU,IAAI;AACd,eAAW,MAAM,UAAU,KAAK,GAAG,IAAI;AAAA,EACzC;AAEA,SACE,oBAAC,eAAY,OAAO,oBAAoB,CAAC,GAAG,SAC1C,+BAAC,SAAI,WAAU,uBACb;AAAA,yBAAC,SAAI,WAAU,qDACb;AAAA,0BAAC,sBAAmB,GAAM;AAAA,MACzB,UAAU,oBAAC,SAAI,WAAU,mCAAmC,kBAAO;AAAA,MACnE,YAAY,oBAAC,SAAI,WAAU,iCAAiC,oBAAS;AAAA,OACxE;AAAA,IAEA,qBAAC,SAAI,WAAU,iFACb;AAAA,2BAAC,SAAI,WAAU,0CACb;AAAA,4BAAC,UAAK,WAAU,iCAAgC,kBAAI;AAAA,QACpD,oBAAC,UAAK,WAAU,uBAAuB,oBAAS;AAAA,SAClD;AAAA,MACA,qBAAC,SAAI,WAAU,0CACb;AAAA,4BAAC,UAAK,WAAU,iCAAgC,yBAAW;AAAA,QAC3D,oBAAC,YAAO,SAAS,UAAU,WAAU,sEAClC,mBAAS,kBAAa,MAAM,EAAE,MAAM,GACvC;AAAA,SACF;AAAA,OACF;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,cAAc,aAAa,EAAE,MAAM;AAAA,QACzC,QAAO;AAAA,QACP,KAAI;AAAA,QACJ,WAAU;AAAA,QACX;AAAA;AAAA,IAED;AAAA,KACF,GACF;AAEJ;AAEA,SAAS,oBAAoB,EAAE,KAAK,GAA0B;AAC5D,QAAM,EAAE,aAAa,IAAI,kBAAkB;AAC3C,QAAM,MAAM,aAAa,KAAK,OAAO,SAAS,IAAI;AAClD,QAAM,OAAO,KAAK,UAAU,KAAK,aAAa,KAAK;AACnD,SACE,qBAAC,SAAI,WAAU,6EACb;AAAA,wBAAC,SAAI,WAAU,2DAA0D,OAAO,MAAM,SAAY,EAAE,YAAY,QAAQ,IAAI,EAAE,GAC3H,iBACC,oBAAC,SAAM,KAAK,KAAK,KAAI,IAAG,MAAI,MAAC,WAAU,gBAAe,GAE1D;AAAA,IACA,qBAAC,SAAI,WAAU,kBACb;AAAA,0BAAC,SAAI,WAAU,oCAAoC,eAAK,MAAK;AAAA,MAC5D,KAAK,OAAO,QAAQ,oBAAC,SAAI,WAAU,0CAA0C,eAAK,MAAM,MAAK;AAAA,OAChG;AAAA,IACA,qBAAC,SAAI,WAAU,uBACZ;AAAA,WAAK,OAAO,OAAO,KAAK,MAAM,YAC7B,qBAAC,SAAI,WAAU,sCACZ;AAAA,YAAI,OAAO,KAAK,MAAM,GAAG,GAAG,iBAAiB,KAAK,MAAM,QAAQ,GAAG,YAAY,EAAE;AAAA,QAAE;AAAA,QAAC,oBAAC,UAAK,WAAU,iCAAiC,eAAK,MAAM,UAAS;AAAA,SAC5J;AAAA,MAEF,oBAAC,SAAI,WAAU,iCAAiC,eAAK,KAAK,SAAS,GAAE;AAAA,OACvE;AAAA,KACF;AAEJ;AAEA,SAAS,kBAAkB;AACzB,SACE,qBAAC,SAAI,WAAU,gEACb;AAAA,wBAAC,UAAK,WAAU,gFAA+E;AAAA,IAC/F,oBAAC,SAAI,WAAU,iCAAgC,yCAAsB;AAAA,KACvE;AAEJ;AAEA,SAAS,kBAAkB,EAAE,QAAQ,GAA4B;AAC/D,SACE,qBAAC,SAAI,WAAU,oEACb;AAAA,wBAAC,SAAI,WAAU,oFACb,+BAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,KAAI,eAAc,SAAQ,gBAAe,SACrI;AAAA,0BAAC,UAAK,GAAE,4EAA2E;AAAA,MACnF,oBAAC,UAAK,GAAE,qBAAoB;AAAA,OAC9B,GACF;AAAA,IACA,qBAAC,SACC;AAAA,0BAAC,SAAI,WAAU,yBAAwB,yCAAgC;AAAA,MACvE,oBAAC,OAAE,WAAU,4EAA2E,2FAExF;AAAA,OACF;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,QACT,WAAU;AAAA,QACX;AAAA;AAAA,IAED;AAAA,KACF;AAEJ;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/media-wallet/media-wallet-activity.tsx"],"sourcesContent":["\"use client\";\n\nimport { describeError } from \"../../utils/describe-error.js\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport Image from \"../image.js\";\nimport type { ApiWalletActivity, ApiActivity } from \"@medialane/sdk\";\nimport { getTokenBySymbol } from \"@medialane/sdk\";\nimport { mergeActivityFeeds, type MergedActivityItem } from \"../../utils/media-wallet/activity-feed.js\";\nimport { walletActivityTitle, walletActivitySubtitle, walletActivityAmount } from \"../../utils/media-wallet/wallet-activity.js\";\nimport { short, when, explorerTxUrl, fmt } from \"../../utils/media-wallet/wallet-format.js\";\nimport { BackButton } from \"./back-button.js\";\nimport { WalletActivityIcon } from \"./wallet-activity-icon.js\";\nimport { ActionModal } from \"./action-modal.js\";\nimport { useMediaWalletApp, type MediaWalletView } from \"./types.js\";\nimport { useMedialaneApp } from \"../medialane-app.js\";\nimport { BRAND_COLOR } from \"../../data/brand.js\";\nimport { emptyMessages } from \"../../utils/empty-messages.js\";\n\nconst GRADS = ([[\"blue\", \"purple\"], [\"purple\", \"rose\"], [\"rose\", \"orange\"], [\"purple\", \"blue\"]] as const).map(\n ([from, to]) => `linear-gradient(135deg, ${BRAND_COLOR[from]}, ${BRAND_COLOR[to]})`,\n);\nconst gradFor = (seed: string) => {\n let h = 0;\n for (let i = 0; i < seed.length; i++) h = (h * 31 + seed.charCodeAt(i)) | 0;\n return GRADS[Math.abs(h) % GRADS.length];\n};\n\nexport function MediaWalletActivity({ onNavigate }: { onNavigate: (view: MediaWalletView) => void }) {\n const { useWalletSession } = useMediaWalletApp();\n const { getClient } = useMedialaneApp();\n const { address } = useWalletSession();\n const [items, setItems] = useState<MergedActivityItem[] | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(false);\n const [selected, setSelected] = useState<ApiWalletActivity | null>(null);\n\n const load = useCallback(() => {\n if (!address) return;\n let live = true;\n setLoading(true);\n setError(null);\n (async () => {\n try {\n const client = getClient().api;\n const [walletRes, protocolRes] = await Promise.all([\n client.activity.wallet(address),\n client.activity.byAddress(address, { page: 1, limit: 50 }),\n ]);\n if (live) setItems(mergeActivityFeeds(walletRes.data, protocolRes.data));\n } catch (e) {\n if (live) setError(describeError(e).message);\n } finally {\n if (live) setLoading(false);\n }\n })();\n return () => { live = false; };\n }, [address, getClient]);\n\n useEffect(() => load(), [load]);\n\n return (\n <main className=\"flex flex-col gap-4 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\">Activity</h1>\n </div>\n\n {!address && <div className=\"text-sm text-muted-foreground\">No wallet found on this device.</div>}\n {error && <ActivityLoadError onRetry={load} />}\n {loading && !items && !error && <ActivityLoading />}\n {items && items.length === 0 && (\n <div>\n <p className=\"text-sm font-medium\">{emptyMessages.walletActivity.title}</p>\n <p className=\"text-sm text-muted-foreground\">{emptyMessages.walletActivity.description}</p>\n </div>\n )}\n\n {items && items.length > 0 && (\n <div className=\"flex flex-col gap-2\">\n {items.map((item) =>\n item.source === \"wallet\" ? (\n <WalletActivityRow key={item.data.id} a={item.data} timestamp={item.timestamp} onOpen={setSelected} />\n ) : (\n <ProtocolActivityRow key={`${item.data.txHash}-${item.data.type}`} item={item.data} />\n ),\n )}\n </div>\n )}\n\n {selected && <ActivityDetailModal a={selected} onClose={() => setSelected(null)} />}\n </main>\n );\n}\n\nfunction WalletActivityRow({\n a,\n timestamp,\n onOpen,\n}: {\n a: ApiWalletActivity;\n timestamp: string;\n onOpen: (a: ApiWalletActivity) => void;\n}) {\n const subtitle = walletActivitySubtitle(a);\n const amount = walletActivityAmount(a);\n return (\n <button\n onClick={() => onOpen(a)}\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 <WalletActivityIcon a={a} />\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm font-semibold\">{walletActivityTitle(a)}</div>\n {subtitle && <div className=\"truncate text-xs text-muted-foreground\">{subtitle}</div>}\n </div>\n <div className=\"shrink-0 text-right\">\n {amount && <div className=\"text-sm font-semibold tabular-nums\">{amount}</div>}\n <div className=\"text-xs text-muted-foreground\">{when(timestamp)}</div>\n </div>\n </button>\n );\n}\n\nfunction ActivityDetailModal({ a, onClose }: { a: ApiWalletActivity; onClose: () => void }) {\n const { explorerUrl } = useMediaWalletApp();\n const [copied, setCopied] = useState(false);\n const subtitle = walletActivitySubtitle(a);\n const amount = walletActivityAmount(a);\n const fullDate = new Date(a.timestamp).toLocaleString(undefined, {\n dateStyle: \"medium\",\n timeStyle: \"short\",\n });\n\n const copyHash = () => {\n navigator.clipboard?.writeText(a.txHash).catch(() => {});\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n };\n\n return (\n <ActionModal title={walletActivityTitle(a)} onClose={onClose}>\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex flex-col items-center gap-2 py-2 text-center\">\n <WalletActivityIcon a={a} />\n {amount && <div className=\"text-2xl font-bold tabular-nums\">{amount}</div>}\n {subtitle && <div className=\"text-sm text-muted-foreground\">{subtitle}</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\">\n <span className=\"text-xs text-muted-foreground\">Date</span>\n <span className=\"text-sm font-medium\">{fullDate}</span>\n </div>\n <div className=\"flex items-center justify-between py-3\">\n <span className=\"text-xs text-muted-foreground\">Transaction</span>\n <button onClick={copyHash} className=\"font-mono text-sm font-medium transition-opacity active:opacity-60\">\n {copied ? \"Copied ✓\" : short(a.txHash)}\n </button>\n </div>\n </div>\n\n <a\n href={explorerTxUrl(explorerUrl, a.txHash)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-center text-xs font-medium text-muted-foreground underline underline-offset-2\"\n >\n View on Voyager ↗\n </a>\n </div>\n </ActionModal>\n );\n}\n\nfunction ProtocolActivityRow({ item }: { item: ApiActivity }) {\n const { resolveImage } = useMediaWalletApp();\n const img = resolveImage(item.token?.image ?? null);\n const seed = item.txHash ?? item.orderHash ?? item.type;\n return (\n <div className=\"flex items-center gap-3 rounded-2xl bg-card/40 px-4 py-3 backdrop-blur-sm\">\n <div className=\"relative h-11 w-11 shrink-0 overflow-hidden rounded-2xl\" style={img ? undefined : { background: gradFor(seed) }}>\n {img && (\n <Image src={img} alt=\"\" fill className=\"object-cover\" />\n )}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm font-semibold capitalize\">{item.type}</div>\n {item.token?.name && <div className=\"truncate text-xs text-muted-foreground\">{item.token.name}</div>}\n </div>\n <div className=\"shrink-0 text-right\">\n {item.price?.raw && item.price.currency && (\n <div className=\"text-sm font-semibold tabular-nums\">\n {fmt(BigInt(item.price.raw), getTokenBySymbol(item.price.currency)?.decimals ?? 18)} <span className=\"text-xs text-muted-foreground\">{item.price.currency}</span>\n </div>\n )}\n <div className=\"text-xs text-muted-foreground\">{when(item.timestamp)}</div>\n </div>\n </div>\n );\n}\n\nfunction ActivityLoading() {\n return (\n <div className=\"flex min-h-[40vh] flex-col items-center justify-center gap-3\">\n <span className=\"h-6 w-6 animate-spin rounded-full border-2 border-border border-t-foreground\" />\n <div className=\"text-sm text-muted-foreground\">Loading your activity…</div>\n </div>\n );\n}\n\nfunction ActivityLoadError({ onRetry }: { onRetry: () => void }) {\n return (\n <div className=\"card-base flex flex-col items-center gap-3 px-6 py-8 text-center\">\n <div className=\"grid h-11 w-11 place-items-center rounded-2xl bg-destructive/10 text-destructive\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M10.3 3.9L2.3 18a2 2 0 001.7 3h16a2 2 0 001.7-3L13.7 3.9a2 2 0 00-3.4 0z\" />\n <path d=\"M12 9v4M12 17h.01\" />\n </svg>\n </div>\n <div>\n <div className=\"text-sm font-semibold\">Couldn't load your activity</div>\n <p className=\"mx-auto mt-1 max-w-[16rem] text-xs leading-relaxed text-muted-foreground\">\n There was a problem reaching the server. Check your connection and try again.\n </p>\n </div>\n <button\n onClick={onRetry}\n className=\"rounded-full border border-border px-4 py-2 text-xs font-semibold text-foreground transition-colors hover:bg-card\"\n >\n Try again\n </button>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -39,6 +39,7 @@ var import_router = require("../router.js");
|
|
|
39
39
|
var import_currency_icon = require("../currency-icon.js");
|
|
40
40
|
var import_use_erc20_balance = require("../../utils/media-wallet/use-erc20-balance.js");
|
|
41
41
|
var import_use_tokens = require("../../utils/use-tokens.js");
|
|
42
|
+
var import_brand = require("../../data/brand.js");
|
|
42
43
|
var import_activate_card = require("./activate-card.js");
|
|
43
44
|
var import_quick_action = require("./quick-action.js");
|
|
44
45
|
var import_receive_card = require("./receive-card.js");
|
|
@@ -143,7 +144,7 @@ function MediaWalletHome({
|
|
|
143
144
|
{
|
|
144
145
|
onClick: () => setPanel(panel === "receive" ? null : "receive"),
|
|
145
146
|
className: "h-[48px] rounded-[13px] px-8 text-[15px] font-semibold text-white transition-transform active:scale-[0.99]",
|
|
146
|
-
style: { background:
|
|
147
|
+
style: { background: `linear-gradient(115deg, ${import_brand.BRAND_COLOR.blue}, ${import_brand.BRAND_COLOR.purple})` },
|
|
147
148
|
children: "Fund your account"
|
|
148
149
|
}
|
|
149
150
|
)
|
|
@@ -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 { 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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAqGQ;AAnGR,mBAA4C;AAC5C,kBAAiB;AACjB,oBAA0B;AAC1B,2BAA6B;AAC7B,+BAAgC;AAChC,wBAAiC;AACjC,2BAA6B;AAC7B,0BAA4B;AAC5B,0BAA4B;AAC5B,0BAA4B;AAC5B,4BAA8B;AAC9B,4BAA8B;AAC9B,iCAAkC;AAClC,2BAAgD;AAChD,uBAA6B;AAC7B,uBAAyB;AACzB,4BAA0C;AAC1C,2BAAyC;AACzC,8BAAgC;AAChC,mBAAwD;AAEjD,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,EAAE,kBAAkB,gBAAgB,cAAc,aAAa,eAAe,QAAI,gCAAkB;AAC1G,QAAM,EAAE,SAAS,WAAW,IAAI,iBAAiB;AACjD,QAAM,cAAc,eAAe;AACnC,QAAM,aAAS,yBAAU;AACzB,QAAM,yBAAyB,CAAC,CAAC,aAAa,SAAS,CAAC,YAAY;AAEpE,QAAM,WAA8E;AAAA,IAClF,UAAM,0CAAgB,QAAQ,OAAO;AAAA,IACrC,SAAK,0CAAgB,OAAO,OAAO;AAAA,IACnC,UAAM,0CAAgB,QAAQ,OAAO;AAAA,IACrC,UAAM,0CAAgB,QAAQ,OAAO;AAAA,EACvC;AAEA,QAAM,EAAE,QAAQ,WAAW,YAAY,QAAI,oCAAiB,SAAS,GAAG,CAAC;AACzE,QAAM,eAAW,+BAAa,QAAQ,CAAC;AAEvC,QAAM,gBAAY,oCAAa;AAC/B,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAA2B,kBAAkB,YAAY,IAAI;AACvF,QAAM,CAAC,cAAc,eAAe,QAAI,uBAAS,KAAK;AACtD,QAAM,CAAC,WAAW,YAAY,QAAI,uBAAS,KAAK;AAChD,QAAM,CAAC,MAAM,OAAO,QAAI,uBAAS,CAAC;AAClC,QAAM,aAAS,qBAAsB,IAAI;AACzC,QAAM,cAAU,qBAAoB,IAAI;AAExC,8BAAU,MAAM;AACd,oBAAgB,aAAa,QAAQ,0BAA0B,MAAM,GAAG;AAAA,EAC1E,GAAG,CAAC,CAAC;AAEL,QAAM,eAAe,MAAM,QAAQ,SAAS,iBAAiB;AAC7D,QAAM,eAAe,CAAC,MAAwB;AAC5C,UAAM,KAAK,aAAa;AACxB,WAAO,UAAU,MAAM,GAAG,aAAa,IAAI,EAAE,QAAQ,CAAC,EAAE,UAAU;AAAA,EACpE;AACA,QAAM,cAAc,CAAC,MAAwB;AAC3C,QAAI,OAAO,WAAW,KAAM;AAC5B,UAAM,KAAK,EAAE,QAAQ,CAAC,EAAE,UAAU,OAAO;AACzC,QAAI,KAAK,EAAG,SAAQ,KAAK,IAAI,KAAK,KAAK,EAAE,CAAC;AAAA,EAC5C;AACA,QAAM,aAAa,MAAM;AACvB,YAAQ,CAAC;AACT,WAAO,UAAU;AAAA,EACnB;AAEA,QAAM,MAAM,CAAC,WAAkC;AAC7C,UAAM,EAAE,YAAY,SAAS,IAAI,SAAS,MAAM;AAChD,eAAO,kCAAY,YAAY,QAAQ,SAAK,mCAAY,WAAW,MAAM,KAAK;AAAA,EAChF;AACA,QAAM,WAAW,mCAAc,OAAO,CAAC,KAAK,MAAM,MAAM,IAAI,EAAE,MAAM,GAAG,CAAC;AACxE,QAAM,aAAa,mCAAc,OAAO,CAAC,OAAO,SAAS,EAAE,MAAM,EAAE,cAAc,MAAM,EAAE;AAEzF,QAAM,cAAc,SAAS,KAAK;AAClC,QAAM,SAAS,eAAe,QAAQ,cAAc;AACpD,QAAM,UAAU,eAAe,QAAQ;AAEvC,QAAM,WAAW,MAAM;AACrB,YAAQ;AACR,WAAO,KAAK,YAAY;AAAA,EAC1B;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAU;AAAA,MACV,OAAO,EAAE,WAAW,OAAO,cAAc,IAAI,QAAQ,QAAW,YAAY,OAAO,SAAS,sBAAsB;AAAA,MAEjH;AAAA,mBACC,6CAAC,SAAI,WAAU,oCACb;AAAA,sDAAC,gDAAkB,SAAkB,YAAY,SAAS;AAAA,WACxD,UAAU,eAAe,UACzB,4CAAC,UAAK,WAAU,8FACb,yBAAe,6BAAS,cAAc,OAAO,eAAM,6BAAO,QAAQ,GACrE;AAAA,WAEJ;AAAA,QAGD,SACC,6CAAC,SAAI,WAAU,0BACb;AAAA,sDAAC,mCAAY,OAAM,QAAO,QAAO,OAAM,UAAU,CAAC,SAAS,SAAS,MAAM,WAAW,EAAE,MAAM,OAAO,CAAC,GAAG,MAAM,4CAAC,WAAQ,GAAI;AAAA,UAC3H,4CAAC,mCAAY,OAAM,WAAU,QAAO,SAAQ,SAAS,MAAM,SAAS,UAAU,YAAY,OAAO,SAAS,GAAG,MAAM,4CAAC,aAAU,GAAI;AAAA,UAClI,4CAAC,mCAAY,OAAM,UAAS,QAAO,SAAQ,SAAS,UAAU,MAAM,4CAAC,cAAW,GAAI;AAAA,UACpF,4CAAC,mCAAY,OAAM,YAAW,QAAO,UAAS,SAAS,MAAM,WAAW,EAAE,MAAM,WAAW,CAAC,GAAG,MAAM,4CAAC,gBAAa,GAAI;AAAA,WACzH,IACE,eAAe,OACjB,6CAAC,SAAI,WAAU,uBACb;AAAA,uDAAC,SAAI,WAAU,yCACb;AAAA,wDAAC,SAAI,WAAU,uDAAsD;AAAA,YACrE,4CAAC,SAAI,WAAU,wDAAuD;AAAA,YACtE,4CAAC,SAAI,WAAU,mEAAkE;AAAA,aACnF;AAAA,UACA,4CAAC,SAAI,WAAU,+DAA8D;AAAA,WAC/E,IAEA,eAAe,QACb,6CAAC,SAAI,WAAU,uBACb;AAAA,uDAAC,SAAI,WAAU,yCACb;AAAA,wDAAC,UAAK,WAAU,uEAAsE,qBAAO;AAAA,YAC7F,4CAAC,UAAK,WAAU,8FACb,yBAAe,6BAAS,cAAc,OAAO,eAAM,6BAAO,QAAQ,GACrE;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS,MAAM,SAAS,UAAU,YAAY,OAAO,SAAS;AAAA,gBAC9D,WAAU;AAAA,gBACV,OAAO,EAAE,YAAY,0CAA0C;AAAA,gBAChE;AAAA;AAAA,YAED;AAAA,aACF;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,SAAS;AAAA,cACT,WAAU;AAAA,cAEV;AAAA,4DAAC,SAAI,WAAU,uEACb,sDAAC,cAAW,GACd;AAAA,gBACA,4CAAC,UAAK,WAAU,6CAA4C,+BAAiB;AAAA,gBAC7E,4CAAC,UAAK,WAAU,iCAAgC,4CAA8B;AAAA;AAAA;AAAA,UAChF;AAAA,WACF;AAAA,QAIH,eAAe,SAAS,4CAAC,qCAAa,aAAa,MAAM,aAAa,IAAI,GAAG;AAAA,QAE7E,0BACC;AAAA,UAAC,YAAAA;AAAA,UAAA;AAAA,YACC,MAAM,YAAY;AAAA,YAClB,SAAS;AAAA,YACT,WAAU;AAAA,YACV,OAAO,EAAE,YAAY,wGAAwG;AAAA,YAE7H;AAAA,0DAAC,SAAI,WAAU,4EACb,sDAAC,YAAS,GACZ;AAAA,cACA,6CAAC,SAAI,WAAU,kBACb;AAAA,4DAAC,SAAI,WAAU,yBAAwB,+BAAiB;AAAA,gBACxD,4CAAC,SAAI,WAAU,iCAAiC,sBAAY,KAAK,aAAa,QAAQ,GAAE;AAAA,iBAC1F;AAAA;AAAA;AAAA,QACF;AAAA,QAGD,UAAU,aAAa,WACtB,4CAAC,mCAAY,SAAS,MAAM,SAAS,IAAI,GACvC,sDAAC,mCAAY,SAAkB,GACjC;AAAA,QAGD,WAAW,SAAS,KACnB,6CAAC,aACC;AAAA,sDAAC,uCAAc,OAAM,UAAS;AAAA,UAC9B,4CAAC,SAAI,WAAU,4BACZ,qBAAW,IAAI,CAAC,MAAM;AACrB,kBAAM,EAAE,YAAY,SAAS,IAAI,SAAS,EAAE,MAAM;AAClD,mBACE;AAAA,cAAC;AAAA;AAAA,gBAEC,SAAS,MAAM,WAAW,EAAE,MAAM,SAAS,OAAO,EAAE,CAAC;AAAA,gBACrD,WAAU;AAAA,gBAEV;AAAA,8DAAC,SAAI,WAAU,gFACb,sDAAC,qCAAa,QAAQ,EAAE,QAAQ,MAAM,IAAI,GAC5C;AAAA,kBACA,6CAAC,SAAI,WAAU,kBACb;AAAA,gEAAC,SAAI,WAAU,yBAAyB,YAAE,QAAO;AAAA,oBACjD,4CAAC,SAAI,WAAU,iCAAiC,YAAE,MAAK;AAAA,qBACzD;AAAA,kBACA,6CAAC,SAAI,WAAU,cACb;AAAA,gEAAC,SAAI,WAAU,sCAAsC,yBAAe,iCAAS,0BAAI,YAAY,QAAQ,GAAE;AAAA,oBACtG,CAAC,gBAAgB,cAAc,QAC9B,4CAAC,SAAI,WAAU,8CAA8C,2CAAO,IAAI,EAAE,MAAM,CAAC,GAAE;AAAA,qBAEvF;AAAA;AAAA;AAAA,cAhBK,EAAE;AAAA,YAiBT;AAAA,UAEJ,CAAC,GACH;AAAA,WACF;AAAA,SAGA,SAAS,SAAS,KAAK,gBACvB,6CAAC,aACC;AAAA,sDAAC,uCAAc,OAAM,QAAO;AAAA,UAC5B,4CAAC,SAAI,WAAU,QACb,sDAAC,6BAAS,OAAO,UAAU,WAAW,aAAa,YAAY,SAAS,cAA4B,GACtG;AAAA,WACF;AAAA,QAGD,aACC;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,wCAAgB,gBAAgB,EAAE;AAAA,YACzC,SAAS,wCAAgB,gBAAgB,EAAE;AAAA,YAC3C,SAAS,MAAM,aAAa,KAAK;AAAA;AAAA,QACnC;AAAA,QAGF;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,eAAe;AAAA,YACrB,QAAO;AAAA,YACP,KAAI;AAAA,YACJ,WAAU;AAAA,YAET,yBAAe;AAAA;AAAA,QAClB;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,UAAU;AACjB,SACE,4CAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SACvI,sDAAC,UAAK,GAAE,yBAAwB,GAClC;AAEJ;AACA,SAAS,YAAY;AACnB,SACE,4CAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SACvI,sDAAC,UAAK,GAAE,2BAA0B,GACpC;AAEJ;AACA,SAAS,eAAe;AACtB,SACE,4CAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SACvI,sDAAC,UAAK,GAAE,6BAA4B,GACtC;AAEJ;AACA,SAAS,WAAW;AAClB,SACE,6CAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,KAAI,eAAc,SAAQ,gBAAe,SAAQ,WAAU,qBACvJ;AAAA,gDAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI;AAAA,IAChD,4CAAC,UAAK,GAAE,6CAA4C;AAAA,KACtD;AAEJ;AACA,SAAS,aAAa;AACpB,SACE,6CAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SACvI;AAAA,gDAAC,UAAK,GAAE,4FAA2F;AAAA,IACnG,4CAAC,UAAK,GAAE,+FAA8F;AAAA,IACtG,4CAAC,UAAK,GAAE,iFAAgF;AAAA,KAC1F;AAEJ;","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 { BRAND_COLOR } from \"../../data/brand.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, ${BRAND_COLOR.blue}, ${BRAND_COLOR.purple})` }}\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"]}
|
|
@@ -6,6 +6,7 @@ import { useRouter } from "../router.js";
|
|
|
6
6
|
import { CurrencyIcon } from "../currency-icon.js";
|
|
7
7
|
import { useTokenBalance } from "../../utils/media-wallet/use-erc20-balance.js";
|
|
8
8
|
import { useTokensByOwner } from "../../utils/use-tokens.js";
|
|
9
|
+
import { BRAND_COLOR } from "../../data/brand.js";
|
|
9
10
|
import { ActivateCard } from "./activate-card.js";
|
|
10
11
|
import { QuickAction } from "./quick-action.js";
|
|
11
12
|
import { ReceiveCard } from "./receive-card.js";
|
|
@@ -110,7 +111,7 @@ function MediaWalletHome({
|
|
|
110
111
|
{
|
|
111
112
|
onClick: () => setPanel(panel === "receive" ? null : "receive"),
|
|
112
113
|
className: "h-[48px] rounded-[13px] px-8 text-[15px] font-semibold text-white transition-transform active:scale-[0.99]",
|
|
113
|
-
style: { background:
|
|
114
|
+
style: { background: `linear-gradient(115deg, ${BRAND_COLOR.blue}, ${BRAND_COLOR.purple})` },
|
|
114
115
|
children: "Fund your account"
|
|
115
116
|
}
|
|
116
117
|
)
|
|
@@ -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 { 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":[]}
|
|
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 { BRAND_COLOR } from \"../../data/brand.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, ${BRAND_COLOR.blue}, ${BRAND_COLOR.purple})` }}\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":[]}
|