import React, { useEffect, useRef, useState } from 'react' import { useRouter } from 'next/router' import { useTranslation } from 'react-i18next' import { Dialog, DialogTrigger, DialogClose, DialogTitle, } from '~components/common/Dialog' import DialogContent from '~components/common/DialogContent' import Button from '~components/common/Button' import CharLimitedFieldset from '~components/common/CharLimitedFieldset' import DurationInput from '~components/common/DurationInput' import InputTableField from '~components/common/InputTableField' import RaidCombobox from '~components/raids/RaidCombobox' import SegmentedControl from '~components/common/SegmentedControl' import Segment from '~components/common/Segment' import SwitchTableField from '~components/common/SwitchTableField' import TableField from '~components/common/TableField' import type { DetailsObject } from 'types' import type { DialogProps } from '@radix-ui/react-dialog' import CheckIcon from '~public/icons/Check.svg' import CrossIcon from '~public/icons/Cross.svg' import './index.scss' interface Props extends DialogProps { party?: Party updateCallback: (details: DetailsObject) => void } const EditPartyModal = ({ party, updateCallback, ...props }: Props) => { // Set up router const router = useRouter() const locale = router.locale // Set up translation const { t } = useTranslation('common') // Refs const headerRef = React.createRef() const footerRef = React.createRef() const descriptionInput = useRef(null) // States: Component const [open, setOpen] = useState(false) const [errors, setErrors] = useState<{ [key: string]: string }>({ name: '', description: '', }) const [currentSegment, setCurrentSegment] = useState(0) // States: Data const [name, setName] = useState('') const [raid, setRaid] = useState() const [extra, setExtra] = useState(false) const [chargeAttack, setChargeAttack] = useState(true) const [fullAuto, setFullAuto] = useState(false) const [autoGuard, setAutoGuard] = useState(false) const [autoSummon, setAutoSummon] = useState(false) const [buttonCount, setButtonCount] = useState(undefined) const [chainCount, setChainCount] = useState(undefined) const [turnCount, setTurnCount] = useState(undefined) const [clearTime, setClearTime] = useState(0) // Hooks useEffect(() => { if (!party) return setName(party.name) setRaid(party.raid) setAutoGuard(party.auto_guard) setAutoSummon(party.auto_summon) setFullAuto(party.full_auto) setChargeAttack(party.charge_attack) setClearTime(party.clear_time) if (party.turn_count) setTurnCount(party.turn_count) if (party.button_count) setButtonCount(party.button_count) if (party.chain_count) setChainCount(party.chain_count) }, [party]) // Methods: Event handlers (Dialog) function openChange() { if (open) { setOpen(false) if (props.onOpenChange) props.onOpenChange(false) } else { setOpen(true) if (props.onOpenChange) props.onOpenChange(true) } } function onEscapeKeyDown(event: KeyboardEvent) { event.preventDefault() openChange() } function onOpenAutoFocus(event: Event) { event.preventDefault() } // Methods: Event handlers (Fields) function handleInputChange(event: React.ChangeEvent) { event.preventDefault() const { name, value } = event.target setName(value) let newErrors = errors setErrors(newErrors) } function handleChargeAttackChanged(checked: boolean) { setChargeAttack(checked) } function handleFullAutoChanged(checked: boolean) { setFullAuto(checked) } function handleAutoGuardChanged(checked: boolean) { setAutoGuard(checked) } function handleAutoSummonChanged(checked: boolean) { setAutoSummon(checked) } function handleExtraChanged(checked: boolean) { setExtra(checked) } function handleClearTimeChanged(value: number) { if (!isNaN(value)) setClearTime(value) } function handleTurnCountChanged(value?: string) { if (!value) return const numericalValue = parseInt(value) if (!isNaN(numericalValue)) setTurnCount(numericalValue) } function handleButtonCountChanged(value?: string) { if (!value) return const numericalValue = parseInt(value) if (!isNaN(numericalValue)) setButtonCount(numericalValue) } function handleChainCountChanged(value?: string) { if (!value) return const numericalValue = parseInt(value) if (!isNaN(numericalValue)) setChainCount(numericalValue) } function handleTextAreaChanged( event: React.ChangeEvent ) { event.preventDefault() const { name, value } = event.target let newErrors = errors setErrors(newErrors) } function receiveRaid(raid?: Raid) { if (raid) { setRaid(raid) if (raid.group.extra) setExtra(true) else setExtra(false) } } // Methods: Data methods function updateDetails(event: React.MouseEvent) { const descriptionValue = descriptionInput.current?.value const details: DetailsObject = { fullAuto: fullAuto, autoGuard: autoGuard, autoSummon: autoSummon, chargeAttack: chargeAttack, clearTime: clearTime, buttonCount: buttonCount, turnCount: turnCount, chainCount: chainCount, name: name, description: descriptionValue, raid: raid, extra: extra, } updateCallback(details) openChange() } // Methods: Rendering methods const segmentedControl = () => { return ( setCurrentSegment(0)} > {t('modals.edit_team.segments.basic_info')} setCurrentSegment(1)} > {t('modals.edit_team.segments.properties')} ) } const nameField = () => { return ( ) } const raidField = () => { return ( ) } const extraNotice = () => { if (extra) { return (
{raid && raid.group.guidebooks ? t('modals.edit_team.extra_notice_guidebooks') : t('modals.edit_team.extra_notice')}
) } } const descriptionField = () => { return (
) } const chargeAttackField = () => { return ( ) } const fullAutoField = () => { return ( ) } const autoGuardField = () => { return ( ) } const autoSummonField = () => { return ( ) } const extraField = () => { return ( ) } const clearTimeField = () => { return ( handleClearTimeChanged(value)} /> ) } const turnCountField = () => { return ( ) } const buttonCountField = () => { return ( ) } const chainCountField = () => { return ( ) } const infoPage = () => { return ( <> {nameField()} {raidField()} {extraNotice()} {descriptionField()} ) } const propertiesPage = () => { return ( <> {chargeAttackField()} {fullAutoField()} {autoSummonField()} {autoGuardField()} {extraField()} {clearTimeField()} {turnCountField()} {buttonCountField()} {chainCountField()} ) } return ( {props.children}
{t('modals.edit_team.title')}
{segmentedControl()}
{currentSegment === 0 && infoPage()} {currentSegment === 1 && propertiesPage()}
) } export default EditPartyModal