/* eslint-disable react/no-unstable-nested-components */
import { createColumnHelper } from '@tanstack/react-table';
import { useMemo } from 'react';
import { useLocation, useNavigate } from 'react-router-dom';
import { Account } from 'src/components';
import Table from 'src/components/Table/Table';
import { tableIDs } from 'src/components/Table/tableIDs';
import { Delegator } from 'src/features/cybernet/types';
import useCurrentAddress from 'src/hooks/useCurrentAddress';
import IconsNumber from '../../../../../../components/IconsNumber/IconsNumber';
import { SubnetPreviewGroup } from '../../../components/SubnetPreview/SubnetPreview';
import { useCybernet } from '../../../cybernet.context';
import useCurrentAccountStake from '../../../hooks/useCurrentAccountStake';
import { useDelegates } from '../../../hooks/useDelegate';
import { cybernetRoutes } from '../../../routes';
import useCybernetTexts from '../../../useCybernetTexts';
type Props = {};
const columnHelper = createColumnHelper<Delegator>();
const columnsIds = {
stake: 'stake',
myStake: 'myStake',
};
function DelegatesTable({}: Props) {
const currentAddress = useCurrentAddress();
const { getText } = useCybernetTexts();
const { pathname } = useLocation();
// maybe use props, think
const isMyLearnerPage = pathname.includes('learners/my');
const stakeQuery = useCurrentAccountStake({
skip: !isMyLearnerPage,
});
const { data, loading: isLoading } = useDelegates();
const { selectedContract, subnetsQuery } = useCybernet();
const contractName = selectedContract?.metadata?.name;
function getTotalStake(nominators: Delegator['nominators']) {
return nominators.reduce((acc, [, stake]) => acc + stake, 0);
}
function getMyStake(nominators: Delegator['nominators']) {
return nominators.find(([address]) => address === currentAddress)?.[1];
}
// maybe rename
function getYieldValue(value: number) {
return Number(((value / 1_000_000_000) * 100 * 365).toFixed(2));
}
const _subnets = subnetsQuery.data || [];
const navigate = useNavigate();
const columns = useMemo(() => {
const cols = [
columnHelper.accessor('delegate', {
header: getText('delegate'),
enableSorting: false,
cell: (info) => {
const address = info.getValue();
return (
<Account
address={address}
avatar
markCurrentAddress
link={cybernetRoutes.delegator.getLink('pussy', contractName, address)}
/>
);
},
}),
columnHelper.accessor('return_per_giga', {
header: 'yield',
sortingFn: (rowA, rowB) => {
const a = getYieldValue(rowA.original.return_per_giga.amount);
const b = getYieldValue(rowB.original.return_per_giga.amount);
return a - b;
},
cell: (info) => {
const value = info.getValue();
const yieldVal = getYieldValue(value.amount);
return `${yieldVal}%`;
},
}),
columnHelper.accessor('registrations', {
header: getText('subnetwork', true),
sortingFn: (rowA, rowB) => {
const a = rowA.original.registrations.length;
const b = rowB.original.registrations.length;
return a - b;
},
cell: (info) => {
const value = info.getValue();
return (
<div
style={{
display: 'flex',
justifyContent: 'center',
}}
>
<SubnetPreviewGroup uids={value} />
</div>
);
},
}),
columnHelper.accessor('nominators', {
header: 'teach power',
id: columnsIds.stake,
sortingFn: (rowA, rowB) => {
const totalA = getTotalStake(rowA.original.nominators);
const totalB = getTotalStake(rowB.original.nominators);
return totalA - totalB;
},
cell: (info) => {
const nominators = info.getValue();
const total = getTotalStake(nominators);
return <IconsNumber value={total} type="pussy" />;
},
}),
columnHelper.accessor('nominators', {
header: 'my stake',
id: columnsIds.myStake,
sortingFn: (rowA, rowB) => {
const myStakeA = getMyStake(rowA.original.nominators) || 0;
const myStakeB = getMyStake(rowB.original.nominators) || 0;
return myStakeA - myStakeB;
},
cell: (info) => {
const nominators = info.getValue();
const myStake = getMyStake(nominators);
if (!myStake) {
return null;
}
return <IconsNumber value={myStake} type="pussy" />;
},
}),
];
if (isMyLearnerPage) {
// cols.push()
}
return cols;
}, [getText, contractName, isMyLearnerPage, getMyStake, getTotalStake, getYieldValue]);
// use 1 loop
const myMentors =
stakeQuery.data?.filter(({ stake }) => stake > 0)?.map((stake) => stake.hotkey) || [];
const renderData = !isMyLearnerPage
? data
: data?.filter((mentor) => myMentors.includes(mentor.delegate));
return (
<Table
id={tableIDs.cyberver.delegates}
onSelect={(row) => {
const index = Number(row);
const { owner } = renderData!.find((_, i) => i === index)!;
navigate(cybernetRoutes.delegator.getLink('pussy', contractName, owner));
}}
columns={columns}
data={renderData || []}
isLoading={isLoading}
initialState={{
sorting: [
{
id: columnsIds[!isMyLearnerPage ? 'stake' : 'myStake'],
desc: true,
},
],
}}
/>
);
}
export default DelegatesTable;