UNPKG

@roochnetwork/rooch-sdk-kit

Version:
304 lines (284 loc) 9.36 kB
// src/hooks/wallet/useWalletStore.ts import { useContext as useContext3 } from "react"; import { useStore as useStore2 } from "zustand"; // src/provider/roochProvider.tsx import { createContext as createContext2, useRef } from "react"; // src/hooks/useSessionsStore.ts import { useContext } from "react"; import { useStore } from "zustand"; function useSessionStore(selector) { const store = useContext(RoochContext); if (!store) { throw new Error( "Could not find RoochSessionContext. Ensure that you have set up the RoochClientProvider." ); } return useStore(store, selector); } // src/provider/globalProvider.tsx import { createContext, useContext as useContext2 } from "react"; import { jsx } from "react/jsx-runtime"; var GlobalContext = createContext(null); var useTriggerError = () => { const ctx = useContext2(GlobalContext); if (!ctx) { throw new Error("useTriggerError must be used within a GlobalProvider"); } return ctx.triggerError; }; // src/provider/roochProvider.tsx import { jsx as jsx2, jsxs } from "react/jsx-runtime"; var RoochContext = createContext2(null); // src/provider/walletProvider.tsx import { useCallback, createContext as createContext3, useEffect, useRef as useRef2 } from "react"; import { BitcoinAddress } from "@roochnetwork/rooch-sdk"; // src/constants/walletMutationKeys.ts function formMutationKeyFn(baseEntity) { return function mutationKeyFn(additionalKeys = []) { return [{ ...walletMutationKeys.all, baseEntity }, ...additionalKeys]; }; } var walletMutationKeys = { all: { baseScope: "wallet" }, connectWallet: formMutationKeyFn("connect-wallet"), autoConnectWallet: formMutationKeyFn("auto-connect-wallet"), switchAccount: formMutationKeyFn("switch-account"), createSessionKey: formMutationKeyFn("create-session-key") }; // src/hooks/useSessions.ts function useSessions() { return useSessionStore( (state) => state.sessions.sort((a, b) => b.getCreateTime() - a.getCreateTime()) ); } // src/hooks/wallet/useCurrentWallet.ts function useCurrentWallet() { const currentWallet = useWalletStore((state) => state.currentWallet); const connectionStatus = useWalletStore((state) => state.connectionStatus); switch (connectionStatus) { case "connecting": return { status: connectionStatus, wallet: currentWallet, isDisconnected: false, isConnecting: true, isConnected: false }; case "disconnected": return { status: connectionStatus, wallet: currentWallet, isDisconnected: true, isConnecting: false, isConnected: false }; case "connected": { return { status: connectionStatus, wallet: currentWallet, isDisconnected: false, isConnecting: false, isConnected: true }; } } } // src/wallet/wallets.ts var wallets = void 0; var registered = /* @__PURE__ */ new Set(); var listeners = {}; function getWallets() { if (wallets) return wallets; wallets = Object.freeze({ register, get, on }); return wallets; } function register(...wallets2) { wallets2.forEach((wallet) => registered.add(wallet)); listeners["register"]?.forEach((listener) => guard(() => listener(...wallets2))); return function unregister() { wallets2.forEach((wallet) => registered.delete(wallet)); listeners["unregister"]?.forEach((listener) => guard(() => listener(...wallets2))); }; } function get() { return [...registered]; } function on(event, listener) { listeners[event]?.push(listener) || (listeners[event] = [listener]); return function off() { listeners[event] = listeners[event]?.filter((existingListener) => listener !== existingListener); }; } function guard(callback) { try { callback(); } catch (error) { console.error(error); } } // src/wallet/util.ts function getRegisteredWallets(preferredWallets, walletFilter) { const walletsApi = getWallets(); const wallets2 = walletsApi.get(); const Wallets = wallets2.filter((wallet) => !walletFilter || walletFilter(wallet)); return [ // Preferred wallets, in order: ...preferredWallets.map((name) => Wallets.find((wallet) => wallet.getName() === name)), // Wallets in default order: ...Wallets.filter((wallet) => !preferredWallets.includes(wallet.getName())) ].filter((wallet) => wallet !== void 0); } // src/provider/walletProvider.tsx import { jsx as jsx3 } from "react/jsx-runtime"; var WalletContext = createContext3(null); // src/hooks/wallet/useWalletStore.ts function useWalletStore(selector) { const store = useContext3(WalletContext); if (!store) { throw new Error("Could not find WalletContext. Ensure that you have set up the WalletProvider."); } return useStore2(store, selector); } // src/hooks/wallet/useAddresses.ts function useAddresses() { return useWalletStore((state) => state.addresses); } // src/hooks/wallet/useAutoConnectWallet.ts import { useQuery } from "@tanstack/react-query"; import { useLayoutEffect, useState } from "react"; function useAutoConnectWallet() { const { mutateAsync: connectWallet } = useConnectWallet(); const autoConnectEnabled = useWalletStore((state) => state.autoConnectEnabled); const lastConnectedWalletName = useWalletStore((state) => state.lastConnectedWalletName); const lastConnectedAddress = useWalletStore((state) => state.lastConnectedAddress); const { isConnected } = useCurrentWallet(); const wallets2 = useWallets(); const [clientOnly, setClientOnly] = useState(false); useLayoutEffect(() => { setClientOnly(true); }, []); const { data, isError } = useQuery({ queryKey: [ "@rooch/sdk-kit", "autoconnect", { isConnected, autoConnectEnabled, lastConnectedWalletName, lastConnectedAddress } ], queryFn: async () => { if (!autoConnectEnabled) { return "disabled"; } if (!lastConnectedWalletName || !lastConnectedAddress || isConnected) { return "attempted"; } let wallet = wallets2.find((wallet2) => wallet2.getName() === lastConnectedWalletName); if (wallet) { await connectWallet({ wallet }); } return "attempted"; }, enabled: autoConnectEnabled, persister: void 0, gcTime: 0, staleTime: 0, networkMode: "always", retry: (_) => { return false; }, retryOnMount: false, refetchInterval: 1e3, refetchIntervalInBackground: false, refetchOnMount: false, refetchOnReconnect: false, refetchOnWindowFocus: false }); if (!autoConnectEnabled) { return "disabled"; } if (!clientOnly) { return "idle"; } if (!lastConnectedWalletName) { return "attempted"; } return isError ? "attempted" : data ?? "idle"; } // src/hooks/wallet/useConnectWallet.ts import { useMutation } from "@tanstack/react-query"; function useConnectWallet({ mutationKey, ...mutationOptions } = {}) { const sessions = useSessions(); const setCurrentSession = useSessionStore((state) => state.setCurrentSession); const setWalletConnected = useWalletStore((state) => state.setWalletConnected); const setWalletDisconnected = useWalletStore((state) => state.setWalletDisconnected); const setConnectionStatus = useWalletStore((state) => state.setConnectionStatus); const triggerError = useTriggerError(); return useMutation({ mutationKey: walletMutationKeys.connectWallet(mutationKey), mutationFn: async ({ wallet }) => { try { setConnectionStatus("connecting"); const connectAddress = await wallet.connect(); const selectedAddress = connectAddress[0]; setWalletConnected(wallet, connectAddress, selectedAddress); const cur = sessions.find( (item) => item.getRoochAddress().toStr() === selectedAddress?.genRoochAddress().toStr() ); setCurrentSession(cur); return connectAddress; } catch (error) { setWalletDisconnected(); if ("code" in error && "message" in error) { triggerError(error); } throw error; } }, ...mutationOptions }); } // src/hooks/wallet/useCurrentAddress.ts function useCurrentAddress() { return useWalletStore((state) => state.currentAddress); } // src/hooks/wallet/useWallets.ts function useWallets() { return useWalletStore((state) => state.wallets); } // src/hooks/wallet/useWalletChanged.ts import { useEffect as useEffect2 } from "react"; function useWalletChanged(preferredWallets, walletFilter) { const updateWallets = useWalletStore((state) => state.updateWallets); useEffect2(() => { const api = getWallets(); updateWallets(getRegisteredWallets(preferredWallets, walletFilter)); const unsubscribeFromRegister = api.on("register", () => { updateWallets(getRegisteredWallets(preferredWallets, walletFilter)); }); return () => { unsubscribeFromRegister(); }; }, [preferredWallets, updateWallets, walletFilter]); } // src/hooks/wallet/useConnectionStatus.ts function useConnectionStatus() { return useWalletStore((state) => state.connectionStatus); } export { useAddresses, useAutoConnectWallet, useConnectWallet, useConnectionStatus, useCurrentAddress, useCurrentWallet, useWalletChanged, useWallets }; //# sourceMappingURL=index.js.map