import React, { useState, useEffect } from 'react'; import { View, Text, FlatList, ActivityIndicator, Alert, StyleSheet, TouchableOpacity } from 'react-native'; import { BottomSheet, Button } from './index'; // Assuming these are exported from index.ts or index.tsx in the same folder import { usePezkuwi } from '../contexts/PezkuwiContext'; import { KurdistanColors, AppColors } from '../theme/colors'; interface Validator { address: string; commission: number; totalStake: string; // Formatted balance selfStake: string; // Formatted balance nominators: number; // Add other relevant validator info } interface ValidatorSelectionSheetProps { visible: boolean; onClose: () => void; onConfirmNominations: (validators: string[]) => void; // Add other props like currentNominations if needed } export function ValidatorSelectionSheet({ visible, onClose, onConfirmNominations, }: ValidatorSelectionSheetProps) { const { api, isApiReady } = usePezkuwi(); const [validators, setValidators] = useState([]); const [loading, setLoading] = useState(true); const [processing, _setProcessing] = useState(false); const [selectedValidators, setSelectedValidators] = useState([]); // Fetch real validators from chain useEffect(() => { const fetchValidators = async () => { if (!api || !isApiReady) return; setLoading(true); try { const chainValidators: Validator[] = []; // Attempt to fetch from pallet-validator-pool first if (api.query.validatorPool && api.query.validatorPool.validators) { const rawValidators = await api.query.validatorPool.validators(); const validatorList = rawValidators.toHuman() as string[]; for (const rawValidator of validatorList) { chainValidators.push({ address: String(rawValidator), commission: 0.05, totalStake: '0 HEZ', selfStake: '0 HEZ', nominators: 0, }); } } else { // Fallback to session validators const sessionValidators = await api.query.session.validators(); const validatorAddresses = sessionValidators.toJSON() as string[]; for (const address of validatorAddresses) { const validatorPrefs = await api.query.staking.validators(address); const prefsJson = validatorPrefs.toJSON() as { commission?: number } | null; const commission = prefsJson?.commission ? Number(prefsJson.commission) / 1_000_000_000 : 0.05; chainValidators.push({ address: address, commission: commission, totalStake: 'Fetching...', selfStake: 'Fetching...', nominators: 0, }); } } setValidators(chainValidators); } catch (error) { if (__DEV__) console.error('Error fetching validators:', error); Alert.alert('Error', 'Failed to fetch validators.'); } finally { setLoading(false); } }; fetchValidators(); }, [api, isApiReady]); const toggleValidatorSelection = (address: string) => { setSelectedValidators(prev => prev.includes(address) ? prev.filter(item => item !== address) : [...prev, address] ); }; const handleConfirm = () => { if (selectedValidators.length === 0) { Alert.alert('Selection Required', 'Please select at least one validator.'); return; } // Pass selected validators to parent component to initiate transaction onConfirmNominations(selectedValidators); onClose(); }; const renderValidatorItem = ({ item }: { item: Validator }) => ( toggleValidatorSelection(item.address)} > {item.address.substring(0, 8)}...{item.address.substring(item.address.length - 6)} Commission: {item.commission * 100}% Total Stake: {item.totalStake} Self Stake: {item.selfStake} Nominators: {item.nominators} {selectedValidators.includes(item.address) && ( )} ); return ( {loading ? ( ) : ( item.address} renderItem={renderValidatorItem} style={styles.list} /> )}