import { Pane } from '@cybercongress/gravity';
import { useEffect, useState } from 'react';
import { useDevice } from 'src/contexts/device';
import { useQueryClient } from 'src/contexts/queryClient';
import { getRankGrade } from '../../utils/search/utils';
import { coinDecimals, exponentialToDecimal, timeSince } from '../../utils/utils';
import ContentItem from '../ContentItem/contentItem';
import Rank from '../Rank/rank';

function TimeAgo({ timeAgoInMS }) {
  return (
    <Pane
      className="time-discussion rank-contentItem"
      position="absolute"
      right="-10px"
      fontSize={12}
      whiteSpace="nowrap"
      top="50%"
      transform="translate(0, -50%)"
      marginTop="-5px"
    >
      {timeSince(timeAgoInMS)} ago
    </Pane>
  );
}

const initialState = {
  rank: 'n/a',
  grade: { from: 'n/a', to: 'n/a', value: 'n/a' },
};

function SearchSnippet({ cid, data, onClickRank }) {
  const queryClient = useQueryClient();
  const [rankInfo, setRankInfo] = useState(initialState);
  const { isMobile: mobile } = useDevice();

  useEffect(() => {
    const getRank = async () => {
      if ((data.rank === undefined || data.rank === null) && queryClient) {
        // use useRank hook
        const response = await queryClient.rank(cid);

        const rank = coinDecimals(parseFloat(response.rank));
        const rankData = {
          rank: exponentialToDecimal(rank.toPrecision(3)),
          grade: getRankGrade(rank),
        };
        setRankInfo(rankData);
      }
    };
    getRank();
  }, [data, queryClient, cid]);

  let timeAgoInMS = null;

  if (data.time) {
    const d = new Date();
    const time = Date.parse(d) - Date.parse(data.time);
    if (time > 0) {
      timeAgoInMS = time;
    }
  }
  if (data.timestamp) {
    const d = new Date();
    const time = Date.parse(d) - Date.parse(data.timestamp);
    if (time > 0) {
      timeAgoInMS = time;
    }
  }

  return (
    <Pane
      position="relative"
      className="hover-rank"
      display="flex"
      alignItems="center"
      marginBottom="10px"
    >
      {!mobile && (
        <Pane className="time-discussion rank-contentItem" position="absolute">
          <Rank
            hash={cid}
            rank={rankInfo.rank}
            grade={rankInfo.grade}
            onClick={() => onClickRank(cid)}
          />
        </Pane>
      )}
      <ContentItem cid={cid} item={data} className="contentItem" grade={rankInfo.grade} />
      {timeAgoInMS !== null && <TimeAgo timeAgoInMS={timeAgoInMS} />}
    </Pane>
  );
}

export default SearchSnippet;

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
pussy-ts/src/containers/validator/index.jsx
pussy-ts/src/containers/Objects/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