import { useState, useEffect } from 'react';
import { Link } from 'react-router-dom';
import { Pane } from '@cybercongress/gravity';
import { useQueryClient } from 'src/contexts/queryClient';
import ActionBar from './actionBar';
import { getProposals, getMinDeposit } from '../../utils/governance';
import Columns from './components/columns';
import { AcceptedCard, ActiveCard, RejectedCard } from './components/card';
import { CardStatisics } from '../../components';
import { CYBER, PROPOSAL_STATUS } from '../../utils/config';
import { formatNumber, coinDecimals } from '../../utils/utils';
import { useAdviser } from 'src/features/adviser/context';

const dateFormat = require('dateformat');

function Statistics({ communityPoolCyber, staked }) {
  return (
    <Pane
      marginTop={10}
      marginBottom={50}
      display="grid"
      gridTemplateColumns="repeat(auto-fit, minmax(250px, 1fr))"
      gridGap="20px"
    >
      <CardStatisics
        title={`Community pool, ${CYBER.DENOM_CYBER.toUpperCase()}`}
        value={formatNumber(Math.floor(communityPoolCyber))}
      />
      <Link to="/sphere">
        <CardStatisics
          title="% of staked BOOT"
          value={formatNumber(staked * 100)}
          link
        />
      </Link>
      <Link to="/network/bostrom/parameters">
        <CardStatisics title="Network parameters" value={53} link />
      </Link>
    </Pane>
  );
}

function Governance() {
  const queryClient = useQueryClient();
  const [tableData, setTableData] = useState([]);
  const [minDeposit, setMinDeposit] = useState(0);
  const [communityPoolCyber, setCommunityPoolCyber] = useState(0);
  const [staked, setStaked] = useState(0);

  const { setAdviser } = useAdviser();

  useEffect(() => {
    feachMinDeposit();
  }, []);

  useEffect(() => {
    setAdviser(
      <>
        the place where community will hear you. <br /> propose your idea here
      </>
    );
  }, [setAdviser]);

  useEffect(() => {
    const getStatistics = async () => {
      if (queryClient) {
        let communityPool = 0;
        const totalCyb = {};
        let stakedBoot = 0;

        const dataCommunityPool = await queryClient.communityPool();
        const { pool } = dataCommunityPool;
        if (dataCommunityPool !== null) {
          communityPool = coinDecimals(Math.floor(parseFloat(pool[0].amount)));
        }
        setCommunityPoolCyber(communityPool);

        const datagetTotalSupply = await queryClient.totalSupply();
        if (Object.keys(datagetTotalSupply).length > 0) {
          datagetTotalSupply.forEach((item) => {
            totalCyb[item.denom] = parseFloat(item.amount);
          });
        }
        if (totalCyb[CYBER.DENOM_CYBER] && totalCyb[CYBER.DENOM_LIQUID_TOKEN]) {
          stakedBoot =
            totalCyb[CYBER.DENOM_LIQUID_TOKEN] / totalCyb[CYBER.DENOM_CYBER];
        }
        setStaked(stakedBoot);
      }
    };
    getStatistics();
  }, [queryClient]);

  useEffect(() => {
    feachProposals();
  }, []);

  const feachProposals = async () => {
    // if (queryClient !== null) {
    const responseProposals = await getProposals();
    // const responseProposals = await queryClient.proposals(
    //   PROPOSAL_STATUS.PROPOSAL_STATUS_PASSED,
    //   '',
    //   ''
    // );
    if (responseProposals !== null) {
      setTableData(responseProposals);
    }
    // }
  };

  const feachMinDeposit = async () => {
    const responseMinDeposit = await getMinDeposit();

    if (responseMinDeposit !== null) {
      setMinDeposit(parseFloat(responseMinDeposit.min_deposit[0].amount));
    }
  };

  console.log('tableData', tableData);
  const active = tableData
    .reverse()
    .filter(
      (item) =>
        PROPOSAL_STATUS[item.status] < PROPOSAL_STATUS.PROPOSAL_STATUS_PASSED
    )
    .map((item) => (
      <Link
        key={item.proposal_id}
        style={{ color: 'unset' }}
        to={`/senate/${item.proposal_id}`}
      >
        <ActiveCard
          key={item.proposal_id}
          id={item.proposal_id}
          name={item.content.title}
          minDeposit={minDeposit}
          totalDeposit={item.total_deposit}
          type={item.content['@type']}
          state={PROPOSAL_STATUS[item.status]}
          timeEndDeposit={dateFormat(
            new Date(item.deposit_end_time),
            'dd/mm/yyyy, HH:MM:ss'
          )}
          timeEndVoting={dateFormat(
            new Date(item.voting_end_time),
            'dd/mm/yyyy, HH:MM:ss'
          )}
          amount={item.total_deposit[0]}
        />
      </Link>
    ));

  const accepted = tableData
    .filter(
      (item) =>
        PROPOSAL_STATUS[item.status] === PROPOSAL_STATUS.PROPOSAL_STATUS_PASSED
    )
    .map((item) => (
      <Link
        key={item.proposal_id}
        style={{ color: 'unset' }}
        to={`/senate/${item.proposal_id}`}
      >
        <AcceptedCard
          key={item.proposal_id}
          id={item.proposal_id}
          name={item.content.title}
          votes={item.final_tally_result}
          type={item.content['@type']}
          amount={item.total_deposit[0]}
          timeEnd={dateFormat(
            new Date(item.voting_end_time),
            'dd/mm/yyyy, HH:MM:ss'
          )}
        />
      </Link>
    ));

  const rejected = tableData
    .reverse()
    .filter(
      (item) =>
        PROPOSAL_STATUS[item.status] > PROPOSAL_STATUS.PROPOSAL_STATUS_PASSED
    )
    .map((item) => (
      <Link
        key={item.proposal_id}
        style={{ color: 'unset' }}
        to={`/senate/${item.proposal_id}`}
      >
        <RejectedCard
          key={item.proposal_id}
          id={item.proposal_id}
          name={item.content.title}
          votes={item.final_tally_result}
          type={item.content['@type']}
          amount={item.total_deposit[0]}
          timeEnd={dateFormat(
            new Date(item.voting_end_time),
            'dd/mm/yyyy, HH:MM:ss'
          )}
        />
      </Link>
    ));

  return (
    <div>
      <main className="block-body">
        <Statistics communityPoolCyber={communityPoolCyber} staked={staked} />
        <Pane
          display="grid"
          justifyItems="center"
          gridTemplateColumns="repeat(auto-fit, minmax(200px, 1fr))"
          gridGap="20px"
        >
          <Columns title="Active">{active}</Columns>
          <Columns title="Accepted">{accepted}</Columns>
          <Columns title="Rejected">{rejected}</Columns>
        </Pane>
      </main>
      <ActionBar update={feachProposals} />
    </div>
  );
}

export default Governance;

Synonyms

cyb/src/containers/governance/governance.tsx

Neighbours