@wallet-ui/react 1.0.0

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/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2024 Bram Borggreve (https://github.com/beeman)
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,14 @@
1
+ [![npm][npm-image]][npm-url]
2
+ [![npm-downloads][npm-downloads-image]][npm-url]
3
+ <br />
4
+ [![code-style-prettier][code-style-prettier-image]][code-style-prettier-url]
5
+
6
+ [code-style-prettier-image]: https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square
7
+ [code-style-prettier-url]: https://github.com/prettier/prettier
8
+ [npm-downloads-image]: https://img.shields.io/npm/dm/@wallet-ui/react/latest.svg?style=flat
9
+ [npm-image]: https://img.shields.io/npm/v/@wallet-ui/react/latest.svg?style=flat
10
+ [npm-url]: https://www.npmjs.com/package/@wallet-ui/react/v/latest
11
+
12
+ # @wallet-ui/react
13
+
14
+ This package contains example React code.
@@ -0,0 +1,238 @@
1
+ 'use strict';
2
+
3
+ var web3_js = require('@solana/web3.js');
4
+ var React4 = require('react');
5
+ var react = require('@wallet-standard/react');
6
+
7
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
8
+
9
+ var React4__default = /*#__PURE__*/_interopDefault(React4);
10
+
11
+ // src/solana-chain-context.tsx
12
+ var CHAIN_CONFIG_DEVNET = Object.freeze({
13
+ id: "solana:devnet",
14
+ label: "Devnet",
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);
33
+ }
34
+ function useLocalStorage(key, initialValue) {
35
+ const [storedValue, setStoredValue] = React4.useState(() => {
36
+ try {
37
+ if (typeof window === "undefined") {
38
+ return initialValue;
39
+ }
40
+ const item = window.localStorage.getItem(key);
41
+ if (key.includes("wallet") || key.includes("account")) {
42
+ return initialValue;
43
+ }
44
+ return item ? JSON.parse(item) : initialValue;
45
+ } catch (error) {
46
+ console.warn(`Error reading localStorage key "${key}":`, error);
47
+ return initialValue;
48
+ }
49
+ });
50
+ const setValue = React4.useCallback(
51
+ (value) => {
52
+ try {
53
+ const valueToStore = value instanceof Function ? value(storedValue) : value;
54
+ setStoredValue(valueToStore);
55
+ if (typeof window !== "undefined") {
56
+ if (valueToStore === void 0 || valueToStore === null) {
57
+ window.localStorage.removeItem(key);
58
+ } else {
59
+ window.localStorage.setItem(key, JSON.stringify(valueToStore));
60
+ }
61
+ }
62
+ } catch (error) {
63
+ console.warn(`Error setting localStorage key "${key}":`, error);
64
+ }
65
+ },
66
+ [key, storedValue]
67
+ );
68
+ return [storedValue, setValue];
69
+ }
70
+
71
+ // src/solana-chain-provider.tsx
72
+ var STORAGE_KEY = "placeholder:selected-chain";
73
+ function SolanaChainProvider({ chains, children }) {
74
+ const [chainId, setChainId] = useLocalStorage(STORAGE_KEY, "solana:devnet");
75
+ if (!chains.length) {
76
+ throw new Error("No chains provided");
77
+ }
78
+ const chain = React4.useMemo(() => {
79
+ for (const chain2 of chains) {
80
+ if (chain2.id === chainId) {
81
+ return chain2;
82
+ }
83
+ }
84
+ return chains[0];
85
+ }, [chainId, chains]);
86
+ return /* @__PURE__ */ React4__default.default.createElement(
87
+ SolanaChainContext.Provider,
88
+ {
89
+ value: React4.useMemo(
90
+ () => ({
91
+ chain,
92
+ chains,
93
+ setChain(chain2) {
94
+ localStorage.setItem(STORAGE_KEY, chain2);
95
+ setChainId(chain2);
96
+ }
97
+ }),
98
+ [chain, chains]
99
+ )
100
+ },
101
+ children
102
+ );
103
+ }
104
+ var SolanaRpcContext = React4.createContext({
105
+ rpc: web3_js.createSolanaRpc(web3_js.devnet("https://api.devnet.solana.com")),
106
+ rpcSubscriptions: web3_js.createSolanaRpcSubscriptions(web3_js.devnet("wss://api.devnet.solana.com"))
107
+ });
108
+ function useSolanaRpc() {
109
+ return React4.useContext(SolanaRpcContext);
110
+ }
111
+
112
+ // src/solana-rpc-provider.tsx
113
+ function SolanaRpcProvider({ children }) {
114
+ const { chain } = useSolanaChain();
115
+ return /* @__PURE__ */ React4__default.default.createElement(
116
+ SolanaRpcContext.Provider,
117
+ {
118
+ value: React4.useMemo(
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
+ );
130
+ }
131
+ var SolanaWalletContext = React4.createContext([
132
+ void 0,
133
+ function setSelectedWalletAccount() {
134
+ }
135
+ ]);
136
+ function useSolanaWallet() {
137
+ return React4.useContext(SolanaWalletContext);
138
+ }
139
+ function useSolanaWalletAddress() {
140
+ const [wallet] = useSolanaWallet();
141
+ if (!wallet?.address) {
142
+ return null;
143
+ }
144
+ return web3_js.address(wallet.address);
145
+ }
146
+
147
+ // src/solana-wallet-provider.tsx
148
+ var STORAGE_KEY2 = "placeholder:selected-wallet-and-address";
149
+ var wasSetterInvoked = false;
150
+ function getSavedWalletAccount(wallets, savedWalletNameAndAddress) {
151
+ if (wasSetterInvoked) {
152
+ return;
153
+ }
154
+ if (!savedWalletNameAndAddress || typeof savedWalletNameAndAddress !== "string") {
155
+ return;
156
+ }
157
+ const [savedWalletName, savedAccountAddress] = savedWalletNameAndAddress.split(":");
158
+ if (!savedWalletName || !savedAccountAddress) {
159
+ return;
160
+ }
161
+ for (const wallet of wallets) {
162
+ if (wallet.name === savedWalletName) {
163
+ for (const account of wallet.accounts) {
164
+ if (account.address === savedAccountAddress) {
165
+ return account;
166
+ }
167
+ }
168
+ }
169
+ }
170
+ }
171
+ function SolanaWalletProvider({ children }) {
172
+ const [storedKey, setStoredKey] = useLocalStorage(STORAGE_KEY2, null);
173
+ const wallets = react.useWallets();
174
+ const [selectedWalletAccount, setSelectedWalletAccountInternal] = React4.useState(
175
+ () => getSavedWalletAccount(wallets, storedKey)
176
+ );
177
+ const setSelectedWalletAccount2 = (setStateAction) => {
178
+ setSelectedWalletAccountInternal((prevSelectedWalletAccount) => {
179
+ wasSetterInvoked = true;
180
+ const nextWalletAccount = typeof setStateAction === "function" ? setStateAction(prevSelectedWalletAccount) : setStateAction;
181
+ const accountKey = nextWalletAccount ? react.getUiWalletAccountStorageKey(nextWalletAccount) : void 0;
182
+ if (accountKey) {
183
+ setStoredKey(accountKey);
184
+ } else {
185
+ setStoredKey(null);
186
+ }
187
+ return nextWalletAccount;
188
+ });
189
+ };
190
+ React4.useEffect(() => {
191
+ const savedWalletAccount = getSavedWalletAccount(wallets, storedKey);
192
+ if (savedWalletAccount) {
193
+ setSelectedWalletAccountInternal(savedWalletAccount);
194
+ }
195
+ }, [wallets]);
196
+ const walletAccount = React4.useMemo(() => {
197
+ if (selectedWalletAccount) {
198
+ for (const uiWallet of wallets) {
199
+ for (const uiWalletAccount of uiWallet.accounts) {
200
+ if (react.uiWalletAccountsAreSame(selectedWalletAccount, uiWalletAccount)) {
201
+ return uiWalletAccount;
202
+ }
203
+ }
204
+ if (react.uiWalletAccountBelongsToUiWallet(selectedWalletAccount, uiWallet) && uiWallet.accounts[0]) {
205
+ return uiWallet.accounts[0];
206
+ }
207
+ }
208
+ }
209
+ }, [selectedWalletAccount, wallets]);
210
+ React4.useEffect(() => {
211
+ if (selectedWalletAccount && !walletAccount) {
212
+ setSelectedWalletAccountInternal(void 0);
213
+ }
214
+ }, [selectedWalletAccount, walletAccount]);
215
+ return /* @__PURE__ */ React4__default.default.createElement(SolanaWalletContext.Provider, { value: React4.useMemo(() => [walletAccount, setSelectedWalletAccount2], [walletAccount]) }, children);
216
+ }
217
+
218
+ // src/solana-provider.tsx
219
+ function SolanaProvider({ chains, children }) {
220
+ return /* @__PURE__ */ React4__default.default.createElement(SolanaChainProvider, { chains }, /* @__PURE__ */ React4__default.default.createElement(SolanaRpcProvider, null, /* @__PURE__ */ React4__default.default.createElement(SolanaWalletProvider, null, children)));
221
+ }
222
+
223
+ exports.CHAIN_CONFIG_DEVNET = CHAIN_CONFIG_DEVNET;
224
+ exports.CHAIN_CONFIG_LOCAL = CHAIN_CONFIG_LOCAL;
225
+ exports.CHAIN_CONFIG_TESTNET = CHAIN_CONFIG_TESTNET;
226
+ exports.SolanaChainContext = SolanaChainContext;
227
+ exports.SolanaChainProvider = SolanaChainProvider;
228
+ exports.SolanaProvider = SolanaProvider;
229
+ exports.SolanaRpcContext = SolanaRpcContext;
230
+ exports.SolanaRpcProvider = SolanaRpcProvider;
231
+ exports.SolanaWalletContext = SolanaWalletContext;
232
+ exports.SolanaWalletProvider = SolanaWalletProvider;
233
+ exports.useSolanaChain = useSolanaChain;
234
+ exports.useSolanaRpc = useSolanaRpc;
235
+ exports.useSolanaWallet = useSolanaWallet;
236
+ exports.useSolanaWalletAddress = useSolanaWalletAddress;
237
+ //# sourceMappingURL=index.browser.cjs.map
238
+ //# sourceMappingURL=index.browser.cjs.map
@@ -0,0 +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"]}
@@ -0,0 +1,219 @@
1
+ import { devnet, testnet, createSolanaRpc, createSolanaRpcSubscriptions, address } from '@solana/web3.js';
2
+ import React4, { createContext, useContext, useMemo, useState, useEffect, useCallback } from 'react';
3
+ import { useWallets, uiWalletAccountsAreSame, uiWalletAccountBelongsToUiWallet, getUiWalletAccountStorageKey } from '@wallet-standard/react';
4
+
5
+ // src/solana-chain-context.tsx
6
+ var CHAIN_CONFIG_DEVNET = Object.freeze({
7
+ id: "solana:devnet",
8
+ label: "Devnet",
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);
27
+ }
28
+ function useLocalStorage(key, initialValue) {
29
+ const [storedValue, setStoredValue] = useState(() => {
30
+ try {
31
+ if (typeof window === "undefined") {
32
+ return initialValue;
33
+ }
34
+ const item = window.localStorage.getItem(key);
35
+ if (key.includes("wallet") || key.includes("account")) {
36
+ return initialValue;
37
+ }
38
+ return item ? JSON.parse(item) : initialValue;
39
+ } catch (error) {
40
+ console.warn(`Error reading localStorage key "${key}":`, error);
41
+ return initialValue;
42
+ }
43
+ });
44
+ const setValue = useCallback(
45
+ (value) => {
46
+ try {
47
+ const valueToStore = value instanceof Function ? value(storedValue) : value;
48
+ setStoredValue(valueToStore);
49
+ if (typeof window !== "undefined") {
50
+ if (valueToStore === void 0 || valueToStore === null) {
51
+ window.localStorage.removeItem(key);
52
+ } else {
53
+ window.localStorage.setItem(key, JSON.stringify(valueToStore));
54
+ }
55
+ }
56
+ } catch (error) {
57
+ console.warn(`Error setting localStorage key "${key}":`, error);
58
+ }
59
+ },
60
+ [key, storedValue]
61
+ );
62
+ return [storedValue, setValue];
63
+ }
64
+
65
+ // src/solana-chain-provider.tsx
66
+ var STORAGE_KEY = "placeholder:selected-chain";
67
+ function SolanaChainProvider({ chains, children }) {
68
+ const [chainId, setChainId] = useLocalStorage(STORAGE_KEY, "solana:devnet");
69
+ if (!chains.length) {
70
+ throw new Error("No chains provided");
71
+ }
72
+ const chain = useMemo(() => {
73
+ for (const chain2 of chains) {
74
+ if (chain2.id === chainId) {
75
+ return chain2;
76
+ }
77
+ }
78
+ return chains[0];
79
+ }, [chainId, chains]);
80
+ return /* @__PURE__ */ React4.createElement(
81
+ SolanaChainContext.Provider,
82
+ {
83
+ value: useMemo(
84
+ () => ({
85
+ chain,
86
+ chains,
87
+ setChain(chain2) {
88
+ localStorage.setItem(STORAGE_KEY, chain2);
89
+ setChainId(chain2);
90
+ }
91
+ }),
92
+ [chain, chains]
93
+ )
94
+ },
95
+ children
96
+ );
97
+ }
98
+ var SolanaRpcContext = createContext({
99
+ rpc: createSolanaRpc(devnet("https://api.devnet.solana.com")),
100
+ rpcSubscriptions: createSolanaRpcSubscriptions(devnet("wss://api.devnet.solana.com"))
101
+ });
102
+ function useSolanaRpc() {
103
+ return useContext(SolanaRpcContext);
104
+ }
105
+
106
+ // src/solana-rpc-provider.tsx
107
+ function SolanaRpcProvider({ children }) {
108
+ const { chain } = useSolanaChain();
109
+ return /* @__PURE__ */ React4.createElement(
110
+ SolanaRpcContext.Provider,
111
+ {
112
+ value: useMemo(
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
+ );
124
+ }
125
+ var SolanaWalletContext = createContext([
126
+ void 0,
127
+ function setSelectedWalletAccount() {
128
+ }
129
+ ]);
130
+ function useSolanaWallet() {
131
+ return useContext(SolanaWalletContext);
132
+ }
133
+ function useSolanaWalletAddress() {
134
+ const [wallet] = useSolanaWallet();
135
+ if (!wallet?.address) {
136
+ return null;
137
+ }
138
+ return address(wallet.address);
139
+ }
140
+
141
+ // src/solana-wallet-provider.tsx
142
+ var STORAGE_KEY2 = "placeholder:selected-wallet-and-address";
143
+ var wasSetterInvoked = false;
144
+ function getSavedWalletAccount(wallets, savedWalletNameAndAddress) {
145
+ if (wasSetterInvoked) {
146
+ return;
147
+ }
148
+ if (!savedWalletNameAndAddress || typeof savedWalletNameAndAddress !== "string") {
149
+ return;
150
+ }
151
+ const [savedWalletName, savedAccountAddress] = savedWalletNameAndAddress.split(":");
152
+ if (!savedWalletName || !savedAccountAddress) {
153
+ return;
154
+ }
155
+ for (const wallet of wallets) {
156
+ if (wallet.name === savedWalletName) {
157
+ for (const account of wallet.accounts) {
158
+ if (account.address === savedAccountAddress) {
159
+ return account;
160
+ }
161
+ }
162
+ }
163
+ }
164
+ }
165
+ function SolanaWalletProvider({ children }) {
166
+ const [storedKey, setStoredKey] = useLocalStorage(STORAGE_KEY2, null);
167
+ const wallets = useWallets();
168
+ const [selectedWalletAccount, setSelectedWalletAccountInternal] = useState(
169
+ () => getSavedWalletAccount(wallets, storedKey)
170
+ );
171
+ const setSelectedWalletAccount2 = (setStateAction) => {
172
+ setSelectedWalletAccountInternal((prevSelectedWalletAccount) => {
173
+ wasSetterInvoked = true;
174
+ const nextWalletAccount = typeof setStateAction === "function" ? setStateAction(prevSelectedWalletAccount) : setStateAction;
175
+ const accountKey = nextWalletAccount ? getUiWalletAccountStorageKey(nextWalletAccount) : void 0;
176
+ if (accountKey) {
177
+ setStoredKey(accountKey);
178
+ } else {
179
+ setStoredKey(null);
180
+ }
181
+ return nextWalletAccount;
182
+ });
183
+ };
184
+ useEffect(() => {
185
+ const savedWalletAccount = getSavedWalletAccount(wallets, storedKey);
186
+ if (savedWalletAccount) {
187
+ setSelectedWalletAccountInternal(savedWalletAccount);
188
+ }
189
+ }, [wallets]);
190
+ const walletAccount = useMemo(() => {
191
+ if (selectedWalletAccount) {
192
+ for (const uiWallet of wallets) {
193
+ for (const uiWalletAccount of uiWallet.accounts) {
194
+ if (uiWalletAccountsAreSame(selectedWalletAccount, uiWalletAccount)) {
195
+ return uiWalletAccount;
196
+ }
197
+ }
198
+ if (uiWalletAccountBelongsToUiWallet(selectedWalletAccount, uiWallet) && uiWallet.accounts[0]) {
199
+ return uiWallet.accounts[0];
200
+ }
201
+ }
202
+ }
203
+ }, [selectedWalletAccount, wallets]);
204
+ useEffect(() => {
205
+ if (selectedWalletAccount && !walletAccount) {
206
+ setSelectedWalletAccountInternal(void 0);
207
+ }
208
+ }, [selectedWalletAccount, walletAccount]);
209
+ return /* @__PURE__ */ React4.createElement(SolanaWalletContext.Provider, { value: useMemo(() => [walletAccount, setSelectedWalletAccount2], [walletAccount]) }, children);
210
+ }
211
+
212
+ // src/solana-provider.tsx
213
+ function SolanaProvider({ chains, children }) {
214
+ return /* @__PURE__ */ React4.createElement(SolanaChainProvider, { chains }, /* @__PURE__ */ React4.createElement(SolanaRpcProvider, null, /* @__PURE__ */ React4.createElement(SolanaWalletProvider, null, children)));
215
+ }
216
+
217
+ export { CHAIN_CONFIG_DEVNET, CHAIN_CONFIG_LOCAL, CHAIN_CONFIG_TESTNET, SolanaChainContext, SolanaChainProvider, SolanaProvider, SolanaRpcContext, SolanaRpcProvider, SolanaWalletContext, SolanaWalletProvider, useSolanaChain, useSolanaRpc, useSolanaWallet, useSolanaWalletAddress };
218
+ //# sourceMappingURL=index.browser.mjs.map
219
+ //# sourceMappingURL=index.browser.mjs.map
@@ -0,0 +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"]}