@wallet-ui/react 1.1.0-canary-20250302012806 → 1.1.0-canary-20250302034408

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,15 +1,26 @@
1
1
  'use strict';
2
2
 
3
- var core = require('@wallet-ui/core');
4
3
  var React4 = require('react');
5
4
  var gill = require('gill');
6
5
  var react = require('@wallet-standard/react');
6
+ var core = require('@wallet-ui/core');
7
7
 
8
8
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
9
9
 
10
10
  var React4__default = /*#__PURE__*/_interopDefault(React4);
11
11
 
12
- // src/index.ts
12
+ // src/solana-client-context.tsx
13
+ var SolanaClientContext = React4.createContext({});
14
+ function useSolanaClient() {
15
+ return React4.useContext(SolanaClientContext);
16
+ }
17
+ function SolanaClientProvider({
18
+ children,
19
+ urlOrMoniker
20
+ }) {
21
+ const value = React4.useMemo(() => gill.createSolanaClient({ urlOrMoniker }), [urlOrMoniker]);
22
+ return /* @__PURE__ */ React4__default.default.createElement(SolanaClientContext.Provider, { value }, children);
23
+ }
13
24
  var SolanaClusterContext = React4.createContext({});
14
25
  function useSolanaCluster() {
15
26
  return React4.useContext(SolanaClusterContext);
@@ -84,19 +95,6 @@ function SolanaClusterProvider({ clusters, children }) {
84
95
  children
85
96
  );
86
97
  }
87
- var SolanaClientContext = React4.createContext({});
88
- function useSolanaClient() {
89
- return React4.useContext(SolanaClientContext);
90
- }
91
-
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);
99
- }
100
98
  var SolanaWalletContext = React4.createContext([
101
99
  void 0,
102
100
  function setSelectedWalletAccount() {
@@ -204,6 +202,12 @@ exports.useSolanaClient = useSolanaClient;
204
202
  exports.useSolanaCluster = useSolanaCluster;
205
203
  exports.useSolanaWallet = useSolanaWallet;
206
204
  exports.useSolanaWalletAddress = useSolanaWalletAddress;
205
+ Object.keys(react).forEach(function (k) {
206
+ if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
207
+ enumerable: true,
208
+ get: function () { return react[k]; }
209
+ });
210
+ });
207
211
  Object.keys(core).forEach(function (k) {
208
212
  if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
209
213
  enumerable: true,
@@ -1 +1 @@
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":";;;;;;;;;;;;AASa,IAAA,oBAAA,GAAuBA,oBAAyC,CAAA,EAA+B;AAErG,SAAS,gBAAmB,GAAA;AAC/B,EAAA,OAAOC,kBAAW,oBAAoB,CAAA;AAC1C;ACXO,SAAS,eAAA,CAAmB,KAAa,YAAiB,EAAA;AAE7D,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIC,gBAAY,MAAM;AACpD,IAAI,IAAA;AAEA,MAAI,IAAA,OAAO,WAAW,WAAa,EAAA;AAC/B,QAAO,OAAA,YAAA;AAAA;AAGX,MAAA,MAAM,IAAO,GAAA,MAAA,CAAO,YAAa,CAAA,OAAA,CAAQ,GAAG,CAAA;AAE5C,MAAA,IAAI,IAAI,QAAS,CAAA,QAAQ,KAAK,GAAI,CAAA,QAAA,CAAS,SAAS,CAAG,EAAA;AAEnD,QAAO,OAAA,YAAA;AAAA;AAEX,MAAA,OAAO,IAAO,GAAA,IAAA,CAAK,KAAM,CAAA,IAAI,CAAI,GAAA,YAAA;AAAA,aAC5B,KAAO,EAAA;AACZ,MAAA,OAAA,CAAQ,IAAK,CAAA,CAAA,gCAAA,EAAmC,GAAG,CAAA,EAAA,CAAA,EAAM,KAAK,CAAA;AAC9D,MAAO,OAAA,YAAA;AAAA;AACX,GACH,CAAA;AAGD,EAAA,MAAM,QAAW,GAAAC,kBAAA;AAAA,IACb,CAAC,KAA+B,KAAA;AAC5B,MAAI,IAAA;AAEA,QAAA,MAAM,YAAe,GAAA,KAAA,YAAiB,QAAW,GAAA,KAAA,CAAM,WAAW,CAAI,GAAA,KAAA;AAGtE,QAAA,cAAA,CAAe,YAAY,CAAA;AAG3B,QAAI,IAAA,OAAO,WAAW,WAAa,EAAA;AAC/B,UAAI,IAAA,YAAA,KAAiB,KAAa,CAAA,IAAA,YAAA,KAAiB,IAAM,EAAA;AACrD,YAAO,MAAA,CAAA,YAAA,CAAa,WAAW,GAAG,CAAA;AAAA,WAC/B,MAAA;AACH,YAAA,MAAA,CAAO,aAAa,OAAQ,CAAA,GAAA,EAAK,IAAK,CAAA,SAAA,CAAU,YAAY,CAAC,CAAA;AAAA;AACjE;AACJ,eACK,KAAO,EAAA;AACZ,QAAA,OAAA,CAAQ,IAAK,CAAA,CAAA,gCAAA,EAAmC,GAAG,CAAA,EAAA,CAAA,EAAM,KAAK,CAAA;AAAA;AAClE,KACJ;AAAA,IACA,CAAC,KAAK,WAAW;AAAA,GACrB;AAEA,EAAO,OAAA,CAAC,aAAa,QAAQ,CAAA;AACjC;;;AC5CA,IAAM,WAAc,GAAA,8BAAA;AAEb,SAAS,qBAAsB,CAAA,EAAE,QAAU,EAAA,QAAA,EAAiE,EAAA;AAC/G,EAAA,MAAM,CAAC,SAAW,EAAA,YAAY,CAAI,GAAA,eAAA,CAAgB,aAAa,eAAe,CAAA;AAE9E,EAAI,IAAA,CAAC,SAAS,MAAQ,EAAA;AAClB,IAAM,MAAA,IAAI,MAAM,sBAAsB,CAAA;AAAA;AAG1C,EAAM,MAAA,OAAA,GAAUC,eAAuB,MAAM;AACzC,IAAA,KAAA,MAAWC,YAAW,QAAU,EAAA;AAC5B,MAAIA,IAAAA,QAAAA,CAAQ,OAAO,SAAW,EAAA;AAC1B,QAAOA,OAAAA,QAAAA;AAAA;AACX;AAEJ,IAAA,OAAO,SAAS,CAAC,CAAA;AAAA,GAClB,EAAA,CAAC,SAAW,EAAA,QAAQ,CAAC,CAAA;AAExB,EACI,uBAAAC,uBAAA,CAAA,aAAA;AAAA,IAAC,oBAAqB,CAAA,QAAA;AAAA,IAArB;AAAA,MACG,KAAO,EAAAF,cAAA;AAAA,QACH,OAAO;AAAA,UACH,OAAA;AAAA,UACA,QAAA;AAAA,UACA,WAAWC,QAAS,EAAA;AAChB,YAAa,YAAA,CAAA,OAAA,CAAQ,aAAaA,QAAO,CAAA;AACzC,YAAA,YAAA,CAAaA,QAAO,CAAA;AAAA;AACxB,SACJ,CAAA;AAAA,QACA,CAAC,SAAS,QAAQ;AAAA;AACtB,KAAA;AAAA,IAEC;AAAA,GACL;AAER;ACtCa,IAAA,mBAAA,GAAsBL,oBAA4B,CAAA,EAAkB;AAE1E,SAAS,eAAkB,GAAA;AAC9B,EAAA,OAAOC,kBAAW,mBAAmB,CAAA;AACzC;;;ACDO,SAAS,oBAAqB,CAAA;AAAA,EACjC,QAAA;AAAA,EACA;AACJ,CAGG,EAAA;AACC,EAAM,MAAA,KAAA,GAAQG,cAAQ,CAAA,MAAMG,uBAAmB,CAAA,EAAE,cAAc,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEhF,EAAA,uBAAOD,uBAAA,CAAA,aAAA,CAAC,oBAAoB,QAApB,EAAA,EAA6B,SAAe,QAAS,CAAA;AACjE;ACVO,IAAM,sBAAsBN,oBAKjC,CAAA;AAAA,EACE,MAAA;AAAA,EACA,SAAS,wBAA2B,GAAA;AAAA;AAGxC,CAAC;AAEM,SAAS,eAAkB,GAAA;AAC9B,EAAA,OAAOC,kBAAW,mBAAmB,CAAA;AACzC;AAEO,SAAS,sBAAyB,GAAA;AACrC,EAAM,MAAA,CAAC,MAAM,CAAA,GAAI,eAAgB,EAAA;AACjC,EAAI,IAAA,CAAC,QAAQ,OAAS,EAAA;AAClB,IAAO,OAAA,IAAA;AAAA;AAEX,EAAO,OAAAO,YAAA,CAAQ,OAAO,OAAO,CAAA;AACjC;;;AChBA,IAAMC,YAAc,GAAA,yCAAA;AAEpB,IAAI,gBAAmB,GAAA,KAAA;AAEvB,SAAS,qBAAA,CAAsB,SAA8B,yBAA0C,EAAA;AACnG,EAAA,IAAI,gBAAkB,EAAA;AAGlB,IAAA;AAAA;AAEJ,EAAA,IAAI,CAAC,yBAAA,IAA6B,OAAO,yBAAA,KAA8B,QAAU,EAAA;AAC7E,IAAA;AAAA;AAEJ,EAAA,MAAM,CAAC,eAAiB,EAAA,mBAAmB,CAAI,GAAA,yBAAA,CAA0B,MAAM,GAAG,CAAA;AAClF,EAAI,IAAA,CAAC,eAAmB,IAAA,CAAC,mBAAqB,EAAA;AAC1C,IAAA;AAAA;AAEJ,EAAA,KAAA,MAAW,UAAU,OAAS,EAAA;AAC1B,IAAI,IAAA,MAAA,CAAO,SAAS,eAAiB,EAAA;AACjC,MAAW,KAAA,MAAA,OAAA,IAAW,OAAO,QAAU,EAAA;AACnC,QAAI,IAAA,OAAA,CAAQ,YAAY,mBAAqB,EAAA;AACzC,UAAO,OAAA,OAAA;AAAA;AACX;AACJ;AACJ;AAER;AAOO,SAAS,oBAAA,CAAqB,EAAE,QAAA,EAAqC,EAAA;AACxE,EAAA,MAAM,CAAC,SAAW,EAAA,YAAY,CAAI,GAAA,eAAA,CAA+BA,cAAa,IAAI,CAAA;AAClF,EAAA,MAAM,UAAUC,gBAAW,EAAA;AAC3B,EAAM,MAAA,CAAC,qBAAuB,EAAA,gCAAgC,CAAIR,GAAAA,eAAAA;AAAA,IAAqC,MACnG,qBAAsB,CAAA,OAAA,EAAS,SAAS;AAAA,GAC5C;AACA,EAAA,MAAMS,4BAAiF,CAAkB,cAAA,KAAA;AACrG,IAAA,gCAAA,CAAiC,CAA6B,yBAAA,KAAA;AAC1D,MAAmB,gBAAA,GAAA,IAAA;AACnB,MAAA,MAAM,oBACF,OAAO,cAAA,KAAmB,UAAa,GAAA,cAAA,CAAe,yBAAyB,CAAI,GAAA,cAAA;AACvF,MAAA,MAAM,UAAa,GAAA,iBAAA,GAAoBC,kCAA6B,CAAA,iBAAiB,CAAI,GAAA,MAAA;AACzF,MAAA,IAAI,UAAY,EAAA;AACZ,QAAA,YAAA,CAAa,UAAU,CAAA;AAAA,OACpB,MAAA;AACH,QAAA,YAAA,CAAa,IAAI,CAAA;AAAA;AAErB,MAAO,OAAA,iBAAA;AAAA,KACV,CAAA;AAAA,GACL;AACA,EAAAC,gBAAA,CAAU,MAAM;AACZ,IAAM,MAAA,kBAAA,GAAqB,qBAAsB,CAAA,OAAA,EAAS,SAAS,CAAA;AACnE,IAAA,IAAI,kBAAoB,EAAA;AACpB,MAAA,gCAAA,CAAiC,kBAAkB,CAAA;AAAA;AACvD,GACJ,EAAG,CAAC,OAAO,CAAC,CAAA;AACZ,EAAM,MAAA,aAAA,GAAgBT,eAAQ,MAAM;AAChC,IAAA,IAAI,qBAAuB,EAAA;AACvB,MAAA,KAAA,MAAW,YAAY,OAAS,EAAA;AAC5B,QAAW,KAAA,MAAA,eAAA,IAAmB,SAAS,QAAU,EAAA;AAC7C,UAAI,IAAAU,6BAAA,CAAwB,qBAAuB,EAAA,eAAe,CAAG,EAAA;AACjE,YAAO,OAAA,eAAA;AAAA;AACX;AAEJ,QAAA,IAAIC,uCAAiC,qBAAuB,EAAA,QAAQ,KAAK,QAAS,CAAA,QAAA,CAAS,CAAC,CAAG,EAAA;AAG3F,UAAO,OAAA,QAAA,CAAS,SAAS,CAAC,CAAA;AAAA;AAC9B;AACJ;AACJ,GACD,EAAA,CAAC,qBAAuB,EAAA,OAAO,CAAC,CAAA;AACnC,EAAAF,gBAAA,CAAU,MAAM;AAGZ,IAAI,IAAA,qBAAA,IAAyB,CAAC,aAAe,EAAA;AACzC,MAAA,gCAAA,CAAiC,MAAS,CAAA;AAAA;AAC9C,GACD,EAAA,CAAC,qBAAuB,EAAA,aAAa,CAAC,CAAA;AACzC,EAAA,uBACIP,uBAAA,CAAA,aAAA,CAAC,mBAAoB,CAAA,QAAA,EAApB,EAA6B,KAAOF,EAAAA,cAAAA,CAAQ,MAAM,CAAC,eAAeO,yBAAwB,CAAA,EAAG,CAAC,aAAa,CAAC,KACxG,QACL,CAAA;AAER;;;AC3FO,SAAS,cAAe,CAAA,EAAE,QAAU,EAAA,QAAA,EAAgE,EAAA;AACvG,EAAA,uBACIL,uBAAAA,CAAA,aAAC,CAAA,qBAAA,EAAA,EAAsB,4BACnBA,uBAAAA,CAAA,aAAC,CAAA,0BAAA,EAAA,IAAA,kBACGA,uBAAA,CAAA,aAAA,CAAC,oBAAsB,EAAA,IAAA,EAAA,QAAS,CACpC,CACJ,CAAA;AAER;AAEA,SAAS,0BAAA,CAA2B,EAAE,QAAA,EAAqC,EAAA;AACvE,EAAM,MAAA,EAAE,OAAQ,EAAA,GAAI,gBAAiB,EAAA;AAErC,EAAA,uBAAOA,uBAAA,CAAA,aAAA,CAAC,wBAAqB,YAAc,EAAA,OAAA,CAAQ,gBAAe,QAAS,CAAA;AAC/E","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"]}
1
+ {"version":3,"sources":["../src/solana-client-context.tsx","../src/solana-client-provider.tsx","../src/solana-cluster-context.tsx","../src/use-local-storage.ts","../src/solana-cluster-provider.tsx","../src/solana-wallet-context.tsx","../src/solana-wallet-provider.tsx","../src/solana-provider.tsx"],"names":["createContext","useContext","useMemo","createSolanaClient","React","useState","useCallback","cluster","address","STORAGE_KEY","useWallets","setSelectedWalletAccount","getUiWalletAccountStorageKey","useEffect","uiWalletAccountsAreSame","uiWalletAccountBelongsToUiWallet"],"mappings":"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","file":"index.browser.cjs","sourcesContent":["import { SolanaClient } from '@wallet-ui/core';\nimport { createContext, useContext } from 'react';\n\nexport const SolanaClientContext = createContext<SolanaClient>({} as SolanaClient);\n\nexport function useSolanaClient() {\n return useContext(SolanaClientContext);\n}\n","import { SolanaClientUrlOrMoniker } from '@wallet-ui/core';\nimport { createSolanaClient } from 'gill';\nimport React, { ReactNode, useMemo } from 'react';\n\nimport { SolanaClientContext } from './solana-client-context';\n\nexport function SolanaClientProvider({\n children,\n urlOrMoniker,\n}: {\n children: ReactNode;\n urlOrMoniker: SolanaClientUrlOrMoniker;\n}) {\n const value = useMemo(() => createSolanaClient({ urlOrMoniker }), [urlOrMoniker]);\n\n return <SolanaClientContext.Provider value={value}>{children}</SolanaClientContext.Provider>;\n}\n","import { SolanaCluster } from '@wallet-ui/core';\nimport { createContext, useContext } from 'react';\n\nexport type SolanaClusterContextProps = Readonly<{\n cluster: SolanaCluster;\n clusters: SolanaCluster[];\n setCluster?(cluster: `solana:${string}`): void;\n}>;\n\nexport const SolanaClusterContext = createContext<SolanaClusterContextProps>({} as SolanaClusterContextProps);\n\nexport function useSolanaCluster() {\n return useContext(SolanaClusterContext);\n}\n","import { useCallback, useState } from 'react';\n\nexport function useLocalStorage<T>(key: string, initialValue: T) {\n // State to store our value\n const [storedValue, setStoredValue] = useState<T>(() => {\n try {\n // Check if we're on the client side\n if (typeof window === 'undefined') {\n return initialValue;\n }\n\n const item = window.localStorage.getItem(key);\n // For wallet-related data, validate the stored value\n if (key.includes('wallet') || key.includes('account')) {\n // Return initial value if stored data might be stale\n return initialValue;\n }\n return item ? JSON.parse(item) : initialValue;\n } catch (error) {\n console.warn(`Error reading localStorage key \"${key}\":`, error);\n return initialValue;\n }\n });\n\n // Return a wrapped version of useState's setter function that persists the new value to localStorage\n const setValue = useCallback(\n (value: T | ((val: T) => T)) => {\n try {\n // Allow value to be a function so we have same API as useState\n const valueToStore = value instanceof Function ? value(storedValue) : value;\n\n // Save state\n setStoredValue(valueToStore);\n\n // Save to localStorage\n if (typeof window !== 'undefined') {\n if (valueToStore === undefined || valueToStore === null) {\n window.localStorage.removeItem(key);\n } else {\n window.localStorage.setItem(key, JSON.stringify(valueToStore));\n }\n }\n } catch (error) {\n console.warn(`Error setting localStorage key \"${key}\":`, error);\n }\n },\n [key, storedValue],\n );\n\n return [storedValue, setValue] as const;\n}\n","import { SolanaCluster } from '@wallet-ui/core';\nimport React, { ReactNode, useMemo } from 'react';\n\nimport { SolanaClusterContext } from './solana-cluster-context';\nimport { useLocalStorage } from './use-local-storage';\n\nconst STORAGE_KEY = 'placeholder:selected-cluster';\n\nexport function SolanaClusterProvider({ clusters, children }: { children: ReactNode, clusters: SolanaCluster[]; }) {\n const [clusterId, setClusterId] = useLocalStorage(STORAGE_KEY, 'solana:devnet');\n\n if (!clusters.length) {\n throw new Error('No clusters provided');\n }\n\n const cluster = useMemo<SolanaCluster>(() => {\n for (const cluster of clusters) {\n if (cluster.id === clusterId) {\n return cluster;\n }\n }\n return clusters[0];\n }, [clusterId, clusters]);\n\n return (\n <SolanaClusterContext.Provider\n value={useMemo(\n () => ({\n cluster,\n clusters,\n setCluster(cluster) {\n localStorage.setItem(STORAGE_KEY, cluster);\n setClusterId(cluster);\n },\n }),\n [cluster, clusters],\n )}\n >\n {children}\n </SolanaClusterContext.Provider>\n );\n}\n","import type { UiWalletAccount } from '@wallet-standard/react';\nimport { address } from 'gill';\nimport { createContext, Dispatch, SetStateAction, useContext } from 'react';\n\nexport type SelectedWalletAccountState = UiWalletAccount | undefined;\n\nexport const SolanaWalletContext = createContext<\n readonly [\n selectedWalletAccount: SelectedWalletAccountState,\n setSelectedWalletAccount: Dispatch<SetStateAction<SelectedWalletAccountState>>,\n ]\n>([\n undefined /* selectedWalletAccount */,\n function setSelectedWalletAccount() {\n /* empty */\n },\n]);\n\nexport function useSolanaWallet() {\n return useContext(SolanaWalletContext);\n}\n\nexport function useSolanaWalletAddress() {\n const [wallet] = useSolanaWallet();\n if (!wallet?.address) {\n return null;\n }\n return address(wallet.address);\n}\n","import {\n getUiWalletAccountStorageKey,\n UiWallet,\n uiWalletAccountBelongsToUiWallet,\n uiWalletAccountsAreSame,\n useWallets,\n} from '@wallet-standard/react';\nimport React, { Dispatch, ReactNode, SetStateAction, useEffect, useMemo, useState } from 'react';\n\nimport { SelectedWalletAccountState, SolanaWalletContext } from './solana-wallet-context';\nimport { useLocalStorage } from './use-local-storage';\n\nconst STORAGE_KEY = 'placeholder:selected-wallet-and-address';\n\nlet wasSetterInvoked = false;\n\nfunction getSavedWalletAccount(wallets: readonly UiWallet[], savedWalletNameAndAddress: string | null) {\n if (wasSetterInvoked) {\n // After the user makes an explicit choice of wallet, stop trying to auto-select the\n // saved wallet, if and when it appears.\n return;\n }\n if (!savedWalletNameAndAddress || typeof savedWalletNameAndAddress !== 'string') {\n return;\n }\n const [savedWalletName, savedAccountAddress] = savedWalletNameAndAddress.split(':');\n if (!savedWalletName || !savedAccountAddress) {\n return;\n }\n for (const wallet of wallets) {\n if (wallet.name === savedWalletName) {\n for (const account of wallet.accounts) {\n if (account.address === savedAccountAddress) {\n return account;\n }\n }\n }\n }\n}\n\n/**\n * Saves the selected wallet account's storage key to the browser's local storage. In future\n * sessions it will try to return that same wallet account, or at least one from the same brand of\n * wallet if the wallet from which it came is still in the Wallet Standard registry.\n */\nexport function SolanaWalletProvider({ children }: { children: ReactNode }) {\n const [storedKey, setStoredKey] = useLocalStorage<string | null>(STORAGE_KEY, null);\n const wallets = useWallets();\n const [selectedWalletAccount, setSelectedWalletAccountInternal] = useState<SelectedWalletAccountState>(() =>\n getSavedWalletAccount(wallets, storedKey),\n );\n const setSelectedWalletAccount: Dispatch<SetStateAction<SelectedWalletAccountState>> = setStateAction => {\n setSelectedWalletAccountInternal(prevSelectedWalletAccount => {\n wasSetterInvoked = true;\n const nextWalletAccount =\n typeof setStateAction === 'function' ? setStateAction(prevSelectedWalletAccount) : setStateAction;\n const accountKey = nextWalletAccount ? getUiWalletAccountStorageKey(nextWalletAccount) : undefined;\n if (accountKey) {\n setStoredKey(accountKey);\n } else {\n setStoredKey(null);\n }\n return nextWalletAccount;\n });\n };\n useEffect(() => {\n const savedWalletAccount = getSavedWalletAccount(wallets, storedKey);\n if (savedWalletAccount) {\n setSelectedWalletAccountInternal(savedWalletAccount);\n }\n }, [wallets]);\n const walletAccount = useMemo(() => {\n if (selectedWalletAccount) {\n for (const uiWallet of wallets) {\n for (const uiWalletAccount of uiWallet.accounts) {\n if (uiWalletAccountsAreSame(selectedWalletAccount, uiWalletAccount)) {\n return uiWalletAccount;\n }\n }\n if (uiWalletAccountBelongsToUiWallet(selectedWalletAccount, uiWallet) && uiWallet.accounts[0]) {\n // If the selected account belongs to this connected wallet, at least, then\n // select one of its accounts.\n return uiWallet.accounts[0];\n }\n }\n }\n }, [selectedWalletAccount, wallets]);\n useEffect(() => {\n // If there is a selected wallet account but the wallet to which it belongs has since\n // disconnected, clear the selected wallet.\n if (selectedWalletAccount && !walletAccount) {\n setSelectedWalletAccountInternal(undefined);\n }\n }, [selectedWalletAccount, walletAccount]);\n return (\n <SolanaWalletContext.Provider value={useMemo(() => [walletAccount, setSelectedWalletAccount], [walletAccount])}>\n {children}\n </SolanaWalletContext.Provider>\n );\n}\n","import { SolanaCluster } from '@wallet-ui/core';\nimport React, { ReactNode } from 'react';\n\nimport { SolanaClientProvider } from './solana-client-provider';\nimport { useSolanaCluster } from './solana-cluster-context';\nimport { SolanaClusterProvider } from './solana-cluster-provider';\nimport { SolanaWalletProvider } from './solana-wallet-provider';\n\nexport function SolanaProvider({ clusters, children }: { children: ReactNode; clusters: SolanaCluster[] }) {\n return (\n <SolanaClusterProvider clusters={clusters}>\n <SolanaClientProviderLoader>\n <SolanaWalletProvider>{children}</SolanaWalletProvider>\n </SolanaClientProviderLoader>\n </SolanaClusterProvider>\n );\n}\n\nfunction SolanaClientProviderLoader({ children }: { children: ReactNode }) {\n const { cluster } = useSolanaCluster();\n\n return <SolanaClientProvider urlOrMoniker={cluster.urlOrMoniker}>{children}</SolanaClientProvider>;\n}\n"]}
@@ -1,9 +1,21 @@
1
- export * from '@wallet-ui/core';
2
1
  import React4, { createContext, useContext, useMemo, useState, useEffect, useCallback } from 'react';
3
2
  import { createSolanaClient, address } from 'gill';
4
3
  import { useWallets, uiWalletAccountsAreSame, uiWalletAccountBelongsToUiWallet, getUiWalletAccountStorageKey } from '@wallet-standard/react';
4
+ export * from '@wallet-standard/react';
5
+ export * from '@wallet-ui/core';
5
6
 
6
- // src/index.ts
7
+ // src/solana-client-context.tsx
8
+ var SolanaClientContext = createContext({});
9
+ function useSolanaClient() {
10
+ return useContext(SolanaClientContext);
11
+ }
12
+ function SolanaClientProvider({
13
+ children,
14
+ urlOrMoniker
15
+ }) {
16
+ const value = useMemo(() => createSolanaClient({ urlOrMoniker }), [urlOrMoniker]);
17
+ return /* @__PURE__ */ React4.createElement(SolanaClientContext.Provider, { value }, children);
18
+ }
7
19
  var SolanaClusterContext = createContext({});
8
20
  function useSolanaCluster() {
9
21
  return useContext(SolanaClusterContext);
@@ -78,19 +90,6 @@ function SolanaClusterProvider({ clusters, children }) {
78
90
  children
79
91
  );
80
92
  }
81
- var SolanaClientContext = createContext({});
82
- function useSolanaClient() {
83
- return useContext(SolanaClientContext);
84
- }
85
-
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);
93
- }
94
93
  var SolanaWalletContext = createContext([
95
94
  void 0,
96
95
  function setSelectedWalletAccount() {
@@ -1 +1 @@
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"]}
1
+ {"version":3,"sources":["../src/solana-client-context.tsx","../src/solana-client-provider.tsx","../src/solana-cluster-context.tsx","../src/use-local-storage.ts","../src/solana-cluster-provider.tsx","../src/solana-wallet-context.tsx","../src/solana-wallet-provider.tsx","../src/solana-provider.tsx"],"names":["React","createContext","useContext","useMemo","cluster","STORAGE_KEY","useState","setSelectedWalletAccount"],"mappings":"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","file":"index.browser.mjs","sourcesContent":["import { SolanaClient } from '@wallet-ui/core';\nimport { createContext, useContext } from 'react';\n\nexport const SolanaClientContext = createContext<SolanaClient>({} as SolanaClient);\n\nexport function useSolanaClient() {\n return useContext(SolanaClientContext);\n}\n","import { SolanaClientUrlOrMoniker } from '@wallet-ui/core';\nimport { createSolanaClient } from 'gill';\nimport React, { ReactNode, useMemo } from 'react';\n\nimport { SolanaClientContext } from './solana-client-context';\n\nexport function SolanaClientProvider({\n children,\n urlOrMoniker,\n}: {\n children: ReactNode;\n urlOrMoniker: SolanaClientUrlOrMoniker;\n}) {\n const value = useMemo(() => createSolanaClient({ urlOrMoniker }), [urlOrMoniker]);\n\n return <SolanaClientContext.Provider value={value}>{children}</SolanaClientContext.Provider>;\n}\n","import { SolanaCluster } from '@wallet-ui/core';\nimport { createContext, useContext } from 'react';\n\nexport type SolanaClusterContextProps = Readonly<{\n cluster: SolanaCluster;\n clusters: SolanaCluster[];\n setCluster?(cluster: `solana:${string}`): void;\n}>;\n\nexport const SolanaClusterContext = createContext<SolanaClusterContextProps>({} as SolanaClusterContextProps);\n\nexport function useSolanaCluster() {\n return useContext(SolanaClusterContext);\n}\n","import { useCallback, useState } from 'react';\n\nexport function useLocalStorage<T>(key: string, initialValue: T) {\n // State to store our value\n const [storedValue, setStoredValue] = useState<T>(() => {\n try {\n // Check if we're on the client side\n if (typeof window === 'undefined') {\n return initialValue;\n }\n\n const item = window.localStorage.getItem(key);\n // For wallet-related data, validate the stored value\n if (key.includes('wallet') || key.includes('account')) {\n // Return initial value if stored data might be stale\n return initialValue;\n }\n return item ? JSON.parse(item) : initialValue;\n } catch (error) {\n console.warn(`Error reading localStorage key \"${key}\":`, error);\n return initialValue;\n }\n });\n\n // Return a wrapped version of useState's setter function that persists the new value to localStorage\n const setValue = useCallback(\n (value: T | ((val: T) => T)) => {\n try {\n // Allow value to be a function so we have same API as useState\n const valueToStore = value instanceof Function ? value(storedValue) : value;\n\n // Save state\n setStoredValue(valueToStore);\n\n // Save to localStorage\n if (typeof window !== 'undefined') {\n if (valueToStore === undefined || valueToStore === null) {\n window.localStorage.removeItem(key);\n } else {\n window.localStorage.setItem(key, JSON.stringify(valueToStore));\n }\n }\n } catch (error) {\n console.warn(`Error setting localStorage key \"${key}\":`, error);\n }\n },\n [key, storedValue],\n );\n\n return [storedValue, setValue] as const;\n}\n","import { SolanaCluster } from '@wallet-ui/core';\nimport React, { ReactNode, useMemo } from 'react';\n\nimport { SolanaClusterContext } from './solana-cluster-context';\nimport { useLocalStorage } from './use-local-storage';\n\nconst STORAGE_KEY = 'placeholder:selected-cluster';\n\nexport function SolanaClusterProvider({ clusters, children }: { children: ReactNode, clusters: SolanaCluster[]; }) {\n const [clusterId, setClusterId] = useLocalStorage(STORAGE_KEY, 'solana:devnet');\n\n if (!clusters.length) {\n throw new Error('No clusters provided');\n }\n\n const cluster = useMemo<SolanaCluster>(() => {\n for (const cluster of clusters) {\n if (cluster.id === clusterId) {\n return cluster;\n }\n }\n return clusters[0];\n }, [clusterId, clusters]);\n\n return (\n <SolanaClusterContext.Provider\n value={useMemo(\n () => ({\n cluster,\n clusters,\n setCluster(cluster) {\n localStorage.setItem(STORAGE_KEY, cluster);\n setClusterId(cluster);\n },\n }),\n [cluster, clusters],\n )}\n >\n {children}\n </SolanaClusterContext.Provider>\n );\n}\n","import type { UiWalletAccount } from '@wallet-standard/react';\nimport { address } from 'gill';\nimport { createContext, Dispatch, SetStateAction, useContext } from 'react';\n\nexport type SelectedWalletAccountState = UiWalletAccount | undefined;\n\nexport const SolanaWalletContext = createContext<\n readonly [\n selectedWalletAccount: SelectedWalletAccountState,\n setSelectedWalletAccount: Dispatch<SetStateAction<SelectedWalletAccountState>>,\n ]\n>([\n undefined /* selectedWalletAccount */,\n function setSelectedWalletAccount() {\n /* empty */\n },\n]);\n\nexport function useSolanaWallet() {\n return useContext(SolanaWalletContext);\n}\n\nexport function useSolanaWalletAddress() {\n const [wallet] = useSolanaWallet();\n if (!wallet?.address) {\n return null;\n }\n return address(wallet.address);\n}\n","import {\n getUiWalletAccountStorageKey,\n UiWallet,\n uiWalletAccountBelongsToUiWallet,\n uiWalletAccountsAreSame,\n useWallets,\n} from '@wallet-standard/react';\nimport React, { Dispatch, ReactNode, SetStateAction, useEffect, useMemo, useState } from 'react';\n\nimport { SelectedWalletAccountState, SolanaWalletContext } from './solana-wallet-context';\nimport { useLocalStorage } from './use-local-storage';\n\nconst STORAGE_KEY = 'placeholder:selected-wallet-and-address';\n\nlet wasSetterInvoked = false;\n\nfunction getSavedWalletAccount(wallets: readonly UiWallet[], savedWalletNameAndAddress: string | null) {\n if (wasSetterInvoked) {\n // After the user makes an explicit choice of wallet, stop trying to auto-select the\n // saved wallet, if and when it appears.\n return;\n }\n if (!savedWalletNameAndAddress || typeof savedWalletNameAndAddress !== 'string') {\n return;\n }\n const [savedWalletName, savedAccountAddress] = savedWalletNameAndAddress.split(':');\n if (!savedWalletName || !savedAccountAddress) {\n return;\n }\n for (const wallet of wallets) {\n if (wallet.name === savedWalletName) {\n for (const account of wallet.accounts) {\n if (account.address === savedAccountAddress) {\n return account;\n }\n }\n }\n }\n}\n\n/**\n * Saves the selected wallet account's storage key to the browser's local storage. In future\n * sessions it will try to return that same wallet account, or at least one from the same brand of\n * wallet if the wallet from which it came is still in the Wallet Standard registry.\n */\nexport function SolanaWalletProvider({ children }: { children: ReactNode }) {\n const [storedKey, setStoredKey] = useLocalStorage<string | null>(STORAGE_KEY, null);\n const wallets = useWallets();\n const [selectedWalletAccount, setSelectedWalletAccountInternal] = useState<SelectedWalletAccountState>(() =>\n getSavedWalletAccount(wallets, storedKey),\n );\n const setSelectedWalletAccount: Dispatch<SetStateAction<SelectedWalletAccountState>> = setStateAction => {\n setSelectedWalletAccountInternal(prevSelectedWalletAccount => {\n wasSetterInvoked = true;\n const nextWalletAccount =\n typeof setStateAction === 'function' ? setStateAction(prevSelectedWalletAccount) : setStateAction;\n const accountKey = nextWalletAccount ? getUiWalletAccountStorageKey(nextWalletAccount) : undefined;\n if (accountKey) {\n setStoredKey(accountKey);\n } else {\n setStoredKey(null);\n }\n return nextWalletAccount;\n });\n };\n useEffect(() => {\n const savedWalletAccount = getSavedWalletAccount(wallets, storedKey);\n if (savedWalletAccount) {\n setSelectedWalletAccountInternal(savedWalletAccount);\n }\n }, [wallets]);\n const walletAccount = useMemo(() => {\n if (selectedWalletAccount) {\n for (const uiWallet of wallets) {\n for (const uiWalletAccount of uiWallet.accounts) {\n if (uiWalletAccountsAreSame(selectedWalletAccount, uiWalletAccount)) {\n return uiWalletAccount;\n }\n }\n if (uiWalletAccountBelongsToUiWallet(selectedWalletAccount, uiWallet) && uiWallet.accounts[0]) {\n // If the selected account belongs to this connected wallet, at least, then\n // select one of its accounts.\n return uiWallet.accounts[0];\n }\n }\n }\n }, [selectedWalletAccount, wallets]);\n useEffect(() => {\n // If there is a selected wallet account but the wallet to which it belongs has since\n // disconnected, clear the selected wallet.\n if (selectedWalletAccount && !walletAccount) {\n setSelectedWalletAccountInternal(undefined);\n }\n }, [selectedWalletAccount, walletAccount]);\n return (\n <SolanaWalletContext.Provider value={useMemo(() => [walletAccount, setSelectedWalletAccount], [walletAccount])}>\n {children}\n </SolanaWalletContext.Provider>\n );\n}\n","import { SolanaCluster } from '@wallet-ui/core';\nimport React, { ReactNode } from 'react';\n\nimport { SolanaClientProvider } from './solana-client-provider';\nimport { useSolanaCluster } from './solana-cluster-context';\nimport { SolanaClusterProvider } from './solana-cluster-provider';\nimport { SolanaWalletProvider } from './solana-wallet-provider';\n\nexport function SolanaProvider({ clusters, children }: { children: ReactNode; clusters: SolanaCluster[] }) {\n return (\n <SolanaClusterProvider clusters={clusters}>\n <SolanaClientProviderLoader>\n <SolanaWalletProvider>{children}</SolanaWalletProvider>\n </SolanaClientProviderLoader>\n </SolanaClusterProvider>\n );\n}\n\nfunction SolanaClientProviderLoader({ children }: { children: ReactNode }) {\n const { cluster } = useSolanaCluster();\n\n return <SolanaClientProvider urlOrMoniker={cluster.urlOrMoniker}>{children}</SolanaClientProvider>;\n}\n"]}
@@ -1,9 +1,21 @@
1
- export * from '@wallet-ui/core';
2
1
  import React4, { createContext, useContext, useMemo, useState, useEffect, useCallback } from 'react';
3
2
  import { createSolanaClient, address } from 'gill';
4
3
  import { useWallets, uiWalletAccountsAreSame, uiWalletAccountBelongsToUiWallet, getUiWalletAccountStorageKey } from '@wallet-standard/react';
4
+ export * from '@wallet-standard/react';
5
+ export * from '@wallet-ui/core';
5
6
 
6
- // src/index.ts
7
+ // src/solana-client-context.tsx
8
+ var SolanaClientContext = createContext({});
9
+ function useSolanaClient() {
10
+ return useContext(SolanaClientContext);
11
+ }
12
+ function SolanaClientProvider({
13
+ children,
14
+ urlOrMoniker
15
+ }) {
16
+ const value = useMemo(() => createSolanaClient({ urlOrMoniker }), [urlOrMoniker]);
17
+ return /* @__PURE__ */ React4.createElement(SolanaClientContext.Provider, { value }, children);
18
+ }
7
19
  var SolanaClusterContext = createContext({});
8
20
  function useSolanaCluster() {
9
21
  return useContext(SolanaClusterContext);
@@ -78,19 +90,6 @@ function SolanaClusterProvider({ clusters, children }) {
78
90
  children
79
91
  );
80
92
  }
81
- var SolanaClientContext = createContext({});
82
- function useSolanaClient() {
83
- return useContext(SolanaClientContext);
84
- }
85
-
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);
93
- }
94
93
  var SolanaWalletContext = createContext([
95
94
  void 0,
96
95
  function setSelectedWalletAccount() {
@@ -1 +1 @@
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.native.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"]}
1
+ {"version":3,"sources":["../src/solana-client-context.tsx","../src/solana-client-provider.tsx","../src/solana-cluster-context.tsx","../src/use-local-storage.ts","../src/solana-cluster-provider.tsx","../src/solana-wallet-context.tsx","../src/solana-wallet-provider.tsx","../src/solana-provider.tsx"],"names":["React","createContext","useContext","useMemo","cluster","STORAGE_KEY","useState","setSelectedWalletAccount"],"mappings":"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","file":"index.native.mjs","sourcesContent":["import { SolanaClient } from '@wallet-ui/core';\nimport { createContext, useContext } from 'react';\n\nexport const SolanaClientContext = createContext<SolanaClient>({} as SolanaClient);\n\nexport function useSolanaClient() {\n return useContext(SolanaClientContext);\n}\n","import { SolanaClientUrlOrMoniker } from '@wallet-ui/core';\nimport { createSolanaClient } from 'gill';\nimport React, { ReactNode, useMemo } from 'react';\n\nimport { SolanaClientContext } from './solana-client-context';\n\nexport function SolanaClientProvider({\n children,\n urlOrMoniker,\n}: {\n children: ReactNode;\n urlOrMoniker: SolanaClientUrlOrMoniker;\n}) {\n const value = useMemo(() => createSolanaClient({ urlOrMoniker }), [urlOrMoniker]);\n\n return <SolanaClientContext.Provider value={value}>{children}</SolanaClientContext.Provider>;\n}\n","import { SolanaCluster } from '@wallet-ui/core';\nimport { createContext, useContext } from 'react';\n\nexport type SolanaClusterContextProps = Readonly<{\n cluster: SolanaCluster;\n clusters: SolanaCluster[];\n setCluster?(cluster: `solana:${string}`): void;\n}>;\n\nexport const SolanaClusterContext = createContext<SolanaClusterContextProps>({} as SolanaClusterContextProps);\n\nexport function useSolanaCluster() {\n return useContext(SolanaClusterContext);\n}\n","import { useCallback, useState } from 'react';\n\nexport function useLocalStorage<T>(key: string, initialValue: T) {\n // State to store our value\n const [storedValue, setStoredValue] = useState<T>(() => {\n try {\n // Check if we're on the client side\n if (typeof window === 'undefined') {\n return initialValue;\n }\n\n const item = window.localStorage.getItem(key);\n // For wallet-related data, validate the stored value\n if (key.includes('wallet') || key.includes('account')) {\n // Return initial value if stored data might be stale\n return initialValue;\n }\n return item ? JSON.parse(item) : initialValue;\n } catch (error) {\n console.warn(`Error reading localStorage key \"${key}\":`, error);\n return initialValue;\n }\n });\n\n // Return a wrapped version of useState's setter function that persists the new value to localStorage\n const setValue = useCallback(\n (value: T | ((val: T) => T)) => {\n try {\n // Allow value to be a function so we have same API as useState\n const valueToStore = value instanceof Function ? value(storedValue) : value;\n\n // Save state\n setStoredValue(valueToStore);\n\n // Save to localStorage\n if (typeof window !== 'undefined') {\n if (valueToStore === undefined || valueToStore === null) {\n window.localStorage.removeItem(key);\n } else {\n window.localStorage.setItem(key, JSON.stringify(valueToStore));\n }\n }\n } catch (error) {\n console.warn(`Error setting localStorage key \"${key}\":`, error);\n }\n },\n [key, storedValue],\n );\n\n return [storedValue, setValue] as const;\n}\n","import { SolanaCluster } from '@wallet-ui/core';\nimport React, { ReactNode, useMemo } from 'react';\n\nimport { SolanaClusterContext } from './solana-cluster-context';\nimport { useLocalStorage } from './use-local-storage';\n\nconst STORAGE_KEY = 'placeholder:selected-cluster';\n\nexport function SolanaClusterProvider({ clusters, children }: { children: ReactNode, clusters: SolanaCluster[]; }) {\n const [clusterId, setClusterId] = useLocalStorage(STORAGE_KEY, 'solana:devnet');\n\n if (!clusters.length) {\n throw new Error('No clusters provided');\n }\n\n const cluster = useMemo<SolanaCluster>(() => {\n for (const cluster of clusters) {\n if (cluster.id === clusterId) {\n return cluster;\n }\n }\n return clusters[0];\n }, [clusterId, clusters]);\n\n return (\n <SolanaClusterContext.Provider\n value={useMemo(\n () => ({\n cluster,\n clusters,\n setCluster(cluster) {\n localStorage.setItem(STORAGE_KEY, cluster);\n setClusterId(cluster);\n },\n }),\n [cluster, clusters],\n )}\n >\n {children}\n </SolanaClusterContext.Provider>\n );\n}\n","import type { UiWalletAccount } from '@wallet-standard/react';\nimport { address } from 'gill';\nimport { createContext, Dispatch, SetStateAction, useContext } from 'react';\n\nexport type SelectedWalletAccountState = UiWalletAccount | undefined;\n\nexport const SolanaWalletContext = createContext<\n readonly [\n selectedWalletAccount: SelectedWalletAccountState,\n setSelectedWalletAccount: Dispatch<SetStateAction<SelectedWalletAccountState>>,\n ]\n>([\n undefined /* selectedWalletAccount */,\n function setSelectedWalletAccount() {\n /* empty */\n },\n]);\n\nexport function useSolanaWallet() {\n return useContext(SolanaWalletContext);\n}\n\nexport function useSolanaWalletAddress() {\n const [wallet] = useSolanaWallet();\n if (!wallet?.address) {\n return null;\n }\n return address(wallet.address);\n}\n","import {\n getUiWalletAccountStorageKey,\n UiWallet,\n uiWalletAccountBelongsToUiWallet,\n uiWalletAccountsAreSame,\n useWallets,\n} from '@wallet-standard/react';\nimport React, { Dispatch, ReactNode, SetStateAction, useEffect, useMemo, useState } from 'react';\n\nimport { SelectedWalletAccountState, SolanaWalletContext } from './solana-wallet-context';\nimport { useLocalStorage } from './use-local-storage';\n\nconst STORAGE_KEY = 'placeholder:selected-wallet-and-address';\n\nlet wasSetterInvoked = false;\n\nfunction getSavedWalletAccount(wallets: readonly UiWallet[], savedWalletNameAndAddress: string | null) {\n if (wasSetterInvoked) {\n // After the user makes an explicit choice of wallet, stop trying to auto-select the\n // saved wallet, if and when it appears.\n return;\n }\n if (!savedWalletNameAndAddress || typeof savedWalletNameAndAddress !== 'string') {\n return;\n }\n const [savedWalletName, savedAccountAddress] = savedWalletNameAndAddress.split(':');\n if (!savedWalletName || !savedAccountAddress) {\n return;\n }\n for (const wallet of wallets) {\n if (wallet.name === savedWalletName) {\n for (const account of wallet.accounts) {\n if (account.address === savedAccountAddress) {\n return account;\n }\n }\n }\n }\n}\n\n/**\n * Saves the selected wallet account's storage key to the browser's local storage. In future\n * sessions it will try to return that same wallet account, or at least one from the same brand of\n * wallet if the wallet from which it came is still in the Wallet Standard registry.\n */\nexport function SolanaWalletProvider({ children }: { children: ReactNode }) {\n const [storedKey, setStoredKey] = useLocalStorage<string | null>(STORAGE_KEY, null);\n const wallets = useWallets();\n const [selectedWalletAccount, setSelectedWalletAccountInternal] = useState<SelectedWalletAccountState>(() =>\n getSavedWalletAccount(wallets, storedKey),\n );\n const setSelectedWalletAccount: Dispatch<SetStateAction<SelectedWalletAccountState>> = setStateAction => {\n setSelectedWalletAccountInternal(prevSelectedWalletAccount => {\n wasSetterInvoked = true;\n const nextWalletAccount =\n typeof setStateAction === 'function' ? setStateAction(prevSelectedWalletAccount) : setStateAction;\n const accountKey = nextWalletAccount ? getUiWalletAccountStorageKey(nextWalletAccount) : undefined;\n if (accountKey) {\n setStoredKey(accountKey);\n } else {\n setStoredKey(null);\n }\n return nextWalletAccount;\n });\n };\n useEffect(() => {\n const savedWalletAccount = getSavedWalletAccount(wallets, storedKey);\n if (savedWalletAccount) {\n setSelectedWalletAccountInternal(savedWalletAccount);\n }\n }, [wallets]);\n const walletAccount = useMemo(() => {\n if (selectedWalletAccount) {\n for (const uiWallet of wallets) {\n for (const uiWalletAccount of uiWallet.accounts) {\n if (uiWalletAccountsAreSame(selectedWalletAccount, uiWalletAccount)) {\n return uiWalletAccount;\n }\n }\n if (uiWalletAccountBelongsToUiWallet(selectedWalletAccount, uiWallet) && uiWallet.accounts[0]) {\n // If the selected account belongs to this connected wallet, at least, then\n // select one of its accounts.\n return uiWallet.accounts[0];\n }\n }\n }\n }, [selectedWalletAccount, wallets]);\n useEffect(() => {\n // If there is a selected wallet account but the wallet to which it belongs has since\n // disconnected, clear the selected wallet.\n if (selectedWalletAccount && !walletAccount) {\n setSelectedWalletAccountInternal(undefined);\n }\n }, [selectedWalletAccount, walletAccount]);\n return (\n <SolanaWalletContext.Provider value={useMemo(() => [walletAccount, setSelectedWalletAccount], [walletAccount])}>\n {children}\n </SolanaWalletContext.Provider>\n );\n}\n","import { SolanaCluster } from '@wallet-ui/core';\nimport React, { ReactNode } from 'react';\n\nimport { SolanaClientProvider } from './solana-client-provider';\nimport { useSolanaCluster } from './solana-cluster-context';\nimport { SolanaClusterProvider } from './solana-cluster-provider';\nimport { SolanaWalletProvider } from './solana-wallet-provider';\n\nexport function SolanaProvider({ clusters, children }: { children: ReactNode; clusters: SolanaCluster[] }) {\n return (\n <SolanaClusterProvider clusters={clusters}>\n <SolanaClientProviderLoader>\n <SolanaWalletProvider>{children}</SolanaWalletProvider>\n </SolanaClientProviderLoader>\n </SolanaClusterProvider>\n );\n}\n\nfunction SolanaClientProviderLoader({ children }: { children: ReactNode }) {\n const { cluster } = useSolanaCluster();\n\n return <SolanaClientProvider urlOrMoniker={cluster.urlOrMoniker}>{children}</SolanaClientProvider>;\n}\n"]}
@@ -1,15 +1,26 @@
1
1
  'use strict';
2
2
 
3
- var core = require('@wallet-ui/core');
4
3
  var React4 = require('react');
5
4
  var gill = require('gill');
6
5
  var react = require('@wallet-standard/react');
6
+ var core = require('@wallet-ui/core');
7
7
 
8
8
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
9
9
 
10
10
  var React4__default = /*#__PURE__*/_interopDefault(React4);
11
11
 
12
- // src/index.ts
12
+ // src/solana-client-context.tsx
13
+ var SolanaClientContext = React4.createContext({});
14
+ function useSolanaClient() {
15
+ return React4.useContext(SolanaClientContext);
16
+ }
17
+ function SolanaClientProvider({
18
+ children,
19
+ urlOrMoniker
20
+ }) {
21
+ const value = React4.useMemo(() => gill.createSolanaClient({ urlOrMoniker }), [urlOrMoniker]);
22
+ return /* @__PURE__ */ React4__default.default.createElement(SolanaClientContext.Provider, { value }, children);
23
+ }
13
24
  var SolanaClusterContext = React4.createContext({});
14
25
  function useSolanaCluster() {
15
26
  return React4.useContext(SolanaClusterContext);
@@ -84,19 +95,6 @@ function SolanaClusterProvider({ clusters, children }) {
84
95
  children
85
96
  );
86
97
  }
87
- var SolanaClientContext = React4.createContext({});
88
- function useSolanaClient() {
89
- return React4.useContext(SolanaClientContext);
90
- }
91
-
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);
99
- }
100
98
  var SolanaWalletContext = React4.createContext([
101
99
  void 0,
102
100
  function setSelectedWalletAccount() {
@@ -204,6 +202,12 @@ exports.useSolanaClient = useSolanaClient;
204
202
  exports.useSolanaCluster = useSolanaCluster;
205
203
  exports.useSolanaWallet = useSolanaWallet;
206
204
  exports.useSolanaWalletAddress = useSolanaWalletAddress;
205
+ Object.keys(react).forEach(function (k) {
206
+ if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
207
+ enumerable: true,
208
+ get: function () { return react[k]; }
209
+ });
210
+ });
207
211
  Object.keys(core).forEach(function (k) {
208
212
  if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
209
213
  enumerable: true,
@@ -1 +1 @@
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.node.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"]}
1
+ {"version":3,"sources":["../src/solana-client-context.tsx","../src/solana-client-provider.tsx","../src/solana-cluster-context.tsx","../src/use-local-storage.ts","../src/solana-cluster-provider.tsx","../src/solana-wallet-context.tsx","../src/solana-wallet-provider.tsx","../src/solana-provider.tsx"],"names":["createContext","useContext","useMemo","createSolanaClient","React","useState","useCallback","cluster","address","STORAGE_KEY","useWallets","setSelectedWalletAccount","getUiWalletAccountStorageKey","useEffect","uiWalletAccountsAreSame","uiWalletAccountBelongsToUiWallet"],"mappings":"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","file":"index.node.cjs","sourcesContent":["import { SolanaClient } from '@wallet-ui/core';\nimport { createContext, useContext } from 'react';\n\nexport const SolanaClientContext = createContext<SolanaClient>({} as SolanaClient);\n\nexport function useSolanaClient() {\n return useContext(SolanaClientContext);\n}\n","import { SolanaClientUrlOrMoniker } from '@wallet-ui/core';\nimport { createSolanaClient } from 'gill';\nimport React, { ReactNode, useMemo } from 'react';\n\nimport { SolanaClientContext } from './solana-client-context';\n\nexport function SolanaClientProvider({\n children,\n urlOrMoniker,\n}: {\n children: ReactNode;\n urlOrMoniker: SolanaClientUrlOrMoniker;\n}) {\n const value = useMemo(() => createSolanaClient({ urlOrMoniker }), [urlOrMoniker]);\n\n return <SolanaClientContext.Provider value={value}>{children}</SolanaClientContext.Provider>;\n}\n","import { SolanaCluster } from '@wallet-ui/core';\nimport { createContext, useContext } from 'react';\n\nexport type SolanaClusterContextProps = Readonly<{\n cluster: SolanaCluster;\n clusters: SolanaCluster[];\n setCluster?(cluster: `solana:${string}`): void;\n}>;\n\nexport const SolanaClusterContext = createContext<SolanaClusterContextProps>({} as SolanaClusterContextProps);\n\nexport function useSolanaCluster() {\n return useContext(SolanaClusterContext);\n}\n","import { useCallback, useState } from 'react';\n\nexport function useLocalStorage<T>(key: string, initialValue: T) {\n // State to store our value\n const [storedValue, setStoredValue] = useState<T>(() => {\n try {\n // Check if we're on the client side\n if (typeof window === 'undefined') {\n return initialValue;\n }\n\n const item = window.localStorage.getItem(key);\n // For wallet-related data, validate the stored value\n if (key.includes('wallet') || key.includes('account')) {\n // Return initial value if stored data might be stale\n return initialValue;\n }\n return item ? JSON.parse(item) : initialValue;\n } catch (error) {\n console.warn(`Error reading localStorage key \"${key}\":`, error);\n return initialValue;\n }\n });\n\n // Return a wrapped version of useState's setter function that persists the new value to localStorage\n const setValue = useCallback(\n (value: T | ((val: T) => T)) => {\n try {\n // Allow value to be a function so we have same API as useState\n const valueToStore = value instanceof Function ? value(storedValue) : value;\n\n // Save state\n setStoredValue(valueToStore);\n\n // Save to localStorage\n if (typeof window !== 'undefined') {\n if (valueToStore === undefined || valueToStore === null) {\n window.localStorage.removeItem(key);\n } else {\n window.localStorage.setItem(key, JSON.stringify(valueToStore));\n }\n }\n } catch (error) {\n console.warn(`Error setting localStorage key \"${key}\":`, error);\n }\n },\n [key, storedValue],\n );\n\n return [storedValue, setValue] as const;\n}\n","import { SolanaCluster } from '@wallet-ui/core';\nimport React, { ReactNode, useMemo } from 'react';\n\nimport { SolanaClusterContext } from './solana-cluster-context';\nimport { useLocalStorage } from './use-local-storage';\n\nconst STORAGE_KEY = 'placeholder:selected-cluster';\n\nexport function SolanaClusterProvider({ clusters, children }: { children: ReactNode, clusters: SolanaCluster[]; }) {\n const [clusterId, setClusterId] = useLocalStorage(STORAGE_KEY, 'solana:devnet');\n\n if (!clusters.length) {\n throw new Error('No clusters provided');\n }\n\n const cluster = useMemo<SolanaCluster>(() => {\n for (const cluster of clusters) {\n if (cluster.id === clusterId) {\n return cluster;\n }\n }\n return clusters[0];\n }, [clusterId, clusters]);\n\n return (\n <SolanaClusterContext.Provider\n value={useMemo(\n () => ({\n cluster,\n clusters,\n setCluster(cluster) {\n localStorage.setItem(STORAGE_KEY, cluster);\n setClusterId(cluster);\n },\n }),\n [cluster, clusters],\n )}\n >\n {children}\n </SolanaClusterContext.Provider>\n );\n}\n","import type { UiWalletAccount } from '@wallet-standard/react';\nimport { address } from 'gill';\nimport { createContext, Dispatch, SetStateAction, useContext } from 'react';\n\nexport type SelectedWalletAccountState = UiWalletAccount | undefined;\n\nexport const SolanaWalletContext = createContext<\n readonly [\n selectedWalletAccount: SelectedWalletAccountState,\n setSelectedWalletAccount: Dispatch<SetStateAction<SelectedWalletAccountState>>,\n ]\n>([\n undefined /* selectedWalletAccount */,\n function setSelectedWalletAccount() {\n /* empty */\n },\n]);\n\nexport function useSolanaWallet() {\n return useContext(SolanaWalletContext);\n}\n\nexport function useSolanaWalletAddress() {\n const [wallet] = useSolanaWallet();\n if (!wallet?.address) {\n return null;\n }\n return address(wallet.address);\n}\n","import {\n getUiWalletAccountStorageKey,\n UiWallet,\n uiWalletAccountBelongsToUiWallet,\n uiWalletAccountsAreSame,\n useWallets,\n} from '@wallet-standard/react';\nimport React, { Dispatch, ReactNode, SetStateAction, useEffect, useMemo, useState } from 'react';\n\nimport { SelectedWalletAccountState, SolanaWalletContext } from './solana-wallet-context';\nimport { useLocalStorage } from './use-local-storage';\n\nconst STORAGE_KEY = 'placeholder:selected-wallet-and-address';\n\nlet wasSetterInvoked = false;\n\nfunction getSavedWalletAccount(wallets: readonly UiWallet[], savedWalletNameAndAddress: string | null) {\n if (wasSetterInvoked) {\n // After the user makes an explicit choice of wallet, stop trying to auto-select the\n // saved wallet, if and when it appears.\n return;\n }\n if (!savedWalletNameAndAddress || typeof savedWalletNameAndAddress !== 'string') {\n return;\n }\n const [savedWalletName, savedAccountAddress] = savedWalletNameAndAddress.split(':');\n if (!savedWalletName || !savedAccountAddress) {\n return;\n }\n for (const wallet of wallets) {\n if (wallet.name === savedWalletName) {\n for (const account of wallet.accounts) {\n if (account.address === savedAccountAddress) {\n return account;\n }\n }\n }\n }\n}\n\n/**\n * Saves the selected wallet account's storage key to the browser's local storage. In future\n * sessions it will try to return that same wallet account, or at least one from the same brand of\n * wallet if the wallet from which it came is still in the Wallet Standard registry.\n */\nexport function SolanaWalletProvider({ children }: { children: ReactNode }) {\n const [storedKey, setStoredKey] = useLocalStorage<string | null>(STORAGE_KEY, null);\n const wallets = useWallets();\n const [selectedWalletAccount, setSelectedWalletAccountInternal] = useState<SelectedWalletAccountState>(() =>\n getSavedWalletAccount(wallets, storedKey),\n );\n const setSelectedWalletAccount: Dispatch<SetStateAction<SelectedWalletAccountState>> = setStateAction => {\n setSelectedWalletAccountInternal(prevSelectedWalletAccount => {\n wasSetterInvoked = true;\n const nextWalletAccount =\n typeof setStateAction === 'function' ? setStateAction(prevSelectedWalletAccount) : setStateAction;\n const accountKey = nextWalletAccount ? getUiWalletAccountStorageKey(nextWalletAccount) : undefined;\n if (accountKey) {\n setStoredKey(accountKey);\n } else {\n setStoredKey(null);\n }\n return nextWalletAccount;\n });\n };\n useEffect(() => {\n const savedWalletAccount = getSavedWalletAccount(wallets, storedKey);\n if (savedWalletAccount) {\n setSelectedWalletAccountInternal(savedWalletAccount);\n }\n }, [wallets]);\n const walletAccount = useMemo(() => {\n if (selectedWalletAccount) {\n for (const uiWallet of wallets) {\n for (const uiWalletAccount of uiWallet.accounts) {\n if (uiWalletAccountsAreSame(selectedWalletAccount, uiWalletAccount)) {\n return uiWalletAccount;\n }\n }\n if (uiWalletAccountBelongsToUiWallet(selectedWalletAccount, uiWallet) && uiWallet.accounts[0]) {\n // If the selected account belongs to this connected wallet, at least, then\n // select one of its accounts.\n return uiWallet.accounts[0];\n }\n }\n }\n }, [selectedWalletAccount, wallets]);\n useEffect(() => {\n // If there is a selected wallet account but the wallet to which it belongs has since\n // disconnected, clear the selected wallet.\n if (selectedWalletAccount && !walletAccount) {\n setSelectedWalletAccountInternal(undefined);\n }\n }, [selectedWalletAccount, walletAccount]);\n return (\n <SolanaWalletContext.Provider value={useMemo(() => [walletAccount, setSelectedWalletAccount], [walletAccount])}>\n {children}\n </SolanaWalletContext.Provider>\n );\n}\n","import { SolanaCluster } from '@wallet-ui/core';\nimport React, { ReactNode } from 'react';\n\nimport { SolanaClientProvider } from './solana-client-provider';\nimport { useSolanaCluster } from './solana-cluster-context';\nimport { SolanaClusterProvider } from './solana-cluster-provider';\nimport { SolanaWalletProvider } from './solana-wallet-provider';\n\nexport function SolanaProvider({ clusters, children }: { children: ReactNode; clusters: SolanaCluster[] }) {\n return (\n <SolanaClusterProvider clusters={clusters}>\n <SolanaClientProviderLoader>\n <SolanaWalletProvider>{children}</SolanaWalletProvider>\n </SolanaClientProviderLoader>\n </SolanaClusterProvider>\n );\n}\n\nfunction SolanaClientProviderLoader({ children }: { children: ReactNode }) {\n const { cluster } = useSolanaCluster();\n\n return <SolanaClientProvider urlOrMoniker={cluster.urlOrMoniker}>{children}</SolanaClientProvider>;\n}\n"]}
@@ -1,9 +1,21 @@
1
- export * from '@wallet-ui/core';
2
1
  import React4, { createContext, useContext, useMemo, useState, useEffect, useCallback } from 'react';
3
2
  import { createSolanaClient, address } from 'gill';
4
3
  import { useWallets, uiWalletAccountsAreSame, uiWalletAccountBelongsToUiWallet, getUiWalletAccountStorageKey } from '@wallet-standard/react';
4
+ export * from '@wallet-standard/react';
5
+ export * from '@wallet-ui/core';
5
6
 
6
- // src/index.ts
7
+ // src/solana-client-context.tsx
8
+ var SolanaClientContext = createContext({});
9
+ function useSolanaClient() {
10
+ return useContext(SolanaClientContext);
11
+ }
12
+ function SolanaClientProvider({
13
+ children,
14
+ urlOrMoniker
15
+ }) {
16
+ const value = useMemo(() => createSolanaClient({ urlOrMoniker }), [urlOrMoniker]);
17
+ return /* @__PURE__ */ React4.createElement(SolanaClientContext.Provider, { value }, children);
18
+ }
7
19
  var SolanaClusterContext = createContext({});
8
20
  function useSolanaCluster() {
9
21
  return useContext(SolanaClusterContext);
@@ -78,19 +90,6 @@ function SolanaClusterProvider({ clusters, children }) {
78
90
  children
79
91
  );
80
92
  }
81
- var SolanaClientContext = createContext({});
82
- function useSolanaClient() {
83
- return useContext(SolanaClientContext);
84
- }
85
-
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);
93
- }
94
93
  var SolanaWalletContext = createContext([
95
94
  void 0,
96
95
  function setSelectedWalletAccount() {
@@ -1 +1 @@
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.node.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"]}
1
+ {"version":3,"sources":["../src/solana-client-context.tsx","../src/solana-client-provider.tsx","../src/solana-cluster-context.tsx","../src/use-local-storage.ts","../src/solana-cluster-provider.tsx","../src/solana-wallet-context.tsx","../src/solana-wallet-provider.tsx","../src/solana-provider.tsx"],"names":["React","createContext","useContext","useMemo","cluster","STORAGE_KEY","useState","setSelectedWalletAccount"],"mappings":"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","file":"index.node.mjs","sourcesContent":["import { SolanaClient } from '@wallet-ui/core';\nimport { createContext, useContext } from 'react';\n\nexport const SolanaClientContext = createContext<SolanaClient>({} as SolanaClient);\n\nexport function useSolanaClient() {\n return useContext(SolanaClientContext);\n}\n","import { SolanaClientUrlOrMoniker } from '@wallet-ui/core';\nimport { createSolanaClient } from 'gill';\nimport React, { ReactNode, useMemo } from 'react';\n\nimport { SolanaClientContext } from './solana-client-context';\n\nexport function SolanaClientProvider({\n children,\n urlOrMoniker,\n}: {\n children: ReactNode;\n urlOrMoniker: SolanaClientUrlOrMoniker;\n}) {\n const value = useMemo(() => createSolanaClient({ urlOrMoniker }), [urlOrMoniker]);\n\n return <SolanaClientContext.Provider value={value}>{children}</SolanaClientContext.Provider>;\n}\n","import { SolanaCluster } from '@wallet-ui/core';\nimport { createContext, useContext } from 'react';\n\nexport type SolanaClusterContextProps = Readonly<{\n cluster: SolanaCluster;\n clusters: SolanaCluster[];\n setCluster?(cluster: `solana:${string}`): void;\n}>;\n\nexport const SolanaClusterContext = createContext<SolanaClusterContextProps>({} as SolanaClusterContextProps);\n\nexport function useSolanaCluster() {\n return useContext(SolanaClusterContext);\n}\n","import { useCallback, useState } from 'react';\n\nexport function useLocalStorage<T>(key: string, initialValue: T) {\n // State to store our value\n const [storedValue, setStoredValue] = useState<T>(() => {\n try {\n // Check if we're on the client side\n if (typeof window === 'undefined') {\n return initialValue;\n }\n\n const item = window.localStorage.getItem(key);\n // For wallet-related data, validate the stored value\n if (key.includes('wallet') || key.includes('account')) {\n // Return initial value if stored data might be stale\n return initialValue;\n }\n return item ? JSON.parse(item) : initialValue;\n } catch (error) {\n console.warn(`Error reading localStorage key \"${key}\":`, error);\n return initialValue;\n }\n });\n\n // Return a wrapped version of useState's setter function that persists the new value to localStorage\n const setValue = useCallback(\n (value: T | ((val: T) => T)) => {\n try {\n // Allow value to be a function so we have same API as useState\n const valueToStore = value instanceof Function ? value(storedValue) : value;\n\n // Save state\n setStoredValue(valueToStore);\n\n // Save to localStorage\n if (typeof window !== 'undefined') {\n if (valueToStore === undefined || valueToStore === null) {\n window.localStorage.removeItem(key);\n } else {\n window.localStorage.setItem(key, JSON.stringify(valueToStore));\n }\n }\n } catch (error) {\n console.warn(`Error setting localStorage key \"${key}\":`, error);\n }\n },\n [key, storedValue],\n );\n\n return [storedValue, setValue] as const;\n}\n","import { SolanaCluster } from '@wallet-ui/core';\nimport React, { ReactNode, useMemo } from 'react';\n\nimport { SolanaClusterContext } from './solana-cluster-context';\nimport { useLocalStorage } from './use-local-storage';\n\nconst STORAGE_KEY = 'placeholder:selected-cluster';\n\nexport function SolanaClusterProvider({ clusters, children }: { children: ReactNode, clusters: SolanaCluster[]; }) {\n const [clusterId, setClusterId] = useLocalStorage(STORAGE_KEY, 'solana:devnet');\n\n if (!clusters.length) {\n throw new Error('No clusters provided');\n }\n\n const cluster = useMemo<SolanaCluster>(() => {\n for (const cluster of clusters) {\n if (cluster.id === clusterId) {\n return cluster;\n }\n }\n return clusters[0];\n }, [clusterId, clusters]);\n\n return (\n <SolanaClusterContext.Provider\n value={useMemo(\n () => ({\n cluster,\n clusters,\n setCluster(cluster) {\n localStorage.setItem(STORAGE_KEY, cluster);\n setClusterId(cluster);\n },\n }),\n [cluster, clusters],\n )}\n >\n {children}\n </SolanaClusterContext.Provider>\n );\n}\n","import type { UiWalletAccount } from '@wallet-standard/react';\nimport { address } from 'gill';\nimport { createContext, Dispatch, SetStateAction, useContext } from 'react';\n\nexport type SelectedWalletAccountState = UiWalletAccount | undefined;\n\nexport const SolanaWalletContext = createContext<\n readonly [\n selectedWalletAccount: SelectedWalletAccountState,\n setSelectedWalletAccount: Dispatch<SetStateAction<SelectedWalletAccountState>>,\n ]\n>([\n undefined /* selectedWalletAccount */,\n function setSelectedWalletAccount() {\n /* empty */\n },\n]);\n\nexport function useSolanaWallet() {\n return useContext(SolanaWalletContext);\n}\n\nexport function useSolanaWalletAddress() {\n const [wallet] = useSolanaWallet();\n if (!wallet?.address) {\n return null;\n }\n return address(wallet.address);\n}\n","import {\n getUiWalletAccountStorageKey,\n UiWallet,\n uiWalletAccountBelongsToUiWallet,\n uiWalletAccountsAreSame,\n useWallets,\n} from '@wallet-standard/react';\nimport React, { Dispatch, ReactNode, SetStateAction, useEffect, useMemo, useState } from 'react';\n\nimport { SelectedWalletAccountState, SolanaWalletContext } from './solana-wallet-context';\nimport { useLocalStorage } from './use-local-storage';\n\nconst STORAGE_KEY = 'placeholder:selected-wallet-and-address';\n\nlet wasSetterInvoked = false;\n\nfunction getSavedWalletAccount(wallets: readonly UiWallet[], savedWalletNameAndAddress: string | null) {\n if (wasSetterInvoked) {\n // After the user makes an explicit choice of wallet, stop trying to auto-select the\n // saved wallet, if and when it appears.\n return;\n }\n if (!savedWalletNameAndAddress || typeof savedWalletNameAndAddress !== 'string') {\n return;\n }\n const [savedWalletName, savedAccountAddress] = savedWalletNameAndAddress.split(':');\n if (!savedWalletName || !savedAccountAddress) {\n return;\n }\n for (const wallet of wallets) {\n if (wallet.name === savedWalletName) {\n for (const account of wallet.accounts) {\n if (account.address === savedAccountAddress) {\n return account;\n }\n }\n }\n }\n}\n\n/**\n * Saves the selected wallet account's storage key to the browser's local storage. In future\n * sessions it will try to return that same wallet account, or at least one from the same brand of\n * wallet if the wallet from which it came is still in the Wallet Standard registry.\n */\nexport function SolanaWalletProvider({ children }: { children: ReactNode }) {\n const [storedKey, setStoredKey] = useLocalStorage<string | null>(STORAGE_KEY, null);\n const wallets = useWallets();\n const [selectedWalletAccount, setSelectedWalletAccountInternal] = useState<SelectedWalletAccountState>(() =>\n getSavedWalletAccount(wallets, storedKey),\n );\n const setSelectedWalletAccount: Dispatch<SetStateAction<SelectedWalletAccountState>> = setStateAction => {\n setSelectedWalletAccountInternal(prevSelectedWalletAccount => {\n wasSetterInvoked = true;\n const nextWalletAccount =\n typeof setStateAction === 'function' ? setStateAction(prevSelectedWalletAccount) : setStateAction;\n const accountKey = nextWalletAccount ? getUiWalletAccountStorageKey(nextWalletAccount) : undefined;\n if (accountKey) {\n setStoredKey(accountKey);\n } else {\n setStoredKey(null);\n }\n return nextWalletAccount;\n });\n };\n useEffect(() => {\n const savedWalletAccount = getSavedWalletAccount(wallets, storedKey);\n if (savedWalletAccount) {\n setSelectedWalletAccountInternal(savedWalletAccount);\n }\n }, [wallets]);\n const walletAccount = useMemo(() => {\n if (selectedWalletAccount) {\n for (const uiWallet of wallets) {\n for (const uiWalletAccount of uiWallet.accounts) {\n if (uiWalletAccountsAreSame(selectedWalletAccount, uiWalletAccount)) {\n return uiWalletAccount;\n }\n }\n if (uiWalletAccountBelongsToUiWallet(selectedWalletAccount, uiWallet) && uiWallet.accounts[0]) {\n // If the selected account belongs to this connected wallet, at least, then\n // select one of its accounts.\n return uiWallet.accounts[0];\n }\n }\n }\n }, [selectedWalletAccount, wallets]);\n useEffect(() => {\n // If there is a selected wallet account but the wallet to which it belongs has since\n // disconnected, clear the selected wallet.\n if (selectedWalletAccount && !walletAccount) {\n setSelectedWalletAccountInternal(undefined);\n }\n }, [selectedWalletAccount, walletAccount]);\n return (\n <SolanaWalletContext.Provider value={useMemo(() => [walletAccount, setSelectedWalletAccount], [walletAccount])}>\n {children}\n </SolanaWalletContext.Provider>\n );\n}\n","import { SolanaCluster } from '@wallet-ui/core';\nimport React, { ReactNode } from 'react';\n\nimport { SolanaClientProvider } from './solana-client-provider';\nimport { useSolanaCluster } from './solana-cluster-context';\nimport { SolanaClusterProvider } from './solana-cluster-provider';\nimport { SolanaWalletProvider } from './solana-wallet-provider';\n\nexport function SolanaProvider({ clusters, children }: { children: ReactNode; clusters: SolanaCluster[] }) {\n return (\n <SolanaClusterProvider clusters={clusters}>\n <SolanaClientProviderLoader>\n <SolanaWalletProvider>{children}</SolanaWalletProvider>\n </SolanaClientProviderLoader>\n </SolanaClusterProvider>\n );\n}\n\nfunction SolanaClientProviderLoader({ children }: { children: ReactNode }) {\n const { cluster } = useSolanaCluster();\n\n return <SolanaClientProvider urlOrMoniker={cluster.urlOrMoniker}>{children}</SolanaClientProvider>;\n}\n"]}
@@ -1,9 +1,10 @@
1
- export * from '@wallet-ui/core';
1
+ export * from './solana-client-context';
2
+ export * from './solana-client-provider';
2
3
  export * from './solana-cluster-context';
3
4
  export * from './solana-cluster-provider';
4
5
  export * from './solana-provider';
5
- export * from './solana-client-context';
6
- export * from './solana-client-provider';
7
6
  export * from './solana-wallet-context';
8
7
  export * from './solana-wallet-provider';
8
+ export * from '@wallet-standard/react';
9
+ export * from '@wallet-ui/core';
9
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AAEzC,cAAc,wBAAwB,CAAC;AAEvC,cAAc,iBAAiB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wallet-ui/react",
3
- "version": "1.1.0-canary-20250302012806",
3
+ "version": "1.1.0-canary-20250302034408",
4
4
  "description": "React hooks for building Solana apps",
5
5
  "exports": {
6
6
  "edge-light": {
@@ -54,9 +54,9 @@
54
54
  "maintained node versions"
55
55
  ],
56
56
  "dependencies": {
57
- "@wallet-standard/react": "^1.0.0",
57
+ "@wallet-standard/react": "1.0.0",
58
58
  "gill": "0.5.0",
59
- "@wallet-ui/core": "1.1.0-canary-20250302012806"
59
+ "@wallet-ui/core": "1.1.0-canary-20250302034408"
60
60
  },
61
61
  "peerDependencies": {
62
62
  "react": ">=18"