cyb/src/containers/blok/index.tsx

import { useMemo, useState } from 'react';
import InfiniteScroll from 'react-infinite-scroll-component';
import { Link } from 'react-router-dom';
import { Dots, MainContainer, TextTable } from 'src/components';
import Table from 'src/components/Table/Table';
import { useBlocksQuery } from 'src/generated/graphql';
import { routes } from 'src/routes';
import { formatNumber, trimString } from '../../utils/utils';

const dateFormat = require('dateformat');

const limit = 20;

const TableKeyMap = {
  hash: 'hash',
  height: 'height',
  tx: 'tx',
  proposerAddress: 'proposer address',
  timestampUTC: 'timestamp, UTC',
};

function Block() {
  const [hasMore, setHasMore] = useState(true);
  const { data, loading, error, fetchMore } = useBlocksQuery({
    variables: {
      limit,
      offset: 0,
    },
  });

  const lastBlockQuery = data?.block[data.block.length - 1].height;

  const fetchMoreData = async () => {
    setTimeout(() => {
      fetchMore({
        variables: {
          offset: data?.block.length,
          where: { height: { _lte: lastBlockQuery } },
        },
        updateQuery: (prev, { fetchMoreResult }) => {
          if (!fetchMoreResult) {
            return prev;
          }
          setHasMore(fetchMoreResult.block.length > 0);

          return {
            ...prev,
            block: [...prev.block, ...fetchMoreResult.block],
          };
        },
      });
    }, 2000);
  };

  const tableData = useMemo(() => {
    return (data?.block || []).map((item) => {
      return {
        hash: <TextTable>{trimString(item.hash, 5, 5)}</TextTable>,
        height: (
          <TextTable>
            <Link to={routes.blocks.idBlock.getLink(item.height)}>{formatNumber(item.height)}</Link>
          </TextTable>
        ),
        tx: (
          <TextTable>{formatNumber(item.transactions_aggregate.aggregate?.count || 0)}</TextTable>
        ),
        proposerAddress: <TextTable>{trimString(item.proposer_address, 5, 5)}</TextTable>,
        timestampUTC: <TextTable>{dateFormat(item.timestamp, 'dd/mm/yyyy, HH:MM:ss')}</TextTable>,
      };
    });
  }, [data]);

  if (loading) {
    return (
      <div
        style={{
          display: 'flex',
          justifyContent: 'center',
          alignItems: 'center',
        }}
      >
        <Dots />
      </div>
    );
  }

  if (error) {
    return <span>{error.message}</span>;
  }

  return (
    <MainContainer>
      <InfiniteScroll
        dataLength={data?.block.length || 0}
        next={fetchMoreData}
        refreshFunction={fetchMoreData}
        hasMore={hasMore}
        loader={
          <h4>
            Loading
            <Dots />
          </h4>
        }
      >
        <Table
          data={tableData}
          isLoading={loading}
          columns={Object.keys(TableKeyMap).map((key) => ({
            header: TableKeyMap[key],
            accessorKey: key,
            cell: (info) => info.getValue(),
          }))}
        />
      </InfiniteScroll>
    </MainContainer>
  );
}

export default Block;

Synonyms

cyb/src/index.tsx
pussy-ts/src/index.tsx
bostrom.network/src/pages/Index.tsx
pussy-landing/src/pages/index.tsx
pussy.meme/src/pages/index.tsx
pussy-ts/src/containers/txs/index.tsx
pussy-ts/src/containers/mint/index.tsx
cyb/src/containers/mint/index.tsx
pussy-ts/src/components/ButtonSwap/index.tsx
pussy-ts/src/components/denom/index.tsx
cyb/src/containers/Objects/index.tsx
cyb/src/components/btnGrd/index.tsx
pussy-ts/src/components/Select/index.tsx
cyb/src/components/actionBar/index.tsx
pussy-ts/src/components/BandwidthBar/index.tsx
cyb/src/components/Select/index.tsx
pussy-ts/src/containers/portal/index.tsx
pussy-ts/src/components/btnGrd/index.tsx
cyb/src/components/TextMarkdown/index.tsx
cyb/src/containers/energy/index.tsx
pussy-ts/src/components/MainContainer/index.tsx
pussy-ts/src/components/actionBar/index.tsx
cyb/src/containers/portal/index.tsx
cyb/src/components/ButtonSwap/index.tsx
cyb/src/containers/nebula/index.tsx
pussy-ts/src/components/DonutChart/index.tsx
cyb/src/components/DonutChart/index.tsx
pussy-ts/src/containers/nebula/index.tsx
cyb/src/components/BandwidthBar/index.tsx
pussy-ts/src/containers/energy/index.tsx
cyb/src/components/denom/index.tsx
cyb/src/containers/sigma/index.tsx
cyb/src/components/Input/index.tsx
pussy-ts/src/containers/sigma/index.tsx
pussy-ts/src/containers/taverna/index.tsx
pussy-ts/src/components/Input/index.tsx
cyb/src/components/PDF/index.tsx
cyb/src/containers/txs/index.tsx
cyb/src/containers/taverna/index.tsx
cyb/src/components/MainContainer/index.tsx
pussy-ts/src/components/TextMarkdown/index.tsx
pussy-ts/src/components/PDF/index.tsx
cyb/src/containers/portal/citizenship/index.tsx
pussy-landing/src/components/xp/btnGrd/index.tsx
cyb/src/containers/portal/pasport/index.tsx
pussy-landing/src/components/xp/stars/index.tsx
cyb/src/components/buttons/ButtonIcon/index.tsx
cyb/src/containers/wasm/codes/index.tsx
pussy-ts/src/features/ipfs/Drive/index.tsx
pussy-ts/src/containers/portal/gift/index.tsx
pussy-ts/src/features/ipfs/ipfsSettings/index.tsx
pussy-ts/src/components/buttons/ButtonIcon/index.tsx
pussy-ts/src/containers/portal/release/index.tsx
cyb/src/containers/portal/release/index.tsx
cyb/src/features/ipfs/Drive/index.tsx
pussy-ts/src/containers/portal/pasport/index.tsx
cyb/src/features/ipfs/ipfsSettings/index.tsx
pussy-ts/src/containers/portal/citizenship/index.tsx
cyb/src/containers/portal/gift/index.tsx
cyb/src/components/contentIpfs/component/gateway/index.tsx
pussy-ts/src/containers/portal/components/ReleaseStatus/index.tsx
pussy-ts/src/components/contentIpfs/component/gateway/index.tsx
pussy-ts/src/containers/sigma/components/CardPassport/index.tsx
cyb/src/containers/sigma/components/CardPassport/index.tsx
cyb/src/components/contentIpfs/component/img/index.tsx
pussy-ts/src/components/contentIpfs/component/img/index.tsx
cyb/src/containers/portal/components/ActionBar/index.tsx
pussy-ts/src/components/contentIpfs/component/link/index.tsx
cyb/src/containers/portal/components/ReleaseStatus/index.tsx
cyb/src/containers/portal/components/stars/index.tsx
pussy-ts/src/containers/portal/components/stars/index.tsx
cyb/src/components/contentIpfs/component/link/index.tsx
pussy-ts/src/containers/sigma/components/cardUi/TitleCard/index.tsx
cyb/src/containers/sigma/components/cardUi/TitleCard/index.tsx
cyb/src/containers/sigma/components/cardUi/RowBalancesDetails/index.tsx
pussy-ts/src/containers/sigma/components/cardUi/RowBalancesDetails/index.tsx

Neighbours