// Copyright 2017-2025 @pezkuwi/app-council authors & contributors // SPDX-License-Identifier: Apache-2.0 import type { DeriveElectionsInfo } from '@pezkuwi/api-derive/types'; import type { BN } from '@pezkuwi/util'; import React, { useEffect, useMemo, useState } from 'react'; import { Button, InputAddress, InputAddressMulti, InputBalance, Modal, TxButton, VoteValue } from '@pezkuwi/react-components'; import { useApi, useToggle } from '@pezkuwi/react-hooks'; import { BN_ZERO } from '@pezkuwi/util'; import { useTranslation } from '../translate.js'; import { useModuleElections } from '../useModuleElections.js'; interface Props { className?: string; electionsInfo?: DeriveElectionsInfo; } const MAX_VOTES = 16; function Vote ({ electionsInfo }: Props): React.ReactElement | null { const { t } = useTranslation(); const { api } = useApi(); const [isVisible, toggleVisible] = useToggle(); const [accountId, setAccountId] = useState(null); const [available, setAvailable] = useState([]); const [defaultVotes, setDefaultVotes] = useState([]); const [votes, setVotes] = useState([]); const [voteValue, setVoteValue] = useState(BN_ZERO); const modLocation = useModuleElections(); useEffect((): void => { if (electionsInfo) { const { candidates, members, runnersUp } = electionsInfo; setAvailable( members .map(([accountId]) => accountId.toString()) .concat(runnersUp.map(([accountId]) => accountId.toString())) .concat(candidates.map((accountId) => accountId.toString())) ); } }, [electionsInfo]); useEffect((): void => { accountId && api.derive.council .votesOf(accountId) .then(({ votes }): void => { setDefaultVotes( votes .map((a) => a.toString()) .filter((a) => available.includes(a)) ); }) .catch(console.error); }, [api, accountId, available]); const bondValue = useMemo( (): BN | undefined => { const location = api.consts.elections || api.consts.phragmenElection || api.consts.electionsPhragmen; return location && location.votingBondBase && location.votingBondBase.add(location.votingBondFactor.muln(votes.length)); }, [api, votes] ); if (!modLocation) { return null; } return ( <>