Only Transcendence3 Opuses can equip new pendulums

This commit is contained in:
Justin Edmund 2024-05-06 16:48:54 -07:00
parent 4bc211c240
commit 4f3c563d4e
3 changed files with 103 additions and 24 deletions

View file

@ -0,0 +1,9 @@
.errors {
color: $error;
display: none;
padding: $unit 0;
&.visible {
display: block;
}
}

View file

@ -1,4 +1,7 @@
import React, { useEffect, useState } from 'react' import React, { useEffect, useState } from 'react'
import { useRouter } from 'next/router'
import { useTranslation } from 'next-i18next'
import classNames from 'classnames'
import Select from '~components/common/Select' import Select from '~components/common/Select'
import SelectGroup from '~components/common/SelectGroup' import SelectGroup from '~components/common/SelectGroup'
@ -11,12 +14,14 @@ import styles from './index.module.scss'
// Props // Props
interface Props { interface Props {
open: boolean open: boolean
gridWeapon: GridWeapon
weaponKey?: WeaponKey weaponKey?: WeaponKey
series: number series: number
slot: number slot: number
onChange?: (value: WeaponKey, slot: number) => void onChange?: (value: WeaponKey, slot: number) => void
onOpenChange: () => void onOpenChange: () => void
onClose?: () => void onClose?: () => void
sendValidity: (isValid: boolean) => void
} }
// Constants // Constants
@ -47,10 +52,33 @@ const emptyWeaponKey: WeaponKey = {
const WeaponKeySelect = React.forwardRef<HTMLButtonElement, Props>( const WeaponKeySelect = React.forwardRef<HTMLButtonElement, Props>(
function useFieldSet( function useFieldSet(
{ open, weaponKey, series, slot, onChange, onOpenChange, onClose }, {
open,
gridWeapon,
weaponKey,
series,
slot,
onChange,
onOpenChange,
onClose,
sendValidity,
},
ref ref
) { ) {
const router = useRouter()
const locale =
router.locale && ['en', 'ja'].includes(router.locale)
? router.locale
: 'en'
const { t } = useTranslation('common')
const [keys, setKeys] = useState<WeaponKey[][]>([]) const [keys, setKeys] = useState<WeaponKey[][]>([])
const [error, setError] = useState('')
const errorClasses = classNames({
[styles.errors]: true,
[styles.visible]: error !== '',
})
useEffect(() => { useEffect(() => {
const keys = flattenWeaponKeys() const keys = flattenWeaponKeys()
@ -134,7 +162,18 @@ const WeaponKeySelect = React.forwardRef<HTMLButtonElement, Props>(
const keys = flattenWeaponKeys() const keys = flattenWeaponKeys()
const found = keys.find((key) => key.id == value) const found = keys.find((key) => key.id == value)
const weaponKey = found ? found : emptyWeaponKey const weaponKey = found ? found : emptyWeaponKey
if (onChange) onChange(weaponKey, slot)
if (
['14005', '14006', '14007'].includes(`${weaponKey.granblue_id}`) &&
gridWeapon.transcendence_step < 3
) {
setError(`${weaponKey.name[locale]} requires 3rd Transcendence`)
sendValidity(false)
} else if (onChange) {
setError('')
onChange(weaponKey, slot)
sendValidity(true)
}
} }
const emptyOption = () => { const emptyOption = () => {
@ -148,6 +187,7 @@ const WeaponKeySelect = React.forwardRef<HTMLButtonElement, Props>(
} }
return ( return (
<>
<Select <Select
key={`weapon-key-${slot}`} key={`weapon-key-${slot}`}
value={weaponKey ? weaponKey.id : emptyWeaponKey.id} value={weaponKey ? weaponKey.id : emptyWeaponKey.id}
@ -168,6 +208,8 @@ const WeaponKeySelect = React.forwardRef<HTMLButtonElement, Props>(
return weaponKeyGroup(i) return weaponKeyGroup(i)
})} })}
</Select> </Select>
<p className={errorClasses}>{error}</p>
</>
) )
} }
) )

View file

@ -50,6 +50,12 @@ const WeaponModal = ({
// State: Component // State: Component
const [alertOpen, setAlertOpen] = useState(false) const [alertOpen, setAlertOpen] = useState(false)
const [keysValid, setKeysValid] = useState<boolean[]>([
true,
true,
true,
true,
])
const [formValid, setFormValid] = useState(false) const [formValid, setFormValid] = useState(false)
// State: Selects // State: Selects
@ -149,6 +155,12 @@ const WeaponModal = ({
setFormValid(isValid) setFormValid(isValid)
} }
function receiveKeyValidity(isValid: boolean, slot: number) {
const newKeysValid = keysValid
newKeysValid[slot] = isValid
setKeysValid(newKeysValid)
}
// Methods: Data submission // Methods: Data submission
function prepareObject() { function prepareObject() {
let object: GridWeaponObject = { weapon: {} } let object: GridWeaponObject = { weapon: {} }
@ -159,9 +171,17 @@ const WeaponModal = ({
object.weapon.weapon_key1_id = weaponKey1.id object.weapon.weapon_key1_id = weaponKey1.id
} }
if ([2, 3, 17, 34].includes(gridWeapon.object.series) && weaponKey2) if ([2, 3, 17, 34].includes(gridWeapon.object.series) && weaponKey2) {
object.weapon.weapon_key2_id = weaponKey2.id object.weapon.weapon_key2_id = weaponKey2.id
if (
['14005', '14006', '14007'].includes(weaponKey2.granblue_id) &&
gridWeapon.transcendence_step < 3
) {
object.weapon.weapon_key2_id = undefined
}
}
if ([17].includes(gridWeapon.object.series) && weaponKey3) if ([17].includes(gridWeapon.object.series) && weaponKey3)
object.weapon.weapon_key3_id = weaponKey3.id object.weapon.weapon_key3_id = weaponKey3.id
@ -356,12 +376,14 @@ const WeaponModal = ({
{[2, 3, 17, 22, 34].includes(gridWeapon.object.series) ? ( {[2, 3, 17, 22, 34].includes(gridWeapon.object.series) ? (
<WeaponKeySelect <WeaponKeySelect
open={weaponKey1Open} open={weaponKey1Open}
gridWeapon={gridWeapon}
weaponKey={weaponKey1} weaponKey={weaponKey1}
series={gridWeapon.object.series} series={gridWeapon.object.series}
slot={0} slot={0}
onOpenChange={() => openSelect(1)} onOpenChange={() => openSelect(1)}
onChange={receiveWeaponKey} onChange={receiveWeaponKey}
onClose={() => setWeaponKey1Open(false)} onClose={() => setWeaponKey1Open(false)}
sendValidity={(valid: boolean) => receiveKeyValidity(valid, 0)}
/> />
) : ( ) : (
'' ''
@ -370,12 +392,14 @@ const WeaponModal = ({
{[2, 3, 17, 34].includes(gridWeapon.object.series) ? ( {[2, 3, 17, 34].includes(gridWeapon.object.series) ? (
<WeaponKeySelect <WeaponKeySelect
open={weaponKey2Open} open={weaponKey2Open}
gridWeapon={gridWeapon}
weaponKey={weaponKey2} weaponKey={weaponKey2}
series={gridWeapon.object.series} series={gridWeapon.object.series}
slot={1} slot={1}
onOpenChange={() => openSelect(2)} onOpenChange={() => openSelect(2)}
onChange={receiveWeaponKey} onChange={receiveWeaponKey}
onClose={() => setWeaponKey2Open(false)} onClose={() => setWeaponKey2Open(false)}
sendValidity={(valid: boolean) => receiveKeyValidity(valid, 1)}
/> />
) : ( ) : (
'' ''
@ -384,12 +408,14 @@ const WeaponModal = ({
{[17].includes(gridWeapon.object.series) ? ( {[17].includes(gridWeapon.object.series) ? (
<WeaponKeySelect <WeaponKeySelect
open={weaponKey3Open} open={weaponKey3Open}
gridWeapon={gridWeapon}
weaponKey={weaponKey3} weaponKey={weaponKey3}
series={gridWeapon.object.series} series={gridWeapon.object.series}
slot={2} slot={2}
onOpenChange={() => openSelect(3)} onOpenChange={() => openSelect(3)}
onChange={receiveWeaponKey} onChange={receiveWeaponKey}
onClose={() => setWeaponKey3Open(false)} onClose={() => setWeaponKey3Open(false)}
sendValidity={(valid: boolean) => receiveKeyValidity(valid, 2)}
/> />
) : ( ) : (
'' ''
@ -398,12 +424,14 @@ const WeaponModal = ({
{gridWeapon.object.series == 24 && gridWeapon.object.uncap.ulb ? ( {gridWeapon.object.series == 24 && gridWeapon.object.uncap.ulb ? (
<WeaponKeySelect <WeaponKeySelect
open={weaponKey4Open} open={weaponKey4Open}
gridWeapon={gridWeapon}
weaponKey={weaponKey1} weaponKey={weaponKey1}
series={gridWeapon.object.series} series={gridWeapon.object.series}
slot={0} slot={0}
onOpenChange={() => openSelect(4)} onOpenChange={() => openSelect(4)}
onChange={receiveWeaponKey} onChange={receiveWeaponKey}
onClose={() => setWeaponKey4Open(false)} onClose={() => setWeaponKey4Open(false)}
sendValidity={(valid: boolean) => receiveKeyValidity(valid, 4)}
/> />
) : ( ) : (
'' ''
@ -496,7 +524,7 @@ const WeaponModal = ({
bound={true} bound={true}
onClick={handleUpdateWeapon} onClick={handleUpdateWeapon}
key="confirm" key="confirm"
disabled={!formValid} disabled={!formValid || keysValid.includes(false)}
text={t('modals.weapon.buttons.confirm')} text={t('modals.weapon.buttons.confirm')}
/>, />,
]} ]}