"use client"; import { ApiResponse } from "@/types/types"; import request from "@/lib/request"; import "@schedule-x/theme-shadcn/dist/index.css"; import { useNextCalendarApp, ScheduleXCalendar } from "@schedule-x/react"; import { createEventsServicePlugin } from "@schedule-x/events-service"; import { createDragAndDropPlugin } from "@schedule-x/drag-and-drop"; import { createResizePlugin } from "@schedule-x/resize"; import { createEventRecurrencePlugin } from "@schedule-x/event-recurrence"; import { CalendarEventExternal, createViewDay, createViewWeek, } from "@schedule-x/calendar"; import { useEffect, useState } from "react"; import { format } from "date-fns"; import { Dialog, DialogProps } from "@radix-ui/react-dialog"; import { DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Label } from "@/components/ui/label"; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; import { KeyedMutator } from "swr"; import { getCookie } from "cookies-next"; import { useTheme } from "next-themes"; import { Checkbox } from "@/components/ui/checkbox"; import { eventNames } from "process"; import { useSearchParams } from "next/navigation"; import { CheckedState } from "@radix-ui/react-checkbox"; import { DateTimePicker } from "./date-time-picker"; interface CalendarEventExternalDB extends CalendarEventExternal { status: "Active" | "Inactive"; } const Planning: React.FC<{ events: CalendarEventExternal[]; mutate?: KeyedMutator>; }> = ({ events, mutate }) => { const { resolvedTheme } = useTheme(); console.log(resolvedTheme); const isConnected = getCookie("auth_token"); const plugins = isConnected ? [ createEventsServicePlugin(), createDragAndDropPlugin(), createResizePlugin(), createEventRecurrencePlugin(), ] : []; const [eventSelected, setEventSelected] = useState(null); const [eventStatus, setEventStatus] = useState<"Active" | "Inactive">( "Active", ); const [newEvent, setNewEvent] = useState | null>(null); const handleEventUpdate = async (eventSelected: CalendarEventExternal) => { const event: CalendarEventExternal = { ...eventSelected, start: `${new Date(eventSelected.start).toISOString()}`, end: `${new Date(eventSelected.end).toISOString()}`, }; try { const res = await request(`/events/${event.id}/update`, { method: "PATCH", body: event, requiresAuth: true, csrfToken: false, }); if (res.status === "Error") { // calendar?.events?.update(oldEvent); } } catch (e) { console.log(e); } }; const calendar = useNextCalendarApp( { theme: "shadcn", views: [createViewDay(), createViewWeek()], defaultView: "week", isDark: resolvedTheme === "dark" ? true : false, isResponsive: true, locale: "fr-FR", dayBoundaries: { start: "06:00", end: "00:00", }, events: events.map((event) => ({ ...event, start: format(new Date(event.start), "yyyy-MM-dd HH:mm"), end: format(new Date(event.end), "yyyy-MM-dd HH:mm"), })), callbacks: { onEventClick(event, e) { setEventSelected(event); }, // async onBeforeEventUpdate(oldEvent, newEvent) { // await request("/api/me/has-permissions") // }, async onEventUpdate(newEvent) { // console.log(event); await handleEventUpdate(newEvent); }, }, }, plugins, ); useEffect(() => { calendar?.events.getAll(); }, []); useEffect(() => { calendar?.setTheme(resolvedTheme === "dark" ? "dark" : "light"); }, [resolvedTheme]); const AddButton: React.FC = () => ( ); return (
{newEvent && ( { setNewEvent((e) => (open ? e : null)); }} event={newEvent} //onStartChange={(e) => { // const val = e.currentTarget.value; // setNewEvent((ev) => { // if (ev) // return { // ...ev, // start: val, // }; // return ev; // }); //}} onStartDateChange={(date) => { setNewEvent((ev) => { if (ev) return { ...ev, start: date, }; return ev; }); }} onEndDateChange={(date) => { setNewEvent((ev) => { if (ev) return { ...ev, end: date, }; return ev; }); }} onTitleChange={(e) => { const val = e.currentTarget.value; setNewEvent((ev) => { if (ev) return { ...ev, title: val, }; return ev; }); }} onActiveStateChange={(e) => { e ? setEventStatus("Active") : setEventStatus("Inactive"); }} //onEndChange={(e) => { // const val = e.currentTarget.value; // setNewEvent((ev) => { // if (ev) // return { // ...ev, // end: val, // }; // return ev; // }); //}} onAdd={async () => { try { const event: Omit = { ...newEvent, start: `${new Date(newEvent.start).toISOString()}`, end: `${new Date(newEvent.end).toISOString()}`, title: newEvent.title, status: eventStatus, }; const res = await request( `/events/new`, { method: "POST", body: event, requiresAuth: true, csrfToken: false, }, ); if (res.status === "Error") { console.log("Error"); } if (res.status === "Success") { mutate?.(); console.log("Success"); } } catch (e) { console.log(e); } }} /> )} {eventSelected && ( { setEventSelected((e) => (open ? e : null)); }} event={eventSelected} onStartDateChange={(date) => { setEventSelected((ev) => { if (ev && date) return { ...ev, start: format(date, "YYYY-MM-DD HH:MM"), }; return ev; }); }} onEndDateChange={(date) => { setEventSelected((ev) => { if (ev && date) return { ...ev, end: format(date, "YYYY-MM-DD HH:MM"), }; return ev; }); }} onDelete={async () => { calendar?.events?.remove(eventSelected.id); try { const res = await request( `/events/${eventSelected.id}/delete`, { method: "DELETE", body: eventSelected, requiresAuth: false, csrfToken: false, }, ); if (res.status === "Error") { console.log("Error"); } if (res.status === "Success") { console.log("Success"); } } catch (e) { console.log(e); } setEventSelected(null); }} onUpdate={async () => { await handleEventUpdate(eventSelected); setEventSelected(null); }} /> )}
); }; const EventDialog: React.FC< { // onEndChange: React.ChangeEventHandler; // onStartChange: React.ChangeEventHandler; onStartDateChange: (selectedDate: Date | undefined) => void; onEndDateChange: (selectedDate: Date | undefined) => void; onDelete?: () => void; onUpdate?: () => void; onAdd?: () => void; onTitleChange?: React.ChangeEventHandler; onActiveStateChange?: (status: boolean) => void; event: CalendarEventExternal | Omit; } & DialogProps > = ({ open, onOpenChange, // onEndChange, // onStartChange, onStartDateChange, onEndDateChange, onDelete, onUpdate, onAdd, onTitleChange, onActiveStateChange, event, }) => { const [checked, setChecked] = useState( event.status === "Active", ); return ( {event.title} {event.description}
onStartDateChange(date) } />
{/* */} onEndDateChange(date)} />
{ const booleanCheck = !!e; setChecked((prev) => { return !prev; }); if (onActiveStateChange) { onActiveStateChange(booleanCheck); } }} />
{onUpdate && ( )} {onDelete && ( )} {onAdd && !onUpdate && !onDelete && ( )}
); }; export default Planning;