index.tsx 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. 'use client'
  2. import React, { useState } from 'react'
  3. import Link from 'next/link'
  4. import { useSelectedLayoutSegment } from 'next/navigation'
  5. import classNames from 'classnames'
  6. import type { INavSelectorProps } from './nav-selector'
  7. import NavSelector from './nav-selector'
  8. import { ArrowNarrowLeft } from '@/app/components/base/icons/src/vender/line/arrows'
  9. type INavProps = {
  10. icon: React.ReactNode
  11. activeIcon?: React.ReactNode
  12. text: string
  13. activeSegment: string | string[]
  14. link: string
  15. } & INavSelectorProps
  16. const Nav = ({
  17. icon,
  18. activeIcon,
  19. text,
  20. activeSegment,
  21. link,
  22. curNav,
  23. navs,
  24. createText,
  25. onCreate,
  26. onLoadmore,
  27. }: INavProps) => {
  28. const [hovered, setHovered] = useState(false)
  29. const segment = useSelectedLayoutSegment()
  30. const isActived = Array.isArray(activeSegment) ? activeSegment.includes(segment!) : segment === activeSegment
  31. return (
  32. <div className={`
  33. flex items-center h-8 mr-3 px-0.5 rounded-xl text-sm shrink-0 font-medium
  34. ${isActived && 'bg-white shadow-md font-semibold'}
  35. ${!curNav && !isActived && 'hover:bg-gray-200'}
  36. `}>
  37. <Link href={link}>
  38. <div
  39. className={classNames(`
  40. flex items-center h-7 px-2.5 cursor-pointer rounded-[10px]
  41. ${isActived ? 'text-primary-600' : 'text-gray-500'}
  42. ${curNav && isActived && 'hover:bg-primary-50'}
  43. `)}
  44. onMouseEnter={() => setHovered(true)}
  45. onMouseLeave={() => setHovered(false)}
  46. >
  47. <div className='mr-2'>
  48. {
  49. (hovered && curNav)
  50. ? <ArrowNarrowLeft className='w-4 h-4' />
  51. : isActived
  52. ? activeIcon
  53. : icon
  54. }
  55. </div>
  56. {text}
  57. </div>
  58. </Link>
  59. {
  60. curNav && isActived && (
  61. <>
  62. <div className='font-light text-gray-300 '>/</div>
  63. <NavSelector
  64. curNav={curNav}
  65. navs={navs}
  66. createText={createText}
  67. onCreate={onCreate}
  68. onLoadmore={onLoadmore}
  69. />
  70. </>
  71. )
  72. }
  73. </div>
  74. )
  75. }
  76. export default Nav