'use client' import React, { useState } from 'react' import { deleteCookie } from 'cookies-next' import { useRouter } from '~/i18n/navigation' import { useTranslations } from 'next-intl' import { useLocale } from 'next-intl' import classNames from 'classnames' import clonedeep from 'lodash.clonedeep' import { Link } from '~/i18n/navigation' import { accountState, initialAccountState } from '~/utils/accountState' import { appState, initialAppState } from '~/utils/appState' import Alert from '~/components/common/Alert' import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuSeparator, } from '~/components/common/DropdownMenuContent' import DropdownMenuGroup from '~/components/common/DropdownMenuGroup' import DropdownMenuLabel from '~/components/common/DropdownMenuLabel' import DropdownMenuItem from '~/components/common/DropdownMenuItem' import LanguageSwitch from '~/components/LanguageSwitch' import LoginModal from '~/components/auth/LoginModal' import SignupModal from '~/components/auth/SignupModal' import AccountModal from '~/components/auth/AccountModal' import Button from '~/components/common/Button' import Tooltip from '~/components/common/Tooltip' import BahamutIcon from '~/public/icons/Bahamut.svg' import ChevronIcon from '~/public/icons/Chevron.svg' import MenuIcon from '~/public/icons/Menu.svg' import PlusIcon from '~/public/icons/Add.svg' import styles from '~/components/Header/index.module.scss' const Header = () => { // Localization const t = useTranslations('common') const locale = useLocale() // Router const router = useRouter() // State management const [alertOpen, setAlertOpen] = useState(false) const [loginModalOpen, setLoginModalOpen] = useState(false) const [signupModalOpen, setSignupModalOpen] = useState(false) const [settingsModalOpen, setSettingsModalOpen] = useState(false) const [leftMenuOpen, setLeftMenuOpen] = useState(false) const [rightMenuOpen, setRightMenuOpen] = useState(false) // Methods: Event handlers (Buttons) function handleLeftMenuButtonClicked() { setLeftMenuOpen(!leftMenuOpen) } function handleRightMenuButtonClicked() { setRightMenuOpen(!rightMenuOpen) } // Methods: Event handlers (Menus) function handleLeftMenuOpenChange(open: boolean) { setLeftMenuOpen(open) } function handleRightMenuOpenChange(open: boolean) { setRightMenuOpen(open) } function closeLeftMenu() { setLeftMenuOpen(false) } function closeRightMenu() { setRightMenuOpen(false) } // Methods: Actions function handleNewTeam(event: React.MouseEvent) { event.preventDefault() newTeam() closeRightMenu() } function logout() { // Close menu closeRightMenu() // Delete cookies deleteCookie('account') deleteCookie('user') // Clean state const resetState = clonedeep(initialAccountState) Object.keys(resetState).forEach((key) => { if (key !== 'language') accountState[key] = resetState[key] }) router.refresh() return false } function newTeam() { // Clean state const resetState = clonedeep(initialAppState) Object.keys(resetState).forEach((key) => { appState[key] = resetState[key] }) // Push the new URL router.push('/new') } // Methods: Rendering const profileImage = () => { const user = accountState.account.user if (accountState.account.authorized && user) { return ( ) } else { return ( ) } } // Rendering: Buttons const newButton = ( } className="New" blended={true} text={t('buttons.new')} onClick={newTeam} /> ) // Rendering: Modals const logoutConfirmationAlert = ( setAlertOpen(false)} /> ) const settingsModal = ( <> {accountState.account.user && ( )} > ) const loginModal = ( ) const signupModal = ( ) // Rendering: Compositing const authorizedLeftItems = ( <> {accountState.account.user && ( <> {t('menu.profile')} {t('menu.saved')} > )} > ) const leftMenuItems = ( <> {accountState.account.authorized && accountState.account.user && authorizedLeftItems} {t('menu.teams')} {t('menu.guides')} {t('coming_soon')} {t('about.segmented_control.about')} {t('about.segmented_control.updates')} {t('about.segmented_control.roadmap')} > ) const left = ( } onClick={handleLeftMenuButtonClicked} /> {leftMenuItems} ) const authorizedRightItems = ( <> {accountState.account.user && ( <> {`@${accountState.account.user.username}`} {t('menu.profile')} setSettingsModalOpen(true)} > {t('menu.settings')} setAlertOpen(true)} destructive={true} > {t('menu.logout')} > )} > ) const unauthorizedRightItems = ( <> {t('menu.language')} setLoginModalOpen(true)} > {t('menu.login')} setSignupModalOpen(true)} > {t('menu.signup')} > ) const rightMenuItems = ( <> {accountState.account.authorized && accountState.account.user ? authorizedRightItems : unauthorizedRightItems} > ) const right = ( {newButton} } rightAccessoryClassName="Arrow" onClick={handleRightMenuButtonClicked} blended={true} /> {rightMenuItems} ) return ( <> {accountState.account.user?.bahamut && ( Bahamut Mode is active )} {left} {right} {logoutConfirmationAlert} {settingsModal} {loginModal} {signupModal} > ) } export default Header
Bahamut Mode is active