'use client'; import React, { useState } from 'react'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { DataTable } from '@/components/data-table'; import { ConfirmDialog } from '@/components/confirm-dialog'; import { useApiGet, useApiMutation } from '@/lib/hooks/useApi'; import { getPriorityColor, getMessageTypeIcon, formatDisplayTime } from '@/lib/signage-utils'; import { AlertCircle, Tv, Plus } from 'lucide-react'; export default function SignageAdminPage() { // Get schoolId from URL params or context const [schoolId, setSchoolId] = React.useState(null); React.useEffect(() => { // Get schoolId from session or localStorage const storedSchoolId = typeof window !== 'undefined' ? localStorage.getItem('schoolId') : null; setSchoolId(storedSchoolId); }, []); const [showNewMessage, setShowNewMessage] = useState(false); const [selectedSignage, setSelectedSignage] = useState(null); const [showConfirm, setShowConfirm] = useState(false); // Fetch all signages const { data: signages, mutate: refetchSignages } = useApiGet( schoolId ? `/api/v1/signage?schoolId=${schoolId}` : null ); // Fetch messages for selected signage const { data: messages, mutate: refetchMessages } = useApiGet( selectedSignage && schoolId ? `/api/v1/signage/${selectedSignage}/messages` : null ); const { mutate: createMessage, isLoading: isCreating } = useApiMutation( `/api/v1/signage/${selectedSignage}/messages`, { method: 'POST', onSuccess: () => { setShowNewMessage(false); refetchMessages(); }, } ); const { mutate: deleteMessage, isLoading: isDeleting } = useApiMutation( `/api/v1/signage/messages/delete`, { method: 'DELETE', onSuccess: () => { setShowConfirm(false); refetchMessages(); }, } ); const handleCreateMessage = async (e: React.FormEvent) => { e.preventDefault(); const formData = new FormData(e.target as HTMLFormElement); const message = { title: formData.get('title'), content: formData.get('content'), messageType: formData.get('messageType'), priority: formData.get('priority'), displayDuration: parseInt(formData.get('displayDuration') as string) || 10, soundAlert: formData.get('soundAlert') === 'on', }; await createMessage(message); }; return (

Emergency Signage

Manage displays, messages, and emergency alerts

Displays Messages Activity Log {/* Displays Tab */} {signages && (
{signages.map((signage: any) => ( setSelectedSignage(signage.id)} >
{signage.displayName} {signage.location}

Status

{signage.isActive ? 'Online' : 'Offline'}

Type

{signage.signageType}

))}
)}
{/* Messages Tab */} {selectedSignage ? ( <> {messages && ( (
{getMessageTypeIcon(row.messageType)} {row.title}
), }, { key: 'priority' as any, label: 'Priority', render: (_, row) => ( {row.priority.toUpperCase()} ), }, { key: 'displayDuration' as any, label: 'Duration', render: (_, row) => formatDisplayTime(row.displayDuration || 10), }, { key: 'soundAlert' as any, label: 'Sound', render: (_, row) => ( {row.soundAlert ? 'volume-up' : 'volume-off'} ), }, ]} data={messages} actions={[ { label: 'Send Now', onClick: (row) => console.log('Send', row.id), }, { label: 'Edit', onClick: (row) => console.log('Edit', row.id), }, { label: 'Delete', onClick: (row) => { setShowConfirm(true); }, variant: 'destructive', }, ]} /> )} ) : (

Select a display to manage messages

)}
{/* Activity Log Tab */} Activity Log Recent signage events and alerts
Activity log feature coming soon
{/* New Message Dialog */} {showNewMessage && selectedSignage && ( New Message