import React, { useEffect, useState } from 'react' import { useSnapshot } from 'valtio' import { deleteCookie } from 'cookies-next' import { useRouter } from 'next/router' import { useTranslation } from 'next-i18next' import classNames from 'classnames' import clonedeep from 'lodash.clonedeep' import Link from 'next/link' import api from '~utils/api' import { accountState, initialAccountState } from '~utils/accountState' import { appState, initialAppState } from '~utils/appState' import capitalizeFirstLetter from '~utils/capitalizeFirstLetter' import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuSeparator, } from '~components/DropdownMenuContent' import LoginModal from '~components/LoginModal' import SignupModal from '~components/SignupModal' import AccountModal from '~components/AccountModal' import Toast from '~components/Toast' import Button from '~components/Button' import LinkIcon from '~public/icons/Link.svg' import MenuIcon from '~public/icons/Menu.svg' import ArrowIcon from '~public/icons/Arrow.svg' import SaveIcon from '~public/icons/Save.svg' import './index.scss' const Header = () => { // Localization const { t } = useTranslation('common') // Router const router = useRouter() // State management const [copyToastOpen, setCopyToastOpen] = 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) // Snapshots const { account } = useSnapshot(accountState) const { party } = useSnapshot(appState) function handleCopyToastOpenChanged(open: boolean) { setCopyToastOpen(open) } function handleCopyToastCloseClicked() { setCopyToastOpen(false) } function handleLeftMenuButtonClicked() { setLeftMenuOpen(!leftMenuOpen) } function handleRightMenuButtonClicked() { setRightMenuOpen(!rightMenuOpen) } function handleLeftMenuOpenChange(open: boolean) { setLeftMenuOpen(open) } function handleRightMenuOpenChange(open: boolean) { setRightMenuOpen(open) } function closeLeftMenu() { setLeftMenuOpen(false) } function closeRightMenu() { setRightMenuOpen(false) } function handleSettingsOpenChanged(open: boolean) { setRightMenuOpen(false) } function copyToClipboard() { const el = document.createElement('input') el.value = window.location.href el.id = 'url-input' document.body.appendChild(el) el.select() document.execCommand('copy') el.remove() setCopyToastOpen(true) } function handleNewParty(event: React.MouseEvent, path: string) { event.preventDefault() // Push the root URL router.push(path) // Clean state const resetState = clonedeep(initialAppState) Object.keys(resetState).forEach((key) => { appState[key] = resetState[key] }) // Set party to be editable appState.party.editable = true // Close right menu 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.reload() return false } function toggleFavorite() { if (party.favorited) unsaveFavorite() else saveFavorite() } function saveFavorite() { if (party.id) api.saveTeam({ id: party.id }).then((response) => { if (response.status == 201) appState.party.favorited = true }) else console.error('Failed to save team: No party ID') } function unsaveFavorite() { if (party.id) api.unsaveTeam({ id: party.id }).then((response) => { if (response.status == 200) appState.party.favorited = false }) else console.error('Failed to unsave team: No party ID') } const pageTitle = () => { let title = '' let hasAccessory = false const path = router.asPath.split('/')[1] if (path === 'p') { hasAccessory = true if (appState.party && appState.party.name) { title = appState.party.name } else { title = t('no_title') } } else if (['weapons', 'summons', 'characters', 'new', ''].includes(path)) { title = t('new_party') } else { title = '' } return title !== '' ? (