mirror of
				https://github.com/langgenius/dify.git
				synced 2025-10-31 10:53:02 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			82 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| 'use client'
 | |
| 
 | |
| import React, { useState } from 'react'
 | |
| import Link from 'next/link'
 | |
| import { useSelectedLayoutSegment } from 'next/navigation'
 | |
| import classNames from 'classnames'
 | |
| import type { INavSelectorProps } from './nav-selector'
 | |
| import NavSelector from './nav-selector'
 | |
| import { ArrowNarrowLeft } from '@/app/components/base/icons/src/vender/line/arrows'
 | |
| 
 | |
| type INavProps = {
 | |
|   icon: React.ReactNode
 | |
|   activeIcon?: React.ReactNode
 | |
|   text: string
 | |
|   activeSegment: string | string[]
 | |
|   link: string
 | |
| } & INavSelectorProps
 | |
| 
 | |
| const Nav = ({
 | |
|   icon,
 | |
|   activeIcon,
 | |
|   text,
 | |
|   activeSegment,
 | |
|   link,
 | |
|   curNav,
 | |
|   navs,
 | |
|   createText,
 | |
|   onCreate,
 | |
|   onLoadmore,
 | |
| }: INavProps) => {
 | |
|   const [hovered, setHovered] = useState(false)
 | |
|   const segment = useSelectedLayoutSegment()
 | |
|   const isActived = Array.isArray(activeSegment) ? activeSegment.includes(segment!) : segment === activeSegment
 | |
| 
 | |
|   return (
 | |
|     <div className={`
 | |
|       flex items-center h-8 mr-0 sm:mr-3 px-0.5 rounded-xl text-sm shrink-0 font-medium
 | |
|       ${isActived && 'bg-white shadow-md font-semibold'}
 | |
|       ${!curNav && !isActived && 'hover:bg-gray-200'}
 | |
|     `}>
 | |
|       <Link href={link}>
 | |
|         <div
 | |
|           className={classNames(`
 | |
|             flex items-center h-7 px-2.5 cursor-pointer rounded-[10px]
 | |
|             ${isActived ? 'text-primary-600' : 'text-gray-500'}
 | |
|             ${curNav && isActived && 'hover:bg-primary-50'}
 | |
|           `)}
 | |
|           onMouseEnter={() => setHovered(true)}
 | |
|           onMouseLeave={() => setHovered(false)}
 | |
|         >
 | |
|           <div className='mr-2'>
 | |
|             {
 | |
|               (hovered && curNav)
 | |
|                 ? <ArrowNarrowLeft className='w-4 h-4' />
 | |
|                 : isActived
 | |
|                   ? activeIcon
 | |
|                   : icon
 | |
|             }
 | |
|           </div>
 | |
|           {text}
 | |
|         </div>
 | |
|       </Link>
 | |
|       {
 | |
|         curNav && isActived && (
 | |
|           <>
 | |
|             <div className='font-light text-gray-300 '>/</div>
 | |
|             <NavSelector
 | |
|               curNav={curNav}
 | |
|               navs={navs}
 | |
|               createText={createText}
 | |
|               onCreate={onCreate}
 | |
|               onLoadmore={onLoadmore}
 | |
|             />
 | |
|           </>
 | |
|         )
 | |
|       }
 | |
|     </div>
 | |
|   )
 | |
| }
 | |
| 
 | |
| export default Nav
 | 
