mirror of
https://github.com/Stremio/stremio-web.git
synced 2026-04-05 00:10:16 +00:00
58 lines
1.9 KiB
TypeScript
58 lines
1.9 KiB
TypeScript
// Copyright (C) 2017-2024 Smart code 203358507
|
|
|
|
import React, { useCallback, ChangeEvent, KeyboardEvent } from 'react';
|
|
import classNames from 'classnames';
|
|
import styles from './RadioButton.less';
|
|
|
|
type Props = {
|
|
disabled?: boolean;
|
|
selected?: boolean;
|
|
className?: string;
|
|
onChange?: (checked: boolean) => void;
|
|
error?: string;
|
|
};
|
|
|
|
const RadioButton = ({ disabled, selected, className, onChange, error }: Props) => {
|
|
|
|
const handleSelect = useCallback(({ target }: ChangeEvent<HTMLInputElement>) => {
|
|
if (!disabled && onChange) {
|
|
onChange(target.checked);
|
|
}
|
|
}, [disabled, onChange]);
|
|
|
|
const onKeyDown = useCallback(({ key }: KeyboardEvent<HTMLDivElement>) => {
|
|
if ((key === 'Enter' || key === ' ') && !disabled) {
|
|
onChange && onChange(!selected);
|
|
}
|
|
}, [disabled, selected, onChange]);
|
|
|
|
return (
|
|
<div className={classNames(styles['radio-button'], className)}>
|
|
<label>
|
|
<div
|
|
className={classNames(
|
|
styles['radio-container'],
|
|
{ [styles['selected']]: selected },
|
|
{ [styles['disabled']]: disabled },
|
|
{ [styles['error']]: error }
|
|
)}
|
|
role={'radio'}
|
|
tabIndex={disabled ? -1 : 0}
|
|
aria-checked={selected}
|
|
onKeyDown={onKeyDown}
|
|
>
|
|
<input
|
|
type={'radio'}
|
|
checked={selected}
|
|
disabled={disabled}
|
|
onChange={handleSelect}
|
|
className={styles['input']}
|
|
/>
|
|
<span className={styles['inner-circle']} />
|
|
</div>
|
|
</label>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default RadioButton;
|