totp/src/Select.tsx

23 lines
737 B
TypeScript
Raw Normal View History

2025-02-10 18:05:02 -05:00
import {ChangeEvent, ReactNode, useCallback, useId} from 'react';
2024-04-07 00:13:19 -04:00
export default function Select<T extends string>({label, options, value, onChange}: {
2025-02-10 13:34:32 -05:00
label: ReactNode;
2024-04-07 00:13:19 -04:00
options: Record<T, string>;
value: T;
onChange: (value: T) => void;
}) {
2025-02-10 13:34:32 -05:00
const id = useId();
const handleChange = useCallback(
(e: ChangeEvent<HTMLSelectElement>) => onChange(e.target.value as T),
2024-04-07 00:13:19 -04:00
[onChange],
);
return <div className="totp-select">
<label htmlFor={id} className="form-label">{label}</label>
<select id={id} className="form-select" value={value} onChange={handleChange}>
{Object.entries(options).map(([key, value]) =>
<option key={key} value={key}>{value as string}</option>)}
</select>
</div>;
}