123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- import type { ReactElement } from 'react'
- import { useId } from 'react'
- import { useContext } from 'use-context-selector'
- import RadioGroupContext from '../../context'
- import s from '../../style.module.css'
- import cn from '@/utils/classnames'
- export type IRadioProps = {
- className?: string
- labelClassName?: string
- children?: string | ReactElement
- checked?: boolean
- value?: string | number
- disabled?: boolean
- onChange?: (e?: IRadioProps['value']) => void
- }
- export default function Radio({
- className = '',
- labelClassName,
- children = '',
- checked,
- value,
- disabled,
- onChange,
- }: IRadioProps): JSX.Element {
- const groupContext = useContext(RadioGroupContext)
- const labelId = useId()
- const handleChange = (e: IRadioProps['value']) => {
- if (disabled)
- return
- onChange?.(e)
- groupContext?.onChange(e)
- }
- const isChecked = groupContext ? groupContext.value === value : checked
- const divClassName = `
- flex items-center py-1 relative
- px-7 cursor-pointer hover:bg-gray-200 rounded
- `
- return (
- <div className={cn(
- s.label,
- disabled ? s.disabled : '',
- isChecked ? 'bg-white shadow' : '',
- divClassName,
- className)}
- onClick={() => handleChange(value)}
- >
- {children && (
- <label className={
- cn(labelClassName, 'text-sm cursor-pointer')
- }
- id={labelId}
- >
- {children}
- </label>
- )}
- </div>
- )
- }
|