Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

strict type for aria combobox #6167

Open
wants to merge 10 commits into
base: main
Choose a base branch
from

Conversation

ishank-s
Copy link
Member

@ishank-s ishank-s commented Apr 7, 2024

related to #3183

✅ Pull Request Checklist:

  • Included link to corresponding React Spectrum GitHub Issue.
  • Added/updated unit tests and storybook for this change (for new code or code which already has tests).
  • Filled out test instructions.
  • Updated documentation (if it already exists for this component).
  • Looked at the Accessibility Practices for this feature - Aria Practices

📝 Test Instructions:

🧢 Your Project:

@@ -86,7 +86,7 @@ export function useComboBox<T>(props: AriaComboBoxOptions<T>, state: ComboBoxSta
);

// Set listbox id so it can be used when calling getItemId later
listData.set(state, {id: menuProps.id});
listData.set(state, {id: menuProps.id || ''});
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it seems a bit off but would love some idea on this one

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is fine, you could also do menuProps.id! because we know that useMenuTrigger always returns an id on menuProps

now there's an obvious problem with this that I think you're alluding to, which is, useMenuTrigger could stop returning an id in that object. however, we have tests which catch this, so I'm not too concerned

Copy link
Member

@snowystinger snowystinger left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the PR! couple small comments and a question to the team for how we want to handle the required ref for menu trigger

@@ -45,7 +45,7 @@ export interface MenuTriggerAria<T> {
* @param state - State for the menu trigger.
* @param ref - Ref to the HTML element trigger for the menu.
*/
export function useMenuTrigger<T>(props: AriaMenuTriggerProps, state: MenuTriggerState, ref: RefObject<Element>): MenuTriggerAria<T> {
export function useMenuTrigger<T>(props: AriaMenuTriggerProps, state: MenuTriggerState, ref?: RefObject<Element>): MenuTriggerAria<T> {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think useMenuTrigger should have its ref as optional, it would interfere with longpress handling and arrow keys.

@devongovett how would you feel if combobox used useOverlayTrigger directly? it doesn't need longpress behavior

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

At a glance moving to using useOverlayTrigger seems feasible, pretty similar to what we do for MobileCombobox. Like you said, we don't need the long press stuff so we'd only need to copy over the id/pressProps stuff from useMenuTrigger into useComboBox.

Copy link
Member Author

@ishank-s ishank-s Apr 14, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hi do you want me to contribute useOverlayTrigger change.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Definitely feel free to give it a shot if you'd like! It would be good to know if something I'm overlooking would breaks with that change, just haven't had time to try it myself

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oh okay so there is these 2 props -

  • aria-labelledby which would break with using only overlay trigger and doesnt make sense to have arial labeled by in overlay trigger
  • onKeyDown - this im assuming is invoked whenever you press any key and it shows the combobox with relevant list item
    Both of these props dont fit in useOverlayTrigger.

We can do either of these -

  • make non null assertion for the useMenuTrigger invocation in useCombobox
  • Keep the ref optional.

I don't think useMenuTrigger should have its ref as optional, it would interfere with longpress handling and arrow keys.

On this point by @snowystinger would that not be true for arrow keys for combobox? Ignoring the longpress handling which doesnt make sense for combobox

  • create a sepeate trigger hook that takes in relevant combobox hook
    solves all problem but with code duplication as the new hook would essentially by useMenuTrigger without the required prop

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

apologies about the delay, mind clarifying these two:

aria-labelledby which would break with using only overlay trigger and doesnt make sense to have arial labeled by in overlay trigger

Could we set up a useId call in useComboBox and use that for the trigger id and the menu's aria-labelledby and override the ones that will be provided by useOverlayTrigger?

onKeyDown - this im assuming is invoked whenever you press any key and it shows the combobox with relevant list item

similar to above, perhaps we could copy over the menutrigger's onKeyDown over to useComboBox as well?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hi sorry, been busy with work. will try your suggestions soon thanks for guidance.

@@ -86,7 +86,7 @@ export function useComboBox<T>(props: AriaComboBoxOptions<T>, state: ComboBoxSta
);

// Set listbox id so it can be used when calling getItemId later
listData.set(state, {id: menuProps.id});
listData.set(state, {id: menuProps.id || ''});
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is fine, you could also do menuProps.id! because we know that useMenuTrigger always returns an id on menuProps

now there's an obvious problem with this that I think you're alluding to, which is, useMenuTrigger could stop returning an id in that object. however, we have tests which catch this, so I'm not too concerned

@ishank-s ishank-s requested a review from LFDanLu April 14, 2024 09:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants