'use client';
import React, { useEffect, useState } from 'react';
import { FaBriefcase, FaClock, FaCheckCircle, FaSearch } from 'react-icons/fa';
import { Card } from './shared/Card';
import { StatsCard } from './shared/StatsCard';
interface Case {
id: string;
userId: string;
status: 'new' | 'assigned' | 'in_progress' | 'resolved';
type: string;
description: string;
createdAt: Date;
updatedAt: Date;
transcripts: string[];
}
interface Stats {
totalCases: number;
activeCases: number;
resolvedCases: number;
}
export function AdvocateDashboard() {
const [cases, setCases] = useState<Case[]>([]);
const [stats, setStats] = useState<Stats>({
totalCases: 0,
activeCases: 0,
resolvedCases: 0,
});
const [loading, setLoading] = useState(true);
const [searchTerm, setSearchTerm] = useState('');
useEffect(() => {
fetchDashboardData();
}, []);
const fetchDashboardData = async () => {
try {
const response = await fetch('/api/advocate/dashboard', {
headers: {
Authorization: `Bearer ${localStorage.getItem('token')}`,
},
});
const data = await response.json();
if (data.success) {
setCases(data.data.cases);
setStats(data.data.stats);
}
} catch (error) {
console.error('Error fetching dashboard data:', error);
} finally {
setLoading(false);
}
};
const updateCaseStatus = async (caseId: string, status: 'in_progress' | 'resolved') => {
try {
const response = await fetch(`/api/advocate/cases/${caseId}/status`, {
method: 'PATCH',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${localStorage.getItem('token')}`,
},
body: JSON.stringify({ status }),
});
if (response.ok) {
fetchDashboardData();
}
} catch (error) {
console.error('Error updating case status:', error);
}
};
const filteredCases = cases.filter(
(case_) =>
case_.type.toLowerCase().includes(searchTerm.toLowerCase()) ||
case_.description.toLowerCase().includes(searchTerm.toLowerCase())
);
if (loading) {
return (
<div className="flex h-screen items-center justify-center">
<div className="h-32 w-32 animate-spin rounded-full border-b-2 border-t-2 border-blue-500"></div>
</div>
);
}
return (
<div className="min-h-screen bg-gray-50 p-6">
<div className="mx-auto max-w-7xl">
<div className="mb-8 flex items-center justify-between">
<h1 className="text-3xl font-bold text-gray-900">Advocate Dashboard</h1>
<div className="relative">
<input
type="text"
placeholder="Search cases..."
value={searchTerm}
onChange={(e) => setSearchTerm(e.target.value)}
className="w-64 rounded-lg border border-gray-300 bg-white px-4 py-2 pl-10 focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-200"
/>
<FaSearch className="absolute left-3 top-3 text-gray-400" />
</div>
</div>
<div className="mb-8 grid grid-cols-1 gap-6 md:grid-cols-3">
<StatsCard
title="Total Cases"
value={stats.totalCases}
icon={FaBriefcase}
color="blue"
/>
<StatsCard
title="Active Cases"
value={stats.activeCases}
icon={FaClock}
color="yellow"
trend={{ value: 12, isPositive: true }}
/>
<StatsCard
title="Resolved Cases"
value={stats.resolvedCases}
icon={FaCheckCircle}
color="green"
trend={{ value: 8, isPositive: true }}
/>
</div>
<Card title="Current Cases">
<div className="divide-y divide-gray-100">
{filteredCases.map((case_) => (
<div key={case_.id} className="py-4">
<div className="mb-2 flex items-center justify-between">
<div>
<h3 className="text-lg font-semibold text-gray-900">
{case_.type}
</h3>
<p className="text-sm text-gray-500">
Created: {new Date(case_.createdAt).toLocaleDateString()}
</p>
</div>
<div className="flex gap-2">
{case_.status === 'assigned' && (
<button
onClick={() => updateCaseStatus(case_.id, 'in_progress')}
className="rounded bg-blue-500 px-4 py-2 text-sm font-medium text-white transition-colors hover:bg-blue-600 focus:outline-none focus:ring-2 focus:ring-blue-200"
>
Start Case
</button>
)}
{case_.status === 'in_progress' && (
<button
onClick={() => updateCaseStatus(case_.id, 'resolved')}
className="rounded bg-green-500 px-4 py-2 text-sm font-medium text-white transition-colors hover:bg-green-600 focus:outline-none focus:ring-2 focus:ring-green-200"
>
Mark Resolved
</button>
)}
</div>
</div>
<p className="mb-4 text-gray-700">{case_.description}</p>
{case_.transcripts.length > 0 && (
<div className="mt-4">
<h4 className="mb-2 font-semibold text-gray-900">
Transcripts
</h4>
<div className="space-y-2">
{case_.transcripts.map((transcript, index) => (
<div
key={index}
className="rounded-lg bg-gray-50 p-3 text-sm text-gray-700"
>
{transcript}
</div>
))}
</div>
</div>
)}
</div>
))}
</div>
</Card>
</div>
</div>
);
}