Skip to content

Commit 62def59

Browse files
committed
refactor: enhance Header component with layout toggle functionality and optimize callbacks
1 parent 868546e commit 62def59

1 file changed

Lines changed: 26 additions & 9 deletions

File tree

src/components/Layout/Header.tsx

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,33 @@
11
import { clsx } from 'clsx'
2-
import { useEffect, useState } from 'react'
2+
import { useCallback, useEffect, useState } from 'react'
33
import { BsFillBookmarksFill, BsFillGearFill, BsMoonFill } from 'react-icons/bs'
44
import { CgTab } from 'react-icons/cg'
55
import { IoMdSunny } from 'react-icons/io'
66
import { MdDoDisturbOff } from 'react-icons/md'
7+
import { RiDashboardHorizontalFill } from 'react-icons/ri'
8+
import { TfiLayoutColumn4Alt } from 'react-icons/tfi'
79
import { Link, useLocation, useNavigate } from 'react-router-dom'
810
import AvatarPlaceholder from 'src/assets/icons/avatar.svg?react'
911
import StreakIcon from 'src/assets/icons/fire_icon.svg?react'
1012
import HackertabLogo from 'src/assets/logo.svg?react'
1113
import { UserTags } from 'src/components/Elements/UserTags'
1214
import { useAuth } from 'src/features/auth'
1315
import { Changelog } from 'src/features/changelog'
14-
import { identifyUserTheme, trackDNDDisable, trackThemeSelect } from 'src/lib/analytics'
16+
import {
17+
identifyUserTheme,
18+
trackDNDDisable,
19+
trackDisplayTypeChange,
20+
trackThemeSelect,
21+
} from 'src/lib/analytics'
1522
import { useUserPreferences } from 'src/stores/preferences'
1623
import { Button, CircleButton } from '../Elements'
1724
import { SearchEngineBar } from '../Elements/SearchBar/SearchEngineBar'
1825
export const Header = () => {
1926
const { openAuthModal, user, isConnected, isConnecting } = useAuth()
2027

2128
const [themeIcon, setThemeIcon] = useState(<BsMoonFill />)
22-
const { theme, setTheme, setDNDDuration, isDNDModeActive } = useUserPreferences()
29+
const { theme, setTheme, setDNDDuration, isDNDModeActive, layout, setLayout } =
30+
useUserPreferences()
2331
const navigate = useNavigate()
2432
const location = useLocation()
2533

@@ -38,21 +46,27 @@ export const Header = () => {
3846
}
3947
}, [theme])
4048

41-
const onThemeChange = () => {
49+
const onThemeChange = useCallback(() => {
4250
const newTheme = theme === 'dark' ? 'light' : 'dark'
4351
setTheme(newTheme)
4452
trackThemeSelect(newTheme)
4553
identifyUserTheme(newTheme)
46-
}
54+
}, [theme, setTheme])
4755

48-
const onSettingsClick = () => {
56+
const onLayoutChange = useCallback(() => {
57+
const newLayout = layout === 'cards' ? 'grid' : 'cards'
58+
trackDisplayTypeChange(newLayout)
59+
setLayout(newLayout)
60+
}, [layout, setLayout])
61+
62+
const onSettingsClick = useCallback(() => {
4963
navigate('/settings/general')
50-
}
64+
}, [navigate])
5165

52-
const onUnpauseClicked = () => {
66+
const onUnpauseClicked = useCallback(() => {
5367
trackDNDDisable()
5468
setDNDDuration('never')
55-
}
69+
}, [setDNDDuration])
5670

5771
return (
5872
<>
@@ -83,6 +97,9 @@ export const Header = () => {
8397
<CircleButton onClick={onSettingsClick}>
8498
<BsFillGearFill />
8599
</CircleButton>
100+
<CircleButton onClick={onLayoutChange}>
101+
{layout === 'cards' ? <RiDashboardHorizontalFill /> : <TfiLayoutColumn4Alt />}
102+
</CircleButton>
86103
<CircleButton onClick={onThemeChange} variant="darkfocus">
87104
{themeIcon}
88105
</CircleButton>

0 commit comments

Comments
 (0)