"use client" import { useMemo, useState } from "react" import Image from "next/image" import { Menu, Plus, Loader2 } from "lucide-react" import { useAuth } from "@/lib/auth-context" import { useRooms, useEvents } from "@/lib/hooks" import { AuthScreen } from "@/components/auth-screen" import { Sidebar } from "@/components/sidebar" import { WeekView } from "@/components/week-view" import { CreateEventDialog } from "@/components/create-event-dialog" import { EventDetailDialog } from "@/components/event-detail-dialog" import { CreateRoomDialog, JoinRoomDialog } from "@/components/room-dialogs" import { RoomSettingsDialog } from "@/components/room-settings-dialog" import { getRoomBackground } from "@/lib/room-theme" import { addDays, startOfWeek, toDateParam, formatMonthYear } from "@/lib/date-utils" import type { CalendarEvent, User } from "@/lib/types" type DialogState = | { type: "none" } | { type: "create-event" } | { type: "event-detail"; event: CalendarEvent } | { type: "create-room" } | { type: "join-room" } | { type: "room-settings" } export default function Home() { const { user, loading, logout } = useAuth() if (loading) { return (
) } if (!user) { return } return } function CalendarApp({ user, onLogout }: { user: User; onLogout: () => void }) { const [activeRoomId, setActiveRoomId] = useState(null) const [selectedDate, setSelectedDate] = useState(() => new Date()) const [sidebarOpen, setSidebarOpen] = useState(false) const [dialog, setDialog] = useState({ type: "none" }) const { rooms, mutate: mutateRooms } = useRooms() const weekStart = useMemo(() => startOfWeek(selectedDate), [selectedDate]) const weekEnd = useMemo(() => addDays(weekStart, 7), [weekStart]) const from = useMemo(() => toDateParam(weekStart), [weekStart]) const to = useMemo(() => toDateParam(weekEnd), [weekEnd]) const { events, isLoading: eventsLoading, mutate: mutateEvents, } = useEvents(activeRoomId, from, to) const activeRoom = rooms.find((r) => r.id === activeRoomId) const background = getRoomBackground(activeRoomId) const refreshAll = () => { mutateEvents() mutateRooms() } return (
{/* Mobile sidebar backdrop */} {sidebarOpen && (
setSidebarOpen(false)} /> )}
{ setActiveRoomId(id) setSidebarOpen(false) }} selectedDate={selectedDate} onSelectDate={setSelectedDate} onCreateEvent={() => setDialog({ type: "create-event" })} onCreateRoom={() => setDialog({ type: "create-room" })} onJoinRoom={() => setDialog({ type: "join-room" })} user={user} onLogout={onLogout} />

{activeRoom ? activeRoom.name : "All Rooms"}

{formatMonthYear(weekStart)}

{activeRoom && ( )}
{eventsLoading ? (
) : ( setDialog({ type: "event-detail", event })} /> )}
{dialog.type === "create-event" && ( setDialog({ type: "none" })} onCreated={() => { setDialog({ type: "none" }) refreshAll() }} /> )} {dialog.type === "event-detail" && ( r.id === dialog.event.room_id)} currentUserId={user.id} onClose={() => setDialog({ type: "none" })} onChanged={refreshAll} /> )} {dialog.type === "create-room" && ( setDialog({ type: "none" })} onCreated={(roomId: number) => { setDialog({ type: "none" }) mutateRooms() setActiveRoomId(roomId) }} /> )} {dialog.type === "join-room" && ( setDialog({ type: "none" })} onJoined={(roomId: number) => { setDialog({ type: "none" }) mutateRooms() setActiveRoomId(roomId) }} /> )} {dialog.type === "room-settings" && activeRoom && ( setDialog({ type: "none" })} onChanged={mutateRooms} onLeftOrDeleted={() => { setDialog({ type: "none" }) setActiveRoomId(null) mutateRooms() }} /> )}
) }