import React from 'react';
import styles from './Filters.module.scss';
import ButtonsGroup from 'src/components/buttons/ButtonsGroup/ButtonsGroup';
import { LinksTypeFilter, SortBy } from '../types';
import { initialContentTypeFilterState } from '../SearchResults';
import Links from 'src/components/search/Spark/Meta/Links/Links';
import { Tooltip } from 'src/components';

// TODO: move to ipfs config, global
export const contentTypeConfig = {
  text: {
    label: '๐Ÿ“„',
    tooltip: 'show only articles with text',
  },
  image: {
    label: '๐Ÿ–ผ๏ธ',
    tooltip: 'show only images',
  },
  video: {
    label: '๐ŸŽž๏ธ',
    tooltip: 'show only video content',
  },
  pdf: {
    label: '๐Ÿ“‘',
    tooltip: 'show only pdf files',
  },
  link: {
    label: '๐Ÿ”—',
    tooltip: 'show only particles with links',
  },
  audio: {
    label: '๐ŸŽง',
    tooltip: 'show only audio content',
  },
};

const sortConfig = {
  [SortBy.rank]: {
    label: 'โญ',
    tooltip: 'sort particles by cyberrank',
  },
  [SortBy.date]: {
    label: '๐Ÿ“…',
    tooltip: 'sort particles by date of creation',
  },
  [SortBy.popular]: {
    label: '๐Ÿ”ฅ',
    tooltip: '',
  },
  [SortBy.mine]: {
    label: '๐Ÿ‘ค',
    tooltip: '',
  },
};

type Props = {
  linksFilter: LinksTypeFilter;
};

function Filters({
  filters,
  setFilters,
  filter2,
  setFilter2,
  linksFilter,
  setLinksFilter,
  total,
  total2,
  contentType,
}: Props) {
  return (
    <header className={styles.header}>
      <div>
        <ButtonsGroup
          type="checkbox"
          onChange={(filter: typeof initialContentTypeFilterState & 'all') => {
            if (filter === 'all') {
              setFilters(initialContentTypeFilterState);
              return;
            }

            setFilters((filters) => ({
              ...initialContentTypeFilterState,
              [filter]: !filters[filter],
            }));
          }}
          items={[
            {
              label: 'all',
              checked: !Object.values(filters).some((filter) => filter),
            },
          ].concat(
            Object.keys(filters)
              .map((filter) => {
                if (!Object.values(contentType).includes(filter)) {
                  return null;
                }

                return {
                  label: contentTypeConfig[filter].label,
                  name: filter,
                  checked: filters[filter],
                  tooltip: contentTypeConfig[filter].tooltip,
                };
              })
              .filter((item) => !!item)
          )}
        />
      </div>

      <ButtonsGroup
        type="radio"
        items={Object.values(SortBy).map((sortType) => {
          return {
            label: sortConfig[sortType].label,
            disabled: sortType === SortBy.mine || sortType === SortBy.popular,
            name: sortType,
            checked: filter2 === sortType,
            tooltip: sortConfig[sortType].tooltip,
          };
        })}
        onChange={(sortType: SortBy) => {
          setFilter2(sortType);
          localStorage.setItem('search-sort', sortType);
        }}
      />

      <Links
        to={total.to}
        from={total.from}
        value={linksFilter}
        onChange={(val: LinksTypeFilter) => {
          setLinksFilter(val);
        }}
      />

      <Tooltip tooltip="total particles in result" placement="bottom">
        <div className={styles.total}>
          <span>
            {(() => {
              switch (linksFilter) {
                case LinksTypeFilter.all:
                  return total.to + total.from;

                case LinksTypeFilter.to:
                  return total.to;

                case LinksTypeFilter.from:
                default:
                  return total.from;
              }
            })()}
          </span>{' '}
          particles
        </div>
      </Tooltip>
    </header>
  );
}

export default Filters;

Synonyms

cyb/src/containers/Search/Filters/Filters.tsx

Neighbours