File size: 1,896 Bytes
78d0e31
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
"use client"

import type React from "react"
import { createContext, useContext, useEffect, useState } from "react"
import { getCeloWalletManager, type WalletState } from "@/lib/celo-wallet"

interface WalletContextType extends WalletState {
  connectWallet: () => Promise<boolean>
  disconnect: () => void
  switchNetwork: (network: "mainnet" | "alfajores") => Promise<boolean>
  updateBalance: () => Promise<void>
  mintFLBTokens: (amount?: string) => Promise<string>
}

const WalletContext = createContext<WalletContextType | null>(null)

export function WalletProvider({ children }: { children: React.ReactNode }) {
  const [walletState, setWalletState] = useState<WalletState>(() => ({
    connected: false,
    address: null,
    chainId: null,
    balance: { celo: "0", flb: "0" },
    provider: null,
    signer: null,
    isConnecting: false,
    error: null,
  }))

  const [walletManager] = useState(() => getCeloWalletManager())

  useEffect(() => {
    if (typeof window === "undefined") return

    setWalletState(walletManager.getState())

    const unsubscribe = walletManager.subscribe(setWalletState)

    return unsubscribe
  }, [walletManager])

  const contextValue: WalletContextType = {
    ...walletState,
    connectWallet: walletManager.connectWallet.bind(walletManager),
    disconnect: walletManager.disconnect.bind(walletManager),
    switchNetwork: walletManager.switchToCeloNetwork.bind(walletManager),
    updateBalance: walletManager.updateBalance.bind(walletManager),
    mintFLBTokens: walletManager.mintFLBTokens.bind(walletManager),
  }

  return <WalletContext.Provider value={contextValue}>{children}</WalletContext.Provider>
}

export function useWallet() {
  const context = useContext(WalletContext)
  if (!context) {
    throw new Error("useWallet must be used within a WalletProvider")
  }
  return context
}

export const useWalletContext = useWallet