radio-button-setting.tsx 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import React from 'react'
  2. export type RadioOption<T extends string = string> = {
  3. value: T
  4. label: string
  5. description?: string
  6. }
  7. type RadioButtonSettingProps<T extends string = string> = {
  8. id: string
  9. options: Array<RadioOption<T>>
  10. value: T | undefined
  11. onChange: (value: T) => void
  12. }
  13. export default function RadioButtonSetting<T extends string = string>({
  14. id,
  15. options,
  16. value,
  17. onChange,
  18. }: RadioButtonSettingProps<T>) {
  19. const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {
  20. onChange(event.target.value as T)
  21. }
  22. return (
  23. <div className="ide-radio-setting-options">
  24. {options.map(option => (
  25. <label key={`${id}-${option.value}`} className="ide-radio-option">
  26. <input
  27. type="radio"
  28. id={`${id}-${option.value}`}
  29. name={id}
  30. value={option.value}
  31. checked={value === option.value}
  32. onChange={handleChange}
  33. className="ide-radio-input"
  34. />
  35. <div className="ide-radio-text">
  36. <span className="ide-setting-title">{option.label}</span>
  37. {option.description && (
  38. <span className="ide-setting-description">
  39. {option.description}
  40. </span>
  41. )}
  42. </div>
  43. </label>
  44. ))}
  45. </div>
  46. )
  47. }