diff --git a/src/routes/_authenticated/calendar.tsx b/src/routes/_authenticated/calendar.tsx new file mode 100644 index 0000000..1809c27 --- /dev/null +++ b/src/routes/_authenticated/calendar.tsx @@ -0,0 +1,109 @@ +import { createFileRoute } from "@tanstack/react-router"; +import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; +import { supabase } from "@/integrations/supabase/client"; +import { useAuth } from "@/hooks/use-auth"; +import { Button } from "@/components/ui/button"; +import { Input } from "@/components/ui/input"; +import { Label } from "@/components/ui/label"; +import { Textarea } from "@/components/ui/textarea"; +import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from "@/components/ui/dialog"; +import { Plus, Trash2, CalendarDays } from "lucide-react"; +import { useState } from "react"; +import { toast } from "sonner"; + +export const Route = createFileRoute("/_authenticated/calendar")({ + head: () => ({ meta: [{ title: "Calendar — School Portal" }] }), + component: CalendarPage, +}); + +function CalendarPage() { + const { user, roles } = useAuth(); + const isAdmin = roles.includes("admin"); + const qc = useQueryClient(); + const [open, setOpen] = useState(false); + const [form, setForm] = useState({ title: "", date: "", end_date: "", description: "" }); + + const { data: events } = useQuery({ + queryKey: ["calendar"], + queryFn: async () => (await supabase.from("calendar_events").select("*").order("date")).data ?? [], + }); + + const add = useMutation({ + mutationFn: async () => { + const { error } = await supabase.from("calendar_events").insert({ + title: form.title, date: form.date, end_date: form.end_date || null, description: form.description || null, created_by: user!.id, + }); + if (error) throw error; + }, + onSuccess: () => { setOpen(false); setForm({ title: "", date: "", end_date: "", description: "" }); qc.invalidateQueries({ queryKey: ["calendar"] }); toast.success("Event added"); }, + onError: (e: Error) => toast.error(e.message), + }); + + const del = useMutation({ + mutationFn: async (id: string) => { const { error } = await supabase.from("calendar_events").delete().eq("id", id); if (error) throw error; }, + onSuccess: () => qc.invalidateQueries({ queryKey: ["calendar"] }), + }); + + const today = new Date().toISOString().slice(0, 10); + const upcoming = (events ?? []).filter((e) => e.date >= today); + const past = (events ?? []).filter((e) => e.date < today); + + return ( +
+
+
+

School calendar

+

Year at a glance.

+
+ {isAdmin && ( + + + + New calendar event +
+
setForm({ ...form, title: e.target.value })} />
+
+
setForm({ ...form, date: e.target.value })} />
+
setForm({ ...form, end_date: e.target.value })} />
+
+