// Core dependencies import React, { PropsWithChildren, useCallback, useEffect, useState, } from 'react' import { useRouter } from 'next/router' import { useTranslation } from 'next-i18next' import { AxiosResponse } from 'axios' import classNames from 'classnames' // UI dependencies import { Dialog, DialogClose, DialogTitle, DialogTrigger, } from '~components/Dialog' import DialogContent from '~components/DialogContent' import Button from '~components/Button' import SelectWithInput from '~components/SelectWithInput' import AwakeningSelect from '~components/AwakeningSelect' import RingSelect from '~components/RingSelect' import Switch from '~components/Switch' // Utilities import api from '~utils/api' import { appState } from '~utils/appState' import { retrieveCookies } from '~utils/retrieveCookies' import elementalizeAetherialMastery from '~utils/elementalizeAetherialMastery' // Data const emptyExtendedMastery: ExtendedMastery = { modifier: 0, strength: 0, } // Styles and icons import CrossIcon from '~public/icons/Cross.svg' import './index.scss' // Types import { CharacterOverMastery, ExtendedMastery, GridCharacterObject, } from '~types' interface Props { gridCharacter: GridCharacter open: boolean onOpenChange: (open: boolean) => void updateCharacter: (object: GridCharacterObject) => Promise } const CharacterModal = ({ gridCharacter, children, open: modalOpen, onOpenChange, updateCharacter, }: PropsWithChildren) => { const router = useRouter() const locale = router.locale && ['en', 'ja'].includes(router.locale) ? router.locale : 'en' const { t } = useTranslation('common') // Cookies const cookies = retrieveCookies() // UI state const [open, setOpen] = useState(false) const [formValid, setFormValid] = useState(false) // Refs const headerRef = React.createRef() const footerRef = React.createRef() // Classes const headerClasses = classNames({ DialogHeader: true, Short: true, }) // Callbacks and Hooks useEffect(() => { setOpen(modalOpen) }, [modalOpen]) // Character properties: Perpetuity const [perpetuity, setPerpetuity] = useState(false) // Character properties: Ring const [rings, setRings] = useState({ 1: { ...emptyExtendedMastery, modifier: 1 }, 2: { ...emptyExtendedMastery, modifier: 2 }, 3: emptyExtendedMastery, 4: emptyExtendedMastery, }) // Character properties: Earrings const [earring, setEarring] = useState(emptyExtendedMastery) // Character properties: Awakening const [awakeningType, setAwakeningType] = useState(0) const [awakeningLevel, setAwakeningLevel] = useState(0) // Character properties: Transcendence const [transcendenceStep, setTranscendenceStep] = useState(0) // Hooks useEffect(() => { if (gridCharacter.aetherial_mastery) { setEarring({ modifier: gridCharacter.aetherial_mastery.modifier, strength: gridCharacter.aetherial_mastery.strength, }) } setAwakeningType(gridCharacter.awakening.type) setAwakeningLevel(gridCharacter.awakening.level) setPerpetuity(gridCharacter.perpetuity) }, [gridCharacter]) // Prepare the GridWeaponObject to send to the server function prepareObject() { let object: GridCharacterObject = { character: { ring1: { modifier: rings[1].modifier, strength: rings[1].strength, }, ring2: { modifier: rings[2].modifier, strength: rings[2].strength, }, ring3: { modifier: rings[3].modifier, strength: rings[3].strength, }, ring4: { modifier: rings[4].modifier, strength: rings[4].strength, }, earring: { modifier: earring.modifier, strength: earring.strength, }, awakening: { type: awakeningType, level: awakeningLevel, }, transcendence_step: transcendenceStep, perpetuity: perpetuity, }, } return object } // Methods: UI state management function handleOpenChange(open: boolean) { setOpen(open) onOpenChange(open) } // Methods: Receive data from components function receiveRingValues(overMastery: CharacterOverMastery) { setRings(overMastery) } function receiveEarringValues( earringModifier: number, earringStrength: number ) { setEarring({ modifier: earringModifier, strength: earringStrength, }) } function handleCheckedChange(checked: boolean) { setPerpetuity(checked) } async function handleUpdateCharacter() { await updateCharacter(prepareObject()) setOpen(false) if (onOpenChange) onOpenChange(false) } function receiveAwakeningValues(type: number, level: number) { setAwakeningType(type) setAwakeningLevel(level) } function receiveValidity(isValid: boolean) { setFormValid(isValid) } const ringSelect = () => { return (

{t('modals.characters.subtitles.ring')}

) } const earringSelect = () => { const earringData = elementalizeAetherialMastery(gridCharacter) return (

{t('modals.characters.subtitles.earring')}

) } const awakeningSelect = () => { return (

{t('modals.characters.subtitles.awakening')}

) } const perpetuitySwitch = () => { return (

{t('modals.characters.subtitles.permanent')}

) } return ( {children} event.preventDefault()} onEscapeKeyDown={() => {}} >
{gridCharacter.object.name[locale]}
{t('modals.characters.title')} {gridCharacter.object.name[locale]}
{perpetuitySwitch()} {ringSelect()} {earringSelect()} {awakeningSelect()}
) } export default CharacterModal