From d5343293cbe43d09974690725ad2e82bed8460e2 Mon Sep 17 00:00:00 2001 From: Justin Edmund Date: Mon, 31 Jan 2022 20:51:38 -0800 Subject: [PATCH] Move PartyRoute to a Next.js page --- pages/p/[slug].tsx | 152 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 pages/p/[slug].tsx diff --git a/pages/p/[slug].tsx b/pages/p/[slug].tsx new file mode 100644 index 00000000..7cbe900f --- /dev/null +++ b/pages/p/[slug].tsx @@ -0,0 +1,152 @@ +import React, { useEffect, useState } from 'react' +import { withCookies, useCookies } from 'react-cookie' +import { useRouter } from 'next/router' +import api from '~utils/api' + +import Party from '~components/Party' +import Button from '~components/Button' + +interface Props { + hash: string +} + +const PartyRoute: React.FC = () => { + const router = useRouter() + const { slug } = router.query + + const [found, setFound] = useState(false) + const [loading, setLoading] = useState(true) + const [editable, setEditable] = useState(false) + + const [characters, setCharacters] = useState>({}) + const [weapons, setWeapons] = useState>({}) + const [summons, setSummons] = useState>({}) + + const [mainWeapon, setMainWeapon] = useState() + const [mainSummon, setMainSummon] = useState() + const [friendSummon, setFriendSummon] = useState() + + const [partyId, setPartyId] = useState('') + const [extra, setExtra] = useState(false) + const [cookies, _] = useCookies(['user']) + + useEffect(() => { + async function fetchGrid(shortcode: string) { + return api.endpoints.parties.getOne({ id: shortcode }) + .then(response => { + const party = response.data.party + + const partyUser = (party.user_id) ? party.user_id : undefined + const loggedInUser = (cookies.user) ? cookies.user.user_id : '' + + if (partyUser != undefined && loggedInUser != undefined && partyUser === loggedInUser) + setEditable(true) + + const characters = populateCharacters(party.characters) + const weapons = populateWeapons(party.weapons) + const summons = populateSummons(party.summons) + + setExtra(response.data.party.is_extra) + setFound(true) + setLoading(false) + setCharacters(characters) + setWeapons(weapons) + setSummons(summons) + setPartyId(party.id) + }) + .catch(error => { + if (error.response != null) { + if (error.response.status == 404) { + setFound(false) + setLoading(false) + } + } else { + console.error(error) + } + }) + } + + function populateCharacters(list: [GridCharacter]) { + let characters: GridArray = {} + + list.forEach((object: GridCharacter) => { + if (object.position != null) + characters[object.position] = object.character + }) + + return characters + } + + function populateWeapons(list: [GridWeapon]) { + let weapons: GridArray = {} + + list.forEach((object: GridWeapon) => { + if (object.mainhand) + setMainWeapon(object.weapon) + else if (!object.mainhand && object.position != null) + weapons[object.position] = object.weapon + }) + + return weapons + } + + function populateSummons(list: [GridSummon]) { + let summons: GridArray = {} + + list.forEach((object: GridSummon) => { + if (object.main) + setMainSummon(object.summon) + else if (object.friend) + setFriendSummon(object.summon) + else if (!object.main && !object.friend && object.position != null) + summons[object.position] = object.summon + }) + + return summons + } + + const shortcode: string = slug as string + fetchGrid(shortcode) + }, [slug, cookies.user]) + + function render() { + return ( +
+ +
+ ) + } + + function renderNotFound() { + return ( +
+

There's no grid here.

+ +
+ ) + } + + if (!found && !loading) { + return renderNotFound() + } else if (found && !loading) { + return render() + } else { + return (
) + } +} + +export default + withCookies( + PartyRoute + ) \ No newline at end of file