import React, { useState, useEffect, useRef } from 'react'; import { Bookmark, Search, Plus, Share2, Download, Upload, RotateCcw, Check, Copy, LayoutGrid, Sparkles, CheckCircle2, AlertCircle, Info, Lock, Unlock } from 'lucide-react'; import { CATEGORIES, INITIAL_PORTAL_ITEMS, getStoredPortalItems, savePortalItems, generateWhatsAppDescriptionText } from '../../utils/customerPortalData'; import PortalItemCard from './PortalItemCard'; import ModalPortalItem from './ModalPortalItem'; import ModalConfirm from '../wpp/ModalConfirm'; import ModalSupportAuth from './ModalSupportAuth'; export default function CustomerPortal() { const [items, setItems] = useState([]); const [selectedCategory, setSelectedCategory] = useState('all'); const [searchQuery, setSearchQuery] = useState(''); const [copiedWhatsapp, setCopiedWhatsapp] = useState(false); const [toasts, setToasts] = useState([]); // Estado de Autenticação da Equipe de Suporte const [isSupportUnlocked, setIsSupportUnlocked] = useState(false); const [authModal, setAuthModal] = useState({ isOpen: false, title: '', onSuccess: null }); // Modals state const [isModalItemOpen, setIsModalItemOpen] = useState(false); const [itemToEdit, setItemToEdit] = useState(null); const [confirmModal, setConfirmModal] = useState({ isOpen: false, title: '', message: '', description: '', confirmText: 'Confirmar', type: 'danger', onConfirm: () => {} }); const fileInputRef = useRef(null); useEffect(() => { setItems(getStoredPortalItems()); }, []); const updateItemsState = (newItems) => { setItems(newItems); savePortalItems(newItems); }; const showToast = (message, type = 'info') => { const id = Date.now().toString() + Math.random().toString(); setToasts((prev) => [...prev, { id, message, type }]); setTimeout(() => { setToasts((prev) => prev.filter((t) => t.id !== id)); }, 3500); }; // Solicitação de autenticação de suporte para ver senhas const handleRequestSupportAuth = (onSuccess, title) => { setAuthModal({ isOpen: true, title: title || 'este acesso', onSuccess }); }; const handleSessionUnlock = () => { setIsSupportUnlocked(true); showToast('Modo de suporte autenticado para esta sessão!', 'success'); }; const handleLockSupport = () => { setIsSupportUnlocked(false); showToast('Modo de suporte bloqueado. Senhas protegidas.', 'info'); }; // Salvar Item (Criar ou Editar) const handleSaveItem = (itemData) => { let updated; const exists = items.some(i => i.id === itemData.id); if (exists) { updated = items.map(i => i.id === itemData.id ? itemData : i); showToast(`Acesso "${itemData.title}" atualizado!`, 'success'); } else { updated = [itemData, ...items]; showToast(`Acesso "${itemData.title}" adicionado!`, 'success'); } updateItemsState(updated); }; // Excluir Item com Modal Confirm Estilizado const handleDeleteItem = (item) => { setConfirmModal({ isOpen: true, title: 'Excluir Acesso', message: `Deseja realmente remover "${item.title}" da sua Central de Acessos?`, description: 'Este atalho deixará de ser exibido na lista e nos backups.', confirmText: 'Excluir Acesso', type: 'danger', onConfirm: () => { const updated = items.filter(i => i.id !== item.id); updateItemsState(updated); showToast(`Acesso "${item.title}" removido.`, 'info'); } }); }; // Restaurar dados originais const handleResetDefaults = () => { setConfirmModal({ isOpen: true, title: 'Restaurar Acessos Originais', message: 'Deseja restaurar a lista com todos os 23 acessos padrões do grupo de WhatsApp?', description: 'Itens personalizados que você tiver adicionado serão substituídos pela lista padrão original.', confirmText: 'Restaurar Padrão', type: 'warning', onConfirm: () => { updateItemsState(INITIAL_PORTAL_ITEMS); showToast('Lista restaurada com sucesso!', 'success'); } }); }; // Copiar texto pronto para o WhatsApp const handleCopyWhatsAppText = () => { const text = generateWhatsAppDescriptionText(items); navigator.clipboard.writeText(text); setCopiedWhatsapp(true); showToast('Texto completo copiado para colar no WhatsApp!', 'success'); setTimeout(() => setCopiedWhatsapp(false), 2500); }; // Exportar Backup JSON const handleExportJson = () => { const data = JSON.stringify(items, null, 2); const blob = new Blob([data], { type: 'application/json' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = `central-de-acessos-backup-${new Date().toISOString().slice(0, 10)}.json`; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); showToast('Backup JSON exportado com sucesso!', 'success'); }; // Importar Backup JSON const handleImportJson = (e) => { const file = e.target.files?.[0]; if (!file) return; const reader = new FileReader(); reader.onload = (event) => { try { const json = JSON.parse(event.target.result); if (Array.isArray(json)) { updateItemsState(json); showToast(`${json.length} acessos importados com sucesso!`, 'success'); } else { showToast('Formato inválido. O arquivo JSON deve ser uma lista de acessos.', 'error'); } } catch (err) { showToast('Erro ao processar JSON: ' + err.message, 'error'); } }; reader.readAsText(file); }; // Filtro por Categoria e Busca const filteredItems = items.filter(item => { const matchesCategory = selectedCategory === 'all' || item.category === selectedCategory; const q = searchQuery.toLowerCase().trim(); if (!q) return matchesCategory; const matchesSearch = (item.title && item.title.toLowerCase().includes(q)) || (item.url && item.url.toLowerCase().includes(q)) || (item.secondaryUrl && item.secondaryUrl.toLowerCase().includes(q)) || (item.username && item.username.toLowerCase().includes(q)) || (item.ipHost && item.ipHost.toLowerCase().includes(q)) || (item.description && item.description.toLowerCase().includes(q)) || (item.wifiNetwork && item.wifiNetwork.toLowerCase().includes(q)) || (item.tags && item.tags.some(t => t.toLowerCase().includes(q))); return matchesCategory && matchesSearch; }); return (
{/* Top Banner & Header */}

Central de Acessos

Todos os links, logins, IPs de servidores e acessos centralizados do seu grupo de WhatsApp.

{/* Toolbar: Busca, Categorias e Ferramentas */}
{/* Campo de Busca */}
setSearchQuery(e.target.value)} className="portal-search-input" /> {searchQuery && ( )}
{/* Ferramentas de Backup e Restauração */}
{/* Botão de Autenticação / Status do Suporte */} {isSupportUnlocked ? ( ) : ( )}
{/* Filtro de Categorias */}
{CATEGORIES.map(cat => { const count = cat.id === 'all' ? items.length : items.filter(i => i.category === cat.id).length; return ( ); })}
{/* Grid de Cards de Acesso */}
{filteredItems.map(item => ( { setItemToEdit(it); setIsModalItemOpen(true); }} onDelete={handleDeleteItem} /> ))} {filteredItems.length === 0 && (

Nenhum acesso encontrado

{searchQuery ? `Nenhum resultado corresponde à busca "${searchQuery}".` : 'Nenhum acesso cadastrado nesta categoria. Clique em "+ Novo Acesso" para adicionar.'}

)}
{/* Modal de Criação / Edição de Acesso */} setIsModalItemOpen(false)} onSave={handleSaveItem} itemToEdit={itemToEdit} /> {/* Modal de Confirmação Estilizado */} setConfirmModal(prev => ({ ...prev, isOpen: false }))} onConfirm={confirmModal.onConfirm} title={confirmModal.title} message={confirmModal.message} description={confirmModal.description} confirmText={confirmModal.confirmText} type={confirmModal.type} /> {/* Modal de Autenticação de Suporte (Senha Padrão C2s33131782*) */} setAuthModal(prev => ({ ...prev, isOpen: false }))} onSuccess={authModal.onSuccess} targetTitle={authModal.title} onSessionUnlock={handleSessionUnlock} /> {/* Toasts */}
{toasts.map(t => (
{t.type === 'success' && } {t.type === 'error' && } {t.type === 'warning' && } {t.type === 'info' && } {t.message}
))}
); }