"use client";
import type { HTMLAttributes } from "react";
import type { UseQueryResult } from "@tanstack/react-query";
import { type TableOptions, useReactTable } from "@tanstack/react-table";
import type { PageResponse } from "@/shared/model";
import { NoData } from "@/shared/ui/no-data";
import { DataTable, Skeleton } from "@common/components";
import { matchQueryStatus } from "./match-query-status";
interface DataTableOptions {
variant?: "default" | "secondary" | "line";
className?: HTMLAttributes["className"];
caption?: string;
viewPagination?: boolean;
onRowClick?: (row: T) => void;
}
interface UseDataTableOptions {
/** 페이징 응답(PageResponse) 또는 페이징 없는 목록(T[]) */
query: UseQueryResult | T[]>;
tableOptions: Omit, "data" | "rowCount">;
dataTableOptions?: DataTableOptions;
}
const EMPTY_ROWS: never[] = [];
export function useDataTable({ query, tableOptions, dataTableOptions }: UseDataTableOptions) {
const { data } = query;
const rows = Array.isArray(data) ? data : (data?.content ?? EMPTY_ROWS);
const rowCount = Array.isArray(data) ? data.length : (data?.totalElements ?? 0);
const table = useReactTable({
...tableOptions,
data: rows,
rowCount,
});
return {
tableComponent: matchQueryStatus(query, {
Pending: (
),
Empty: ,
Error: (
데이터를 불러오는 중 오류가 발생했습니다.
),
Success: () => ,
}),
tableInstance: table,
};
}