import React, { useEffect, useState } from "react"; const STORAGE_KEY = "gorilla-tag-tracker-v1"; function uid() { return Math.random().toString(36).slice(2, 9); } export default function GorillaTagTracker() { const [players, setPlayers] = useState([]); const [form, setForm] = useState({ name: "", platform: "Quest", steamId: "", notes: "", }); const [filter, setFilter] = useState(""); // Load saved players from localStorage useEffect(() => { const saved = localStorage.getItem(STORAGE_KEY); if (saved) setPlayers(JSON.parse(saved)); }, []); // Save players when changed useEffect(() => { localStorage.setItem(STORAGE_KEY, JSON.stringify(players)); }, [players]); function addPlayer(e) { e?.preventDefault(); if (!form.name.trim()) return; const p = { id: uid(), name: form.name.trim(), platform: form.platform, steamId: form.steamId.trim() || null, notes: form.notes || "", sessions: [], createdAt: Date.now(), }; setPlayers([p, ...players]); setForm({ name: "", platform: "Quest", steamId: "", notes: "" }); } function removePlayer(id) { if (!confirm("Remove player and all their session data?")) return; setPlayers(players.filter((p) => p.id !== id)); } function startSession(id) { setPlayers( players.map((p) => { if (p.id !== id) return p; const active = p.sessions.some((s) => !s.end); if (active) return p; return { ...p, sessions: [{ start: Date.now(), end: null }, ...p.sessions], }; }) ); } function stopSession(id) { setPlayers( players.map((p) => { if (p.id !== id) return p; const sessions = p.sessions.slice(); const idx = sessions.findIndex((s) => !s.end); if (idx === -1) return p; sessions[idx] = { ...sessions[idx], end: Date.now() }; return { ...p, sessions }; }) ); } function totalPlaytime(p) { return p.sessions.reduce((acc, s) => { const end = s.end || Date.now(); return acc + (end - s.start); }, 0); } function fmtMs(ms) { const sec = Math.floor(ms / 1000); const h = Math.floor(sec / 3600); const m = Math.floor((sec % 3600) / 60); const s = sec % 60; return `${h}h ${m}m ${s}s`; } const visible = players.filter((p) => p.name.toLowerCase().includes(filter.toLowerCase()) ); return (

🦍 Gorilla Tag Player Tracker

{/* Add Player Form */}
setForm({ ...form, name: e.target.value })} placeholder="Player name" className="p-3 rounded-lg bg-white/10 border border-white/20 focus:ring-2 focus:ring-cyan-400" /> setForm({ ...form, steamId: e.target.value })} placeholder="SteamID64 (optional)" className="p-3 rounded-lg bg-white/10 border border-white/20 focus:ring-2 focus:ring-cyan-400" />