import classnames from 'classnames' import React, { useMemo, useState } from 'react' import { fetchQueryParam } from '../../../utils/urls' import { TableNavigation } from '../../common/ListTable/TableNavigation' import { ManageSnippetCard } from './ManageSnippetCard' import type { ListTableAction, ListTableNavProps } from '../../common/ListTable' import type { Snippet } from '../../../types/Snippet' import type { Dispatch, ReactNode, SetStateAction } from 'react' const PAGE_SEARCH_PARAM = 'paged' interface CardGridProps { snippets: Snippet[] noItems: ReactNode selected: Set setSelected: Dispatch>> } const CardGrid: React.FC = ({ snippets, noItems, selected, setSelected }) => 0 < snippets.length ?
    selected.has(snippet.id)) })} > {snippets.map(snippet => { setSelected(previous => { const updated = new Set(previous) if (isSelected) { updated.add(snippet.id) } else { updated.delete(snippet.id) } return updated }) }} />)}
:

{noItems}

const getVisibleSelection = (selected: Set, visible: Snippet[]): Set => new Set([...selected].filter(id => visible.some(snippet => snippet.id === id))) interface PagedSnippetsParams { snippets: Snippet[] itemsPerPage: number | undefined currentPage: number } interface PagedSnippets { totalPages: number safePage: number visibleSnippets: Snippet[] } const usePagedSnippets = ({ snippets, itemsPerPage, currentPage }: PagedSnippetsParams): PagedSnippets => { const totalPages = itemsPerPage ? Math.ceil(snippets.length / itemsPerPage) : 0 const safePage = totalPages ? Math.min(currentPage, totalPages) : 1 const visibleSnippets = useMemo( () => itemsPerPage ? snippets.slice((safePage - 1) * itemsPerPage, safePage * itemsPerPage) : snippets, [snippets, itemsPerPage, safePage] ) return { totalPages, safePage, visibleSnippets } } export interface SnippetsCardGridProps extends Pick, 'extraTableNav' | 'endTableNav'> { snippets: Snippet[] actions: ListTableAction[] doAction: (action: A | undefined, selected: Set) => Promise itemsPerPage?: number noItems: ReactNode beforeGrid?: ReactNode } export const SnippetsCardGrid = ({ snippets, actions, doAction, extraTableNav, endTableNav, itemsPerPage, noItems, beforeGrid }: SnippetsCardGridProps) => { const [selected, setSelected] = useState(() => new Set()) const [currentPage, setCurrentPage] = useState( () => Number(fetchQueryParam(PAGE_SEARCH_PARAM)) || 1 ) const { totalPages, safePage, visibleSnippets } = usePagedSnippets({ snippets, itemsPerPage, currentPage }) return (
snippet.id)} actions={actions} doAction={doAction} extraTableNav={extraTableNav} endTableNav={endTableNav} > {beforeGrid}
) }