"use client" import type { ReactNode } from "react" import { useAuth } from "@/lib/auth-context" import { Button } from "@/components/ui/button" import { Avatar, AvatarFallback } from "@/components/ui/avatar" import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, DropdownMenuSub, DropdownMenuSubTrigger, DropdownMenuSubContent, DropdownMenuCheckboxItem, } from "@/components/ui/dropdown-menu" import { LogOut, User, Building2, Cpu, ShieldAlert, KeyRound } from "lucide-react" import { ModeToggle } from "@/components/mode-toggle" import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog" import { Label } from "@/components/ui/label" import { Input } from "@/components/ui/input" import { useState } from "react" import { useToast } from "@/components/ui/use-toast" // Defines props for the AppShell component interface AppShellProps { children: ReactNode // React children to be rendered within the shell } // AppShell component provides the main layout structure for the application export function AppShell({ children }: AppShellProps) { // Access authentication context for user info, logout function, room data, and room update function const { user, logout, rooms, updateRooms, changePassword } = useAuth() const { toast } = useToast() const [changePasswordOpen, setChangePasswordOpen] = useState(false) const [currentPassword, setCurrentPassword] = useState("") const [newPassword, setNewPassword] = useState("") const handleChangePassword = async () => { if (!currentPassword || !newPassword) return const success = await changePassword(currentPassword, newPassword) if (success) { toast({ title: "Passwort geändert" }) setChangePasswordOpen(false) setCurrentPassword("") setNewPassword("") } else { toast({ title: "Fehler", description: "Passwort konnte nicht geändert werden", variant: "destructive" }) } } // Generates user initials for the avatar fallback const initials = user?.name ?.split(" ") .map((n) => n[0]) .join("") .toUpperCase() .slice(0, 2) || "" // Fallback to empty string if user name is not available return (
{/* Header section with sticky positioning, blur effect, and responsiveness */}
{/* Application logo and title */}
Elektronikschule IT-Support-Portal
{/* User actions and theme toggle */}
{/* Display user role for larger screens */}
{user?.role === "ADMIN" ? ( ) : user?.role === "LEHRKRAFT" ? ( ) : ( )} {user?.role === "ADMIN" ? "Admin" : user?.role === "LEHRKRAFT" ? "Lehrkraft" : "Raumbetreuer"}
{/* Dropdown menu for user profile and settings */}

{user?.name}

{user?.email}

{/* Display user role in the dropdown */} {user?.role === "ADMIN" ? : } {user?.role === "ADMIN" ? "Admin" : user?.role === "LEHRKRAFT" ? "Lehrkraft" : "Raumbetreuer"} setChangePasswordOpen(true)}> Passwort ändern {/* Room supervision management for 'RAUMBETREUER' role */} {user?.role === "RAUMBETREUER" && user.supervisedRooms && ( {user.supervisedRooms.length} Betreute Räume Räume verwalten {rooms.map((room) => { // Determine if the current room is supervised by the user const isChecked = user.supervisedRooms?.some((r) => r.id === room.id) ?? false return ( { const currentIds = user.supervisedRooms?.map((r) => r.id) || [] let newIds if (checked) { // Add room to supervised list newIds = [...currentIds, room.id] } else { // Remove room from supervised list newIds = currentIds.filter((id) => id !== room.id) } updateRooms(newIds) // Update the list of supervised rooms }} onSelect={(e) => e.preventDefault()} // Prevent closing dropdown on selection > {room.name} ) })} )} {/* Logout button */} Abmelden
{/* Theme toggle component */}
Passwort ändern Geben Sie Ihr aktuelles Passwort und das neue Passwort ein.
setCurrentPassword(e.target.value)} />
setNewPassword(e.target.value)} />
{/* Main content area */}
{children}
) }