@wallet-ui/react 1.1.0-canary-20250313140452 → 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.
- package/dist/index.browser.cjs +226 -22
- package/dist/index.browser.cjs.map +1 -1
- package/dist/index.browser.mjs +182 -8
- package/dist/index.browser.mjs.map +1 -1
- package/dist/index.css +171 -0
- package/dist/index.css.map +1 -1
- package/dist/index.native.mjs +182 -8
- package/dist/index.native.mjs.map +1 -1
- package/dist/index.node.cjs +226 -22
- package/dist/index.node.cjs.map +1 -1
- package/dist/index.node.mjs +182 -8
- package/dist/index.node.mjs.map +1 -1
- package/dist/types/index.d.ts +6 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/solana-provider.d.ts.map +1 -1
- package/dist/types/solana-wallet-ui-button.d.ts +3 -0
- package/dist/types/solana-wallet-ui-button.d.ts.map +1 -0
- package/dist/types/solana-wallet-ui-context.d.ts +19 -0
- package/dist/types/solana-wallet-ui-context.d.ts.map +1 -0
- package/dist/types/solana-wallet-ui-dialog-trigger.d.ts +4 -0
- package/dist/types/solana-wallet-ui-dialog-trigger.d.ts.map +1 -0
- package/dist/types/solana-wallet-ui-dialog.d.ts +12 -0
- package/dist/types/solana-wallet-ui-dialog.d.ts.map +1 -0
- package/dist/types/solana-wallet-ui-dropdown.d.ts +11 -0
- package/dist/types/solana-wallet-ui-dropdown.d.ts.map +1 -0
- package/dist/types/solana-wallet-ui-provider.d.ts +5 -0
- package/dist/types/solana-wallet-ui-provider.d.ts.map +1 -0
- package/package.json +5 -2
package/dist/index.node.cjs
CHANGED
|
@@ -1,32 +1,55 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
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
|
-
|
|
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 =
|
|
36
|
+
var SolanaClientContext = React10.createContext({});
|
|
14
37
|
function useSolanaClient() {
|
|
15
|
-
return
|
|
38
|
+
return React10.useContext(SolanaClientContext);
|
|
16
39
|
}
|
|
17
40
|
function SolanaClientProvider({
|
|
18
41
|
children,
|
|
19
42
|
urlOrMoniker
|
|
20
43
|
}) {
|
|
21
|
-
const value =
|
|
22
|
-
return /* @__PURE__ */
|
|
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 =
|
|
47
|
+
var SolanaClusterContext = React10.createContext({});
|
|
25
48
|
function useSolanaCluster() {
|
|
26
|
-
return
|
|
49
|
+
return React10.useContext(SolanaClusterContext);
|
|
27
50
|
}
|
|
28
51
|
function useLocalStorage(key, initialValue) {
|
|
29
|
-
const [storedValue, setStoredValue] =
|
|
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 =
|
|
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 =
|
|
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__ */
|
|
103
|
+
return /* @__PURE__ */ React10__default.default.createElement(
|
|
81
104
|
SolanaClusterContext.Provider,
|
|
82
105
|
{
|
|
83
|
-
value:
|
|
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 =
|
|
121
|
+
var SolanaWalletContext = React10.createContext([
|
|
99
122
|
void 0,
|
|
100
123
|
function setSelectedWalletAccount() {
|
|
101
124
|
}
|
|
102
125
|
]);
|
|
103
126
|
function useSolanaWallet() {
|
|
104
|
-
return
|
|
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] =
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
200
|
+
React10.useEffect(() => {
|
|
178
201
|
if (selectedWalletAccount && !walletAccount) {
|
|
179
202
|
setSelectedWalletAccountInternal(void 0);
|
|
180
203
|
}
|
|
181
204
|
}, [selectedWalletAccount, walletAccount]);
|
|
182
|
-
return /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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,
|
package/dist/index.node.cjs.map
CHANGED
|
@@ -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.node.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.node.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 ×\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"]}
|