@wallet-ui/react 1.0.0 → 1.1.0-canary-20250302003059
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 +54 -78
- package/dist/index.browser.cjs.map +1 -1
- package/dist/index.browser.mjs +42 -69
- package/dist/index.browser.mjs.map +1 -1
- package/dist/index.native.mjs +42 -69
- package/dist/index.native.mjs.map +1 -1
- package/dist/index.node.cjs +54 -78
- package/dist/index.node.cjs.map +1 -1
- package/dist/index.node.mjs +42 -69
- package/dist/index.node.mjs.map +1 -1
- package/dist/types/index.d.ts +5 -4
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/solana-client-context.d.ts +3 -0
- package/dist/types/solana-client-context.d.ts.map +1 -0
- package/dist/types/solana-client-provider.d.ts +7 -0
- package/dist/types/solana-client-provider.d.ts.map +1 -0
- package/dist/types/solana-cluster-context.d.ts +17 -0
- package/dist/types/solana-cluster-context.d.ts.map +1 -0
- package/dist/types/solana-cluster-provider.d.ts +7 -0
- package/dist/types/solana-cluster-provider.d.ts.map +1 -0
- package/dist/types/solana-provider.d.ts +3 -3
- package/dist/types/solana-provider.d.ts.map +1 -1
- package/dist/types/solana-wallet-context.d.ts +1 -1
- package/dist/types/solana-wallet-context.d.ts.map +1 -1
- package/package.json +3 -3
- package/dist/types/solana-chain-context.d.ts +0 -20
- package/dist/types/solana-chain-context.d.ts.map +0 -1
- package/dist/types/solana-chain-provider.d.ts +0 -7
- package/dist/types/solana-chain-provider.d.ts.map +0 -1
- package/dist/types/solana-rpc-context.d.ts +0 -11
- package/dist/types/solana-rpc-context.d.ts.map +0 -1
- package/dist/types/solana-rpc-provider.d.ts +0 -7
- package/dist/types/solana-rpc-provider.d.ts.map +0 -1
package/dist/index.browser.cjs
CHANGED
|
@@ -1,35 +1,18 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var core = require('@wallet-ui/core');
|
|
4
4
|
var React4 = require('react');
|
|
5
|
+
var gill = require('gill');
|
|
5
6
|
var react = require('@wallet-standard/react');
|
|
6
7
|
|
|
7
8
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
8
9
|
|
|
9
10
|
var React4__default = /*#__PURE__*/_interopDefault(React4);
|
|
10
11
|
|
|
11
|
-
// src/
|
|
12
|
-
var
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
rpcSubscriptionsUrl: web3_js.devnet("wss://api.devnet.solana.com"),
|
|
16
|
-
rpcUrl: web3_js.devnet("https://api.devnet.solana.com")
|
|
17
|
-
});
|
|
18
|
-
var CHAIN_CONFIG_LOCAL = Object.freeze({
|
|
19
|
-
id: "solana:local",
|
|
20
|
-
label: "Local",
|
|
21
|
-
rpcSubscriptionsUrl: "ws://localhost:8900",
|
|
22
|
-
rpcUrl: "http://localhost:8899"
|
|
23
|
-
});
|
|
24
|
-
var CHAIN_CONFIG_TESTNET = Object.freeze({
|
|
25
|
-
id: "solana:testnet",
|
|
26
|
-
label: "Testnet",
|
|
27
|
-
rpcSubscriptionsUrl: web3_js.testnet("wss://api.testnet.solana.com"),
|
|
28
|
-
rpcUrl: web3_js.testnet("https://api.testnet.solana.com")
|
|
29
|
-
});
|
|
30
|
-
var SolanaChainContext = React4.createContext({});
|
|
31
|
-
function useSolanaChain() {
|
|
32
|
-
return React4.useContext(SolanaChainContext);
|
|
12
|
+
// src/index.ts
|
|
13
|
+
var SolanaClusterContext = React4.createContext({});
|
|
14
|
+
function useSolanaCluster() {
|
|
15
|
+
return React4.useContext(SolanaClusterContext);
|
|
33
16
|
}
|
|
34
17
|
function useLocalStorage(key, initialValue) {
|
|
35
18
|
const [storedValue, setStoredValue] = React4.useState(() => {
|
|
@@ -68,65 +51,51 @@ function useLocalStorage(key, initialValue) {
|
|
|
68
51
|
return [storedValue, setValue];
|
|
69
52
|
}
|
|
70
53
|
|
|
71
|
-
// src/solana-
|
|
72
|
-
var STORAGE_KEY = "placeholder:selected-
|
|
73
|
-
function
|
|
74
|
-
const [
|
|
75
|
-
if (!
|
|
76
|
-
throw new Error("No
|
|
54
|
+
// src/solana-cluster-provider.tsx
|
|
55
|
+
var STORAGE_KEY = "placeholder:selected-cluster";
|
|
56
|
+
function SolanaClusterProvider({ clusters, children }) {
|
|
57
|
+
const [clusterId, setClusterId] = useLocalStorage(STORAGE_KEY, "solana:devnet");
|
|
58
|
+
if (!clusters.length) {
|
|
59
|
+
throw new Error("No clusters provided");
|
|
77
60
|
}
|
|
78
|
-
const
|
|
79
|
-
for (const
|
|
80
|
-
if (
|
|
81
|
-
return
|
|
61
|
+
const cluster = React4.useMemo(() => {
|
|
62
|
+
for (const cluster2 of clusters) {
|
|
63
|
+
if (cluster2.id === clusterId) {
|
|
64
|
+
return cluster2;
|
|
82
65
|
}
|
|
83
66
|
}
|
|
84
|
-
return
|
|
85
|
-
}, [
|
|
67
|
+
return clusters[0];
|
|
68
|
+
}, [clusterId, clusters]);
|
|
86
69
|
return /* @__PURE__ */ React4__default.default.createElement(
|
|
87
|
-
|
|
70
|
+
SolanaClusterContext.Provider,
|
|
88
71
|
{
|
|
89
72
|
value: React4.useMemo(
|
|
90
73
|
() => ({
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
localStorage.setItem(STORAGE_KEY,
|
|
95
|
-
|
|
74
|
+
cluster,
|
|
75
|
+
clusters,
|
|
76
|
+
setCluster(cluster2) {
|
|
77
|
+
localStorage.setItem(STORAGE_KEY, cluster2);
|
|
78
|
+
setClusterId(cluster2);
|
|
96
79
|
}
|
|
97
80
|
}),
|
|
98
|
-
[
|
|
81
|
+
[cluster, clusters]
|
|
99
82
|
)
|
|
100
83
|
},
|
|
101
84
|
children
|
|
102
85
|
);
|
|
103
86
|
}
|
|
104
|
-
var
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
});
|
|
108
|
-
function useSolanaRpc() {
|
|
109
|
-
return React4.useContext(SolanaRpcContext);
|
|
87
|
+
var SolanaClientContext = React4.createContext({});
|
|
88
|
+
function useSolanaClient() {
|
|
89
|
+
return React4.useContext(SolanaClientContext);
|
|
110
90
|
}
|
|
111
91
|
|
|
112
|
-
// src/solana-
|
|
113
|
-
function
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
() => ({
|
|
120
|
-
rpc: web3_js.createSolanaRpc(chain.rpcUrl),
|
|
121
|
-
rpcSubscriptions: web3_js.createSolanaRpcSubscriptions(
|
|
122
|
-
chain.rpcSubscriptionsUrl ? chain.rpcSubscriptionsUrl : chain.rpcUrl.replace("https", "wss").replace("8899", "8900")
|
|
123
|
-
)
|
|
124
|
-
}),
|
|
125
|
-
[chain]
|
|
126
|
-
)
|
|
127
|
-
},
|
|
128
|
-
children
|
|
129
|
-
);
|
|
92
|
+
// src/solana-client-provider.tsx
|
|
93
|
+
function SolanaClientProvider({
|
|
94
|
+
children,
|
|
95
|
+
urlOrMoniker
|
|
96
|
+
}) {
|
|
97
|
+
const value = React4.useMemo(() => gill.createSolanaClient({ urlOrMoniker }), [urlOrMoniker]);
|
|
98
|
+
return /* @__PURE__ */ React4__default.default.createElement(SolanaClientContext.Provider, { value }, children);
|
|
130
99
|
}
|
|
131
100
|
var SolanaWalletContext = React4.createContext([
|
|
132
101
|
void 0,
|
|
@@ -141,7 +110,7 @@ function useSolanaWalletAddress() {
|
|
|
141
110
|
if (!wallet?.address) {
|
|
142
111
|
return null;
|
|
143
112
|
}
|
|
144
|
-
return
|
|
113
|
+
return gill.address(wallet.address);
|
|
145
114
|
}
|
|
146
115
|
|
|
147
116
|
// src/solana-wallet-provider.tsx
|
|
@@ -216,23 +185,30 @@ function SolanaWalletProvider({ children }) {
|
|
|
216
185
|
}
|
|
217
186
|
|
|
218
187
|
// src/solana-provider.tsx
|
|
219
|
-
function SolanaProvider({
|
|
220
|
-
return /* @__PURE__ */ React4__default.default.createElement(
|
|
188
|
+
function SolanaProvider({ clusters, children }) {
|
|
189
|
+
return /* @__PURE__ */ React4__default.default.createElement(SolanaClusterProvider, { clusters }, /* @__PURE__ */ React4__default.default.createElement(SolanaClientProviderLoader, null, /* @__PURE__ */ React4__default.default.createElement(SolanaWalletProvider, null, children)));
|
|
190
|
+
}
|
|
191
|
+
function SolanaClientProviderLoader({ children }) {
|
|
192
|
+
const { cluster } = useSolanaCluster();
|
|
193
|
+
return /* @__PURE__ */ React4__default.default.createElement(SolanaClientProvider, { urlOrMoniker: cluster.urlOrMoniker }, children);
|
|
221
194
|
}
|
|
222
195
|
|
|
223
|
-
exports.
|
|
224
|
-
exports.
|
|
225
|
-
exports.
|
|
226
|
-
exports.
|
|
227
|
-
exports.SolanaChainProvider = SolanaChainProvider;
|
|
196
|
+
exports.SolanaClientContext = SolanaClientContext;
|
|
197
|
+
exports.SolanaClientProvider = SolanaClientProvider;
|
|
198
|
+
exports.SolanaClusterContext = SolanaClusterContext;
|
|
199
|
+
exports.SolanaClusterProvider = SolanaClusterProvider;
|
|
228
200
|
exports.SolanaProvider = SolanaProvider;
|
|
229
|
-
exports.SolanaRpcContext = SolanaRpcContext;
|
|
230
|
-
exports.SolanaRpcProvider = SolanaRpcProvider;
|
|
231
201
|
exports.SolanaWalletContext = SolanaWalletContext;
|
|
232
202
|
exports.SolanaWalletProvider = SolanaWalletProvider;
|
|
233
|
-
exports.
|
|
234
|
-
exports.
|
|
203
|
+
exports.useSolanaClient = useSolanaClient;
|
|
204
|
+
exports.useSolanaCluster = useSolanaCluster;
|
|
235
205
|
exports.useSolanaWallet = useSolanaWallet;
|
|
236
206
|
exports.useSolanaWalletAddress = useSolanaWalletAddress;
|
|
207
|
+
Object.keys(core).forEach(function (k) {
|
|
208
|
+
if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
|
|
209
|
+
enumerable: true,
|
|
210
|
+
get: function () { return core[k]; }
|
|
211
|
+
});
|
|
212
|
+
});
|
|
237
213
|
//# sourceMappingURL=index.browser.cjs.map
|
|
238
214
|
//# sourceMappingURL=index.browser.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/solana-chain-context.tsx","../src/use-local-storage.ts","../src/solana-chain-provider.tsx","../src/solana-rpc-context.tsx","../src/solana-rpc-provider.tsx","../src/solana-wallet-context.tsx","../src/solana-wallet-provider.tsx","../src/solana-provider.tsx"],"names":["devnet","testnet","createContext","useContext","useState","useCallback","useMemo","chain","React","createSolanaRpc","createSolanaRpcSubscriptions","address","STORAGE_KEY","useWallets","setSelectedWalletAccount","getUiWalletAccountStorageKey","useEffect","uiWalletAccountsAreSame","uiWalletAccountBelongsToUiWallet"],"mappings":"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","file":"index.browser.cjs","sourcesContent":["import { devnet, testnet } from '@solana/web3.js';\nimport { SolanaChain } from '@wallet-ui/core';\nimport { createContext, useContext } from 'react';\n\nexport type SolanaChainContextProps = Readonly<{\n chain: SolanaChain;\n chains: SolanaChain[];\n setChain?(chain: `solana:${string}`): void;\n}>;\n\nexport const CHAIN_CONFIG_DEVNET: SolanaChain = Object.freeze({\n id: 'solana:devnet',\n label: 'Devnet',\n rpcSubscriptionsUrl: devnet('wss://api.devnet.solana.com'),\n rpcUrl: devnet('https://api.devnet.solana.com'),\n});\nexport const CHAIN_CONFIG_LOCAL: SolanaChain = Object.freeze({\n id: 'solana:local',\n label: 'Local',\n rpcSubscriptionsUrl: 'ws://localhost:8900',\n rpcUrl: 'http://localhost:8899',\n});\nexport const CHAIN_CONFIG_TESTNET: SolanaChain = Object.freeze({\n id: 'solana:testnet',\n label: 'Testnet',\n rpcSubscriptionsUrl: testnet('wss://api.testnet.solana.com'),\n rpcUrl: testnet('https://api.testnet.solana.com'),\n});\n\nexport const SolanaChainContext = createContext<SolanaChainContextProps>({} as SolanaChainContextProps);\n\nexport function useSolanaChain() {\n return useContext(SolanaChainContext);\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 { SolanaChain } from '@wallet-ui/core';\nimport React, { ReactNode, useMemo } from 'react';\n\nimport { SolanaChainContext } from './solana-chain-context';\nimport { useLocalStorage } from './use-local-storage';\n\nconst STORAGE_KEY = 'placeholder:selected-chain';\n\nexport function SolanaChainProvider({ chains, children }: { chains: SolanaChain[]; children: ReactNode }) {\n const [chainId, setChainId] = useLocalStorage(STORAGE_KEY, 'solana:devnet');\n\n if (!chains.length) {\n throw new Error('No chains provided');\n }\n\n const chain = useMemo<SolanaChain>(() => {\n for (const chain of chains) {\n if (chain.id === chainId) {\n return chain;\n }\n }\n return chains[0];\n }, [chainId, chains]);\n\n return (\n <SolanaChainContext.Provider\n value={useMemo(\n () => ({\n chain,\n chains,\n setChain(chain) {\n localStorage.setItem(STORAGE_KEY, chain);\n setChainId(chain);\n },\n }),\n [chain, chains],\n )}\n >\n {children}\n </SolanaChainContext.Provider>\n );\n}\n","import type { Rpc, RpcSubscriptions, SolanaRpcApiDevnet, SolanaRpcSubscriptionsApi } from '@solana/web3.js';\nimport { createSolanaRpc, createSolanaRpcSubscriptions, devnet } from '@solana/web3.js';\nimport { createContext, useContext } from 'react';\n\nexport type SolanaRpc = Rpc<SolanaRpcApiDevnet>;\n\nexport const SolanaRpcContext = createContext<{\n rpc: SolanaRpc; // Limit the API to only those methods found on Mainnet (ie. not `requestAirdrop`)\n rpcSubscriptions: RpcSubscriptions<SolanaRpcSubscriptionsApi>;\n}>({\n rpc: createSolanaRpc(devnet('https://api.devnet.solana.com')),\n rpcSubscriptions: createSolanaRpcSubscriptions(devnet('wss://api.devnet.solana.com')),\n});\n\nexport function useSolanaRpc() {\n return useContext(SolanaRpcContext);\n}\n","import { createSolanaRpc, createSolanaRpcSubscriptions } from '@solana/web3.js';\nimport React, { ReactNode, useMemo } from 'react';\n\nimport { useSolanaChain } from './solana-chain-context';\nimport { SolanaRpc, SolanaRpcContext } from './solana-rpc-context';\n\ntype Props = Readonly<{\n children: ReactNode;\n}>;\n\nexport function SolanaRpcProvider({ children }: Props) {\n const { chain } = useSolanaChain();\n\n return (\n <SolanaRpcContext.Provider\n value={useMemo(\n () => ({\n rpc: createSolanaRpc(chain.rpcUrl) as SolanaRpc,\n rpcSubscriptions: createSolanaRpcSubscriptions(\n chain.rpcSubscriptionsUrl\n ? chain.rpcSubscriptionsUrl\n : chain.rpcUrl.replace('https', 'wss').replace('8899', '8900'),\n ),\n }),\n [chain],\n )}\n >\n {children}\n </SolanaRpcContext.Provider>\n );\n}\n","import { address } from '@solana/web3.js';\nimport type { UiWalletAccount } from '@wallet-standard/react';\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 { SolanaChain } from '@wallet-ui/core';\nimport React, { ReactNode } from 'react';\n\nimport { SolanaChainProvider } from './solana-chain-provider';\nimport { SolanaRpcProvider } from './solana-rpc-provider';\nimport { SolanaWalletProvider } from './solana-wallet-provider';\n\nexport function SolanaProvider({ chains, children }: { chains: SolanaChain[]; children: ReactNode }) {\n return (\n <SolanaChainProvider chains={chains}>\n <SolanaRpcProvider>\n <SolanaWalletProvider>{children}</SolanaWalletProvider>\n </SolanaRpcProvider>\n </SolanaChainProvider>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/solana-cluster-context.tsx","../src/use-local-storage.ts","../src/solana-cluster-provider.tsx","../src/solana-client-context.tsx","../src/solana-client-provider.tsx","../src/solana-wallet-context.tsx","../src/solana-wallet-provider.tsx","../src/solana-provider.tsx"],"names":["createContext","useContext","useState","useCallback","useMemo","cluster","React","createSolanaClient","address","STORAGE_KEY","useWallets","setSelectedWalletAccount","getUiWalletAccountStorageKey","useEffect","uiWalletAccountsAreSame","uiWalletAccountBelongsToUiWallet"],"mappings":"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","file":"index.browser.cjs","sourcesContent":["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 { 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 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"]}
|
package/dist/index.browser.mjs
CHANGED
|
@@ -1,29 +1,12 @@
|
|
|
1
|
-
|
|
1
|
+
export * from '@wallet-ui/core';
|
|
2
2
|
import React4, { createContext, useContext, useMemo, useState, useEffect, useCallback } from 'react';
|
|
3
|
+
import { createSolanaClient, address } from 'gill';
|
|
3
4
|
import { useWallets, uiWalletAccountsAreSame, uiWalletAccountBelongsToUiWallet, getUiWalletAccountStorageKey } from '@wallet-standard/react';
|
|
4
5
|
|
|
5
|
-
// src/
|
|
6
|
-
var
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
rpcSubscriptionsUrl: devnet("wss://api.devnet.solana.com"),
|
|
10
|
-
rpcUrl: devnet("https://api.devnet.solana.com")
|
|
11
|
-
});
|
|
12
|
-
var CHAIN_CONFIG_LOCAL = Object.freeze({
|
|
13
|
-
id: "solana:local",
|
|
14
|
-
label: "Local",
|
|
15
|
-
rpcSubscriptionsUrl: "ws://localhost:8900",
|
|
16
|
-
rpcUrl: "http://localhost:8899"
|
|
17
|
-
});
|
|
18
|
-
var CHAIN_CONFIG_TESTNET = Object.freeze({
|
|
19
|
-
id: "solana:testnet",
|
|
20
|
-
label: "Testnet",
|
|
21
|
-
rpcSubscriptionsUrl: testnet("wss://api.testnet.solana.com"),
|
|
22
|
-
rpcUrl: testnet("https://api.testnet.solana.com")
|
|
23
|
-
});
|
|
24
|
-
var SolanaChainContext = createContext({});
|
|
25
|
-
function useSolanaChain() {
|
|
26
|
-
return useContext(SolanaChainContext);
|
|
6
|
+
// src/index.ts
|
|
7
|
+
var SolanaClusterContext = createContext({});
|
|
8
|
+
function useSolanaCluster() {
|
|
9
|
+
return useContext(SolanaClusterContext);
|
|
27
10
|
}
|
|
28
11
|
function useLocalStorage(key, initialValue) {
|
|
29
12
|
const [storedValue, setStoredValue] = useState(() => {
|
|
@@ -62,65 +45,51 @@ function useLocalStorage(key, initialValue) {
|
|
|
62
45
|
return [storedValue, setValue];
|
|
63
46
|
}
|
|
64
47
|
|
|
65
|
-
// src/solana-
|
|
66
|
-
var STORAGE_KEY = "placeholder:selected-
|
|
67
|
-
function
|
|
68
|
-
const [
|
|
69
|
-
if (!
|
|
70
|
-
throw new Error("No
|
|
48
|
+
// src/solana-cluster-provider.tsx
|
|
49
|
+
var STORAGE_KEY = "placeholder:selected-cluster";
|
|
50
|
+
function SolanaClusterProvider({ clusters, children }) {
|
|
51
|
+
const [clusterId, setClusterId] = useLocalStorage(STORAGE_KEY, "solana:devnet");
|
|
52
|
+
if (!clusters.length) {
|
|
53
|
+
throw new Error("No clusters provided");
|
|
71
54
|
}
|
|
72
|
-
const
|
|
73
|
-
for (const
|
|
74
|
-
if (
|
|
75
|
-
return
|
|
55
|
+
const cluster = useMemo(() => {
|
|
56
|
+
for (const cluster2 of clusters) {
|
|
57
|
+
if (cluster2.id === clusterId) {
|
|
58
|
+
return cluster2;
|
|
76
59
|
}
|
|
77
60
|
}
|
|
78
|
-
return
|
|
79
|
-
}, [
|
|
61
|
+
return clusters[0];
|
|
62
|
+
}, [clusterId, clusters]);
|
|
80
63
|
return /* @__PURE__ */ React4.createElement(
|
|
81
|
-
|
|
64
|
+
SolanaClusterContext.Provider,
|
|
82
65
|
{
|
|
83
66
|
value: useMemo(
|
|
84
67
|
() => ({
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
localStorage.setItem(STORAGE_KEY,
|
|
89
|
-
|
|
68
|
+
cluster,
|
|
69
|
+
clusters,
|
|
70
|
+
setCluster(cluster2) {
|
|
71
|
+
localStorage.setItem(STORAGE_KEY, cluster2);
|
|
72
|
+
setClusterId(cluster2);
|
|
90
73
|
}
|
|
91
74
|
}),
|
|
92
|
-
[
|
|
75
|
+
[cluster, clusters]
|
|
93
76
|
)
|
|
94
77
|
},
|
|
95
78
|
children
|
|
96
79
|
);
|
|
97
80
|
}
|
|
98
|
-
var
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
});
|
|
102
|
-
function useSolanaRpc() {
|
|
103
|
-
return useContext(SolanaRpcContext);
|
|
81
|
+
var SolanaClientContext = createContext({});
|
|
82
|
+
function useSolanaClient() {
|
|
83
|
+
return useContext(SolanaClientContext);
|
|
104
84
|
}
|
|
105
85
|
|
|
106
|
-
// src/solana-
|
|
107
|
-
function
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
() => ({
|
|
114
|
-
rpc: createSolanaRpc(chain.rpcUrl),
|
|
115
|
-
rpcSubscriptions: createSolanaRpcSubscriptions(
|
|
116
|
-
chain.rpcSubscriptionsUrl ? chain.rpcSubscriptionsUrl : chain.rpcUrl.replace("https", "wss").replace("8899", "8900")
|
|
117
|
-
)
|
|
118
|
-
}),
|
|
119
|
-
[chain]
|
|
120
|
-
)
|
|
121
|
-
},
|
|
122
|
-
children
|
|
123
|
-
);
|
|
86
|
+
// src/solana-client-provider.tsx
|
|
87
|
+
function SolanaClientProvider({
|
|
88
|
+
children,
|
|
89
|
+
urlOrMoniker
|
|
90
|
+
}) {
|
|
91
|
+
const value = useMemo(() => createSolanaClient({ urlOrMoniker }), [urlOrMoniker]);
|
|
92
|
+
return /* @__PURE__ */ React4.createElement(SolanaClientContext.Provider, { value }, children);
|
|
124
93
|
}
|
|
125
94
|
var SolanaWalletContext = createContext([
|
|
126
95
|
void 0,
|
|
@@ -210,10 +179,14 @@ function SolanaWalletProvider({ children }) {
|
|
|
210
179
|
}
|
|
211
180
|
|
|
212
181
|
// src/solana-provider.tsx
|
|
213
|
-
function SolanaProvider({
|
|
214
|
-
return /* @__PURE__ */ React4.createElement(
|
|
182
|
+
function SolanaProvider({ clusters, children }) {
|
|
183
|
+
return /* @__PURE__ */ React4.createElement(SolanaClusterProvider, { clusters }, /* @__PURE__ */ React4.createElement(SolanaClientProviderLoader, null, /* @__PURE__ */ React4.createElement(SolanaWalletProvider, null, children)));
|
|
184
|
+
}
|
|
185
|
+
function SolanaClientProviderLoader({ children }) {
|
|
186
|
+
const { cluster } = useSolanaCluster();
|
|
187
|
+
return /* @__PURE__ */ React4.createElement(SolanaClientProvider, { urlOrMoniker: cluster.urlOrMoniker }, children);
|
|
215
188
|
}
|
|
216
189
|
|
|
217
|
-
export {
|
|
190
|
+
export { SolanaClientContext, SolanaClientProvider, SolanaClusterContext, SolanaClusterProvider, SolanaProvider, SolanaWalletContext, SolanaWalletProvider, useSolanaClient, useSolanaCluster, useSolanaWallet, useSolanaWalletAddress };
|
|
218
191
|
//# sourceMappingURL=index.browser.mjs.map
|
|
219
192
|
//# sourceMappingURL=index.browser.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/solana-chain-context.tsx","../src/use-local-storage.ts","../src/solana-chain-provider.tsx","../src/solana-rpc-context.tsx","../src/solana-rpc-provider.tsx","../src/solana-wallet-context.tsx","../src/solana-wallet-provider.tsx","../src/solana-provider.tsx"],"names":["chain","React","createContext","devnet","useContext","useMemo","createSolanaRpc","createSolanaRpcSubscriptions","STORAGE_KEY","useState","setSelectedWalletAccount"],"mappings":"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","file":"index.browser.mjs","sourcesContent":["import { devnet, testnet } from '@solana/web3.js';\nimport { SolanaChain } from '@wallet-ui/core';\nimport { createContext, useContext } from 'react';\n\nexport type SolanaChainContextProps = Readonly<{\n chain: SolanaChain;\n chains: SolanaChain[];\n setChain?(chain: `solana:${string}`): void;\n}>;\n\nexport const CHAIN_CONFIG_DEVNET: SolanaChain = Object.freeze({\n id: 'solana:devnet',\n label: 'Devnet',\n rpcSubscriptionsUrl: devnet('wss://api.devnet.solana.com'),\n rpcUrl: devnet('https://api.devnet.solana.com'),\n});\nexport const CHAIN_CONFIG_LOCAL: SolanaChain = Object.freeze({\n id: 'solana:local',\n label: 'Local',\n rpcSubscriptionsUrl: 'ws://localhost:8900',\n rpcUrl: 'http://localhost:8899',\n});\nexport const CHAIN_CONFIG_TESTNET: SolanaChain = Object.freeze({\n id: 'solana:testnet',\n label: 'Testnet',\n rpcSubscriptionsUrl: testnet('wss://api.testnet.solana.com'),\n rpcUrl: testnet('https://api.testnet.solana.com'),\n});\n\nexport const SolanaChainContext = createContext<SolanaChainContextProps>({} as SolanaChainContextProps);\n\nexport function useSolanaChain() {\n return useContext(SolanaChainContext);\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 { SolanaChain } from '@wallet-ui/core';\nimport React, { ReactNode, useMemo } from 'react';\n\nimport { SolanaChainContext } from './solana-chain-context';\nimport { useLocalStorage } from './use-local-storage';\n\nconst STORAGE_KEY = 'placeholder:selected-chain';\n\nexport function SolanaChainProvider({ chains, children }: { chains: SolanaChain[]; children: ReactNode }) {\n const [chainId, setChainId] = useLocalStorage(STORAGE_KEY, 'solana:devnet');\n\n if (!chains.length) {\n throw new Error('No chains provided');\n }\n\n const chain = useMemo<SolanaChain>(() => {\n for (const chain of chains) {\n if (chain.id === chainId) {\n return chain;\n }\n }\n return chains[0];\n }, [chainId, chains]);\n\n return (\n <SolanaChainContext.Provider\n value={useMemo(\n () => ({\n chain,\n chains,\n setChain(chain) {\n localStorage.setItem(STORAGE_KEY, chain);\n setChainId(chain);\n },\n }),\n [chain, chains],\n )}\n >\n {children}\n </SolanaChainContext.Provider>\n );\n}\n","import type { Rpc, RpcSubscriptions, SolanaRpcApiDevnet, SolanaRpcSubscriptionsApi } from '@solana/web3.js';\nimport { createSolanaRpc, createSolanaRpcSubscriptions, devnet } from '@solana/web3.js';\nimport { createContext, useContext } from 'react';\n\nexport type SolanaRpc = Rpc<SolanaRpcApiDevnet>;\n\nexport const SolanaRpcContext = createContext<{\n rpc: SolanaRpc; // Limit the API to only those methods found on Mainnet (ie. not `requestAirdrop`)\n rpcSubscriptions: RpcSubscriptions<SolanaRpcSubscriptionsApi>;\n}>({\n rpc: createSolanaRpc(devnet('https://api.devnet.solana.com')),\n rpcSubscriptions: createSolanaRpcSubscriptions(devnet('wss://api.devnet.solana.com')),\n});\n\nexport function useSolanaRpc() {\n return useContext(SolanaRpcContext);\n}\n","import { createSolanaRpc, createSolanaRpcSubscriptions } from '@solana/web3.js';\nimport React, { ReactNode, useMemo } from 'react';\n\nimport { useSolanaChain } from './solana-chain-context';\nimport { SolanaRpc, SolanaRpcContext } from './solana-rpc-context';\n\ntype Props = Readonly<{\n children: ReactNode;\n}>;\n\nexport function SolanaRpcProvider({ children }: Props) {\n const { chain } = useSolanaChain();\n\n return (\n <SolanaRpcContext.Provider\n value={useMemo(\n () => ({\n rpc: createSolanaRpc(chain.rpcUrl) as SolanaRpc,\n rpcSubscriptions: createSolanaRpcSubscriptions(\n chain.rpcSubscriptionsUrl\n ? chain.rpcSubscriptionsUrl\n : chain.rpcUrl.replace('https', 'wss').replace('8899', '8900'),\n ),\n }),\n [chain],\n )}\n >\n {children}\n </SolanaRpcContext.Provider>\n );\n}\n","import { address } from '@solana/web3.js';\nimport type { UiWalletAccount } from '@wallet-standard/react';\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 { SolanaChain } from '@wallet-ui/core';\nimport React, { ReactNode } from 'react';\n\nimport { SolanaChainProvider } from './solana-chain-provider';\nimport { SolanaRpcProvider } from './solana-rpc-provider';\nimport { SolanaWalletProvider } from './solana-wallet-provider';\n\nexport function SolanaProvider({ chains, children }: { chains: SolanaChain[]; children: ReactNode }) {\n return (\n <SolanaChainProvider chains={chains}>\n <SolanaRpcProvider>\n <SolanaWalletProvider>{children}</SolanaWalletProvider>\n </SolanaRpcProvider>\n </SolanaChainProvider>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/solana-cluster-context.tsx","../src/use-local-storage.ts","../src/solana-cluster-provider.tsx","../src/solana-client-context.tsx","../src/solana-client-provider.tsx","../src/solana-wallet-context.tsx","../src/solana-wallet-provider.tsx","../src/solana-provider.tsx"],"names":["cluster","React","createContext","useContext","useMemo","STORAGE_KEY","useState","setSelectedWalletAccount"],"mappings":"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","file":"index.browser.mjs","sourcesContent":["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 { 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 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"]}
|