選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

index.tsx 1.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  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. disabled?: boolean
  12. }
  13. export type ITabHeaderProps = {
  14. items: Item[]
  15. value: string
  16. itemClassName?: string
  17. onChange: (value: string) => void
  18. }
  19. const TabHeader: FC<ITabHeaderProps> = ({
  20. items,
  21. value,
  22. itemClassName,
  23. onChange,
  24. }) => {
  25. const renderItem = ({ id, name, icon, extra, disabled }: Item) => (
  26. <div
  27. key={id}
  28. className={cn(
  29. 'system-md-semibold relative flex cursor-pointer items-center border-b-2 border-transparent pb-2 pt-2.5',
  30. id === value ? 'border-components-tab-active text-text-primary' : 'text-text-tertiary',
  31. disabled && 'cursor-not-allowed opacity-30',
  32. )}
  33. onClick={() => !disabled && onChange(id)}
  34. >
  35. {icon || ''}
  36. <div className={cn('ml-2', itemClassName)}>{name}</div>
  37. {extra || ''}
  38. </div>
  39. )
  40. return (
  41. <div className='flex justify-between'>
  42. <div className='flex space-x-4'>
  43. {items.filter(item => !item.isRight).map(renderItem)}
  44. </div>
  45. <div className='flex space-x-4'>
  46. {items.filter(item => item.isRight).map(renderItem)}
  47. </div>
  48. </div>
  49. )
  50. }
  51. export default React.memo(TabHeader)