Files
yaak-mountain-loop/src-web/components/core/RadioDropdown.tsx
2023-03-20 16:54:26 -07:00

31 lines
790 B
TypeScript

import { useMemo } from 'react';
import type { DropdownProps } from './Dropdown';
import { Dropdown } from './Dropdown';
import { Icon } from './Icon';
export interface RadioDropdownItem<T> {
label: string;
value: T;
}
export interface RadioDropdownProps<T> {
value: T;
onChange: (value: T) => void;
items: RadioDropdownItem<T>[];
children: DropdownProps['children'];
}
export function RadioDropdown<T>({ value, items, onChange, children }: RadioDropdownProps<T>) {
const dropdownItems = useMemo(
() =>
items.map(({ label, value: v }) => ({
label,
onSelect: () => onChange(v),
leftSlot: <Icon icon={value === v ? 'check' : 'empty'} />,
})),
[value, items],
);
return <Dropdown items={dropdownItems}>{children}</Dropdown>;
}