"use client"; import React, { useState, useEffect } from "react"; import { supabase } from "@/lib/supabase"; interface Interview { id: string; candidate_id: string; job_id: string; interview_date: string; stage: string; feedback: string | null; created_at: string; candidates: { name: string; } | null; jobs: { title: string; } | null; } export default function InterviewsPage() { const [interviews, setInterviews] = useState([]); const [loading, setLoading] = useState(true); const [updatingId, setUpdatingId] = useState(null); const [editStates, setEditStates] = useState< Record >({}); const [actionMessage, setActionMessage] = useState(null); useEffect(() => { let active = true; async function fetchInterviews() { try { const { data, error } = await supabase .from("interviews") .select("*, candidates(name), jobs(title)") .order("interview_date", { ascending: false }); if (error) throw error; if (active) { const typedData = (data as unknown as Interview[]) || []; setInterviews(typedData); // Initialize edit states const initialEditStates: Record = {}; typedData.forEach((item) => { initialEditStates[item.id] = { stage: item.stage, feedback: item.feedback || "", }; }); setEditStates(initialEditStates); setLoading(false); } } catch (err) { console.error("Error fetching interviews:", err); if (active) { setLoading(false); } } } fetchInterviews(); return () => { active = false; }; }, []); const handleStateChange = (id: string, field: "stage" | "feedback", value: string) => { setEditStates((prev) => ({ ...prev, [id]: { ...prev[id], [field]: value, }, })); }; const handleUpdate = async (id: string) => { const editState = editStates[id]; if (!editState) return; try { setUpdatingId(id); setActionMessage(null); const { error } = await supabase .from("interviews") .update({ stage: editState.stage, feedback: editState.feedback, }) .eq("id", id); if (error) throw error; setActionMessage("Interview updated successfully!"); // Hide message after 3 seconds setTimeout(() => setActionMessage(null), 3000); // Refresh interview data locally setInterviews((prev) => prev.map((item) => item.id === id ? { ...item, stage: editState.stage, feedback: editState.feedback } : item ) ); } catch (err: unknown) { console.error("Error updating interview:", err); setActionMessage("Failed to update interview."); } finally { setUpdatingId(null); } }; return (

Interviews

Manage scheduled candidate interview stages and write evaluation feedback.

{actionMessage && (
{actionMessage}
)}
{loading ? (

Loading interviews...

) : interviews.length === 0 ? (

No interviews scheduled. Upload candidate CVs under the Jobs tab to trigger evaluations.

) : (
{interviews.map((interview) => { const currentEdit = editStates[interview.id] || { stage: interview.stage, feedback: interview.feedback || "", }; return (
{/* Header */}

{interview.candidates?.name || "Unknown Candidate"}

Role: {interview.jobs?.title || "Unknown Job"}

Date Scheduled:{" "} {new Date(interview.interview_date).toLocaleString()}

{/* Feedback Area */}