import { useEffect, useState } from 'react'; import { Card, CardContent } from '@/components/ui/card'; import { Input } from '@/components/ui/input'; import { Badge } from '@/components/ui/badge'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { FileText, Search, Clock, CheckCircle, XCircle, AlertCircle, User, ArrowRight, TrendingUp, Eye, Edit, Flame, Target } from 'lucide-react'; import { motion } from 'framer-motion'; import workflowApi from '@/services/workflowApi'; interface MyRequestsProps { onViewRequest: (requestId: string, requestTitle?: string) => void; dynamicRequests?: any[]; } // Removed mock data; list renders API data only const getPriorityConfig = (priority: string) => { switch (priority) { case 'express': return { color: 'bg-red-100 text-red-800 border-red-200', icon: Flame, iconColor: 'text-red-600' }; case 'standard': return { color: 'bg-blue-100 text-blue-800 border-blue-200', icon: Target, iconColor: 'text-blue-600' }; default: return { color: 'bg-gray-100 text-gray-800 border-gray-200', icon: Target, iconColor: 'text-gray-600' }; } }; const getStatusConfig = (status: string) => { switch (status) { case 'approved': return { color: 'bg-green-100 text-green-800 border-green-200', icon: CheckCircle, iconColor: 'text-green-600' }; case 'rejected': return { color: 'bg-red-100 text-red-800 border-red-200', icon: XCircle, iconColor: 'text-red-600' }; case 'pending': return { color: 'bg-yellow-100 text-yellow-800 border-yellow-200', icon: Clock, iconColor: 'text-yellow-600' }; case 'in-review': return { color: 'bg-blue-100 text-blue-800 border-blue-200', icon: Eye, iconColor: 'text-blue-600' }; case 'draft': return { color: 'bg-gray-100 text-gray-800 border-gray-200', icon: Edit, iconColor: 'text-gray-600' }; default: return { color: 'bg-gray-100 text-gray-800 border-gray-200', icon: AlertCircle, iconColor: 'text-gray-600' }; } }; export function MyRequests({ onViewRequest, dynamicRequests = [] }: MyRequestsProps) { const [searchTerm, setSearchTerm] = useState(''); const [statusFilter, setStatusFilter] = useState('all'); const [apiRequests, setApiRequests] = useState([]); const [loading, setLoading] = useState(false); useEffect(() => { let mounted = true; (async () => { try { setLoading(true); const result = await workflowApi.listMyWorkflows({ page: 1, limit: 20 }); const items = Array.isArray(result?.data) ? result.data : Array.isArray(result) ? result : []; if (!mounted) return; setApiRequests(items); } catch (_) { if (!mounted) return; setApiRequests([]); } finally { if (mounted) setLoading(false); } })(); return () => { mounted = false; }; }, []); // Convert API/dynamic requests to the format expected by this component const sourceRequests = (apiRequests.length ? apiRequests : dynamicRequests); const convertedDynamicRequests = sourceRequests.map((req: any) => ({ id: req.requestNumber || req.request_number || req.requestId || req.id || req.request_id, // Use requestNumber as primary identifier requestId: req.requestId || req.id || req.request_id, // Keep requestId for API calls if needed displayId: req.requestNumber || req.request_number || req.id, title: req.title, description: req.description, status: (req.status || '').toString().toLowerCase().replace('in_progress','in-review'), priority: (req.priority || '').toString().toLowerCase(), department: req.department, submittedDate: req.submittedAt || (req.createdAt ? new Date(req.createdAt).toISOString().split('T')[0] : undefined), currentApprover: req.currentApprover?.name || req.currentApprover?.email || '—', approverLevel: req.currentLevel && req.totalLevels ? `${req.currentLevel} of ${req.totalLevels}` : (req.currentStep && req.totalSteps ? `${req.currentStep} of ${req.totalSteps}` : '—'), dueDate: req.dueDate ? new Date(req.dueDate).toISOString().split('T')[0] : undefined, templateType: req.templateType, templateName: req.templateName })); // Use only API/dynamic requests const allRequests = convertedDynamicRequests; const [priorityFilter, setPriorityFilter] = useState('all'); // Filter requests based on search and filters const filteredRequests = allRequests.filter(request => { const matchesSearch = request.title.toLowerCase().includes(searchTerm.toLowerCase()) || request.description.toLowerCase().includes(searchTerm.toLowerCase()) || request.id.toLowerCase().includes(searchTerm.toLowerCase()); const matchesStatus = statusFilter === 'all' || request.status === statusFilter; const matchesPriority = priorityFilter === 'all' || request.priority === priorityFilter; return matchesSearch && matchesStatus && matchesPriority; }); // Stats calculation const stats = { total: allRequests.length, pending: allRequests.filter(r => r.status === 'pending').length, approved: allRequests.filter(r => r.status === 'approved').length, inReview: allRequests.filter(r => r.status === 'in-review').length, rejected: allRequests.filter(r => r.status === 'rejected').length, draft: allRequests.filter(r => r.status === 'draft').length }; return (
{/* Header */}

My Requests

Track and manage all your submitted requests

{/* Stats Overview */}

Total

{stats.total}

In Progress

{stats.pending + stats.inReview}

Approved

{stats.approved}

Rejected

{stats.rejected}

Draft

{stats.draft}

{/* Filters and Search */}
setSearchTerm(e.target.value)} className="pl-9 bg-white border-gray-300 hover:border-gray-400 focus:border-re-green focus:ring-1 focus:ring-re-green" />
{/* Requests List */}
{loading ? ( Loading your requests… ) : filteredRequests.length === 0 ? (

No requests found

{searchTerm || statusFilter !== 'all' || priorityFilter !== 'all' ? 'Try adjusting your search or filters' : 'You haven\'t created any requests yet'}

) : ( filteredRequests.map((request, index) => ( onViewRequest(request.id, request.title, request.status)} >
{/* Header with Title and Status Badges */}

{request.title}

{(() => { const IconComponent = getStatusConfig(request.status).icon; return ; })()} {request.status} {request.priority} {(request as any).templateType && ( Template: {(request as any).templateName} )}

{request.description}

ID: {(request as any).displayId || request.id} Submitted: {request.submittedDate ? new Date(request.submittedDate).toLocaleDateString() : 'N/A'}
{/* Current Approver and Level Info */}
Current: {request.currentApprover}
Level: {request.approverLevel}
Estimated completion:
)) )}
); }