import React, { useState, useMemo } from 'react';
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from './ui/card';
import { Badge } from './ui/badge';
import { Button } from './ui/button';
import { toast } from 'sonner@2.0.3';
import { Progress } from './ui/progress';
import { Avatar, AvatarFallback } from './ui/avatar';
import { Tabs, TabsContent, TabsList, TabsTrigger } from './ui/tabs';
import { CUSTOM_REQUEST_DATABASE } from '../utils/customRequestDatabase';
import {
ArrowLeft,
Clock,
User,
FileText,
MessageSquare,
Users,
CheckCircle,
XCircle,
Download,
Eye,
Flame,
Target,
TrendingUp,
RefreshCw,
Activity,
Mail,
Phone,
Upload,
UserPlus,
Edit3,
ClipboardList
} from 'lucide-react';
interface RequestDetailProps {
requestId: string;
onBack?: () => void;
onOpenModal?: (modal: string) => void;
dynamicRequests?: any[];
}
// Utility functions
const getPriorityConfig = (priority: string) => {
switch (priority) {
case 'express':
case 'urgent':
return {
color: 'bg-red-100 text-red-800 border-red-200',
label: 'urgent priority'
};
case 'standard':
return {
color: 'bg-blue-100 text-blue-800 border-blue-200',
label: 'standard priority'
};
default:
return {
color: 'bg-gray-100 text-gray-800 border-gray-200',
label: 'normal priority'
};
}
};
const getStatusConfig = (status: string) => {
switch (status) {
case 'pending':
return {
color: 'bg-yellow-100 text-yellow-800 border-yellow-200',
label: 'pending'
};
case 'in-review':
return {
color: 'bg-blue-100 text-blue-800 border-blue-200',
label: 'in-review'
};
case 'approved':
return {
color: 'bg-green-100 text-green-800 border-green-200',
label: 'approved'
};
case 'rejected':
return {
color: 'bg-red-100 text-red-800 border-red-200',
label: 'rejected'
};
default:
return {
color: 'bg-gray-100 text-gray-800 border-gray-200',
label: status
};
}
};
const getSLAConfig = (progress: number) => {
if (progress >= 80) {
return {
bg: 'bg-red-50',
color: 'bg-red-500',
textColor: 'text-red-700'
};
} else if (progress >= 60) {
return {
bg: 'bg-orange-50',
color: 'bg-orange-500',
textColor: 'text-orange-700'
};
} else {
return {
bg: 'bg-green-50',
color: 'bg-green-500',
textColor: 'text-green-700'
};
}
};
const getStepIcon = (status: string) => {
switch (status) {
case 'approved':
return
The custom request you're looking for doesn't exist.
Due: {request.slaEndDate} • {request.slaProgress}% elapsed
{request.initiator?.role || 'N/A'}
{request.initiator?.department || 'N/A'}
{request.description}
{request.category}
{request.subcategory}
{request.amount}
{request.createdAt}
{request.updatedAt}
{spectator.name}
{spectator.role}
{step.approver}
TAT: {step.tatHours}h
)} {step.elapsedHours !== undefined && step.elapsedHours > 0 && (Elapsed: {step.elapsedHours}h
)} {step.actualHours !== undefined && (Completed in: {step.actualHours}h
)}{step.comment}
{isCompleted ? 'Approved' : isRejected ? 'Rejected' : 'Actioned'} on {step.timestamp}
)}No workflow steps defined
)}{doc.name}
{doc.size} • Uploaded by {doc.uploadedBy} on {doc.uploadedAt}
No documents uploaded yet
)}{entry.action}
{entry.details}
by {entry.user}
No activity recorded yet
Actions and updates will appear here