import React, { useState } from 'react'; import { Card, CardContent, 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 { Badge } from '@/components/ui/badge'; import { Key, QrCode, Smartphone, Clock, Shield, CheckCircle, AlertCircle, Copy, Send, Unlock, Lock, Calendar, RefreshCw } from 'lucide-react'; import { useToast } from '@/hooks/use-toast'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; interface AccessCode { id: string; roomNumber: string; guestName: string; code: string; qrCode: string; validFrom: string; validUntil: string; status: 'active' | 'expired' | 'revoked'; accessCount: number; } const KeylessEntry = () => { const { toast } = useToast(); const [accessCodes, setAccessCodes] = useState([ { id: '1', roomNumber: '305', guestName: 'Juan Pérez', code: '8A9B-C4D7', qrCode: 'QR-305-8A9BC4D7', validFrom: '2025-01-15 14:00', validUntil: '2025-01-20 12:00', status: 'active', accessCount: 12 }, { id: '2', roomNumber: '412', guestName: 'María González', code: '5F2E-H8J3', qrCode: 'QR-412-5F2EH8J3', validFrom: '2025-01-14 15:00', validUntil: '2025-01-19 11:00', status: 'active', accessCount: 8 } ]); const [newCodeForm, setNewCodeForm] = useState({ roomNumber: '', guestName: '', validFrom: '', validUntil: '' }); const generateCode = () => { const chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789'; let code = ''; for (let i = 0; i < 8; i++) { if (i === 4) code += '-'; code += chars.charAt(Math.floor(Math.random() * chars.length)); } return code; }; const handleGenerateAccessCode = () => { if (!newCodeForm.roomNumber || !newCodeForm.guestName) { toast({ title: "Error", description: "Por favor completa todos los campos requeridos", variant: "destructive" }); return; } const newCode: AccessCode = { id: String(accessCodes.length + 1), roomNumber: newCodeForm.roomNumber, guestName: newCodeForm.guestName, code: generateCode(), qrCode: `QR-${newCodeForm.roomNumber}-${Date.now()}`, validFrom: newCodeForm.validFrom || new Date().toISOString(), validUntil: newCodeForm.validUntil || new Date(Date.now() + 5 * 24 * 60 * 60 * 1000).toISOString(), status: 'active', accessCount: 0 }; setAccessCodes([...accessCodes, newCode]); toast({ title: "Código Generado", description: `Código de acceso creado para habitación ${newCodeForm.roomNumber}`, }); // Reset form setNewCodeForm({ roomNumber: '', guestName: '', validFrom: '', validUntil: '' }); }; const copyCode = (code: string) => { navigator.clipboard.writeText(code); toast({ title: "Código Copiado", description: "El código ha sido copiado al portapapeles", }); }; const sendCode = (code: AccessCode) => { toast({ title: "Código Enviado", description: `Código enviado a ${code.guestName} por email y SMS`, }); }; const revokeCode = (codeId: string) => { setAccessCodes(accessCodes.map(code => code.id === codeId ? { ...code, status: 'revoked' as const } : code )); toast({ title: "Código Revocado", description: "El código de acceso ha sido desactivado", variant: "destructive" }); }; const statusConfig = { active: { label: 'Activo', color: 'bg-green-100 text-green-800', icon: CheckCircle }, expired: { label: 'Expirado', color: 'bg-gray-100 text-gray-800', icon: Clock }, revoked: { label: 'Revocado', color: 'bg-red-100 text-red-800', icon: AlertCircle } }; return (
{/* Stats */}

Códigos Activos

{accessCodes.filter(c => c.status === 'active').length}

Total Accesos Hoy

47

Códigos QR

{accessCodes.length}

Seguridad

99.9%

{/* Generate New Code */} Generar Nuevo Código de Acceso
setNewCodeForm({ ...newCodeForm, roomNumber: e.target.value })} />
setNewCodeForm({ ...newCodeForm, guestName: e.target.value })} />
setNewCodeForm({ ...newCodeForm, validFrom: e.target.value })} />
setNewCodeForm({ ...newCodeForm, validUntil: e.target.value })} />
{/* Active Codes */} Códigos de Acceso Generados
{accessCodes.map((code) => { const StatusIcon = statusConfig[code.status].icon; return (
{code.roomNumber}

{code.guestName}

ID: {code.id}

{statusConfig[code.status].label}

Código PIN

{code.code}

Código QR

{code.qrCode}

{code.validFrom}
{code.validUntil}
{code.accessCount} accesos
{code.status === 'active' && ( <> )}
); })}
{/* Security Info */} Seguridad del Sistema
  • Códigos encriptados de 256-bit
  • Expiración automática de códigos
  • Registro de todos los accesos
  • Notificaciones en tiempo real
); }; export default KeylessEntry;