feat: Add millisecond precision to moderation queue timestamps

This commit is contained in:
gpt-engineer-app[bot]
2025-10-13 16:51:06 +00:00
parent 70528ff0b1
commit f5d059b5a5
2 changed files with 44 additions and 32 deletions

View File

@@ -1,5 +1,6 @@
import { useState, useImperativeHandle, forwardRef, useMemo } from 'react'; import { useState, useImperativeHandle, forwardRef, useMemo } from 'react';
import { Card, CardContent } from '@/components/ui/card'; import { Card, CardContent } from '@/components/ui/card';
import { TooltipProvider } from '@/components/ui/tooltip';
import { useToast } from '@/hooks/use-toast'; import { useToast } from '@/hooks/use-toast';
import { useUserRole } from '@/hooks/useUserRole'; import { useUserRole } from '@/hooks/useUserRole';
import { useAuth } from '@/hooks/useAuth'; import { useAuth } from '@/hooks/useAuth';
@@ -156,34 +157,36 @@ export const ModerationQueue = forwardRef<ModerationQueueRef>((props, ref) => {
statusFilter={queueManager.filters.statusFilter} statusFilter={queueManager.filters.statusFilter}
/> />
) : ( ) : (
<div className="space-y-6"> <TooltipProvider>
{queueManager.items.map((item, index) => ( <div className="space-y-6">
<QueueItem {queueManager.items.map((item, index) => (
key={item.id} <QueueItem
item={item} key={item.id}
isMobile={isMobile} item={item}
actionLoading={queueManager.actionLoading} isMobile={isMobile}
isLockedByMe={queueManager.queue.isLockedByMe(item.id)} actionLoading={queueManager.actionLoading}
isLockedByOther={queueManager.queue.isLockedByOther(item.id, item.assigned_to, item.locked_until)} isLockedByMe={queueManager.queue.isLockedByMe(item.id)}
lockStatus={getLockStatus({ assigned_to: item.assigned_to, locked_until: item.locked_until }, user?.id || '')} isLockedByOther={queueManager.queue.isLockedByOther(item.id, item.assigned_to, item.locked_until)}
currentLockSubmissionId={queueManager.queue.currentLock?.submissionId} lockStatus={getLockStatus({ assigned_to: item.assigned_to, locked_until: item.locked_until }, user?.id || '')}
notes={notes} currentLockSubmissionId={queueManager.queue.currentLock?.submissionId}
isAdmin={isAdmin()} notes={notes}
isSuperuser={isSuperuser()} isAdmin={isAdmin()}
queueIsLoading={queueManager.queue.isLoading} isSuperuser={isSuperuser()}
onNoteChange={handleNoteChange} queueIsLoading={queueManager.queue.isLoading}
onApprove={queueManager.performAction} onNoteChange={handleNoteChange}
onResetToPending={queueManager.resetToPending} onApprove={queueManager.performAction}
onRetryFailed={queueManager.retryFailedItems} onResetToPending={queueManager.resetToPending}
onOpenPhotos={handleOpenPhotos} onRetryFailed={queueManager.retryFailedItems}
onOpenReviewManager={handleOpenReviewManager} onOpenPhotos={handleOpenPhotos}
onClaimSubmission={queueManager.queue.claimSubmission} onOpenReviewManager={handleOpenReviewManager}
onDeleteSubmission={queueManager.deleteSubmission} onClaimSubmission={queueManager.queue.claimSubmission}
onInteractionFocus={(id) => queueManager.markInteracting(id, true)} onDeleteSubmission={queueManager.deleteSubmission}
onInteractionBlur={(id) => queueManager.markInteracting(id, false)} onInteractionFocus={(id) => queueManager.markInteracting(id, true)}
/> onInteractionBlur={(id) => queueManager.markInteracting(id, false)}
))} />
</div> ))}
</div>
</TooltipProvider>
)} )}
{/* Pagination */} {/* Pagination */}

View File

@@ -7,6 +7,7 @@ import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar';
import { Textarea } from '@/components/ui/textarea'; import { Textarea } from '@/components/ui/textarea';
import { Label } from '@/components/ui/label'; import { Label } from '@/components/ui/label';
import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert'; import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert';
import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';
import { format } from 'date-fns'; import { format } from 'date-fns';
import { SubmissionItemsList } from './SubmissionItemsList'; import { SubmissionItemsList } from './SubmissionItemsList';
import { MeasurementDisplay } from '@/components/ui/measurement-display'; import { MeasurementDisplay } from '@/components/ui/measurement-display';
@@ -192,10 +193,18 @@ export const QueueItem = memo(({
/> />
)} )}
</div> </div>
<div className={`flex items-center gap-2 text-muted-foreground ${isMobile ? 'text-xs' : 'text-sm'}`}> <Tooltip>
<Calendar className={isMobile ? "w-3 h-3" : "w-4 h-4"} /> <TooltipTrigger asChild>
{format(new Date(item.created_at), isMobile ? 'MMM d, yyyy' : 'MMM d, yyyy HH:mm')} <div className={`flex items-center gap-2 text-muted-foreground ${isMobile ? 'text-xs' : 'text-sm'}`}>
</div> <Calendar className={isMobile ? "w-3 h-3" : "w-4 h-4"} />
{format(new Date(item.created_at), isMobile ? 'MMM d, HH:mm:ss' : 'MMM d, yyyy HH:mm:ss.SSS')}
</div>
</TooltipTrigger>
<TooltipContent>
<p className="text-xs">Full timestamp:</p>
<p className="font-mono">{item.created_at}</p>
</TooltipContent>
</Tooltip>
</div> </div>
{item.user_profile && ( {item.user_profile && (