Skip to content

Commit 6d2fe6a

Browse files
authored
chore: add useSelect hiddenSelectProps (#8490)
1 parent 7c3fe1f commit 6d2fe6a

File tree

5 files changed

+25
-32
lines changed

5 files changed

+25
-32
lines changed

packages/@react-aria/select/docs/useSelect.mdx

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -144,18 +144,14 @@ function Select(props) {
144144
labelProps,
145145
triggerProps,
146146
valueProps,
147-
menuProps
147+
menuProps,
148+
hiddenSelectProps
148149
} = useSelect(props, state, ref);
149150

150151
return (
151152
<div style={{display: 'inline-block'}}>
152153
<div {...labelProps}>{props.label}</div>
153-
<HiddenSelect
154-
isDisabled={props.isDisabled}
155-
state={state}
156-
triggerRef={ref}
157-
label={props.label}
158-
name={props.name} />
154+
<HiddenSelect {...hiddenSelectProps} />
159155
<Button
160156
{...triggerProps}
161157
buttonRef={ref}

packages/@react-aria/select/src/useSelect.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import {AriaSelectProps} from '@react-types/select';
1616
import {chain, filterDOMProps, mergeProps, useId} from '@react-aria/utils';
1717
import {DOMAttributes, KeyboardDelegate, RefObject, ValidationResult} from '@react-types/shared';
1818
import {FocusEvent, useMemo} from 'react';
19+
import {HiddenSelectProps} from './HiddenSelect';
1920
import {ListKeyboardDelegate, useTypeSelect} from '@react-aria/selection';
2021
import {SelectState} from '@react-stately/select';
2122
import {setInteractionModality} from '@react-aria/interactions';
@@ -48,7 +49,10 @@ export interface SelectAria<T> extends ValidationResult {
4849
descriptionProps: DOMAttributes,
4950

5051
/** Props for the select's error message element, if any. */
51-
errorMessageProps: DOMAttributes
52+
errorMessageProps: DOMAttributes,
53+
54+
/** Props for the hidden select element. */
55+
hiddenSelectProps: HiddenSelectProps<T>
5256
}
5357

5458
interface SelectData {
@@ -235,6 +239,14 @@ export function useSelect<T>(props: AriaSelectOptions<T>, state: SelectState<T>,
235239
errorMessageProps,
236240
isInvalid,
237241
validationErrors,
238-
validationDetails
242+
validationDetails,
243+
hiddenSelectProps: {
244+
isDisabled,
245+
name,
246+
label: props.label,
247+
state,
248+
triggerRef: ref,
249+
form
250+
}
239251
};
240252
}

packages/@react-aria/select/stories/example.tsx

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ export function Select<T extends object>(props: AriaSelectProps<T>): JSX.Element
2828
labelProps,
2929
triggerProps,
3030
valueProps,
31-
menuProps
31+
menuProps,
32+
hiddenSelectProps
3233
} = useSelect(props, state, ref);
3334

3435
// Get props for the button based on the trigger props from useSelect
@@ -37,11 +38,7 @@ export function Select<T extends object>(props: AriaSelectProps<T>): JSX.Element
3738
return (
3839
<div style={{position: 'relative', display: 'inline-block'}}>
3940
<div {...labelProps}>{props.label}</div>
40-
<HiddenSelect
41-
state={state}
42-
triggerRef={ref}
43-
label={props.label}
44-
name={props.name} />
41+
<HiddenSelect {...hiddenSelectProps} />
4542
<button
4643
{...buttonProps}
4744
ref={ref}

packages/@react-spectrum/picker/src/Picker.tsx

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,8 @@ export const Picker = React.forwardRef(function Picker<T extends object>(props:
5959
shouldFlip = true,
6060
placeholder = stringFormatter.format('placeholder'),
6161
isQuiet,
62-
label,
6362
labelPosition = 'top' as LabelPosition,
6463
menuWidth,
65-
name,
66-
form,
6764
autoFocus
6865
} = props;
6966

@@ -83,7 +80,7 @@ export const Picker = React.forwardRef(function Picker<T extends object>(props:
8380
// so that the layout information can be cached even while the listbox is not mounted.
8481
// We also use the layout as the keyboard delegate for type to select.
8582
let layout = useListBoxLayout();
86-
let {labelProps, triggerProps, valueProps, menuProps, descriptionProps, errorMessageProps, isInvalid, validationErrors, validationDetails} = useSelect({
83+
let {labelProps, triggerProps, valueProps, menuProps, hiddenSelectProps, descriptionProps, errorMessageProps, isInvalid, validationErrors, validationDetails} = useSelect({
8784
...props,
8885
'aria-describedby': (isLoadingInitial ? progressCircleId : undefined)
8986
}, state, unwrappedTriggerRef);
@@ -181,12 +178,7 @@ export const Picker = React.forwardRef(function Picker<T extends object>(props:
181178
}>
182179
<HiddenSelect
183180
autoComplete={autoComplete}
184-
isDisabled={isDisabled}
185-
state={state}
186-
triggerRef={unwrappedTriggerRef}
187-
label={label}
188-
name={name}
189-
form={form} />
181+
{...hiddenSelectProps} />
190182
<PressResponder {...mergeProps(hoverProps, triggerProps)}>
191183
<FieldButton
192184
ref={triggerRef}

packages/react-aria-components/src/Select.tsx

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ function SelectInner<T extends object>({props, selectRef: ref, collection}: Sele
133133
menuProps,
134134
descriptionProps,
135135
errorMessageProps,
136+
hiddenSelectProps,
136137
...validation
137138
} = useSelect({
138139
...removeDataAttributes(props),
@@ -214,13 +215,8 @@ function SelectInner<T extends object>({props, selectRef: ref, collection}: Sele
214215
data-required={props.isRequired || undefined}>
215216
{renderProps.children}
216217
<HiddenSelect
217-
autoComplete={props.autoComplete}
218-
state={state}
219-
triggerRef={buttonRef}
220-
label={label}
221-
name={props.name}
222-
form={props.form}
223-
isDisabled={props.isDisabled} />
218+
{...hiddenSelectProps}
219+
autoComplete={props.autoComplete} />
224220
</div>
225221
</Provider>
226222
);

0 commit comments

Comments
 (0)