Update CharacterModal

* Update localization keys
* Remove unneeded dependencies and calls
* Store received values (WIP)
This commit is contained in:
Justin Edmund 2023-01-06 03:03:58 -08:00
parent ad07e9b727
commit bab9488913

View file

@ -1,6 +1,5 @@
// Core dependencies // Core dependencies
import React, { useEffect, useState } from 'react' import React, { useEffect, useState } from 'react'
import { getCookie } from 'cookies-next'
import { useRouter } from 'next/router' import { useRouter } from 'next/router'
import { useTranslation } from 'next-i18next' import { useTranslation } from 'next-i18next'
import { AxiosResponse } from 'axios' import { AxiosResponse } from 'axios'
@ -14,18 +13,29 @@ import {
DialogTrigger, DialogTrigger,
} from '~components/Dialog' } from '~components/Dialog'
import Button from '~components/Button' import Button from '~components/Button'
import SelectWithInput from '~components/SelectWithInput'
import AwakeningSelect from '~components/AwakeningSelect' import AwakeningSelect from '~components/AwakeningSelect'
import RingSelect from '~components/RingSelect'
// Utilities // Utilities
import api from '~utils/api' import api from '~utils/api'
import { appState } from '~utils/appState' import { appState } from '~utils/appState'
import { retrieveCookies } from '~utils/retrieveCookies' import { retrieveCookies } from '~utils/retrieveCookies'
import elementalizeAetherialMastery from '~utils/elementalizeAetherialMastery'
// Data
const emptyExtendedMastery: ExtendedMastery = {
modifier: 0,
strength: 0,
}
// Styles and icons // Styles and icons
import CrossIcon from '~public/icons/Cross.svg' import CrossIcon from '~public/icons/Cross.svg'
import './index.scss' import './index.scss'
// Types // Types
import { CharacterOverMastery, ExtendedMastery } from '~types'
interface GridCharacterObject { interface GridCharacterObject {
character: { character: {
ring_modifier1: number ring_modifier1: number
@ -36,6 +46,8 @@ interface GridCharacterObject {
ring_strength2: number ring_strength2: number
ring_strength3: number ring_strength3: number
ring_strength4: number ring_strength4: number
earring_modifier: number
earring_strength: number
awakening_type: number awakening_type: number
awakening_level: number awakening_level: number
transcendence_step: number transcendence_step: number
@ -44,10 +56,17 @@ interface GridCharacterObject {
interface Props { interface Props {
gridCharacter: GridCharacter gridCharacter: GridCharacter
children: React.ReactNode children?: React.ReactNode
open: boolean
onOpenChange: (open: boolean) => void
} }
const CharacterModal = ({ gridCharacter, children }: Props) => { const CharacterModal = ({
gridCharacter,
children,
open: modalOpen,
onOpenChange,
}: Props) => {
const router = useRouter() const router = useRouter()
const locale = const locale =
router.locale && ['en', 'ja'].includes(router.locale) ? router.locale : 'en' router.locale && ['en', 'ja'].includes(router.locale) ? router.locale : 'en'
@ -60,27 +79,20 @@ const CharacterModal = ({ gridCharacter, children }: Props) => {
const [open, setOpen] = useState(false) const [open, setOpen] = useState(false)
const [formValid, setFormValid] = useState(false) const [formValid, setFormValid] = useState(false)
const [ring1Open, setRing1Open] = useState(false) useEffect(() => {
const [ring2Open, setRing2Open] = useState(false) setOpen(modalOpen)
const [ring3Open, setRing3Open] = useState(false) }, [modalOpen])
const [ring4Open, setRing4Open] = useState(false)
const [earringOpen, setEarringOpen] = useState(false)
const [awakeningOpen, setAwakeningOpen] = useState(false)
// Character properties: Ring // Character properties: Ring
const [ringModifier1, setRingModifier1] = useState(0) const [rings, setRings] = useState<CharacterOverMastery>({
const [ringModifier2, setRingModifier2] = useState(0) 1: { ...emptyExtendedMastery, modifier: 1 },
const [ringModifier3, setRingModifier3] = useState(0) 2: { ...emptyExtendedMastery, modifier: 2 },
const [ringModifier4, setRingModifier4] = useState(0) 3: emptyExtendedMastery,
4: emptyExtendedMastery,
const [ringStrength1, setRingStrength1] = useState(0) })
const [ringStrength2, setRingStrength2] = useState(0)
const [ringStrength3, setRingStrength3] = useState(0)
const [ringStrength4, setRingStrength4] = useState(0)
// Character properties: Earrings // Character properties: Earrings
const [earringModifier, setEarringModifier] = useState(0) const [earring, setEarring] = useState<ExtendedMastery>(emptyExtendedMastery)
const [earringStrength, setEarringStrength] = useState(0)
// Character properties: Awakening // Character properties: Awakening
const [awakeningType, setAwakeningType] = useState(0) const [awakeningType, setAwakeningType] = useState(0)
@ -95,78 +107,41 @@ const CharacterModal = ({ gridCharacter, children }: Props) => {
// Methods: UI state management // Methods: UI state management
function openChange(open: boolean) { function openChange(open: boolean) {
setOpen(open) setOpen(open)
} onOpenChange(open)
function openSelect(
name: 'ring1' | 'ring2' | 'ring3' | 'ring4' | 'earring' | 'awakening'
) {
setRing1Open(name === 'ring1' ? !ring1Open : false)
setRing2Open(name === 'ring2' ? !ring2Open : false)
setRing3Open(name === 'ring3' ? !ring3Open : false)
setRing4Open(name === 'ring4' ? !ring4Open : false)
setEarringOpen(name === 'earring' ? !earringOpen : false)
setAwakeningOpen(name === 'awakening' ? !awakeningOpen : false)
}
const anySelectOpen =
ring1Open ||
ring2Open ||
ring3Open ||
ring4Open ||
earringOpen ||
awakeningOpen
function onEscapeKeyDown(event: KeyboardEvent) {
if (anySelectOpen) {
return event.preventDefault()
} else {
setOpen(false)
}
}
function receiveRingOpen(index: 1 | 2 | 3 | 4, isOpen: boolean) {
if (index === 1) setRing1Open(isOpen)
if (index === 2) setRing2Open(isOpen)
if (index === 3) setRing3Open(isOpen)
if (index === 4) setRing4Open(isOpen)
}
function receiveEarringOpen(isOpen: boolean) {
setEarringOpen(isOpen)
}
function receiveAwakeningOpen(isOpen: boolean) {
setAwakeningOpen(isOpen)
} }
// Methods: Receive data from components // Methods: Receive data from components
function receiveRingValues( function receiveRingValues(overMastery: CharacterOverMastery) {
ringModifier1: number, console.log(overMastery)
ringModifier2: number,
ringModifier3: number,
ringModifier4: number,
ringStrength1: number,
ringStrength2: number,
ringStrength3: number,
ringStrength4: number
) {
setRingModifier1(ringModifier1)
setRingModifier2(ringModifier2)
setRingModifier3(ringModifier3)
setRingModifier4(ringModifier4)
setRingStrength1(ringStrength1) setRings({
setRingStrength2(ringStrength2) 1: {
setRingStrength3(ringStrength3) modifier: overMastery[1].modifier,
setRingStrength4(ringStrength4) strength: overMastery[1].strength,
},
2: {
modifier: overMastery[2].modifier,
strength: overMastery[2].strength,
},
3: {
modifier: overMastery[3].modifier,
strength: overMastery[3].strength,
},
4: {
modifier: overMastery[4].modifier,
strength: overMastery[4].strength,
},
})
} }
function receiveEarringValues( function receiveEarringValues(
earringModifier: number, earringModifier: number,
earringStrength: number earringStrength: number
) { ) {
setEarringModifier(earringModifier) setEarring({
setEarringStrength(earringStrength) modifier: earringModifier,
strength: earringStrength,
})
} }
function receiveAwakeningValues(type: number, level: number) { function receiveAwakeningValues(type: number, level: number) {
@ -184,14 +159,16 @@ const CharacterModal = ({ gridCharacter, children }: Props) => {
function prepareObject() { function prepareObject() {
let object: GridCharacterObject = { let object: GridCharacterObject = {
character: { character: {
ring_modifier1: ringModifier1, ring_modifier1: rings[1].modifier,
ring_modifier2: ringModifier2, ring_modifier2: rings[2].modifier,
ring_modifier3: ringModifier3, ring_modifier3: rings[3].modifier,
ring_modifier4: ringModifier4, ring_modifier4: rings[4].modifier,
ring_strength1: ringStrength1, ring_strength1: rings[1].strength,
ring_strength2: ringStrength2, ring_strength2: rings[2].strength,
ring_strength3: ringStrength3, ring_strength3: rings[3].strength,
ring_strength4: ringStrength4, ring_strength4: rings[4].strength,
earring_modifier: earring.modifier,
earring_strength: earring.strength,
awakening_type: awakeningType, awakening_type: awakeningType,
awakening_level: awakeningLevel, awakening_level: awakeningLevel,
transcendence_step: transcendenceStep, transcendence_step: transcendenceStep,
@ -204,10 +181,11 @@ const CharacterModal = ({ gridCharacter, children }: Props) => {
// Send the GridWeaponObject to the server // Send the GridWeaponObject to the server
async function updateCharacter() { async function updateCharacter() {
const updateObject = prepareObject() const updateObject = prepareObject()
return await api.endpoints.grid_characters console.log(updateObject)
.update(gridCharacter.id, updateObject) // return await api.endpoints.grid_characters
.then((response) => processResult(response)) // .update(gridCharacter.id, updateObject)
.catch((error) => processError(error)) // .then((response) => processResult(response))
// .catch((error) => processError(error))
} }
// Save the server's response to state // Save the server's response to state
@ -228,8 +206,6 @@ const CharacterModal = ({ gridCharacter, children }: Props) => {
<h3>{t('modals.characters.subtitles.ring')}</h3> <h3>{t('modals.characters.subtitles.ring')}</h3>
<RingSelect <RingSelect
gridCharacter={gridCharacter} gridCharacter={gridCharacter}
onOpenChange={receiveRingOpen}
sendValidity={receiveValidity}
sendValues={receiveRingValues} sendValues={receiveRingValues}
/> />
</section> </section>
@ -237,12 +213,16 @@ const CharacterModal = ({ gridCharacter, children }: Props) => {
} }
const earringSelect = () => { const earringSelect = () => {
const earringData = elementalizeAetherialMastery(gridCharacter)
return ( return (
<section> <section>
<h3>{t('modals.characters.subtitles.earring')}</h3> <h3>{t('modals.characters.subtitles.earring')}</h3>
<EarringSelect <SelectWithInput
gridCharacter={gridCharacter} object="earring"
onOpenChange={receiveEarringOpen} dataSet={earringData}
selectValue={earring.modifier}
inputValue={earring.strength}
sendValidity={receiveValidity} sendValidity={receiveValidity}
sendValues={receiveEarringValues} sendValues={receiveEarringValues}
/> />
@ -258,7 +238,6 @@ const CharacterModal = ({ gridCharacter, children }: Props) => {
object="character" object="character"
awakeningType={gridCharacter.awakening?.type} awakeningType={gridCharacter.awakening?.type}
awakeningLevel={gridCharacter.awakening?.level} awakeningLevel={gridCharacter.awakening?.level}
onOpenChange={receiveAwakeningOpen}
sendValidity={receiveValidity} sendValidity={receiveValidity}
sendValues={receiveAwakeningValues} sendValues={receiveAwakeningValues}
/> />
@ -267,18 +246,17 @@ const CharacterModal = ({ gridCharacter, children }: Props) => {
} }
return ( return (
// TODO: Refactor into Dialog component
<Dialog open={open} onOpenChange={openChange}> <Dialog open={open} onOpenChange={openChange}>
<DialogTrigger asChild>{children}</DialogTrigger> <DialogTrigger asChild>{children}</DialogTrigger>
<DialogContent <DialogContent
className="Character Dialog" className="Character Dialog"
onOpenAutoFocus={(event) => event.preventDefault()} onOpenAutoFocus={(event) => event.preventDefault()}
onEscapeKeyDown={onEscapeKeyDown} onEscapeKeyDown={() => {}}
> >
<div className="DialogHeader"> <div className="DialogHeader">
<div className="DialogTop"> <div className="DialogTop">
<DialogTitle className="SubTitle"> <DialogTitle className="SubTitle">
{t('modals.character.title')} {t('modals.characters.title')}
</DialogTitle> </DialogTitle>
<DialogTitle className="DialogTitle"> <DialogTitle className="DialogTitle">
{gridCharacter.object.name[locale]} {gridCharacter.object.name[locale]}
@ -299,7 +277,7 @@ const CharacterModal = ({ gridCharacter, children }: Props) => {
contained={true} contained={true}
onClick={updateCharacter} onClick={updateCharacter}
disabled={!formValid} disabled={!formValid}
text={t('modals.character.buttons.confirm')} text={t('modals.characters.buttons.confirm')}
/> />
</div> </div>
</DialogContent> </DialogContent>