import { useState, useEffect } from "react"; import { Button, Input, Image } from "@nextui-org/react"; import { Formik, Form } from "formik"; import * as Yup from "yup"; import axios from "axios"; import { useNavigate, useParams } from "react-router-dom"; import NextUIFormikInput from "../components/NextUIFormikInput"; import NextUIFormikTextarea from "../components/NextUIFormikTextarea"; import config from "../config"; import { ArrowUTurnLeftIcon } from "../icons"; import EventsPicture from "../components/EventsPicture"; import NextUIFormikSelect from "../components/NextUIFormikSelect"; import instance from "../security/http" // Validation schema const validationSchema = Yup.object({ title: Yup.string() .trim() .min(3, "Title must be at least 3 characters") .max(200, "Title must be at most 200 characters") .matches( /^[a-zA-Z0-9\s]+$/, "Title can only contain letters, numbers, and spaces" ) .required("Title is required"), description: Yup.string() .trim() .min(3, "Description must be at least 3 characters") .max(500, "Description must be at most 500 characters") .matches( /^[a-zA-Z0-9,\s!"'-]*$/, "Only letters, numbers, commas, spaces, exclamation marks, quotations, and common symbols are allowed" ) .required("Description is required"), date: Yup.date() .min(new Date(), "Date must be in the future") .required("Date is required"), time: Yup.string().required("Time is required"), location: Yup.string().required("Location is required"), category: Yup.string() .oneOf(["Events", "Workshops", "Educational Talks"], "Invalid category") .required("Category is required"), evtPicture: Yup.mixed(), // Make this optional if not required }); const EditEventsPage = () => { const [eventData, setEventData] = useState(null); const [townCouncils, setTownCouncils] = useState([]); const { id } = useParams(); // Get event ID from URL const navigate = useNavigate(); const fetchEvent = async () => { try { const res = await axios.get(`${config.serverAddress}/events/${id}`); console.log("Fetched event data:", res.data); // Log the fetched data setEventData(res.data); } catch (error) { console.error("Failed to fetch event:", error); } }; const fetchTownCouncils = async () => { try { const res = await axios.get(`${config.serverAddress}/users/town-councils-metadata`); setTownCouncils(JSON.parse(res.data).townCouncils); } catch (error) { console.error("Failed to fetch town councils:", error); } }; useEffect(() => { fetchEvent(); fetchTownCouncils(); }, []); const initialValues = { title: eventData?.title || "", description: eventData?.description || "", date: eventData?.date ? new Date(eventData.date).toLocaleDateString('en-CA') : "", // Convert date to YYYY-MM-DD format time: eventData?.time || "", location: eventData?.location || "", category: eventData?.category || "", }; const handleSubmit = async ( values: any, { setSubmitting, resetForm, setFieldError }: any ) => { try { const response = await instance.put( `${config.serverAddress}/events/${id}`, values, ); console.log("Server response:", response); // Debug log if (response.status === 200 || response.status === 201) { console.log("Event updated successfully:", response.data); resetForm(); // Clear form after successful submit window.location.href = "/admin/events"; } else { console.error("Error updating event:", response.statusText); } } catch (error: any) { if (error.response && error.response.data && error.response.data.field) { setFieldError(error.response.data.field, error.response.data.error); } else { console.error("Unexpected error:", error); } } finally { setSubmitting(false); } }; return (
{({ isValid, dirty, isSubmitting }) => (
{townCouncils.length > 0 && ( ({ key: townCouncil, label: townCouncil, }))} /> )}
)}
); }; export default EditEventsPage;