import type { SortType } from '@/service/datasets' import { useDebounce } from 'ahooks' import { useCallback, useState } from 'react' import { normalizeStatusForQuery, sanitizeStatusValue } from '../status-filter' import { useDocumentListQueryState } from './use-document-list-query-state' export function useDocumentsPageState() { const { query, updateQuery } = useDocumentListQueryState() const inputValue = query.keyword const debouncedSearchValue = useDebounce(query.keyword, { wait: 500 }) const statusFilterValue = sanitizeStatusValue(query.status) const sortValue = query.sort const normalizedStatusFilterValue = normalizeStatusForQuery(statusFilterValue) const currPage = query.page - 1 const limit = query.limit const [selectedIds, setSelectedIds] = useState([]) const handlePageChange = useCallback( (newPage: number) => { updateQuery({ page: newPage + 1 }) }, [updateQuery], ) const handleLimitChange = useCallback( (newLimit: number) => { updateQuery({ limit: newLimit, page: 1 }) }, [updateQuery], ) const handleInputChange = useCallback( (value: string) => { if (value !== query.keyword) setSelectedIds([]) updateQuery({ keyword: value, page: 1 }) }, [query.keyword, updateQuery], ) const handleStatusFilterChange = useCallback( (value: string) => { const selectedValue = sanitizeStatusValue(value) setSelectedIds([]) updateQuery({ status: selectedValue, page: 1 }) }, [updateQuery], ) const handleStatusFilterClear = useCallback(() => { if (statusFilterValue === 'all') return setSelectedIds([]) updateQuery({ status: 'all', page: 1 }) }, [statusFilterValue, updateQuery]) const handleSortChange = useCallback( (value: string) => { const next = value as SortType if (next === sortValue) return updateQuery({ sort: next, page: 1 }) }, [sortValue, updateQuery], ) return { inputValue, debouncedSearchValue, handleInputChange, statusFilterValue, sortValue, normalizedStatusFilterValue, handleStatusFilterChange, handleStatusFilterClear, handleSortChange, currPage, limit, handlePageChange, handleLimitChange, selectedIds, setSelectedIds, } }