Skip to content

Commit 284da3d

Browse files
authored
Merge pull request #3 from pintoderian/main
Hook useMenu
2 parents a790998 + f66ccf9 commit 284da3d

File tree

2 files changed

+53
-43
lines changed

2 files changed

+53
-43
lines changed

app/components/header/_children/menu.js

Lines changed: 9 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,68 +1,34 @@
11
'use client';
22

3-
import useScroll from '@/hooks/useScroll';
3+
import useMenu from '@/hooks/useMenu';
44
import useTranslate from '@/hooks/useTranslate';
5-
import { useMenuStore } from '@/store/menu';
6-
import { useCallback, useEffect } from 'react';
5+
import { useEffect } from 'react';
76

87
const Menu = ({ className }) => {
9-
const { active, setActive } = useMenuStore();
8+
const { activeClass, scrolledDivActive, handleScrollInDiv } = useMenu();
109
const { translate } = useTranslate();
11-
const { isScrolledIntoView } = useScroll();
12-
13-
const scrolledActive = useCallback(() => {
14-
const isScrolledAbout = isScrolledIntoView('about');
15-
const isScrolledSkills = isScrolledIntoView('skills');
16-
if (isScrolledAbout) {
17-
setActive('about');
18-
} else if (!isScrolledAbout && !isScrolledSkills) {
19-
setActive('experience');
20-
} else if (isScrolledSkills) {
21-
setActive('skills');
22-
}
23-
}, [setActive, isScrolledIntoView]);
2410

2511
useEffect(() => {
26-
window.addEventListener('scroll', scrolledActive);
12+
window.addEventListener('scroll', scrolledDivActive);
2713
return () => {
28-
window.removeEventListener('scroll', scrolledActive);
14+
window.removeEventListener('scroll', scrolledDivActive);
2915
};
30-
}, [scrolledActive]);
31-
32-
const activeClass = useCallback(
33-
(value) => {
34-
return value === active
35-
? 'font-semibold text-neutral-800 dark:text-white'
36-
: 'font-normal transition-all text-neutral-600 dark:text-neutral-500 hover:text-neutral-800 dark:hover:text-neutral-200';
37-
},
38-
[active]
39-
);
40-
41-
const handleAction = useCallback(
42-
(value) => {
43-
setActive(value);
44-
const element = document?.getElementById(value);
45-
element?.scrollIntoView({
46-
behavior: 'smooth'
47-
});
48-
},
49-
[setActive]
50-
);
16+
}, [scrolledDivActive]);
5117

5218
return (
5319
<ul className={`gap-4 ${className}`}>
5420
<li className={activeClass('about')}>
55-
<button onClick={() => handleAction('about')}>
21+
<button onClick={() => handleScrollInDiv('about')}>
5622
{translate('about')}
5723
</button>
5824
</li>
5925
<li className={activeClass('experience')}>
60-
<button onClick={() => handleAction('experience')}>
26+
<button onClick={() => handleScrollInDiv('experience')}>
6127
{translate('experience')}
6228
</button>
6329
</li>
6430
<li className={activeClass('skills')}>
65-
<button onClick={() => handleAction('skills')}>
31+
<button onClick={() => handleScrollInDiv('skills')}>
6632
{translate('skills')}
6733
</button>
6834
</li>

hooks/useMenu.js

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import { useMenuStore } from '@/store/menu';
2+
import useScroll from './useScroll';
3+
import { useCallback } from 'react';
4+
5+
const useMenu = () => {
6+
const { active, setActive } = useMenuStore();
7+
const { isScrolledIntoView } = useScroll();
8+
9+
const activeClass = useCallback(
10+
(value) => {
11+
return value === active
12+
? 'font-semibold text-neutral-800 dark:text-white'
13+
: 'font-normal transition-all text-neutral-600 dark:text-neutral-500 hover:text-neutral-800 dark:hover:text-neutral-200';
14+
},
15+
[active]
16+
);
17+
18+
const scrolledDivActive = useCallback(() => {
19+
const isScrolledAbout = isScrolledIntoView('about');
20+
const isScrolledSkills = isScrolledIntoView('skills');
21+
if (isScrolledAbout) {
22+
setActive('about');
23+
} else if (!isScrolledAbout && !isScrolledSkills) {
24+
setActive('experience');
25+
} else if (isScrolledSkills) {
26+
setActive('skills');
27+
}
28+
}, [setActive, isScrolledIntoView]);
29+
30+
const handleScrollInDiv = useCallback(
31+
(value) => {
32+
setActive(value);
33+
const element = document?.getElementById(value);
34+
element?.scrollIntoView({
35+
behavior: 'smooth'
36+
});
37+
},
38+
[setActive]
39+
);
40+
41+
return { activeClass, scrolledDivActive, handleScrollInDiv };
42+
};
43+
44+
export default useMenu;

0 commit comments

Comments
 (0)