Provide a general summary of the issue here
After doing a Tabs implementation where we are using each Tab as a link, per the docs, I've noticed that onSelectionChange doesn't fire correctly.
🤔 Expected Behavior?
onSelectionChange should fire with the current key
onSelectionChange should fire on keyboard navigation between tabs
😯 Current Behavior
onSelectionChange is firing with the previous key
onSelectionChange is not firing on keyboard navigation
💁 Possible Solution
No response
🔦 Context
I've been adding analytics functionality to our implementation of Tabs, that should track each tab change a user makes. To make it easier for our product/analytics people to use the results in their dashboards and reports, the tracking should include the tab's text value, as opposed to it's key. To do this without using useTabList—because we would like to keep the rest of what Tabs offers for 'free'—I am having to use a sub-component that can access TabListState, which we can then use to create the tracking function and pass it back to Tabs via state.
const UpdateTabTrackingFunction = ({ setTrackTabChange }) => {
const tabListState = useContext(TabListStateContext);
useEffect(() => {
setTrackTabChange(() => (key) => {
track('TabChange', tabListState?.collection?.getItem(key)?.textValue);
});
}, [tabListState?.collection]); // eslint-disable-line react-hooks/exhaustive-deps
return null;
};
const CustomTabs = (props: ComponentPropsWithoutRef<typeof Tabs>) => {
const [trackTabChange, setTrackTabChange] = useState(null);
const onSelectionChange = (key) => {
props.onSelectionChange?.(key);
trackTabChange?.(key);
};
return (
<Tabs {...props} onSelectionChange={onSelectionChange}>
<>
<UpdateTabTrackingFunction setTrackTabChange={setTrackTabChange} />
{props.children}
</>
</Tabs>
);
};
It's a little ugly, but does the job! I should also note that it would be really nice to have access to the full tab item in onSelectionChange, which would help us avoid this situation.
When testing this with our tabs that use links, I noticed the reported behaviour.
🖥️ Steps to Reproduce
Minimal reproduction: https://codesandbox.io/p/sandbox/react-aria-components-tabs-onselectionchange-bug-cv6wh2?file=%2Fapp%2Fpage.js%3A7%2C21
Version
1.0.0-beta-1
What browsers are you seeing the problem on?
Firefox, Chrome, Safari
If other, please specify.
No response
What operating system are you using?
MacOS
🧢 Your Company/Team
No response
🕷 Tracking Issue
No response
Provide a general summary of the issue here
After doing a
Tabsimplementation where we are using eachTabas a link, per the docs, I've noticed thatonSelectionChangedoesn't fire correctly.🤔 Expected Behavior?
onSelectionChangeshould fire with the current keyonSelectionChangeshould fire on keyboard navigation between tabs😯 Current Behavior
onSelectionChangeis firing with the previous keyonSelectionChangeis not firing on keyboard navigation💁 Possible Solution
No response
🔦 Context
I've been adding analytics functionality to our implementation of Tabs, that should track each tab change a user makes. To make it easier for our product/analytics people to use the results in their dashboards and reports, the tracking should include the tab's text value, as opposed to it's key. To do this without using
useTabList—because we would like to keep the rest of whatTabsoffers for 'free'—I am having to use a sub-component that can accessTabListState, which we can then use to create the tracking function and pass it back toTabsvia state.It's a little ugly, but does the job! I should also note that it would be really nice to have access to the full tab item in
onSelectionChange, which would help us avoid this situation.When testing this with our tabs that use links, I noticed the reported behaviour.
🖥️ Steps to Reproduce
Minimal reproduction: https://codesandbox.io/p/sandbox/react-aria-components-tabs-onselectionchange-bug-cv6wh2?file=%2Fapp%2Fpage.js%3A7%2C21
Version
1.0.0-beta-1
What browsers are you seeing the problem on?
Firefox, Chrome, Safari
If other, please specify.
No response
What operating system are you using?
MacOS
🧢 Your Company/Team
No response
🕷 Tracking Issue
No response