import { useRouter } from 'next/router' import { useCallback } from 'react' type Base = Record interface SetTab { (tab: keyof T): void } function compareTabsCaseInsensitive(tabs: T, tab?: string) { return Object .values(tabs) .find(v => v.toString().toLowerCase() === tab?.toLowerCase()) } export function useQueryTab(key: string, tabs: T, defaultTab: keyof T): [keyof T, SetTab] { const router = useRouter() const tab = compareTabsCaseInsensitive(tabs, router.query[key] as string) as keyof T || defaultTab const setTab = useCallback>(tab => { router.push({ pathname: router.pathname, query: { ...router.query, [key]: tabs[tab] as string, } }, undefined, { shallow: true }) }, [key, router, tabs]) return [tab, setTab] }