index.tsx 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. 'use client'
  2. import React, { useEffect, useState } from 'react'
  3. import Link from 'next/link'
  4. import { usePathname, useSearchParams, useSelectedLayoutSegment } from 'next/navigation'
  5. import type { INavSelectorProps } from './nav-selector'
  6. import NavSelector from './nav-selector'
  7. import classNames from '@/utils/classnames'
  8. import { ArrowNarrowLeft } from '@/app/components/base/icons/src/vender/line/arrows'
  9. import { useStore as useAppStore } from '@/app/components/app/store'
  10. type INavProps = {
  11. icon: React.ReactNode
  12. activeIcon?: React.ReactNode
  13. text: string
  14. activeSegment: string | string[]
  15. link: string
  16. isApp: boolean
  17. } & INavSelectorProps
  18. const Nav = ({
  19. icon,
  20. activeIcon,
  21. text,
  22. activeSegment,
  23. link,
  24. curNav,
  25. navs,
  26. createText,
  27. onCreate,
  28. onLoadmore,
  29. isApp,
  30. }: INavProps) => {
  31. const setAppDetail = useAppStore(state => state.setAppDetail)
  32. const [hovered, setHovered] = useState(false)
  33. const segment = useSelectedLayoutSegment()
  34. const isActivated = Array.isArray(activeSegment) ? activeSegment.includes(segment!) : segment === activeSegment
  35. const pathname = usePathname()
  36. const searchParams = useSearchParams()
  37. const [linkLastSearchParams, setLinkLastSearchParams] = useState('')
  38. useEffect(() => {
  39. if (pathname === link)
  40. setLinkLastSearchParams(searchParams.toString())
  41. }, [pathname, searchParams])
  42. return (
  43. <div className={`
  44. flex items-center h-8 mr-0 sm:mr-3 px-0.5 rounded-xl text-sm shrink-0 font-medium
  45. ${isActivated && 'bg-components-main-nav-nav-button-bg-active shadow-md font-semibold'}
  46. ${!curNav && !isActivated && 'hover:bg-components-main-nav-nav-button-bg-hover'}
  47. `}>
  48. <Link href={link + (linkLastSearchParams && `?${linkLastSearchParams}`)}>
  49. <div
  50. onClick={() => setAppDetail()}
  51. className={classNames(`
  52. flex items-center h-7 px-2.5 cursor-pointer rounded-[10px]
  53. ${isActivated ? 'text-components-main-nav-nav-button-text-active' : 'text-components-main-nav-nav-button-text'}
  54. ${curNav && isActivated && 'hover:bg-components-main-nav-nav-button-bg-active-hover'}
  55. `)}
  56. onMouseEnter={() => setHovered(true)}
  57. onMouseLeave={() => setHovered(false)}
  58. >
  59. <div className='mr-2'>
  60. {
  61. (hovered && curNav)
  62. ? <ArrowNarrowLeft className='w-4 h-4' />
  63. : isActivated
  64. ? activeIcon
  65. : icon
  66. }
  67. </div>
  68. {text}
  69. </div>
  70. </Link>
  71. {
  72. curNav && isActivated && (
  73. <>
  74. <div className='font-light text-divider-deep'>/</div>
  75. <NavSelector
  76. isApp={isApp}
  77. curNav={curNav}
  78. navs={navs}
  79. createText={createText}
  80. onCreate={onCreate}
  81. onLoadmore={onLoadmore}
  82. />
  83. </>
  84. )
  85. }
  86. </div>
  87. )
  88. }
  89. export default Nav