'use client' import { useState, useEffect } from 'react' import { Button } from '@/components/ui/button' import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select' import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog' import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table' import { Badge } from '@/components/ui/badge' import { Plus, Edit, Trash2, Smartphone, MapPin, Key, Wifi } from 'lucide-react' interface Kiosk { id: string device_name: string display_name: string api_key: string ip_address?: string is_active: boolean created_at: string location?: { id: string name: string address: string } } interface Location { id: string name: string address: string } export default function KiosksManagement() { const [kiosks, setKiosks] = useState([]) const [locations, setLocations] = useState([]) const [loading, setLoading] = useState(false) const [dialogOpen, setDialogOpen] = useState(false) const [editingKiosk, setEditingKiosk] = useState(null) const [showApiKey, setShowApiKey] = useState(null) const [formData, setFormData] = useState({ device_name: '', display_name: '', location_id: '', ip_address: '' }) useEffect(() => { fetchKiosks() fetchLocations() }, []) const fetchKiosks = async () => { setLoading(true) try { const response = await fetch('/api/aperture/kiosks') const data = await response.json() if (data.success) { setKiosks(data.kiosks) } } catch (error) { console.error('Error fetching kiosks:', error) } finally { setLoading(false) } } const fetchLocations = async () => { try { const response = await fetch('/api/aperture/locations') const data = await response.json() if (data.success) { setLocations(data.locations || []) } } catch (error) { console.error('Error fetching locations:', error) } } const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() try { const url = editingKiosk ? `/api/aperture/kiosks/${editingKiosk.id}` : '/api/aperture/kiosks' const method = editingKiosk ? 'PUT' : 'POST' const response = await fetch(url, { method, headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(formData) }) const data = await response.json() if (data.success) { await fetchKiosks() setDialogOpen(false) setEditingKiosk(null) setFormData({ device_name: '', display_name: '', location_id: '', ip_address: '' }) } else { alert(data.error || 'Error saving kiosk') } } catch (error) { console.error('Error saving kiosk:', error) alert('Error saving kiosk') } } const handleEdit = (kiosk: Kiosk) => { setEditingKiosk(kiosk) setFormData({ device_name: kiosk.device_name, display_name: kiosk.display_name, location_id: kiosk.location?.id || '', ip_address: kiosk.ip_address || '' }) setDialogOpen(true) } const handleDelete = async (kiosk: Kiosk) => { if (!confirm(`¿Estás seguro de que quieres eliminar el kiosko "${kiosk.device_name}"?`)) { return } try { const response = await fetch(`/api/aperture/kiosks/${kiosk.id}`, { method: 'DELETE' }) const data = await response.json() if (data.success) { await fetchKiosks() } else { alert(data.error || 'Error deleting kiosk') } } catch (error) { console.error('Error deleting kiosk:', error) alert('Error deleting kiosk') } } const toggleKioskStatus = async (kiosk: Kiosk) => { try { const response = await fetch(`/api/aperture/kiosks/${kiosk.id}`, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ ...kiosk, is_active: !kiosk.is_active }) }) const data = await response.json() if (data.success) { await fetchKiosks() } else { alert(data.error || 'Error updating kiosk status') } } catch (error) { console.error('Error toggling kiosk status:', error) } } const copyApiKey = (apiKey: string) => { navigator.clipboard.writeText(apiKey) setShowApiKey(apiKey) setTimeout(() => setShowApiKey(null), 2000) } const openCreateDialog = () => { setEditingKiosk(null) setFormData({ device_name: '', display_name: '', location_id: '', ip_address: '' }) setDialogOpen(true) } return (

Gestión de Kioskos

Administra los dispositivos kiosko para check-in

Dispositivos Kiosko {kiosks.length} dispositivos registrados {loading ? (
Cargando kioskos...
) : kiosks.length === 0 ? (
No hay kioskos registrados. Agrega uno para comenzar.
) : ( Dispositivo Ubicación IP API Key Estado Acciones {kiosks.map((kiosk) => (
{kiosk.device_name}
{kiosk.display_name !== kiosk.device_name && (
{kiosk.display_name}
)}
{kiosk.location?.name || 'Sin ubicación'}
{kiosk.ip_address ? (
{kiosk.ip_address}
) : ( Sin IP )}
{kiosk.is_active ? 'Activo' : 'Inactivo'}
))}
)}
{editingKiosk ? 'Editar Kiosko' : 'Nuevo Kiosko'} {editingKiosk ? 'Modifica la información del kiosko' : 'Agrega un nuevo dispositivo kiosko'}
setFormData({...formData, device_name: e.target.value})} className="col-span-3" placeholder="Ej. Kiosko Principal" required />
setFormData({...formData, display_name: e.target.value})} className="col-span-3" placeholder="Nombre a mostrar" />
setFormData({...formData, ip_address: e.target.value})} className="col-span-3" placeholder="192.168.1.100" />
) }