Skip to content

Commit 82f7c11

Browse files
committed
feat: update add disabled state to option
1 parent a48169b commit 82f7c11

File tree

1 file changed

+30
-17
lines changed

1 file changed

+30
-17
lines changed

src/components/Select/Select.tsx

+30-17
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { CaretDown, CaretUp, MagnifyingGlass, XCircle } from '@phosphor-icons/re
1616
interface Option {
1717
label: string;
1818
value: string;
19+
disabled?: boolean;
1920
}
2021

2122
interface BoemlySelectProps {
@@ -73,33 +74,43 @@ export const BoemlySelect: React.FC<BoemlySelectProps> = ({
7374
}, [isDisabled]);
7475

7576
// Handle selecting an option
76-
const handleOptionSelect = (optionValue: string) => {
77+
const handleOptionSelect = (optionValue: string, isOptionDisabled: boolean) => {
78+
if (isOptionDisabled) return;
7779
if (isMultiple) {
7880
const isAlreadySelected = selectedOptions.includes(optionValue);
7981
const newSelectedOptions = isAlreadySelected
8082
? selectedOptions.filter((val) => val !== optionValue)
8183
: [...selectedOptions, optionValue];
8284

8385
setSelectedOptions(newSelectedOptions);
84-
onChange?.(newSelectedOptions);
86+
if (onChange) {
87+
onChange(newSelectedOptions);
88+
}
8589
} else {
8690
setSelectedOptions([optionValue]);
87-
onChange?.(optionValue);
91+
if (onChange) {
92+
onChange(optionValue);
93+
}
8894
setIsOpen(false);
8995
}
9096
setSearchTerm('');
9197
};
9298

93-
const allOptionValues = useMemo(() => options.map((option) => option.value), [options]);
94-
9599
const onSelectAll = useCallback(() => {
96-
setSelectedOptions(allOptionValues);
97-
onChange?.(allOptionValues);
98-
}, [allOptionValues, onChange]);
100+
const enabledOptions = options
101+
.filter((option) => !option.disabled)
102+
.map((option) => option.value);
103+
setSelectedOptions(enabledOptions);
104+
if (onChange) {
105+
onChange(enabledOptions);
106+
}
107+
}, [options, onChange]);
99108

100109
const onClearAll = useCallback(() => {
101110
setSelectedOptions([]);
102-
onChange?.([]);
111+
if (onChange) {
112+
onChange([]);
113+
}
103114
}, [onChange]);
104115

105116
return (
@@ -179,26 +190,28 @@ export const BoemlySelect: React.FC<BoemlySelectProps> = ({
179190
overflowY="auto"
180191
>
181192
{filteredOptions.length > 0 ? (
182-
filteredOptions.map((option) => (
193+
filteredOptions.map(({ value, label, disabled = false }) => (
183194
<Flex
184-
key={option.value}
195+
key={value}
185196
width="100%"
186197
p="2"
187198
align="center"
188199
justify="space-between"
189-
onClick={() => handleOptionSelect(option.value)}
190-
cursor="pointer"
191-
_hover={{ bg: 'gray.100' }}
200+
onClick={() => handleOptionSelect(value, disabled)}
201+
cursor={disabled ? 'not-allowed' : 'pointer'}
202+
_hover={disabled ? {} : { bg: 'gray.100' }}
203+
opacity={disabled ? 0.5 : 1}
192204
>
193-
<Text>{option.label}</Text>
205+
<Text>{label}</Text>
194206
{isMultiple ? (
195207
<Checkbox
196-
isChecked={selectedOptions.includes(option.value)}
208+
isChecked={selectedOptions.includes(value)}
197209
pointerEvents="none"
198210
iconColor="black"
211+
isDisabled={disabled}
199212
/>
200213
) : (
201-
selectedOptions.includes(option.value) && <XCircle size={16} />
214+
selectedOptions.includes(value) && <XCircle size={16} />
202215
)}
203216
</Flex>
204217
))

0 commit comments

Comments
 (0)