import { useState, useEffect } from "react"; import { Link } from "wouter"; import Layout from "@/components/Layout"; import SEO from "@/components/SEO"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Input } from "@/components/ui/input"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Calendar, Video, Phone, MapPin, ArrowLeft, Clock, Loader2, MessageSquare, CheckCircle2, XCircle, AlertCircle, } from "lucide-react"; import { useAuth } from "@/hooks/useAuth"; import { aethexToast } from "@/components/ui/aethex-toast"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; interface Interview { id: string; scheduled_at: string; duration_minutes: number; meeting_link: string | null; meeting_type: string; status: string; notes: string | null; candidate_feedback: string | null; employer: { full_name: string; avatar_url: string | null; email: string; } | null; } interface GroupedInterviews { upcoming: Interview[]; past: Interview[]; cancelled: Interview[]; } export default function CandidateInterviews() { const { session } = useAuth(); const [loading, setLoading] = useState(true); const [interviews, setInterviews] = useState([]); const [grouped, setGrouped] = useState({ upcoming: [], past: [], cancelled: [], }); const [filter, setFilter] = useState("all"); useEffect(() => { if (session?.access_token) { fetchInterviews(); } }, [session?.access_token]); const fetchInterviews = async () => { try { const response = await fetch("/api/candidate/interviews", { headers: { Authorization: `Bearer ${session?.access_token}` }, }); if (response.ok) { const data = await response.json(); setInterviews(data.interviews || []); setGrouped(data.grouped || { upcoming: [], past: [], cancelled: [] }); } } catch (error) { console.error("Error fetching interviews:", error); aethexToast.error("Failed to load interviews"); } finally { setLoading(false); } }; const formatDate = (date: string) => { return new Date(date).toLocaleDateString("en-US", { weekday: "long", month: "long", day: "numeric", year: "numeric", }); }; const formatTime = (date: string) => { return new Date(date).toLocaleTimeString("en-US", { hour: "2-digit", minute: "2-digit", }); }; const getInitials = (name: string) => { return name .split(" ") .map((n) => n[0]) .join("") .toUpperCase(); }; const getMeetingIcon = (type: string) => { switch (type) { case "video": return