Guest User

CombatTracker.tsx

a guest
Mar 8th, 2026
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ``
  2. "use client";
  3.  
  4. import { UseEncounterStore } from "@/lib/store";
  5. import { EntityTrackerView } from "./EntityTrackerView";
  6. import useStore from "@/lib/useStore";
  7.  
  8. export function CombatTracker() {
  9.   const encounter = useStore(
  10.     UseEncounterStore,
  11.     (state) => state.current_encounter,
  12.   );
  13.  
  14.   const gridLayout =
  15.     "grid grid-cols-[80px_1fr_100px_80px] gap-4 items-center px-4";
  16.  
  17.   const sortedCombatants = (encounter?.entities || [])
  18.     .flatMap((entity) =>
  19.       entity.instances.map((instance) => ({
  20.         ...instance,
  21.         statblock: entity.statblock,
  22.       })),
  23.     )
  24.     .sort((a, b) => b.initiative - a.initiative);
  25.  
  26.  
  27.   return (
  28.     <div className="w-full bg-slate-800/50 ...">
  29.       {!encounter ? (
  30.         <div className="p-8 text-slate-500 text-center">Loading...</div>
  31.       ) : (
  32.         <>
  33.           <div
  34.             className={`w-full ${gridLayout} py-3 border-b border-slate-700 bg-slate-900/50`}
  35.           >
  36.             <div className="text-amber-500 uppercase tracking-wider font-bold text-sm">
  37.               Init
  38.             </div>
  39.             <div className="text-amber-500 uppercase tracking-wider font-bold text-sm">
  40.               Name
  41.             </div>
  42.             <div className="text-amber-500 uppercase tracking-wider font-bold text-sm text-center">
  43.               HP
  44.             </div>
  45.             <div className="text-amber-500 uppercase tracking-wider font-bold text-sm text-center">
  46.               AC
  47.             </div>
  48.           </div>
  49.  
  50.           <div className="divide-y divide-slate-800">
  51.             {sortedCombatants.length > 0 ? (
  52.               sortedCombatants.map((entity) => (
  53.                 <EntityTrackerView key={entity.instance_id} {...entity} />
  54.               ))
  55.             ) : (
  56.               <div className="p-8 text-center text-slate-500 italic">
  57.                 No monsters in encounter. Add some from the sidebar!
  58.               </div>
  59.             )}
  60.           </div>
  61.         </>
  62.       )}
  63.     </div>
  64.   );
  65. }
  66. ```
Advertisement
Add Comment
Please, Sign In to add comment