Skip to content

Commit ecb7371

Browse files
authored
fix: Only display first selected item when single Select has array value (#8925)
1 parent b187771 commit ecb7371

File tree

1 file changed

+11
-9
lines changed

1 file changed

+11
-9
lines changed

packages/@react-stately/select/src/useSelectState.ts

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -88,12 +88,14 @@ export function useSelectState<T extends object, M extends SelectionMode = 'sing
8888
let value = useMemo(() => {
8989
return props.value ?? (selectionMode === 'single' ? props.selectedKey : undefined) as ValueType<M>;
9090
}, [props.value, props.selectedKey, selectionMode]);
91-
let [controlledValue, setControlledValue] = useControlledState<ValueType<M>>(value as any, defaultValue as any, props.onChange);
91+
let [controlledValue, setControlledValue] = useControlledState<Key | Key[] | null>(value, defaultValue, props.onChange as any);
92+
// Only display the first selected item if in single selection mode but the value is an array.
93+
let displayValue = selectionMode === 'single' && Array.isArray(controlledValue) ? controlledValue[0] : controlledValue;
9294
let setValue = (value: Key | Key[] | null) => {
9395
if (selectionMode === 'single') {
9496
let key = Array.isArray(value) ? value[0] ?? null : value;
95-
setControlledValue(key as ValueType<M>);
96-
if (key !== controlledValue) {
97+
setControlledValue(key);
98+
if (key !== displayValue) {
9799
props.onSelectionChange?.(key);
98100
}
99101
} else {
@@ -104,7 +106,7 @@ export function useSelectState<T extends object, M extends SelectionMode = 'sing
104106
keys = [value];
105107
}
106108

107-
setControlledValue(keys as ValueType<M>);
109+
setControlledValue(keys);
108110
}
109111
};
110112

@@ -113,7 +115,7 @@ export function useSelectState<T extends object, M extends SelectionMode = 'sing
113115
selectionMode,
114116
disallowEmptySelection: selectionMode === 'single',
115117
allowDuplicateSelectionEvents: true,
116-
selectedKeys: useMemo(() => convertValue(controlledValue), [controlledValue]),
118+
selectedKeys: useMemo(() => convertValue(displayValue), [displayValue]),
117119
onSelectionChange: (keys: Selection) => {
118120
// impossible, but TS doesn't know that
119121
if (keys === 'all') {
@@ -139,18 +141,18 @@ export function useSelectState<T extends object, M extends SelectionMode = 'sing
139141

140142
let validationState = useFormValidationState({
141143
...props,
142-
value: Array.isArray(controlledValue) && controlledValue.length === 0 ? null : controlledValue as any
144+
value: Array.isArray(displayValue) && displayValue.length === 0 ? null : displayValue as any
143145
});
144146

145147
let [isFocused, setFocused] = useState(false);
146-
let [initialValue] = useState(controlledValue);
148+
let [initialValue] = useState(displayValue);
147149

148150
return {
149151
...validationState,
150152
...listState,
151153
...triggerState,
152-
value: controlledValue,
153-
defaultValue: defaultValue ?? initialValue,
154+
value: displayValue as ValueType<M>,
155+
defaultValue: defaultValue ?? initialValue as ValueType<M>,
154156
setValue,
155157
selectedKey,
156158
setSelectedKey: setValue,

0 commit comments

Comments
 (0)