69 lines
2.0 KiB
TypeScript
69 lines
2.0 KiB
TypeScript
'use client';
|
|
|
|
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
|
|
import { ScrollArea } from '@/components/ui/scroll-area';
|
|
import type { ActivityLogEntry } from '@/lib/game/types';
|
|
|
|
interface ActivityLogProps {
|
|
activityLog?: ActivityLogEntry[];
|
|
}
|
|
|
|
export function ActivityLog({ activityLog }: ActivityLogProps) {
|
|
const entries = activityLog || [];
|
|
|
|
return (
|
|
<Card className="bg-gray-900/80 border-gray-700">
|
|
<CardHeader className="pb-2">
|
|
<CardTitle className="text-amber-400 game-panel-title text-xs">Activity Log</CardTitle>
|
|
</CardHeader>
|
|
<CardContent>
|
|
<ScrollArea className="h-48">
|
|
<div className="space-y-1">
|
|
{entries.slice(0, 50).map((entry, i) => {
|
|
const isLatest = i === 0;
|
|
const color = getEventStyle(entry.eventType);
|
|
return (
|
|
<div
|
|
key={entry.id}
|
|
className={`text-xs ${isLatest ? 'text-gray-200 font-semibold' : color}`}
|
|
>
|
|
{entry.message}
|
|
</div>
|
|
);
|
|
})}
|
|
{entries.length === 0 && (
|
|
<div className="text-xs text-gray-500 italic">No activity yet...</div>
|
|
)}
|
|
</div>
|
|
</ScrollArea>
|
|
</CardContent>
|
|
</Card>
|
|
);
|
|
}
|
|
|
|
function getEventStyle(eventType: string): string {
|
|
switch (eventType) {
|
|
case 'enemy_defeated':
|
|
case 'floor_cleared':
|
|
return 'text-green-400';
|
|
case 'damage_dealt':
|
|
return 'text-red-400';
|
|
case 'dodge':
|
|
return 'text-yellow-400';
|
|
case 'armor_proc':
|
|
return 'text-blue-400';
|
|
case 'special_effect':
|
|
return 'text-purple-400';
|
|
case 'floor_transition':
|
|
return 'text-cyan-400';
|
|
case 'spell_cast':
|
|
return 'text-amber-400';
|
|
case 'golem_attack':
|
|
return 'text-orange-400';
|
|
case 'puzzle_solved':
|
|
return 'text-pink-400';
|
|
default:
|
|
return 'text-gray-300';
|
|
}
|
|
}
|