import { useState, useEffect } from 'react';
import InfiniteScroll from 'react-infinite-scroll-component';
import Spark from 'src/components/search/Spark/Spark';
import { getRelevance, getRankGrade } from '../../utils/search/utils';
import { Dots, Loading } from '../../components';
import { coinDecimals } from '../../utils/utils';
import { MainContainer } from '../portal/components';

function Relevance({ items, fetchMoreData }) {
  return (
    <div
      style={{
        margin: '0 auto',
      }}
    >
      <InfiniteScroll
        dataLength={Object.keys(items).length}
        next={fetchMoreData}
        hasMore
        loader={
          <h4
            style={{
              textAlign: 'center',
            }}
          >
            Loading
            <Dots />
          </h4>
        }
        refreshFunction={fetchMoreData}
      >
        {Object.keys(items).map((key) => {
          return (
            <Spark
              cid={key}
              key={key}
              itemData={items[key]}
              query="particles"
            />
          );
        })}
      </InfiniteScroll>
    </div>
  );
}

function Objects() {
  const [items, setItems] = useState([]);
  const [page, setPage] = useState(0);
  const [loading, setLoading] = useState(true);
  const [allPage, setAllPage] = useState(1);

  useEffect(() => {
    getFirstItem();
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, []);

  const getFirstItem = async () => {
    const data = await getRelevance(page);
    const links = data.result.reduce(
      (obj, link) => ({
        ...obj,
        [link.particle]: {
          rank: coinDecimals(link.rank),
          particle: link.particle,
          grade: getRankGrade(coinDecimals(link.rank)),
          status: 'impossibleLoad',
          text: link.particle,
          content: false,
        },
      }),
      {}
    );

    setItems(links);
    setPage(page + 1);
    setLoading(false);
    setAllPage(Math.ceil(parseFloat(data.pagination.total) / 50));
  };

  const fetchMoreData = async () => {
    // a fake async api call like which sends
    // 20 more records in 1.5 secs
    const data = await getRelevance(page);
    const links = data.result.reduce(
      (obj, link) => ({
        ...obj,
        [link.particle]: {
          rank: coinDecimals(link.rank),
          particle: link.particle,
          grade: getRankGrade(coinDecimals(link.rank)),
          status: 'impossibleLoad',
          text: link.particle,
          content: false,
        },
      }),
      {}
    );

    setTimeout(() => {
      setItems((itemState) => ({ ...itemState, ...links }));
      setPage((itemPage) => itemPage + 1);
    }, 500);
  };

  if (loading) {
    return (
      <div
        style={{
          width: '100%',
          height: '50vh',
          display: 'flex',
          justifyContent: 'center',
          alignItems: 'center',
          flexDirection: 'column',
        }}
      >
        <Loading />
      </div>
    );
  }

  return (
    <MainContainer width="90%">
      <Relevance
        items={items}
        fetchMoreData={fetchMoreData}
        page={page}
        allPage={allPage}
      />
    </MainContainer>
  );
}

export default Objects;

Synonyms

pussy-ts/src/containers/wasm/index.jsx
pussy-ts/src/containers/trollBox/index.jsx
cyb/src/containers/movie/index.jsx
cyb/src/components/battery/index.jsx
cyb/src/components/vitalik/index.jsx
pussy-ts/src/containers/oracle/index.jsx
cyb/src/containers/wasm/index.jsx
cyb/src/components/ButtonNetwork/index.jsx
pussy-ts/src/containers/blok/index.jsx
pussy-ts/src/components/battery/index.jsx
cyb/src/components/searchSnippet/index.jsx
pussy-ts/src/containers/validator/index.jsx
cyb/src/containers/parameters/index.jsx
pussy-ts/src/containers/parameters/index.jsx
pussy-ts/src/containers/market/index.jsx
cyb/src/containers/oracle/index.jsx
cyb/src/components/particle/index.jsx
pussy-ts/src/components/numberCurrency/index.jsx
cyb/src/components/numberCurrency/index.jsx
pussy-ts/src/containers/testKeplre/index.jsx
pussy-ts/src/components/valueImg/index.jsx
pussy-ts/src/components/ButtonNetwork/index.jsx
pussy-ts/src/containers/network/index.jsx
pussy-ts/src/components/particle/index.jsx
pussy-ts/src/containers/movie/index.jsx
cyb/src/containers/market/index.jsx
pussy-ts/src/containers/help/index.jsx
pussy-ts/src/components/statusTooltip/index.jsx
cyb/src/containers/help/index.jsx
pussy-ts/src/components/vitalik/index.jsx
cyb/src/containers/testPage/index.jsx
pussy-ts/src/components/searchSnippet/index.jsx
cyb/src/components/valueImg/index.jsx
cyb/src/components/statusTooltip/index.jsx
cyb/src/containers/trollBox/index.jsx
pussy-ts/src/containers/Validators/components/index.jsx
pussy-ts/src/containers/portal/stateComponent/index.jsx
pussy-ts/src/containers/parameters/tabs/index.jsx
pussy-ts/src/containers/wasm/codes/index.jsx
pussy-ts/src/containers/wasm/contract/index.jsx
cyb/src/containers/wasm/contract/index.jsx
cyb/src/containers/portal/stateComponent/index.jsx
cyb/src/containers/parameters/tabs/index.jsx
cyb/src/containers/temple/components/canvasOne/index.jsx
cyb/src/containers/wasm/contract/renderAbi/index.jsx
cyb/src/containers/wasm/codes/code/index.jsx
pussy-ts/src/containers/portal/components/progressCard/index.jsx
pussy-ts/src/containers/temple/components/canvasOne/index.jsx
pussy-ts/src/containers/portal/components/ActionBar/index.jsx
cyb/src/containers/wasm/codes/codePage/index.jsx
pussy-ts/src/containers/portal/components/nextUnfreeze/index.jsx
pussy-ts/src/containers/portal/components/Released/index.jsx
cyb/src/containers/portal/components/progressCard/index.jsx
cyb/src/containers/portal/components/currentGift/index.jsx
pussy-ts/src/containers/wasm/codes/code/index.jsx
pussy-ts/src/containers/wasm/contract/renderAbi/index.jsx
pussy-ts/src/containers/portal/components/currentGift/index.jsx
cyb/src/containers/portal/components/Released/index.jsx
cyb/src/containers/portal/components/imgNetwork/index.jsx
pussy-ts/src/containers/portal/components/imgNetwork/index.jsx
pussy-ts/src/containers/energy/ui/card/index.jsx
pussy-ts/src/containers/wasm/codes/codePage/index.jsx
cyb/src/containers/portal/components/nextUnfreeze/index.jsx
cyb/src/containers/energy/ui/card/index.jsx
pussy-ts/src/containers/sigma/components/cardUi/ChartTotal/index.jsx
pussy-ts/src/containers/sigma/components/cardUi/DetailsBalance/index.jsx
pussy-ts/src/containers/sigma/components/cardUi/BtnArrow/index.jsx
cyb/src/containers/sigma/components/cardUi/ChartTotal/index.jsx
cyb/src/containers/sigma/components/cardUi/BtnArrow/index.jsx
cyb/src/containers/sigma/components/cardUi/DetailsBalance/index.jsx

Neighbours