import { useState } from "react"; import { Table, UnstyledButton, Group, Text, Center, TextInput, rem, keys, Card, } from "@mantine/core"; import { IconSelector, IconChevronDown, IconChevronUp, IconSearch, } from "@tabler/icons-react"; import classes from "./flags.module.css"; import { useSuspenseAPIQuery } from "../api/api"; interface RowData { flag: string; value: string; } interface ThProps { children: React.ReactNode; reversed: boolean; sorted: boolean; onSort(): void; } function Th({ children, reversed, sorted, onSort }: ThProps) { const Icon = sorted ? reversed ? IconChevronUp : IconChevronDown : IconSelector; return ( {children}
); } function filterData(data: RowData[], search: string) { const query = search.toLowerCase().trim(); return data.filter((item) => keys(data[0]).some((key) => item[key].toLowerCase().includes(query)) ); } function sortData( data: RowData[], payload: { sortBy: keyof RowData | null; reversed: boolean; search: string } ) { const { sortBy } = payload; if (!sortBy) { return filterData(data, payload.search); } return filterData( [...data].sort((a, b) => { if (payload.reversed) { return b[sortBy].localeCompare(a[sortBy]); } return a[sortBy].localeCompare(b[sortBy]); }), payload.search ); } export default function Flags() { const { data } = useSuspenseAPIQuery>(`/status/flags`); // const { response, error, isLoading } = // useFetchAPI>(`/status/flags`); const flags = Object.entries(data.data).map(([flag, value]) => ({ flag, value, })); const [search, setSearch] = useState(""); const [sortedData, setSortedData] = useState(flags); const [sortBy, setSortBy] = useState(null); const [reverseSortDirection, setReverseSortDirection] = useState(false); const setSorting = (field: keyof RowData) => { const reversed = field === sortBy ? !reverseSortDirection : false; setReverseSortDirection(reversed); setSortBy(field); setSortedData(sortData(flags, { sortBy: field, reversed, search })); }; const handleSearchChange = (event: React.ChangeEvent) => { const { value } = event.currentTarget; setSearch(value); setSortedData( sortData(flags, { sortBy, reversed: reverseSortDirection, search: value }) ); }; const rows = sortedData.map((row) => ( --{row.flag} {row.value} )); return ( } value={search} onChange={handleSearchChange} /> {rows.length > 0 ? ( rows ) : ( Nothing found )}
setSorting("flag")} > Flag setSorting("value")} > Value
); }