import type { Resource } from "@elysium/types"; import { useGame } from "../../context/GameContext.js"; import { RESOURCE_CAP } from "../../engine/tick.js"; interface ResourceBarProps { resources: Resource; prestigeCount: number; profileUrl: string; onEditProfile: () => void; lastSavedAt: number | null; isSyncing: boolean; onForceSync: () => Promise; } const formatRelativeTime = (timestamp: number): string => { const seconds = Math.floor((Date.now() - timestamp) / 1000); if (seconds < 10) return "just now"; if (seconds < 60) return `${seconds}s ago`; const minutes = Math.floor(seconds / 60); if (minutes < 60) return `${minutes}m ago`; const hours = Math.floor(minutes / 60); return `${hours}h ago`; }; const RESOURCE_FULL_TOOLTIP = "This resource is full! Consider spending some or prestiging to keep earning."; export const ResourceBar = ({ resources, prestigeCount, profileUrl, onEditProfile, lastSavedAt, isSyncing, onForceSync, }: ResourceBarProps): React.JSX.Element => { const { formatNumber, syncError } = useGame(); const anyFull = Object.values(resources).some((v) => v >= RESOURCE_CAP); return ( <>
= RESOURCE_CAP ? " resource-full" : ""}`}> 🪙 {formatNumber(resources.gold)} Gold {resources.gold >= RESOURCE_CAP && FULL}
= RESOURCE_CAP ? " resource-full" : ""}`}> {formatNumber(resources.essence)} Essence {resources.essence >= RESOURCE_CAP && FULL}
= RESOURCE_CAP ? " resource-full" : ""}`}> 💎 {formatNumber(resources.crystals)} Crystals {resources.crystals >= RESOURCE_CAP && FULL}
= RESOURCE_CAP ? " resource-full" : ""}`}> 🔮 {formatNumber(resources.runestones)} Runestones {resources.runestones >= RESOURCE_CAP && FULL}
{prestigeCount > 0 && (
⭐ Prestige {prestigeCount}
)}
{syncError !== null ? ( ❌ Save failed ) : lastSavedAt !== null ? ( ☁️ {formatRelativeTime(lastSavedAt)} ) : null} 👤 Profile
{anyFull && (
⚠️ One or more resources are full! Consider spending some or prestiging to keep earning.
)} ); };