Spaces:
Build error
Build error
import { usePathname, useSearchParams } from 'next/navigation' | |
import { useState } from 'react' | |
type UseTabSearchParamsOptions = { | |
defaultTab: string | |
routingBehavior?: 'push' | 'replace' | |
searchParamName?: string | |
disableSearchParams?: boolean | |
} | |
/** | |
* Custom hook to manage tab state via URL search parameters in a Next.js application. | |
* This hook allows for syncing the active tab with the browser's URL, enabling bookmarking and sharing of URLs with a specific tab activated. | |
* | |
* @param {UseTabSearchParamsOptions} options Configuration options for the hook: | |
* - `defaultTab`: The tab to default to when no tab is specified in the URL. | |
* - `routingBehavior`: Optional. Determines how changes to the active tab update the browser's history ('push' or 'replace'). Default is 'push'. | |
* - `searchParamName`: Optional. The name of the search parameter that holds the tab state in the URL. Default is 'category'. | |
* @returns A tuple where the first element is the active tab and the second element is a function to set the active tab. | |
*/ | |
export const useTabSearchParams = ({ | |
defaultTab, | |
routingBehavior = 'push', | |
searchParamName = 'category', | |
disableSearchParams = false, | |
}: UseTabSearchParamsOptions) => { | |
const pathName = usePathname() | |
const searchParams = useSearchParams() | |
const [activeTab, setTab] = useState<string>( | |
!disableSearchParams | |
? (searchParams.get(searchParamName) || defaultTab) | |
: defaultTab, | |
) | |
const setActiveTab = (newActiveTab: string) => { | |
setTab(newActiveTab) | |
if (disableSearchParams) | |
return | |
history[`${routingBehavior}State`](null, '', `${pathName}?${searchParamName}=${newActiveTab}`) | |
} | |
return [activeTab, setActiveTab] as const | |
} | |