index.tsx 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. 'use client'
  2. import type { FC } from 'react'
  3. import React from 'react'
  4. import cn from 'classnames'
  5. import s from './style.module.css'
  6. type Props = {
  7. className?: string
  8. icon: React.ReactNode
  9. iconBgClassName?: string
  10. title: React.ReactNode
  11. description: string
  12. noRadio?: boolean
  13. isChosen?: boolean
  14. onChosen?: () => void
  15. chosenConfig?: React.ReactNode
  16. chosenConfigWrapClassName?: string
  17. }
  18. const RadioCard: FC<Props> = ({
  19. icon,
  20. iconBgClassName = 'bg-[#F5F3FF]',
  21. title,
  22. description,
  23. noRadio,
  24. isChosen,
  25. onChosen = () => {},
  26. chosenConfig,
  27. chosenConfigWrapClassName,
  28. }) => {
  29. return (
  30. <div className={cn(s.item, isChosen && s.active)}>
  31. <div className='flex py-3 pl-3 pr-4' onClick={onChosen}>
  32. <div className={cn(iconBgClassName, 'mr-3 shrink-0 flex w-8 justify-center h-8 items-center rounded-lg')}>
  33. {icon}
  34. </div>
  35. <div className='grow'>
  36. <div className='leading-5 text-sm font-medium text-gray-900'>{title}</div>
  37. <div className='leading-[18px] text-xs font-normal text-[#667085]'>{description}</div>
  38. </div>
  39. {!noRadio && (
  40. <div className='shrink-0 flex items-center h-8'>
  41. <div className={s.radio}></div>
  42. </div>
  43. )}
  44. </div>
  45. {((isChosen && chosenConfig) || noRadio) && (
  46. <div className={cn(chosenConfigWrapClassName, 'pt-2 px-14 pb-6 border-t border-gray-200')}>
  47. {chosenConfig}
  48. </div>
  49. )}
  50. </div>
  51. )
  52. }
  53. export default React.memo(RadioCard)