"use client"
import { useMemo, useState } from "react"
import { Menu, Plus, Loader2 } from "lucide-react"
import { useAuth } from "@/lib/auth-context"
import { useRooms, useEvents, useMyResponses } 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 { AccountSettingsDialog } from "@/components/account-settings-dialog"
import { RoomBackground } from "@/components/room-background"
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: "edit-event"; event: CalendarEvent }
| { type: "event-detail"; event: CalendarEvent }
| { type: "create-room" }
| { type: "join-room" }
| { type: "room-settings" }
| { type: "account-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 { myResponses } = useMyResponses(events, user.id)
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}
onOpenAccountSettings={() => setDialog({ type: "account-settings" })}
/>
{activeRoom ? activeRoom.name : "All Rooms"}
{formatMonthYear(weekStart)}
{activeRoom && (
)}
{eventsLoading ? (
) : (
setDialog({ type: "event-detail", event })}
/>
)}
{(dialog.type === "create-event" || dialog.type === "edit-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}
onEdit={() => setDialog({ type: "edit-event", event: dialog.event })}
/>
)}
{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()
}}
/>
)}
{dialog.type === "account-settings" && (
setDialog({ type: "none" })}
onLogout={onLogout}
/>
)}
)
}