Skip to content

Commit 80dc929

Browse files
authored
Merge pull request #1069 from equinor/feat/add-onHover-for-tabs
Feat/add-onHover-for-tabs
2 parents 1e023c9 + b8479fc commit 80dc929

File tree

5 files changed

+24
-1
lines changed

5 files changed

+24
-1
lines changed

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@equinor/amplify-component-lib",
3-
"version": "9.9.0",
3+
"version": "9.9.1",
44
"description": "Frontend Typescript components for the Amplify team",
55
"main": "dist/index.js",
66
"types": "dist/index.d.ts",

src/molecules/Tabs/Tab.tsx

+8
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { Tab as TabType, Tabs } from './Tabs.types';
55

66
type TabProps<T> = {
77
onChange: Tabs<T>['onChange'];
8+
onHover?: Tabs<T>['onHover'];
89
selectedIndex: number;
910
index: number;
1011
centered: boolean;
@@ -17,6 +18,7 @@ export function Tab<T>({
1718
selectedIndex,
1819
index,
1920
onChange,
21+
onHover,
2022
centered,
2123
animated,
2224
disabled,
@@ -26,11 +28,17 @@ export function Tab<T>({
2628
onChange(value);
2729
};
2830

31+
const handleOnMouseEnter = () => {
32+
if (!onHover) return;
33+
onHover(value);
34+
};
35+
2936
return (
3037
<Button
3138
role="tab"
3239
aria-selected={selectedIndex === index}
3340
onClick={handleOnClick}
41+
onMouseEnter={handleOnMouseEnter}
3442
$centered={centered}
3543
disabled={disabled}
3644
>

src/molecules/Tabs/Tabs.test.tsx

+12
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ function fakeProps(): Omit<TabsProps<number>, 'selected'> {
1111
label: faker.vehicle.vehicle(),
1212
})),
1313
onChange: vi.fn(),
14+
onHover: vi.fn(),
1415
};
1516
}
1617

@@ -188,3 +189,14 @@ test('Throws error if amountPerScrollPage is set but scrollable is false', () =>
188189
)
189190
).toThrowError();
190191
});
192+
193+
test('Hovering over a tab calls the onHover callback', async () => {
194+
const props = fakeProps();
195+
const options = [{ value: 123, label: 'Option 1' }];
196+
render(<Tabs {...props} options={options} selected={0} />);
197+
const user = userEvent.setup();
198+
199+
await user.hover(screen.getByRole('tab', { name: options[0].label }));
200+
201+
expect(props.onHover).toHaveBeenCalled();
202+
});

src/molecules/Tabs/Tabs.tsx

+2
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ export function Tabs<T>({
5252
scrollable = true,
5353
amountPerScrollPage,
5454
onChange,
55+
onHover,
5556
ref,
5657
...rest
5758
}: TabsProps<T>) {
@@ -137,6 +138,7 @@ export function Tabs<T>({
137138
selectedIndex={selectedIndex}
138139
index={index}
139140
onChange={onChange}
141+
onHover={onHover}
140142
centered={centered}
141143
animated={animated}
142144
{...option}

src/molecules/Tabs/Tabs.types.ts

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ export interface Tab<T> {
99
export interface Tabs<T> {
1010
selected: T;
1111
onChange: (value: T) => void;
12+
onHover?: (hoveredTabValue: T) => void;
1213
options: Tab<T>[];
1314
scrollable?: boolean;
1415
amountPerScrollPage?: number;

0 commit comments

Comments
 (0)