You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
39 lines
978 B
39 lines
978 B
import { useCallback, useMemo } from "react"; |
|
import { useLocation, useNavigate } from "react-router-dom"; |
|
|
|
export function useQueryParams() { |
|
const loc = useLocation(); |
|
|
|
const queryParams = useMemo(() => { |
|
const obj: Record<string, string> = Object.fromEntries( |
|
new URLSearchParams(loc.search).entries(), |
|
); |
|
|
|
return obj; |
|
}, [loc.search]); |
|
|
|
return queryParams; |
|
} |
|
|
|
export function useQueryParam( |
|
param: string, |
|
): [string | null, (a: string | null) => void] { |
|
const params = useQueryParams(); |
|
const location = useLocation(); |
|
const navigate = useNavigate(); |
|
const currentValue = params[param] ?? null; |
|
|
|
const set = useCallback( |
|
(value: string | null) => { |
|
const parsed = new URLSearchParams(location.search); |
|
if (value) parsed.set(param, value); |
|
else parsed.delete(param); |
|
navigate({ |
|
search: parsed.toString(), |
|
}); |
|
}, |
|
[param, location.search, navigate], |
|
); |
|
|
|
return [currentValue, set]; |
|
}
|
|
|