@metapages/hash-query
Version:
Get/set URL parameters in the hash string instead of the query string.
48 lines (42 loc) • 1.27 kB
text/typescript
import { useCallback, useEffect, useState } from "react";
import {
getHashParamFromWindow,
getHashParamsFromWindow,
setHashParamInWindow,
SetHashParamOpts,
} from "../core";
/**
* Hook for getting/setting hash params
*/
export const useHashParam = (
key: string,
defaultValue?: string
): [
string | undefined,
(v: string | undefined, opts?: SetHashParamOpts) => void
] => {
const [hashParam, setHashParamInternal] = useState<string | undefined>(
getHashParamFromWindow(key) ?? defaultValue
);
useEffect(() => {
const [_, hashParams] = getHashParamsFromWindow();
if (defaultValue && hashParams[key] === undefined) {
setHashParamInWindow(key, defaultValue);
}
}, [defaultValue]);
useEffect(() => {
const onHashChange = (_: HashChangeEvent) => {
const paramHash = getHashParamsFromWindow()[1];
setHashParamInternal(paramHash[key]);
};
window.addEventListener("hashchange", onHashChange);
return () => window.removeEventListener("hashchange", onHashChange);
}, []);
const setParam: (v: string | undefined) => void = useCallback(
(value: string | undefined, opts?: SetHashParamOpts) => {
setHashParamInWindow(key, value, opts);
},
[]
);
return [hashParam, setParam];
};