Skip to content

Instantly share code, notes, and snippets.

@Iamsheye
Created June 24, 2024 01:35
Show Gist options
  • Save Iamsheye/0adfe1098d4cfcaaeaaf0405dc13a647 to your computer and use it in GitHub Desktop.
Save Iamsheye/0adfe1098d4cfcaaeaaf0405dc13a647 to your computer and use it in GitHub Desktop.
managing state in url
import { useRouter, useSearchParams, usePathname } from 'next/navigation';
import { useEffect, useState } from 'react';
type UseSearchParamStateReturn<T> = [T, (newValue: T) => void];
const useSearchParamState = <T>(param: string, defaultValue: T): UseSearchParamStateReturn<T> => {
const router = useRouter();
const pathname = usePathname();
const searchParams = useSearchParams();
const [value, setValue] = useState<T>(defaultValue);
useEffect(() => {
const paramValue = searchParams.get(param);
if (paramValue !== null) {
try {
const parsedValue = JSON.parse(paramValue);
setValue(parsedValue);
} catch (error) {
console.error('Failed to parse search param:', error);
}
}
}, [searchParams, param]);
const updateSearchParam = (newValue: T) => {
const stringifiedValue = JSON.stringify(newValue);
const newSearchParams = new URLSearchParams(searchParams.toString());
newSearchParams.set(param, stringifiedValue);
router.replace(`${pathname}?${newSearchParams.toString()}`);
setValue(newValue);
};
return [value, updateSearchParam];
};
export default useSearchParamState;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment