@wallet-ui/react 1.1.0-canary-20250313141953 → 1.1.0-canary-20250313144314

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.
@@ -1,32 +1,55 @@
1
1
  'use strict';
2
2
 
3
- var React4 = require('react');
3
+ var React10 = require('react');
4
4
  var gill = require('gill');
5
5
  var react = require('@wallet-standard/react');
6
+ var dialog = require('@zag-js/dialog');
7
+ var menu = require('@zag-js/menu');
8
+ var react$1 = require('@zag-js/react');
6
9
  var core = require('@wallet-ui/core');
7
10
 
8
11
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
9
12
 
10
- var React4__default = /*#__PURE__*/_interopDefault(React4);
13
+ function _interopNamespace(e) {
14
+ if (e && e.__esModule) return e;
15
+ var n = Object.create(null);
16
+ if (e) {
17
+ Object.keys(e).forEach(function (k) {
18
+ if (k !== 'default') {
19
+ var d = Object.getOwnPropertyDescriptor(e, k);
20
+ Object.defineProperty(n, k, d.get ? d : {
21
+ enumerable: true,
22
+ get: function () { return e[k]; }
23
+ });
24
+ }
25
+ });
26
+ }
27
+ n.default = e;
28
+ return Object.freeze(n);
29
+ }
30
+
31
+ var React10__default = /*#__PURE__*/_interopDefault(React10);
32
+ var dialog__namespace = /*#__PURE__*/_interopNamespace(dialog);
33
+ var menu__namespace = /*#__PURE__*/_interopNamespace(menu);
11
34
 
12
35
  // src/solana-client-context.tsx
13
- var SolanaClientContext = React4.createContext({});
36
+ var SolanaClientContext = React10.createContext({});
14
37
  function useSolanaClient() {
15
- return React4.useContext(SolanaClientContext);
38
+ return React10.useContext(SolanaClientContext);
16
39
  }
17
40
  function SolanaClientProvider({
18
41
  children,
19
42
  urlOrMoniker
20
43
  }) {
21
- const value = React4.useMemo(() => gill.createSolanaClient({ urlOrMoniker }), [urlOrMoniker]);
22
- return /* @__PURE__ */ React4__default.default.createElement(SolanaClientContext.Provider, { value }, children);
44
+ const value = React10.useMemo(() => gill.createSolanaClient({ urlOrMoniker }), [urlOrMoniker]);
45
+ return /* @__PURE__ */ React10__default.default.createElement(SolanaClientContext.Provider, { value }, children);
23
46
  }
24
- var SolanaClusterContext = React4.createContext({});
47
+ var SolanaClusterContext = React10.createContext({});
25
48
  function useSolanaCluster() {
26
- return React4.useContext(SolanaClusterContext);
49
+ return React10.useContext(SolanaClusterContext);
27
50
  }
28
51
  function useLocalStorage(key, initialValue) {
29
- const [storedValue, setStoredValue] = React4.useState(() => {
52
+ const [storedValue, setStoredValue] = React10.useState(() => {
30
53
  try {
31
54
  if (typeof window === "undefined") {
32
55
  return initialValue;
@@ -41,7 +64,7 @@ function useLocalStorage(key, initialValue) {
41
64
  return initialValue;
42
65
  }
43
66
  });
44
- const setValue = React4.useCallback(
67
+ const setValue = React10.useCallback(
45
68
  (value) => {
46
69
  try {
47
70
  const valueToStore = value instanceof Function ? value(storedValue) : value;
@@ -69,7 +92,7 @@ function SolanaClusterProvider({ clusters, children }) {
69
92
  if (!clusters.length) {
70
93
  throw new Error("No clusters provided");
71
94
  }
72
- const cluster = React4.useMemo(() => {
95
+ const cluster = React10.useMemo(() => {
73
96
  for (const cluster2 of clusters) {
74
97
  if (cluster2.id === clusterId) {
75
98
  return cluster2;
@@ -77,10 +100,10 @@ function SolanaClusterProvider({ clusters, children }) {
77
100
  }
78
101
  return clusters[0];
79
102
  }, [clusterId, clusters]);
80
- return /* @__PURE__ */ React4__default.default.createElement(
103
+ return /* @__PURE__ */ React10__default.default.createElement(
81
104
  SolanaClusterContext.Provider,
82
105
  {
83
- value: React4.useMemo(
106
+ value: React10.useMemo(
84
107
  () => ({
85
108
  cluster,
86
109
  clusters,
@@ -95,13 +118,13 @@ function SolanaClusterProvider({ clusters, children }) {
95
118
  children
96
119
  );
97
120
  }
98
- var SolanaWalletContext = React4.createContext([
121
+ var SolanaWalletContext = React10.createContext([
99
122
  void 0,
100
123
  function setSelectedWalletAccount() {
101
124
  }
102
125
  ]);
103
126
  function useSolanaWallet() {
104
- return React4.useContext(SolanaWalletContext);
127
+ return React10.useContext(SolanaWalletContext);
105
128
  }
106
129
  function useSolanaWalletAddress() {
107
130
  const [wallet] = useSolanaWallet();
@@ -138,7 +161,7 @@ function getSavedWalletAccount(wallets, savedWalletNameAndAddress) {
138
161
  function SolanaWalletProvider({ children }) {
139
162
  const [storedKey, setStoredKey] = useLocalStorage(STORAGE_KEY2, null);
140
163
  const wallets = react.useWallets();
141
- const [selectedWalletAccount, setSelectedWalletAccountInternal] = React4.useState(
164
+ const [selectedWalletAccount, setSelectedWalletAccountInternal] = React10.useState(
142
165
  () => getSavedWalletAccount(wallets, storedKey)
143
166
  );
144
167
  const setSelectedWalletAccount2 = (setStateAction) => {
@@ -154,13 +177,13 @@ function SolanaWalletProvider({ children }) {
154
177
  return nextWalletAccount;
155
178
  });
156
179
  };
157
- React4.useEffect(() => {
180
+ React10.useEffect(() => {
158
181
  const savedWalletAccount = getSavedWalletAccount(wallets, storedKey);
159
182
  if (savedWalletAccount) {
160
183
  setSelectedWalletAccountInternal(savedWalletAccount);
161
184
  }
162
185
  }, [wallets]);
163
- const walletAccount = React4.useMemo(() => {
186
+ const walletAccount = React10.useMemo(() => {
164
187
  if (selectedWalletAccount) {
165
188
  for (const uiWallet of wallets) {
166
189
  for (const uiWalletAccount of uiWallet.accounts) {
@@ -174,23 +197,195 @@ function SolanaWalletProvider({ children }) {
174
197
  }
175
198
  }
176
199
  }, [selectedWalletAccount, wallets]);
177
- React4.useEffect(() => {
200
+ React10.useEffect(() => {
178
201
  if (selectedWalletAccount && !walletAccount) {
179
202
  setSelectedWalletAccountInternal(void 0);
180
203
  }
181
204
  }, [selectedWalletAccount, walletAccount]);
182
- return /* @__PURE__ */ React4__default.default.createElement(SolanaWalletContext.Provider, { value: React4.useMemo(() => [walletAccount, setSelectedWalletAccount2], [walletAccount]) }, children);
205
+ return /* @__PURE__ */ React10__default.default.createElement(SolanaWalletContext.Provider, { value: React10.useMemo(() => [walletAccount, setSelectedWalletAccount2], [walletAccount]) }, children);
206
+ }
207
+ var SolanaWalletUiContext = React10__default.default.createContext(
208
+ {}
209
+ );
210
+ function useSolanaWalletUi() {
211
+ return React10__default.default.useContext(SolanaWalletUiContext);
212
+ }
213
+
214
+ // src/solana-wallet-ui-provider.tsx
215
+ function SolanaWalletUiProvider(props) {
216
+ const wallets = react.useWallets();
217
+ const [walletAccount, setWalletAccount] = useSolanaWallet();
218
+ const [wallet, setWallet] = React10.useState(void 0);
219
+ const dialogService = react$1.useMachine(dialog__namespace.machine, { id: React10.useId(), modal: true });
220
+ const dialogApi = dialog__namespace.connect(dialogService, react$1.normalizeProps);
221
+ const menuService = react$1.useMachine(menu__namespace.machine, { id: React10.useId() });
222
+ const menuApi = menu__namespace.connect(menuService, react$1.normalizeProps);
223
+ const [connected, setConnected] = React10.useState(false);
224
+ function change() {
225
+ menuService.send({ type: "CLOSE" });
226
+ dialogService.send({ type: "OPEN" });
227
+ }
228
+ function connectAccount(wallet2, account) {
229
+ console.log("connectAccount", account);
230
+ setWalletAccount(account);
231
+ setWallet(wallet2);
232
+ setConnected(true);
233
+ dialogService.send({ type: "CLOSE" });
234
+ }
235
+ async function copy() {
236
+ if (!walletAccount) {
237
+ return;
238
+ }
239
+ await navigator.clipboard.writeText(walletAccount.address);
240
+ menuService.send({ type: "CLOSE" });
241
+ dialogService.send({ type: "CLOSE" });
242
+ }
243
+ function disconnect() {
244
+ setConnected(false);
245
+ setWalletAccount(void 0);
246
+ dialogService.send({ type: "CLOSE" });
247
+ menuService.send({ type: "CLOSE" });
248
+ }
249
+ const value = {
250
+ change,
251
+ connectAccount,
252
+ connected: connected && walletAccount !== void 0,
253
+ copy,
254
+ dialogApi,
255
+ disconnect,
256
+ menuApi,
257
+ wallet,
258
+ walletAccount,
259
+ wallets: React10.useMemo(() => wallets.filter((wallet2) => wallet2.chains.some((i) => i.startsWith("solana:"))), [wallets])
260
+ };
261
+ return /* @__PURE__ */ React10__default.default.createElement(SolanaWalletUiContext.Provider, { value }, props.children);
183
262
  }
184
263
 
185
264
  // src/solana-provider.tsx
186
265
  function SolanaProvider({ clusters, children }) {
187
- return /* @__PURE__ */ React4__default.default.createElement(SolanaClusterProvider, { clusters }, /* @__PURE__ */ React4__default.default.createElement(SolanaClientProviderLoader, null, /* @__PURE__ */ React4__default.default.createElement(SolanaWalletProvider, null, children)));
266
+ return /* @__PURE__ */ React10__default.default.createElement(SolanaClusterProvider, { clusters }, /* @__PURE__ */ React10__default.default.createElement(SolanaClientProviderLoader, null, /* @__PURE__ */ React10__default.default.createElement(SolanaWalletProvider, null, /* @__PURE__ */ React10__default.default.createElement(SolanaWalletUiProvider, null, children))));
188
267
  }
189
268
  function SolanaClientProviderLoader({ children }) {
190
269
  const { cluster } = useSolanaCluster();
191
- return /* @__PURE__ */ React4__default.default.createElement(SolanaClientProvider, { urlOrMoniker: cluster.urlOrMoniker }, children);
270
+ return /* @__PURE__ */ React10__default.default.createElement(SolanaClientProvider, { urlOrMoniker: cluster.urlOrMoniker }, children);
271
+ }
272
+ function SolanaWalletUiDialogTrigger(props) {
273
+ const { dialogApi } = useSolanaWalletUi();
274
+ console.log("SolanaWalletUiDialogTrigger", dialogApi);
275
+ return /* @__PURE__ */ React10__default.default.createElement("button", { ...props, ...dialogApi.getTriggerProps() }, "Select Wallet");
276
+ }
277
+ function SolanaWalletUiDropdown() {
278
+ const { change, connected, copy, disconnect, menuApi: api, wallet } = useSolanaWalletUi();
279
+ const menuItems = [
280
+ {
281
+ handler: copy,
282
+ label: "Copy Address",
283
+ value: "copy"
284
+ },
285
+ {
286
+ handler: change,
287
+ label: "Change Wallet",
288
+ value: "change"
289
+ },
290
+ {
291
+ handler: disconnect,
292
+ label: "Disconnect",
293
+ value: "disconnect"
294
+ }
295
+ ];
296
+ const trigger = /* @__PURE__ */ React10__default.default.createElement(
297
+ AppMenuButton,
298
+ {
299
+ ...api.getTriggerProps(),
300
+ className: `wallet-trigger ${connected ? "connected" : ""}`,
301
+ "data-part": "trigger"
302
+ },
303
+ connected ? wallet?.name : "Select Wallet",
304
+ /* @__PURE__ */ React10__default.default.createElement("span", { className: "wallet-actions" }, /* @__PURE__ */ React10__default.default.createElement("span", { ...api.getIndicatorProps(), className: "indicator" }, "\u25BE"))
305
+ );
306
+ return /* @__PURE__ */ React10__default.default.createElement("div", { className: "wallet-menu" }, trigger, /* @__PURE__ */ React10__default.default.createElement("div", { ...api.getPositionerProps(), className: "wallet-positioner" }, /* @__PURE__ */ React10__default.default.createElement("ul", { ...api.getContentProps(), className: "wallet-content", "data-part": "content" }, menuItems.map((item) => /* @__PURE__ */ React10__default.default.createElement(
307
+ "li",
308
+ {
309
+ key: item.value,
310
+ ...api.getItemProps({ value: item.value }),
311
+ className: "wallet-item",
312
+ "data-part": "item",
313
+ onClick: () => {
314
+ if (item.disabled) {
315
+ return;
316
+ }
317
+ void item.handler();
318
+ }
319
+ },
320
+ item.label
321
+ )))));
322
+ }
323
+ function AppMenuButton(props) {
324
+ return /* @__PURE__ */ React10__default.default.createElement("button", { ...props }, props.children);
325
+ }
326
+
327
+ // src/solana-wallet-ui-button.tsx
328
+ function SolanaWalletUiButton() {
329
+ const { connected } = useSolanaWalletUi();
330
+ return connected ? /* @__PURE__ */ React10__default.default.createElement(SolanaWalletUiDropdown, null) : /* @__PURE__ */ React10__default.default.createElement(SolanaWalletUiDialogTrigger, null);
331
+ }
332
+ function SolanaWalletUiDialog({ description, title }) {
333
+ const { dialogApi: api, connected, disconnect } = useSolanaWalletUi();
334
+ if (!api) {
335
+ console.log("no api");
336
+ return null;
337
+ }
338
+ if (!api.open) {
339
+ console.log("no api.open");
340
+ return null;
341
+ }
342
+ return /* @__PURE__ */ React10__default.default.createElement(react$1.Portal, null, /* @__PURE__ */ React10__default.default.createElement("div", { className: "dialog", ...api.getBackdropProps() }), /* @__PURE__ */ React10__default.default.createElement("div", { className: "dialog", ...api.getPositionerProps() }, /* @__PURE__ */ React10__default.default.createElement("div", { className: "dialog", ...api.getContentProps() }, title ? /* @__PURE__ */ React10__default.default.createElement("h2", { className: "dialog", ...api.getTitleProps() }, title) : null, description ? /* @__PURE__ */ React10__default.default.createElement("p", { className: "dialog", ...api.getDescriptionProps() }, description) : null, /* @__PURE__ */ React10__default.default.createElement("div", { style: { marginTop: "32px" } }, /* @__PURE__ */ React10__default.default.createElement(SolanaWalletUiDialogList, null), connected ? /* @__PURE__ */ React10__default.default.createElement("button", { onClick: disconnect }, "Disconnect") : null), /* @__PURE__ */ React10__default.default.createElement("button", { className: "dialog", ...api.getCloseTriggerProps() }, "\xD7"))));
343
+ }
344
+ function SolanaWalletUiDialogList() {
345
+ const { wallets } = useSolanaWalletUi();
346
+ return /* @__PURE__ */ React10__default.default.createElement("div", { style: { display: "flex", flexDirection: "column", gap: "16px" } }, wallets.map((item, index) => /* @__PURE__ */ React10__default.default.createElement(SolanaWalletUiDialogListItem, { key: `${item.name}-${index}`, wallet: item })));
347
+ }
348
+ function SolanaWalletUiDialogListItem({ wallet }) {
349
+ const [isConnecting, connect3] = react.useConnect(wallet);
350
+ const [isDisconnecting, disconnect] = react.useDisconnect(wallet);
351
+ const { connectAccount, walletAccount } = useSolanaWalletUi();
352
+ const accounts = wallet.accounts ?? [];
353
+ const isConnected = wallet.accounts.length > 0;
354
+ const isPending = isConnecting || isDisconnecting;
355
+ if (isPending) {
356
+ return /* @__PURE__ */ React10__default.default.createElement("div", null, "Pending...");
357
+ }
358
+ return /* @__PURE__ */ React10__default.default.createElement("div", { style: { display: "flex", flexDirection: "column", gap: "8px" } }, /* @__PURE__ */ React10__default.default.createElement("div", { style: { display: "flex", justifyContent: "space-between" } }, /* @__PURE__ */ React10__default.default.createElement("div", { style: { alignItems: "center", display: "flex", gap: "8px" } }, /* @__PURE__ */ React10__default.default.createElement("img", { src: wallet.icon, alt: wallet.name, style: { height: 32 } }), /* @__PURE__ */ React10__default.default.createElement("span", { style: { fontSize: "1rem", fontWeight: "500" } }, wallet.name)), isConnected ? /* @__PURE__ */ React10__default.default.createElement(
359
+ "button",
360
+ {
361
+ disabled: isPending,
362
+ onClick: () => {
363
+ void disconnect();
364
+ }
365
+ },
366
+ "Disconnect"
367
+ ) : /* @__PURE__ */ React10__default.default.createElement(
368
+ "button",
369
+ {
370
+ disabled: isPending,
371
+ onClick: () => {
372
+ void connect3();
373
+ }
374
+ },
375
+ "Connect"
376
+ )), accounts.map((item, index) => /* @__PURE__ */ React10__default.default.createElement("div", { key: `${item.address}-${index}` }, /* @__PURE__ */ React10__default.default.createElement(
377
+ "button",
378
+ {
379
+ disabled: item.address === walletAccount?.address,
380
+ onClick: () => {
381
+ void connectAccount(wallet, item);
382
+ }
383
+ },
384
+ item.address
385
+ ))));
192
386
  }
193
387
 
388
+ exports.AppMenuButton = AppMenuButton;
194
389
  exports.SolanaClientContext = SolanaClientContext;
195
390
  exports.SolanaClientProvider = SolanaClientProvider;
196
391
  exports.SolanaClusterContext = SolanaClusterContext;
@@ -198,10 +393,19 @@ exports.SolanaClusterProvider = SolanaClusterProvider;
198
393
  exports.SolanaProvider = SolanaProvider;
199
394
  exports.SolanaWalletContext = SolanaWalletContext;
200
395
  exports.SolanaWalletProvider = SolanaWalletProvider;
396
+ exports.SolanaWalletUiButton = SolanaWalletUiButton;
397
+ exports.SolanaWalletUiContext = SolanaWalletUiContext;
398
+ exports.SolanaWalletUiDialog = SolanaWalletUiDialog;
399
+ exports.SolanaWalletUiDialogList = SolanaWalletUiDialogList;
400
+ exports.SolanaWalletUiDialogListItem = SolanaWalletUiDialogListItem;
401
+ exports.SolanaWalletUiDialogTrigger = SolanaWalletUiDialogTrigger;
402
+ exports.SolanaWalletUiDropdown = SolanaWalletUiDropdown;
403
+ exports.SolanaWalletUiProvider = SolanaWalletUiProvider;
201
404
  exports.useSolanaClient = useSolanaClient;
202
405
  exports.useSolanaCluster = useSolanaCluster;
203
406
  exports.useSolanaWallet = useSolanaWallet;
204
407
  exports.useSolanaWalletAddress = useSolanaWalletAddress;
408
+ exports.useSolanaWalletUi = useSolanaWalletUi;
205
409
  Object.keys(react).forEach(function (k) {
206
410
  if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
207
411
  enumerable: true,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/solana-client-context.tsx","../src/solana-client-provider.tsx","../src/solana-cluster-context.tsx","../src/use-local-storage.ts","../src/solana-cluster-provider.tsx","../src/solana-wallet-context.tsx","../src/solana-wallet-provider.tsx","../src/solana-provider.tsx"],"names":["createContext","useContext","useMemo","createSolanaClient","React","useState","useCallback","cluster","address","STORAGE_KEY","useWallets","setSelectedWalletAccount","getUiWalletAccountStorageKey","useEffect","uiWalletAccountsAreSame","uiWalletAccountBelongsToUiWallet"],"mappings":"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","file":"index.browser.cjs","sourcesContent":["import { SolanaClient } from '@wallet-ui/core';\nimport { createContext, useContext } from 'react';\n\nexport const SolanaClientContext = createContext<SolanaClient>({} as SolanaClient);\n\nexport function useSolanaClient() {\n return useContext(SolanaClientContext);\n}\n","import { SolanaClientUrlOrMoniker } from '@wallet-ui/core';\nimport { createSolanaClient } from 'gill';\nimport React, { ReactNode, useMemo } from 'react';\n\nimport { SolanaClientContext } from './solana-client-context';\n\nexport function SolanaClientProvider({\n children,\n urlOrMoniker,\n}: {\n children: ReactNode;\n urlOrMoniker: SolanaClientUrlOrMoniker;\n}) {\n const value = useMemo(() => createSolanaClient({ urlOrMoniker }), [urlOrMoniker]);\n\n return <SolanaClientContext.Provider value={value}>{children}</SolanaClientContext.Provider>;\n}\n","import { SolanaCluster } from '@wallet-ui/core';\nimport { createContext, useContext } from 'react';\n\nexport type SolanaClusterContextProps = Readonly<{\n cluster: SolanaCluster;\n clusters: SolanaCluster[];\n setCluster?(cluster: `solana:${string}`): void;\n}>;\n\nexport const SolanaClusterContext = createContext<SolanaClusterContextProps>({} as SolanaClusterContextProps);\n\nexport function useSolanaCluster() {\n return useContext(SolanaClusterContext);\n}\n","import { useCallback, useState } from 'react';\n\nexport function useLocalStorage<T>(key: string, initialValue: T) {\n // State to store our value\n const [storedValue, setStoredValue] = useState<T>(() => {\n try {\n // Check if we're on the client side\n if (typeof window === 'undefined') {\n return initialValue;\n }\n\n const item = window.localStorage.getItem(key);\n // For wallet-related data, validate the stored value\n if (key.includes('wallet') || key.includes('account')) {\n // Return initial value if stored data might be stale\n return initialValue;\n }\n return item ? JSON.parse(item) : initialValue;\n } catch (error) {\n console.warn(`Error reading localStorage key \"${key}\":`, error);\n return initialValue;\n }\n });\n\n // Return a wrapped version of useState's setter function that persists the new value to localStorage\n const setValue = useCallback(\n (value: T | ((val: T) => T)) => {\n try {\n // Allow value to be a function so we have same API as useState\n const valueToStore = value instanceof Function ? value(storedValue) : value;\n\n // Save state\n setStoredValue(valueToStore);\n\n // Save to localStorage\n if (typeof window !== 'undefined') {\n if (valueToStore === undefined || valueToStore === null) {\n window.localStorage.removeItem(key);\n } else {\n window.localStorage.setItem(key, JSON.stringify(valueToStore));\n }\n }\n } catch (error) {\n console.warn(`Error setting localStorage key \"${key}\":`, error);\n }\n },\n [key, storedValue],\n );\n\n return [storedValue, setValue] as const;\n}\n","import { SolanaCluster } from '@wallet-ui/core';\nimport React, { ReactNode, useMemo } from 'react';\n\nimport { SolanaClusterContext } from './solana-cluster-context';\nimport { useLocalStorage } from './use-local-storage';\n\nconst STORAGE_KEY = 'placeholder:selected-cluster';\n\nexport function SolanaClusterProvider({ clusters, children }: { children: ReactNode, clusters: SolanaCluster[]; }) {\n const [clusterId, setClusterId] = useLocalStorage(STORAGE_KEY, 'solana:devnet');\n\n if (!clusters.length) {\n throw new Error('No clusters provided');\n }\n\n const cluster = useMemo<SolanaCluster>(() => {\n for (const cluster of clusters) {\n if (cluster.id === clusterId) {\n return cluster;\n }\n }\n return clusters[0];\n }, [clusterId, clusters]);\n\n return (\n <SolanaClusterContext.Provider\n value={useMemo(\n () => ({\n cluster,\n clusters,\n setCluster(cluster) {\n localStorage.setItem(STORAGE_KEY, cluster);\n setClusterId(cluster);\n },\n }),\n [cluster, clusters],\n )}\n >\n {children}\n </SolanaClusterContext.Provider>\n );\n}\n","import type { UiWalletAccount } from '@wallet-standard/react';\nimport { address } from 'gill';\nimport { createContext, Dispatch, SetStateAction, useContext } from 'react';\n\nexport type SelectedWalletAccountState = UiWalletAccount | undefined;\n\nexport const SolanaWalletContext = createContext<\n readonly [\n selectedWalletAccount: SelectedWalletAccountState,\n setSelectedWalletAccount: Dispatch<SetStateAction<SelectedWalletAccountState>>,\n ]\n>([\n undefined /* selectedWalletAccount */,\n function setSelectedWalletAccount() {\n /* empty */\n },\n]);\n\nexport function useSolanaWallet() {\n return useContext(SolanaWalletContext);\n}\n\nexport function useSolanaWalletAddress() {\n const [wallet] = useSolanaWallet();\n if (!wallet?.address) {\n return null;\n }\n return address(wallet.address);\n}\n","import {\n getUiWalletAccountStorageKey,\n UiWallet,\n uiWalletAccountBelongsToUiWallet,\n uiWalletAccountsAreSame,\n useWallets,\n} from '@wallet-standard/react';\nimport React, { Dispatch, ReactNode, SetStateAction, useEffect, useMemo, useState } from 'react';\n\nimport { SelectedWalletAccountState, SolanaWalletContext } from './solana-wallet-context';\nimport { useLocalStorage } from './use-local-storage';\n\nconst STORAGE_KEY = 'placeholder:selected-wallet-and-address';\n\nlet wasSetterInvoked = false;\n\nfunction getSavedWalletAccount(wallets: readonly UiWallet[], savedWalletNameAndAddress: string | null) {\n if (wasSetterInvoked) {\n // After the user makes an explicit choice of wallet, stop trying to auto-select the\n // saved wallet, if and when it appears.\n return;\n }\n if (!savedWalletNameAndAddress || typeof savedWalletNameAndAddress !== 'string') {\n return;\n }\n const [savedWalletName, savedAccountAddress] = savedWalletNameAndAddress.split(':');\n if (!savedWalletName || !savedAccountAddress) {\n return;\n }\n for (const wallet of wallets) {\n if (wallet.name === savedWalletName) {\n for (const account of wallet.accounts) {\n if (account.address === savedAccountAddress) {\n return account;\n }\n }\n }\n }\n}\n\n/**\n * Saves the selected wallet account's storage key to the browser's local storage. In future\n * sessions it will try to return that same wallet account, or at least one from the same brand of\n * wallet if the wallet from which it came is still in the Wallet Standard registry.\n */\nexport function SolanaWalletProvider({ children }: { children: ReactNode }) {\n const [storedKey, setStoredKey] = useLocalStorage<string | null>(STORAGE_KEY, null);\n const wallets = useWallets();\n const [selectedWalletAccount, setSelectedWalletAccountInternal] = useState<SelectedWalletAccountState>(() =>\n getSavedWalletAccount(wallets, storedKey),\n );\n const setSelectedWalletAccount: Dispatch<SetStateAction<SelectedWalletAccountState>> = setStateAction => {\n setSelectedWalletAccountInternal(prevSelectedWalletAccount => {\n wasSetterInvoked = true;\n const nextWalletAccount =\n typeof setStateAction === 'function' ? setStateAction(prevSelectedWalletAccount) : setStateAction;\n const accountKey = nextWalletAccount ? getUiWalletAccountStorageKey(nextWalletAccount) : undefined;\n if (accountKey) {\n setStoredKey(accountKey);\n } else {\n setStoredKey(null);\n }\n return nextWalletAccount;\n });\n };\n useEffect(() => {\n const savedWalletAccount = getSavedWalletAccount(wallets, storedKey);\n if (savedWalletAccount) {\n setSelectedWalletAccountInternal(savedWalletAccount);\n }\n }, [wallets]);\n const walletAccount = useMemo(() => {\n if (selectedWalletAccount) {\n for (const uiWallet of wallets) {\n for (const uiWalletAccount of uiWallet.accounts) {\n if (uiWalletAccountsAreSame(selectedWalletAccount, uiWalletAccount)) {\n return uiWalletAccount;\n }\n }\n if (uiWalletAccountBelongsToUiWallet(selectedWalletAccount, uiWallet) && uiWallet.accounts[0]) {\n // If the selected account belongs to this connected wallet, at least, then\n // select one of its accounts.\n return uiWallet.accounts[0];\n }\n }\n }\n }, [selectedWalletAccount, wallets]);\n useEffect(() => {\n // If there is a selected wallet account but the wallet to which it belongs has since\n // disconnected, clear the selected wallet.\n if (selectedWalletAccount && !walletAccount) {\n setSelectedWalletAccountInternal(undefined);\n }\n }, [selectedWalletAccount, walletAccount]);\n return (\n <SolanaWalletContext.Provider value={useMemo(() => [walletAccount, setSelectedWalletAccount], [walletAccount])}>\n {children}\n </SolanaWalletContext.Provider>\n );\n}\n","import { SolanaCluster } from '@wallet-ui/core';\nimport React, { ReactNode } from 'react';\n\nimport { SolanaClientProvider } from './solana-client-provider';\nimport { useSolanaCluster } from './solana-cluster-context';\nimport { SolanaClusterProvider } from './solana-cluster-provider';\nimport { SolanaWalletProvider } from './solana-wallet-provider';\n\nexport function SolanaProvider({ clusters, children }: { children: ReactNode; clusters: SolanaCluster[] }) {\n return (\n <SolanaClusterProvider clusters={clusters}>\n <SolanaClientProviderLoader>\n <SolanaWalletProvider>{children}</SolanaWalletProvider>\n </SolanaClientProviderLoader>\n </SolanaClusterProvider>\n );\n}\n\nfunction SolanaClientProviderLoader({ children }: { children: ReactNode }) {\n const { cluster } = useSolanaCluster();\n\n return <SolanaClientProvider urlOrMoniker={cluster.urlOrMoniker}>{children}</SolanaClientProvider>;\n}\n"]}
1
+ {"version":3,"sources":["../src/solana-client-context.tsx","../src/solana-client-provider.tsx","../src/solana-cluster-context.tsx","../src/use-local-storage.ts","../src/solana-cluster-provider.tsx","../src/solana-wallet-context.tsx","../src/solana-wallet-provider.tsx","../src/solana-wallet-ui-context.tsx","../src/solana-wallet-ui-provider.tsx","../src/solana-provider.tsx","../src/solana-wallet-ui-dialog-trigger.tsx","../src/solana-wallet-ui-dropdown.tsx","../src/solana-wallet-ui-button.tsx","../src/solana-wallet-ui-dialog.tsx"],"names":["createContext","useContext","useMemo","createSolanaClient","React","useState","useCallback","cluster","address","STORAGE_KEY","useWallets","setSelectedWalletAccount","getUiWalletAccountStorageKey","useEffect","uiWalletAccountsAreSame","uiWalletAccountBelongsToUiWallet","useMachine","dialog","useId","normalizeProps","menu","wallet","Portal","connect","useConnect","useDisconnect"],"mappings":"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","file":"index.browser.cjs","sourcesContent":["import { SolanaClient } from '@wallet-ui/core';\nimport { createContext, useContext } from 'react';\n\nexport const SolanaClientContext = createContext<SolanaClient>({} as SolanaClient);\n\nexport function useSolanaClient() {\n return useContext(SolanaClientContext);\n}\n","import { SolanaClientUrlOrMoniker } from '@wallet-ui/core';\nimport { createSolanaClient } from 'gill';\nimport React, { ReactNode, useMemo } from 'react';\n\nimport { SolanaClientContext } from './solana-client-context';\n\nexport function SolanaClientProvider({\n children,\n urlOrMoniker,\n}: {\n children: ReactNode;\n urlOrMoniker: SolanaClientUrlOrMoniker;\n}) {\n const value = useMemo(() => createSolanaClient({ urlOrMoniker }), [urlOrMoniker]);\n\n return <SolanaClientContext.Provider value={value}>{children}</SolanaClientContext.Provider>;\n}\n","import { SolanaCluster } from '@wallet-ui/core';\nimport { createContext, useContext } from 'react';\n\nexport type SolanaClusterContextProps = Readonly<{\n cluster: SolanaCluster;\n clusters: SolanaCluster[];\n setCluster?(cluster: `solana:${string}`): void;\n}>;\n\nexport const SolanaClusterContext = createContext<SolanaClusterContextProps>({} as SolanaClusterContextProps);\n\nexport function useSolanaCluster() {\n return useContext(SolanaClusterContext);\n}\n","import { useCallback, useState } from 'react';\n\nexport function useLocalStorage<T>(key: string, initialValue: T) {\n // State to store our value\n const [storedValue, setStoredValue] = useState<T>(() => {\n try {\n // Check if we're on the client side\n if (typeof window === 'undefined') {\n return initialValue;\n }\n\n const item = window.localStorage.getItem(key);\n // For wallet-related data, validate the stored value\n if (key.includes('wallet') || key.includes('account')) {\n // Return initial value if stored data might be stale\n return initialValue;\n }\n return item ? JSON.parse(item) : initialValue;\n } catch (error) {\n console.warn(`Error reading localStorage key \"${key}\":`, error);\n return initialValue;\n }\n });\n\n // Return a wrapped version of useState's setter function that persists the new value to localStorage\n const setValue = useCallback(\n (value: T | ((val: T) => T)) => {\n try {\n // Allow value to be a function so we have same API as useState\n const valueToStore = value instanceof Function ? value(storedValue) : value;\n\n // Save state\n setStoredValue(valueToStore);\n\n // Save to localStorage\n if (typeof window !== 'undefined') {\n if (valueToStore === undefined || valueToStore === null) {\n window.localStorage.removeItem(key);\n } else {\n window.localStorage.setItem(key, JSON.stringify(valueToStore));\n }\n }\n } catch (error) {\n console.warn(`Error setting localStorage key \"${key}\":`, error);\n }\n },\n [key, storedValue],\n );\n\n return [storedValue, setValue] as const;\n}\n","import { SolanaCluster } from '@wallet-ui/core';\nimport React, { ReactNode, useMemo } from 'react';\n\nimport { SolanaClusterContext } from './solana-cluster-context';\nimport { useLocalStorage } from './use-local-storage';\n\nconst STORAGE_KEY = 'placeholder:selected-cluster';\n\nexport function SolanaClusterProvider({ clusters, children }: { children: ReactNode, clusters: SolanaCluster[]; }) {\n const [clusterId, setClusterId] = useLocalStorage(STORAGE_KEY, 'solana:devnet');\n\n if (!clusters.length) {\n throw new Error('No clusters provided');\n }\n\n const cluster = useMemo<SolanaCluster>(() => {\n for (const cluster of clusters) {\n if (cluster.id === clusterId) {\n return cluster;\n }\n }\n return clusters[0];\n }, [clusterId, clusters]);\n\n return (\n <SolanaClusterContext.Provider\n value={useMemo(\n () => ({\n cluster,\n clusters,\n setCluster(cluster) {\n localStorage.setItem(STORAGE_KEY, cluster);\n setClusterId(cluster);\n },\n }),\n [cluster, clusters],\n )}\n >\n {children}\n </SolanaClusterContext.Provider>\n );\n}\n","import type { UiWalletAccount } from '@wallet-standard/react';\nimport { address } from 'gill';\nimport { createContext, Dispatch, SetStateAction, useContext } from 'react';\n\nexport type SelectedWalletAccountState = UiWalletAccount | undefined;\n\nexport const SolanaWalletContext = createContext<\n readonly [\n selectedWalletAccount: SelectedWalletAccountState,\n setSelectedWalletAccount: Dispatch<SetStateAction<SelectedWalletAccountState>>,\n ]\n>([\n undefined /* selectedWalletAccount */,\n function setSelectedWalletAccount() {\n /* empty */\n },\n]);\n\nexport function useSolanaWallet() {\n return useContext(SolanaWalletContext);\n}\n\nexport function useSolanaWalletAddress() {\n const [wallet] = useSolanaWallet();\n if (!wallet?.address) {\n return null;\n }\n return address(wallet.address);\n}\n","import {\n getUiWalletAccountStorageKey,\n UiWallet,\n uiWalletAccountBelongsToUiWallet,\n uiWalletAccountsAreSame,\n useWallets,\n} from '@wallet-standard/react';\nimport React, { Dispatch, ReactNode, SetStateAction, useEffect, useMemo, useState } from 'react';\n\nimport { SelectedWalletAccountState, SolanaWalletContext } from './solana-wallet-context';\nimport { useLocalStorage } from './use-local-storage';\n\nconst STORAGE_KEY = 'placeholder:selected-wallet-and-address';\n\nlet wasSetterInvoked = false;\n\nfunction getSavedWalletAccount(wallets: readonly UiWallet[], savedWalletNameAndAddress: string | null) {\n if (wasSetterInvoked) {\n // After the user makes an explicit choice of wallet, stop trying to auto-select the\n // saved wallet, if and when it appears.\n return;\n }\n if (!savedWalletNameAndAddress || typeof savedWalletNameAndAddress !== 'string') {\n return;\n }\n const [savedWalletName, savedAccountAddress] = savedWalletNameAndAddress.split(':');\n if (!savedWalletName || !savedAccountAddress) {\n return;\n }\n for (const wallet of wallets) {\n if (wallet.name === savedWalletName) {\n for (const account of wallet.accounts) {\n if (account.address === savedAccountAddress) {\n return account;\n }\n }\n }\n }\n}\n\n/**\n * Saves the selected wallet account's storage key to the browser's local storage. In future\n * sessions it will try to return that same wallet account, or at least one from the same brand of\n * wallet if the wallet from which it came is still in the Wallet Standard registry.\n */\nexport function SolanaWalletProvider({ children }: { children: ReactNode }) {\n const [storedKey, setStoredKey] = useLocalStorage<string | null>(STORAGE_KEY, null);\n const wallets = useWallets();\n const [selectedWalletAccount, setSelectedWalletAccountInternal] = useState<SelectedWalletAccountState>(() =>\n getSavedWalletAccount(wallets, storedKey),\n );\n const setSelectedWalletAccount: Dispatch<SetStateAction<SelectedWalletAccountState>> = setStateAction => {\n setSelectedWalletAccountInternal(prevSelectedWalletAccount => {\n wasSetterInvoked = true;\n const nextWalletAccount =\n typeof setStateAction === 'function' ? setStateAction(prevSelectedWalletAccount) : setStateAction;\n const accountKey = nextWalletAccount ? getUiWalletAccountStorageKey(nextWalletAccount) : undefined;\n if (accountKey) {\n setStoredKey(accountKey);\n } else {\n setStoredKey(null);\n }\n return nextWalletAccount;\n });\n };\n useEffect(() => {\n const savedWalletAccount = getSavedWalletAccount(wallets, storedKey);\n if (savedWalletAccount) {\n setSelectedWalletAccountInternal(savedWalletAccount);\n }\n }, [wallets]);\n const walletAccount = useMemo(() => {\n if (selectedWalletAccount) {\n for (const uiWallet of wallets) {\n for (const uiWalletAccount of uiWallet.accounts) {\n if (uiWalletAccountsAreSame(selectedWalletAccount, uiWalletAccount)) {\n return uiWalletAccount;\n }\n }\n if (uiWalletAccountBelongsToUiWallet(selectedWalletAccount, uiWallet) && uiWallet.accounts[0]) {\n // If the selected account belongs to this connected wallet, at least, then\n // select one of its accounts.\n return uiWallet.accounts[0];\n }\n }\n }\n }, [selectedWalletAccount, wallets]);\n useEffect(() => {\n // If there is a selected wallet account but the wallet to which it belongs has since\n // disconnected, clear the selected wallet.\n if (selectedWalletAccount && !walletAccount) {\n setSelectedWalletAccountInternal(undefined);\n }\n }, [selectedWalletAccount, walletAccount]);\n return (\n <SolanaWalletContext.Provider value={useMemo(() => [walletAccount, setSelectedWalletAccount], [walletAccount])}>\n {children}\n </SolanaWalletContext.Provider>\n );\n}\n","import { UiWallet, UiWalletAccount } from '@wallet-standard/react';\nimport * as dialog from '@zag-js/dialog';\nimport * as menu from '@zag-js/menu';\nimport React from 'react';\n\nexport interface SolanaWalletUiProviderContext {\n change: () => void;\n connectAccount: (wallet: UiWallet | undefined, account: UiWalletAccount | undefined) => void;\n connected: boolean;\n copy: () => Promise<void>;\n dialogApi: ReturnType<typeof dialog.connect>;\n disconnect: () => void;\n menuApi: ReturnType<typeof menu.connect>;\n wallet: UiWallet | undefined;\n walletAccount: UiWalletAccount | undefined;\n wallets: readonly UiWallet[];\n}\n\nexport const SolanaWalletUiContext = React.createContext<SolanaWalletUiProviderContext>(\n {} as SolanaWalletUiProviderContext,\n);\n\nexport function useSolanaWalletUi() {\n return React.useContext(SolanaWalletUiContext);\n}\n","import { UiWallet, UiWalletAccount, useWallets } from '@wallet-standard/react';\nimport * as dialog from '@zag-js/dialog';\nimport * as menu from '@zag-js/menu';\nimport { normalizeProps, useMachine } from '@zag-js/react';\nimport React, { ReactNode, useId, useMemo, useState } from 'react';\n\nimport { useSolanaWallet } from './solana-wallet-context';\nimport { SolanaWalletUiContext, SolanaWalletUiProviderContext } from './solana-wallet-ui-context';\n\nexport function SolanaWalletUiProvider(props: { children: ReactNode }) {\n const wallets = useWallets();\n const [walletAccount, setWalletAccount] = useSolanaWallet();\n const [wallet, setWallet] = useState<UiWallet | undefined>(undefined);\n const dialogService = useMachine(dialog.machine, { id: useId(), modal: true });\n const dialogApi = dialog.connect(dialogService, normalizeProps);\n const menuService = useMachine(menu.machine, { id: useId() });\n const menuApi = menu.connect(menuService, normalizeProps);\n\n const [connected, setConnected] = useState(false);\n\n function change() {\n menuService.send({ type: 'CLOSE' });\n dialogService.send({ type: 'OPEN' });\n }\n\n function connectAccount(wallet: UiWallet | undefined, account: UiWalletAccount | undefined) {\n console.log('connectAccount', account);\n setWalletAccount(account);\n setWallet(wallet);\n setConnected(true);\n dialogService.send({ type: 'CLOSE' });\n }\n\n async function copy() {\n if (!walletAccount) {\n return;\n }\n await navigator.clipboard.writeText(walletAccount.address);\n menuService.send({ type: 'CLOSE' });\n dialogService.send({ type: 'CLOSE' });\n }\n\n function disconnect() {\n setConnected(false);\n setWalletAccount(undefined);\n dialogService.send({ type: 'CLOSE' });\n menuService.send({ type: 'CLOSE' });\n }\n\n const value: SolanaWalletUiProviderContext = {\n change,\n connectAccount,\n connected: connected && walletAccount !== undefined,\n copy,\n dialogApi,\n disconnect,\n menuApi,\n wallet,\n walletAccount,\n wallets: useMemo(() => wallets.filter(wallet => wallet.chains.some(i => i.startsWith('solana:'))), [wallets]),\n };\n\n return <SolanaWalletUiContext.Provider value={value}>{props.children}</SolanaWalletUiContext.Provider>;\n}\n","import { SolanaCluster } from '@wallet-ui/core';\nimport React, { ReactNode } from 'react';\n\nimport { SolanaClientProvider } from './solana-client-provider';\nimport { useSolanaCluster } from './solana-cluster-context';\nimport { SolanaClusterProvider } from './solana-cluster-provider';\nimport { SolanaWalletProvider } from './solana-wallet-provider';\nimport { SolanaWalletUiProvider } from './solana-wallet-ui-provider';\n\nexport function SolanaProvider({ clusters, children }: { children: ReactNode; clusters: SolanaCluster[] }) {\n return (\n <SolanaClusterProvider clusters={clusters}>\n <SolanaClientProviderLoader>\n <SolanaWalletProvider>\n <SolanaWalletUiProvider>{children}</SolanaWalletUiProvider>\n </SolanaWalletProvider>\n </SolanaClientProviderLoader>\n </SolanaClusterProvider>\n );\n}\n\nfunction SolanaClientProviderLoader({ children }: { children: ReactNode }) {\n const { cluster } = useSolanaCluster();\n\n return <SolanaClientProvider urlOrMoniker={cluster.urlOrMoniker}>{children}</SolanaClientProvider>;\n}\n","import React, { ButtonHTMLAttributes } from 'react';\n\nimport { useSolanaWalletUi } from './solana-wallet-ui-context';\n\nexport type WalletUiDialogTriggerProps = ButtonHTMLAttributes<HTMLButtonElement>;\n\nexport function SolanaWalletUiDialogTrigger(props: WalletUiDialogTriggerProps) {\n const { dialogApi } = useSolanaWalletUi();\n\n console.log('SolanaWalletUiDialogTrigger', dialogApi);\n return (\n <button {...props} {...dialogApi.getTriggerProps()}>\n Select Wallet\n </button>\n );\n}\n","import './solana-wallet-ui-dropdown.css';\n\nimport React, { ButtonHTMLAttributes } from 'react';\n\nimport { useSolanaWalletUi } from './solana-wallet-ui-context';\n\nexport interface AppMenuItem {\n disabled?: boolean;\n handler: () => Promise<void> | void;\n label: string;\n value: string;\n}\n\nexport function SolanaWalletUiDropdown() {\n const { change, connected, copy, disconnect, menuApi: api, wallet } = useSolanaWalletUi();\n\n const menuItems: AppMenuItem[] = [\n {\n handler: copy,\n label: 'Copy Address',\n value: 'copy',\n },\n {\n handler: change,\n label: 'Change Wallet',\n value: 'change',\n },\n {\n handler: disconnect,\n label: 'Disconnect',\n value: 'disconnect',\n },\n ];\n\n const trigger = (\n <AppMenuButton\n {...api.getTriggerProps()}\n className={`wallet-trigger ${connected ? 'connected' : ''}`}\n data-part=\"trigger\"\n >\n {connected ? wallet?.name : 'Select Wallet'}\n <span className=\"wallet-actions\">\n <span {...api.getIndicatorProps()} className=\"indicator\">\n ▾\n </span>\n </span>\n </AppMenuButton>\n );\n\n return (\n <div className=\"wallet-menu\">\n {trigger}\n <div {...api.getPositionerProps()} className=\"wallet-positioner\">\n <ul {...api.getContentProps()} className=\"wallet-content\" data-part=\"content\">\n {menuItems.map(item => (\n <li\n key={item.value}\n {...api.getItemProps({ value: item.value })}\n className=\"wallet-item\"\n data-part=\"item\"\n onClick={() => {\n if (item.disabled) {\n return;\n }\n void item.handler();\n }}\n >\n {item.label}\n </li>\n ))}\n </ul>\n </div>\n </div>\n );\n}\n\nexport function AppMenuButton(props: ButtonHTMLAttributes<HTMLButtonElement>) {\n return <button {...props}>{props.children}</button>;\n}\n","import React from 'react';\n\nimport { useSolanaWalletUi } from './solana-wallet-ui-context';\nimport { SolanaWalletUiDialogTrigger } from './solana-wallet-ui-dialog-trigger';\nimport { SolanaWalletUiDropdown } from './solana-wallet-ui-dropdown';\n\nexport function SolanaWalletUiButton() {\n const { connected } = useSolanaWalletUi();\n\n return connected ? <SolanaWalletUiDropdown /> : <SolanaWalletUiDialogTrigger />;\n}\n","import './solana-wallet-ui-dialog.css';\n\nimport { UiWallet, useConnect, useDisconnect } from '@wallet-standard/react';\nimport { Portal } from '@zag-js/react';\nimport React from 'react';\n\nimport { useSolanaWalletUi } from './solana-wallet-ui-context';\n\nexport function SolanaWalletUiDialog({ description, title }: { description?: string; title?: string }) {\n const { dialogApi: api, connected, disconnect } = useSolanaWalletUi();\n\n if (!api) {\n console.log('no api');\n return null;\n }\n\n if (!api.open) {\n console.log('no api.open');\n return null;\n }\n\n return (\n <Portal>\n <div className=\"dialog\" {...api.getBackdropProps()} />\n <div className=\"dialog\" {...api.getPositionerProps()}>\n <div className=\"dialog\" {...api.getContentProps()}>\n {title ? (\n <h2 className=\"dialog\" {...api.getTitleProps()}>\n {title}\n </h2>\n ) : null}\n {description ? (\n <p className=\"dialog\" {...api.getDescriptionProps()}>\n {description}\n </p>\n ) : null}\n <div style={{ marginTop: '32px' }}>\n <SolanaWalletUiDialogList />\n {connected ? <button onClick={disconnect}>Disconnect</button> : null}\n </div>\n <button className=\"dialog\" {...api.getCloseTriggerProps()}>\n &times;\n </button>\n </div>\n </div>\n </Portal>\n );\n}\n\nexport function SolanaWalletUiDialogList() {\n const { wallets } = useSolanaWalletUi();\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '16px' }}>\n {wallets.map((item, index) => (\n <SolanaWalletUiDialogListItem key={`${item.name}-${index}`} wallet={item} />\n ))}\n </div>\n );\n}\n\nexport function SolanaWalletUiDialogListItem({ wallet }: { wallet: UiWallet }) {\n const [isConnecting, connect] = useConnect(wallet);\n const [isDisconnecting, disconnect] = useDisconnect(wallet);\n const { connectAccount, walletAccount } = useSolanaWalletUi();\n const accounts = wallet.accounts ?? [];\n const isConnected = wallet.accounts.length > 0;\n const isPending = isConnecting || isDisconnecting;\n\n if (isPending) {\n return <div>Pending...</div>;\n }\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n <div style={{ display: 'flex', justifyContent: 'space-between' }}>\n <div style={{ alignItems: 'center', display: 'flex', gap: '8px' }}>\n <img src={wallet.icon} alt={wallet.name} style={{ height: 32 }} />\n <span style={{ fontSize: '1rem', fontWeight: '500' }}>{wallet.name}</span>\n </div>\n {isConnected ? (\n <button\n disabled={isPending}\n onClick={() => {\n void disconnect();\n }}\n >\n Disconnect\n </button>\n ) : (\n <button\n disabled={isPending}\n onClick={() => {\n void connect();\n }}\n >\n Connect\n </button>\n )}\n </div>\n {accounts.map((item, index) => (\n <div key={`${item.address}-${index}`}>\n <button\n disabled={item.address === walletAccount?.address}\n onClick={() => {\n void connectAccount(wallet, item);\n }}\n >\n {item.address}\n </button>\n </div>\n ))}\n </div>\n );\n}\n"]}