import { useCallback, useEffect, useState } from 'react' import { useSearchParams } from 'react-router-dom' import { z, ZodSchema } from 'zod' export default function useQueryParameterState( schema: T, queryKey: string, initialValue: z.infer ): [z.infer, (value: z.infer) => void] { const [state, setRawState] = useState(initialValue) const [searchParams, setSearchParams] = useSearchParams() const queryValue = searchParams.get(queryKey) useEffect(() => { const parsed = schema.safeParse(queryValue) if (parsed.success) { setRawState(parsed.data) } }, [queryValue, schema]) const setState = useCallback( (value: z.infer) => { setRawState(value) const strValue = String(value) const kv: Record = {} kv[queryKey] = strValue setSearchParams(kv, { replace: true, }) }, [queryKey, setSearchParams] ) return [state, setState] }