| 
                        1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 | 
                        - import { type ReadonlyURLSearchParams, usePathname, useRouter, useSearchParams } from 'next/navigation'
 - import { useCallback, useMemo } from 'react'
 - 
 - export type DocumentListQuery = {
 -   page: number
 -   limit: number
 -   keyword: string
 - }
 - 
 - const DEFAULT_QUERY: DocumentListQuery = {
 -   page: 1,
 -   limit: 10,
 -   keyword: '',
 - }
 - 
 - // Parse the query parameters from the URL search string.
 - function parseParams(params: ReadonlyURLSearchParams): DocumentListQuery {
 -   const page = Number.parseInt(params.get('page') || '1', 10)
 -   const limit = Number.parseInt(params.get('limit') || '10', 10)
 -   const keyword = params.get('keyword') || ''
 - 
 -   return {
 -     page: page > 0 ? page : 1,
 -     limit: (limit > 0 && limit <= 100) ? limit : 10,
 -     keyword: keyword ? decodeURIComponent(keyword) : '',
 -   }
 - }
 - 
 - // Update the URL search string with the given query parameters.
 - function updateSearchParams(query: DocumentListQuery, searchParams: URLSearchParams) {
 -   const { page, limit, keyword } = query || {}
 - 
 -   const hasNonDefaultParams = (page && page > 1) || (limit && limit !== 10) || (keyword && keyword.trim())
 - 
 -   if (hasNonDefaultParams) {
 -     searchParams.set('page', (page || 1).toString())
 -     searchParams.set('limit', (limit || 10).toString())
 -   }
 -   else {
 -     searchParams.delete('page')
 -     searchParams.delete('limit')
 -   }
 - 
 -   if (keyword && keyword.trim())
 -     searchParams.set('keyword', encodeURIComponent(keyword))
 -   else
 -     searchParams.delete('keyword')
 - }
 - 
 - function useDocumentListQueryState() {
 -   const searchParams = useSearchParams()
 -   const query = useMemo(() => parseParams(searchParams), [searchParams])
 - 
 -   const router = useRouter()
 -   const pathname = usePathname()
 - 
 -   // Helper function to update specific query parameters
 -   const updateQuery = useCallback((updates: Partial<DocumentListQuery>) => {
 -     const newQuery = { ...query, ...updates }
 -     const params = new URLSearchParams()
 -     updateSearchParams(newQuery, params)
 -     const search = params.toString()
 -     const queryString = search ? `?${search}` : ''
 -     router.push(`${pathname}${queryString}`, { scroll: false })
 -   }, [query, router, pathname])
 - 
 -   // Helper function to reset query to defaults
 -   const resetQuery = useCallback(() => {
 -     const params = new URLSearchParams()
 -     updateSearchParams(DEFAULT_QUERY, params)
 -     const search = params.toString()
 -     const queryString = search ? `?${search}` : ''
 -     router.push(`${pathname}${queryString}`, { scroll: false })
 -   }, [router, pathname])
 - 
 -   return useMemo(() => ({
 -     query,
 -     updateQuery,
 -     resetQuery,
 -   }), [query, updateQuery, resetQuery])
 - }
 - 
 - export default useDocumentListQueryState
 
 
  |