diff --git a/components/ExtraSummons/index.tsx b/components/ExtraSummons/index.tsx index c3b4868e..e32b8e4a 100644 --- a/components/ExtraSummons/index.tsx +++ b/components/ExtraSummons/index.tsx @@ -12,12 +12,13 @@ export enum GridType { // Props interface Props { - grid: GridArray + grid: GridArray editable: boolean exists: boolean found?: boolean offset: number onClick: (position: number) => void + updateUncap: (id: string, uncap: number) => void } const ExtraSummons = (props: Props) => { @@ -32,11 +33,12 @@ const ExtraSummons = (props: Props) => { return (
  • { props.onClick(props.offset + i) }} editable={props.editable} position={props.offset + i} unitType={1} - summon={props.grid[props.offset + i]} + gridSummon={props.grid[props.offset + i]} + onClick={() => { props.onClick(props.offset + i) }} + updateUncap={props.updateUncap} />
  • ) diff --git a/components/Party/index.tsx b/components/Party/index.tsx index 71c89bc9..22677894 100644 --- a/components/Party/index.tsx +++ b/components/Party/index.tsx @@ -24,11 +24,11 @@ import './index.scss' interface Props { partyId?: string mainWeapon?: GridWeapon - mainSummon?: Summon - friendSummon?: Summon + mainSummon?: GridSummon + friendSummon?: GridSummon characters?: GridArray weapons?: GridArray - summons?: GridArray + summons?: GridArray extra: boolean editable: boolean exists: boolean @@ -47,11 +47,11 @@ const Party = (props: Props) => { // Grid data const [characters, setCharacters] = useState>({}) const [weapons, setWeapons] = useState>({}) - const [summons, setSummons] = useState>({}) + const [summons, setSummons] = useState>({}) const [mainWeapon, setMainWeapon] = useState() - const [mainSummon, setMainSummon] = useState() - const [friendSummon, setFriendSummon] = useState() + const [mainSummon, setMainSummon] = useState() + const [friendSummon, setFriendSummon] = useState() const [extra, setExtra] = useState(false) @@ -185,8 +185,8 @@ const Party = (props: Props) => { case GridType.Summon: const summon = item as Summon saveSummon(summon, position, partyId) - .then(() => { - storeSummon(summon, position) + .then((response) => { + storeSummon(response.data.grid_summon, position) }) break } @@ -224,7 +224,7 @@ const Party = (props: Props) => { } // Summons - function storeSummon(summon: Summon, position: number) { + function storeSummon(summon: GridSummon, position: number) { if (position == -1) { setMainSummon(summon) } else if (position == 6) { @@ -238,7 +238,7 @@ const Party = (props: Props) => { } async function saveSummon(summon: Summon, position: number, party: string) { - await api.endpoints.summons.create({ + return await api.endpoints.summons.create({ 'summon': { 'party_id': party, 'summon_id': summon.id, diff --git a/components/SummonGrid/index.tsx b/components/SummonGrid/index.tsx index 97cbf927..64ea5fcc 100644 --- a/components/SummonGrid/index.tsx +++ b/components/SummonGrid/index.tsx @@ -1,10 +1,13 @@ -import React, { useState } from 'react' +import React, { useCallback, useState } from 'react' import { useModal as useModal } from '~utils/useModal' -import SearchModal from '~components/SearchModal' -import ExtraSummons from '~components/ExtraSummons' -import SummonUnit from '~components/SummonUnit' +import debounce from 'lodash.debounce' +import SearchModal from '~components/SearchModal' +import SummonUnit from '~components/SummonUnit' +import ExtraSummons from '~components/ExtraSummons' + +import api from '~utils/api' import './index.scss' // GridType @@ -19,9 +22,9 @@ export enum GridType { interface Props { userId?: string partyId?: string - main?: Summon | undefined - friend?: Summon | undefined - grid: GridArray + main?: GridSummon | undefined + friend?: GridSummon | undefined + grid: GridArray editable: boolean exists: boolean found?: boolean @@ -33,11 +36,7 @@ const SummonGrid = (props: Props) => { const [searchPosition, setSearchPosition] = useState(0) const numSummons: number = 4 - - function openSearchModal(position: number) { - setSearchPosition(position) - openModal() - } + const searchGrid: GridArray = Object.values(props.grid).map((o) => o.summon) function receiveSummon(summon: Summon, position: number) { props.onSelect(GridType.Summon, summon, position) @@ -54,30 +53,54 @@ const SummonGrid = (props: Props) => { return (object as Summon).granblue_id !== undefined } + function openSearchModal(position: number) { + setSearchPosition(position) + openModal() + } + + async function updateUncap(id: string, level: number) { + await api.updateUncap('summon', id, level) + .catch(error => { + console.error(error) + }) + } + + const initiateUncapUpdate = (id: string, uncapLevel: number) => { + debouncedAction(id, uncapLevel) + } + + const debouncedAction = useCallback( + () => debounce((id, number) => { + updateUncap(id, number) + }, 1000), [] + )() + return (
    Main Summon
    { openSearchModal(0) }} editable={props.editable} key="grid_main_summon" position={-1} unitType={0} - summon={props.main} + gridSummon={props.main} + onClick={() => { openSearchModal(-1) }} + updateUncap={initiateUncapUpdate} />
    Friend Summon
    { openSearchModal(6) }} editable={props.editable} key="grid_friend_summon" position={6} unitType={2} - summon={props.friend} + gridSummon={props.friend} + onClick={() => { openSearchModal(6) }} + updateUncap={initiateUncapUpdate} />
    @@ -89,11 +112,12 @@ const SummonGrid = (props: Props) => { return (
  • { openSearchModal(i) }} editable={props.editable} position={i} unitType={1} - summon={props.grid[i]} + gridSummon={props.grid[i]} + onClick={() => { openSearchModal(i) }} + updateUncap={initiateUncapUpdate} />
  • ) @@ -104,16 +128,17 @@ const SummonGrid = (props: Props) => {
    {open ? ( void - summon: Summon | undefined + updateUncap: (id: string, uncap: number) => void + gridSummon: GridSummon | undefined position: number editable: boolean unitType: 0 | 1 | 2 @@ -25,10 +24,11 @@ const SummonUnit = (props: Props) => { 'grid': props.unitType == 1, 'friend': props.unitType == 2, 'editable': props.editable, - 'filled': (props.summon !== undefined) + 'filled': (props.gridSummon !== undefined) }) - const summon = props.summon + const gridSummon = props.gridSummon + const summon = gridSummon?.summon useEffect(() => { generateImageUrl() @@ -36,8 +36,8 @@ const SummonUnit = (props: Props) => { function generateImageUrl() { let imgSrc = "" - if (props.summon) { - const summon = props.summon! + if (props.gridSummon) { + const summon = props.gridSummon.summon! // Generate the correct source for the summon if (props.unitType == 0 || props.unitType == 2) @@ -49,6 +49,11 @@ const SummonUnit = (props: Props) => { setImageUrl(imgSrc) } + function passUncapData(uncap: number) { + if (props.gridSummon) + props.updateUncap(props.gridSummon.id, uncap) + } + return (
    @@ -56,12 +61,14 @@ const SummonUnit = (props: Props) => { {summon?.name.en} { (props.editable) ? : '' }
    + { (gridSummon) ? + uncapLevel={gridSummon?.uncap_level} + updateUncap={passUncapData} + /> : '' }

    {summon?.name.en}

    diff --git a/pages/p/[party].tsx b/pages/p/[party].tsx index 6d002c8a..310e66f4 100644 --- a/pages/p/[party].tsx +++ b/pages/p/[party].tsx @@ -24,11 +24,11 @@ const PartyRoute: React.FC = () => { const [characters, setCharacters] = useState>({}) const [weapons, setWeapons] = useState>({}) - const [summons, setSummons] = useState>({}) + const [summons, setSummons] = useState>({}) const [mainWeapon, setMainWeapon] = useState() - const [mainSummon, setMainSummon] = useState() - const [friendSummon, setFriendSummon] = useState() + const [mainSummon, setMainSummon] = useState() + const [friendSummon, setFriendSummon] = useState() const [partyId, setPartyId] = useState('') const [extra, setExtra] = useState(false) @@ -97,15 +97,15 @@ const PartyRoute: React.FC = () => { } function populateSummons(list: [GridSummon]) { - let summons: GridArray = {} + let summons: GridArray = {} list.forEach((object: GridSummon) => { if (object.main) - setMainSummon(object.summon) + setMainSummon(object) else if (object.friend) - setFriendSummon(object.summon) + setFriendSummon(object) else if (!object.main && !object.friend && object.position != null) - summons[object.position] = object.summon + summons[object.position] = object }) return summons diff --git a/types/GridSummon.d.ts b/types/GridSummon.d.ts index 2f366574..6cbb3fe6 100644 --- a/types/GridSummon.d.ts +++ b/types/GridSummon.d.ts @@ -4,4 +4,5 @@ interface GridSummon { friend: boolean position: number | null summon: Summon + uncap_level: number } \ No newline at end of file