"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, }; }