import React, { useCallback, useMemo, useState } from "react"; import ProgressBar from "../ProgressBar/ProgressBar"; import Link from "../Link/Link"; import Icon from "../Icon/Icon"; import { Title } from "../Text/Text"; import { Menu, MenuItem } from "../Menu/Menu"; import { Route } from "../../routes"; import useIssues from "../../hooks/useIssues"; import useReposStore from "../../hooks/useReposStore"; import useRouter from "../../hooks/useRouter"; import { sortBy, SortBy } from "../../utils/sort"; import addStats from "../../utils/addStats"; import "./table.less"; const sortFns = [SortBy.priority, SortBy.name, SortBy.progress]; type UseIssues = ReturnType; interface Props extends UseIssues { showRemove?: boolean; heading?: string; } const Table: React.FC = ({ heading, data, showRemove }) => { const { goTo } = useRouter(); const { repos, removeRepo } = useReposStore(); const [sortOrder, setSortOrder] = useState(SortBy.priority); const onSort = useCallback(() => { const i = 1 + sortFns.indexOf(sortOrder); if (i === sortFns.length) { setSortOrder(sortFns[0]); } else { setSortOrder(sortFns[i]); } }, [sortOrder]); const withStats = useMemo(() => data.map(addStats), [data]); const sorted = useMemo( () => sortBy(withStats, sortOrder), [withStats, sortOrder] ); // Remove repo. const onRemove = () => { const [{ owner, repo }] = data; if (!repos.length) { return; } removeRepo(owner, repo); goTo(Route.repos); }; return (
{heading && {heading}} {sorted.length > 1 && (
Sorted by {sortOrder}
)} {showRemove && ( Remove this Repo )}
{sorted.map((d) => (
{d.owner}/{d.repo}
{d.title}
))}
); }; export default Table;