mirror of
				https://github.com/langgenius/dify.git
				synced 2025-11-03 20:33:00 +00:00 
			
		
		
		
	Signed-off-by: -LAN- <laipz8200@outlook.com> Co-authored-by: Hash Brown <hi@xzd.me> Co-authored-by: crazywoola <427733928@qq.com> Co-authored-by: GareArc <chen4851@purdue.edu> Co-authored-by: Byron.wang <byron@dify.ai> Co-authored-by: Joel <iamjoel007@gmail.com> Co-authored-by: -LAN- <laipz8200@outlook.com> Co-authored-by: Garfield Dai <dai.hai@foxmail.com> Co-authored-by: KVOJJJin <jzongcode@gmail.com> Co-authored-by: Alexi.F <654973939@qq.com> Co-authored-by: Xiyuan Chen <52963600+GareArc@users.noreply.github.com> Co-authored-by: kautsar_masuara <61046989+izon-masuara@users.noreply.github.com> Co-authored-by: achmad-kautsar <achmad.kautsar@insignia.co.id> Co-authored-by: Xin Zhang <sjhpzx@gmail.com> Co-authored-by: kelvintsim <83445753+kelvintsim@users.noreply.github.com> Co-authored-by: zxhlyh <jasonapring2015@outlook.com> Co-authored-by: Zixuan Cheng <61724187+Theysua@users.noreply.github.com>
		
			
				
	
	
		
			47 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			47 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
'use client'
 | 
						|
import { usePathname, useRouter, 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 pathnameFromHook = usePathname()
 | 
						|
  const router = useRouter()
 | 
						|
  const pathName = pathnameFromHook || window?.location?.pathname
 | 
						|
  const searchParams = useSearchParams()
 | 
						|
  const [activeTab, setTab] = useState<string>(
 | 
						|
    !disableSearchParams
 | 
						|
      ? (searchParams.get(searchParamName) || defaultTab)
 | 
						|
      : defaultTab,
 | 
						|
  )
 | 
						|
 | 
						|
  const setActiveTab = (newActiveTab: string) => {
 | 
						|
    setTab(newActiveTab)
 | 
						|
    if (disableSearchParams)
 | 
						|
      return
 | 
						|
    router[`${routingBehavior}`](`${pathName}?${searchParamName}=${newActiveTab}`)
 | 
						|
  }
 | 
						|
 | 
						|
  return [activeTab, setActiveTab] as const
 | 
						|
}
 |