'use client' import { useState, useCallback, useMemo } from 'react' import { UseTableStateReturn, TableState } from '../types' interface UseTableStateProps { initialData?: TData[] initialPageSize?: number } export function useTableState({ initialData = [], initialPageSize = 25, }: UseTableStateProps): UseTableStateReturn { const [data, setDataState] = useState(initialData) const [currentPage, setCurrentPage] = useState(1) const [pageSize, setPageSizeState] = useState(initialPageSize) const [searchTerm, setSearchTerm] = useState('') const [debouncedSearchTerm, setDebouncedSearchTerm] = useState('') const [sortBy, setSortBy] = useState(null) const [sortDirection, setSortDirection] = useState<'asc' | 'desc'>('asc') const [loading, setLoadingState] = useState(false) const [loadingRows, setLoadingRowsState] = useState>(new Set()) const [error, setErrorState] = useState(null) const [viewMode, setViewModeState] = useState<'table' | 'card'>('table') // Computed values const totalCount = data.length const totalPages = Math.max(1, Math.ceil(totalCount / pageSize)) const state: TableState = useMemo(() => ({ data, filteredData: data, // Will be computed by filters hook displayedData: data, // Will be computed by pagination currentPage, pageSize, totalPages, totalCount, selectedIds: new Set(), selectAllPages: false, activeFilters: {}, sortBy, sortDirection, searchTerm, debouncedSearchTerm, loading, loadingRows, error, viewMode, }), [ data, currentPage, pageSize, totalPages, totalCount, sortBy, sortDirection, searchTerm, debouncedSearchTerm, loading, loadingRows, error, viewMode, ]) const setData = useCallback((newData: TData[]) => { setDataState(newData) }, []) const setPage = useCallback((page: number) => { setCurrentPage(page) }, []) const setPageSize = useCallback((size: number) => { setPageSizeState(size) setCurrentPage(1) // Reset to first page when changing page size }, []) const setLoading = useCallback((isLoading: boolean) => { setLoadingState(isLoading) }, []) const setLoadingRows = useCallback((ids: Set) => { setLoadingRowsState(ids) }, []) const setError = useCallback((err: Error | null) => { setErrorState(err) }, []) const setViewMode = useCallback((mode: 'table' | 'card') => { setViewModeState(mode) }, []) return { state, setData, setPage, setPageSize, setLoading, setLoadingRows, setError, setViewMode, } }