mirror of
https://gitee.com/dify_ai/dify.git
synced 2024-12-05 04:38:37 +08:00
44 lines
1.7 KiB
TypeScript
44 lines
1.7 KiB
TypeScript
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
|
|
}
|