"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: 'Marca', gradient: 'linear-gradient(135deg, #ff3a05, #ff0080)', colors: ['#ff3a05', '#ff0080'] }, { name: 'Azul/Roxo', gradient: 'linear-gradient(135deg, #0066FF, #9333EA)', colors: ['#0066FF', '#9333EA'] }, { name: 'Verde/Esmeralda', gradient: 'linear-gradient(135deg, #10B981, #059669)', colors: ['#10B981', '#059669'] }, { name: 'Ciano/Azul', gradient: 'linear-gradient(135deg, #06B6D4, #3B82F6)', colors: ['#06B6D4', '#3B82F6'] }, { name: 'Rosa/Roxo', gradient: 'linear-gradient(135deg, #EC4899, #A855F7)', colors: ['#EC4899', '#A855F7'] }, { name: 'Vermelho/Laranja', gradient: 'linear-gradient(135deg, #EF4444, #F97316)', colors: ['#EF4444', '#F97316'] }, ]; const DEFAULT_GRADIENT = 'linear-gradient(135deg, #ff3a05, #ff0080)'; const THEME_STORAGE_PREFIX = 'agency-theme:'; const setThemeVariables = (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')); }; export default function ConfiguracoesPage() { const [selectedTab, setSelectedTab] = useState(0); const [selectedTheme, setSelectedTheme] = useState(0); const [activeGradient, setActiveGradient] = useState(DEFAULT_GRADIENT); const [themeKey, setThemeKey] = useState('default'); const [customColor1, setCustomColor1] = useState('#ff3a05'); const [customColor2, setCustomColor2] = useState('#ff0080'); const [showSuccessDialog, setShowSuccessDialog] = useState(false); const [successMessage, setSuccessMessage] = useState(''); const [showSupportDialog, setShowSupportDialog] = useState(false); const [supportMessage, setSupportMessage] = useState('Para alterar estes dados, contate o suporte.'); 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 e inicializar tema salvo 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; } const parsedUser = JSON.parse(userData); const hostname = window.location.hostname; const hostSubdomain = hostname.split('.')[0] || 'default'; const key = parsedUser?.subdomain || parsedUser?.tenantId || hostSubdomain; setThemeKey(key); const savedGradient = localStorage.getItem(`${THEME_STORAGE_PREFIX}${key}`) || DEFAULT_GRADIENT; setActiveGradient(savedGradient); setThemeVariables(savedGradient); const presetIndex = themePresets.findIndex((theme) => theme.gradient === savedGradient); if (presetIndex >= 0) { setSelectedTheme(presetIndex); setCustomColor1(themePresets[presetIndex].colors[0]); setCustomColor2(themePresets[presetIndex].colors[1]); } // 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) => { setActiveGradient(gradient); setThemeVariables(gradient); }; const applyCustomTheme = () => { const gradient = `linear-gradient(90deg, ${customColor1}, ${customColor2})`; setSelectedTheme(-1); 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 = () => { const gradientToSave = selectedTheme >= 0 ? themePresets[selectedTheme].gradient : activeGradient; applyTheme(gradientToSave); if (themeKey) { localStorage.setItem(`${THEME_STORAGE_PREFIX}${themeKey}`, gradientToSave); } 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 (
Gerencie as configurações da sua agência
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
Em breve: gerenciamento completo de usuários e permissões
Em breve: configuração de notificações por e-mail, push e mais