@fairmint/ui 0.3.1 → 0.3.3

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 (32) hide show
  1. package/dist/components/generic/DocumentRow/DocumentRow.cjs +297 -0
  2. package/dist/components/generic/DocumentRow/DocumentRow.cjs.map +1 -0
  3. package/dist/components/generic/DocumentRow/DocumentRow.d.ts +49 -0
  4. package/dist/components/generic/DocumentRow/DocumentRow.d.ts.map +1 -0
  5. package/dist/components/generic/DocumentRow/DocumentRow.js +297 -0
  6. package/dist/components/generic/DocumentRow/DocumentRow.js.map +1 -0
  7. package/dist/components/specific/WalletList/WalletList.cjs +129 -141
  8. package/dist/components/specific/WalletList/WalletList.cjs.map +1 -1
  9. package/dist/components/specific/WalletList/WalletList.d.ts +2 -10
  10. package/dist/components/specific/WalletList/WalletList.d.ts.map +1 -1
  11. package/dist/components/specific/WalletList/WalletList.js +131 -143
  12. package/dist/components/specific/WalletList/WalletList.js.map +1 -1
  13. package/dist/components/specific/WalletListItem/WalletListItem.cjs +161 -0
  14. package/dist/components/specific/WalletListItem/WalletListItem.cjs.map +1 -0
  15. package/dist/components/specific/WalletListItem/WalletListItem.d.ts +32 -0
  16. package/dist/components/specific/WalletListItem/WalletListItem.d.ts.map +1 -0
  17. package/dist/components/specific/WalletListItem/WalletListItem.js +161 -0
  18. package/dist/components/specific/WalletListItem/WalletListItem.js.map +1 -0
  19. package/dist/fairmint-ui.cjs +6 -0
  20. package/dist/fairmint-ui.cjs.map +1 -1
  21. package/dist/fairmint-ui.js +9 -3
  22. package/dist/fairmint-ui.js.map +1 -1
  23. package/dist/index.d.ts +9 -4
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/styles.css +2 -1
  26. package/dist/utils/wallets.cjs +18 -2
  27. package/dist/utils/wallets.cjs.map +1 -1
  28. package/dist/utils/wallets.d.ts +13 -0
  29. package/dist/utils/wallets.d.ts.map +1 -1
  30. package/dist/utils/wallets.js +18 -2
  31. package/dist/utils/wallets.js.map +1 -1
  32. package/package.json +1 -1
@@ -8,28 +8,15 @@ const wallets = require("../../../utils/wallets.cjs");
8
8
  const ConfirmDialog = require("../../generic/ConfirmDialog/ConfirmDialog.cjs");
9
9
  const EmptyState = require("../../generic/EmptyState/EmptyState.cjs");
10
10
  const ActionIcon = require("../../primitives/ActionIcon/ActionIcon.cjs");
11
- const Badge = require("../../primitives/Badge/Badge.cjs");
12
11
  const Button = require("../../primitives/Button/Button.cjs");
13
12
  const layout = require("../../primitives/layout.cjs");
14
13
  const Menu = require("../../primitives/Menu/Menu.cjs");
15
14
  const TextInput = require("../../primitives/TextInput/TextInput.cjs");
15
+ const WalletListItem = require("../WalletListItem/WalletListItem.cjs");
16
16
  const Text = require("../../../node_modules/@mantine/core/esm/components/Text/Text.cjs");
17
17
  const colors = require("../../../theme/colors.cjs");
18
18
  const Group = require("../../../node_modules/@mantine/core/esm/components/Group/Group.cjs");
19
19
  const ThemeIcon = require("../../../node_modules/@mantine/core/esm/components/ThemeIcon/ThemeIcon.cjs");
20
- function getWalletIconColor(type) {
21
- const key = wallets.normalizeWalletType(type).replace(/_/g, " ");
22
- if (key === "fairmint" || key === "privy") return colors.colors.primary;
23
- if (key === "metamask") return colors.colors.warning;
24
- if (key === "coinbase wallet" || key === "coinbase smart wallet" || key === "coinbase custody")
25
- return colors.colors.info;
26
- if (key === "phantom") return colors.colors.brandPurple;
27
- if (key === "rainbow") return colors.colors.accent2;
28
- if (key === "manual") return colors.colors.neutral;
29
- if (key === "anchorage" || key === "bitgo" || key === "gemini custody" || key === "ledger vault" || key === "fireblocks")
30
- return colors.colors.success;
31
- return colors.colors.neutral;
32
- }
33
20
  function WalletList({
34
21
  wallets: wallets$1,
35
22
  onAdd,
@@ -90,15 +77,18 @@ function WalletList({
90
77
  setLabelError(null);
91
78
  }
92
79
  }, [wallets$1, renamingAddress, normalizeWalletAddress]);
93
- const copyAddress = React.useCallback(async (address2) => {
94
- try {
95
- await navigator.clipboard.writeText(address2);
96
- clearTimeout(copyTimeoutRef.current);
97
- setCopiedAddress(address2);
98
- copyTimeoutRef.current = setTimeout(() => setCopiedAddress(null), 2e3);
99
- } catch {
100
- }
101
- }, []);
80
+ const copyAddress = React.useCallback(
81
+ async (address2) => {
82
+ try {
83
+ await navigator.clipboard.writeText(address2);
84
+ clearTimeout(copyTimeoutRef.current);
85
+ setCopiedAddress(normalizeWalletAddress(address2));
86
+ copyTimeoutRef.current = setTimeout(() => setCopiedAddress(null), 2e3);
87
+ } catch {
88
+ }
89
+ },
90
+ [normalizeWalletAddress]
91
+ );
102
92
  const canAdd = !readOnly && !!onAdd;
103
93
  const canRemove = !readOnly && !!onRemove;
104
94
  const canSetDefault = !readOnly && !!onSetDefault;
@@ -199,16 +189,16 @@ function WalletList({
199
189
  return /* @__PURE__ */ jsxRuntime.jsxs(layout.Stack, { gap: "sm", children: [
200
190
  wallets$1.map((w) => {
201
191
  const normalizedWalletAddress = normalizeWalletAddress(w.address);
192
+ const isCopied = copiedAddress === normalizedWalletAddress;
202
193
  const setDefaultActionLoading = setDefaultLoading && (!setDefaultAddress || normalizeWalletAddress(setDefaultAddress) === normalizedWalletAddress);
203
194
  const labelActionLoading = labelLoading && (!labelAddress || normalizeWalletAddress(labelAddress) === normalizedWalletAddress);
204
195
  const explorerUrl = getSafeExplorerUrl(w.address);
205
196
  const isRenaming = normalizeWalletAddress(renamingAddress ?? "") === normalizedWalletAddress;
206
197
  const displayName = wallets.getWalletDisplayName(w, typeLabels);
207
- const kindPill = wallets.getWalletKindPill(w.type, typeLabels);
208
198
  const isDefault = !!w.defaultRecipient;
209
199
  const canBeRemoved = canRemove && (removableTypes ? removableTypes.some((t) => wallets.normalizeWalletType(t) === wallets.normalizeWalletType(w.type)) : wallets.isRemovableWalletType(w.type));
210
200
  const hasMenuActions = canSetDefault && !!defaultIcon && !isDefault || canLabel && !!renameIcon || !!explorerUrl && !!explorerIcon || canBeRemoved && !!removeIcon;
211
- return /* @__PURE__ */ jsxRuntime.jsx(layout.Stack, { gap: 0, children: /* @__PURE__ */ jsxRuntime.jsxs(
201
+ return /* @__PURE__ */ jsxRuntime.jsx(layout.Stack, { gap: 0, children: isRenaming ? /* @__PURE__ */ jsxRuntime.jsx(
212
202
  Group.Group,
213
203
  {
214
204
  justify: "space-between",
@@ -221,144 +211,142 @@ function WalletList({
221
211
  background: "transparent",
222
212
  boxShadow: `0 1px 3px ${index.shadowColor.card}`
223
213
  },
224
- children: [
225
- /* @__PURE__ */ jsxRuntime.jsxs(Group.Group, { gap: "sm", align: "flex-start", wrap: "nowrap", style: { flex: 1, minWidth: 0 }, children: [
226
- walletIcon && /* @__PURE__ */ jsxRuntime.jsx(
227
- ThemeIcon.ThemeIcon,
214
+ children: /* @__PURE__ */ jsxRuntime.jsxs(Group.Group, { gap: "sm", align: "flex-start", wrap: "nowrap", style: { flex: 1, minWidth: 0 }, children: [
215
+ walletIcon && /* @__PURE__ */ jsxRuntime.jsx(
216
+ ThemeIcon.ThemeIcon,
217
+ {
218
+ size: 40,
219
+ radius: "xl",
220
+ variant: "light",
221
+ color: wallets.getWalletIconColor(w.type),
222
+ style: { flexShrink: 0 },
223
+ children: walletIcon
224
+ }
225
+ ),
226
+ /* @__PURE__ */ jsxRuntime.jsxs(layout.Stack, { gap: 6, style: { flex: 1, minWidth: 0 }, children: [
227
+ /* @__PURE__ */ jsxRuntime.jsx(
228
+ TextInput.TextInput,
228
229
  {
229
- size: 40,
230
- radius: "xl",
231
- variant: "light",
232
- color: getWalletIconColor(w.type),
233
- style: { flexShrink: 0 },
234
- children: walletIcon
230
+ value: renameValue,
231
+ onChange: (e) => {
232
+ setRenameValue(e.currentTarget.value);
233
+ setLabelError(null);
234
+ },
235
+ placeholder: displayName,
236
+ size: "xs",
237
+ "aria-label": "Wallet label",
238
+ maxLength: 50,
239
+ error: labelError ?? void 0,
240
+ autoFocus: true
235
241
  }
236
242
  ),
237
- isRenaming ? /* @__PURE__ */ jsxRuntime.jsxs(layout.Stack, { gap: 6, style: { flex: 1, minWidth: 0 }, children: [
243
+ /* @__PURE__ */ jsxRuntime.jsxs(Group.Group, { gap: "xs", children: [
238
244
  /* @__PURE__ */ jsxRuntime.jsx(
239
- TextInput.TextInput,
245
+ Button.Button,
240
246
  {
241
- value: renameValue,
242
- onChange: (e) => {
243
- setRenameValue(e.currentTarget.value);
244
- setLabelError(null);
245
- },
246
- placeholder: wallets.getWalletDisplayName(w, typeLabels),
247
247
  size: "xs",
248
- "aria-label": "Wallet label",
249
- maxLength: 50,
250
- error: labelError ?? void 0,
251
- autoFocus: true
248
+ loading: labelActionLoading,
249
+ disabled: labelActionLoading,
250
+ onClick: () => handleLabelSave(w.address),
251
+ children: "Save"
252
252
  }
253
253
  ),
254
- /* @__PURE__ */ jsxRuntime.jsxs(Group.Group, { gap: "xs", children: [
255
- /* @__PURE__ */ jsxRuntime.jsx(
256
- Button.Button,
257
- {
258
- size: "xs",
259
- loading: labelActionLoading,
260
- disabled: labelActionLoading,
261
- onClick: () => handleLabelSave(w.address),
262
- children: "Save"
263
- }
264
- ),
265
- /* @__PURE__ */ jsxRuntime.jsx(
266
- Button.Button,
267
- {
268
- size: "xs",
269
- variant: "subtle",
270
- color: colors.colors.neutral,
271
- onClick: () => {
272
- setRenamingAddress(null);
273
- setLabelError(null);
274
- },
275
- children: "Cancel"
276
- }
277
- )
278
- ] })
279
- ] }) : /* @__PURE__ */ jsxRuntime.jsxs(layout.Stack, { gap: 4, style: { flex: 1, minWidth: 0 }, children: [
280
- /* @__PURE__ */ jsxRuntime.jsxs(Group.Group, { gap: "xs", align: "center", wrap: "wrap", children: [
281
- /* @__PURE__ */ jsxRuntime.jsx(Text.Text, { size: "sm", fw: 600, style: { wordBreak: "break-word" }, children: displayName }),
282
- isDefault && /* @__PURE__ */ jsxRuntime.jsx(Badge.Badge, { size: "xs", color: colors.colors.warning, variant: "light", tt: "uppercase", children: "Default" }),
283
- /* @__PURE__ */ jsxRuntime.jsx(Badge.Badge, { size: "xs", variant: "light", color: colors.colors.neutral, children: kindPill })
284
- ] }),
285
- /* @__PURE__ */ jsxRuntime.jsx(Text.Text, { size: "xs", ff: "monospace", c: index.fairmintVars.colorTextSecondary, children: address.truncateAddress(w.address) })
254
+ /* @__PURE__ */ jsxRuntime.jsx(
255
+ Button.Button,
256
+ {
257
+ size: "xs",
258
+ variant: "subtle",
259
+ color: colors.colors.neutral,
260
+ onClick: () => {
261
+ setRenamingAddress(null);
262
+ setLabelError(null);
263
+ },
264
+ children: "Cancel"
265
+ }
266
+ )
286
267
  ] })
287
- ] }),
288
- !isRenaming && /* @__PURE__ */ jsxRuntime.jsxs(Group.Group, { gap: 4, wrap: "nowrap", style: { flexShrink: 0 }, children: [
289
- copyIcon && /* @__PURE__ */ jsxRuntime.jsx(
268
+ ] })
269
+ ] })
270
+ }
271
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
272
+ WalletListItem.WalletListItem,
273
+ {
274
+ wallet: w,
275
+ typeLabels,
276
+ walletIcon,
277
+ rightSection: /* @__PURE__ */ jsxRuntime.jsxs(Group.Group, { gap: 4, wrap: "nowrap", style: { flexShrink: 0 }, children: [
278
+ copyIcon && /* @__PURE__ */ jsxRuntime.jsx(
279
+ ActionIcon.ActionIcon,
280
+ {
281
+ variant: "subtle",
282
+ size: "sm",
283
+ color: isCopied ? colors.colors.success : colors.colors.neutral,
284
+ onClick: () => copyAddress(w.address),
285
+ "aria-label": "Copy wallet address",
286
+ title: isCopied ? "Copied!" : "Copy address",
287
+ children: isCopied ? copiedIcon ?? copyIcon : copyIcon
288
+ }
289
+ ),
290
+ hasMenuActions && /* @__PURE__ */ jsxRuntime.jsxs(Menu.Menu, { position: "bottom-end", withinPortal: true, children: [
291
+ /* @__PURE__ */ jsxRuntime.jsx(Menu.Menu.Target, { children: /* @__PURE__ */ jsxRuntime.jsx(
290
292
  ActionIcon.ActionIcon,
291
293
  {
292
294
  variant: "subtle",
293
295
  size: "sm",
294
- color: copiedAddress === w.address ? colors.colors.success : colors.colors.neutral,
295
- onClick: () => copyAddress(w.address),
296
- "aria-label": "Copy wallet address",
297
- title: copiedAddress === w.address ? "Copied!" : "Copy address",
298
- children: copiedAddress === w.address ? copiedIcon ?? copyIcon : copyIcon
296
+ color: colors.colors.neutral,
297
+ "aria-label": "Wallet actions",
298
+ children: menuIcon ?? /* @__PURE__ */ jsxRuntime.jsx(Text.Text, { size: "xs", fw: 700, lh: 1, c: index.fairmintVars.colorTextSecondary, children: "•••" })
299
299
  }
300
- ),
301
- hasMenuActions && /* @__PURE__ */ jsxRuntime.jsxs(Menu.Menu, { position: "bottom-end", withinPortal: true, children: [
302
- /* @__PURE__ */ jsxRuntime.jsx(Menu.Menu.Target, { children: /* @__PURE__ */ jsxRuntime.jsx(
303
- ActionIcon.ActionIcon,
300
+ ) }),
301
+ /* @__PURE__ */ jsxRuntime.jsxs(Menu.Menu.Dropdown, { children: [
302
+ canSetDefault && defaultIcon && !isDefault && /* @__PURE__ */ jsxRuntime.jsx(
303
+ Menu.Menu.Item,
304
304
  {
305
- variant: "subtle",
306
- size: "sm",
307
- color: colors.colors.neutral,
308
- "aria-label": "Wallet actions",
309
- children: menuIcon ?? /* @__PURE__ */ jsxRuntime.jsx(Text.Text, { size: "xs", fw: 700, lh: 1, c: index.fairmintVars.colorTextSecondary, children: "•••" })
305
+ leftSection: defaultIcon,
306
+ onClick: () => handleSetDefault(w.address),
307
+ disabled: setDefaultActionLoading,
308
+ children: "Set as default"
310
309
  }
311
- ) }),
312
- /* @__PURE__ */ jsxRuntime.jsxs(Menu.Menu.Dropdown, { children: [
313
- canSetDefault && defaultIcon && !isDefault && /* @__PURE__ */ jsxRuntime.jsx(
314
- Menu.Menu.Item,
315
- {
316
- leftSection: defaultIcon,
317
- onClick: () => handleSetDefault(w.address),
318
- disabled: setDefaultActionLoading,
319
- children: "Set as default"
320
- }
321
- ),
322
- canLabel && renameIcon && /* @__PURE__ */ jsxRuntime.jsx(
323
- Menu.Menu.Item,
324
- {
325
- leftSection: renameIcon,
326
- onClick: () => {
327
- setLabelError(null);
328
- setRenamingAddress(w.address);
329
- setRenameValue(w.label ?? "");
330
- },
331
- children: "Rename"
332
- }
333
- ),
334
- explorerUrl && explorerIcon && /* @__PURE__ */ jsxRuntime.jsx(
310
+ ),
311
+ canLabel && renameIcon && /* @__PURE__ */ jsxRuntime.jsx(
312
+ Menu.Menu.Item,
313
+ {
314
+ leftSection: renameIcon,
315
+ onClick: () => {
316
+ setLabelError(null);
317
+ setRenamingAddress(w.address);
318
+ setRenameValue(w.label ?? "");
319
+ },
320
+ children: "Rename"
321
+ }
322
+ ),
323
+ explorerUrl && explorerIcon && /* @__PURE__ */ jsxRuntime.jsx(
324
+ Menu.Menu.Item,
325
+ {
326
+ leftSection: explorerIcon,
327
+ component: "a",
328
+ href: explorerUrl,
329
+ target: "_blank",
330
+ rel: "noopener noreferrer",
331
+ children: "View on explorer"
332
+ }
333
+ ),
334
+ canBeRemoved && removeIcon && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
335
+ /* @__PURE__ */ jsxRuntime.jsx(Menu.Menu.Divider, {}),
336
+ /* @__PURE__ */ jsxRuntime.jsx(
335
337
  Menu.Menu.Item,
336
338
  {
337
- leftSection: explorerIcon,
338
- component: "a",
339
- href: explorerUrl,
340
- target: "_blank",
341
- rel: "noopener noreferrer",
342
- children: "View on explorer"
339
+ leftSection: removeIcon,
340
+ color: colors.colors.error,
341
+ onClick: () => setWalletToRemove(w.address),
342
+ disabled: removeLoading,
343
+ children: "Remove wallet"
343
344
  }
344
- ),
345
- canBeRemoved && removeIcon && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
346
- /* @__PURE__ */ jsxRuntime.jsx(Menu.Menu.Divider, {}),
347
- /* @__PURE__ */ jsxRuntime.jsx(
348
- Menu.Menu.Item,
349
- {
350
- leftSection: removeIcon,
351
- color: colors.colors.error,
352
- onClick: () => setWalletToRemove(w.address),
353
- disabled: removeLoading,
354
- children: "Remove wallet"
355
- }
356
- )
357
- ] })
345
+ )
358
346
  ] })
359
347
  ] })
360
348
  ] })
361
- ]
349
+ ] })
362
350
  }
363
351
  ) }, wallets.walletKey(w));
364
352
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"WalletList.cjs","sources":["../../../../src/components/specific/WalletList/WalletList.tsx"],"sourcesContent":["import { type ReactNode, useCallback, useEffect, useRef, useState } from \"react\";\nimport { colors, fairmintVars, neutralColors, radii, shadowColor } from \"../../../theme\";\nimport { truncateAddress, validateEthereumAddress } from \"../../../utils/address\";\nimport {\n getWalletDisplayName,\n getWalletKindPill,\n isRemovableWalletType,\n normalizeWalletType,\n walletKey,\n} from \"../../../utils/wallets\";\nimport { ConfirmDialog } from \"../../generic/ConfirmDialog/ConfirmDialog\";\nimport { EmptyState } from \"../../generic/EmptyState/EmptyState\";\nimport { ActionIcon } from \"../../primitives/ActionIcon/ActionIcon\";\nimport { Badge } from \"../../primitives/Badge/Badge\";\nimport { Button } from \"../../primitives/Button/Button\";\nimport { Group, Stack, Text, ThemeIcon } from \"../../primitives/layout\";\nimport { Menu } from \"../../primitives/Menu/Menu\";\nimport { TextInput } from \"../../primitives/TextInput/TextInput\";\n\n/**\n * Map wallet type → ThemeIcon color for instant visual differentiation.\n * Falls back to neutral for unknown types.\n */\nfunction getWalletIconColor(type: unknown): string {\n // Normalize to lowercase with spaces so both \"coinbase_custody\" and \"coinbase custody\" match.\n const key = normalizeWalletType(type).replace(/_/g, \" \");\n if (key === \"fairmint\" || key === \"privy\") return colors.primary;\n if (key === \"metamask\") return colors.warning;\n if (key === \"coinbase wallet\" || key === \"coinbase smart wallet\" || key === \"coinbase custody\")\n return colors.info;\n if (key === \"phantom\") return colors.brandPurple;\n if (key === \"rainbow\") return colors.accent2;\n if (key === \"manual\") return colors.neutral;\n if (\n key === \"anchorage\" ||\n key === \"bitgo\" ||\n key === \"gemini custody\" ||\n key === \"ledger vault\" ||\n key === \"fireblocks\"\n )\n return colors.success;\n return colors.neutral;\n}\n\nexport interface Wallet {\n /** Ethereum wallet address. */\n address: string;\n /** Wallet type identifier (e.g. \"fairmint\", \"privy\", \"manual\"). */\n type: string;\n /** Optional display label. */\n label?: string | null;\n /** Whether this is the default equity recipient wallet. */\n defaultRecipient?: boolean;\n}\n\nexport interface WalletListProps {\n /** Wallets to display. */\n wallets: Wallet[];\n /** Called when user adds a new wallet address. */\n onAdd?: (address: string) => void | Promise<void>;\n /** Called when user confirms removal of a wallet address. */\n onRemove?: (address: string) => void | Promise<void>;\n /** Called when user sets a wallet as default recipient. */\n onSetDefault?: (address: string) => void | Promise<void>;\n /** Called when user saves a label for a wallet. Null clears the label. May reject — label error is displayed inline. */\n onLabel?: (address: string, label: string | null) => void | Promise<void>;\n /** Called when user clicks the connect wallet button (Privy linking). */\n onConnect?: () => void;\n /** Returns a block explorer URL for a wallet address. If omitted, explorer link is hidden. */\n getExplorerUrl?: (address: string) => string;\n /** Whether add/remove/edit actions are disabled (e.g. admin viewing another user). */\n readOnly?: boolean;\n /** Whether an add operation is in progress. */\n addLoading?: boolean;\n /** Whether a remove operation is in progress. */\n removeLoading?: boolean;\n /** Whether a set-default operation is in progress. */\n setDefaultLoading?: boolean;\n /** Address of the wallet currently being set as default (for per-row loading). */\n setDefaultAddress?: string;\n /** Whether a label operation is in progress. */\n labelLoading?: boolean;\n /** Address of the wallet currently being labeled (for per-row loading). */\n labelAddress?: string;\n /** Whether the connect wallet operation is in progress. */\n connectLoading?: boolean;\n /** Icon for the empty state. Passed as ReactNode. */\n emptyIcon?: ReactNode;\n /** Icon for the copy button. Passed as ReactNode. */\n copyIcon?: ReactNode;\n /** Icon for the \"copied\" state. Passed as ReactNode. */\n copiedIcon?: ReactNode;\n /** Icon for the remove button. Passed as ReactNode. */\n removeIcon?: ReactNode;\n /** Icon for the add button. Passed as ReactNode. */\n addIcon?: ReactNode;\n /** Icon for the set-default button. Passed as ReactNode. */\n defaultIcon?: ReactNode;\n /** Icon for the rename button. Passed as ReactNode. */\n renameIcon?: ReactNode;\n /** Icon for the block explorer link. Passed as ReactNode. */\n explorerIcon?: ReactNode;\n /** Icon for the connect wallet button. Passed as ReactNode. */\n connectIcon?: ReactNode;\n /** Icon for the overflow (kebab) menu trigger. Passed as ReactNode. */\n menuIcon?: ReactNode;\n /**\n * Override default type → label mapping.\n * @default Built-in: \"fairmint\"|\"privy\" → \"Fairmint Wallet\", \"manual\" → \"Manual\", else as-is\n */\n typeLabels?: Record<string, string>;\n /**\n * Which wallet types can be removed. Overrides the default system-type check.\n * @default All non-system types (everything except \"fairmint\" and \"privy\")\n */\n removableTypes?: string[];\n /** Additional content rendered below the wallet list (e.g. advanced wallet forms). */\n children?: ReactNode;\n /** Optional icon shown in a circle at the start of each wallet row. */\n walletIcon?: ReactNode;\n}\n\nexport function WalletList({\n wallets,\n onAdd,\n onRemove,\n onSetDefault,\n onLabel,\n onConnect,\n getExplorerUrl,\n readOnly = false,\n addLoading = false,\n removeLoading = false,\n setDefaultLoading = false,\n setDefaultAddress,\n labelLoading = false,\n labelAddress,\n connectLoading = false,\n emptyIcon,\n copyIcon,\n copiedIcon,\n removeIcon,\n addIcon,\n defaultIcon,\n renameIcon,\n explorerIcon,\n connectIcon,\n menuIcon,\n typeLabels,\n removableTypes,\n children,\n walletIcon,\n}: WalletListProps) {\n const normalizeWalletAddress = useCallback(\n (address: string | undefined) => address?.trim().toLowerCase() ?? \"\",\n [],\n );\n const [newAddress, setNewAddress] = useState(\"\");\n const [newLabel, setNewLabel] = useState(\"\");\n const [addressError, setAddressError] = useState<string | null>(null);\n const [showAddForm, setShowAddForm] = useState(false);\n const [walletToRemove, setWalletToRemove] = useState<string | null>(null);\n const [copiedAddress, setCopiedAddress] = useState<string | null>(null);\n const [renamingAddress, setRenamingAddress] = useState<string | null>(null);\n const [renameValue, setRenameValue] = useState(\"\");\n const [labelError, setLabelError] = useState<string | null>(null);\n const [setDefaultError, setSetDefaultError] = useState<string | null>(null);\n const copyTimeoutRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n\n useEffect(() => () => clearTimeout(copyTimeoutRef.current), []);\n\n useEffect(() => {\n if (readOnly) setRenamingAddress(null);\n }, [readOnly]);\n\n useEffect(() => {\n if (!renamingAddress) return;\n const normalized = normalizeWalletAddress(renamingAddress);\n const stillExists = wallets.some((w) => normalizeWalletAddress(w.address) === normalized);\n if (!stillExists) {\n setRenamingAddress(null);\n setRenameValue(\"\");\n setLabelError(null);\n }\n }, [wallets, renamingAddress, normalizeWalletAddress]);\n\n const copyAddress = useCallback(async (address: string) => {\n try {\n await navigator.clipboard.writeText(address);\n clearTimeout(copyTimeoutRef.current);\n setCopiedAddress(address);\n copyTimeoutRef.current = setTimeout(() => setCopiedAddress(null), 2000);\n } catch {\n // Clipboard API unavailable or denied\n }\n }, []);\n\n const canAdd = !readOnly && !!onAdd;\n const canRemove = !readOnly && !!onRemove;\n const canSetDefault = !readOnly && !!onSetDefault;\n const canLabel = !readOnly && !!onLabel;\n const canConnect = !readOnly && !!onConnect;\n\n const getSafeExplorerUrl = useCallback(\n (address: string) => {\n if (!getExplorerUrl) return null;\n try {\n const url = getExplorerUrl(address);\n if (!url) return null;\n const parsed = new URL(url);\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") return null;\n return parsed.toString();\n } catch {\n return null;\n }\n },\n [getExplorerUrl],\n );\n\n const handleAdd = async () => {\n const trimmed = newAddress.trim();\n const error = validateEthereumAddress(trimmed);\n if (error) {\n setAddressError(error);\n return;\n }\n setAddressError(null);\n setLabelError(null);\n try {\n await onAdd?.(trimmed);\n } catch (err) {\n setAddressError(err instanceof Error ? err.message : \"Failed to add wallet\");\n return;\n }\n // Wallet added — close the form. Attempt to save the label; on failure\n // surface an inline error so the user can rename manually.\n const label = newLabel.trim();\n setNewAddress(\"\");\n setShowAddForm(false);\n if (label && onLabel) {\n try {\n await onLabel(trimmed, label);\n setNewLabel(\"\");\n } catch {\n setNewLabel(\"\");\n setLabelError(\"Wallet added, but label could not be saved. You can rename it below.\");\n }\n } else {\n setNewLabel(\"\");\n }\n };\n\n const [removeError, setRemoveError] = useState<string | null>(null);\n\n const handleRemove = async () => {\n if (!walletToRemove) return;\n setRemoveError(null);\n try {\n await onRemove?.(walletToRemove);\n setWalletToRemove(null);\n } catch {\n setRemoveError(\"Failed to remove wallet. Please try again.\");\n }\n };\n\n const handleSetDefault = async (address: string) => {\n setSetDefaultError(null);\n try {\n await onSetDefault?.(address);\n } catch {\n setSetDefaultError(\"Failed to set default wallet. Please try again.\");\n }\n };\n\n const handleLabelSave = async (address: string) => {\n setLabelError(null);\n try {\n await onLabel?.(address, renameValue.trim() || null);\n setRenamingAddress((current) =>\n normalizeWalletAddress(current ?? \"\") === normalizeWalletAddress(address) ? null : current,\n );\n } catch {\n setLabelError(\"Failed to update label. Please try again.\");\n }\n };\n\n const hasWallets = wallets.length > 0;\n\n if (!hasWallets && !showAddForm && !canConnect) {\n return (\n <Stack gap=\"sm\">\n <EmptyState\n icon={emptyIcon}\n title=\"No wallets connected\"\n description=\"Connect a wallet to receive your equity on-chain when it vests.\"\n actionLabel={canAdd ? \"Add Wallet\" : undefined}\n onAction={canAdd ? () => setShowAddForm(true) : undefined}\n />\n {labelError && (\n <Text size=\"sm\" c={colors.error}>\n {labelError}\n </Text>\n )}\n {children}\n </Stack>\n );\n }\n\n return (\n <Stack gap=\"sm\">\n {wallets.map((w) => {\n const normalizedWalletAddress = normalizeWalletAddress(w.address);\n const setDefaultActionLoading =\n setDefaultLoading &&\n (!setDefaultAddress ||\n normalizeWalletAddress(setDefaultAddress) === normalizedWalletAddress);\n const labelActionLoading =\n labelLoading &&\n (!labelAddress || normalizeWalletAddress(labelAddress) === normalizedWalletAddress);\n const explorerUrl = getSafeExplorerUrl(w.address);\n const isRenaming =\n normalizeWalletAddress(renamingAddress ?? \"\") === normalizedWalletAddress;\n\n const displayName = getWalletDisplayName(w, typeLabels);\n const kindPill = getWalletKindPill(w.type, typeLabels);\n\n const isDefault = !!w.defaultRecipient;\n const canBeRemoved =\n canRemove &&\n (removableTypes\n ? removableTypes.some((t) => normalizeWalletType(t) === normalizeWalletType(w.type))\n : isRemovableWalletType(w.type));\n\n const hasMenuActions =\n (canSetDefault && !!defaultIcon && !isDefault) ||\n (canLabel && !!renameIcon) ||\n (!!explorerUrl && !!explorerIcon) ||\n (canBeRemoved && !!removeIcon);\n\n return (\n <Stack key={walletKey(w)} gap={0}>\n <Group\n justify=\"space-between\"\n align=\"flex-start\"\n wrap=\"nowrap\"\n p=\"md\"\n style={{\n borderRadius: radii.lg,\n border: `1px solid ${neutralColors[200]}`,\n background: \"transparent\",\n boxShadow: `0 1px 3px ${shadowColor.card}`,\n }}\n >\n {/* Left: icon + name + address */}\n <Group gap=\"sm\" align=\"flex-start\" wrap=\"nowrap\" style={{ flex: 1, minWidth: 0 }}>\n {walletIcon && (\n <ThemeIcon\n size={40}\n radius=\"xl\"\n variant=\"light\"\n color={getWalletIconColor(w.type)}\n style={{ flexShrink: 0 }}\n >\n {walletIcon}\n </ThemeIcon>\n )}\n\n {/* Inline rename mode — replaces name text in-place */}\n {isRenaming ? (\n <Stack gap={6} style={{ flex: 1, minWidth: 0 }}>\n <TextInput\n value={renameValue}\n onChange={(e) => {\n setRenameValue(e.currentTarget.value);\n setLabelError(null);\n }}\n placeholder={getWalletDisplayName(w, typeLabels)}\n size=\"xs\"\n aria-label=\"Wallet label\"\n maxLength={50}\n error={labelError ?? undefined}\n autoFocus\n />\n <Group gap=\"xs\">\n <Button\n size=\"xs\"\n loading={labelActionLoading}\n disabled={labelActionLoading}\n onClick={() => handleLabelSave(w.address)}\n >\n Save\n </Button>\n <Button\n size=\"xs\"\n variant=\"subtle\"\n color={colors.neutral}\n onClick={() => {\n setRenamingAddress(null);\n setLabelError(null);\n }}\n >\n Cancel\n </Button>\n </Group>\n </Stack>\n ) : (\n <Stack gap={4} style={{ flex: 1, minWidth: 0 }}>\n <Group gap=\"xs\" align=\"center\" wrap=\"wrap\">\n <Text size=\"sm\" fw={600} style={{ wordBreak: \"break-word\" }}>\n {displayName}\n </Text>\n {isDefault && (\n <Badge size=\"xs\" color={colors.warning} variant=\"light\" tt=\"uppercase\">\n Default\n </Badge>\n )}\n <Badge size=\"xs\" variant=\"light\" color={colors.neutral}>\n {kindPill}\n </Badge>\n </Group>\n <Text size=\"xs\" ff=\"monospace\" c={fairmintVars.colorTextSecondary}>\n {truncateAddress(w.address)}\n </Text>\n </Stack>\n )}\n </Group>\n\n {/* Right: copy shortcut + overflow menu */}\n {!isRenaming && (\n <Group gap={4} wrap=\"nowrap\" style={{ flexShrink: 0 }}>\n {/* Inline copy — most frequent action, stays visible */}\n {copyIcon && (\n <ActionIcon\n variant=\"subtle\"\n size=\"sm\"\n color={copiedAddress === w.address ? colors.success : colors.neutral}\n onClick={() => copyAddress(w.address)}\n aria-label=\"Copy wallet address\"\n title={copiedAddress === w.address ? \"Copied!\" : \"Copy address\"}\n >\n {copiedAddress === w.address ? (copiedIcon ?? copyIcon) : copyIcon}\n </ActionIcon>\n )}\n\n {/* Overflow menu — all secondary/destructive actions */}\n {hasMenuActions && (\n <Menu position=\"bottom-end\" withinPortal>\n <Menu.Target>\n <ActionIcon\n variant=\"subtle\"\n size=\"sm\"\n color={colors.neutral}\n aria-label=\"Wallet actions\"\n >\n {menuIcon ?? (\n <Text size=\"xs\" fw={700} lh={1} c={fairmintVars.colorTextSecondary}>\n •••\n </Text>\n )}\n </ActionIcon>\n </Menu.Target>\n <Menu.Dropdown>\n {canSetDefault && defaultIcon && !isDefault && (\n <Menu.Item\n leftSection={defaultIcon}\n onClick={() => handleSetDefault(w.address)}\n disabled={setDefaultActionLoading}\n >\n Set as default\n </Menu.Item>\n )}\n {canLabel && renameIcon && (\n <Menu.Item\n leftSection={renameIcon}\n onClick={() => {\n setLabelError(null);\n setRenamingAddress(w.address);\n setRenameValue(w.label ?? \"\");\n }}\n >\n Rename\n </Menu.Item>\n )}\n {explorerUrl && explorerIcon && (\n <Menu.Item\n leftSection={explorerIcon}\n component=\"a\"\n href={explorerUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n View on explorer\n </Menu.Item>\n )}\n {canBeRemoved && removeIcon && (\n <>\n <Menu.Divider />\n <Menu.Item\n leftSection={removeIcon}\n color={colors.error}\n onClick={() => setWalletToRemove(w.address)}\n disabled={removeLoading}\n >\n Remove wallet\n </Menu.Item>\n </>\n )}\n </Menu.Dropdown>\n </Menu>\n )}\n </Group>\n )}\n </Group>\n </Stack>\n );\n })}\n\n {setDefaultError && (\n <Text size=\"sm\" c={colors.error}>\n {setDefaultError}\n </Text>\n )}\n\n {/* Global label error — shown when labeling fails after add (no rename editor open) */}\n {labelError && !renamingAddress && (\n <Text size=\"sm\" c={colors.error}>\n {labelError}\n </Text>\n )}\n\n {!hasWallets && !showAddForm && (\n <EmptyState\n icon={emptyIcon}\n title=\"No wallets connected\"\n description=\"Connect a wallet to receive your equity on-chain when it vests.\"\n />\n )}\n\n {/* Add form — shown when user clicks add manually */}\n {canAdd && showAddForm && (\n <Stack gap=\"sm\" pt=\"xs\">\n <Stack gap=\"xs\">\n {canLabel && (\n <TextInput\n aria-label=\"Wallet label\"\n placeholder=\"Label (optional)\"\n size=\"sm\"\n value={newLabel}\n onChange={(e) => setNewLabel(e.currentTarget.value)}\n maxLength={50}\n autoFocus={true}\n />\n )}\n <TextInput\n placeholder=\"0x…\"\n size=\"sm\"\n autoFocus={!canLabel}\n aria-label=\"Wallet address\"\n aria-invalid={!!addressError}\n aria-describedby={addressError ? \"wallet-list-add-address-error\" : undefined}\n value={newAddress}\n onChange={(e) => {\n setNewAddress(e.currentTarget.value);\n setAddressError(null);\n }}\n error={\n addressError ? (\n <span id=\"wallet-list-add-address-error\" role=\"alert\">\n {addressError}\n </span>\n ) : undefined\n }\n />\n </Stack>\n <Group gap=\"xs\" justify=\"flex-end\">\n <Button\n size=\"sm\"\n variant=\"subtle\"\n color={colors.neutral}\n onClick={() => {\n setShowAddForm(false);\n setNewAddress(\"\");\n setNewLabel(\"\");\n setAddressError(null);\n setLabelError(null);\n }}\n >\n Cancel\n </Button>\n <Button size=\"sm\" onClick={handleAdd} loading={addLoading}>\n Add Wallet\n </Button>\n </Group>\n </Stack>\n )}\n\n {/* Action buttons — connect + manual add triggers */}\n {(canConnect || canAdd) && !showAddForm && (\n <Stack gap=\"xs\" pt=\"xs\">\n {canConnect && (\n <Button\n variant=\"subtle\"\n size=\"sm\"\n fullWidth\n leftSection={connectIcon}\n onClick={onConnect}\n loading={connectLoading}\n >\n Connect Wallet\n </Button>\n )}\n {canAdd && (\n <Button\n variant=\"subtle\"\n size=\"sm\"\n fullWidth\n leftSection={addIcon}\n color={colors.neutral}\n onClick={() => setShowAddForm(true)}\n >\n {canConnect ? \"Add manually\" : \"Add Wallet\"}\n </Button>\n )}\n </Stack>\n )}\n\n {children}\n\n <ConfirmDialog\n title=\"Remove Wallet\"\n message={\n <Stack gap=\"sm\">\n <Text size=\"sm\">\n Are you sure you want to remove this wallet address? This action cannot be undone.\n </Text>\n {walletToRemove && (\n <Text size=\"sm\" ff=\"monospace\" c={fairmintVars.colorTextSecondary}>\n {walletToRemove}\n </Text>\n )}\n {removeError && (\n <Text size=\"sm\" c={colors.error}>\n {removeError}\n </Text>\n )}\n </Stack>\n }\n opened={walletToRemove !== null}\n confirmLabel=\"Remove\"\n confirmColor={colors.error}\n onConfirm={handleRemove}\n onCancel={() => {\n setWalletToRemove(null);\n setRemoveError(null);\n }}\n loading={removeLoading}\n />\n </Stack>\n );\n}\n"],"names":["normalizeWalletType","colors","wallets","useCallback","address","useState","useRef","useEffect","validateEthereumAddress","jsxs","Stack","jsx","EmptyState","Text","getWalletDisplayName","getWalletKindPill","isRemovableWalletType","Group","radii","neutralColors","shadowColor","ThemeIcon","TextInput","Button","Badge","fairmintVars","truncateAddress","ActionIcon","Menu","Fragment","walletKey","ConfirmDialog"],"mappings":"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"}
1
+ {"version":3,"file":"WalletList.cjs","sources":["../../../../src/components/specific/WalletList/WalletList.tsx"],"sourcesContent":["import { type ReactNode, useCallback, useEffect, useRef, useState } from \"react\";\nimport { colors, fairmintVars, neutralColors, radii, shadowColor } from \"../../../theme\";\nimport { validateEthereumAddress } from \"../../../utils/address\";\nimport {\n getWalletDisplayName,\n getWalletIconColor,\n isRemovableWalletType,\n normalizeWalletType,\n type Wallet,\n walletKey,\n} from \"../../../utils/wallets\";\nimport { ConfirmDialog } from \"../../generic/ConfirmDialog/ConfirmDialog\";\nimport { EmptyState } from \"../../generic/EmptyState/EmptyState\";\nimport { ActionIcon } from \"../../primitives/ActionIcon/ActionIcon\";\nimport { Button } from \"../../primitives/Button/Button\";\nimport { Group, Stack, Text, ThemeIcon } from \"../../primitives/layout\";\nimport { Menu } from \"../../primitives/Menu/Menu\";\nimport { TextInput } from \"../../primitives/TextInput/TextInput\";\nimport { WalletListItem } from \"../WalletListItem/WalletListItem\";\n\nexport type { Wallet };\n\nexport interface WalletListProps {\n /** Wallets to display. */\n wallets: Wallet[];\n /** Called when user adds a new wallet address. */\n onAdd?: (address: string) => void | Promise<void>;\n /** Called when user confirms removal of a wallet address. */\n onRemove?: (address: string) => void | Promise<void>;\n /** Called when user sets a wallet as default recipient. */\n onSetDefault?: (address: string) => void | Promise<void>;\n /** Called when user saves a label for a wallet. Null clears the label. May reject — label error is displayed inline. */\n onLabel?: (address: string, label: string | null) => void | Promise<void>;\n /** Called when user clicks the connect wallet button (Privy linking). */\n onConnect?: () => void;\n /** Returns a block explorer URL for a wallet address. If omitted, explorer link is hidden. */\n getExplorerUrl?: (address: string) => string;\n /** Whether add/remove/edit actions are disabled (e.g. admin viewing another user). */\n readOnly?: boolean;\n /** Whether an add operation is in progress. */\n addLoading?: boolean;\n /** Whether a remove operation is in progress. */\n removeLoading?: boolean;\n /** Whether a set-default operation is in progress. */\n setDefaultLoading?: boolean;\n /** Address of the wallet currently being set as default (for per-row loading). */\n setDefaultAddress?: string;\n /** Whether a label operation is in progress. */\n labelLoading?: boolean;\n /** Address of the wallet currently being labeled (for per-row loading). */\n labelAddress?: string;\n /** Whether the connect wallet operation is in progress. */\n connectLoading?: boolean;\n /** Icon for the empty state. Passed as ReactNode. */\n emptyIcon?: ReactNode;\n /** Icon for the copy button. Passed as ReactNode. */\n copyIcon?: ReactNode;\n /** Icon for the \"copied\" state. Passed as ReactNode. */\n copiedIcon?: ReactNode;\n /** Icon for the remove button. Passed as ReactNode. */\n removeIcon?: ReactNode;\n /** Icon for the add button. Passed as ReactNode. */\n addIcon?: ReactNode;\n /** Icon for the set-default button. Passed as ReactNode. */\n defaultIcon?: ReactNode;\n /** Icon for the rename button. Passed as ReactNode. */\n renameIcon?: ReactNode;\n /** Icon for the block explorer link. Passed as ReactNode. */\n explorerIcon?: ReactNode;\n /** Icon for the connect wallet button. Passed as ReactNode. */\n connectIcon?: ReactNode;\n /** Icon for the overflow (kebab) menu trigger. Passed as ReactNode. */\n menuIcon?: ReactNode;\n /**\n * Override default type → label mapping.\n * @default Built-in: \"fairmint\"|\"privy\" → \"Fairmint Wallet\", \"manual\" → \"Manual\", else as-is\n */\n typeLabels?: Record<string, string>;\n /**\n * Which wallet types can be removed. Overrides the default system-type check.\n * @default All non-system types (everything except \"fairmint\" and \"privy\")\n */\n removableTypes?: string[];\n /** Additional content rendered below the wallet list (e.g. advanced wallet forms). */\n children?: ReactNode;\n /** Optional icon shown in a circle at the start of each wallet row. */\n walletIcon?: ReactNode;\n}\n\nexport function WalletList({\n wallets,\n onAdd,\n onRemove,\n onSetDefault,\n onLabel,\n onConnect,\n getExplorerUrl,\n readOnly = false,\n addLoading = false,\n removeLoading = false,\n setDefaultLoading = false,\n setDefaultAddress,\n labelLoading = false,\n labelAddress,\n connectLoading = false,\n emptyIcon,\n copyIcon,\n copiedIcon,\n removeIcon,\n addIcon,\n defaultIcon,\n renameIcon,\n explorerIcon,\n connectIcon,\n menuIcon,\n typeLabels,\n removableTypes,\n children,\n walletIcon,\n}: WalletListProps) {\n const normalizeWalletAddress = useCallback(\n (address: string | undefined) => address?.trim().toLowerCase() ?? \"\",\n [],\n );\n const [newAddress, setNewAddress] = useState(\"\");\n const [newLabel, setNewLabel] = useState(\"\");\n const [addressError, setAddressError] = useState<string | null>(null);\n const [showAddForm, setShowAddForm] = useState(false);\n const [walletToRemove, setWalletToRemove] = useState<string | null>(null);\n const [copiedAddress, setCopiedAddress] = useState<string | null>(null);\n const [renamingAddress, setRenamingAddress] = useState<string | null>(null);\n const [renameValue, setRenameValue] = useState(\"\");\n const [labelError, setLabelError] = useState<string | null>(null);\n const [setDefaultError, setSetDefaultError] = useState<string | null>(null);\n const copyTimeoutRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n\n useEffect(() => () => clearTimeout(copyTimeoutRef.current), []);\n\n useEffect(() => {\n if (readOnly) setRenamingAddress(null);\n }, [readOnly]);\n\n useEffect(() => {\n if (!renamingAddress) return;\n const normalized = normalizeWalletAddress(renamingAddress);\n const stillExists = wallets.some((w) => normalizeWalletAddress(w.address) === normalized);\n if (!stillExists) {\n setRenamingAddress(null);\n setRenameValue(\"\");\n setLabelError(null);\n }\n }, [wallets, renamingAddress, normalizeWalletAddress]);\n\n const copyAddress = useCallback(\n async (address: string) => {\n try {\n await navigator.clipboard.writeText(address);\n clearTimeout(copyTimeoutRef.current);\n // Store normalized so feedback survives parent re-renders that change EIP-55 casing.\n setCopiedAddress(normalizeWalletAddress(address));\n copyTimeoutRef.current = setTimeout(() => setCopiedAddress(null), 2000);\n } catch {\n // Clipboard API unavailable or denied\n }\n },\n [normalizeWalletAddress],\n );\n\n const canAdd = !readOnly && !!onAdd;\n const canRemove = !readOnly && !!onRemove;\n const canSetDefault = !readOnly && !!onSetDefault;\n const canLabel = !readOnly && !!onLabel;\n const canConnect = !readOnly && !!onConnect;\n\n const getSafeExplorerUrl = useCallback(\n (address: string) => {\n if (!getExplorerUrl) return null;\n try {\n const url = getExplorerUrl(address);\n if (!url) return null;\n const parsed = new URL(url);\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") return null;\n return parsed.toString();\n } catch {\n return null;\n }\n },\n [getExplorerUrl],\n );\n\n const handleAdd = async () => {\n const trimmed = newAddress.trim();\n const error = validateEthereumAddress(trimmed);\n if (error) {\n setAddressError(error);\n return;\n }\n setAddressError(null);\n setLabelError(null);\n try {\n await onAdd?.(trimmed);\n } catch (err) {\n setAddressError(err instanceof Error ? err.message : \"Failed to add wallet\");\n return;\n }\n // Wallet added — close the form. Attempt to save the label; on failure\n // surface an inline error so the user can rename manually.\n const label = newLabel.trim();\n setNewAddress(\"\");\n setShowAddForm(false);\n if (label && onLabel) {\n try {\n await onLabel(trimmed, label);\n setNewLabel(\"\");\n } catch {\n setNewLabel(\"\");\n setLabelError(\"Wallet added, but label could not be saved. You can rename it below.\");\n }\n } else {\n setNewLabel(\"\");\n }\n };\n\n const [removeError, setRemoveError] = useState<string | null>(null);\n\n const handleRemove = async () => {\n if (!walletToRemove) return;\n setRemoveError(null);\n try {\n await onRemove?.(walletToRemove);\n setWalletToRemove(null);\n } catch {\n setRemoveError(\"Failed to remove wallet. Please try again.\");\n }\n };\n\n const handleSetDefault = async (address: string) => {\n setSetDefaultError(null);\n try {\n await onSetDefault?.(address);\n } catch {\n setSetDefaultError(\"Failed to set default wallet. Please try again.\");\n }\n };\n\n const handleLabelSave = async (address: string) => {\n setLabelError(null);\n try {\n await onLabel?.(address, renameValue.trim() || null);\n setRenamingAddress((current) =>\n normalizeWalletAddress(current ?? \"\") === normalizeWalletAddress(address) ? null : current,\n );\n } catch {\n setLabelError(\"Failed to update label. Please try again.\");\n }\n };\n\n const hasWallets = wallets.length > 0;\n\n if (!hasWallets && !showAddForm && !canConnect) {\n return (\n <Stack gap=\"sm\">\n <EmptyState\n icon={emptyIcon}\n title=\"No wallets connected\"\n description=\"Connect a wallet to receive your equity on-chain when it vests.\"\n actionLabel={canAdd ? \"Add Wallet\" : undefined}\n onAction={canAdd ? () => setShowAddForm(true) : undefined}\n />\n {labelError && (\n <Text size=\"sm\" c={colors.error}>\n {labelError}\n </Text>\n )}\n {children}\n </Stack>\n );\n }\n\n return (\n <Stack gap=\"sm\">\n {wallets.map((w) => {\n const normalizedWalletAddress = normalizeWalletAddress(w.address);\n const isCopied = copiedAddress === normalizedWalletAddress;\n const setDefaultActionLoading =\n setDefaultLoading &&\n (!setDefaultAddress ||\n normalizeWalletAddress(setDefaultAddress) === normalizedWalletAddress);\n const labelActionLoading =\n labelLoading &&\n (!labelAddress || normalizeWalletAddress(labelAddress) === normalizedWalletAddress);\n const explorerUrl = getSafeExplorerUrl(w.address);\n const isRenaming =\n normalizeWalletAddress(renamingAddress ?? \"\") === normalizedWalletAddress;\n\n const displayName = getWalletDisplayName(w, typeLabels);\n const isDefault = !!w.defaultRecipient;\n const canBeRemoved =\n canRemove &&\n (removableTypes\n ? removableTypes.some((t) => normalizeWalletType(t) === normalizeWalletType(w.type))\n : isRemovableWalletType(w.type));\n\n const hasMenuActions =\n (canSetDefault && !!defaultIcon && !isDefault) ||\n (canLabel && !!renameIcon) ||\n (!!explorerUrl && !!explorerIcon) ||\n (canBeRemoved && !!removeIcon);\n\n return (\n <Stack key={walletKey(w)} gap={0}>\n {isRenaming ? (\n <Group\n justify=\"space-between\"\n align=\"flex-start\"\n wrap=\"nowrap\"\n p=\"md\"\n style={{\n borderRadius: radii.lg,\n border: `1px solid ${neutralColors[200]}`,\n background: \"transparent\",\n boxShadow: `0 1px 3px ${shadowColor.card}`,\n }}\n >\n <Group gap=\"sm\" align=\"flex-start\" wrap=\"nowrap\" style={{ flex: 1, minWidth: 0 }}>\n {walletIcon && (\n <ThemeIcon\n size={40}\n radius=\"xl\"\n variant=\"light\"\n color={getWalletIconColor(w.type)}\n style={{ flexShrink: 0 }}\n >\n {walletIcon}\n </ThemeIcon>\n )}\n <Stack gap={6} style={{ flex: 1, minWidth: 0 }}>\n <TextInput\n value={renameValue}\n onChange={(e) => {\n setRenameValue(e.currentTarget.value);\n setLabelError(null);\n }}\n placeholder={displayName}\n size=\"xs\"\n aria-label=\"Wallet label\"\n maxLength={50}\n error={labelError ?? undefined}\n autoFocus\n />\n <Group gap=\"xs\">\n <Button\n size=\"xs\"\n loading={labelActionLoading}\n disabled={labelActionLoading}\n onClick={() => handleLabelSave(w.address)}\n >\n Save\n </Button>\n <Button\n size=\"xs\"\n variant=\"subtle\"\n color={colors.neutral}\n onClick={() => {\n setRenamingAddress(null);\n setLabelError(null);\n }}\n >\n Cancel\n </Button>\n </Group>\n </Stack>\n </Group>\n </Group>\n ) : (\n <WalletListItem\n wallet={w}\n typeLabels={typeLabels}\n walletIcon={walletIcon}\n rightSection={\n <Group gap={4} wrap=\"nowrap\" style={{ flexShrink: 0 }}>\n {/* Inline copy — most frequent action, stays visible */}\n {copyIcon && (\n <ActionIcon\n variant=\"subtle\"\n size=\"sm\"\n color={isCopied ? colors.success : colors.neutral}\n onClick={() => copyAddress(w.address)}\n aria-label=\"Copy wallet address\"\n title={isCopied ? \"Copied!\" : \"Copy address\"}\n >\n {isCopied ? (copiedIcon ?? copyIcon) : copyIcon}\n </ActionIcon>\n )}\n\n {/* Overflow menu — all secondary/destructive actions */}\n {hasMenuActions && (\n <Menu position=\"bottom-end\" withinPortal>\n <Menu.Target>\n <ActionIcon\n variant=\"subtle\"\n size=\"sm\"\n color={colors.neutral}\n aria-label=\"Wallet actions\"\n >\n {menuIcon ?? (\n <Text size=\"xs\" fw={700} lh={1} c={fairmintVars.colorTextSecondary}>\n •••\n </Text>\n )}\n </ActionIcon>\n </Menu.Target>\n <Menu.Dropdown>\n {canSetDefault && defaultIcon && !isDefault && (\n <Menu.Item\n leftSection={defaultIcon}\n onClick={() => handleSetDefault(w.address)}\n disabled={setDefaultActionLoading}\n >\n Set as default\n </Menu.Item>\n )}\n {canLabel && renameIcon && (\n <Menu.Item\n leftSection={renameIcon}\n onClick={() => {\n setLabelError(null);\n setRenamingAddress(w.address);\n setRenameValue(w.label ?? \"\");\n }}\n >\n Rename\n </Menu.Item>\n )}\n {explorerUrl && explorerIcon && (\n <Menu.Item\n leftSection={explorerIcon}\n component=\"a\"\n href={explorerUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n View on explorer\n </Menu.Item>\n )}\n {canBeRemoved && removeIcon && (\n <>\n <Menu.Divider />\n <Menu.Item\n leftSection={removeIcon}\n color={colors.error}\n onClick={() => setWalletToRemove(w.address)}\n disabled={removeLoading}\n >\n Remove wallet\n </Menu.Item>\n </>\n )}\n </Menu.Dropdown>\n </Menu>\n )}\n </Group>\n }\n />\n )}\n </Stack>\n );\n })}\n\n {setDefaultError && (\n <Text size=\"sm\" c={colors.error}>\n {setDefaultError}\n </Text>\n )}\n\n {/* Global label error — shown when labeling fails after add (no rename editor open) */}\n {labelError && !renamingAddress && (\n <Text size=\"sm\" c={colors.error}>\n {labelError}\n </Text>\n )}\n\n {!hasWallets && !showAddForm && (\n <EmptyState\n icon={emptyIcon}\n title=\"No wallets connected\"\n description=\"Connect a wallet to receive your equity on-chain when it vests.\"\n />\n )}\n\n {/* Add form — shown when user clicks add manually */}\n {canAdd && showAddForm && (\n <Stack gap=\"sm\" pt=\"xs\">\n <Stack gap=\"xs\">\n {canLabel && (\n <TextInput\n aria-label=\"Wallet label\"\n placeholder=\"Label (optional)\"\n size=\"sm\"\n value={newLabel}\n onChange={(e) => setNewLabel(e.currentTarget.value)}\n maxLength={50}\n autoFocus={true}\n />\n )}\n <TextInput\n placeholder=\"0x…\"\n size=\"sm\"\n autoFocus={!canLabel}\n aria-label=\"Wallet address\"\n aria-invalid={!!addressError}\n aria-describedby={addressError ? \"wallet-list-add-address-error\" : undefined}\n value={newAddress}\n onChange={(e) => {\n setNewAddress(e.currentTarget.value);\n setAddressError(null);\n }}\n error={\n addressError ? (\n <span id=\"wallet-list-add-address-error\" role=\"alert\">\n {addressError}\n </span>\n ) : undefined\n }\n />\n </Stack>\n <Group gap=\"xs\" justify=\"flex-end\">\n <Button\n size=\"sm\"\n variant=\"subtle\"\n color={colors.neutral}\n onClick={() => {\n setShowAddForm(false);\n setNewAddress(\"\");\n setNewLabel(\"\");\n setAddressError(null);\n setLabelError(null);\n }}\n >\n Cancel\n </Button>\n <Button size=\"sm\" onClick={handleAdd} loading={addLoading}>\n Add Wallet\n </Button>\n </Group>\n </Stack>\n )}\n\n {/* Action buttons — connect + manual add triggers */}\n {(canConnect || canAdd) && !showAddForm && (\n <Stack gap=\"xs\" pt=\"xs\">\n {canConnect && (\n <Button\n variant=\"subtle\"\n size=\"sm\"\n fullWidth\n leftSection={connectIcon}\n onClick={onConnect}\n loading={connectLoading}\n >\n Connect Wallet\n </Button>\n )}\n {canAdd && (\n <Button\n variant=\"subtle\"\n size=\"sm\"\n fullWidth\n leftSection={addIcon}\n color={colors.neutral}\n onClick={() => setShowAddForm(true)}\n >\n {canConnect ? \"Add manually\" : \"Add Wallet\"}\n </Button>\n )}\n </Stack>\n )}\n\n {children}\n\n <ConfirmDialog\n title=\"Remove Wallet\"\n message={\n <Stack gap=\"sm\">\n <Text size=\"sm\">\n Are you sure you want to remove this wallet address? This action cannot be undone.\n </Text>\n {walletToRemove && (\n <Text size=\"sm\" ff=\"monospace\" c={fairmintVars.colorTextSecondary}>\n {walletToRemove}\n </Text>\n )}\n {removeError && (\n <Text size=\"sm\" c={colors.error}>\n {removeError}\n </Text>\n )}\n </Stack>\n }\n opened={walletToRemove !== null}\n confirmLabel=\"Remove\"\n confirmColor={colors.error}\n onConfirm={handleRemove}\n onCancel={() => {\n setWalletToRemove(null);\n setRemoveError(null);\n }}\n loading={removeLoading}\n />\n </Stack>\n );\n}\n"],"names":["wallets","useCallback","address","useState","useRef","useEffect","validateEthereumAddress","jsxs","Stack","jsx","EmptyState","Text","colors","getWalletDisplayName","normalizeWalletType","isRemovableWalletType","Group","radii","neutralColors","shadowColor","ThemeIcon","getWalletIconColor","TextInput","Button","WalletListItem","ActionIcon","Menu","fairmintVars","Fragment","walletKey","ConfirmDialog"],"mappings":"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"}
@@ -1,14 +1,6 @@
1
1
  import { ReactNode } from 'react';
2
- export interface Wallet {
3
- /** Ethereum wallet address. */
4
- address: string;
5
- /** Wallet type identifier (e.g. "fairmint", "privy", "manual"). */
6
- type: string;
7
- /** Optional display label. */
8
- label?: string | null;
9
- /** Whether this is the default equity recipient wallet. */
10
- defaultRecipient?: boolean;
11
- }
2
+ import { Wallet } from '../../../utils/wallets';
3
+ export type { Wallet };
12
4
  export interface WalletListProps {
13
5
  /** Wallets to display. */
14
6
  wallets: Wallet[];
@@ -1 +1 @@
1
- {"version":3,"file":"WalletList.d.ts","sourceRoot":"","sources":["../../../../src/components/specific/WalletList/WalletList.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"WalletList.d.ts","sourceRoot":"","sources":["../../../../src/components/specific/WalletList/WalletList.tsx"],"names":[],"mappings":"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"}