"use client"; import { useState, useEffect, useRef } from "react"; import { createPortal } from "react-dom"; import Badge from "@/components/ui/Badge"; import { useTranslation } from "@/lib/i18n"; export default function ProjectStatusDropdown({ project, size = "md", showDropdown = true, }) { const { t } = useTranslation(); const [status, setStatus] = useState(project.project_status); const [loading, setLoading] = useState(false); const [isOpen, setIsOpen] = useState(false); const [dropdownPosition, setDropdownPosition] = useState({ top: 0, left: 0, width: 0, }); const buttonRef = useRef(null); const statusConfig = { registered: { label: t("projectStatus.registered"), variant: "secondary", }, in_progress_design: { label: t("projectStatus.in_progress_design"), variant: "primary", }, in_progress_construction: { label: t("projectStatus.in_progress_construction"), variant: "primary", }, fulfilled: { label: t("projectStatus.fulfilled"), variant: "success", }, cancelled: { label: t("projectStatus.cancelled"), variant: "danger", }, }; const handleChange = async (newStatus) => { if (newStatus === status) { setIsOpen(false); return; } setStatus(newStatus); setLoading(true); setIsOpen(false); try { const updateData = { ...project, project_status: newStatus }; const response = await fetch(`/api/projects/${project.project_id}`, { method: "PUT", headers: { "Content-Type": "application/json" }, body: JSON.stringify(updateData), }); if (!response.ok) { const errorData = await response.json(); console.error('Update failed:', errorData); } window.location.reload(); } catch (error) { console.error("Failed to update status:", error); setStatus(project.project_status); // Revert on error } finally { setLoading(false); } }; const updateDropdownPosition = () => { if (buttonRef.current) { const rect = buttonRef.current.getBoundingClientRect(); setDropdownPosition({ top: rect.bottom + window.scrollY + 4, left: rect.left + window.scrollX, width: rect.width, }); } }; const handleOpen = () => { setIsOpen(true); }; useEffect(() => { if (isOpen) { const handleResize = () => updateDropdownPosition(); const handleScroll = () => updateDropdownPosition(); window.addEventListener("resize", handleResize); window.addEventListener("scroll", handleScroll, true); return () => { window.removeEventListener("resize", handleResize); window.removeEventListener("scroll", handleScroll, true); }; } }, [isOpen]); const currentConfig = statusConfig[status] || { label: "Unknown", variant: "default", }; if (!showDropdown) { return ( {currentConfig.label} ); } return (
{" "} {/* Status Options Dropdown */} {isOpen && (
{Object.entries(statusConfig).map(([statusKey, config]) => ( ))}
)}{" "} {/* Backdrop */} {isOpen && (
{ setIsOpen(false); }} /> )}
); }