import { Link } from "@remix-run/react"; import { humanTimeAgo, snakeCaseToTitleCase, worlds, zones, } from "~/utils/strings"; import * as styles from "./index-world.css"; import vsLogo from "~/images/vs-100.png"; import ncLogo from "~/images/nc-100.png"; import trLogo from "~/images/tr-100.png"; import { FactionBar } from "./faction-bar"; import type { MetagameWorld } from "~/utils/metagame"; import type { PopulationWorld } from "~/utils/population"; import { c } from "~/utils/classes"; import { ReactFragment, useEffect, useState } from "react"; export type IndexWorldProps = { metagame: MetagameWorld; population: PopulationWorld; }; export const IndexWorld = ({ metagame, population }: IndexWorldProps) => { const worldId = metagame.id; const { platform, location, name } = worlds[String(worldId || "default")]; const nextZone = metagame.zones.sort( (a, b) => new Date(a.locked_since ?? Date.now()).getTime() - new Date(b.locked_since ?? Date.now()).getTime() )[0]; const nextZoneStrings = zones[nextZone.id]; return (
{name}
[{location}] [{platform}]{" "}
DETAILS ⇨
{population.factions.vs + population.factions.nc + population.factions.tr}
VS{" "} {population.factions.vs}
NC{" "} {population.factions.nc}
TR{" "} {population.factions.tr}
{metagame.zones .filter((zone) => !zone.locked) .sort((a, b) => { return a.alert && !b.alert ? -1 : b.alert && !a.alert ? 1 : 0; }) .map((zone) => { return worldId !== 19 ? ( ) : ( ); })} {worldId !== 19 && (
Next continent »
{" "}
{nextZoneStrings.name}
)}
); }; const JaegerContinent = ({ zone }: { zone: MetagameWorld["zones"][0] }) => { const { name, colors: [upper, lower], } = zones[zone.id]; return (
{name}
); }; const endTime = (alert: Required["alert"]) => { const alertDurationMins = alert.alert_type !== "sudden_death" ? 90 : 15; return new Date(alert.start_time).getTime() + alertDurationMins * 60 * 1000; }; const Continent = ({ zone }: { zone: MetagameWorld["zones"][0] }) => { const { name, colors: [upper, lower], } = zones[zone.id]; return (
{name}
TERRITORY CONTROL
{zone.alert && ( <>
{snakeCaseToTitleCase(zone.alert.alert_type).toUpperCase()}{" "} ALERT PROGRESS
{" "}
{" "}
)}
); }; const timeLeftString = (alert: MetagameWorld["zones"][0]["alert"]) => { if (alert) { const time = endTime(alert) - Date.now(); if (time < 2000) { return <>JUST ENDED; } const speed = time < 1000 * 60 * 15 ? "1s" : "4s"; return ( <> {humanTimeAgo(time, true).toUpperCase()} LEFT{" "}
); } else { return <>; } }; const TimeLeft = ({ alert }: { alert: MetagameWorld["zones"][0]["alert"] }) => { const [timeLeft, setTimeLeft] = useState(timeLeftString(alert)); useEffect(() => { if (alert) { const interval = setInterval(() => { setTimeLeft(timeLeftString(alert)); }, 1000); return () => clearInterval(interval); } }, [alert]); return <>{timeLeft}; };