index.tsx 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. 'use client'
  2. import type { FC } from 'react'
  3. import React from 'react'
  4. import cn from '@/utils/classnames'
  5. type Item = {
  6. id: string
  7. name: string
  8. isRight?: boolean
  9. icon?: React.ReactNode
  10. extra?: React.ReactNode
  11. }
  12. export type ITabHeaderProps = {
  13. items: Item[]
  14. value: string
  15. onChange: (value: string) => void
  16. }
  17. const TabHeader: FC<ITabHeaderProps> = ({
  18. items,
  19. value,
  20. onChange,
  21. }) => {
  22. const renderItem = ({ id, name, icon, extra }: Item) => (
  23. <div
  24. key={id}
  25. className={cn(
  26. 'system-md-semibold relative flex cursor-pointer items-center border-b-2 border-transparent pb-2 pt-2.5',
  27. id === value ? 'border-components-tab-active text-text-primary' : 'text-text-tertiary',
  28. )}
  29. onClick={() => onChange(id)}
  30. >
  31. {icon || ''}
  32. <div className='ml-2'>{name}</div>
  33. {extra || ''}
  34. </div>
  35. )
  36. return (
  37. <div className='flex justify-between'>
  38. <div className='flex space-x-4'>
  39. {items.filter(item => !item.isRight).map(renderItem)}
  40. </div>
  41. <div className='flex space-x-4'>
  42. {items.filter(item => item.isRight).map(renderItem)}
  43. </div>
  44. </div>
  45. )
  46. }
  47. export default React.memo(TabHeader)