import { Dialog } from "@headlessui/react"; import { DocumentArrowUpIcon } from "@heroicons/react/24/outline"; import { Editor } from "@tinymce/tinymce-react"; import { useState, useEffect } from "react"; import { toast } from "react-toastify"; import { api } from "../../lib/api"; import { DOCUMENT_VARIABLES } from "../../utils/documentVariables"; // Definir interface para o estado interface ConfigState { timbradoUrl: string; timbradoMarginTop: number; timbradoMarginBottom: number; timbradoMarginLeft: number; timbradoMarginRight: number; templatePadrao: string; margensTemplate: { top: number; bottom: number; left: number; right: number; }; } export function ConfiguracaoDocumento() { const [config, setConfig] = useState({ timbradoUrl: "", timbradoMarginTop: 100, timbradoMarginBottom: 50, timbradoMarginLeft: 50, timbradoMarginRight: 50, templatePadrao: "", margensTemplate: { top: 35, bottom: 29, left: 25, right: 25, }, }); const [isPreviewOpen, setPreviewOpen] = useState(false); const [isSaving, setIsSaving] = useState(false); useEffect(() => { loadConfig(); }, []); const loadConfig = async () => { try { const response = await api.get("/documentos/configuracoes"); console.log("Configurações carregadas:", response.data); // Debug if (response.data) { setConfig({ timbradoUrl: response.data.timbradoUrl || "", timbradoMarginTop: response.data.timbradoMarginTop || 100, timbradoMarginBottom: response.data.timbradoMarginBottom || 50, timbradoMarginLeft: response.data.timbradoMarginLeft || 50, timbradoMarginRight: response.data.timbradoMarginRight || 50, templatePadrao: response.data.templatePadrao || "", margensTemplate: { top: response.data.margensTemplate?.top || 35, bottom: response.data.margensTemplate?.bottom || 29, left: response.data.margensTemplate?.left || 25, right: response.data.margensTemplate?.right || 25, }, }); } } catch (error) { console.error("Erro ao carregar configurações:", error); toast.error("Erro ao carregar configurações"); } }; const handleFileUpload = async (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (!file) return; // Atualizado para aceitar PDF if ( !["image/png", "image/svg+xml", "application/pdf"].includes(file.type) ) { toast.error("Por favor, use apenas arquivos PDF, PNG ou SVG"); return; } if (file.size > 5 * 1024 * 1024) { // Aumentado para 5MB para acomodar PDFs toast.error("O arquivo deve ter no máximo 5MB"); return; } try { const formData = new FormData(); formData.append("timbrado", file); const response = await api.post("/documentos/upload-timbrado", formData); setConfig((prev) => ({ ...prev, timbradoUrl: response.data.url })); toast.success("Timbrado atualizado com sucesso"); } catch (error) { toast.error("Erro ao fazer upload do timbrado"); } }; const handleSave = async () => { try { setIsSaving(true); await api.post("/documentos/configuracoes", config); toast.success("Configurações salvas com sucesso"); } catch (error) { toast.error("Erro ao salvar configurações"); } finally { setIsSaving(false); } }; const handleEditorSetup = (editor: any) => { editor.ui.registry.addMenuButton("variables", { text: "Variáveis", fetch: (callback: Function) => { const items = Object.entries(DOCUMENT_VARIABLES).flatMap( ([category, vars]) => Object.entries(vars).map(([name, value]) => ({ type: "menuitem", text: `${category} - ${name.replace(/_/g, " ")}`, onAction: () => editor.insertContent(value as string), })), ); callback(items); }, }); }; // Modificar a configuração do TinyMCE para remover o plugin 'template' const editorConfig = { height: 400, menubar: true, plugins: [ "code", "preview", // Removido 'template' ], toolbar: "variables | undo redo | formatselect | " + "bold italic | alignleft aligncenter alignright | " + "code preview", setup: handleEditorSetup, }; return (

Configuração do Papel Timbrado

{/* Upload do Timbrado */}
{config.timbradoUrl && ( )}

Use arquivos PDF, PNG ou SVG. Tamanho máximo: 5MB

{/* Margens */}
setConfig((prev) => ({ ...prev, timbradoMarginTop: Number(e.target.value), })) } className="w-full p-2 border rounded" />
setConfig((prev) => ({ ...prev, timbradoMarginBottom: Number(e.target.value), })) } className="w-full p-2 border rounded" />
setConfig((prev) => ({ ...prev, timbradoMarginLeft: Number(e.target.value), })) } className="w-full p-2 border rounded" />
setConfig((prev) => ({ ...prev, timbradoMarginRight: Number(e.target.value), })) } className="w-full p-2 border rounded" />
{/* Template Padrão */}
setConfig((prev) => ({ ...prev, templatePadrao: content })) } init={editorConfig} />

Variáveis Disponíveis:

{Object.entries(DOCUMENT_VARIABLES).map(([category, vars]) => (
{category}
    {Object.entries(vars).map(([name, value]) => (
  • {value as string}
  • ))}
))}
{/* Margens do Template */}
setConfig((prev) => ({ ...prev, margensTemplate: { ...prev.margensTemplate, top: Number(e.target.value), }, })) } className="w-full p-2 border rounded" />
setConfig((prev) => ({ ...prev, margensTemplate: { ...prev.margensTemplate, bottom: Number(e.target.value), }, })) } className="w-full p-2 border rounded" />
setConfig((prev) => ({ ...prev, margensTemplate: { ...prev.margensTemplate, left: Number(e.target.value), }, })) } className="w-full p-2 border rounded" />
setConfig((prev) => ({ ...prev, margensTemplate: { ...prev.margensTemplate, right: Number(e.target.value), }, })) } className="w-full p-2 border rounded" />
{/* Modal de Preview */} setPreviewOpen(false)}>
); }