Implement Review Lifecycle Tracking

This commit is contained in:
gpt-engineer-app[bot]
2025-10-17 20:28:35 +00:00
parent 7dcf8156b9
commit f36ef04a54
4 changed files with 405 additions and 4 deletions

View File

@@ -25,7 +25,9 @@ import {
UserPlus,
UserX,
Ban,
UserCheck
UserCheck,
MessageSquare,
MessageSquareX
} from 'lucide-react';
import { formatDistanceToNow } from 'date-fns';
import {
@@ -38,7 +40,8 @@ import {
ReportResolutionDetails,
ReviewModerationDetails,
PhotoApprovalDetails,
AccountLifecycleDetails
AccountLifecycleDetails,
ReviewLifecycleDetails
} from '@/lib/systemActivityService';
export interface SystemActivityLogRef {
@@ -123,6 +126,18 @@ const activityTypeConfig = {
bgColor: 'bg-green-700/10',
label: 'User Unbanned',
},
review_created: {
icon: MessageSquare,
color: 'text-blue-600',
bgColor: 'bg-blue-600/10',
label: 'Review Created',
},
review_deleted: {
icon: MessageSquareX,
color: 'text-red-600',
bgColor: 'bg-red-600/10',
label: 'Review Deleted',
},
};
export const SystemActivityLog = forwardRef<SystemActivityLogRef, SystemActivityLogProps>(
@@ -480,6 +495,76 @@ export const SystemActivityLog = forwardRef<SystemActivityLogRef, SystemActivity
);
}
case 'review_created': {
const details = activity.details as ReviewLifecycleDetails;
return (
<div className="space-y-2">
<div className="flex items-center gap-2 text-sm flex-wrap">
<Badge className="bg-blue-600/10 text-blue-600">New Review</Badge>
{details.rating && (
<div className="flex items-center gap-1">
<Star className="h-4 w-4 fill-yellow-400 text-yellow-400" />
<span className="font-medium">{details.rating}/5</span>
</div>
)}
{details.entity_name && (
<>
<span className="text-muted-foreground">for</span>
<span className="font-medium">{details.entity_name}</span>
</>
)}
</div>
{isExpanded && details.review_text && (
<div className="p-3 bg-muted rounded text-sm">
<p className="text-muted-foreground line-clamp-3">
"{details.review_text}"
</p>
</div>
)}
</div>
);
}
case 'review_deleted': {
const details = activity.details as ReviewLifecycleDetails;
return (
<div className="space-y-2">
<div className="flex items-center gap-2 text-sm flex-wrap">
<Badge variant="destructive">Review Deleted</Badge>
{details.was_moderated && (
<Badge variant="outline" className="text-orange-600 border-orange-600">
Moderated
</Badge>
)}
{details.rating && (
<div className="flex items-center gap-1">
<Star className="h-4 w-4 text-muted-foreground" />
<span className="text-muted-foreground">{details.rating}/5</span>
</div>
)}
{details.entity_name && (
<span className="text-muted-foreground">from {details.entity_name}</span>
)}
</div>
{isExpanded && details.review_text && (
<div className="p-3 bg-muted rounded text-sm">
<p className="text-muted-foreground line-clamp-3 opacity-60">
"{details.review_text}"
</p>
</div>
)}
{isExpanded && details.deletion_reason && (
<div className="flex items-start gap-2 p-2 bg-red-500/5 rounded text-sm">
<AlertCircle className="h-4 w-4 mt-0.5 flex-shrink-0 text-red-600" />
<span className="text-muted-foreground">
<strong>Reason:</strong> {details.deletion_reason}
</span>
</div>
)}
</div>
);
}
default:
return null;
}