diff --git a/src/components/Radio.tsx b/src/components/Radio.tsx new file mode 100644 index 0000000..f01b4ef --- /dev/null +++ b/src/components/Radio.tsx @@ -0,0 +1,59 @@ +import { Icon } from '@iconify-icon/solid'; +import { isNotNil } from 'es-toolkit'; +import { + createEffect, + createMemo, + createSignal, + mergeProps, + ParentComponent, + ParentProps, + Show, +} from 'solid-js'; + +interface RadioProps { + name?: string; + checked?: boolean; + disabled?: boolean; + onChange?: (value: boolean) => void; +} + +const Radio: ParentComponent = (props) => { + const mProps = mergeProps[]>( + { + disabled: false, + }, + props, + ); + + const originalChecked = createMemo(() => mProps.checked); + const [internalChecked, setInternalChecked] = createSignal(undefined); + + createEffect(() => { + if (isNotNil(originalChecked()) && originalChecked() !== internalChecked()) { + setInternalChecked(originalChecked()); + } + }); + + const handleClick = () => { + if (mProps.disabled) { + return; + } + setInternalChecked((prev) => !prev); + }; + + return ( +
+ +
{props.children}
+ + + +
+ ); +}; + +export default Radio;