import React, { useState, useEffect } from 'react'; import { useTranslation } from 'react-i18next'; import { Shield, Users, CheckCircle, XCircle, ExternalLink } from 'lucide-react'; import { Card } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Alert, AlertDescription } from '@/components/ui/alert'; import { usePezkuwi } from '@/contexts/PezkuwiContext'; import { getMultisigMemberInfo, calculateMultisigAddress, USDT_MULTISIG_CONFIG, formatMultisigAddress, } from '@pezkuwi/lib/multisig'; import { getTikiDisplayName, getTikiEmoji } from '@pezkuwi/lib/tiki'; interface MultisigMembersProps { specificAddresses?: Record; showMultisigAddress?: boolean; } interface MultisigMember { address: string; displayName: string; emoji: string; role: string; isTiki: boolean; trustScore?: number; balance?: string; } export const MultisigMembers: React.FC = ({ specificAddresses = {}, showMultisigAddress = true, }) => { const { t } = useTranslation(); const { api, isApiReady } = usePezkuwi(); const [members, setMembers] = useState([]); const [multisigAddress, setMultisigAddress] = useState(''); const [loading, setLoading] = useState(true); useEffect(() => { if (!api || !isApiReady) return; const fetchMembers = async () => { setLoading(true); try { const memberInfo = await getMultisigMemberInfo(api, specificAddresses); setMembers(memberInfo); // Calculate multisig address const addresses = memberInfo.map((m) => m.address); if (addresses.length > 0) { const multisig = calculateMultisigAddress(addresses); setMultisigAddress(multisig); } } catch (error) { if (import.meta.env.DEV) console.error('Error fetching multisig members:', error); } finally { setLoading(false); } }; fetchMembers(); }, [api, isApiReady, specificAddresses]); if (loading) { return (
); } return ( {/* Header */}

{t('multisigMembers.title')}

{t('multisigMembers.threshold', { threshold: USDT_MULTISIG_CONFIG.threshold, total: members.length })}

{t('multisigMembers.members', { count: members.length })}
{/* Multisig Address */} {showMultisigAddress && multisigAddress && (

{t('multisigMembers.account')}

{formatMultisigAddress(multisigAddress)}
)} {/* Members List */}
{members.map((member, index) => (
{getTikiEmoji(member.tiki)}

{member.role}

{getTikiDisplayName(member.tiki)} {member.isUnique && ( {t('multisigMembers.onChain')} )}
{member.address.slice(0, 6)}...{member.address.slice(-4)}
{member.isUnique ? ( ) : ( )}
))}
{/* Info Alert */}

{t('multisigMembers.securityTitle')}

  • • {t('multisigMembers.sigRequired', { threshold: USDT_MULTISIG_CONFIG.threshold, total: members.length })}
  • • {t('multisigMembers.verifiedOnChain', { count: members.filter(m => m.isUnique).length })}
  • • {t('multisigMembers.noSingleControl')}
  • • {t('multisigMembers.allVisible')}
{/* Explorer Link */} {multisigAddress && (
{t('multisigMembers.viewExplorer')}
)}
); };