From d683916c16af9d962209263a94c76a8bc6d7fcc7 Mon Sep 17 00:00:00 2001 From: ayomaska18 Date: Sat, 26 Oct 2024 22:53:26 +0100 Subject: [PATCH] fixed wallet button connection and disconnection --- components/scripts/MetaMask.tsx | 164 +++++++++++++++++--------------- lib/buyHandler.ts | 1 - package-lock.json | 2 - 3 files changed, 88 insertions(+), 79 deletions(-) diff --git a/components/scripts/MetaMask.tsx b/components/scripts/MetaMask.tsx index 4794a02..c3dab32 100644 --- a/components/scripts/MetaMask.tsx +++ b/components/scripts/MetaMask.tsx @@ -1,102 +1,114 @@ 'use client'; import React, { useEffect, useState } from 'react'; -import { useSDK, MetaMaskProvider } from '@metamask/sdk-react'; -import { Button } from '@/components/ui/button'; -import { - Popover, - PopoverContent, - PopoverTrigger, -} from '@/components/ui/popover'; -function WalletIcon(props: React.SVGProps) { - return ( - - - - - - ); -} - -function formatAddress(address: string | undefined): string { - if (!address) return ''; - return `${address.slice(0, 6)}...${address.slice(-4)}`; +declare global { + interface Window { + ethereum?: { + isMetaMask?: boolean; + request: (request: { + method: string; + params?: Array; // Use `unknown` instead of `any` + }) => Promise; // Specify a more accurate return type if possible + }; + } } function MetaMaskConnect() { - const { sdk, connected, connecting, account } = useSDK(); - const [isConnected, setIsConnected] = useState(false); + const [isConnected, setIsConnected] = useState(false); + const [account, setAccount] = useState(null); + // Initial check on load useEffect(() => { - setIsConnected(connected); - }, [connected]); + const checkConnection = async () => { + if (typeof window !== 'undefined' && window.ethereum) { + try { + // Check if there are any accounts already connected + const accounts = (await window.ethereum.request({ + method: 'eth_accounts', + })) as string[]; + if (accounts && accounts.length > 0) { + setIsConnected(true); + setAccount(accounts[0]); + localStorage.setItem('isConnected', JSON.stringify(true)); + localStorage.setItem('account', accounts[0]); + } else { + // No connected accounts found; check `localStorage` + const storedIsConnected = JSON.parse( + localStorage.getItem('isConnected') || 'false' + ); + const storedAccount = localStorage.getItem('account') || null; + setIsConnected(storedIsConnected); + setAccount(storedAccount); + } + } catch (error) { + console.error('Error checking MetaMask connection:', error); + } + } + }; + + checkConnection(); + }, []); + + // Update localStorage whenever connection state changes + useEffect(() => { + if (typeof window !== 'undefined') { + localStorage.setItem('isConnected', JSON.stringify(isConnected)); + localStorage.setItem('account', account || ''); + } + }, [isConnected, account]); const connect = async () => { try { - await sdk?.connect(); - setIsConnected(true); - } catch (err) { - console.warn(`No accounts found`, err); + const accounts = (await window.ethereum?.request({ + method: 'eth_requestAccounts', + })) as string[]; + if (accounts && accounts.length > 0) { + setIsConnected(true); + setAccount(accounts[0]); + localStorage.setItem('isConnected', JSON.stringify(true)); + localStorage.setItem('account', accounts[0]); + } + } catch (error) { + console.error('MetaMask connection failed:', error); } }; - const disconnect = () => { - if (sdk) { - sdk.terminate(); - setIsConnected(false); - } + const disconnect = async () => { + setIsConnected(false); + setAccount(null); + localStorage.setItem('isConnected', JSON.stringify(false)); + localStorage.removeItem('account'); + await window.ethereum?.request({ + method: 'wallet_revokePermissions', + params: [{ eth_accounts: {} }], + }); }; return (
{isConnected ? ( - - - - - - - - +
+ + + {account && `${account.slice(0, 6)}...${account.slice(-4)}`} + +
) : ( - + )}
); } -export default function MetaMaskConnectWrapper() { - return ( - - - - ); -} +export default MetaMaskConnect; diff --git a/lib/buyHandler.ts b/lib/buyHandler.ts index 0f8530d..401123d 100644 --- a/lib/buyHandler.ts +++ b/lib/buyHandler.ts @@ -33,7 +33,6 @@ export const buyHandler = async ( return; } - // @ts-expect-error: window.ethereum might not match ExternalProvider exactly const provider = new ethers.providers.Web3Provider(window.ethereum); const signer = provider.getSigner(); const contract = getContract().connect(signer); diff --git a/package-lock.json b/package-lock.json index 64643f4..0ab47cb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13050,7 +13050,6 @@ "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.5.tgz", "integrity": "sha512-HTm14iMQKK2FjFLRTM5lAVcyaUzOnqbPtesFIvREgXpJHdQm8bWS+GkQgIkfaBYRHuCnea7w8UVNfwiAQhlr9A==", "dev": true, - "hasInstallScript": true, "optional": true, "dependencies": { "node-gyp-build": "^4.3.0" @@ -13413,7 +13412,6 @@ "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.7.tgz", "integrity": "sha512-vLt1O5Pp+flcArHGIyKEQq883nBt8nN8tVBcoL0qUXj2XT1n7p70yGIq2VK98I5FdZ1YHc0wk/koOnHjnXWk1Q==", "dev": true, - "hasInstallScript": true, "optional": true, "dependencies": { "node-gyp-build": "^4.3.0"