This document describes the implementation of global Web3 state management using Zustand in the TradeFlow-Web application.
The useWeb3Store provides a centralized state management solution for Web3 functionality, eliminating prop drilling and ensuring real-time blockchain data access across all components.
- connectWallet(): Connect to Freighter wallet
- disconnectWallet(): Disconnect and clear state
- isConnecting: Loading state during connection
- error: Comprehensive error handling
- switchNetwork(): Switch between Testnet and Mainnet
- network: Current active network
- NETWORKS: Predefined network constants
- updateBalances(): Fetch all token balances from Stellar
- updateTokenBalance(): Update specific token balance
- balances: Record of all token balances
- useTokenBalance(): Hook for specific token balance
- useWalletConnection(): Wallet-related state and actions
- useNetwork(): Network state and switching
- useBalances(): Balance state and updates
- useTokenBalance(tokenCode): Specific token balance
import { useWalletConnection } from '../stores/useWeb3Store';
function WalletButton() {
const { isConnected, connectWallet, disconnectWallet, isConnecting } = useWalletConnection();
return (
<button onClick={isConnected ? disconnectWallet : connectWallet}>
{isConnecting ? 'Connecting...' : isConnected ? 'Disconnect' : 'Connect Wallet'}
</button>
);
}import { useNetwork, NETWORKS } from '../stores/useWeb3Store';
function NetworkSelector() {
const { network, switchNetwork } = useNetwork();
return (
<div>
<button onClick={() => switchNetwork(NETWORKS.TESTNET)}>
Testnet
</button>
<button onClick={() => switchNetwork(NETWORKS.MAINNET)}>
Mainnet
</button>
<p>Current: {network}</p>
</div>
);
}import { useBalances, useTokenBalance } from '../stores/useWeb3Store';
function TokenBalances() {
const { balances, updateBalances, isLoading } = useBalances();
const xlmBalance = useTokenBalance('XLM');
return (
<div>
<p>XLM: {xlmBalance.toFixed(7)}</p>
<button onClick={updateBalances} disabled={isLoading}>
{isLoading ? 'Updating...' : 'Refresh'}
</button>
</div>
);
}interface Web3State {
// Wallet connection
walletAddress: string | null;
isConnected: boolean;
isConnecting: boolean;
// Network
network: NetworkType; // 'Testnet' | 'Mainnet'
// Token balances
balances: Record<string, number>;
// Loading and error states
isLoading: boolean;
error: string | null;
}connectWallet(): Promise<void>- Connect to Freighter walletdisconnectWallet(): void- Disconnect and clear state
switchNetwork(network: NetworkType): Promise<void>- Switch networks
updateBalances(): Promise<void>- Fetch all balancesupdateTokenBalance(tokenCode: string, balance: number): void- Update specific token
clearError(): void- Clear error statesetLoading(loading: boolean): void- Set loading state
The new Zustand store can replace existing React Context providers:
// Before - using Context
const { walletAddress } = useWalletContext();
// After - using Zustand
const { walletAddress } = useWalletConnection();- Phase 1: Add Zustand store alongside existing context
- Phase 2: Gradually migrate components to use Zustand hooks
- Phase 3: Remove old context providers
The store includes comprehensive error handling:
- Wallet installation checks
- Connection failures
- Network switching errors
- Balance fetching issues
All errors are stored in the error state and can be accessed via:
const { error, clearError } = useWeb3Store();A test component Web3TestComponent.tsx is provided to verify all functionality:
- Wallet connection/disconnection
- Network switching
- Balance fetching and display
- Error state handling
- No Prop Drilling: Any component can access Web3 state directly
- Real-time Updates: All components update automatically when state changes
- TypeScript Support: Full type safety with interfaces
- Performance: Selective subscriptions prevent unnecessary re-renders
- Developer Experience: Easy-to-use hooks and clear API
src/
├── stores/
│ ├── useWeb3Store.ts # Main Web3 store
│ └── tokenStore.ts # Existing token store (can be integrated)
├── components/
│ └── Web3TestComponent.tsx # Testing component
- Multi-wallet Support: Add support for other Stellar wallets
- Transaction History: Store and manage transaction history
- Persistence: Add localStorage for wallet preference
- Middleware: Add devtools and persistence middleware
- Optimistic Updates: Implement optimistic balance updates