Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

index.tsx 3.0KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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 h-8 max-w-[670px] shrink-0 items-center rounded-xl px-0.5 text-sm font-medium max-[1024px]:max-w-[400px]
  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 h-7 cursor-pointer items-center rounded-[10px] px-2.5
  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>
  60. {
  61. (hovered && curNav)
  62. ? <ArrowNarrowLeft className='h-4 w-4' />
  63. : isActivated
  64. ? activeIcon
  65. : icon
  66. }
  67. </div>
  68. <div className='ml-2 max-[1024px]:hidden'>
  69. {text}
  70. </div>
  71. </div>
  72. </Link>
  73. {
  74. curNav && isActivated && (
  75. <>
  76. <div className='font-light text-divider-deep'>/</div>
  77. <NavSelector
  78. isApp={isApp}
  79. curNav={curNav}
  80. navs={navs}
  81. createText={createText}
  82. onCreate={onCreate}
  83. onLoadmore={onLoadmore}
  84. />
  85. </>
  86. )
  87. }
  88. </div>
  89. )
  90. }
  91. export default Nav