Adjusted log
This commit is contained in:
27
Log.tsx
27
Log.tsx
@@ -1,7 +1,7 @@
|
|||||||
import React, { useMemo } from 'react';
|
import React, { useMemo } from 'react';
|
||||||
import { Medal, CheckCircle2, History } from 'lucide-react';
|
import { Medal, CheckCircle2, History } from 'lucide-react';
|
||||||
import { useCTF } from './CTFContext';
|
import { useCTF } from './CTFContext';
|
||||||
import { calculateChallengeValue, getFirstBloodBonusFactor } from './services/scoring';
|
import { calculateChallengeValue, getFirstBloodBonusFactor, calculateTeamTotalScore } from './services/scoring';
|
||||||
|
|
||||||
export const Log: React.FC = () => {
|
export const Log: React.FC = () => {
|
||||||
const { state } = useCTF();
|
const { state } = useCTF();
|
||||||
@@ -10,12 +10,35 @@ export const Log: React.FC = () => {
|
|||||||
return [...state.solves].sort((a, b) => b.timestamp - a.timestamp);
|
return [...state.solves].sort((a, b) => b.timestamp - a.timestamp);
|
||||||
}, [state.solves]);
|
}, [state.solves]);
|
||||||
|
|
||||||
|
const topTeams = useMemo(() => {
|
||||||
|
return state.teams
|
||||||
|
.filter(t => !t.isAdmin && !t.isDisabled)
|
||||||
|
.map(team => ({ ...team, score: calculateTeamTotalScore(team.id, state.challenges, state.solves) }))
|
||||||
|
.sort((a, b) => b.score - a.score)
|
||||||
|
.slice(0, 3);
|
||||||
|
}, [state]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="w-full px-6 py-12 max-w-5xl mx-auto">
|
<div className="w-full px-6 py-12 max-w-5xl mx-auto">
|
||||||
<div className="flex items-center gap-4 mb-8">
|
<div className="flex flex-col md:flex-row md:items-end justify-between gap-6 mb-8 border-b-4 border-[#333] pb-6">
|
||||||
|
<div className="flex items-center gap-4">
|
||||||
<History size={32} className="text-[#bf00ff]" />
|
<History size={32} className="text-[#bf00ff]" />
|
||||||
<h2 className="text-4xl font-black italic text-white uppercase tracking-tighter">Event Log</h2>
|
<h2 className="text-4xl font-black italic text-white uppercase tracking-tighter">Event Log</h2>
|
||||||
</div>
|
</div>
|
||||||
|
{topTeams.length > 0 && (
|
||||||
|
<div className="flex items-center gap-6 text-sm font-black italic uppercase">
|
||||||
|
{topTeams.map((team, idx) => (
|
||||||
|
<div key={team.id} className="flex items-center gap-2">
|
||||||
|
<span className={`w-5 h-5 flex items-center justify-center text-black not-italic ${idx === 0 ? 'bg-[#ffaa00]' : idx === 1 ? 'bg-slate-400' : 'bg-[#cd7f32]'}`}>
|
||||||
|
{idx + 1}
|
||||||
|
</span>
|
||||||
|
<span className="text-white">{team.name}</span>
|
||||||
|
<span className="text-[#bf00ff]">{team.score} PTS</span>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
<div className="flex flex-col gap-2">
|
<div className="flex flex-col gap-2">
|
||||||
{sortedSolves.length === 0 ? (
|
{sortedSolves.length === 0 ? (
|
||||||
<div className="p-8 hxp-border border-[#333] text-center text-slate-500 font-bold uppercase tracking-widest bg-white/5">
|
<div className="p-8 hxp-border border-[#333] text-center text-slate-500 font-bold uppercase tracking-widest bg-white/5">
|
||||||
|
|||||||
Reference in New Issue
Block a user