// app/admin/page.tsx "use client"; import { CalendarRange, ClipboardCheck, Loader2, Lock, Unlock, Users as UsersIcon, BellRing } from 'lucide-react'; import React, { useEffect, useRef, useState } from 'react'; import { verifyLogin } from '../actions/admin'; import { OfflineBadge } from '../components/ui/OfflineBadge'; import { AppUser } from './adminTypes'; import { AttendanceTab } from './AttendanceTab'; import { ReportTab } from './ReportTab'; import { SetupTab } from './SetupTab'; import { NoticeTab } from './NoticeTab'; import { useAdminState } from './useAdminState'; export default function Admin() { const [currentUser, setCurrentUser] = useState(null); const [isCheckingSession, setIsCheckingSession] = useState(true); const usernameRef = useRef(null); const pinRef = useRef(null); const [isLoading, setIsLoading] = useState(false); const [loginError, setLoginError] = useState(false); const [activeTab, setActiveTab] = useState<'setup' | 'notice' | 'today' | 'report'>('report'); const adminState = useAdminState(); useEffect(() => { const savedSession = localStorage.getItem('kullaberg_admin_session'); if (savedSession) { const user = JSON.parse(savedSession) as AppUser; setCurrentUser(user); if (user.role === 'Viewer') setActiveTab('report'); else if (user.role === 'Staff') setActiveTab('today'); else setActiveTab('today'); } setIsCheckingSession(false); }, []); const handleLogin = async (e: React.SyntheticEvent) => { e.preventDefault(); setLoginError(false); const usernameVal = usernameRef.current?.value || ''; const pinVal = pinRef.current?.value || ''; if (!usernameVal || !pinVal) { setLoginError(true); return; } setIsLoading(true); const result = await verifyLogin(usernameVal, pinVal); if (result.success && result.user) { const user = result.user as AppUser; setCurrentUser(user); localStorage.setItem('kullaberg_admin_session', JSON.stringify(user)); if (user.role === 'Viewer') setActiveTab('report'); else if (user.role === 'Staff') setActiveTab('today'); else setActiveTab(adminState.periods.length > 0 ? 'today' : 'setup'); } else { if (pinRef.current) pinRef.current.value = ''; setLoginError(true); } setIsLoading(false); }; const handleLogout = () => { setCurrentUser(null); localStorage.removeItem('kullaberg_admin_session'); }; if (isCheckingSession) return
; if (!currentUser) { return (

Admin Login

setLoginError(false)} />
setLoginError(false)} />
{loginError &&

Fel namn eller lösenord.

}
); } const availableTabs = []; if (currentUser.role === 'Admin') availableTabs.push({ id: 'setup', icon: CalendarRange, label: 'Perioder' }); if (currentUser.role === 'Admin') availableTabs.push({ id: 'notice', icon: BellRing, label: 'Notis' }); if (currentUser.role === 'Admin' || currentUser.role === 'Staff') availableTabs.push({ id: 'today', icon: ClipboardCheck, label: 'Närvaro' }); availableTabs.push({ id: 'report', icon: UsersIcon, label: 'Rapport' }); return (

Admin

{adminState.isOffline && }
Inloggad: {currentUser.name} |
{adminState.isLoadingData && (adminState.periods.length === 0 || adminState.scheduleData.length === 0) ? (

Hämtar data...

) : ( <> {availableTabs.length > 1 && (
{availableTabs.map(tab => ( ))}
)} {activeTab === 'setup' && currentUser.role === 'Admin' && } {activeTab === 'notice' && currentUser.role === 'Admin' && } {activeTab === 'today' && (currentUser.role === 'Admin' || currentUser.role === 'Staff') && ( )} {activeTab === 'report' && ( )} )}
); }