/* eslint-disable react/no-unstable-nested-components */

import { createColumnHelper } from '@tanstack/react-table';
import { useParams } from 'react-router-dom';
import { Account, AmountDenom } from 'src/components';
import Display from 'src/components/containerGradient/Display/Display';
import DisplayTitle from 'src/components/containerGradient/DisplayTitle/DisplayTitle';
import IconsNumber from 'src/components/IconsNumber/IconsNumber';
import MusicalAddress from 'src/components/MusicalAddress/MusicalAddress';
import Table from 'src/components/Table/Table';
import AdviserHoverWrapper from 'src/features/adviser/AdviserHoverWrapper/AdviserHoverWrapper';
import useAdviserTexts from 'src/features/adviser/useAdviserTexts';
import { Delegator, Delegator as DelegatorType } from 'src/features/cybernet/types';
import { selectCurrentAddress } from 'src/redux/features/pocket';
import { useAppSelector } from 'src/redux/hooks';
import { SubnetPreviewGroup } from '../../components/SubnetPreview/SubnetPreview';
import useDelegate from '../../hooks/useDelegate';
import useCybernetTexts from '../../useCybernetTexts';
import subnetStyles from '../Subnet/Subnet.module.scss';
import styles from './Delegate.module.scss';
import DelegateActionBar from './DelegateActionBar/DelegateActionBar';

const columnHelper = createColumnHelper<Delegator>();

const config: keyof DelegatorType = {
  take: {
    text: 'Commission',
  },
  validator_permits: {
    text: 'Validator permits',
  },
  total_daily_return: {
    text: 'Total daily return',
  },
  return_per_1000: {
    text: 'Return per 1000 ๐ŸŸฃ',
  },
};

function Delegator() {
  const { id } = useParams();

  const currentAddress = useAppSelector(selectCurrentAddress);

  const address = id !== 'my' ? id : currentAddress;

  const { loading, data, error, refetch } = useDelegate(address);
  const { getText } = useCybernetTexts();

  useAdviserTexts({
    isLoading: loading,
    loadingText: `loading ${getText('delegate')}`,
    error,
    defaultText: `${getText('delegate')} info`,
  });

  const myStake = data?.nominators.find(([address]) => address === currentAddress)?.[1];

  const nominators = data?.nominators;

  const totalStake = nominators?.reduce((acc, [, stake]) => acc + stake, 0);

  return (
    <>
      {myStake && data.delegate !== currentAddress && (
        <Display title={<DisplayTitle title="My stake" />}>
          <AmountDenom amountValue={myStake} denom="pussy" />
        </Display>
      )}

      <Display noPadding title={<DisplayTitle title={<MusicalAddress address={address} />} />}>
        {!loading && !data && (
          <div
            style={{
              textAlign: 'center',
            }}
          >
            no {getText('delegate')} found, or staking not enabled
          </div>
        )}

        <ul className={subnetStyles.list}>
          {data &&
            Object.keys(data)
              .filter((item) => !['nominators', 'delegate'].includes(item))
              .map((item) => {
                const value = data[item];
                let content = value;

                if (item === 'owner') {
                  content = <Account avatar address={value} markCurrentAddress />;
                }

                if (item === 'take') {
                  content = <span>{(value / 65535).toFixed(2) * 100}%</span>;
                }

                if (['total_daily_return', 'return_per_1000', 'return_per_giga'].includes(item)) {
                  content = (
                    <div>
                      <IconsNumber value={value.amount} type="pussy" />
                    </div>
                  );
                }

                if (item === 'registrations' || item === 'validator_permits') {
                  content = (
                    <ul className={styles.list}>
                      <SubnetPreviewGroup uids={value} />
                    </ul>
                  );
                }

                return (
                  <li key={item}>
                    {config[item]?.text || item}: {content}
                  </li>
                );
              })}
        </ul>
      </Display>

      {!!nominators?.length && (
        <Display
          noPadding
          title={
            <DisplayTitle
              title={
                <div className={styles.nominatorsHeader}>
                  <AdviserHoverWrapper adviserContent="learners">
                    <h3>{getText('delegator', true)}</h3>
                  </AdviserHoverWrapper>

                  <div>
                    <IconsNumber value={totalStake} type="pussy" />
                  </div>
                </div>
              }
            />
          }
        >
          <Table
            columns={[
              columnHelper.accessor('address', {
                header: getText('delegator'),
                enableSorting: false,
                cell: (info) => <Account address={info.getValue()} avatar markCurrentAddress />,
              }),
              columnHelper.accessor('amount', {
                header: 'teach power',
                cell: (info) => {
                  const value = info.getValue();

                  return (
                    <div
                      style={{
                        display: 'flex',
                        justifyContent: 'flex-end',
                      }}
                    >
                      <IconsNumber value={value} type="pussy" />
                    </div>
                  );
                },
              }),
            ]}
            data={nominators.map(([address, amount]) => {
              return {
                address,
                amount,
              };
            })}
            initialState={{
              sorting: [
                {
                  id: 'amount',
                  desc: true,
                },
              ],
            }}
          />
        </Display>
      )}

      <DelegateActionBar address={address} stakedAmount={myStake} onSuccess={refetch} />
    </>
  );
}

export default Delegator;

Synonyms

cyb/src/pages/Sphere/pages/components/ActionBarContainer/components/Delegate/Delegate.tsx

Neighbours