11import { clsx } from 'clsx'
2- import { useEffect , useState } from 'react'
2+ import { useCallback , useEffect , useState } from 'react'
33import { BsFillBookmarksFill , BsFillGearFill , BsMoonFill } from 'react-icons/bs'
44import { CgTab } from 'react-icons/cg'
55import { IoMdSunny } from 'react-icons/io'
66import { MdDoDisturbOff } from 'react-icons/md'
7+ import { RiDashboardHorizontalFill } from 'react-icons/ri'
8+ import { TfiLayoutColumn4Alt } from 'react-icons/tfi'
79import { Link , useLocation , useNavigate } from 'react-router-dom'
810import AvatarPlaceholder from 'src/assets/icons/avatar.svg?react'
911import StreakIcon from 'src/assets/icons/fire_icon.svg?react'
1012import HackertabLogo from 'src/assets/logo.svg?react'
1113import { UserTags } from 'src/components/Elements/UserTags'
1214import { useAuth } from 'src/features/auth'
1315import { 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'
1522import { useUserPreferences } from 'src/stores/preferences'
1623import { Button , CircleButton } from '../Elements'
1724import { SearchEngineBar } from '../Elements/SearchBar/SearchEngineBar'
1825export 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