From 2b81cfb0aca02667000fc31faba2f14131e9eef2 Mon Sep 17 00:00:00 2001 From: Alex Metelli Date: Wed, 17 Jan 2024 16:35:37 +0800 Subject: [PATCH] added win loss ration to universe view --- .../components/battlereports/BattleReport.tsx | 2 +- .../src/components/battlereports/utils.ts | 82 +++++++++++++++++++ .../src/components/boxes/UniverseViewBox.tsx | 15 +++- .../frontend/src/pages/Simulator/index.tsx | 3 - .../frontend/src/panels/UniverseViewTab.tsx | 6 +- 5 files changed, 102 insertions(+), 6 deletions(-) create mode 100644 packages/testnet/frontend/src/components/battlereports/utils.ts diff --git a/packages/testnet/frontend/src/components/battlereports/BattleReport.tsx b/packages/testnet/frontend/src/components/battlereports/BattleReport.tsx index d54bcb8..17971cf 100644 --- a/packages/testnet/frontend/src/components/battlereports/BattleReport.tsx +++ b/packages/testnet/frontend/src/components/battlereports/BattleReport.tsx @@ -91,7 +91,7 @@ interface Debris { quartz: number; } -interface FetchData { +export interface FetchData { battle_id: number; time: string; attacker_planet_id: number; diff --git a/packages/testnet/frontend/src/components/battlereports/utils.ts b/packages/testnet/frontend/src/components/battlereports/utils.ts new file mode 100644 index 0000000..7607208 --- /dev/null +++ b/packages/testnet/frontend/src/components/battlereports/utils.ts @@ -0,0 +1,82 @@ +import { useState, useEffect } from 'react'; +import { FetchData } from './BattleReport'; + +export function useGetBattleReportsData(planetId: number | null) { + const [battleReports, setBattleReports] = useState([]); + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(null); + + useEffect(() => { + if (planetId === null) { + // If planetId is not set, clear the current data and do not fetch + setBattleReports([]); + setError(null); + setIsLoading(false); + return; + } + + const apiUrl = `https://www.api.testnet.no-game.xyz/battle-reports?planet_id=${planetId}`; + const fetchData = async () => { + setIsLoading(true); + setError(null); + + try { + const response = await fetch(apiUrl); + if (!response.ok) { + throw new Error('Error fetching battle reports'); + } + const data = await response.json(); + + if (data.length === 0) { + setError('No Battle Reports to show'); + setBattleReports([]); + } else { + setBattleReports(data); + } + } catch (err) { + setError( + err instanceof Error ? err.message : 'An unexpected error occurred' + ); + } finally { + setIsLoading(false); + } + }; + + fetchData(); + }, [planetId]); // Re-fetch data when planetId changes + + return { battleReports, isLoading, error }; +} + +export function useCalculateWinsAndLosses(planetId: number) { + const [winLoss, setWinLoss] = useState({ wins: 0, losses: 0 }); + + const { battleReports, isLoading, error } = useGetBattleReportsData(planetId); + console.log(battleReports); + console.log(error); + + useEffect(() => { + if (!isLoading && !error && battleReports) { + let wins = 0; + let losses = 0; + + for (const report of battleReports) { + const totalLoot = + report.loot.steel + report.loot.quartz + report.loot.tritium; + console.log(totalLoot); + + if (report.attacker_planet_id === planetId && totalLoot > 0) { + wins++; + } else if (report.defender_planet_id === planetId && totalLoot === 0) { + wins++; + } else { + losses++; + } + } + + setWinLoss({ wins, losses }); + } + }, [battleReports, isLoading, error, planetId]); + + return winLoss; +} diff --git a/packages/testnet/frontend/src/components/boxes/UniverseViewBox.tsx b/packages/testnet/frontend/src/components/boxes/UniverseViewBox.tsx index 820fe5b..69c0715 100644 --- a/packages/testnet/frontend/src/components/boxes/UniverseViewBox.tsx +++ b/packages/testnet/frontend/src/components/boxes/UniverseViewBox.tsx @@ -62,6 +62,7 @@ interface Props { ownTechs?: TechLevels; isNoobProtected?: boolean; lastActive: number; + winLoss: [number, number]; } const UniverseViewBox = ({ @@ -76,6 +77,7 @@ const UniverseViewBox = ({ ownTechs, isNoobProtected, lastActive, + winLoss, }: Props) => { const boxStyle = highlighted ? { border: '1px solid #23CE6B' } : {}; @@ -151,11 +153,22 @@ const UniverseViewBox = ({ - RANKING + RANK {isNaN(Number(points)) ? '-' : numberWithCommas(Number(points))} + + + WIN/LOSS + + + {winLoss[0]} + / + {winLoss[1]} + + + POSITION diff --git a/packages/testnet/frontend/src/pages/Simulator/index.tsx b/packages/testnet/frontend/src/pages/Simulator/index.tsx index 34c5922..f714d8e 100644 --- a/packages/testnet/frontend/src/pages/Simulator/index.tsx +++ b/packages/testnet/frontend/src/pages/Simulator/index.tsx @@ -93,9 +93,6 @@ export const BattleSimulator = () => { const [defenderFleet, setDefenderFleet] = useState(baseFleet); const [defences, setDefences] = useState(baseDefences); - // const response = useSimulation(attackerFleet, defenderFleet, defences); - // console.log('response', response); - const handleInputChange = ( fleetType: 'attacker' | 'defender', shipType: keyof Fleet, diff --git a/packages/testnet/frontend/src/panels/UniverseViewTab.tsx b/packages/testnet/frontend/src/panels/UniverseViewTab.tsx index a3fdd09..d461b2c 100644 --- a/packages/testnet/frontend/src/panels/UniverseViewTab.tsx +++ b/packages/testnet/frontend/src/panels/UniverseViewTab.tsx @@ -16,6 +16,7 @@ import { useGetIsNoobProtected, useLastActive } from '../hooks/FleetHooks'; import { getPlanetImage, type ImageId } from '../shared/utils/getPlanetImage'; import fetchPlanetsData from '../api/fetchPlanetsData'; import { useGetPlanetRanking } from '../components/leaderboards/utils'; +import { useCalculateWinsAndLosses } from '../components/battlereports/utils'; interface UniverseBoxItemProps { ownPlanetId: number; @@ -38,7 +39,9 @@ const UniverseBoxItem = ({ ); const planetRanking = useGetPlanetRanking(planet.planetId); - console.log(planetRanking); + + const winLoss = useCalculateWinsAndLosses(planet.planetId); + console.log(winLoss); const lastActive = useLastActive(planet.planetId); const ownFleetData = useShipsLevels(Number(ownPlanetId)); @@ -78,6 +81,7 @@ const UniverseBoxItem = ({ ownTechs={ownTechs} isNoobProtected={isNoobProtected} lastActive={Number(lastActive)} + winLoss={[winLoss.wins, winLoss.losses]} /> ); };