"use client"; import { useState, useEffect } from 'react'; import { Tab } from '@headlessui/react'; import { Dialog } from '@/components/ui'; import { BuildingOfficeIcon, SwatchIcon, PhotoIcon, UserGroupIcon, ShieldCheckIcon, BellIcon, } from '@heroicons/react/24/outline'; const tabs = [ { name: 'Dados da Agência', icon: BuildingOfficeIcon }, { name: 'Personalização', icon: SwatchIcon }, { name: 'Logo e Marca', icon: PhotoIcon }, { name: 'Equipe', icon: UserGroupIcon }, { name: 'Segurança', icon: ShieldCheckIcon }, { name: 'Notificações', icon: BellIcon }, ]; const themePresets = [ { name: 'Laranja/Rosa', gradient: 'linear-gradient(90deg, #FF3A05, #FF0080)', colors: ['#FF3A05', '#FF0080'] }, { name: 'Azul/Roxo', gradient: 'linear-gradient(90deg, #0066FF, #9333EA)', colors: ['#0066FF', '#9333EA'] }, { name: 'Verde/Esmeralda', gradient: 'linear-gradient(90deg, #10B981, #059669)', colors: ['#10B981', '#059669'] }, { name: 'Ciano/Azul', gradient: 'linear-gradient(90deg, #06B6D4, #3B82F6)', colors: ['#06B6D4', '#3B82F6'] }, { name: 'Rosa/Roxo', gradient: 'linear-gradient(90deg, #EC4899, #A855F7)', colors: ['#EC4899', '#A855F7'] }, { name: 'Vermelho/Laranja', gradient: 'linear-gradient(90deg, #EF4444, #F97316)', colors: ['#EF4444', '#F97316'] }, ]; export default function ConfiguracoesPage() { const [selectedTab, setSelectedTab] = useState(0); const [selectedTheme, setSelectedTheme] = useState(0); const [customColor1, setCustomColor1] = useState('#FF3A05'); const [customColor2, setCustomColor2] = useState('#FF0080'); const [showSuccessDialog, setShowSuccessDialog] = useState(false); const [successMessage, setSuccessMessage] = useState(''); const [loading, setLoading] = useState(true); // Dados da agência (buscados da API) const [agencyData, setAgencyData] = useState({ name: '', cnpj: '', email: '', phone: '', website: '', address: '', city: '', state: '', zip: '', razaoSocial: '', description: '', industry: '', }); // Dados para alteração de senha const [passwordData, setPasswordData] = useState({ currentPassword: '', newPassword: '', confirmPassword: '', }); // Buscar dados da agência da API useEffect(() => { const fetchAgencyData = async () => { try { setLoading(true); const token = localStorage.getItem('token'); const userData = localStorage.getItem('user'); if (!token || !userData) { console.error('Usuário não autenticado'); setLoading(false); return; } // Buscar dados da API const response = await fetch('/api/agency/profile', { headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json', }, }); if (response.ok) { const data = await response.json(); setAgencyData({ name: data.name || '', cnpj: data.cnpj || '', email: data.email || '', phone: data.phone || '', website: data.website || '', address: data.address || '', city: data.city || '', state: data.state || '', zip: data.zip || '', razaoSocial: data.razao_social || '', description: data.description || '', industry: data.industry || '', }); } else { console.error('Erro ao buscar dados:', response.status); // Fallback para localStorage se API falhar const savedData = localStorage.getItem('cadastroData'); if (savedData) { const data = JSON.parse(savedData); const user = JSON.parse(userData); setAgencyData({ name: data.formData?.companyName || '', cnpj: data.formData?.cnpj || '', email: data.formData?.email || user.email || '', phone: data.contacts?.[0]?.phone || '', website: data.formData?.website || '', address: `${data.cepData?.logradouro || ''}, ${data.formData?.number || ''}`, city: data.cepData?.localidade || '', state: data.cepData?.uf || '', zip: data.formData?.cep || '', razaoSocial: data.cnpjData?.razaoSocial || '', description: data.formData?.description || '', industry: data.formData?.industry || '', }); } } } catch (error) { console.error('Erro ao buscar dados da agência:', error); setSuccessMessage('Erro ao carregar dados da agência.'); setShowSuccessDialog(true); } finally { setLoading(false); } }; fetchAgencyData(); }, []); const applyTheme = (gradient: string) => { document.documentElement.style.setProperty('--gradient-primary', gradient); document.documentElement.style.setProperty('--gradient', gradient); document.documentElement.style.setProperty('--gradient-text', gradient.replace('90deg', 'to right')); document.documentElement.style.setProperty('--color-gradient-brand', gradient.replace('90deg', 'to right')); }; const applyCustomTheme = () => { const gradient = `linear-gradient(90deg, ${customColor1}, ${customColor2})`; applyTheme(gradient); }; const handleSaveAgency = async () => { try { const token = localStorage.getItem('token'); if (!token) { setSuccessMessage('Você precisa estar autenticado.'); setShowSuccessDialog(true); return; } const response = await fetch('/api/agency/profile', { method: 'PUT', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json', }, body: JSON.stringify({ name: agencyData.name, cnpj: agencyData.cnpj, email: agencyData.email, phone: agencyData.phone, website: agencyData.website, address: agencyData.address, city: agencyData.city, state: agencyData.state, zip: agencyData.zip, razao_social: agencyData.razaoSocial, description: agencyData.description, industry: agencyData.industry, }), }); if (response.ok) { setSuccessMessage('Dados da agência salvos com sucesso!'); } else { setSuccessMessage('Erro ao salvar dados. Tente novamente.'); } } catch (error) { console.error('Erro ao salvar:', error); setSuccessMessage('Erro ao salvar dados. Verifique sua conexão.'); } setShowSuccessDialog(true); }; const handleSaveTheme = () => { // TODO: Integrar com API para salvar no banco const selectedGradient = themePresets[selectedTheme].gradient; console.log('Salvando tema:', selectedGradient); setSuccessMessage('Tema salvo com sucesso!'); setShowSuccessDialog(true); }; const handleChangePassword = async () => { // Validações if (!passwordData.currentPassword) { setSuccessMessage('Por favor, informe sua senha atual.'); setShowSuccessDialog(true); return; } if (!passwordData.newPassword || passwordData.newPassword.length < 8) { setSuccessMessage('A nova senha deve ter pelo menos 8 caracteres.'); setShowSuccessDialog(true); return; } if (passwordData.newPassword !== passwordData.confirmPassword) { setSuccessMessage('As senhas não coincidem.'); setShowSuccessDialog(true); return; } try { const token = localStorage.getItem('token'); if (!token) { setSuccessMessage('Você precisa estar autenticado.'); setShowSuccessDialog(true); return; } const response = await fetch('/api/auth/change-password', { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json', }, body: JSON.stringify({ currentPassword: passwordData.currentPassword, newPassword: passwordData.newPassword, }), }); if (response.ok) { setPasswordData({ currentPassword: '', newPassword: '', confirmPassword: '' }); setSuccessMessage('Senha alterada com sucesso!'); } else { const error = await response.text(); setSuccessMessage(error || 'Erro ao alterar senha. Verifique sua senha atual.'); } } catch (error) { console.error('Erro ao alterar senha:', error); setSuccessMessage('Erro ao alterar senha. Verifique sua conexão.'); } setShowSuccessDialog(true); }; return (
{/* Header */}

Configurações

Gerencie as configurações da sua agência

{/* Loading State */} {loading ? (
) : ( <> {/* Tabs */} {tabs.map((tab) => { const Icon = tab.icon; return ( `w-full flex items-center justify-center space-x-2 rounded-lg py-2.5 text-sm font-medium leading-5 transition-all ${selected ? 'bg-white dark:bg-gray-900 text-gray-900 dark:text-white shadow' : 'text-gray-600 dark:text-gray-400 hover:bg-white/[0.5] dark:hover:bg-gray-700/[0.5] hover:text-gray-900 dark:hover:text-white' }` } > {tab.name} ); })} {/* Tab 1: Dados da Agência */}

Informações da Agência

setAgencyData({ ...agencyData, name: e.target.value })} className="w-full px-4 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-900 text-gray-900 dark:text-white focus:ring-2 focus:ring-gray-400 dark:focus:ring-gray-600 focus:outline-none" />
setAgencyData({ ...agencyData, cnpj: e.target.value })} className="w-full px-4 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-900 text-gray-900 dark:text-white focus:ring-2 focus:ring-gray-400 dark:focus:ring-gray-600 focus:outline-none" />
setAgencyData({ ...agencyData, email: e.target.value })} className="w-full px-4 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-900 text-gray-900 dark:text-white focus:ring-2 focus:ring-gray-400 dark:focus:ring-gray-600 focus:outline-none" />
setAgencyData({ ...agencyData, phone: e.target.value })} className="w-full px-4 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-900 text-gray-900 dark:text-white focus:ring-2 focus:ring-gray-400 dark:focus:ring-gray-600 focus:outline-none" />
setAgencyData({ ...agencyData, website: e.target.value })} className="w-full px-4 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-900 text-gray-900 dark:text-white focus:ring-2 focus:ring-gray-400 dark:focus:ring-gray-600 focus:outline-none" />
setAgencyData({ ...agencyData, address: e.target.value })} className="w-full px-4 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-900 text-gray-900 dark:text-white focus:ring-2 focus:ring-gray-400 dark:focus:ring-gray-600 focus:outline-none" />
setAgencyData({ ...agencyData, city: e.target.value })} className="w-full px-4 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-900 text-gray-900 dark:text-white focus:ring-2 focus:ring-gray-400 dark:focus:ring-gray-600 focus:outline-none" />
setAgencyData({ ...agencyData, state: e.target.value })} className="w-full px-4 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-900 text-gray-900 dark:text-white focus:ring-2 focus:ring-gray-400 dark:focus:ring-gray-600 focus:outline-none" />
setAgencyData({ ...agencyData, zip: e.target.value })} className="w-full px-4 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-900 text-gray-900 dark:text-white focus:ring-2 focus:ring-gray-400 dark:focus:ring-gray-600 focus:outline-none" />
{/* Tab 2: Personalização */}

Personalização do Dashboard

{/* Temas Pré-definidos */}

Temas Pré-definidos

{themePresets.map((theme, idx) => ( ))}
{/* Cores Customizadas */}

Cores Personalizadas

setCustomColor1(e.target.value)} className="w-20 h-20 rounded-lg cursor-pointer border-2 border-gray-300 dark:border-gray-600" />
setCustomColor2(e.target.value)} className="w-20 h-20 rounded-lg cursor-pointer border-2 border-gray-300 dark:border-gray-600" />
{/* Tab 3: Logo e Marca */}

Logo e Identidade Visual

Arraste e solte sua logo aqui ou clique para fazer upload

PNG, JPG ou SVG (máx. 2MB)

Upload do favicon (ícone da aba do navegador)

ICO ou PNG 32x32 pixels

{/* Tab 4: Equipe */}

Gerenciamento de Equipe

Em breve: gerenciamento completo de usuários e permissões

{/* Tab 5: Segurança */}

Segurança e Privacidade

{/* Alteração de Senha */}

Alterar Senha

setPasswordData({ ...passwordData, currentPassword: e.target.value })} className="w-full px-4 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-900 text-gray-900 dark:text-white focus:ring-2 focus:ring-gray-400 dark:focus:ring-gray-600 focus:outline-none" placeholder="Digite sua senha atual" />
setPasswordData({ ...passwordData, newPassword: e.target.value })} className="w-full px-4 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-900 text-gray-900 dark:text-white focus:ring-2 focus:ring-gray-400 dark:focus:ring-gray-600 focus:outline-none" placeholder="Digite a nova senha (mínimo 8 caracteres)" />
setPasswordData({ ...passwordData, confirmPassword: e.target.value })} className="w-full px-4 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-900 text-gray-900 dark:text-white focus:ring-2 focus:ring-gray-400 dark:focus:ring-gray-600 focus:outline-none" placeholder="Digite a nova senha novamente" />
{/* Recursos Futuros */}

Recursos em Desenvolvimento

Autenticação em duas etapas (2FA)
Histórico de acessos
Dispositivos conectados
{/* Tab 6: Notificações */}

Preferências de Notificações

Em breve: configuração de notificações por e-mail, push e mais

)} {/* Dialog de Sucesso */} setShowSuccessDialog(false)} title="Sucesso" size="sm" >

{successMessage}

); }