Skip to content

Commit a5f8576

Browse files
authored
feat: add scroll to the active tab (#311)
1 parent 3154c84 commit a5f8576

File tree

3 files changed

+28
-14
lines changed

3 files changed

+28
-14
lines changed

src/blocks/Tabs/Tabs.tsx

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,14 @@ export const TabsBlock = ({
102102
</Col>
103103
);
104104

105+
const onSelectTab = (
106+
id: string | null,
107+
e: React.MouseEvent<HTMLButtonElement | HTMLAnchorElement>,
108+
) => {
109+
setActiveTab(id);
110+
e.currentTarget.scrollIntoView({inline: 'center', behavior: 'smooth', block: 'nearest'});
111+
};
112+
105113
return (
106114
<AnimateBlock className={b()} onScroll={() => setPlay(true)} animate={animated}>
107115
<BlockHeader
@@ -113,7 +121,7 @@ export const TabsBlock = ({
113121
<Col sizes={tabsColSizes}>
114122
<ButtonTabs
115123
items={tabs}
116-
onSelectTab={setActiveTab}
124+
onSelectTab={onSelectTab}
117125
activeTab={activeTab}
118126
className={b('tabs', {centered: centered})}
119127
/>

src/components/Button/Button.tsx

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import './Button.scss';
1515
export interface ButtonProps extends Omit<ButtonParams, 'url'> {
1616
className?: string;
1717
url?: string;
18-
onClick?: () => void;
18+
onClick?: React.MouseEventHandler<HTMLButtonElement | HTMLAnchorElement>;
1919
qa?: string;
2020
}
2121

@@ -39,14 +39,17 @@ const Button = (props: ButtonProps) => {
3939
} = props;
4040
const defaultImgPosition = 'left';
4141
const handleAnalytics = useAnalytics(DefaultEventNames.Button, url);
42-
const onClick = useCallback(() => {
43-
handleMetrika({metrikaGoals, pixelEvents});
44-
handleAnalytics(analyticsEvents);
45-
46-
if (onClickOrigin) {
47-
onClickOrigin();
48-
}
49-
}, [handleMetrika, metrikaGoals, pixelEvents, handleAnalytics, analyticsEvents, onClickOrigin]);
42+
const onClick = useCallback(
43+
(e: React.MouseEvent<HTMLButtonElement | HTMLAnchorElement>) => {
44+
handleMetrika({metrikaGoals, pixelEvents});
45+
handleAnalytics(analyticsEvents);
46+
47+
if (onClickOrigin) {
48+
onClickOrigin(e);
49+
}
50+
},
51+
[handleMetrika, metrikaGoals, pixelEvents, handleAnalytics, analyticsEvents, onClickOrigin],
52+
);
5053

5154
const buttonImg =
5255
img instanceof Object

src/components/ButtonTabs/ButtonTabs.tsx

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,10 @@ export interface ButtonTabsProps {
2020
className?: string;
2121
items: ButtonTabsItemProps[];
2222
activeTab?: string | null;
23-
onSelectTab?: (tabId: string | null) => void;
23+
onSelectTab?: (
24+
tabId: string | null,
25+
e: React.MouseEvent<HTMLButtonElement | HTMLAnchorElement>,
26+
) => void;
2427
tabSize?: ButtonSize;
2528
qa?: string;
2629
}
@@ -42,9 +45,9 @@ const ButtonTabs: React.FC<ButtonTabsProps> = ({
4245
}, [activeTab, items]);
4346

4447
const handleClick = useCallback(
45-
(tabId: string | null) => {
48+
(tabId: string | null) => (e: React.MouseEvent<HTMLButtonElement | HTMLAnchorElement>) => {
4649
if (onSelectTab) {
47-
onSelectTab(tabId);
50+
onSelectTab(tabId, e);
4851
}
4952
},
5053
[onSelectTab],
@@ -58,7 +61,7 @@ const ButtonTabs: React.FC<ButtonTabsProps> = ({
5861
className={b('item', {active: id === activeTabId})}
5962
key={title}
6063
size={tabSize}
61-
onClick={() => handleClick(id)}
64+
onClick={handleClick(id)}
6265
/>
6366
))}
6467
</div>

0 commit comments

Comments
 (0)