"use client"; import { useState, useEffect } from "react"; import { useSession } from "next-auth/react"; import { useRouter } from "next/navigation"; interface SaveJobButtonProps { jobId: string; initialIsSaved?: boolean; className?: string; variant?: "icon" | "button" | "small"; onSavedChange?: (isSaved: boolean) => void; } export function SaveJobButton({ jobId, initialIsSaved, className = "", variant = "button", onSavedChange, }: SaveJobButtonProps) { const { data: session } = useSession(); const router = useRouter(); const [isSaved, setIsSaved] = useState(initialIsSaved ?? false); const [loading, setLoading] = useState(false); useEffect(() => { if (initialIsSaved === undefined && session?.user) { // Fetch initial save state if not provided explicitly fetch(`/api/saved-jobs/${jobId}`) .then((res) => res.json()) .then((data) => { if (data && typeof data.isSaved === "boolean") { setIsSaved(data.isSaved); } }) .catch(() => {}); } }, [jobId, session, initialIsSaved]); const toggleSave = async (e: React.MouseEvent) => { e.preventDefault(); e.stopPropagation(); if (!session?.user) { router.push("/login"); return; } setLoading(true); try { if (isSaved) { // Unsave job const res = await fetch(`/api/saved-jobs/${jobId}`, { method: "DELETE", }); if (res.ok) { setIsSaved(false); if (onSavedChange) onSavedChange(false); } } else { // Save job const res = await fetch("/api/saved-jobs", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ jobId }), }); if (res.ok) { setIsSaved(true); if (onSavedChange) onSavedChange(true); } } } catch (err) { console.error("Failed to toggle save status:", err); } finally { setLoading(false); } }; if (variant === "icon") { return ( ); } if (variant === "small") { return ( ); } return ( ); }