index.tsx 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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. mr-0 flex h-8 shrink-0 items-center rounded-xl px-0.5 text-sm font-medium sm:mr-3
  45. ${isActivated && 'bg-components-main-nav-nav-button-bg-active font-semibold shadow-md'}
  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='h-4 w-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