import React, { useEffect, useState } from 'react' import Link from 'next/link' import { useRouter } from 'next/router' import { useSnapshot } from 'valtio' import { useTranslation } from 'next-i18next' import classNames from 'classnames' import Button from '~components/common/Button' import Tooltip from '~components/common/Tooltip' import Token from '~components/common/Token' import EditPartyModal from '~components/party/EditPartyModal' import PartyDropdown from '~components/party/PartyDropdown' import { accountState } from '~utils/accountState' import { appState, initialAppState } from '~utils/appState' import { formatTimeAgo } from '~utils/timeAgo' import EditIcon from '~public/icons/Edit.svg' import RemixIcon from '~public/icons/Remix.svg' import SaveIcon from '~public/icons/Save.svg' import type { DetailsObject } from 'types' import './index.scss' import api from '~utils/api' // Props interface Props { party?: Party new: boolean editable: boolean deleteCallback: () => void remixCallback: () => void updateCallback: (details: DetailsObject) => void } const PartyHeader = (props: Props) => { const { party } = useSnapshot(appState) const { t } = useTranslation('common') const router = useRouter() const locale = router.locale || 'en' const { party: partySnapshot } = useSnapshot(appState) const [name, setName] = useState('') const [chargeAttack, setChargeAttack] = useState(true) const [fullAuto, setFullAuto] = useState(false) const [autoGuard, setAutoGuard] = useState(false) const [buttonCount, setButtonCount] = useState(undefined) const [chainCount, setChainCount] = useState(undefined) const [turnCount, setTurnCount] = useState(undefined) const [clearTime, setClearTime] = useState(0) const classes = classNames({ PartyDetails: true, ReadOnly: true, }) const userClass = classNames({ user: true, empty: !party.user, }) const linkClass = classNames({ wind: party && party.element == 1, fire: party && party.element == 2, water: party && party.element == 3, earth: party && party.element == 4, dark: party && party.element == 5, light: party && party.element == 6, }) useEffect(() => { if (props.party) { setName(props.party.name) setAutoGuard(props.party.auto_guard) setFullAuto(props.party.full_auto) setChargeAttack(props.party.charge_attack) setClearTime(props.party.clear_time) if (props.party.turn_count) setTurnCount(props.party.turn_count) if (props.party.button_count) setButtonCount(props.party.button_count) if (props.party.chain_count) setChainCount(props.party.chain_count) } }, [props.party]) // Subscribe to router changes and reset state // if the new route is a new team useEffect(() => { router.events.on('routeChangeStart', (url, { shallow }) => { if (url === '/new' || url === '/') { const party = initialAppState.party setName(party.name ? party.name : '') setAutoGuard(party.autoGuard) setFullAuto(party.fullAuto) setChargeAttack(party.chargeAttack) setClearTime(party.clearTime) setTurnCount(party.turnCount) setButtonCount(party.buttonCount) setChainCount(party.chainCount) } }) }, []) // Actions: Favorites function toggleFavorite() { if (appState.party.favorited) unsaveFavorite() else saveFavorite() } function saveFavorite() { if (appState.party.id) api.saveTeam({ id: appState.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 (appState.party.id) api.unsaveTeam({ id: appState.party.id }).then((response) => { if (response.status == 200) appState.party.favorited = false }) else console.error('Failed to unsave team: No party ID') } // Methods: Navigation function goTo(shortcode?: string) { if (shortcode) router.push(`/p/${shortcode}`) } const userImage = (picture?: string, element?: string) => { if (picture && element) return ( {picture} ) else return ( {t('no_user')} ) } const userBlock = (username?: string, picture?: string, element?: string) => { return (
{userImage(picture, element)} {username ? username : t('no_user')}
) } const renderUserBlock = () => { let username, picture, element if (accountState.account.authorized && props.new) { username = accountState.account.user?.username picture = accountState.account.user?.avatar.picture element = accountState.account.user?.avatar.element } else if (party.user && !props.new) { username = party.user.username picture = party.user.avatar.picture element = party.user.avatar.element } if (username && picture && element) { return linkedUserBlock(username, picture, element) } else if (!props.new) { return userBlock() } } const linkedUserBlock = ( username?: string, picture?: string, element?: string ) => { return (
{userBlock(username, picture, element)}
) } const linkedRaidBlock = (raid: Raid) => { return (
{raid.name[locale]}
) } // Render: Tokens const chargeAttackToken = ( {`${t('party.details.labels.charge_attack')} ${ chargeAttack ? 'On' : 'Off' }`} ) const fullAutoToken = ( {`${t('party.details.labels.full_auto')} ${fullAuto ? 'On' : 'Off'}`} ) const autoGuardToken = ( {`${t('party.details.labels.auto_guard')} ${autoGuard ? 'On' : 'Off'}`} ) const turnCountToken = ( {t('party.details.turns.with_count', { count: turnCount, })} ) const buttonChainToken = () => { if (buttonCount || chainCount) { let string = '' if (buttonCount && buttonCount > 0) { string += `${buttonCount}b` } if (!buttonCount && chainCount && chainCount > 0) { string += `0${t('party.details.suffix.buttons')}${chainCount}${t( 'party.details.suffix.chains' )}` } else if (buttonCount && chainCount && chainCount > 0) { string += `${chainCount}${t('party.details.suffix.chains')}` } else if (buttonCount && !chainCount) { string += `0${t('party.details.suffix.chains')}` } return {string} } } const clearTimeToken = () => { const minutes = Math.floor(clearTime / 60) const seconds = clearTime - minutes * 60 let string = '' if (minutes > 0) string = `${minutes}${t('party.details.suffix.minutes')} ${seconds}${t( 'party.details.suffix.seconds' )}` else string = `${seconds}${t('party.details.suffix.seconds')}` return {string} } function renderTokens() { return (
{chargeAttackToken} {fullAutoToken} {autoGuardToken} {turnCount ? turnCountToken : ''} {clearTime > 0 ? clearTimeToken() : ''} {buttonChainToken()}
) } // Render: Buttons const saveButton = () => { return (