@medialane/ui 0.184.0 → 0.186.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (251) hide show
  1. package/dist/components/drop/create/drop-create.cjs +6 -4
  2. package/dist/components/drop/create/drop-create.cjs.map +1 -1
  3. package/dist/components/drop/create/drop-create.d.cts +4 -6
  4. package/dist/components/drop/create/drop-create.d.ts +4 -6
  5. package/dist/components/drop/create/drop-create.js +6 -4
  6. package/dist/components/drop/create/drop-create.js.map +1 -1
  7. package/dist/components/drop/create/launch-dialog.cjs +4 -1
  8. package/dist/components/drop/create/launch-dialog.cjs.map +1 -1
  9. package/dist/components/drop/create/launch-dialog.js +5 -2
  10. package/dist/components/drop/create/launch-dialog.js.map +1 -1
  11. package/dist/components/drop/create/sale-section.cjs +2 -2
  12. package/dist/components/drop/create/sale-section.cjs.map +1 -1
  13. package/dist/components/drop/create/sale-section.d.cts +3 -3
  14. package/dist/components/drop/create/sale-section.d.ts +3 -3
  15. package/dist/components/drop/create/sale-section.js +2 -2
  16. package/dist/components/drop/create/sale-section.js.map +1 -1
  17. package/dist/components/drop/drop-card.cjs +2 -2
  18. package/dist/components/drop/drop-card.cjs.map +1 -1
  19. package/dist/components/drop/drop-card.js +1 -1
  20. package/dist/components/drop/drop-card.js.map +1 -1
  21. package/dist/components/drop/drop-features.cjs +44 -0
  22. package/dist/components/drop/drop-features.cjs.map +1 -0
  23. package/dist/components/drop/drop-features.d.cts +5 -0
  24. package/dist/components/drop/drop-features.d.ts +5 -0
  25. package/dist/components/drop/drop-features.js +20 -0
  26. package/dist/components/drop/drop-features.js.map +1 -0
  27. package/dist/components/{drop-status-display.cjs → drop/drop-status.cjs} +5 -5
  28. package/dist/components/drop/drop-status.cjs.map +1 -0
  29. package/dist/components/{drop-status-display.d.ts → drop/drop-status.d.cts} +1 -2
  30. package/dist/components/{drop-status-display.d.cts → drop/drop-status.d.ts} +1 -2
  31. package/dist/components/{drop-status-display.js → drop/drop-status.js} +2 -2
  32. package/dist/components/drop/drop-status.js.map +1 -0
  33. package/dist/components/drop/page/drop-action-box.cjs +3 -3
  34. package/dist/components/drop/page/drop-action-box.cjs.map +1 -1
  35. package/dist/components/drop/page/drop-action-box.d.cts +0 -1
  36. package/dist/components/drop/page/drop-action-box.d.ts +0 -1
  37. package/dist/components/drop/page/drop-action-box.js +1 -1
  38. package/dist/components/drop/page/drop-action-box.js.map +1 -1
  39. package/dist/components/drop/page/drop-page.cjs +6 -4
  40. package/dist/components/drop/page/drop-page.cjs.map +1 -1
  41. package/dist/components/drop/page/drop-page.d.cts +1 -2
  42. package/dist/components/drop/page/drop-page.d.ts +1 -2
  43. package/dist/components/drop/page/drop-page.js +7 -5
  44. package/dist/components/drop/page/drop-page.js.map +1 -1
  45. package/dist/components/media-wallet/action-button.cjs +54 -0
  46. package/dist/components/media-wallet/action-button.cjs.map +1 -0
  47. package/dist/components/media-wallet/action-button.d.cts +10 -0
  48. package/dist/components/media-wallet/action-button.d.ts +10 -0
  49. package/dist/components/media-wallet/action-button.js +28 -0
  50. package/dist/components/media-wallet/action-button.js.map +1 -0
  51. package/dist/components/media-wallet/action-modal.cjs +84 -0
  52. package/dist/components/media-wallet/action-modal.cjs.map +1 -0
  53. package/dist/components/media-wallet/action-modal.d.cts +20 -0
  54. package/dist/components/media-wallet/action-modal.d.ts +20 -0
  55. package/dist/components/media-wallet/action-modal.js +56 -0
  56. package/dist/components/media-wallet/action-modal.js.map +1 -0
  57. package/dist/components/media-wallet/activate-card.cjs +72 -0
  58. package/dist/components/media-wallet/activate-card.cjs.map +1 -0
  59. package/dist/components/media-wallet/activate-card.d.cts +7 -0
  60. package/dist/components/media-wallet/activate-card.d.ts +7 -0
  61. package/dist/components/media-wallet/activate-card.js +48 -0
  62. package/dist/components/media-wallet/activate-card.js.map +1 -0
  63. package/dist/components/media-wallet/address-qr.cjs +64 -0
  64. package/dist/components/media-wallet/address-qr.cjs.map +1 -0
  65. package/dist/components/media-wallet/address-qr.d.cts +8 -0
  66. package/dist/components/media-wallet/address-qr.d.ts +8 -0
  67. package/dist/components/media-wallet/address-qr.js +30 -0
  68. package/dist/components/media-wallet/address-qr.js.map +1 -0
  69. package/dist/components/media-wallet/back-button.cjs +41 -0
  70. package/dist/components/media-wallet/back-button.cjs.map +1 -0
  71. package/dist/components/media-wallet/back-button.d.cts +7 -0
  72. package/dist/components/media-wallet/back-button.d.ts +7 -0
  73. package/dist/components/media-wallet/back-button.js +17 -0
  74. package/dist/components/media-wallet/back-button.js.map +1 -0
  75. package/dist/components/media-wallet/copy-icon.cjs +49 -0
  76. package/dist/components/media-wallet/copy-icon.cjs.map +1 -0
  77. package/dist/components/media-wallet/copy-icon.d.cts +7 -0
  78. package/dist/components/media-wallet/copy-icon.d.ts +7 -0
  79. package/dist/components/media-wallet/copy-icon.js +25 -0
  80. package/dist/components/media-wallet/copy-icon.js.map +1 -0
  81. package/dist/components/media-wallet/currency-sheet.cjs +54 -0
  82. package/dist/components/media-wallet/currency-sheet.cjs.map +1 -0
  83. package/dist/components/media-wallet/currency-sheet.d.cts +12 -0
  84. package/dist/components/media-wallet/currency-sheet.d.ts +12 -0
  85. package/dist/components/media-wallet/currency-sheet.js +30 -0
  86. package/dist/components/media-wallet/currency-sheet.js.map +1 -0
  87. package/dist/components/media-wallet/media-wallet-activity.cjs +223 -0
  88. package/dist/components/media-wallet/media-wallet-activity.cjs.map +1 -0
  89. package/dist/components/media-wallet/media-wallet-activity.d.cts +12 -0
  90. package/dist/components/media-wallet/media-wallet-activity.d.ts +12 -0
  91. package/dist/components/media-wallet/media-wallet-activity.js +189 -0
  92. package/dist/components/media-wallet/media-wallet-activity.js.map +1 -0
  93. package/dist/components/media-wallet/media-wallet-header.cjs +97 -0
  94. package/dist/components/media-wallet/media-wallet-header.cjs.map +1 -0
  95. package/dist/components/media-wallet/media-wallet-header.d.cts +8 -0
  96. package/dist/components/media-wallet/media-wallet-header.d.ts +8 -0
  97. package/dist/components/media-wallet/media-wallet-header.js +63 -0
  98. package/dist/components/media-wallet/media-wallet-header.js.map +1 -0
  99. package/dist/components/media-wallet/media-wallet-home.cjs +258 -0
  100. package/dist/components/media-wallet/media-wallet-home.cjs.map +1 -0
  101. package/dist/components/media-wallet/media-wallet-home.d.cts +14 -0
  102. package/dist/components/media-wallet/media-wallet-home.d.ts +14 -0
  103. package/dist/components/media-wallet/media-wallet-home.js +224 -0
  104. package/dist/components/media-wallet/media-wallet-home.js.map +1 -0
  105. package/dist/components/media-wallet/media-wallet-overlay.cjs +137 -0
  106. package/dist/components/media-wallet/media-wallet-overlay.cjs.map +1 -0
  107. package/dist/components/media-wallet/media-wallet-overlay.d.cts +14 -0
  108. package/dist/components/media-wallet/media-wallet-overlay.d.ts +14 -0
  109. package/dist/components/media-wallet/media-wallet-overlay.js +102 -0
  110. package/dist/components/media-wallet/media-wallet-overlay.js.map +1 -0
  111. package/dist/components/media-wallet/media-wallet-send.cjs +313 -0
  112. package/dist/components/media-wallet/media-wallet-send.cjs.map +1 -0
  113. package/dist/components/media-wallet/media-wallet-send.d.cts +14 -0
  114. package/dist/components/media-wallet/media-wallet-send.d.ts +14 -0
  115. package/dist/components/media-wallet/media-wallet-send.js +289 -0
  116. package/dist/components/media-wallet/media-wallet-send.js.map +1 -0
  117. package/dist/components/media-wallet/media-wallet-token-detail.cjs +164 -0
  118. package/dist/components/media-wallet/media-wallet-token-detail.cjs.map +1 -0
  119. package/dist/components/media-wallet/media-wallet-token-detail.d.cts +13 -0
  120. package/dist/components/media-wallet/media-wallet-token-detail.d.ts +13 -0
  121. package/dist/components/media-wallet/media-wallet-token-detail.js +140 -0
  122. package/dist/components/media-wallet/media-wallet-token-detail.js.map +1 -0
  123. package/dist/components/media-wallet/media-wallet.cjs +51 -0
  124. package/dist/components/media-wallet/media-wallet.cjs.map +1 -0
  125. package/dist/components/media-wallet/media-wallet.d.cts +13 -0
  126. package/dist/components/media-wallet/media-wallet.d.ts +13 -0
  127. package/dist/components/media-wallet/media-wallet.js +27 -0
  128. package/dist/components/media-wallet/media-wallet.js.map +1 -0
  129. package/dist/components/media-wallet/nft-strip.cjs +85 -0
  130. package/dist/components/media-wallet/nft-strip.cjs.map +1 -0
  131. package/dist/components/media-wallet/nft-strip.d.cts +12 -0
  132. package/dist/components/media-wallet/nft-strip.d.ts +12 -0
  133. package/dist/components/media-wallet/nft-strip.js +51 -0
  134. package/dist/components/media-wallet/nft-strip.js.map +1 -0
  135. package/dist/components/media-wallet/quick-action.cjs +59 -0
  136. package/dist/components/media-wallet/quick-action.cjs.map +1 -0
  137. package/dist/components/media-wallet/quick-action.d.cts +12 -0
  138. package/dist/components/media-wallet/quick-action.d.ts +12 -0
  139. package/dist/components/media-wallet/quick-action.js +35 -0
  140. package/dist/components/media-wallet/quick-action.js.map +1 -0
  141. package/dist/components/media-wallet/receive-card.cjs +86 -0
  142. package/dist/components/media-wallet/receive-card.cjs.map +1 -0
  143. package/dist/components/media-wallet/receive-card.d.cts +7 -0
  144. package/dist/components/media-wallet/receive-card.d.ts +7 -0
  145. package/dist/components/media-wallet/receive-card.js +52 -0
  146. package/dist/components/media-wallet/receive-card.js.map +1 -0
  147. package/dist/components/media-wallet/section-header.cjs +32 -0
  148. package/dist/components/media-wallet/section-header.cjs.map +1 -0
  149. package/dist/components/media-wallet/section-header.d.cts +7 -0
  150. package/dist/components/media-wallet/section-header.d.ts +7 -0
  151. package/dist/components/media-wallet/section-header.js +8 -0
  152. package/dist/components/media-wallet/section-header.js.map +1 -0
  153. package/dist/components/media-wallet/success-dialog.cjs +75 -0
  154. package/dist/components/media-wallet/success-dialog.cjs.map +1 -0
  155. package/dist/components/media-wallet/success-dialog.d.cts +11 -0
  156. package/dist/components/media-wallet/success-dialog.d.ts +11 -0
  157. package/dist/components/media-wallet/success-dialog.js +51 -0
  158. package/dist/components/media-wallet/success-dialog.js.map +1 -0
  159. package/dist/components/media-wallet/types.cjs +37 -0
  160. package/dist/components/media-wallet/types.cjs.map +1 -0
  161. package/dist/components/media-wallet/types.d.cts +66 -0
  162. package/dist/components/media-wallet/types.d.ts +66 -0
  163. package/dist/components/media-wallet/types.js +12 -0
  164. package/dist/components/media-wallet/types.js.map +1 -0
  165. package/dist/components/media-wallet/wallet-activity-icon.cjs +69 -0
  166. package/dist/components/media-wallet/wallet-activity-icon.cjs.map +1 -0
  167. package/dist/components/media-wallet/wallet-activity-icon.d.cts +8 -0
  168. package/dist/components/media-wallet/wallet-activity-icon.d.ts +8 -0
  169. package/dist/components/media-wallet/wallet-activity-icon.js +45 -0
  170. package/dist/components/media-wallet/wallet-activity-icon.js.map +1 -0
  171. package/dist/index.cjs +13 -3
  172. package/dist/index.cjs.map +1 -1
  173. package/dist/index.d.cts +6 -2
  174. package/dist/index.d.ts +6 -2
  175. package/dist/index.js +8 -2
  176. package/dist/index.js.map +1 -1
  177. package/dist/utils/drop/sale.cjs +3 -3
  178. package/dist/utils/drop/sale.cjs.map +1 -1
  179. package/dist/utils/drop/sale.d.cts +2 -2
  180. package/dist/utils/drop/sale.d.ts +2 -2
  181. package/dist/utils/drop/sale.js +4 -4
  182. package/dist/utils/drop/sale.js.map +1 -1
  183. package/dist/utils/drop/view.cjs +2 -2
  184. package/dist/utils/drop/view.cjs.map +1 -1
  185. package/dist/utils/drop/view.d.cts +2 -2
  186. package/dist/utils/drop/view.d.ts +2 -2
  187. package/dist/utils/drop/view.js +2 -2
  188. package/dist/utils/drop/view.js.map +1 -1
  189. package/dist/utils/media-wallet/activity-feed.cjs +35 -0
  190. package/dist/utils/media-wallet/activity-feed.cjs.map +1 -0
  191. package/dist/utils/media-wallet/activity-feed.d.cts +14 -0
  192. package/dist/utils/media-wallet/activity-feed.d.ts +14 -0
  193. package/dist/utils/media-wallet/activity-feed.js +11 -0
  194. package/dist/utils/media-wallet/activity-feed.js.map +1 -0
  195. package/dist/utils/media-wallet/confetti.cjs +51 -0
  196. package/dist/utils/media-wallet/confetti.cjs.map +1 -0
  197. package/dist/utils/media-wallet/confetti.d.cts +3 -0
  198. package/dist/utils/media-wallet/confetti.d.ts +3 -0
  199. package/dist/utils/media-wallet/confetti.js +17 -0
  200. package/dist/utils/media-wallet/confetti.js.map +1 -0
  201. package/dist/utils/media-wallet/nft-items.cjs +38 -0
  202. package/dist/utils/media-wallet/nft-items.cjs.map +1 -0
  203. package/dist/utils/media-wallet/nft-items.d.cts +13 -0
  204. package/dist/utils/media-wallet/nft-items.d.ts +13 -0
  205. package/dist/utils/media-wallet/nft-items.js +14 -0
  206. package/dist/utils/media-wallet/nft-items.js.map +1 -0
  207. package/dist/utils/media-wallet/run-intent-calls.cjs +32 -0
  208. package/dist/utils/media-wallet/run-intent-calls.cjs.map +1 -0
  209. package/dist/utils/media-wallet/run-intent-calls.d.cts +16 -0
  210. package/dist/utils/media-wallet/run-intent-calls.d.ts +16 -0
  211. package/dist/utils/media-wallet/run-intent-calls.js +8 -0
  212. package/dist/utils/media-wallet/run-intent-calls.js.map +1 -0
  213. package/dist/utils/media-wallet/use-erc20-balance.cjs +75 -0
  214. package/dist/utils/media-wallet/use-erc20-balance.cjs.map +1 -0
  215. package/dist/utils/media-wallet/use-erc20-balance.d.cts +15 -0
  216. package/dist/utils/media-wallet/use-erc20-balance.d.ts +15 -0
  217. package/dist/utils/media-wallet/use-erc20-balance.js +40 -0
  218. package/dist/utils/media-wallet/use-erc20-balance.js.map +1 -0
  219. package/dist/utils/media-wallet/use-tokens-by-owner.cjs +52 -0
  220. package/dist/utils/media-wallet/use-tokens-by-owner.cjs.map +1 -0
  221. package/dist/utils/media-wallet/use-tokens-by-owner.d.cts +10 -0
  222. package/dist/utils/media-wallet/use-tokens-by-owner.d.ts +10 -0
  223. package/dist/utils/media-wallet/use-tokens-by-owner.js +18 -0
  224. package/dist/utils/media-wallet/use-tokens-by-owner.js.map +1 -0
  225. package/dist/utils/media-wallet/wallet-activity.cjs +83 -0
  226. package/dist/utils/media-wallet/wallet-activity.cjs.map +1 -0
  227. package/dist/utils/media-wallet/wallet-activity.d.cts +7 -0
  228. package/dist/utils/media-wallet/wallet-activity.d.ts +7 -0
  229. package/dist/utils/media-wallet/wallet-activity.js +57 -0
  230. package/dist/utils/media-wallet/wallet-activity.js.map +1 -0
  231. package/dist/utils/media-wallet/wallet-format.cjs +59 -0
  232. package/dist/utils/media-wallet/wallet-format.cjs.map +1 -0
  233. package/dist/utils/media-wallet/wallet-format.d.cts +9 -0
  234. package/dist/utils/media-wallet/wallet-format.d.ts +9 -0
  235. package/dist/utils/media-wallet/wallet-format.js +29 -0
  236. package/dist/utils/media-wallet/wallet-format.js.map +1 -0
  237. package/dist/utils/media-wallet/wallet-tokens.cjs +39 -0
  238. package/dist/utils/media-wallet/wallet-tokens.cjs.map +1 -0
  239. package/dist/utils/media-wallet/wallet-tokens.d.cts +10 -0
  240. package/dist/utils/media-wallet/wallet-tokens.d.ts +10 -0
  241. package/dist/utils/media-wallet/wallet-tokens.js +15 -0
  242. package/dist/utils/media-wallet/wallet-tokens.js.map +1 -0
  243. package/dist/utils/use-drops.cjs +7 -0
  244. package/dist/utils/use-drops.cjs.map +1 -1
  245. package/dist/utils/use-drops.d.cts +3 -1
  246. package/dist/utils/use-drops.d.ts +3 -1
  247. package/dist/utils/use-drops.js +6 -0
  248. package/dist/utils/use-drops.js.map +1 -1
  249. package/package.json +11 -3
  250. package/dist/components/drop-status-display.cjs.map +0 -1
  251. package/dist/components/drop-status-display.js.map +0 -1
@@ -0,0 +1,189 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { describeError } from "../../utils/describe-error.js";
4
+ import { useCallback, useEffect, useState } from "react";
5
+ import Image from "../image.js";
6
+ import { getTokenBySymbol } from "@medialane/sdk";
7
+ import { mergeActivityFeeds } from "../../utils/media-wallet/activity-feed.js";
8
+ import { walletActivityTitle, walletActivitySubtitle, walletActivityAmount } from "../../utils/media-wallet/wallet-activity.js";
9
+ import { short, when, explorerTxUrl, fmt } from "../../utils/media-wallet/wallet-format.js";
10
+ import { BackButton } from "./back-button.js";
11
+ import { WalletActivityIcon } from "./wallet-activity-icon.js";
12
+ import { ActionModal } from "./action-modal.js";
13
+ import { useMediaWalletApp } from "./types.js";
14
+ const GRADS = [
15
+ "linear-gradient(135deg,#3b7bff,#8a5cf6)",
16
+ "linear-gradient(135deg,#8a5cf6,#f6608f)",
17
+ "linear-gradient(135deg,#f6608f,#fb8b46)",
18
+ "linear-gradient(135deg,#5b4ce6,#3b7bff)"
19
+ ];
20
+ const gradFor = (seed) => {
21
+ let h = 0;
22
+ for (let i = 0; i < seed.length; i++) h = h * 31 + seed.charCodeAt(i) | 0;
23
+ return GRADS[Math.abs(h) % GRADS.length];
24
+ };
25
+ function MediaWalletActivity({ onNavigate }) {
26
+ const { useWalletSession, getClient } = useMediaWalletApp();
27
+ const { address } = useWalletSession();
28
+ const [items, setItems] = useState(null);
29
+ const [error, setError] = useState(null);
30
+ const [loading, setLoading] = useState(false);
31
+ const [selected, setSelected] = useState(null);
32
+ const load = useCallback(() => {
33
+ if (!address) return;
34
+ let live = true;
35
+ setLoading(true);
36
+ setError(null);
37
+ (async () => {
38
+ try {
39
+ const client = getClient().api;
40
+ const [walletRes, protocolRes] = await Promise.all([
41
+ client.getWalletActivity(address),
42
+ client.getActivitiesByAddress(address, 1, 50)
43
+ ]);
44
+ if (live) setItems(mergeActivityFeeds(walletRes.data, protocolRes.data));
45
+ } catch (e) {
46
+ if (live) setError(describeError(e, "We couldn't load your activity. Please try again.").message);
47
+ } finally {
48
+ if (live) setLoading(false);
49
+ }
50
+ })();
51
+ return () => {
52
+ live = false;
53
+ };
54
+ }, [address, getClient]);
55
+ useEffect(() => load(), [load]);
56
+ return /* @__PURE__ */ jsxs("main", { className: "flex flex-col gap-4 px-5 pb-8 pt-2", children: [
57
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
58
+ /* @__PURE__ */ jsx(BackButton, { onBack: () => onNavigate({ name: "home" }) }),
59
+ /* @__PURE__ */ jsx("h1", { className: "font-[family-name:var(--font-display)] text-2xl font-extrabold tracking-tight", children: "Activity" })
60
+ ] }),
61
+ !address && /* @__PURE__ */ jsx("div", { className: "text-sm text-muted-foreground", children: "No wallet found on this device." }),
62
+ error && /* @__PURE__ */ jsx(ActivityLoadError, { onRetry: load }),
63
+ loading && !items && !error && /* @__PURE__ */ jsx(ActivityLoading, {}),
64
+ items && items.length === 0 && /* @__PURE__ */ jsx("div", { className: "text-sm text-muted-foreground", children: "No activity yet." }),
65
+ items && items.length > 0 && /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-2", children: items.map(
66
+ (item) => item.source === "wallet" ? /* @__PURE__ */ jsx(WalletActivityRow, { a: item.data, timestamp: item.timestamp, onOpen: setSelected }, item.data.id) : /* @__PURE__ */ jsx(ProtocolActivityRow, { item: item.data }, `${item.data.txHash}-${item.data.type}`)
67
+ ) }),
68
+ selected && /* @__PURE__ */ jsx(ActivityDetailModal, { a: selected, onClose: () => setSelected(null) })
69
+ ] });
70
+ }
71
+ function WalletActivityRow({
72
+ a,
73
+ timestamp,
74
+ onOpen
75
+ }) {
76
+ const subtitle = walletActivitySubtitle(a);
77
+ const amount = walletActivityAmount(a);
78
+ return /* @__PURE__ */ jsxs(
79
+ "button",
80
+ {
81
+ onClick: () => onOpen(a),
82
+ 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",
83
+ children: [
84
+ /* @__PURE__ */ jsx(WalletActivityIcon, { a }),
85
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
86
+ /* @__PURE__ */ jsx("div", { className: "text-sm font-semibold", children: walletActivityTitle(a) }),
87
+ subtitle && /* @__PURE__ */ jsx("div", { className: "truncate text-xs text-muted-foreground", children: subtitle })
88
+ ] }),
89
+ /* @__PURE__ */ jsxs("div", { className: "shrink-0 text-right", children: [
90
+ amount && /* @__PURE__ */ jsx("div", { className: "text-sm font-semibold tabular-nums", children: amount }),
91
+ /* @__PURE__ */ jsx("div", { className: "text-xs text-muted-foreground", children: when(timestamp) })
92
+ ] })
93
+ ]
94
+ }
95
+ );
96
+ }
97
+ function ActivityDetailModal({ a, onClose }) {
98
+ const { explorerUrl } = useMediaWalletApp();
99
+ const [copied, setCopied] = useState(false);
100
+ const subtitle = walletActivitySubtitle(a);
101
+ const amount = walletActivityAmount(a);
102
+ const fullDate = new Date(a.timestamp).toLocaleString(void 0, {
103
+ dateStyle: "medium",
104
+ timeStyle: "short"
105
+ });
106
+ const copyHash = () => {
107
+ navigator.clipboard?.writeText(a.txHash).catch(() => {
108
+ });
109
+ setCopied(true);
110
+ setTimeout(() => setCopied(false), 1500);
111
+ };
112
+ return /* @__PURE__ */ jsx(ActionModal, { title: walletActivityTitle(a), onClose, children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4", children: [
113
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-2 py-2 text-center", children: [
114
+ /* @__PURE__ */ jsx(WalletActivityIcon, { a }),
115
+ amount && /* @__PURE__ */ jsx("div", { className: "text-2xl font-bold tabular-nums", children: amount }),
116
+ subtitle && /* @__PURE__ */ jsx("div", { className: "text-sm text-muted-foreground", children: subtitle })
117
+ ] }),
118
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col divide-y divide-border/40 rounded-2xl bg-foreground/[0.05] px-4", children: [
119
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between py-3", children: [
120
+ /* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground", children: "Date" }),
121
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-medium", children: fullDate })
122
+ ] }),
123
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between py-3", children: [
124
+ /* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground", children: "Transaction" }),
125
+ /* @__PURE__ */ jsx("button", { onClick: copyHash, className: "font-mono text-sm font-medium transition-opacity active:opacity-60", children: copied ? "Copied \u2713" : short(a.txHash) })
126
+ ] })
127
+ ] }),
128
+ /* @__PURE__ */ jsx(
129
+ "a",
130
+ {
131
+ href: explorerTxUrl(explorerUrl, a.txHash),
132
+ target: "_blank",
133
+ rel: "noopener noreferrer",
134
+ className: "text-center text-xs font-medium text-muted-foreground underline underline-offset-2",
135
+ children: "View on Voyager \u2197"
136
+ }
137
+ )
138
+ ] }) });
139
+ }
140
+ function ProtocolActivityRow({ item }) {
141
+ const { resolveImage } = useMediaWalletApp();
142
+ const img = resolveImage(item.token?.image ?? null);
143
+ const seed = item.txHash ?? item.orderHash ?? item.type;
144
+ return /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 rounded-2xl bg-card/40 px-4 py-3 backdrop-blur-sm", children: [
145
+ /* @__PURE__ */ jsx("div", { className: "relative h-11 w-11 shrink-0 overflow-hidden rounded-2xl", style: img ? void 0 : { background: gradFor(seed) }, children: img && /* @__PURE__ */ jsx(Image, { src: img, alt: "", fill: true, className: "object-cover" }) }),
146
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
147
+ /* @__PURE__ */ jsx("div", { className: "text-sm font-semibold capitalize", children: item.type }),
148
+ item.token?.name && /* @__PURE__ */ jsx("div", { className: "truncate text-xs text-muted-foreground", children: item.token.name })
149
+ ] }),
150
+ /* @__PURE__ */ jsxs("div", { className: "shrink-0 text-right", children: [
151
+ item.price?.raw && item.price.currency && /* @__PURE__ */ jsxs("div", { className: "text-sm font-semibold tabular-nums", children: [
152
+ fmt(BigInt(item.price.raw), getTokenBySymbol(item.price.currency)?.decimals ?? 18),
153
+ " ",
154
+ /* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground", children: item.price.currency })
155
+ ] }),
156
+ /* @__PURE__ */ jsx("div", { className: "text-xs text-muted-foreground", children: when(item.timestamp) })
157
+ ] })
158
+ ] });
159
+ }
160
+ function ActivityLoading() {
161
+ return /* @__PURE__ */ jsxs("div", { className: "flex min-h-[40vh] flex-col items-center justify-center gap-3", children: [
162
+ /* @__PURE__ */ jsx("span", { className: "h-6 w-6 animate-spin rounded-full border-2 border-border border-t-foreground" }),
163
+ /* @__PURE__ */ jsx("div", { className: "text-sm text-muted-foreground", children: "Loading your activity\u2026" })
164
+ ] });
165
+ }
166
+ function ActivityLoadError({ onRetry }) {
167
+ return /* @__PURE__ */ jsxs("div", { className: "card-base flex flex-col items-center gap-3 px-6 py-8 text-center", children: [
168
+ /* @__PURE__ */ jsx("div", { className: "grid h-11 w-11 place-items-center rounded-2xl bg-destructive/10 text-destructive", children: /* @__PURE__ */ jsxs("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
169
+ /* @__PURE__ */ jsx("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" }),
170
+ /* @__PURE__ */ jsx("path", { d: "M12 9v4M12 17h.01" })
171
+ ] }) }),
172
+ /* @__PURE__ */ jsxs("div", { children: [
173
+ /* @__PURE__ */ jsx("div", { className: "text-sm font-semibold", children: "Couldn't load your activity" }),
174
+ /* @__PURE__ */ jsx("p", { className: "mx-auto mt-1 max-w-[16rem] text-xs leading-relaxed text-muted-foreground", children: "There was a problem reaching the server. Check your connection and try again." })
175
+ ] }),
176
+ /* @__PURE__ */ jsx(
177
+ "button",
178
+ {
179
+ onClick: onRetry,
180
+ className: "rounded-full border border-border px-4 py-2 text-xs font-semibold text-foreground transition-colors hover:bg-card",
181
+ children: "Try again"
182
+ }
183
+ )
184
+ ] });
185
+ }
186
+ export {
187
+ MediaWalletActivity
188
+ };
189
+ //# sourceMappingURL=media-wallet-activity.js.map
@@ -0,0 +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\";\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, getClient } = useMediaWalletApp();\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.getWalletActivity(address),\n client.getActivitiesByAddress(address, 1, 50),\n ]);\n if (live) setItems(mergeActivityFeeds(walletRes.data, protocolRes.data));\n } catch (e) {\n if (live) setError(describeError(e, \"We couldn't load your activity. Please try again.\").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 && <div className=\"text-sm text-muted-foreground\">No activity yet.</div>}\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&apos;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":[]}
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ "use client";
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __export = (target, all) => {
10
+ for (var name in all)
11
+ __defProp(target, name, { get: all[name], enumerable: true });
12
+ };
13
+ var __copyProps = (to, from, except, desc) => {
14
+ if (from && typeof from === "object" || typeof from === "function") {
15
+ for (let key of __getOwnPropNames(from))
16
+ if (!__hasOwnProp.call(to, key) && key !== except)
17
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
18
+ }
19
+ return to;
20
+ };
21
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
22
+ // If the importer is in node compatibility mode or this is not an ESM
23
+ // file that has been converted to a CommonJS file using a Babel-
24
+ // compatible transform (i.e. "__esModule" has not been set), then set
25
+ // "default" to the CommonJS "module.exports" for node compatibility.
26
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
27
+ mod
28
+ ));
29
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
30
+ var media_wallet_header_exports = {};
31
+ __export(media_wallet_header_exports, {
32
+ MediaWalletHeader: () => MediaWalletHeader
33
+ });
34
+ module.exports = __toCommonJS(media_wallet_header_exports);
35
+ var import_jsx_runtime = require("react/jsx-runtime");
36
+ var import_react = require("react");
37
+ var import_link = __toESM(require("../link.js"), 1);
38
+ var import_image = __toESM(require("../image.js"), 1);
39
+ var import_wallet_format = require("../../utils/media-wallet/wallet-format.js");
40
+ var import_copy_icon = require("./copy-icon.js");
41
+ var import_types = require("./types.js");
42
+ const noIdentity = () => ({});
43
+ function MediaWalletHeader({ address, onNavigate }) {
44
+ const { useHeaderIdentity = noIdentity, useAccountEmail } = (0, import_types.useMediaWalletApp)();
45
+ const headerIdentity = useHeaderIdentity(address);
46
+ const accountEmail = useAccountEmail();
47
+ const [copied, setCopied] = (0, import_react.useState)(false);
48
+ const avatarUrl = headerIdentity?.avatarUrl ?? null;
49
+ const copy = () => {
50
+ navigator.clipboard?.writeText(address).catch(() => {
51
+ });
52
+ setCopied(true);
53
+ setTimeout(() => setCopied(false), 1500);
54
+ };
55
+ const headline = headerIdentity?.headline ?? (0, import_wallet_format.short)(address);
56
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("header", { className: "flex flex-col items-center gap-2 pt-6", children: [
57
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
58
+ import_link.default,
59
+ {
60
+ href: "/settings",
61
+ onClick: onNavigate,
62
+ "aria-label": "Profile and settings",
63
+ className: "relative h-20 w-20 shrink-0 transition-transform active:scale-95",
64
+ children: [
65
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "relative h-full w-full overflow-hidden rounded-full bg-foreground/[0.06] ring-2 ring-foreground/10", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
66
+ import_image.default,
67
+ {
68
+ src: avatarUrl ?? "/icon.png",
69
+ alt: "",
70
+ fill: true,
71
+ unoptimized: true,
72
+ className: avatarUrl ? "object-cover" : "object-cover p-[16%]"
73
+ }
74
+ ) }),
75
+ headerIdentity?.badge
76
+ ]
77
+ }
78
+ ),
79
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
80
+ "button",
81
+ {
82
+ onClick: copy,
83
+ className: "flex items-center gap-1.5 font-[family-name:var(--font-display)] text-lg font-bold tracking-tight",
84
+ children: [
85
+ headline,
86
+ copied ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-[10px] font-normal text-muted-foreground", children: "copied \u2713" }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_copy_icon.CopyIcon, { className: "shrink-0 opacity-50" })
87
+ ]
88
+ }
89
+ ),
90
+ accountEmail && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-xs text-muted-foreground", children: accountEmail })
91
+ ] });
92
+ }
93
+ // Annotate the CommonJS export names for ESM import in node:
94
+ 0 && (module.exports = {
95
+ MediaWalletHeader
96
+ });
97
+ //# sourceMappingURL=media-wallet-header.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/media-wallet/media-wallet-header.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport Link from \"../link.js\";\nimport Image from \"../image.js\";\nimport { short } from \"../../utils/media-wallet/wallet-format.js\";\nimport { CopyIcon } from \"./copy-icon.js\";\nimport { useMediaWalletApp, type MediaWalletHeaderIdentity } from \"./types.js\";\n\nconst noIdentity = (): MediaWalletHeaderIdentity => ({});\n\nexport function MediaWalletHeader({ address, onNavigate }: { address: string; onNavigate: () => void }) {\n const { useHeaderIdentity = noIdentity, useAccountEmail } = useMediaWalletApp();\n const headerIdentity = useHeaderIdentity(address);\n const accountEmail = useAccountEmail();\n const [copied, setCopied] = useState(false);\n const avatarUrl = headerIdentity?.avatarUrl ?? null;\n\n const copy = () => {\n navigator.clipboard?.writeText(address).catch(() => {});\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n };\n\n const headline = headerIdentity?.headline ?? short(address);\n\n return (\n <header className=\"flex flex-col items-center gap-2 pt-6\">\n <Link\n href=\"/settings\"\n onClick={onNavigate}\n aria-label=\"Profile and settings\"\n className=\"relative h-20 w-20 shrink-0 transition-transform active:scale-95\"\n >\n <div className=\"relative h-full w-full overflow-hidden rounded-full bg-foreground/[0.06] ring-2 ring-foreground/10\">\n <Image\n src={avatarUrl ?? \"/icon.png\"}\n alt=\"\"\n fill\n unoptimized\n className={avatarUrl ? \"object-cover\" : \"object-cover p-[16%]\"}\n />\n </div>\n {headerIdentity?.badge}\n </Link>\n <button\n onClick={copy}\n className=\"flex items-center gap-1.5 font-[family-name:var(--font-display)] text-lg font-bold tracking-tight\"\n >\n {headline}\n {copied ? (\n <span className=\"text-[10px] font-normal text-muted-foreground\">copied ✓</span>\n ) : (\n <CopyIcon className=\"shrink-0 opacity-50\" />\n )}\n </button>\n {accountEmail && <span className=\"text-xs text-muted-foreground\">{accountEmail}</span>}\n </header>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA4BM;AA1BN,mBAAyB;AACzB,kBAAiB;AACjB,mBAAkB;AAClB,2BAAsB;AACtB,uBAAyB;AACzB,mBAAkE;AAElE,MAAM,aAAa,OAAkC,CAAC;AAE/C,SAAS,kBAAkB,EAAE,SAAS,WAAW,GAAgD;AACtG,QAAM,EAAE,oBAAoB,YAAY,gBAAgB,QAAI,gCAAkB;AAC9E,QAAM,iBAAiB,kBAAkB,OAAO;AAChD,QAAM,eAAe,gBAAgB;AACrC,QAAM,CAAC,QAAQ,SAAS,QAAI,uBAAS,KAAK;AAC1C,QAAM,YAAY,gBAAgB,aAAa;AAE/C,QAAM,OAAO,MAAM;AACjB,cAAU,WAAW,UAAU,OAAO,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AACtD,cAAU,IAAI;AACd,eAAW,MAAM,UAAU,KAAK,GAAG,IAAI;AAAA,EACzC;AAEA,QAAM,WAAW,gBAAgB,gBAAY,4BAAM,OAAO;AAE1D,SACE,6CAAC,YAAO,WAAU,yCAChB;AAAA;AAAA,MAAC,YAAAA;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS;AAAA,QACT,cAAW;AAAA,QACX,WAAU;AAAA,QAEV;AAAA,sDAAC,SAAI,WAAU,sGACb;AAAA,YAAC,aAAAC;AAAA,YAAA;AAAA,cACC,KAAK,aAAa;AAAA,cAClB,KAAI;AAAA,cACJ,MAAI;AAAA,cACJ,aAAW;AAAA,cACX,WAAW,YAAY,iBAAiB;AAAA;AAAA,UAC1C,GACF;AAAA,UACC,gBAAgB;AAAA;AAAA;AAAA,IACnB;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,QACT,WAAU;AAAA,QAET;AAAA;AAAA,UACA,SACC,4CAAC,UAAK,WAAU,iDAAgD,2BAAQ,IAExE,4CAAC,6BAAS,WAAU,uBAAsB;AAAA;AAAA;AAAA,IAE9C;AAAA,IACC,gBAAgB,4CAAC,UAAK,WAAU,iCAAiC,wBAAa;AAAA,KACjF;AAEJ;","names":["Link","Image"]}
@@ -0,0 +1,8 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ declare function MediaWalletHeader({ address, onNavigate }: {
4
+ address: string;
5
+ onNavigate: () => void;
6
+ }): react_jsx_runtime.JSX.Element;
7
+
8
+ export { MediaWalletHeader };
@@ -0,0 +1,8 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ declare function MediaWalletHeader({ address, onNavigate }: {
4
+ address: string;
5
+ onNavigate: () => void;
6
+ }): react_jsx_runtime.JSX.Element;
7
+
8
+ export { MediaWalletHeader };
@@ -0,0 +1,63 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { useState } from "react";
4
+ import Link from "../link.js";
5
+ import Image from "../image.js";
6
+ import { short } from "../../utils/media-wallet/wallet-format.js";
7
+ import { CopyIcon } from "./copy-icon.js";
8
+ import { useMediaWalletApp } from "./types.js";
9
+ const noIdentity = () => ({});
10
+ function MediaWalletHeader({ address, onNavigate }) {
11
+ const { useHeaderIdentity = noIdentity, useAccountEmail } = useMediaWalletApp();
12
+ const headerIdentity = useHeaderIdentity(address);
13
+ const accountEmail = useAccountEmail();
14
+ const [copied, setCopied] = useState(false);
15
+ const avatarUrl = headerIdentity?.avatarUrl ?? null;
16
+ const copy = () => {
17
+ navigator.clipboard?.writeText(address).catch(() => {
18
+ });
19
+ setCopied(true);
20
+ setTimeout(() => setCopied(false), 1500);
21
+ };
22
+ const headline = headerIdentity?.headline ?? short(address);
23
+ return /* @__PURE__ */ jsxs("header", { className: "flex flex-col items-center gap-2 pt-6", children: [
24
+ /* @__PURE__ */ jsxs(
25
+ Link,
26
+ {
27
+ href: "/settings",
28
+ onClick: onNavigate,
29
+ "aria-label": "Profile and settings",
30
+ className: "relative h-20 w-20 shrink-0 transition-transform active:scale-95",
31
+ children: [
32
+ /* @__PURE__ */ jsx("div", { className: "relative h-full w-full overflow-hidden rounded-full bg-foreground/[0.06] ring-2 ring-foreground/10", children: /* @__PURE__ */ jsx(
33
+ Image,
34
+ {
35
+ src: avatarUrl ?? "/icon.png",
36
+ alt: "",
37
+ fill: true,
38
+ unoptimized: true,
39
+ className: avatarUrl ? "object-cover" : "object-cover p-[16%]"
40
+ }
41
+ ) }),
42
+ headerIdentity?.badge
43
+ ]
44
+ }
45
+ ),
46
+ /* @__PURE__ */ jsxs(
47
+ "button",
48
+ {
49
+ onClick: copy,
50
+ className: "flex items-center gap-1.5 font-[family-name:var(--font-display)] text-lg font-bold tracking-tight",
51
+ children: [
52
+ headline,
53
+ copied ? /* @__PURE__ */ jsx("span", { className: "text-[10px] font-normal text-muted-foreground", children: "copied \u2713" }) : /* @__PURE__ */ jsx(CopyIcon, { className: "shrink-0 opacity-50" })
54
+ ]
55
+ }
56
+ ),
57
+ accountEmail && /* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground", children: accountEmail })
58
+ ] });
59
+ }
60
+ export {
61
+ MediaWalletHeader
62
+ };
63
+ //# sourceMappingURL=media-wallet-header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/media-wallet/media-wallet-header.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport Link from \"../link.js\";\nimport Image from \"../image.js\";\nimport { short } from \"../../utils/media-wallet/wallet-format.js\";\nimport { CopyIcon } from \"./copy-icon.js\";\nimport { useMediaWalletApp, type MediaWalletHeaderIdentity } from \"./types.js\";\n\nconst noIdentity = (): MediaWalletHeaderIdentity => ({});\n\nexport function MediaWalletHeader({ address, onNavigate }: { address: string; onNavigate: () => void }) {\n const { useHeaderIdentity = noIdentity, useAccountEmail } = useMediaWalletApp();\n const headerIdentity = useHeaderIdentity(address);\n const accountEmail = useAccountEmail();\n const [copied, setCopied] = useState(false);\n const avatarUrl = headerIdentity?.avatarUrl ?? null;\n\n const copy = () => {\n navigator.clipboard?.writeText(address).catch(() => {});\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n };\n\n const headline = headerIdentity?.headline ?? short(address);\n\n return (\n <header className=\"flex flex-col items-center gap-2 pt-6\">\n <Link\n href=\"/settings\"\n onClick={onNavigate}\n aria-label=\"Profile and settings\"\n className=\"relative h-20 w-20 shrink-0 transition-transform active:scale-95\"\n >\n <div className=\"relative h-full w-full overflow-hidden rounded-full bg-foreground/[0.06] ring-2 ring-foreground/10\">\n <Image\n src={avatarUrl ?? \"/icon.png\"}\n alt=\"\"\n fill\n unoptimized\n className={avatarUrl ? \"object-cover\" : \"object-cover p-[16%]\"}\n />\n </div>\n {headerIdentity?.badge}\n </Link>\n <button\n onClick={copy}\n className=\"flex items-center gap-1.5 font-[family-name:var(--font-display)] text-lg font-bold tracking-tight\"\n >\n {headline}\n {copied ? (\n <span className=\"text-[10px] font-normal text-muted-foreground\">copied ✓</span>\n ) : (\n <CopyIcon className=\"shrink-0 opacity-50\" />\n )}\n </button>\n {accountEmail && <span className=\"text-xs text-muted-foreground\">{accountEmail}</span>}\n </header>\n );\n}\n"],"mappings":";AA4BM,SAOI,KAPJ;AA1BN,SAAS,gBAAgB;AACzB,OAAO,UAAU;AACjB,OAAO,WAAW;AAClB,SAAS,aAAa;AACtB,SAAS,gBAAgB;AACzB,SAAS,yBAAyD;AAElE,MAAM,aAAa,OAAkC,CAAC;AAE/C,SAAS,kBAAkB,EAAE,SAAS,WAAW,GAAgD;AACtG,QAAM,EAAE,oBAAoB,YAAY,gBAAgB,IAAI,kBAAkB;AAC9E,QAAM,iBAAiB,kBAAkB,OAAO;AAChD,QAAM,eAAe,gBAAgB;AACrC,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAC1C,QAAM,YAAY,gBAAgB,aAAa;AAE/C,QAAM,OAAO,MAAM;AACjB,cAAU,WAAW,UAAU,OAAO,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AACtD,cAAU,IAAI;AACd,eAAW,MAAM,UAAU,KAAK,GAAG,IAAI;AAAA,EACzC;AAEA,QAAM,WAAW,gBAAgB,YAAY,MAAM,OAAO;AAE1D,SACE,qBAAC,YAAO,WAAU,yCAChB;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS;AAAA,QACT,cAAW;AAAA,QACX,WAAU;AAAA,QAEV;AAAA,8BAAC,SAAI,WAAU,sGACb;AAAA,YAAC;AAAA;AAAA,cACC,KAAK,aAAa;AAAA,cAClB,KAAI;AAAA,cACJ,MAAI;AAAA,cACJ,aAAW;AAAA,cACX,WAAW,YAAY,iBAAiB;AAAA;AAAA,UAC1C,GACF;AAAA,UACC,gBAAgB;AAAA;AAAA;AAAA,IACnB;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,QACT,WAAU;AAAA,QAET;AAAA;AAAA,UACA,SACC,oBAAC,UAAK,WAAU,iDAAgD,2BAAQ,IAExE,oBAAC,YAAS,WAAU,uBAAsB;AAAA;AAAA;AAAA,IAE9C;AAAA,IACC,gBAAgB,oBAAC,UAAK,WAAU,iCAAiC,wBAAa;AAAA,KACjF;AAEJ;","names":[]}