2024-06-13 11:09:26 +00:00
|
|
|
import { PaginationState, usePaginationParams } from "@/lib/hooks";
|
|
|
|
|
import { SortingState } from "@tanstack/react-table";
|
|
|
|
|
import { PropsWithChildren, createContext, useCallback, useMemo, useState } from "react";
|
2024-06-11 16:48:09 +00:00
|
|
|
|
2024-06-13 11:09:26 +00:00
|
|
|
export interface IDataTableContextState {
|
|
|
|
|
pagination: PaginationState;
|
|
|
|
|
setPagination: (newPagination: PaginationState) => void;
|
|
|
|
|
sorting: [];
|
|
|
|
|
setSorting: () => void;
|
|
|
|
|
globalFilter: string;
|
|
|
|
|
setGlobalFilter: (newGlobalFilter: string) => void;
|
|
|
|
|
resetGlobalFilter: () => void;
|
|
|
|
|
isFiltered: boolean;
|
|
|
|
|
}
|
2024-06-11 16:48:09 +00:00
|
|
|
|
|
|
|
|
export const DataTableContext = createContext<IDataTableContextState | null>(null);
|
|
|
|
|
|
2024-06-13 11:09:26 +00:00
|
|
|
export const DataTableProvider = ({
|
|
|
|
|
initialGlobalFilter = "",
|
|
|
|
|
children,
|
|
|
|
|
}: PropsWithChildren<{
|
|
|
|
|
initialGlobalFilter?: string;
|
|
|
|
|
}>) => {
|
2024-06-11 16:48:09 +00:00
|
|
|
const [pagination, setPagination] = usePaginationParams();
|
2024-06-13 11:09:26 +00:00
|
|
|
const [globalFilter, setGlobalFilter] = useState<string>(initialGlobalFilter);
|
|
|
|
|
const [sorting, setSorting] = useState<SortingState>([]);
|
|
|
|
|
|
|
|
|
|
const isFiltered = useMemo(() => Boolean(globalFilter.length), [globalFilter]);
|
|
|
|
|
const resetGlobalFilter = useCallback(() => setGlobalFilter(""), []);
|
2024-06-11 16:48:09 +00:00
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<DataTableContext.Provider
|
|
|
|
|
value={{
|
|
|
|
|
pagination,
|
|
|
|
|
setPagination,
|
2024-06-13 11:09:26 +00:00
|
|
|
sorting,
|
|
|
|
|
setSorting,
|
|
|
|
|
globalFilter,
|
|
|
|
|
setGlobalFilter,
|
|
|
|
|
resetGlobalFilter,
|
|
|
|
|
isFiltered,
|
2024-06-11 16:48:09 +00:00
|
|
|
}}
|
|
|
|
|
>
|
|
|
|
|
{children}
|
|
|
|
|
</DataTableContext.Provider>
|
|
|
|
|
);
|
|
|
|
|
};
|