| 27 | * @returns {[T, (newValue: T) => void]} - A tuple with the stateful value and a setter function. |
| 28 | */ |
| 29 | const useQueryState = (key, initialValue, parser = v => v) => { |
| 30 | const [searchParams, setSearchParams] = useSearchParams() |
| 31 | const [state, setState] = useState(parser(searchParams.get(key)) || initialValue) |
| 32 | |
| 33 | useEffect(() => { |
| 34 | if (state === undefined || state === '') { |
| 35 | searchParams.delete(key) |
| 36 | } else { |
| 37 | searchParams.set(key, state) |
| 38 | } |
| 39 | setSearchParams(searchParams, { replace: true }) |
| 40 | }, [key, state, searchParams, setSearchParams]) |
| 41 | |
| 42 | return [state, setState] |
| 43 | } |
| 44 | |
| 45 | export default useQueryState |