import { Button, Tooltip, Typography, useTheme } from "@mui/material"; import { AccessToken, Planet, PlanetInfo, PlanetInfoUniverse } from "@/types"; import { Api } from "@/esi-api"; import { Dispatch, SetStateAction, forwardRef, useContext, useEffect, useState, } from "react"; import { DateTime } from "luxon"; import { EXTRACTOR_TYPE_IDS, FACTORY_IDS, PI_SCHEMATICS, PI_TYPES_MAP, } from "@/const"; import TableCell from "@mui/material/TableCell"; import TableRow from "@mui/material/TableRow"; import Countdown from "react-countdown"; import Image from "next/image"; import { SessionContext } from "@/app/context/Context"; import Slide from "@mui/material/Slide"; import { TransitionProps } from "@mui/material/transitions"; import Dialog from "@mui/material/Dialog"; import AppBar from "@mui/material/AppBar"; import Toolbar from "@mui/material/Toolbar"; import IconButton from "@mui/material/IconButton"; import CloseIcon from "@mui/icons-material/Close"; import PinsCanvas3D from "./PinsCanvas3D"; const Transition = forwardRef(function Transition( props: TransitionProps & { children: React.ReactElement; }, ref: React.Ref ) { return ; }); export const PlanetTableRow = ({ planet, character, }: { planet: Planet; character: AccessToken; }) => { const theme = useTheme(); const [planetRenderOpen, setPlanetRenderOpen] = useState(false); const handle3DrenderOpen = () => { setPlanetRenderOpen(true); }; const handle3DrenderClose = () => { setPlanetRenderOpen(false); }; const { piPrices } = useContext(SessionContext); const [planetInfo, setPlanetInfo] = useState( undefined ); const [planetInfoUniverse, setPlanetInfoUniverse] = useState< PlanetInfoUniverse | undefined >(undefined); const [extractors, setExtractors] = useState([]); const [production, setProduction] = useState( new Map() ); const [imports, setImports] = useState< (typeof PI_SCHEMATICS)[number]["inputs"] >([]); const [exports, setExports] = useState<{ typeId: number; amount: number }[]>( [] ); type SchematicId = number; const getPlanet = async ( character: AccessToken, planet: Planet ): Promise => { const api = new Api(); const planetRes = await api.v3.getCharactersCharacterIdPlanetsPlanetId( character.character.characterId, planet.planet_id, { token: character.access_token, } ); const planetInfo = planetRes.data; setExtractors( planetInfo.pins.filter((p) => EXTRACTOR_TYPE_IDS.some((e) => e === p.type_id) ) ); const localProduction = planetInfo.pins .filter((p) => FACTORY_IDS().some((e) => e.type_id === p.type_id)) .reduce((acc, f) => { if (f.schematic_id) { const schematic = PI_SCHEMATICS.find( (s) => s.schematic_id == f.schematic_id ); if (schematic) acc.set(f.schematic_id, schematic); } return acc; }, new Map()); setProduction(localProduction); const locallyProduced = Array.from(localProduction) .flatMap((p) => p[1].outputs) .map((p) => p.type_id); const locallyConsumed = Array.from(localProduction) .flatMap((p) => p[1].inputs) .map((p) => p.type_id); const locallyExcavated = planetInfo.pins .filter((p) => EXTRACTOR_TYPE_IDS.some((e) => e === p.type_id)) .map((e) => e.extractor_details?.product_type_id ?? 0); const localImports = Array.from(localProduction) .flatMap((p) => p[1].inputs) .filter( (p) => ![...locallyProduced, ...locallyExcavated].some( (lp) => lp === p.type_id ) ); const localExports = locallyProduced .filter((p) => !locallyConsumed.some((lp) => lp === p)) .map((typeId) => { const schematic = PI_SCHEMATICS.flatMap((s) => s.outputs).find( (s) => s.type_id === typeId ); if (!schematic) return { typeId, amount: 0 }; const factoriesProducing = planetInfo.pins .filter((p) => FACTORY_IDS().some((e) => e.type_id === p.type_id)) .filter((f) => f.schematic_id === schematic?.schematic_id); const amount = schematic.quantity ? factoriesProducing.length * schematic.quantity : (0 * PI_SCHEMATICS[schematic.schematic_id].cycle_time) / 3600; return { typeId, amount, }; }); setImports(localImports); setExports(localExports); return planetInfo; }; const getPlanetUniverse = async ( planet: Planet ): Promise => { const api = new Api(); const planetInfo = ( await api.v1.getUniversePlanetsPlanetId(planet.planet_id) ).data; return planetInfo; }; const timeColor = (extractorDate: string | undefined): string => { if (!extractorDate) return "red"; const dateExtractor = DateTime.fromISO(extractorDate); const dateNow = DateTime.now(); if (dateExtractor < dateNow) return "red"; if (dateExtractor.minus({ hours: 24 }) < dateNow) return "yellow"; return "green"; }; useEffect(() => { getPlanet(character, planet).then(setPlanetInfo); getPlanetUniverse(planet).then(setPlanetInfoUniverse); }, [planet, character]); return (
{planetInfoUniverse?.name}
{planet.upgrade_level}
{extractors.map((e, idx) => { return (
{e ? ( ) : ( "STOPPED" )} {PI_TYPES_MAP[e.extractor_details?.product_type_id ?? 0].name}
); })}
{Array.from(production).map((schematic, idx) => { return ( {schematic[1].name} ); })}
{imports.map((i) => ( {PI_TYPES_MAP[i.type_id].name} ))}
{exports.map((exports) => ( {PI_TYPES_MAP[exports.typeId].name} ))}
{exports.map((exports) => ( {exports.amount} ))}
{exports.map((e) => ( {`${( (((piPrices?.appraisal.items.find((a) => a.typeID === e.typeId) ?.prices.sell.min ?? 0) * e.amount) / 1000000) * 24 * 30 ).toFixed(2)} M`} ))}
{planetInfoUniverse?.name}
); };