mirror of
https://github.com/pacnpal/thrilltrack-explorer.git
synced 2025-12-20 17:51:12 -05:00
108 lines
2.9 KiB
TypeScript
108 lines
2.9 KiB
TypeScript
import { Lock, Clock, Unlock } from 'lucide-react';
|
|
import { Button } from '@/components/ui/button';
|
|
import { Card, CardContent } from '@/components/ui/card';
|
|
import { Progress } from '@/components/ui/progress';
|
|
|
|
interface LockState {
|
|
submissionId: string;
|
|
expiresAt: Date;
|
|
}
|
|
|
|
interface QueueStats {
|
|
pendingCount: number;
|
|
assignedToMe: number;
|
|
avgWaitHours: number;
|
|
}
|
|
|
|
interface LockStatusDisplayProps {
|
|
currentLock: LockState | null;
|
|
queueStats: QueueStats | null;
|
|
isLoading: boolean;
|
|
onExtendLock: (submissionId: string) => Promise<boolean>;
|
|
onReleaseLock: (submissionId: string) => Promise<boolean>;
|
|
getTimeRemaining: () => number | null;
|
|
getLockProgress: () => number;
|
|
}
|
|
|
|
/**
|
|
* LockStatusDisplay Component
|
|
*
|
|
* Displays lock timer, progress bar, and lock management controls.
|
|
* Shows "Claim Next" button when no lock is active, or lock controls when locked.
|
|
*/
|
|
export const LockStatusDisplay = ({
|
|
currentLock,
|
|
queueStats,
|
|
isLoading,
|
|
onExtendLock,
|
|
onReleaseLock,
|
|
getTimeRemaining,
|
|
getLockProgress,
|
|
}: LockStatusDisplayProps) => {
|
|
// Format milliseconds as MM:SS
|
|
const formatLockTimer = (ms: number): string => {
|
|
const minutes = Math.floor(ms / 60000);
|
|
const seconds = Math.floor((ms % 60000) / 1000);
|
|
return `${minutes}:${seconds.toString().padStart(2, '0')}`;
|
|
};
|
|
|
|
const timeRemaining = getTimeRemaining();
|
|
const showExtendButton = timeRemaining !== null && timeRemaining < 5 * 60 * 1000;
|
|
|
|
// If no active lock, show simple info message
|
|
if (!currentLock) {
|
|
return (
|
|
<div className="flex flex-col gap-2 min-w-[200px]">
|
|
<div className="text-sm text-muted-foreground">
|
|
No submission currently claimed. Claim a submission below to start reviewing.
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
// Active lock - show timer and controls
|
|
return (
|
|
<div className="flex flex-col gap-2 min-w-[200px]">
|
|
{/* Lock Timer */}
|
|
<div className="flex items-center gap-2 text-sm">
|
|
<Lock className="w-4 h-4 text-amber-500" />
|
|
<span className="font-medium">
|
|
Lock: {formatLockTimer(timeRemaining || 0)}
|
|
</span>
|
|
</div>
|
|
|
|
{/* Progress Bar */}
|
|
<Progress
|
|
value={getLockProgress()}
|
|
className="h-2"
|
|
/>
|
|
|
|
{/* Extend Lock Button (show when < 5 min left) */}
|
|
{showExtendButton && (
|
|
<Button
|
|
size="sm"
|
|
variant="outline"
|
|
onClick={() => onExtendLock(currentLock.submissionId)}
|
|
disabled={isLoading}
|
|
className="w-full"
|
|
>
|
|
<Clock className="w-4 h-4 mr-2" />
|
|
Extend Lock
|
|
</Button>
|
|
)}
|
|
|
|
{/* Release Lock Button */}
|
|
<Button
|
|
size="sm"
|
|
variant="outline"
|
|
onClick={() => onReleaseLock(currentLock.submissionId)}
|
|
disabled={isLoading}
|
|
className="w-full"
|
|
>
|
|
<Unlock className="w-4 h-4 mr-2" />
|
|
Release Lock
|
|
</Button>
|
|
</div>
|
|
);
|
|
};
|