import { Stack, Tooltip, Typography, styled } from "@mui/material"; import Image from "next/image"; import { AccessToken, Planet } from "@/types"; import { Api } from "@/esi-api"; import { forwardRef, useEffect, useState } from "react"; import { DateTime } from "luxon"; import { EXTRACTOR_TYPE_IDS } from "@/const"; import Countdown from "react-countdown"; import PinsCanvas3D from "./PinsCanvas3D"; 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 Button from "@mui/material/Button"; const StackItem = styled(Stack)(({ theme }) => ({ ...theme.typography.body2, padding: 0, margin: "0 !important", textAlign: "left", justifyContent: "center", alignItems: "center", })); export interface Pin { contents?: { amount: number; type_id: number; }[]; expiry_time?: string; extractor_details?: { cycle_time?: number; head_radius?: number; heads: { head_id: number; latitude: number; longitude: number; }[]; product_type_id?: number; qty_per_cycle?: number; }; factory_details?: { schematic_id: number; }; install_time?: string; last_cycle_start?: string; latitude: number; longitude: number; pin_id: number; schematic_id?: number; type_id: number; } export interface PlanetInfo { links: { destination_pin_id: number; link_level: number; source_pin_id: number; }[]; pins: Pin[]; routes: { content_type_id: number; destination_pin_id: number; quantity: number; route_id: number; source_pin_id: number; waypoints?: number[]; }[]; } export interface PlanetInfoUniverse { name: string; planet_id: number; position: { x: number; y: number; z: number; }; system_id: number; type_id: number; } const Transition = forwardRef(function Transition( props: TransitionProps & { children: React.ReactElement; }, ref: React.Ref ) { return ; }); export const PlanetCard = ({ planet, character, }: { planet: Planet; character: AccessToken; }) => { const [planetInfo, setPlanetInfo] = useState( undefined ); const [planetInfoUniverse, setPlanetInfoUniverse] = useState< PlanetInfoUniverse | undefined >(undefined); const [planetRenderOpen, setPlanetRenderOpen] = useState(false); const handle3DrenderOpen = () => { setPlanetRenderOpen(true); }; const handle3DrenderClose = () => { setPlanetRenderOpen(false); }; const extractors = (planetInfo && planetInfo.pins .filter((p) => EXTRACTOR_TYPE_IDS.some((e) => e === p.type_id)) .map((p) => p.expiry_time)) ?? []; const getPlanet = async ( character: AccessToken, planet: Planet ): Promise => { const api = new Api(); const planetInfo = ( await api.characters.getCharactersCharacterIdPlanetsPlanetId( character.character.characterId, planet.planet_id, { token: character.access_token, } ) ).data; return planetInfo; }; const getPlanetUniverse = async ( planet: Planet ): Promise => { const api = new Api(); const planetInfo = ( await api.universe.getUniversePlanetsPlanetId(planet.planet_id) ).data; return planetInfo; }; useEffect(() => { getPlanet(character, planet).then(setPlanetInfo); getPlanetUniverse(planet).then(setPlanetInfoUniverse); }, [planet, character]); return ( {extractors.some((e) => { if (!e) return true; const dateExtractor = DateTime.fromISO(e); const dateNow = DateTime.now(); return dateExtractor < dateNow; }) && ( )}
{planetInfoUniverse?.name} L{planet.upgrade_level}
{extractors.map((e, idx) => { const inPast = () => { if (!e) return true; const dateExtractor = DateTime.fromISO(e); const dateNow = DateTime.now(); return dateExtractor < dateNow; }; return ( {e ? ( ) : ( "STOPPED" )} ); })} {planetInfoUniverse?.name}
); };