import { ReactNode, useCallback, useState } from 'react'; import styled from '@emotion/styled'; import { FilterDropdownButton } from '@/lib/filters-and-sorts/components/FilterDropdownButton'; import SortAndFilterBar from '@/lib/filters-and-sorts/components/SortAndFilterBar'; import { SortDropdownButton } from '@/lib/filters-and-sorts/components/SortDropdownButton'; import { SelectedSortType, SortType, } from '@/lib/filters-and-sorts/interfaces/sorts/interface'; import { FiltersHotkeyScope } from '@/lib/filters-and-sorts/types/FiltersHotkeyScope'; import { TableContext } from '@/ui/tables/states/TableContext'; type OwnProps = { viewName: string; viewIcon?: ReactNode; availableSorts?: Array>; onSortsUpdate?: (sorts: Array>) => void; }; const StyledContainer = styled.div` display: flex; flex-direction: column; `; const StyledTableHeader = styled.div` align-items: center; color: ${({ theme }) => theme.font.color.secondary}; display: flex; flex-direction: row; font-weight: ${({ theme }) => theme.font.weight.medium}; height: 40px; justify-content: space-between; padding-left: ${({ theme }) => theme.spacing(3)}; padding-right: ${({ theme }) => theme.spacing(2)}; `; const StyledIcon = styled.div` display: flex; margin-left: ${({ theme }) => theme.spacing(1)}; margin-right: ${({ theme }) => theme.spacing(2)}; & > svg { font-size: ${({ theme }) => theme.icon.size.sm}; } `; const StyledViewSection = styled.div` display: flex; `; const StyledFilters = styled.div` display: flex; font-weight: ${({ theme }) => theme.font.weight.regular}; gap: 2px; `; export function TableHeader({ viewName, viewIcon, availableSorts, onSortsUpdate, }: OwnProps) { const [sorts, innerSetSorts] = useState>>( [], ); const sortSelect = useCallback( (newSort: SelectedSortType) => { const newSorts = updateSortOrFilterByKey(sorts, newSort); innerSetSorts(newSorts); onSortsUpdate && onSortsUpdate(newSorts); }, [onSortsUpdate, sorts], ); const sortUnselect = useCallback( (sortKey: string) => { const newSorts = sorts.filter((sort) => sort.key !== sortKey); innerSetSorts(newSorts); onSortsUpdate && onSortsUpdate(newSorts); }, [onSortsUpdate, sorts], ); return ( {viewIcon} {viewName} isSortSelected={sorts.length > 0} availableSorts={availableSorts || []} onSortSelect={sortSelect} HotkeyScope={FiltersHotkeyScope.FilterDropdownButton} /> { innerSetSorts([]); onSortsUpdate && onSortsUpdate([]); }} /> ); } function updateSortOrFilterByKey( sorts: Readonly, newSort: SortOrFilter, ): SortOrFilter[] { const newSorts = [...sorts]; const existingSortIndex = sorts.findIndex((sort) => sort.key === newSort.key); if (existingSortIndex !== -1) { newSorts[existingSortIndex] = newSort; } else { newSorts.push(newSort); } return newSorts; }