import "./radio.scss"; import * as React from "react"; import { cssNames } from "../../utils"; import uniqueId from "lodash/uniqueId"; // todo: refactor with contexts interface RadioGroupProps { className?: any; value?: any; asButtons?: boolean; disabled?: boolean; onChange?(value: string): void; } export class RadioGroup extends React.Component { render() { const name = uniqueId("radioGroup"); const { value, asButtons, disabled, onChange } = this.props; let { className } = this.props; className = cssNames("RadioGroup", { buttonsView: asButtons }, className); const radios = React.Children.toArray(this.props.children) as React.ReactElement[]; return (
{radios.map(radio => { return React.cloneElement(radio, { name: name, disabled: disabled !== undefined ? disabled : radio.props.disabled, checked: radio.props.value === value, onChange: onChange } as any) })}
); } } type RadioProps = React.HTMLProps & { name?: string; label?: React.ReactNode | any; value?: any; checked?: boolean; disabled?: boolean; onChange?(value: React.ChangeEvent): void; } export class Radio extends React.Component { private elem: HTMLElement; onChange = () => { const { value, onChange, checked } = this.props; if (!checked && onChange) { onChange(value); } } onKeyDown = (e: React.KeyboardEvent) => { const SPACE_KEY = e.keyCode === 32; const ENTER_KEY = e.keyCode === 13; if (SPACE_KEY || ENTER_KEY) { this.elem.click(); e.preventDefault(); } } render() { const { className, label, checked, children, ...inputProps } = this.props; const componentClass = cssNames('Radio flex align-center', className, { checked: checked, disabled: this.props.disabled, }); return ( ); } }