// TODO: refactor needed
import React, { useEffect, useState } from 'react';
import { Link } from 'react-router-dom';
import { $TsFixMe } from 'src/types/tsfix';
import useQueueIpfsContent from 'src/hooks/useQueueIpfsContent';
import { IpfsContentType } from 'src/utils/ipfs/ipfs';
import { IPFSContentDetails } from 'src/services/ipfs/ipfs';
import { parseArrayLikeToDetails } from 'src/services/ipfs/utils/content';

import SearchItem from '../SearchItem/searchItem';

import { getRankGrade } from '../../utils/search/utils';
import ContentIpfs from '../contentIpfs/contentIpfs';

type ContentItemProps = {
  item: $TsFixMe;
  cid: string;
  grade?: $TsFixMe;
  className?: string;
  parent?: string;
  setType?: (type: IpfsContentType) => void;
};

function ContentItem({
  item,
  cid,
  grade,
  linkType,
  parent: parentId,
  setType,
  className,
}: ContentItemProps): JSX.Element {
  const [details, setDetails] = useState<IPFSContentDetails>(undefined);
  const { status, content, fetchParticle } = useQueueIpfsContent(parentId);

  useEffect(() => {
    fetchParticle && (async () => fetchParticle(cid, item?.rank))();
  }, [cid, item?.rank, fetchParticle]);

  useEffect(() => {
    (async () => {
      const details = await parseArrayLikeToDetails(
        content,
        cid
        // (progress: number) => console.log(`${cid} progress: ${progress}`)
      );
      setDetails(details);
      details?.type && setType && setType(details?.type);
    })();
  }, [content, cid]); //TODO: REFACT - setType rise infinite loop

  return (
    <Link className={className} style={{ color: '#fff' }} to={`/ipfs/${cid}`}>
      <SearchItem
        key={cid}
        linkType={linkType}
        status={status}
        grade={
          item?.rank
            ? getRankGrade(item.rank)
            : grade || { from: 'n/a', to: 'n/a', value: 'n/a' }
        }
      >
        <ContentIpfs details={details} content={content} cid={cid} search />
      </SearchItem>
    </Link>
  );
}

export default ContentItem;

Synonyms

cyb/src/components/ContentItem/contentItem.tsx

Neighbours