I'm currently building a search page and trying to use the URL and search params as the source of truth for the state but I'm running into some issues.
I initially had it as something simpler to below, but found that the back button didn't work (the react state caused it to redirect immediately), so I've had to do this. But it feels overly complicated, which makes me think it's the wrong approach.
For example, I have a select that changes the way the list is sorted and it looks like this:
className,
sort,
}: {
className?: string;
sort: string;
}) {
const [selected, setSelected] = React.useState(sort);
const [isStateUpdating, setIsStateUpdating] = React.useState(false);
const router = useRouter();
const pathname = usePathname();
const searchParams = useSearchParams();
const newSearchParams = React.useMemo(
() => new URLSearchParams(searchParams.toString()),
[searchParams]
);
selected !== ""
? newSearchParams.set("sort", selected)
: newSearchParams.delete("sort");
if (selected !== searchParams.get("sort")) {
newSearchParams.delete("page");
}
React.useEffect(() => {
if (
isStateUpdating &&
searchParams.toString() !== newSearchParams.toString()
) {
setIsStateUpdating(false);
router.push(`${pathname}?${newSearchParams.toString()}`);
}
}, [isStateUpdating, newSearchParams, pathname, router, searchParams]);
if (
!isStateUpdating &&
searchParams.toString() !== newSearchParams.toString()
) {
setSelected(searchParams.get("sort") || "relevant");
}
return <Insert Select Component here />
}
Is there a better way to do this?