{"version":3,"file":"useTableState.mjs","names":[],"sources":["../../../src/base-ui/Table/useTableState.ts"],"sourcesContent":["import type {\n  ColumnFiltersState,\n  PaginationState,\n  SortingState,\n  Updater,\n} from '@tanstack/react-table';\nimport { useState } from 'react';\n\nimport { getColumnId } from './toColumnDefs';\nimport type {\n  TableColumn,\n  TableFilters,\n  TablePaginationConfig,\n  TableProps,\n  TableSorterResult,\n} from './type';\n\nconst resolve = <S>(updater: Updater<S>, previous: S): S =>\n  typeof updater === 'function' ? (updater as (old: S) => S)(previous) : updater;\n\nconst initialSorting = (columns: TableColumn<any>[]): SortingState => {\n  const index = columns.findIndex((column) => column.defaultSortOrder);\n  if (index === -1) return [];\n  return [\n    { desc: columns[index].defaultSortOrder === 'descend', id: getColumnId(columns[index], index) },\n  ];\n};\n\nexport const useTableState = <T>({\n  columns,\n  onChange,\n  pagination,\n}: Pick<TableProps<T>, 'columns' | 'onChange' | 'pagination'>) => {\n  const config: TablePaginationConfig | undefined =\n    pagination === false ? undefined : (pagination ?? {});\n  const columnIds = columns.map((column, index) => getColumnId(column, index));\n\n  const [sorting, setSorting] = useState<SortingState>(() => initialSorting(columns));\n  const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([]);\n  const [innerPage, setInnerPage] = useState<PaginationState>({\n    pageIndex: (config?.defaultCurrent ?? 1) - 1,\n    pageSize: config?.defaultPageSize ?? 10,\n  });\n\n  const page: PaginationState = {\n    pageIndex: config?.current === undefined ? innerPage.pageIndex : config.current - 1,\n    pageSize: config?.pageSize ?? innerPage.pageSize,\n  };\n\n  const toFilters = (state: ColumnFiltersState): TableFilters =>\n    Object.fromEntries(\n      columns\n        .map((column, index) => [column, columnIds[index]] as const)\n        .filter(([column]) => column.filters?.length)\n        .map(([, id]) => [\n          id,\n          (state.find((filter) => filter.id === id)?.value as TableFilters[string]) ?? null,\n        ]),\n    );\n\n  const toSorter = (state: SortingState): TableSorterResult<T> => {\n    const [active] = state;\n    if (!active) return {};\n    const index = columnIds.indexOf(active.id);\n    return {\n      column: columns[index],\n      columnKey: active.id,\n      order: active.desc ? 'descend' : 'ascend',\n    };\n  };\n\n  const toPaginationArg = (next: PaginationState): TablePaginationConfig =>\n    config ? { ...config, current: next.pageIndex + 1, pageSize: next.pageSize } : {};\n\n  const report = (\n    nextPage: PaginationState,\n    nextFilters: ColumnFiltersState,\n    nextSorting: SortingState,\n  ) => onChange?.(toPaginationArg(nextPage), toFilters(nextFilters), toSorter(nextSorting));\n\n  const changePage = (next: PaginationState) => {\n    setInnerPage(next);\n    const sizeChanged = next.pageSize !== page.pageSize;\n    if (sizeChanged) config?.onShowSizeChange?.(next.pageIndex + 1, next.pageSize);\n    if (sizeChanged || next.pageIndex !== page.pageIndex) {\n      config?.onChange?.(next.pageIndex + 1, next.pageSize);\n    }\n  };\n\n  const clampPage = (pageIndex: number) => {\n    if (config?.current === undefined) {\n      setInnerPage((previous) => ({ ...previous, pageIndex }));\n      return;\n    }\n    config.onChange?.(pageIndex + 1, page.pageSize);\n  };\n\n  const onSortingChange = (updater: Updater<SortingState>) => {\n    const next = resolve(updater, sorting);\n    const firstPage = { ...page, pageIndex: 0 };\n    setSorting(next);\n    changePage(firstPage);\n    report(firstPage, columnFilters, next);\n  };\n\n  const onColumnFiltersChange = (updater: Updater<ColumnFiltersState>) => {\n    const next = resolve(updater, columnFilters);\n    const firstPage = { ...page, pageIndex: 0 };\n    setColumnFilters(next);\n    changePage(firstPage);\n    report(firstPage, next, sorting);\n  };\n\n  const onPaginationChange = (updater: Updater<PaginationState>) => {\n    const next = resolve(updater, page);\n    changePage(next);\n    report(next, columnFilters, sorting);\n  };\n\n  return {\n    clampPage,\n    columnFilters,\n    columnIds,\n    config,\n    manualSorting: columns.some((column) => column.sorter === true),\n    onColumnFiltersChange,\n    onPaginationChange,\n    onSortingChange,\n    page,\n    sorting,\n  };\n};\n"],"mappings":"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"}