import React, { useState, useEffect } from 'react'; import { useTranslation } from 'react-i18next'; import { Wallet, Chrome, ExternalLink, Copy, Check, LogOut, Award, Users, TrendingUp, Shield, Smartphone } from 'lucide-react'; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, } from '@/components/ui/dialog'; import { Button } from '@/components/ui/button'; import { usePezkuwi } from '@/contexts/PezkuwiContext'; import { formatAddress } from '@pezkuwi/lib/wallet'; import { getAllScores, type UserScores } from '@pezkuwi/lib/scores'; import { WalletConnectModal } from './WalletConnectModal'; interface WalletModalProps { isOpen: boolean; onClose: () => void; } export const WalletModal: React.FC = ({ isOpen, onClose }) => { const { accounts, selectedAccount, setSelectedAccount, connectWallet, disconnectWallet, api, isApiReady, peopleApi, walletSource, wcPeerName, error } = usePezkuwi(); const { t } = useTranslation(); const [copied, setCopied] = useState(false); const [showWCModal, setShowWCModal] = useState(false); const [scores, setScores] = useState({ trustScore: 0, referralScore: 0, stakingScore: 0, tikiScore: 0, totalScore: 0 }); const [loadingScores, setLoadingScores] = useState(false); const handleCopyAddress = () => { if (selectedAccount?.address) { navigator.clipboard.writeText(selectedAccount.address); setCopied(true); setTimeout(() => setCopied(false), 2000); } }; const handleConnect = async () => { await connectWallet(); }; const handleSelectAccount = (account: typeof accounts[0]) => { setSelectedAccount(account); onClose(); }; const handleDisconnect = () => { disconnectWallet(); onClose(); }; // Fetch all scores from blockchain useEffect(() => { const fetchAllScores = async () => { if (!api || !isApiReady || !selectedAccount?.address) { setScores({ trustScore: 0, referralScore: 0, stakingScore: 0, tikiScore: 0, totalScore: 0 }); return; } setLoadingScores(true); try { const userScores = await getAllScores(peopleApi || null, selectedAccount.address); setScores(userScores); } catch (err) { if (import.meta.env.DEV) console.error('Failed to fetch scores:', err); setScores({ trustScore: 0, referralScore: 0, stakingScore: 0, tikiScore: 0, totalScore: 0 }); } finally { setLoadingScores(false); } }; fetchAllScores(); }, [api, isApiReady, peopleApi, selectedAccount]); return ( {selectedAccount ? t('walletModal.connected') : t('walletModal.connect')} {selectedAccount ? t('walletModal.manageAccount') : t('walletModal.connectDesc')} {/* Authorization Error - Extension installed but not authorized */} {error && error.includes('authorize') && (

{error}

)} {/* No Extension Error - Extension not installed */} {error && error.includes('not found') && (

{error}

{t('walletModal.afterInstall')}

)} {/* Connected State */} {selectedAccount && !error && (
{/* Account Info */}
{t('walletModal.accountName')}
{selectedAccount.meta.name || t('walletModal.unnamed')}
{t('walletModal.address')}
{formatAddress(selectedAccount.address)}
{t('walletModal.scoresFromBlockchain')}
{loadingScores ? (
{t('walletModal.loadingScores')}
) : (
{t('walletModal.trust')}
{scores.trustScore}
{t('walletModal.referral')}
{scores.referralScore}
{t('walletModal.staking')}
{scores.stakingScore}
{t('walletModal.tiki')}
{scores.tikiScore}
)}
{t('walletModal.totalScore')} {loadingScores ? '...' : scores.totalScore}
{t('walletModal.source')}
{walletSource === 'walletconnect' ? ( <> WalletConnect{wcPeerName ? ` (${wcPeerName})` : ''} ) : ( selectedAccount.meta.source || 'pezkuwi' )}
{/* Actions */}
{/* Switch Account */} {accounts.length > 1 && (
{t('walletModal.switchAccount')}
{accounts.map((account) => ( ))}
)}
)} {/* Not Connected State */} {!selectedAccount && !error && (
{accounts.length > 0 ? ( // Has accounts, show selection
{t('walletModal.selectAccount')}
{accounts.map((account) => ( ))}
) : ( // No accounts, show connect buttons
{t('walletModal.or', 'or')}
{t('walletModal.noWallet')}{' '} {t('walletModal.getFromStore')}
)}
)}
{/* WalletConnect QR Modal */} { setShowWCModal(false); // If connected via WC, close the main modal too if (selectedAccount) onClose(); }} />
); };