import { useState, useEffect } 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 { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Upload, Eye } from 'lucide-react'; import { toast } from 'sonner'; import { useAuth } from '@/hooks/useAuth'; import { useUserRole } from '@/hooks/useUserRole'; import { useBrandSettings } from '@/hooks/useBrandSettings'; import { useIconStyle } from '@/hooks/useIconStyle'; import { MenuBuilder } from '@/components/menu-builder/MenuBuilder'; import { PrioridadesConfig } from '@/components/configuracoes/PrioridadesConfig'; import { NomenclaturasConfig } from '@/components/configuracoes/NomenclaturasConfig'; const FONT_OPTIONS = [{ value: 'Arial', label: 'Arial - Padrão clássico' }, { value: 'Helvetica', label: 'Helvetica - Moderna e limpa' }, { value: 'SF Pro Display', label: 'SF Pro - Fonte do sistema Apple' }, { value: 'system-ui', label: 'Fonte do Sistema Operacional' }]; const Configuracoes = () => { const { user } = useAuth(); const { isAdmin } = useUserRole(); const { brandSettings, setBrandSettings, saveBrandSettings, uploadLogo, isLoading: brandLoading } = useBrandSettings(); const { iconStyle, setIconStyle } = useIconStyle(); const [isLoading, setIsLoading] = useState(false); const [logoFile, setLogoFile] = useState(null); const [logoPreview, setLogoPreview] = useState(null); useEffect(() => { if (brandSettings.logo_url) { setLogoPreview(brandSettings.logo_url); } }, [brandSettings.logo_url]); const handleLogoUpload = (event: React.ChangeEvent) => { const file = event.target.files?.[0]; if (file) { if (file.size > 5 * 1024 * 1024) { // 5MB limit toast.error('Arquivo muito grande. Máximo 5MB.'); return; } if (!file.type.startsWith('image/')) { toast.error('Por favor, selecione um arquivo de imagem.'); return; } setLogoFile(file); const reader = new FileReader(); reader.onload = e => { setLogoPreview(e.target?.result as string); }; reader.readAsDataURL(file); } }; const handleSaveSettings = async () => { if (!isAdmin) { toast.error('Acesso negado. Apenas administradores podem alterar essas configurações.'); return; } setIsLoading(true); try { let logoUrl = brandSettings.logo_url; // Upload logo if a new file was selected if (logoFile) { const uploadResult = await uploadLogo(logoFile); if (uploadResult.error) { setIsLoading(false); return; } logoUrl = uploadResult.data?.publicUrl || null; } // Save brand settings const settingsToSave = { ...brandSettings, logo_url: logoUrl }; const result = await saveBrandSettings(settingsToSave); if (result.error) { setIsLoading(false); return; } // Apply font globally const fontFamily = brandSettings.font_family === 'system-ui' ? 'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif' : brandSettings.font_family; document.documentElement.style.setProperty('--font-family', fontFamily); document.body.style.fontFamily = fontFamily; // Clear file selection setLogoFile(null); } catch (error) { console.error('Error saving brand settings:', error); toast.error('Erro ao salvar configurações'); } finally { setIsLoading(false); } }; const handleFontChange = (value: string) => { setBrandSettings(prev => ({ ...prev, font_family: value })); // Preview da fonte const fontFamily = value === 'system-ui' ? 'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif' : value; document.documentElement.style.setProperty('--font-family', fontFamily); document.body.style.fontFamily = fontFamily; }; if (!isAdmin) { return

Configurações

Configurações gerais do sistema

Acesso Restrito

Apenas administradores podem acessar as configurações avançadas do sistema.

; } return

Configurações Gerais

Configurações gerais do sistema

{/* Personalização de Marca */} Personalização de Marca {/* Nome da Empresa */}
setBrandSettings(prev => ({ ...prev, company_name: e.target.value }))} placeholder="Digite o nome da empresa" className="bg-white border-slate-300 text-slate-900 dark:bg-slate-800 dark:border-slate-700 dark:text-white" />
JPG, PNG ou SVG. Máximo 5MB.
{logoPreview &&

Pré-visualização

Logo preview
}

Pré-visualização da fonte:

Este é um exemplo de como o texto aparecerá com a fonte selecionada.

{/* Personalização de Interface */} Personalização de Interface {/* Estilo dos Ícones */}

Configuração atual:

{iconStyle === 'colorful' && 'Ícones coloridos (cores originais dos ícones)'} {iconStyle === 'themed' && 'Ícones temáticos (seguem a cor principal do tema)'} {iconStyle === 'white' && 'Ícones brancos (estilo monocromático)'}

{/* Configuração de Nomenclaturas e Identificação da Fábrica */} {/* Configuração de Prioridades */} {/* Menu Builder */}
; }; export default Configuracoes;