Add WeaponKeyDropdown component and API method
This commit is contained in:
parent
a64d9c02e4
commit
01db78c422
3 changed files with 140 additions and 0 deletions
0
components/WeaponKeyDropdown/index.scss
Normal file
0
components/WeaponKeyDropdown/index.scss
Normal file
139
components/WeaponKeyDropdown/index.tsx
Normal file
139
components/WeaponKeyDropdown/index.tsx
Normal file
|
|
@ -0,0 +1,139 @@
|
||||||
|
import React, { useCallback, useEffect, useState } from 'react'
|
||||||
|
|
||||||
|
import api from '~utils/api'
|
||||||
|
|
||||||
|
import './index.scss'
|
||||||
|
|
||||||
|
// Props
|
||||||
|
interface Props {
|
||||||
|
currentValue?: WeaponKey
|
||||||
|
series: number
|
||||||
|
slot: number
|
||||||
|
onChange?: (event: React.ChangeEvent<HTMLSelectElement>) => void
|
||||||
|
onBlur?: (event: React.ChangeEvent<HTMLSelectElement>) => void
|
||||||
|
}
|
||||||
|
|
||||||
|
const WeaponKeyDropdown = React.forwardRef<HTMLSelectElement, Props>(function useFieldSet(props, ref) {
|
||||||
|
const [keys, setKeys] = useState<WeaponKey[][]>([])
|
||||||
|
|
||||||
|
const pendulumNames = [
|
||||||
|
{ en: 'Pendulum', jp: '' },
|
||||||
|
{ en: 'Chain', jp: '' }
|
||||||
|
]
|
||||||
|
|
||||||
|
const telumaNames = [ { en: 'Teluma', jp: '' } ]
|
||||||
|
const emblemNames = [ { en: 'Emblem', jp: '' } ]
|
||||||
|
const gauphNames = [
|
||||||
|
{ en: 'Gauph Key', jp: '' },
|
||||||
|
{ en: 'Ultima Key', jp: '' },
|
||||||
|
{ en: 'Gate of Omnipotence', jp: '' }
|
||||||
|
]
|
||||||
|
|
||||||
|
const keyName = () => {
|
||||||
|
return {
|
||||||
|
en: '',
|
||||||
|
jp: ''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const emptyKey: WeaponKey = {
|
||||||
|
id: '0',
|
||||||
|
name: {
|
||||||
|
en: `No ${keyName().en}`,
|
||||||
|
jp: `${keyName().jp}なし`
|
||||||
|
},
|
||||||
|
series: props.series,
|
||||||
|
slot: props.slot,
|
||||||
|
group: -1
|
||||||
|
}
|
||||||
|
|
||||||
|
const organizeWeaponKeys = useCallback((weaponKeys: WeaponKey[]) => {
|
||||||
|
const numGroups = Math.max.apply(Math, weaponKeys.map(key => key.group))
|
||||||
|
let groupedKeys = []
|
||||||
|
for (let i = 0; i <= numGroups; i++) {
|
||||||
|
groupedKeys[i] = weaponKeys.filter(key => key.group == i)
|
||||||
|
}
|
||||||
|
|
||||||
|
setKeys(groupedKeys)
|
||||||
|
}, [])
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const filterParams = {
|
||||||
|
params: {
|
||||||
|
series: props.series,
|
||||||
|
slot: props.slot
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function fetchWeaponKeys() {
|
||||||
|
api.endpoints.weapon_keys.getAll(filterParams)
|
||||||
|
.then((response) => {
|
||||||
|
const keys = response.data.map((k: any) => k.weapon_key)
|
||||||
|
organizeWeaponKeys(keys)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fetchWeaponKeys()
|
||||||
|
}, [organizeWeaponKeys])
|
||||||
|
|
||||||
|
function weaponKeyGroup(index: number) {
|
||||||
|
['α','β','γ','Δ'].sort((a, b) => a.localeCompare(b, 'el'))
|
||||||
|
|
||||||
|
const sortByOrder = (a: WeaponKey, b: WeaponKey) => a.order > b.order ? 1 : -1
|
||||||
|
|
||||||
|
const options = keys && keys.length > 0 && keys[index].length > 0 &&
|
||||||
|
keys[index].sort(sortByOrder).map((item, i) => {
|
||||||
|
return (
|
||||||
|
<option key={i} value={item.id}>{item.name.en}</option>
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
let name: { [key: string]: string } = {}
|
||||||
|
if (props.series == 2 && index == 0)
|
||||||
|
name = pendulumNames[0]
|
||||||
|
else if (props.series == 2 && props.slot == 1 && index == 1)
|
||||||
|
name = pendulumNames[1]
|
||||||
|
else if (props.series == 3)
|
||||||
|
name = telumaNames[index]
|
||||||
|
else if (props.series == 17)
|
||||||
|
name = gauphNames[props.slot]
|
||||||
|
else if (props.series == 22)
|
||||||
|
name = emblemNames[index]
|
||||||
|
|
||||||
|
return (
|
||||||
|
<optgroup key={index} label={ (props.series == 17 && props.slot == 2) ? name.en : `${name.en}s`}>
|
||||||
|
{options}
|
||||||
|
</optgroup>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
const emptyOption = () => {
|
||||||
|
let name = ''
|
||||||
|
if (props.series == 2)
|
||||||
|
name = pendulumNames[0].en
|
||||||
|
else if (props.series == 3)
|
||||||
|
name = telumaNames[0].en
|
||||||
|
else if (props.series == 17)
|
||||||
|
name = gauphNames[props.slot].en
|
||||||
|
else if (props.series == 22)
|
||||||
|
name = emblemNames[0].en
|
||||||
|
|
||||||
|
return `No ${name}`
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<select
|
||||||
|
key={ (props.currentValue) ? props.currentValue.id : ''}
|
||||||
|
defaultValue={ (props.currentValue) ? props.currentValue.id : '' }
|
||||||
|
onBlur={props.onBlur}
|
||||||
|
onChange={props.onChange}
|
||||||
|
ref={ref}>
|
||||||
|
<option key="-1" value="-1">{emptyOption()}</option>
|
||||||
|
{ Array.from(Array(keys?.length)).map((x, i) => {
|
||||||
|
return weaponKeyGroup(i)
|
||||||
|
})}
|
||||||
|
</select>
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
export default WeaponKeyDropdown
|
||||||
|
|
@ -107,6 +107,7 @@ api.createEntity( { name: 'characters' })
|
||||||
api.createEntity( { name: 'weapons' })
|
api.createEntity( { name: 'weapons' })
|
||||||
api.createEntity( { name: 'summons' })
|
api.createEntity( { name: 'summons' })
|
||||||
api.createEntity( { name: 'raids' })
|
api.createEntity( { name: 'raids' })
|
||||||
|
api.createEntity( { name: 'weapon_keys' })
|
||||||
api.createEntity( { name: 'favorites' })
|
api.createEntity( { name: 'favorites' })
|
||||||
|
|
||||||
export default api
|
export default api
|
||||||
Loading…
Reference in a new issue