import React, { useState } from 'react'; import { VitalBar } from './VitalBar'; import type { CharacterState } from '../types'; interface Props { character: CharacterState; } const vtankBadge = (state: string) => { const s = (state || 'idle').toLowerCase(); if (s === 'combat') return { label: 'Combat', cls: 'badge-combat' }; if (s === 'nav' || s === 'navigation') return { label: 'Nav', cls: 'badge-nav' }; return { label: 'Idle', cls: 'badge-idle' }; }; export const CharacterCard: React.FC = React.memo(({ character }) => { const [expanded, setExpanded] = useState(false); const { telemetry: t, vitals: v, combat: c } = character; const badge = vtankBadge(t?.vt_state ?? ''); return (
setExpanded(!expanded)}>
{character.name} {badge.label}
{v ? (
) : (
Awaiting vitals...
)}
{t?.kills_per_hour ?? '--'} kills/hr
{t?.kills?.toLocaleString() ?? '--'} kills
{t?.deaths ?? '0'} deaths
{t?.onlinetime?.replace(/^00\./, '') ?? '--'} uptime
{t && (
{t.ns?.toFixed(1)}N, {t.ew?.toFixed(1)}E
)} {expanded && (
{v?.vitae ?
Vitae: {v.vitae}%
: null}
Prismatics: {t?.prismatic_taper_count ?? '--'} Total Deaths: {t?.total_deaths ?? '--'}
{c?.session && (
Session Dmg: {c.session.total_damage_given?.toLocaleString()} Session Kills: {c.session.total_kills}
)}
RAM: {t?.mem_mb ? (t.mem_mb / 1048576).toFixed(0) + ' MB' : '--'} CPU: {t?.cpu_pct?.toFixed(1) ?? '--'}%
)}
); }); CharacterCard.displayName = 'CharacterCard';