@wallet-ui/react 1.1.0-canary-20250321005249 → 1.1.0-canary-20250324005504
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/README.md +1 -1
- package/dist/index.browser.cjs +699 -288
- package/dist/index.browser.cjs.map +1 -1
- package/dist/index.browser.mjs +637 -259
- package/dist/index.browser.mjs.map +1 -1
- package/dist/index.css +535 -152
- package/dist/index.css.map +1 -1
- package/dist/index.native.mjs +637 -259
- package/dist/index.native.mjs.map +1 -1
- package/dist/index.node.cjs +699 -288
- package/dist/index.node.cjs.map +1 -1
- package/dist/index.node.mjs +637 -259
- package/dist/index.node.mjs.map +1 -1
- package/dist/types/base-button.d.ts +12 -0
- package/dist/types/base-button.d.ts.map +1 -0
- package/dist/types/base-dropdown.d.ts +33 -0
- package/dist/types/base-dropdown.d.ts.map +1 -0
- package/dist/types/base-modal.d.ts +15 -0
- package/dist/types/base-modal.d.ts.map +1 -0
- package/dist/types/base-svg.d.ts +12 -0
- package/dist/types/base-svg.d.ts.map +1 -0
- package/dist/types/index.d.ts +37 -13
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/types/wallet-ui-button.d.ts +3 -0
- package/dist/types/types/wallet-ui-button.d.ts.map +1 -0
- package/dist/types/types/wallet-ui-div.d.ts +3 -0
- package/dist/types/types/wallet-ui-div.d.ts.map +1 -0
- package/dist/types/types/wallet-ui-img.d.ts +3 -0
- package/dist/types/types/wallet-ui-img.d.ts.map +1 -0
- package/dist/types/types/wallet-ui-size.d.ts +2 -0
- package/dist/types/types/wallet-ui-size.d.ts.map +1 -0
- package/dist/types/types/wallet-ui-span.d.ts +3 -0
- package/dist/types/types/wallet-ui-span.d.ts.map +1 -0
- package/dist/types/types/wallet-ui-svg.d.ts +3 -0
- package/dist/types/types/wallet-ui-svg.d.ts.map +1 -0
- package/dist/types/use-base-dropdown.d.ts +9 -0
- package/dist/types/use-base-dropdown.d.ts.map +1 -0
- package/dist/types/use-base-modal.d.ts +9 -0
- package/dist/types/use-base-modal.d.ts.map +1 -0
- package/dist/types/use-wallet-ui-account.d.ts +2 -0
- package/dist/types/use-wallet-ui-account.d.ts.map +1 -0
- package/dist/types/use-wallet-ui-cluster.d.ts +2 -0
- package/dist/types/use-wallet-ui-cluster.d.ts.map +1 -0
- package/dist/types/use-wallet-ui-dropdown.d.ts +14 -0
- package/dist/types/use-wallet-ui-dropdown.d.ts.map +1 -0
- package/dist/types/use-wallet-ui-solana-client.d.ts +2 -0
- package/dist/types/use-wallet-ui-solana-client.d.ts.map +1 -0
- package/dist/types/use-wallet-ui-wallet.d.ts +10 -0
- package/dist/types/use-wallet-ui-wallet.d.ts.map +1 -0
- package/dist/types/use-wallet-ui-wallets.d.ts +2 -0
- package/dist/types/use-wallet-ui-wallets.d.ts.map +1 -0
- package/dist/types/use-wallet-ui.d.ts +2 -0
- package/dist/types/use-wallet-ui.d.ts.map +1 -0
- package/dist/types/{solana-wallet-provider.d.ts → wallet-ui-account-context-provider.d.ts} +5 -4
- package/dist/types/wallet-ui-account-context-provider.d.ts.map +1 -0
- package/dist/types/wallet-ui-account-context.d.ts +13 -0
- package/dist/types/wallet-ui-account-context.d.ts.map +1 -0
- package/dist/types/wallet-ui-button.d.ts +8 -0
- package/dist/types/wallet-ui-button.d.ts.map +1 -0
- package/dist/types/wallet-ui-cluster-context-provider.d.ts +4 -0
- package/dist/types/wallet-ui-cluster-context-provider.d.ts.map +1 -0
- package/dist/types/wallet-ui-cluster-context.d.ts +14 -0
- package/dist/types/wallet-ui-cluster-context.d.ts.map +1 -0
- package/dist/types/wallet-ui-cluster-dropdown.d.ts +9 -0
- package/dist/types/wallet-ui-cluster-dropdown.d.ts.map +1 -0
- package/dist/types/wallet-ui-context-provider.d.ts +4 -0
- package/dist/types/wallet-ui-context-provider.d.ts.map +1 -0
- package/dist/types/wallet-ui-context.d.ts +25 -0
- package/dist/types/wallet-ui-context.d.ts.map +1 -0
- package/dist/types/wallet-ui-dropdown.d.ts +8 -0
- package/dist/types/wallet-ui-dropdown.d.ts.map +1 -0
- package/dist/types/wallet-ui-icon-close.d.ts +4 -0
- package/dist/types/wallet-ui-icon-close.d.ts.map +1 -0
- package/dist/types/wallet-ui-icon-no-wallet.d.ts +4 -0
- package/dist/types/wallet-ui-icon-no-wallet.d.ts.map +1 -0
- package/dist/types/wallet-ui-icon.d.ts +10 -0
- package/dist/types/wallet-ui-icon.d.ts.map +1 -0
- package/dist/types/wallet-ui-label.d.ts +9 -0
- package/dist/types/wallet-ui-label.d.ts.map +1 -0
- package/dist/types/wallet-ui-list-button.d.ts +11 -0
- package/dist/types/wallet-ui-list-button.d.ts.map +1 -0
- package/dist/types/wallet-ui-list.d.ts +11 -0
- package/dist/types/wallet-ui-list.d.ts.map +1 -0
- package/dist/types/wallet-ui-modal-trigger.d.ts +9 -0
- package/dist/types/wallet-ui-modal-trigger.d.ts.map +1 -0
- package/dist/types/wallet-ui-modal.d.ts +11 -0
- package/dist/types/wallet-ui-modal.d.ts.map +1 -0
- package/dist/types/wallet-ui-solana-client-context-provider.d.ts +4 -0
- package/dist/types/wallet-ui-solana-client-context-provider.d.ts.map +1 -0
- package/dist/types/wallet-ui-solana-client-context.d.ts +8 -0
- package/dist/types/wallet-ui-solana-client-context.d.ts.map +1 -0
- package/dist/types/wallet-ui.d.ts +15 -0
- package/dist/types/wallet-ui.d.ts.map +1 -0
- package/package.json +6 -3
- package/dist/types/solana-client-context.d.ts +0 -3
- package/dist/types/solana-client-context.d.ts.map +0 -1
- package/dist/types/solana-client-provider.d.ts +0 -7
- package/dist/types/solana-client-provider.d.ts.map +0 -1
- package/dist/types/solana-cluster-context.d.ts +0 -17
- package/dist/types/solana-cluster-context.d.ts.map +0 -1
- package/dist/types/solana-cluster-provider.d.ts +0 -7
- package/dist/types/solana-cluster-provider.d.ts.map +0 -1
- package/dist/types/solana-provider.d.ts +0 -7
- package/dist/types/solana-provider.d.ts.map +0 -1
- package/dist/types/solana-wallet-context.d.ts +0 -7
- package/dist/types/solana-wallet-context.d.ts.map +0 -1
- package/dist/types/solana-wallet-provider.d.ts.map +0 -1
- package/dist/types/solana-wallet-ui-button.d.ts +0 -3
- package/dist/types/solana-wallet-ui-button.d.ts.map +0 -1
- package/dist/types/solana-wallet-ui-context.d.ts +0 -19
- package/dist/types/solana-wallet-ui-context.d.ts.map +0 -1
- package/dist/types/solana-wallet-ui-dialog-trigger.d.ts +0 -4
- package/dist/types/solana-wallet-ui-dialog-trigger.d.ts.map +0 -1
- package/dist/types/solana-wallet-ui-dialog.d.ts +0 -12
- package/dist/types/solana-wallet-ui-dialog.d.ts.map +0 -1
- package/dist/types/solana-wallet-ui-dropdown.d.ts +0 -11
- package/dist/types/solana-wallet-ui-dropdown.d.ts.map +0 -1
- package/dist/types/solana-wallet-ui-provider.d.ts +0 -5
- package/dist/types/solana-wallet-ui-provider.d.ts.map +0 -1
package/dist/index.native.mjs
CHANGED
|
@@ -1,121 +1,355 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import { useWallets, uiWalletAccountsAreSame, uiWalletAccountBelongsToUiWallet, useConnect, useDisconnect, getUiWalletAccountStorageKey } from '@wallet-standard/react';
|
|
1
|
+
import React19, { createContext, useContext, useEffect, useId, useMemo, useState, useCallback } from 'react';
|
|
2
|
+
import { useConnect, useDisconnect, useWallets, uiWalletAccountsAreSame, uiWalletAccountBelongsToUiWallet, getUiWalletAccountStorageKey } from '@wallet-standard/react';
|
|
4
3
|
export * from '@wallet-standard/react';
|
|
5
|
-
import
|
|
4
|
+
import { Portal, useMachine, normalizeProps } from '@zag-js/react';
|
|
6
5
|
import * as menu from '@zag-js/menu';
|
|
7
|
-
import
|
|
6
|
+
import * as dialog from '@zag-js/dialog';
|
|
7
|
+
import { handleCopyText } from '@wallet-ui/core';
|
|
8
8
|
export * from '@wallet-ui/core';
|
|
9
|
+
import { createSolanaClient } from 'gill';
|
|
10
|
+
export * from '@solana/react';
|
|
11
|
+
export * from '@solana/wallet-standard-features';
|
|
12
|
+
export * from '@wallet-standard/core';
|
|
9
13
|
|
|
10
|
-
// src/
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
return useContext(SolanaClientContext);
|
|
14
|
+
// src/base-button.tsx
|
|
15
|
+
function BaseButton({ className, label, leftSection, onClick, rightSection, size, ...props }) {
|
|
16
|
+
return /* @__PURE__ */ React19.createElement("button", { className: `wallet-ui-base-button ${size ?? "md"} ${className ?? ""}`, onClick, ...props }, leftSection ? /* @__PURE__ */ React19.createElement("span", { className: "wallet-ui-base-button-left-section" }, leftSection) : null, label, rightSection ? /* @__PURE__ */ React19.createElement("span", { className: "wallet-ui-base-button-right-section" }, rightSection) : null);
|
|
14
17
|
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
return /* @__PURE__ */ React10.createElement(SolanaClientContext.Provider, { value }, children);
|
|
18
|
+
var WalletUiContext = React19.createContext({});
|
|
19
|
+
|
|
20
|
+
// src/use-wallet-ui.tsx
|
|
21
|
+
function useWalletUi() {
|
|
22
|
+
return React19.useContext(WalletUiContext);
|
|
21
23
|
}
|
|
22
|
-
var
|
|
23
|
-
|
|
24
|
-
|
|
24
|
+
var WalletUiAccountContext = createContext({});
|
|
25
|
+
|
|
26
|
+
// src/use-wallet-ui-account.tsx
|
|
27
|
+
function useWalletUiAccount() {
|
|
28
|
+
return useContext(WalletUiAccountContext);
|
|
25
29
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
30
|
+
|
|
31
|
+
// src/use-wallet-ui-wallet.tsx
|
|
32
|
+
function useWalletUiWallet({ wallet }) {
|
|
33
|
+
const { connect: connectAccount } = useWalletUi();
|
|
34
|
+
const { setAccount } = useWalletUiAccount();
|
|
35
|
+
const [isConnecting, connect3] = useConnect(wallet);
|
|
36
|
+
const [isDisconnecting, disconnect] = useDisconnect(wallet);
|
|
37
|
+
useEffect(() => {
|
|
38
|
+
}, [isDisconnecting]);
|
|
39
|
+
return {
|
|
40
|
+
connect: async () => {
|
|
41
|
+
const connectedAccount = await connect3();
|
|
42
|
+
console.log("connectedAccount", connectedAccount);
|
|
43
|
+
if (!connectedAccount.length) {
|
|
44
|
+
console.log("connect, no accounts");
|
|
45
|
+
return connectedAccount;
|
|
35
46
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
47
|
+
const first = connectedAccount[0];
|
|
48
|
+
console.log("connect, setting first account => ", first);
|
|
49
|
+
setAccount(first);
|
|
50
|
+
connectAccount(first);
|
|
51
|
+
return connectedAccount;
|
|
52
|
+
},
|
|
53
|
+
disconnect,
|
|
54
|
+
isConnecting,
|
|
55
|
+
isDisconnecting
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// src/base-dropdown.tsx
|
|
60
|
+
var BaseDropdownItemType = /* @__PURE__ */ ((BaseDropdownItemType2) => {
|
|
61
|
+
BaseDropdownItemType2["Item"] = "Item";
|
|
62
|
+
BaseDropdownItemType2["WalletConnect"] = "WalletConnect";
|
|
63
|
+
BaseDropdownItemType2["WalletCopy"] = "WalletCopy";
|
|
64
|
+
BaseDropdownItemType2["WalletDisconnect"] = "WalletDisconnect";
|
|
65
|
+
BaseDropdownItemType2["WalletNeeded"] = "WalletNeeded";
|
|
66
|
+
return BaseDropdownItemType2;
|
|
67
|
+
})(BaseDropdownItemType || {});
|
|
68
|
+
function BaseDropdown({ buttonProps, dropdown, showIndicator, items }) {
|
|
69
|
+
const api = dropdown.api;
|
|
70
|
+
const trigger = /* @__PURE__ */ React19.createElement(
|
|
71
|
+
BaseButton,
|
|
72
|
+
{
|
|
73
|
+
...api.getTriggerProps(),
|
|
74
|
+
className: `wallet-ui-base-dropdown-trigger`,
|
|
75
|
+
"data-part": "trigger",
|
|
76
|
+
rightSection: showIndicator ? /* @__PURE__ */ React19.createElement("span", { className: "wallet-actions" }, /* @__PURE__ */ React19.createElement("span", { ...api.getIndicatorProps(), className: "indicator" }, /* @__PURE__ */ React19.createElement(BaseDropdownChevronDown, { size: 12 }))) : null,
|
|
77
|
+
...buttonProps
|
|
40
78
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
79
|
+
);
|
|
80
|
+
return /* @__PURE__ */ React19.createElement("div", { className: "wallet-ui-base-dropdown" }, trigger, /* @__PURE__ */ React19.createElement("div", { ...api.getPositionerProps(), className: "wallet-positioner" }, /* @__PURE__ */ React19.createElement("div", { ...api.getContentProps(), className: "wallet-ui-base-dropdown-list", "data-part": "content" }, items.map((item) => {
|
|
81
|
+
return /* @__PURE__ */ React19.createElement(
|
|
82
|
+
BaseDropdownItem,
|
|
83
|
+
{
|
|
84
|
+
...api.getItemProps({ value: item.value }),
|
|
85
|
+
key: item.value,
|
|
86
|
+
item,
|
|
87
|
+
afterClick: () => {
|
|
88
|
+
if (item.disabled) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
if (item.closeMenu !== false) {
|
|
92
|
+
dropdown.close();
|
|
52
93
|
}
|
|
53
94
|
}
|
|
54
|
-
} catch (error) {
|
|
55
|
-
console.warn(`Error setting localStorage key "${key}":`, error);
|
|
56
95
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
);
|
|
60
|
-
return [storedValue, setValue];
|
|
96
|
+
);
|
|
97
|
+
}))));
|
|
61
98
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
function SolanaClusterProvider({ clusters, children }) {
|
|
66
|
-
const [clusterId, setClusterId] = useLocalStorage(STORAGE_KEY, "solana:devnet");
|
|
67
|
-
if (!clusters.length) {
|
|
68
|
-
throw new Error("No clusters provided");
|
|
99
|
+
function BaseDropdownItem({ afterClick, item }) {
|
|
100
|
+
if (!item.wallet) {
|
|
101
|
+
return /* @__PURE__ */ React19.createElement(BaseDropdownItemRender, { afterClick, item });
|
|
69
102
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
103
|
+
switch (item.type) {
|
|
104
|
+
case "Item" /* Item */:
|
|
105
|
+
return /* @__PURE__ */ React19.createElement(BaseDropdownItemRender, { afterClick, item });
|
|
106
|
+
case "WalletConnect" /* WalletConnect */:
|
|
107
|
+
return /* @__PURE__ */ React19.createElement(BaseDropdownItemWalletConnect, { afterClick, item, wallet: item.wallet });
|
|
108
|
+
case "WalletCopy" /* WalletCopy */:
|
|
109
|
+
return /* @__PURE__ */ React19.createElement(BaseDropdownItemRender, { afterClick, item });
|
|
110
|
+
case "WalletDisconnect" /* WalletDisconnect */:
|
|
111
|
+
return /* @__PURE__ */ React19.createElement(BaseDropdownItemWalletDisconnect, { afterClick, item, wallet: item.wallet });
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
function BaseDropdownItemWalletConnect({
|
|
115
|
+
afterClick,
|
|
116
|
+
item,
|
|
117
|
+
wallet
|
|
118
|
+
}) {
|
|
119
|
+
const { connect: connect3 } = useWalletUiWallet({ wallet });
|
|
120
|
+
return /* @__PURE__ */ React19.createElement(
|
|
121
|
+
BaseDropdownItemRender,
|
|
122
|
+
{
|
|
123
|
+
afterClick,
|
|
124
|
+
item: {
|
|
125
|
+
...item,
|
|
126
|
+
handler: async () => {
|
|
127
|
+
await connect3();
|
|
128
|
+
return await item.handler();
|
|
129
|
+
}
|
|
74
130
|
}
|
|
75
131
|
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
function BaseDropdownItemWalletDisconnect({
|
|
135
|
+
afterClick,
|
|
136
|
+
item,
|
|
137
|
+
wallet
|
|
138
|
+
}) {
|
|
139
|
+
const { disconnect } = useWalletUiWallet({ wallet });
|
|
140
|
+
return /* @__PURE__ */ React19.createElement(
|
|
141
|
+
BaseDropdownItemRender,
|
|
80
142
|
{
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
[cluster, clusters]
|
|
91
|
-
)
|
|
92
|
-
},
|
|
93
|
-
children
|
|
143
|
+
afterClick,
|
|
144
|
+
item: {
|
|
145
|
+
...item,
|
|
146
|
+
handler: async () => {
|
|
147
|
+
await disconnect();
|
|
148
|
+
return await item.handler();
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
94
152
|
);
|
|
95
153
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
154
|
+
function BaseDropdownItemRender({ afterClick, item }) {
|
|
155
|
+
function onClick() {
|
|
156
|
+
if (item.disabled) {
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
void item.handler().then(() => {
|
|
160
|
+
afterClick();
|
|
161
|
+
});
|
|
99
162
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
163
|
+
return /* @__PURE__ */ React19.createElement("div", { className: "wallet-ui-base-dropdown-item", "data-part": "item", onClick }, item.leftSection ? /* @__PURE__ */ React19.createElement("span", { className: "wallet-ui-base-dropdown-item-left-section" }, item.leftSection) : null, item.label, item.rightSection ? /* @__PURE__ */ React19.createElement("span", { className: "wallet-ui-base-dropdown-item-right-section" }, item.rightSection) : null);
|
|
164
|
+
}
|
|
165
|
+
function BaseDropdownChevronDown(props) {
|
|
166
|
+
return /* @__PURE__ */ React19.createElement(
|
|
167
|
+
"svg",
|
|
168
|
+
{
|
|
169
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
170
|
+
width: props.size ?? 24,
|
|
171
|
+
height: props.size ?? 24,
|
|
172
|
+
viewBox: "0 0 24 24",
|
|
173
|
+
fill: "none",
|
|
174
|
+
stroke: "currentColor",
|
|
175
|
+
strokeWidth: "2",
|
|
176
|
+
strokeLinecap: "round",
|
|
177
|
+
strokeLinejoin: "round",
|
|
178
|
+
...props
|
|
179
|
+
},
|
|
180
|
+
/* @__PURE__ */ React19.createElement("path", { d: "m6 9 6 6 6-6" })
|
|
181
|
+
);
|
|
182
|
+
}
|
|
183
|
+
function BaseSvg({ sizes = {}, ...props }) {
|
|
184
|
+
const size = props.size ? sizes[props.size] : 12;
|
|
185
|
+
return /* @__PURE__ */ React19.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: size, height: size, ...props }, props.children);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// src/wallet-ui-icon-close.tsx
|
|
189
|
+
function WalletUiIconClose({ size = "md", ...props }) {
|
|
190
|
+
return /* @__PURE__ */ React19.createElement(
|
|
191
|
+
BaseSvg,
|
|
192
|
+
{
|
|
193
|
+
size,
|
|
194
|
+
sizes: { lg: 16, md: 12, sm: 8 },
|
|
195
|
+
fill: "none",
|
|
196
|
+
stroke: "currentColor",
|
|
197
|
+
strokeWidth: "3",
|
|
198
|
+
viewBox: "0 0 14 14",
|
|
199
|
+
...props
|
|
200
|
+
},
|
|
201
|
+
/* @__PURE__ */ React19.createElement("path", { d: "M14 12.461 8.3 6.772l5.234-5.233L12.006 0 6.772 5.234 1.54 0 0 1.539l5.234 5.233L0 12.006l1.539 1.528L6.772 8.3l5.69 5.7L14 12.461z" })
|
|
202
|
+
);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// src/base-modal.tsx
|
|
206
|
+
function BaseModal({ modal, buttonLabel, buttonProps = {}, size = "md", ...props }) {
|
|
207
|
+
const api = modal.api;
|
|
208
|
+
return /* @__PURE__ */ React19.createElement(React19.Fragment, null, buttonLabel ? /* @__PURE__ */ React19.createElement(BaseButton, { label: buttonLabel, size, ...buttonProps, ...api.getTriggerProps() }) : null, api.open && /* @__PURE__ */ React19.createElement(Portal, null, /* @__PURE__ */ React19.createElement("div", { ...api.getBackdropProps() }), /* @__PURE__ */ React19.createElement("div", { ...api.getPositionerProps() }, /* @__PURE__ */ React19.createElement("div", { ...api.getContentProps(), className: size }, /* @__PURE__ */ React19.createElement("header", null, /* @__PURE__ */ React19.createElement("button", { ...api.getCloseTriggerProps() }, /* @__PURE__ */ React19.createElement(WalletUiIconClose, { size }))), props.description ? /* @__PURE__ */ React19.createElement("p", { ...api.getDescriptionProps() }, props.description) : null, /* @__PURE__ */ React19.createElement("main", null, props.children)))));
|
|
209
|
+
}
|
|
210
|
+
function useBaseDropdown() {
|
|
211
|
+
const service = useMachine(menu.machine, { id: useId() });
|
|
212
|
+
const api = menu.connect(service, normalizeProps);
|
|
213
|
+
return {
|
|
214
|
+
api,
|
|
215
|
+
close: () => service.send({ type: "CLOSE" }),
|
|
216
|
+
open: () => service.send({ type: "OPEN" })
|
|
217
|
+
};
|
|
103
218
|
}
|
|
104
|
-
function
|
|
105
|
-
const
|
|
106
|
-
|
|
219
|
+
function useBaseModal() {
|
|
220
|
+
const service = useMachine(dialog.machine, { id: useId(), modal: true });
|
|
221
|
+
const api = dialog.connect(service, normalizeProps);
|
|
222
|
+
return {
|
|
223
|
+
api,
|
|
224
|
+
close: () => service.send({ type: "CLOSE" }),
|
|
225
|
+
open: () => service.send({ type: "OPEN" })
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
var WalletUiClusterContext = createContext({});
|
|
229
|
+
|
|
230
|
+
// src/use-wallet-ui-cluster.tsx
|
|
231
|
+
function useWalletUiCluster() {
|
|
232
|
+
return useContext(WalletUiClusterContext);
|
|
233
|
+
}
|
|
234
|
+
function WalletUiIcon({ className, size, wallet, ...props }) {
|
|
235
|
+
if (!wallet) {
|
|
107
236
|
return null;
|
|
108
237
|
}
|
|
109
|
-
return
|
|
238
|
+
return /* @__PURE__ */ React19.createElement(
|
|
239
|
+
"img",
|
|
240
|
+
{
|
|
241
|
+
src: wallet.icon,
|
|
242
|
+
alt: wallet.name,
|
|
243
|
+
className: `wallet-ui-list-icon ${size ?? "md"} ${className ?? ""}`,
|
|
244
|
+
...props
|
|
245
|
+
}
|
|
246
|
+
);
|
|
110
247
|
}
|
|
111
248
|
|
|
112
|
-
// src/
|
|
113
|
-
|
|
249
|
+
// src/use-wallet-ui-dropdown.tsx
|
|
250
|
+
function getDropdownItemsWallets({
|
|
251
|
+
wallets,
|
|
252
|
+
connect: connect3,
|
|
253
|
+
size
|
|
254
|
+
}) {
|
|
255
|
+
return wallets.length ? wallets.map((wallet) => ({
|
|
256
|
+
handler: async () => {
|
|
257
|
+
const account = wallet.accounts.length > 0 ? wallet.accounts[0] : void 0;
|
|
258
|
+
if (!account) {
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
connect3(account);
|
|
262
|
+
await Promise.resolve();
|
|
263
|
+
},
|
|
264
|
+
label: wallet.name,
|
|
265
|
+
leftSection: /* @__PURE__ */ React19.createElement(WalletUiIcon, { wallet, size }),
|
|
266
|
+
type: "WalletConnect" /* WalletConnect */,
|
|
267
|
+
value: wallet.name,
|
|
268
|
+
wallet
|
|
269
|
+
})) : [
|
|
270
|
+
{
|
|
271
|
+
handler: async () => {
|
|
272
|
+
window.open("https://solana.com/solana-wallets", "_blank");
|
|
273
|
+
await Promise.resolve();
|
|
274
|
+
},
|
|
275
|
+
label: "You'll need a wallet on Solana to continue",
|
|
276
|
+
type: "WalletNeeded" /* WalletNeeded */,
|
|
277
|
+
value: "no-wallets"
|
|
278
|
+
}
|
|
279
|
+
];
|
|
280
|
+
}
|
|
281
|
+
function useWalletUiDropdown({ size = "md" } = {}) {
|
|
282
|
+
const dropdown = useBaseDropdown();
|
|
283
|
+
const { account, connect: connect3, copy, disconnect, connected, wallet, wallets } = useWalletUi();
|
|
284
|
+
const itemsWallets = useMemo(() => {
|
|
285
|
+
return getDropdownItemsWallets({ connect: connect3, size, wallets });
|
|
286
|
+
}, [wallets, size, connect3]);
|
|
287
|
+
const itemsConnected = useMemo(
|
|
288
|
+
() => [
|
|
289
|
+
{
|
|
290
|
+
handler: async () => {
|
|
291
|
+
copy();
|
|
292
|
+
void await Promise.resolve();
|
|
293
|
+
},
|
|
294
|
+
label: "Copy Address",
|
|
295
|
+
type: "WalletCopy" /* WalletCopy */,
|
|
296
|
+
value: "copy"
|
|
297
|
+
},
|
|
298
|
+
{
|
|
299
|
+
handler: async () => {
|
|
300
|
+
disconnect();
|
|
301
|
+
dropdown.close();
|
|
302
|
+
await Promise.resolve();
|
|
303
|
+
},
|
|
304
|
+
label: "Disconnect",
|
|
305
|
+
type: "WalletDisconnect" /* WalletDisconnect */,
|
|
306
|
+
value: "disconnect"
|
|
307
|
+
},
|
|
308
|
+
...itemsWallets
|
|
309
|
+
],
|
|
310
|
+
[connect3, copy, disconnect, dropdown, size, wallets]
|
|
311
|
+
);
|
|
312
|
+
const items = useMemo(() => {
|
|
313
|
+
return connected ? itemsConnected : itemsWallets;
|
|
314
|
+
}, [connected, itemsConnected, itemsWallets]);
|
|
315
|
+
const buttonProps = useMemo(() => {
|
|
316
|
+
return {
|
|
317
|
+
label: connected ? (account ? ellipsify(account.address) : wallet?.name) ?? "Connected" : "Select Wallet",
|
|
318
|
+
leftSection: connected ? /* @__PURE__ */ React19.createElement(WalletUiIcon, { size, wallet }) : void 0
|
|
319
|
+
};
|
|
320
|
+
}, [account, connected, size, wallet]);
|
|
321
|
+
return {
|
|
322
|
+
buttonProps,
|
|
323
|
+
connected,
|
|
324
|
+
dropdown,
|
|
325
|
+
items
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
function ellipsify(str = "", len = 4, delimiter = "..") {
|
|
329
|
+
const strLen = str.length;
|
|
330
|
+
const limit = len * 2 + delimiter.length;
|
|
331
|
+
return strLen >= limit ? str.substring(0, len) + delimiter + str.substring(strLen - len, strLen) : str;
|
|
332
|
+
}
|
|
333
|
+
var WalletUiSolanaClientContext = createContext({});
|
|
334
|
+
|
|
335
|
+
// src/use-wallet-ui-solana-client.tsx
|
|
336
|
+
function useWalletUiSolanaClient() {
|
|
337
|
+
return useContext(WalletUiSolanaClientContext);
|
|
338
|
+
}
|
|
339
|
+
function useWalletUiWallets() {
|
|
340
|
+
const readonlyWallets = useWallets();
|
|
341
|
+
return useMemo(
|
|
342
|
+
() => readonlyWallets.filter((wallet) => wallet.chains.some((i) => i.startsWith("solana:"))).sort((a, b) => a.name.localeCompare(b.name)),
|
|
343
|
+
[readonlyWallets]
|
|
344
|
+
);
|
|
345
|
+
}
|
|
346
|
+
var STORAGE_KEY = "wallet-ui:selected-wallet-account";
|
|
114
347
|
var wasSetterInvoked = false;
|
|
115
|
-
function getSavedWalletAccount(wallets,
|
|
348
|
+
function getSavedWalletAccount(wallets, storageKey) {
|
|
116
349
|
if (wasSetterInvoked) {
|
|
117
350
|
return;
|
|
118
351
|
}
|
|
352
|
+
const savedWalletNameAndAddress = localStorage.getItem(storageKey);
|
|
119
353
|
if (!savedWalletNameAndAddress || typeof savedWalletNameAndAddress !== "string") {
|
|
120
354
|
return;
|
|
121
355
|
}
|
|
@@ -133,233 +367,377 @@ function getSavedWalletAccount(wallets, savedWalletNameAndAddress) {
|
|
|
133
367
|
}
|
|
134
368
|
}
|
|
135
369
|
}
|
|
136
|
-
function
|
|
137
|
-
|
|
370
|
+
function WalletUiAccountContextProvider({
|
|
371
|
+
children,
|
|
372
|
+
storageKey = STORAGE_KEY
|
|
373
|
+
}) {
|
|
374
|
+
const { cluster } = useWalletUiCluster();
|
|
138
375
|
const wallets = useWallets();
|
|
139
|
-
const [
|
|
140
|
-
() => getSavedWalletAccount(wallets,
|
|
376
|
+
const [account, setAccountInternal] = useState(
|
|
377
|
+
() => getSavedWalletAccount(wallets, storageKey)
|
|
141
378
|
);
|
|
142
|
-
|
|
143
|
-
|
|
379
|
+
function setAccount(setStateAction) {
|
|
380
|
+
setAccountInternal((prevAccount) => {
|
|
144
381
|
wasSetterInvoked = true;
|
|
145
|
-
const nextWalletAccount = typeof setStateAction === "function" ? setStateAction(
|
|
382
|
+
const nextWalletAccount = typeof setStateAction === "function" ? setStateAction(prevAccount) : setStateAction;
|
|
146
383
|
const accountKey = nextWalletAccount ? getUiWalletAccountStorageKey(nextWalletAccount) : void 0;
|
|
147
384
|
if (accountKey) {
|
|
148
|
-
|
|
385
|
+
localStorage.setItem(storageKey, accountKey);
|
|
149
386
|
} else {
|
|
150
|
-
|
|
387
|
+
localStorage.removeItem(storageKey);
|
|
151
388
|
}
|
|
152
389
|
return nextWalletAccount;
|
|
153
390
|
});
|
|
154
|
-
}
|
|
391
|
+
}
|
|
155
392
|
useEffect(() => {
|
|
156
|
-
const savedWalletAccount = getSavedWalletAccount(wallets,
|
|
393
|
+
const savedWalletAccount = getSavedWalletAccount(wallets, storageKey);
|
|
157
394
|
if (savedWalletAccount) {
|
|
158
|
-
|
|
395
|
+
setAccountInternal(savedWalletAccount);
|
|
159
396
|
}
|
|
160
397
|
}, [wallets]);
|
|
161
398
|
const walletAccount = useMemo(() => {
|
|
162
|
-
if (
|
|
399
|
+
if (account) {
|
|
163
400
|
for (const uiWallet of wallets) {
|
|
164
401
|
for (const uiWalletAccount of uiWallet.accounts) {
|
|
165
|
-
if (uiWalletAccountsAreSame(
|
|
402
|
+
if (uiWalletAccountsAreSame(account, uiWalletAccount)) {
|
|
166
403
|
return uiWalletAccount;
|
|
167
404
|
}
|
|
168
405
|
}
|
|
169
|
-
if (uiWalletAccountBelongsToUiWallet(
|
|
406
|
+
if (uiWalletAccountBelongsToUiWallet(account, uiWallet) && uiWallet.accounts[0]) {
|
|
170
407
|
return uiWallet.accounts[0];
|
|
171
408
|
}
|
|
172
409
|
}
|
|
173
410
|
}
|
|
174
|
-
}, [
|
|
411
|
+
}, [account, wallets]);
|
|
175
412
|
useEffect(() => {
|
|
176
|
-
if (
|
|
177
|
-
|
|
413
|
+
if (account && !walletAccount) {
|
|
414
|
+
setAccountInternal(void 0);
|
|
415
|
+
}
|
|
416
|
+
}, [account, walletAccount]);
|
|
417
|
+
const wallet = useMemo(() => {
|
|
418
|
+
if (!walletAccount) {
|
|
419
|
+
return void 0;
|
|
420
|
+
}
|
|
421
|
+
for (const uiWallet of wallets) {
|
|
422
|
+
for (const uiWalletAccount of uiWallet.accounts) {
|
|
423
|
+
if (uiWalletAccountsAreSame(walletAccount, uiWalletAccount)) {
|
|
424
|
+
return uiWallet;
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
if (uiWalletAccountBelongsToUiWallet(walletAccount, uiWallet) && uiWallet.accounts[0]) {
|
|
428
|
+
return uiWallet;
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
}, [walletAccount, wallets]);
|
|
432
|
+
const accountKeys = useMemo(() => {
|
|
433
|
+
if (!account) {
|
|
434
|
+
return [];
|
|
178
435
|
}
|
|
179
|
-
|
|
180
|
-
|
|
436
|
+
return [cluster.id, getUiWalletAccountStorageKey(account)].filter(Boolean);
|
|
437
|
+
}, [account]);
|
|
438
|
+
return /* @__PURE__ */ React19.createElement(
|
|
439
|
+
WalletUiAccountContext.Provider,
|
|
440
|
+
{
|
|
441
|
+
value: useMemo(
|
|
442
|
+
() => ({
|
|
443
|
+
account: walletAccount,
|
|
444
|
+
accountKeys,
|
|
445
|
+
setAccount,
|
|
446
|
+
wallet
|
|
447
|
+
}),
|
|
448
|
+
[walletAccount, wallet, accountKeys]
|
|
449
|
+
)
|
|
450
|
+
},
|
|
451
|
+
children
|
|
452
|
+
);
|
|
181
453
|
}
|
|
182
|
-
|
|
183
|
-
{
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
454
|
+
function useLocalStorage(key, initialValue) {
|
|
455
|
+
const [storedValue, setStoredValue] = useState(() => {
|
|
456
|
+
try {
|
|
457
|
+
if (typeof window === "undefined") {
|
|
458
|
+
return initialValue;
|
|
459
|
+
}
|
|
460
|
+
const item = window.localStorage.getItem(key);
|
|
461
|
+
if (key.includes("wallet") || key.includes("account")) {
|
|
462
|
+
return initialValue;
|
|
463
|
+
}
|
|
464
|
+
return item ? JSON.parse(item) : initialValue;
|
|
465
|
+
} catch (error) {
|
|
466
|
+
console.warn(`Error reading localStorage key "${key}":`, error);
|
|
467
|
+
return initialValue;
|
|
468
|
+
}
|
|
469
|
+
});
|
|
470
|
+
const setValue = useCallback(
|
|
471
|
+
(value) => {
|
|
472
|
+
try {
|
|
473
|
+
const valueToStore = value instanceof Function ? value(storedValue) : value;
|
|
474
|
+
setStoredValue(valueToStore);
|
|
475
|
+
if (typeof window !== "undefined") {
|
|
476
|
+
if (valueToStore === void 0 || valueToStore === null) {
|
|
477
|
+
window.localStorage.removeItem(key);
|
|
478
|
+
} else {
|
|
479
|
+
window.localStorage.setItem(key, JSON.stringify(valueToStore));
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
} catch (error) {
|
|
483
|
+
console.warn(`Error setting localStorage key "${key}":`, error);
|
|
484
|
+
}
|
|
485
|
+
},
|
|
486
|
+
[key, storedValue]
|
|
487
|
+
);
|
|
488
|
+
return [storedValue, setValue];
|
|
187
489
|
}
|
|
188
490
|
|
|
189
|
-
// src/
|
|
190
|
-
function
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
const
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
const [connected, setConnected] = useState(false);
|
|
199
|
-
function change() {
|
|
200
|
-
menuService.send({ type: "CLOSE" });
|
|
201
|
-
dialogService.send({ type: "OPEN" });
|
|
202
|
-
}
|
|
203
|
-
function connectAccount(wallet2, account) {
|
|
204
|
-
console.log("connectAccount", account);
|
|
205
|
-
setWalletAccount(account);
|
|
206
|
-
setWallet(wallet2);
|
|
207
|
-
setConnected(true);
|
|
208
|
-
dialogService.send({ type: "CLOSE" });
|
|
491
|
+
// src/wallet-ui-cluster-context-provider.tsx
|
|
492
|
+
function WalletUiClusterContextProvider({
|
|
493
|
+
clusters,
|
|
494
|
+
render,
|
|
495
|
+
storageKey = "__wallet-ui:selected-cluster"
|
|
496
|
+
}) {
|
|
497
|
+
const [clusterId, setClusterId] = useLocalStorage(storageKey, "solana:devnet");
|
|
498
|
+
if (!clusters.length) {
|
|
499
|
+
throw new Error("No clusters provided");
|
|
209
500
|
}
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
501
|
+
const cluster = useMemo(() => {
|
|
502
|
+
for (const cluster2 of clusters) {
|
|
503
|
+
if (cluster2.id === clusterId) {
|
|
504
|
+
return cluster2;
|
|
505
|
+
}
|
|
213
506
|
}
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
507
|
+
return clusters[0];
|
|
508
|
+
}, [clusterId, clusters]);
|
|
509
|
+
const value = {
|
|
510
|
+
cluster,
|
|
511
|
+
clusters,
|
|
512
|
+
setCluster: (cluster2) => {
|
|
513
|
+
localStorage.setItem(storageKey, cluster2);
|
|
514
|
+
setClusterId(cluster2);
|
|
515
|
+
}
|
|
516
|
+
};
|
|
517
|
+
return /* @__PURE__ */ React19.createElement(WalletUiClusterContext.Provider, { value }, render(value));
|
|
518
|
+
}
|
|
519
|
+
function WalletUiContextProvider({ children, size = "md" }) {
|
|
520
|
+
const { account, setAccount, wallet } = useWalletUiAccount();
|
|
521
|
+
const wallets = useWalletUiWallets();
|
|
522
|
+
const client = useWalletUiSolanaClient();
|
|
523
|
+
const walletHasAccounts = Boolean(wallet && wallet?.accounts.length > 0);
|
|
524
|
+
function connect3(account2) {
|
|
525
|
+
setAccount(account2);
|
|
217
526
|
}
|
|
218
527
|
function disconnect() {
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
528
|
+
setAccount(void 0);
|
|
529
|
+
}
|
|
530
|
+
function copy() {
|
|
531
|
+
if (!account) {
|
|
532
|
+
return;
|
|
533
|
+
}
|
|
534
|
+
handleCopyText(account.address);
|
|
223
535
|
}
|
|
224
536
|
const value = {
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
537
|
+
account,
|
|
538
|
+
client,
|
|
539
|
+
connect: connect3,
|
|
540
|
+
connected: walletHasAccounts,
|
|
228
541
|
copy,
|
|
229
|
-
dialogApi,
|
|
230
542
|
disconnect,
|
|
231
|
-
|
|
543
|
+
size,
|
|
232
544
|
wallet,
|
|
233
|
-
|
|
234
|
-
wallets: useMemo(() => wallets.filter((wallet2) => wallet2.chains.some((i) => i.startsWith("solana:"))), [wallets])
|
|
545
|
+
wallets
|
|
235
546
|
};
|
|
236
|
-
return /* @__PURE__ */
|
|
547
|
+
return /* @__PURE__ */ React19.createElement(WalletUiContext.Provider, { value }, children);
|
|
237
548
|
}
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
const { cluster } = useSolanaCluster();
|
|
245
|
-
return /* @__PURE__ */ React10.createElement(SolanaClientProvider, { urlOrMoniker: cluster.urlOrMoniker }, children);
|
|
246
|
-
}
|
|
247
|
-
function SolanaWalletUiDialogTrigger(props) {
|
|
248
|
-
const { dialogApi } = useSolanaWalletUi();
|
|
249
|
-
console.log("SolanaWalletUiDialogTrigger", dialogApi);
|
|
250
|
-
return /* @__PURE__ */ React10.createElement("button", { ...props, ...dialogApi.getTriggerProps() }, "Select Wallet");
|
|
251
|
-
}
|
|
252
|
-
function SolanaWalletUiDropdown() {
|
|
253
|
-
const { change, connected, copy, disconnect, menuApi: api, wallet } = useSolanaWalletUi();
|
|
254
|
-
const menuItems = [
|
|
549
|
+
function WalletUiSolanaClientContextProvider({
|
|
550
|
+
children,
|
|
551
|
+
urlOrMoniker
|
|
552
|
+
}) {
|
|
553
|
+
return /* @__PURE__ */ React19.createElement(
|
|
554
|
+
WalletUiSolanaClientContext.Provider,
|
|
255
555
|
{
|
|
256
|
-
|
|
257
|
-
label: "Copy Address",
|
|
258
|
-
value: "copy"
|
|
556
|
+
value: useMemo(() => createSolanaClient({ urlOrMoniker }), [urlOrMoniker])
|
|
259
557
|
},
|
|
558
|
+
children
|
|
559
|
+
);
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
// src/wallet-ui.tsx
|
|
563
|
+
function createWalletUiConfig(props) {
|
|
564
|
+
return { ...props };
|
|
565
|
+
}
|
|
566
|
+
function WalletUi({
|
|
567
|
+
children,
|
|
568
|
+
config: { clusters, clusterStorageKey, selectedAccountStorageKey, ...config }
|
|
569
|
+
}) {
|
|
570
|
+
return /* @__PURE__ */ React19.createElement(React19.Fragment, null, /* @__PURE__ */ React19.createElement(
|
|
571
|
+
WalletUiClusterContextProvider,
|
|
260
572
|
{
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
573
|
+
clusters,
|
|
574
|
+
storageKey: clusterStorageKey,
|
|
575
|
+
render: ({ cluster }) => {
|
|
576
|
+
return /* @__PURE__ */ React19.createElement(WalletUiSolanaClientContextProvider, { urlOrMoniker: cluster.urlOrMoniker }, /* @__PURE__ */ React19.createElement(WalletUiAccountContextProvider, { storageKey: selectedAccountStorageKey }, /* @__PURE__ */ React19.createElement(WalletUiContextProvider, { ...config }, children)));
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
));
|
|
580
|
+
}
|
|
581
|
+
function WalletUiButton({ ...props }) {
|
|
582
|
+
return /* @__PURE__ */ React19.createElement(BaseButton, { ...props, label: "CLICK" });
|
|
583
|
+
}
|
|
584
|
+
function WalletUiClusterDropdown({ buttonProps, size = "md", ...props }) {
|
|
585
|
+
const dropdown = useBaseDropdown();
|
|
586
|
+
const { cluster, clusters, setCluster } = useWalletUiCluster();
|
|
587
|
+
return /* @__PURE__ */ React19.createElement(
|
|
588
|
+
BaseDropdown,
|
|
265
589
|
{
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
590
|
+
buttonProps: { ...buttonProps, label: cluster.label, size },
|
|
591
|
+
items: clusters.map((cluster2) => ({
|
|
592
|
+
handler: async () => {
|
|
593
|
+
setCluster(cluster2.id);
|
|
594
|
+
await Promise.resolve();
|
|
595
|
+
},
|
|
596
|
+
label: cluster2.label,
|
|
597
|
+
type: "Item" /* Item */,
|
|
598
|
+
value: cluster2.id
|
|
599
|
+
})),
|
|
600
|
+
dropdown,
|
|
601
|
+
...props
|
|
269
602
|
}
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
603
|
+
);
|
|
604
|
+
}
|
|
605
|
+
function WalletUiDropdown({ size = "md", ...props }) {
|
|
606
|
+
const { buttonProps, items, dropdown } = useWalletUiDropdown({ size });
|
|
607
|
+
return /* @__PURE__ */ React19.createElement(BaseDropdown, { ...props, buttonProps: { ...buttonProps, size }, items, dropdown });
|
|
608
|
+
}
|
|
609
|
+
function WalletUiIconNoWallet({ size, ...props }) {
|
|
610
|
+
return /* @__PURE__ */ React19.createElement(BaseSvg, { size, sizes: { lg: 125, md: 100, sm: 75 }, fill: "none", viewBox: "0 0 97 96", ...props }, /* @__PURE__ */ React19.createElement("circle", { cx: "48.5", cy: "48", r: "48", fill: "url(#paint0_linear_880_5115)", fillOpacity: "0.1" }), /* @__PURE__ */ React19.createElement(
|
|
611
|
+
"circle",
|
|
273
612
|
{
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
613
|
+
cx: "48.5",
|
|
614
|
+
cy: "48",
|
|
615
|
+
r: "47",
|
|
616
|
+
stroke: "url(#paint1_linear_880_5115)",
|
|
617
|
+
strokeOpacity: "0.4",
|
|
618
|
+
strokeWidth: "2"
|
|
619
|
+
}
|
|
620
|
+
), /* @__PURE__ */ React19.createElement("g", { clipPath: "url(#clip0_880_5115)" }, /* @__PURE__ */ React19.createElement(
|
|
621
|
+
"path",
|
|
622
|
+
{
|
|
623
|
+
d: "M65.5769 28.1523H31.4231C27.6057 28.1523 24.5 31.258 24.5 35.0754V60.9215C24.5 64.7389 27.6057 67.8446 31.4231 67.8446H65.5769C69.3943 67.8446 72.5 64.7389 72.5 60.9215V35.0754C72.5 31.258 69.3943 28.1523 65.5769 28.1523ZM69.7308 52.1523H59.5769C57.2865 52.1523 55.4231 50.289 55.4231 47.9985C55.4231 45.708 57.2864 43.8446 59.5769 43.8446H69.7308V52.1523ZM69.7308 41.0754H59.5769C55.7595 41.0754 52.6539 44.1811 52.6539 47.9985C52.6539 51.8159 55.7595 54.9215 59.5769 54.9215H69.7308V60.9215C69.7308 63.2119 67.8674 65.0754 65.5769 65.0754H31.4231C29.1327 65.0754 27.2692 63.212 27.2692 60.9215V35.0754C27.2692 32.785 29.1326 30.9215 31.4231 30.9215H65.5769C67.8673 30.9215 69.7308 32.7849 69.7308 35.0754V41.0754Z",
|
|
624
|
+
fill: "url(#paint2_linear_880_5115)"
|
|
625
|
+
}
|
|
626
|
+
), /* @__PURE__ */ React19.createElement(
|
|
627
|
+
"path",
|
|
628
|
+
{
|
|
629
|
+
d: "M61.4231 46.6172H59.577C58.8123 46.6172 58.1924 47.2371 58.1924 48.0018C58.1924 48.7665 58.8123 49.3863 59.577 49.3863H61.4231C62.1878 49.3863 62.8077 48.7664 62.8077 48.0018C62.8077 47.2371 62.1878 46.6172 61.4231 46.6172Z",
|
|
630
|
+
fill: "url(#paint3_linear_880_5115)"
|
|
631
|
+
}
|
|
632
|
+
)), /* @__PURE__ */ React19.createElement("defs", null, /* @__PURE__ */ React19.createElement(
|
|
633
|
+
"linearGradient",
|
|
634
|
+
{
|
|
635
|
+
id: "paint0_linear_880_5115",
|
|
636
|
+
x1: "3.41664",
|
|
637
|
+
y1: "98.0933",
|
|
638
|
+
x2: "103.05",
|
|
639
|
+
y2: "8.42498",
|
|
640
|
+
gradientUnits: "userSpaceOnUse"
|
|
277
641
|
},
|
|
278
|
-
|
|
279
|
-
/* @__PURE__ */
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
"
|
|
642
|
+
/* @__PURE__ */ React19.createElement("stop", { stopColor: "#9945FF" }),
|
|
643
|
+
/* @__PURE__ */ React19.createElement("stop", { offset: "0.14", stopColor: "#8A53F4" }),
|
|
644
|
+
/* @__PURE__ */ React19.createElement("stop", { offset: "0.42", stopColor: "#6377D6" }),
|
|
645
|
+
/* @__PURE__ */ React19.createElement("stop", { offset: "0.79", stopColor: "#24B0A7" }),
|
|
646
|
+
/* @__PURE__ */ React19.createElement("stop", { offset: "0.99", stopColor: "#00D18C" }),
|
|
647
|
+
/* @__PURE__ */ React19.createElement("stop", { offset: "1", stopColor: "#00D18C" })
|
|
648
|
+
), /* @__PURE__ */ React19.createElement(
|
|
649
|
+
"linearGradient",
|
|
283
650
|
{
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
return;
|
|
291
|
-
}
|
|
292
|
-
void item.handler();
|
|
293
|
-
}
|
|
651
|
+
id: "paint1_linear_880_5115",
|
|
652
|
+
x1: "3.41664",
|
|
653
|
+
y1: "98.0933",
|
|
654
|
+
x2: "103.05",
|
|
655
|
+
y2: "8.42498",
|
|
656
|
+
gradientUnits: "userSpaceOnUse"
|
|
294
657
|
},
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
|
|
658
|
+
/* @__PURE__ */ React19.createElement("stop", { stopColor: "#9945FF" }),
|
|
659
|
+
/* @__PURE__ */ React19.createElement("stop", { offset: "0.14", stopColor: "#8A53F4" }),
|
|
660
|
+
/* @__PURE__ */ React19.createElement("stop", { offset: "0.42", stopColor: "#6377D6" }),
|
|
661
|
+
/* @__PURE__ */ React19.createElement("stop", { offset: "0.79", stopColor: "#24B0A7" }),
|
|
662
|
+
/* @__PURE__ */ React19.createElement("stop", { offset: "0.99", stopColor: "#00D18C" }),
|
|
663
|
+
/* @__PURE__ */ React19.createElement("stop", { offset: "1", stopColor: "#00D18C" })
|
|
664
|
+
), /* @__PURE__ */ React19.createElement(
|
|
665
|
+
"linearGradient",
|
|
666
|
+
{
|
|
667
|
+
id: "paint2_linear_880_5115",
|
|
668
|
+
x1: "25.9583",
|
|
669
|
+
y1: "68.7101",
|
|
670
|
+
x2: "67.2337",
|
|
671
|
+
y2: "23.7879",
|
|
672
|
+
gradientUnits: "userSpaceOnUse"
|
|
673
|
+
},
|
|
674
|
+
/* @__PURE__ */ React19.createElement("stop", { stopColor: "#9945FF" }),
|
|
675
|
+
/* @__PURE__ */ React19.createElement("stop", { offset: "0.14", stopColor: "#8A53F4" }),
|
|
676
|
+
/* @__PURE__ */ React19.createElement("stop", { offset: "0.42", stopColor: "#6377D6" }),
|
|
677
|
+
/* @__PURE__ */ React19.createElement("stop", { offset: "0.79", stopColor: "#24B0A7" }),
|
|
678
|
+
/* @__PURE__ */ React19.createElement("stop", { offset: "0.99", stopColor: "#00D18C" }),
|
|
679
|
+
/* @__PURE__ */ React19.createElement("stop", { offset: "1", stopColor: "#00D18C" })
|
|
680
|
+
), /* @__PURE__ */ React19.createElement(
|
|
681
|
+
"linearGradient",
|
|
682
|
+
{
|
|
683
|
+
id: "paint3_linear_880_5115",
|
|
684
|
+
x1: "58.3326",
|
|
685
|
+
y1: "49.4467",
|
|
686
|
+
x2: "61.0002",
|
|
687
|
+
y2: "45.4453",
|
|
688
|
+
gradientUnits: "userSpaceOnUse"
|
|
689
|
+
},
|
|
690
|
+
/* @__PURE__ */ React19.createElement("stop", { stopColor: "#9945FF" }),
|
|
691
|
+
/* @__PURE__ */ React19.createElement("stop", { offset: "0.14", stopColor: "#8A53F4" }),
|
|
692
|
+
/* @__PURE__ */ React19.createElement("stop", { offset: "0.42", stopColor: "#6377D6" }),
|
|
693
|
+
/* @__PURE__ */ React19.createElement("stop", { offset: "0.79", stopColor: "#24B0A7" }),
|
|
694
|
+
/* @__PURE__ */ React19.createElement("stop", { offset: "0.99", stopColor: "#00D18C" }),
|
|
695
|
+
/* @__PURE__ */ React19.createElement("stop", { offset: "1", stopColor: "#00D18C" })
|
|
696
|
+
), /* @__PURE__ */ React19.createElement("clipPath", { id: "clip0_880_5115" }, /* @__PURE__ */ React19.createElement("rect", { width: "48", height: "48", fill: "white", transform: "translate(24.5 24)" }))));
|
|
300
697
|
}
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
function SolanaWalletUiButton() {
|
|
304
|
-
const { connected } = useSolanaWalletUi();
|
|
305
|
-
return connected ? /* @__PURE__ */ React10.createElement(SolanaWalletUiDropdown, null) : /* @__PURE__ */ React10.createElement(SolanaWalletUiDialogTrigger, null);
|
|
306
|
-
}
|
|
307
|
-
function SolanaWalletUiDialog({ description, title }) {
|
|
308
|
-
const { dialogApi: api, connected, disconnect } = useSolanaWalletUi();
|
|
309
|
-
if (!api) {
|
|
310
|
-
console.log("no api");
|
|
698
|
+
function WalletUiLabel({ className, size, wallet, ...props }) {
|
|
699
|
+
if (!wallet) {
|
|
311
700
|
return null;
|
|
312
701
|
}
|
|
313
|
-
|
|
314
|
-
console.log("no api.open");
|
|
315
|
-
return null;
|
|
316
|
-
}
|
|
317
|
-
return /* @__PURE__ */ React10.createElement(Portal, null, /* @__PURE__ */ React10.createElement("div", { className: "dialog", ...api.getBackdropProps() }), /* @__PURE__ */ React10.createElement("div", { className: "dialog", ...api.getPositionerProps() }, /* @__PURE__ */ React10.createElement("div", { className: "dialog", ...api.getContentProps() }, title ? /* @__PURE__ */ React10.createElement("h2", { className: "dialog", ...api.getTitleProps() }, title) : null, description ? /* @__PURE__ */ React10.createElement("p", { className: "dialog", ...api.getDescriptionProps() }, description) : null, /* @__PURE__ */ React10.createElement("div", { style: { marginTop: "32px" } }, /* @__PURE__ */ React10.createElement(SolanaWalletUiDialogList, null), connected ? /* @__PURE__ */ React10.createElement("button", { onClick: disconnect }, "Disconnect") : null), /* @__PURE__ */ React10.createElement("button", { className: "dialog", ...api.getCloseTriggerProps() }, "\xD7"))));
|
|
702
|
+
return /* @__PURE__ */ React19.createElement("span", { className: `wallet-ui-list-label ${size ?? "md"} ${className ?? ""}`, ...props }, wallet.name);
|
|
318
703
|
}
|
|
319
|
-
function
|
|
320
|
-
const
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
return /* @__PURE__ */ React10.createElement("div", null, "Pending...");
|
|
704
|
+
function WalletUiListButton({ className, select, size = "md", wallet, ...props }) {
|
|
705
|
+
const [pending, setPending] = React19.useState(false);
|
|
706
|
+
function handleSelect() {
|
|
707
|
+
if (!select) {
|
|
708
|
+
return;
|
|
709
|
+
}
|
|
710
|
+
setPending(true);
|
|
711
|
+
const account = wallet.accounts.length > 0 ? wallet.accounts[0] : void 0;
|
|
712
|
+
if (!account) {
|
|
713
|
+
return;
|
|
714
|
+
}
|
|
715
|
+
void select(account).finally(() => setPending(false));
|
|
332
716
|
}
|
|
333
|
-
return /* @__PURE__ */
|
|
334
|
-
"button",
|
|
335
|
-
{
|
|
336
|
-
disabled: isPending,
|
|
337
|
-
onClick: () => {
|
|
338
|
-
void disconnect();
|
|
339
|
-
}
|
|
340
|
-
},
|
|
341
|
-
"Disconnect"
|
|
342
|
-
) : /* @__PURE__ */ React10.createElement(
|
|
717
|
+
return /* @__PURE__ */ React19.createElement(
|
|
343
718
|
"button",
|
|
344
719
|
{
|
|
345
|
-
disabled:
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
720
|
+
disabled: pending,
|
|
721
|
+
className: `wallet-ui-list-button ${size} ${pending ? "wallet-ui-list-button-pending" : ""} ${className ?? ""}`,
|
|
722
|
+
onClick: handleSelect,
|
|
723
|
+
...props
|
|
349
724
|
},
|
|
350
|
-
"
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
))
|
|
725
|
+
/* @__PURE__ */ React19.createElement(WalletUiIcon, { className: "wallet-ui-list-button-icon", wallet, size }),
|
|
726
|
+
/* @__PURE__ */ React19.createElement(WalletUiLabel, { className: "wallet-ui-list-button-label", wallet, size })
|
|
727
|
+
);
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
// src/wallet-ui-list.tsx
|
|
731
|
+
function WalletUiList({ className, select, size = "md", wallets, ...props }) {
|
|
732
|
+
return /* @__PURE__ */ React19.createElement("div", { className: `wallet-ui-list ${size} ${className ?? ""}`, ...props }, wallets.map((wallet) => /* @__PURE__ */ React19.createElement(WalletUiListButton, { key: wallet.name, select, size, wallet })));
|
|
733
|
+
}
|
|
734
|
+
function WalletUiModal({ size = "md", wallets, select, ...props }) {
|
|
735
|
+
return /* @__PURE__ */ React19.createElement(BaseModal, { description: "Connect a wallet on Solana to continue", size, ...props }, /* @__PURE__ */ React19.createElement(WalletUiList, { size, wallets, select }));
|
|
736
|
+
}
|
|
737
|
+
function WalletUiModalTrigger({ label = "Select Wallet", modal, ...props }) {
|
|
738
|
+
return /* @__PURE__ */ React19.createElement(BaseButton, { label, onClick: () => void modal.open(), ...props });
|
|
361
739
|
}
|
|
362
740
|
|
|
363
|
-
export {
|
|
741
|
+
export { BaseButton, BaseDropdown, BaseDropdownChevronDown, BaseDropdownItemType, BaseModal, BaseSvg, WalletUi, WalletUiAccountContext, WalletUiAccountContextProvider, WalletUiButton, WalletUiClusterContext, WalletUiClusterContextProvider, WalletUiClusterDropdown, WalletUiContext, WalletUiContextProvider, WalletUiDropdown, WalletUiIcon, WalletUiIconClose, WalletUiIconNoWallet, WalletUiLabel, WalletUiList, WalletUiListButton, WalletUiModal, WalletUiModalTrigger, WalletUiSolanaClientContext, WalletUiSolanaClientContextProvider, createWalletUiConfig, ellipsify, useBaseDropdown, useBaseModal, useWalletUi, useWalletUiAccount, useWalletUiCluster, useWalletUiDropdown, useWalletUiSolanaClient, useWalletUiWallet, useWalletUiWallets };
|
|
364
742
|
//# sourceMappingURL=index.native.mjs.map
|
|
365
743
|
//# sourceMappingURL=index.native.mjs.map
|