hensei-web/components/WeaponGrid/index.tsx
Justin Edmund 7a50c4bce5 Pass down GridWeapon instead of Weapon
Previously, we stripped the Weapon out of the GridWeapon for simplicity. However, now that we need to display and manipulate data on the GridWeapon (unique data), we need to pass that down instead.
2022-02-01 05:06:27 -08:00

118 lines
3.4 KiB
TypeScript

import React, { useState } from 'react'
import { useModal as useModal } from '~utils/useModal'
import SearchModal from '~components/SearchModal'
import WeaponUnit from '~components/WeaponUnit'
import ExtraWeapons from '~components/ExtraWeapons'
import './index.scss'
// GridType
export enum GridType {
Class,
Character,
Weapon,
Summon
}
// Props
interface Props {
userId?: string
partyId?: string
mainhand?: GridWeapon | undefined
grid: GridArray<GridWeapon>
extra: boolean
editable: boolean
exists: boolean
found?: boolean
onSelect: (type: GridType, weapon: Weapon, position: number) => void
}
const WeaponGrid = (props: Props) => {
const { open, openModal, closeModal } = useModal()
const [searchPosition, setSearchPosition] = useState(0)
const numWeapons: number = 9
const searchGrid: GridArray<Weapon> = Object.values(props.grid).map((o) => o.weapon)
const extraGrid = (
<ExtraWeapons
grid={props.grid}
editable={props.editable}
exists={false}
offset={numWeapons}
onClick={openSearchModal}
/>
)
function receiveWeapon(weapon: Weapon, position: number) {
props.onSelect(GridType.Weapon, weapon, position)
}
function sendData(object: Character | Weapon | Summon, position: number) {
if (isWeapon(object)) {
receiveWeapon(object, position)
}
}
function isWeapon(object: Character | Weapon | Summon): object is Weapon {
return (object as Weapon).proficiency !== undefined
}
function openSearchModal(position: number) {
setSearchPosition(position)
openModal()
}
return (
<div id="weapon_grids">
<div id="WeaponGrid">
<WeaponUnit
editable={props.editable}
key="grid_mainhand"
position={-1}
unitType={0}
gridWeapon={props.mainhand}
onClick={() => { openSearchModal(-1) }}
/>
<ul id="grid_weapons">
{
Array.from(Array(numWeapons)).map((x, i) => {
return (
<li key={`grid_unit_${i}`} >
<WeaponUnit
editable={props.editable}
position={i}
unitType={1}
gridWeapon={props.grid[i]}
onClick={() => { openSearchModal(i) }}
/>
</li>
)
})
}
</ul>
</div>
{ (() => {
if(props.extra) {
return extraGrid
}
})() }
{open ? (
<SearchModal
grid={searchGrid}
close={closeModal}
send={sendData}
fromPosition={searchPosition}
object="weapons"
placeholderText="Search for a weapon..."
/>
) : null}
</div>
)
}
export default WeaponGrid