import React, { useState, useEffect, useRef, useCallback } from 'react'; import { FileSignature, Plus, Pencil, Copy, Trash2, X, Save, RefreshCw, Search, Tag, Library, FileText, Zap, Printer, Eye, ChevronLeft, CalendarClock, Send, PenLine, DollarSign, } from 'lucide-react'; import { HybridBackend } from '../services/backend.ts'; import { useToast } from '../contexts/ToastContext.tsx'; import { useConfirm } from '../contexts/ConfirmContext.tsx'; import { PageHeader } from '../components/PageHeader.tsx'; const COLOR = '#0d9488'; // teal interface Modelo { id: string; clinica_id: string | null; nome: string; categoria: string | null; tipo_relacao: string | null; corpo: string; variaveis: string[]; vigencia_dias: number | null; global: boolean; } interface Variavel { chave: string; desc: string; } const CAT_LABEL: Record = { servico: 'Serviço', locacao: 'Locação', parceria: 'Parceria', remuneracao: 'Remuneração', }; const CAT_STYLE: Record = { servico: 'bg-blue-100 text-blue-700', locacao: 'bg-amber-100 text-amber-700', parceria: 'bg-violet-100 text-violet-700', remuneracao: 'bg-emerald-100 text-emerald-700', }; const inputCls = 'w-full px-3 py-2.5 bg-gray-50 border border-gray-200 rounded-xl text-sm font-medium text-gray-700 outline-none focus:border-teal-400 focus:bg-white transition-colors'; const labelCls = 'text-[11px] font-bold text-gray-500 mb-1.5 block'; // ─── Editor de modelo ───────────────────────────────────────────────────────── const ModeloEditor: React.FC<{ modelo: Modelo | null; variaveis: Variavel[]; onClose: () => void; onSaved: () => void }> = ({ modelo, variaveis, onClose, onSaved }) => { const toast = useToast(); const [f, setF] = useState({ id: modelo?.id, nome: modelo?.nome || '', categoria: modelo?.categoria || 'servico', tipo_relacao: modelo?.tipo_relacao || '', corpo: modelo?.corpo || '', vigencia_dias: modelo?.vigencia_dias ?? '', }); const [saving, setSaving] = useState(false); const corpoRef = useRef(null); const inserirVar = (chave: string) => { const ta = corpoRef.current; if (!ta) { setF(p => ({ ...p, corpo: p.corpo + chave })); return; } const start = ta.selectionStart, end = ta.selectionEnd; const novo = f.corpo.slice(0, start) + chave + f.corpo.slice(end); setF(p => ({ ...p, corpo: novo })); requestAnimationFrame(() => { ta.focus(); ta.selectionStart = ta.selectionEnd = start + chave.length; }); }; const salvar = async () => { if (!f.nome.trim() || !f.corpo.trim()) { toast.error('NOME E CORPO SÃO OBRIGATÓRIOS.'); return; } setSaving(true); try { await HybridBackend.saveContratoModelo({ id: f.id, nome: f.nome, categoria: f.categoria, tipo_relacao: f.tipo_relacao || null, corpo: f.corpo, vigencia_dias: f.vigencia_dias === '' ? null : Number(f.vigencia_dias), }); toast.success('MODELO SALVO!'); onSaved(); onClose(); } catch (e: any) { toast.error((e.message || 'ERRO AO SALVAR').toUpperCase()); } finally { setSaving(false); } }; return (

{f.id ? 'Editar modelo' : 'Novo modelo de contrato'}

setF(p => ({ ...p, nome: e.target.value }))} placeholder="Ex.: Locação de sala mensal" />
setF(p => ({ ...p, tipo_relacao: e.target.value }))} placeholder="Ex.: dentista-clinica" />
setF(p => ({ ...p, vigencia_dias: e.target.value }))} placeholder="Ex.: 365" />