{"version":3,"sources":["../src/index.tsx"],"sourcesContent":["import { useStore } from '@tanstack/react-store'\nimport {\n  NetworkId,\n  WalletId,\n  WalletManager,\n  type AlgodConfig,\n  type BaseWallet,\n  type WalletAccount,\n  type WalletMetadata\n} from '@txnlab/use-wallet'\nimport algosdk from 'algosdk'\nimport * as React from 'react'\n\nexport * from '@txnlab/use-wallet'\n\ninterface IWalletContext {\n  manager: WalletManager\n  algodClient: algosdk.Algodv2\n  setAlgodClient: React.Dispatch<React.SetStateAction<algosdk.Algodv2>>\n}\n\nconst WalletContext = React.createContext<IWalletContext | undefined>(undefined)\n\ninterface WalletProviderProps {\n  manager: WalletManager\n  children: React.ReactNode\n}\n\nexport const WalletProvider = ({ manager, children }: WalletProviderProps): JSX.Element => {\n  const [algodClient, setAlgodClient] = React.useState(manager.algodClient)\n\n  React.useEffect(() => {\n    manager.algodClient = algodClient\n  }, [algodClient, manager])\n\n  const resumedRef = React.useRef(false)\n\n  React.useEffect(() => {\n    if (!resumedRef.current) {\n      manager.resumeSessions()\n      resumedRef.current = true\n    }\n  }, [manager])\n\n  return (\n    <WalletContext.Provider value={{ manager, algodClient, setAlgodClient }}>\n      {children}\n    </WalletContext.Provider>\n  )\n}\n\nexport const useNetwork = () => {\n  const context = React.useContext(WalletContext)\n\n  if (!context) {\n    throw new Error('useNetwork must be used within the WalletProvider')\n  }\n\n  const { manager, setAlgodClient } = context\n\n  const activeNetwork = useStore(manager.store, (state) => state.activeNetwork)\n\n  const setActiveNetwork = async (networkId: NetworkId | string): Promise<void> => {\n    if (networkId === activeNetwork) {\n      return\n    }\n\n    if (!manager.networkConfig[networkId]) {\n      throw new Error(`Network \"${networkId}\" not found in network configuration`)\n    }\n\n    console.info(`[React] Creating new Algodv2 client...`)\n\n    const { algod } = manager.networkConfig[networkId]\n    const { token = '', baseServer, port = '', headers = {} } = algod\n    const newClient = new algosdk.Algodv2(token, baseServer, port, headers)\n    setAlgodClient(newClient)\n\n    manager.store.setState((state) => ({\n      ...state,\n      activeNetwork: networkId\n    }))\n\n    console.info(`[React] ✅ Active network set to ${networkId}.`)\n  }\n\n  const updateAlgodConfig = (networkId: string, config: Partial<AlgodConfig>): void => {\n    manager.updateAlgodConfig(networkId, config)\n\n    // If this is the active network, update the algodClient\n    if (networkId === activeNetwork) {\n      console.info(`[React] Creating new Algodv2 client...`)\n      const { algod } = manager.networkConfig[networkId]\n      const { token = '', baseServer, port = '', headers = {} } = algod\n      const newClient = new algosdk.Algodv2(token, baseServer, port, headers)\n      setAlgodClient(newClient)\n    }\n  }\n\n  const resetNetworkConfig = (networkId: string): void => {\n    manager.resetNetworkConfig(networkId)\n\n    // If this is the active network, update the algodClient\n    if (networkId === activeNetwork) {\n      console.info(`[React] Creating new Algodv2 client...`)\n      const { algod } = manager.networkConfig[networkId]\n      const { token = '', baseServer, port = '', headers = {} } = algod\n      const newClient = new algosdk.Algodv2(token, baseServer, port, headers)\n      setAlgodClient(newClient)\n    }\n  }\n\n  return {\n    activeNetwork,\n    networkConfig: manager.networkConfig,\n    activeNetworkConfig: manager.activeNetworkConfig,\n    setActiveNetwork,\n    updateAlgodConfig,\n    resetNetworkConfig\n  }\n}\n\nexport interface Wallet {\n  id: WalletId\n  metadata: WalletMetadata\n  accounts: WalletAccount[]\n  activeAccount: WalletAccount | null\n  isConnected: boolean\n  isActive: boolean\n  connect: (args?: Record<string, any>) => Promise<WalletAccount[]>\n  disconnect: () => Promise<void>\n  setActive: () => void\n  setActiveAccount: (address: string) => void\n}\n\nexport const useWallet = () => {\n  const context = React.useContext(WalletContext)\n\n  if (!context) {\n    throw new Error('useWallet must be used within the WalletProvider')\n  }\n\n  const { manager, algodClient, setAlgodClient } = context\n\n  const managerStatus = useStore(manager.store, (state) => state.managerStatus)\n  const isReady = managerStatus === 'ready'\n\n  const walletStateMap = useStore(manager.store, (state) => state.wallets)\n  const activeWalletId = useStore(manager.store, (state) => state.activeWallet)\n\n  const transformToWallet = React.useCallback(\n    (wallet: BaseWallet): Wallet => {\n      const walletState = walletStateMap[wallet.id]\n      return {\n        id: wallet.id,\n        metadata: wallet.metadata,\n        accounts: walletState?.accounts ?? [],\n        activeAccount: walletState?.activeAccount ?? null,\n        isConnected: !!walletState,\n        isActive: wallet.id === activeWalletId,\n        connect: (args) => wallet.connect(args),\n        disconnect: () => wallet.disconnect(),\n        setActive: () => wallet.setActive(),\n        setActiveAccount: (addr) => wallet.setActiveAccount(addr)\n      }\n    },\n    [walletStateMap, activeWalletId]\n  )\n\n  const wallets = React.useMemo(() => {\n    return [...manager.wallets.values()].map(transformToWallet)\n  }, [manager, transformToWallet])\n\n  const activeBaseWallet = activeWalletId ? manager.getWallet(activeWalletId) || null : null\n  const activeWallet = React.useMemo(() => {\n    return activeBaseWallet ? transformToWallet(activeBaseWallet) : null\n  }, [activeBaseWallet, transformToWallet])\n\n  const activeWalletAccounts = activeWallet?.accounts ?? null\n  const activeWalletAddresses = activeWalletAccounts?.map((account) => account.address) ?? null\n  const activeAccount = activeWallet?.activeAccount ?? null\n  const activeAddress = activeAccount?.address ?? null\n\n  const signTransactions = <T extends algosdk.Transaction[] | Uint8Array[]>(\n    txnGroup: T | T[],\n    indexesToSign?: number[]\n  ): Promise<(Uint8Array | null)[]> => {\n    if (!activeBaseWallet) {\n      throw new Error('No active wallet')\n    }\n    return activeBaseWallet.signTransactions(txnGroup, indexesToSign)\n  }\n\n  const transactionSigner = (\n    txnGroup: algosdk.Transaction[],\n    indexesToSign: number[]\n  ): Promise<Uint8Array[]> => {\n    if (!activeBaseWallet) {\n      throw new Error('No active wallet')\n    }\n    return activeBaseWallet.transactionSigner(txnGroup, indexesToSign)\n  }\n\n  return {\n    wallets,\n    isReady,\n    algodClient,\n    setAlgodClient,\n    activeWallet,\n    activeWalletAccounts,\n    activeWalletAddresses,\n    activeAccount,\n    activeAddress,\n    signTransactions,\n    transactionSigner\n  }\n}\n"],"mappings":"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","names":["algosdk"]}