import React, { useState, useEffect, useCallback, useRef } from 'react'; import { Search, X, Star, Check, ShieldCheck, UserPlus, Building2 } from 'lucide-react'; import { HybridBackend } from '../services/backend.ts'; import { useToast } from '../contexts/ToastContext.tsx'; // Seletor de protético em modal: busca por nome/e-mail, favorito (★), padrão (pré-selecionado) // e "adicionar por e-mail" (vincula como interno — resolve o protético que não está no diretório). export const ProteticoPicker: React.FC<{ value: string; onChange: (id: string, lab?: any) => void; className?: string }> = ({ value, onChange, className }) => { const toast = useToast(); const [open, setOpen] = useState(false); const [labs, setLabs] = useState([]); const [busca, setBusca] = useState(''); const [addEmail, setAddEmail] = useState(''); const [showAdd, setShowAdd] = useState(false); const [busy, setBusy] = useState(false); const preselected = useRef(false); const carregar = useCallback(async (): Promise => { try { const r = await HybridBackend.getProteseLaboratorios(); const arr = Array.isArray(r) ? r : []; setLabs(arr); return arr; } catch { setLabs([]); return []; } }, []); useEffect(() => { carregar(); }, [carregar]); // Pré-seleciona o protético PADRÃO uma única vez, quando nada foi escolhido ainda. useEffect(() => { if (preselected.current || value) return; const pad = labs.find(l => l.padrao); if (pad) { preselected.current = true; onChange(pad.id, pad); } }, [labs, value]); // eslint-disable-line react-hooks/exhaustive-deps const sel = labs.find(l => l.id === value); const q = busca.toLowerCase(); const filtrados = labs.filter(l => !q || (l.nome || '').toLowerCase().includes(q) || (l.email || '').toLowerCase().includes(q)); const toggleFav = async (l: any, e: React.MouseEvent) => { e.stopPropagation(); try { await HybridBackend.setProteticoPref(l.id, { favorito: !l.favorito }); await carregar(); } catch { toast.error('ERRO'); } }; const tornarPadrao = async (l: any, e: React.MouseEvent) => { e.stopPropagation(); try { await HybridBackend.setProteticoPref(l.id, { padrao: !l.padrao }); await carregar(); toast.success(l.padrao ? 'PADRÃO REMOVIDO.' : 'DEFINIDO COMO PADRÃO.'); } catch { toast.error('ERRO'); } }; const selecionar = (l: any) => { onChange(l.id, l); setOpen(false); setBusca(''); }; const adicionar = async () => { if (!addEmail.trim()) return; setBusy(true); try { const r = await HybridBackend.vincularProteticoEmail(addEmail.trim()); if (r?.error) throw new Error(r.error); toast.success('PROTÉTICO VINCULADO.'); setAddEmail(''); setShowAdd(false); const novos = await carregar(); const novo = novos.find((x: any) => x.id === r.protetico?.id); if (novo) selecionar(novo); } catch (e: any) { toast.error((e.message || 'ERRO').toUpperCase()); } finally { setBusy(false); } }; return ( <> {open && (
setOpen(false)}>
e.stopPropagation()}>

Escolher protético

setBusca(e.target.value)} placeholder="Buscar por nome ou e-mail…" className="w-full pl-9 pr-3 py-2.5 rounded-xl border border-gray-200 text-sm outline-none focus:border-teal-400" />
{filtrados.length === 0 ? (

Nenhum protético encontrado.

) : filtrados.map(l => (
selecionar(l)} className={`flex items-center gap-2 px-3 py-2.5 rounded-xl cursor-pointer ${l.id === value ? 'bg-teal-50 border border-teal-200' : 'hover:bg-gray-50'}`}>

{l.nome}{l.verificado && }

{l.interno ? 'Interno' : 'Diretório'} {l.nota != null && · ★ {l.nota}} {l.padrao && · Padrão}

{l.id === value && }
))}
{showAdd ? (
setAddEmail(e.target.value)} type="email" placeholder="e-mail do protético" className="flex-1 px-3 py-2 rounded-lg border border-gray-200 text-sm outline-none focus:border-teal-400" />
) : ( )}
)} ); };