mirror of
https://github.com/cpvalente/ontime.git
synced 2026-07-26 10:38:55 +00:00
1849b4d39f
* chore: migrate eslint to oxlint * chore: migrate prettier to oxfmt * chore: migrate typescript * chore: toThrow should have a expected value * chore: cast test value as Day * chore: small title fix * chore: mocks should be hoisted * chore: incorrect async useage * chore: test should be inside description * chore: test sohuld include an expeced * chore: oxfmt --------- Co-authored-by: alex-Arc <omnivox@LAPTOP-RC5SNBVV.localdomain>
57 lines
1.8 KiB
TypeScript
57 lines
1.8 KiB
TypeScript
import { useDebouncedCallback } from '@mantine/hooks';
|
|
import { ViewSettings } from 'ontime-types';
|
|
import { UseControllerProps, useController } from 'react-hook-form';
|
|
import { IoEyedrop } from 'react-icons/io5';
|
|
|
|
import { cx, getAccessibleColour } from '../../../utils/styleUtils';
|
|
import PopoverPicker from '../popover-picker/PopoverPicker';
|
|
|
|
import style from './SwatchSelect.module.scss';
|
|
|
|
interface SwatchPickerProps {
|
|
color: string;
|
|
isSelected?: boolean;
|
|
onChange: (name: string) => void;
|
|
alwaysDisplayColor?: boolean;
|
|
}
|
|
|
|
export default function SwatchPicker(props: SwatchPickerProps) {
|
|
const { color, onChange, isSelected, alwaysDisplayColor } = props;
|
|
|
|
const debouncedOnChange = useDebouncedCallback((newValue: string) => {
|
|
onChange(newValue);
|
|
}, 100);
|
|
|
|
const displayColor = alwaysDisplayColor || isSelected ? color : '';
|
|
const { color: iconColor } = getAccessibleColour(displayColor);
|
|
|
|
return (
|
|
<PopoverPicker color={displayColor} onChange={debouncedOnChange}>
|
|
<div
|
|
className={cx([style.swatch, isSelected && style.selected, style.selectable])}
|
|
style={{ backgroundColor: displayColor }}
|
|
>
|
|
<IoEyedrop color={iconColor} />
|
|
</div>
|
|
</PopoverPicker>
|
|
);
|
|
}
|
|
|
|
export function SwatchPickerRHF(props: UseControllerProps<ViewSettings>) {
|
|
const { name, control } = props;
|
|
const {
|
|
field: { onChange, value },
|
|
} = useController({ control, name });
|
|
|
|
const displayColor = typeof value === 'string' ? value : '';
|
|
const { color: iconColor } = getAccessibleColour(displayColor);
|
|
|
|
return (
|
|
<PopoverPicker color={value as string} onChange={onChange}>
|
|
<div className={cx([style.swatch, style.selectable])} style={{ backgroundColor: displayColor }}>
|
|
<IoEyedrop color={iconColor} />
|
|
</div>
|
|
</PopoverPicker>
|
|
);
|
|
}
|