ConceptPortal-public/rsconcept/frontend/src/components/ui/SelectSingle.tsx

73 lines
2.1 KiB
TypeScript
Raw Normal View History

'use client';
import { useMemo } from 'react';
import Select, { GroupBase, Props, StylesConfig } from 'react-select';
2024-04-01 19:07:20 +03:00
import { useConceptOptions } from '@/context/OptionsContext';
import { selectDarkT, selectLightT } from '@/styling/color';
2023-12-28 14:04:44 +03:00
interface SelectSingleProps<Option, Group extends GroupBase<Option> = GroupBase<Option>>
extends Omit<Props<Option, false, Group>, 'theme' | 'menuPortalTarget'> {
noPortal?: boolean;
2024-04-07 19:22:19 +03:00
noBorder?: boolean;
}
2023-12-28 14:04:44 +03:00
function SelectSingle<Option, Group extends GroupBase<Option> = GroupBase<Option>>({
noPortal,
2024-04-07 19:22:19 +03:00
noBorder,
2023-12-28 14:04:44 +03:00
...restProps
2023-11-29 13:07:55 +03:00
}: SelectSingleProps<Option, Group>) {
2024-04-01 19:07:20 +03:00
const { darkMode, colors } = useConceptOptions();
2023-12-28 14:04:44 +03:00
const themeColors = useMemo(() => (!darkMode ? selectLightT : selectDarkT), [darkMode]);
const adjustedStyles: StylesConfig<Option, false, Group> = useMemo(
2023-12-28 14:04:44 +03:00
() => ({
2024-04-07 19:22:19 +03:00
control: (defaultStyles, { isDisabled }) => ({
...defaultStyles,
2023-12-28 14:04:44 +03:00
borderRadius: '0.25rem',
2024-04-07 19:22:19 +03:00
...(noBorder ? { borderWidth: 0 } : {}),
2023-12-28 14:04:44 +03:00
cursor: isDisabled ? 'not-allowed' : 'pointer',
boxShadow: 'none'
}),
2024-04-07 19:22:19 +03:00
menuPortal: defaultStyles => ({
...defaultStyles,
2023-12-28 14:04:44 +03:00
zIndex: 9999
}),
2024-04-07 19:22:19 +03:00
menuList: defaultStyles => ({
...defaultStyles,
2023-12-28 14:04:44 +03:00
padding: '0px'
}),
2024-04-07 19:22:19 +03:00
option: (defaultStyles, { isSelected }) => ({
...defaultStyles,
backgroundColor: isSelected ? colors.bgSelected : defaultStyles.backgroundColor,
color: isSelected ? colors.fgSelected : defaultStyles.color,
2023-12-28 14:04:44 +03:00
borderWidth: '1px',
borderColor: colors.border
}),
2024-04-07 19:22:19 +03:00
input: defaultStyles => ({ ...defaultStyles }),
placeholder: defaultStyles => ({ ...defaultStyles }),
singleValue: defaultStyles => ({ ...defaultStyles })
}),
2024-04-07 19:22:19 +03:00
[colors, noBorder]
2023-12-28 14:04:44 +03:00
);
return (
2023-12-28 14:04:44 +03:00
<Select
noOptionsMessage={() => 'Список пуст'}
theme={theme => ({
...theme,
borderRadius: 0,
colors: {
...theme.colors,
...themeColors
}
})}
menuPortalTarget={!noPortal ? document.body : null}
styles={adjustedStyles}
{...restProps}
/>
);
}
2023-12-28 14:04:44 +03:00
export default SelectSingle;