import { useState, useEffect } from "react"; import "../../../Styles/components/attendance/AttendanceModal.css"; // Import the CSS file for styling import { motion } from "framer-motion"; import Swal from "sweetalert2"; import { confirmHoldToDelete } from "../utils/confirmHoldToDelete"; import BASE_URL from "@backend/server/config"; import ModernButton from "../ui/ModernButton"; const AttendanceModal = ({ data, onClose, refreshData }) => { const [formData, setFormData] = useState({ attendance_id: "", employee_id: "", attendance_date: "", employee_name: "", time_in_morning: "", time_out_morning: "", time_in_afternoon: "", time_out_afternoon: "", }); const [employees, setEmployees] = useState([]); useEffect(() => { // Fetch employees when the modal is opened const fetchEmployees = async () => { try { const response = await fetch( `${BASE_URL}/api/employeesSide/employees` ); const data = await response.json(); // Log fetched employees setEmployees(data); } catch (error) { console.error("Error fetching employees:", error); } }; fetchEmployees(); if (data) { setFormData(data); } }, [data]); const handleChange = (e) => { const { name, value } = e.target; setFormData({ ...formData, [name]: value }); // Fetch employee name when employee_id changes if (name === "employee_id") { const selectedEmployee = employees.find( (emp) => emp.employee_id === value ); if (selectedEmployee) { setFormData((prev) => ({ ...prev, employee_name: `${selectedEmployee.first_name} ${ selectedEmployee.middle_name || "" } ${selectedEmployee.last_name}`, })); // Log selected employee } else { setFormData((prev) => ({ ...prev, employee_name: "" })); } } }; const handleSubmit = async (e) => { e.preventDefault(); try { const method = data ? "PUT" : "POST"; const url = data ? `${BASE_URL}/api/attendance/update_attendance?id=${formData.attendance_id}` : `${BASE_URL}/api/attendance/create_attendance`; const response = await fetch(url, { method, headers: { "Content-Type": "application/json" }, body: JSON.stringify(formData), }); if (!response.ok) { const errorText = await response.text(); console.error("Server error:", errorText); throw new Error("Network response was not ok"); } const resData = await response.json(); if (resData.success) { Swal.fire({ icon: "success", title: "Success!", text: "Attendance record saved successfully.", confirmButtonColor: "#3085d6", }); // ✅ FIX: Ensure refreshData exists before calling it if (typeof refreshData === "function") { refreshData(); } else { console.warn("refreshData is not defined."); } } else { Swal.fire({ icon: "error", title: "Oops!", text: resData.message || "Failed to save the record.", confirmButtonColor: "#d33", }); } } catch (error) { Swal.fire({ icon: "error", title: "Error!", text: "Error saving record: " + error.message, confirmButtonColor: "#d33", }); } }; const handleDelete = async () => { const result = await confirmHoldToDelete({ title: "Are you sure?", text: "You won't be able to revert this!", }); if (result.isConfirmed) { try { const response = await fetch( `${BASE_URL}/api/attendance/delete_attendance?id=${formData.attendance_id}`, { method: "DELETE", } ); const resData = await response.json(); // Log the response data for debugging if (resData.success) { Swal.fire({ icon: "success", title: "Deleted!", text: "Attendance record deleted successfully.", }); if (typeof refreshData === "function") { refreshData(); // Ensure it exists before calling } else { console.error("refreshData is not a function"); } } else { Swal.fire({ icon: "error", title: "Oops!", text: resData.message || "Failed to delete the record.", }); } } catch (error) { Swal.fire({ icon: "error", title: "Error!", text: "Error deleting record: " + error.message, }); } } }); }; const modalVariants = { hidden: { opacity: 0, y: 50 }, // Start slightly lower and invisible visible: { opacity: 1, y: 0, transition: { duration: 0.3, ease: "easeOut" } }, // Fade in and slide up exit: { opacity: 0, y: 50, transition: { duration: 0.2, ease: "easeIn" } }, // Fade out and slide down }; const overlayVariants = { hidden: { opacity: 0 }, visible: { opacity: 1, transition: { duration: 0.3 } }, exit: { opacity: 0, transition: { duration: 0.2 } }, }; return (

{data ? "Edit" : "Add"} Attendance

{/* Morning Time In-Out */}

Morning

{/* Afternoon Time In-Out */}

Afternoon

Cancel {data && ( Delete these records )} {data ? "Apply changes" : "Save new attendance"}
); }; export default AttendanceModal;