`}

Opções

{[ ['data-clinic','Slug da clínica (obrigatório)'], ['data-color','Cor do botão (hex, padrão: #00D4AA)'], ['data-position','"right" ou "left" (padrão: right)'], ['data-greeting','Texto do tooltip'], ['data-open','"true" para abrir automaticamente'], ].map(([a,d])=>)}
Atributo Descrição
{a} {d}

Página Dedicada

Sua clínica também tem uma página pública com chat integrado:

Abrir Página
; // Tab: Conversations (default) if(!convList.length)return
{['conversations','analytics','widget'].map(t=>)}
}/>
🌐Nenhuma conversa web ainda
; return
{['conversations','analytics','widget'].map(t=>)}
}/> {setSearch(e.target.value);setSel(0)}} style={{...S.input,maxWidth:'360px',padding:'8px 12px',fontSize:'12px',marginBottom:'10px'}}/>
{/* Conversation list */}
{convList.map((c,i)=>
setSel(i)} style={{padding:'12px 14px',borderBottom:'1px solid #f1f5f9',cursor:'pointer',background:i===sel?'#eef2ff':'#fff'}}>
{c.patient_name||'Visitante'}
{c.status==='active'?'Ativa':c.status==='transferred'?'Transf.':'Fechada'}
{c.patient_email||c.session_id?.substring(0,12)}
{fmt.ago(c.last_message_at||c.created_at)} · {c.message_count} msgs
{c.last_message?.substring(0,50)}
)}
{/* Chat messages */}
{conv&&
{conv.patient_name||'Visitante'} {conv.patient_email&&{conv.patient_email}}
{conv.message_count} msgs
{(conv.messages||[]).map(m=>
{m.role==='lira'&&
Lira
} {m.content}
{fmt.time(m.created_at)}
)}
🌐 Chat via {conv.session_id?.startsWith('ws_')?'página web':'widget'} · Iniciado {fmt.datetime(conv.created_at)}
}
; } // ==================== NOTIFICATION BELL ==================== function NotifBell({data,currentRole}){ const[open,setOpen]=useState(false); const notifs=useMemo(()=>{ const n=[]; const ts=data.todaySummary; const ins=data.insights; // Lira paused if(!data.liraActive)n.push({icon:'🔴',text:'Lira esta pausada',severity:'high',time:'agora'}); // Waitlist queue if(data.wlStats?.active>0)n.push({icon:'⏳',text:`${data.wlStats.active} paciente${data.wlStats.active>1?'s':''} na fila de espera`,severity:'medium',time:'ativo'}); // No-shows today (from insights) if(ins?.insights){ins.insights.filter(i=>i.severity==='high').forEach(i=>n.push({icon:'⚠️',text:i.title,severity:'high',time:i.detail?.substring(0,40)||''}))} // Upcoming appointments if(ts?.appointments_upcoming>0)n.push({icon:'📅',text:`${ts.appointments_upcoming} consulta${ts.appointments_upcoming>1?'s':''} restante${ts.appointments_upcoming>1?'s':''} hoje`,severity:'info',time:'hoje'}); // Health score warning if(data.healthScore?.score<60)n.push({icon:'💛',text:`Saude da clinica: ${data.healthScore.score}/100 (${data.healthScore.grade})`,severity:'medium',time:'30d'}); // Patients at risk if(data.retention?.at_risk?.count>0)n.push({icon:'👥',text:`${data.retention.at_risk.count} paciente${data.retention.at_risk.count>1?'s':''} sem contato 30+ dias`,severity:'medium',time:'risco'}); // Lifecycle notifications if(data.lifecycle?.follow_ups_overdue>0)n.push({icon:'📋',text:`${data.lifecycle.follow_ups_overdue} follow-up${data.lifecycle.follow_ups_overdue>1?'s':''} atrasado${data.lifecycle.follow_ups_overdue>1?'s':''}`,severity:'high',time:'acao'}); if(data.lifecycle?.inactive_patients>5)n.push({icon:'🔄',text:`${data.lifecycle.inactive_patients} pacientes inativos ha 90+ dias`,severity:'medium',time:'reativar'}); return n; },[data]); const urgentCount=notifs.filter(n=>n.severity==='high'||n.severity==='medium').length; const sevBg={high:'#fef2f2',medium:'#fefce8',info:'#f0f9ff'}; const sevBd={high:'#fca5a5',medium:'#fde047',info:'#bae6fd'}; return
setOpen(!open)} style={{display:'flex',alignItems:'center',gap:'8px',padding:'8px 14px',cursor:'pointer',borderRadius:'8px',background:open?'rgba(255,255,255,.1)':'transparent'}}> 🔔 Alertas {urgentCount>0&&{urgentCount}}
{open&&
Notificacoes ({notifs.length})
{notifs.length>0?notifs.map((n,i)=>
{n.icon}
{n.text}
{n.time}
):
Tudo tranquilo!
}
}
; } // ==================== MAIN APP ==================== function App(){ const[session,setSess]=useState(null); const[profile,setProf]=useState(null); const[selClinic,setSelC]=useState(null); const[loading,setLd]=useState(true); const[page,setPage]=useState('home'); const[mobileNav,setMobileNav]=useState(false); useEffect(()=>{ sb.auth.getSession().then(({data:{session}})=>{setSess(session);if(session)loadProf();setLd(false)}); const{data:{subscription}}=sb.auth.onAuthStateChange((_,s)=>{setSess(s);if(s)loadProf()}); return()=>subscription?.unsubscribe(); },[]); async function loadProf(){try{const{data,error}=await sb.rpc('get_dashboard_profile');if(error&&error.code!=='PGRST116')throw error;if(data&&!data.error){setProf(data);setSelC(data.clinic_id||null)}}catch(e){console.log('Prof err:',e.message)}} const[myClinics,setMC]=useState([]); useEffect(()=>{if(profile)sb.rpc('list_my_clinics').then(({data})=>{if(data?.clinics)setMC(data.clinics)})},[profile]); const effClinic=selClinic||(profile?.is_admin?null:profile?.clinic_id); const data=useData(effClinic); const currentRole=useMemo(()=>{ if(profile?.is_admin)return'admin'; if(!effClinic)return profile?.role||'user'; const m=myClinics.find(c=>c.id===effClinic); return m?.role||'user'; },[profile,effClinic,myClinics]); const logout=async()=>{await sb.auth.signOut();setSess(null);setProf(null)}; const showClinicSel=profile?.is_admin||myClinics.length>1; // Nav items per role const navItems=useMemo(()=>{ const base=[{id:'home',icon:'🏠',label:currentRole==='admin'?'Plataforma':currentRole==='doctor'?'Meu dia':currentRole==='staff'?'Recepcao':'Visao geral'}]; if(currentRole!=='admin'){ base.push({id:'agenda',icon:'📅',label:'Agenda'}); base.push({id:'conversations',icon:'💬',label:'Conversas'}); base.push({id:'webchat',icon:'🌐',label:'Chat Web'}); base.push({id:'waitlist',icon:'⏳',label:'Fila'}); if(['owner','doctor','staff'].includes(currentRole))base.push({id:'lifecycle',icon:'💚',label:'Acompanhamento'}); } if(['admin','owner'].includes(currentRole))base.push({id:'reports',icon:'📈',label:'Relatorios'}); if(['admin','owner'].includes(currentRole))base.push({id:'settings',icon:'⚙️',label:'Config'}); return base; },[currentRole]); if(!session||loading){if(!session)return;return} const navContent= {showClinicSel&&
}
{data.liraActive?'● Ativa':'○ Pausada'}
{data.liraActive?'Respondendo':'Ignorando'}
{navItems.map(item=>
{setPage(item.id);setMobileNav(false)}} style={{display:'flex',alignItems:'center',gap:'9px',padding:'10px 18px',cursor:'pointer',fontSize:'13px',fontWeight:page===item.id?'600':'400',color:page===item.id?'#fff':'#94a3b8',background:page===item.id?'rgba(37,211,102,.15)':'transparent',borderLeft:page===item.id?'3px solid #25D366':'3px solid transparent',transition:'all .15s'}}> {item.icon}{item.label}
)}
{/* Notifications */}
{profile?.name||session.user.email}
{currentRole==='admin'?'Admin Lira':currentRole==='owner'?'Dono':currentRole==='doctor'?'Medico':'Equipe'}
Sair
; // Determine home page component based on role const renderHome=()=>{ if(currentRole==='admin')return; if(currentRole==='doctor')return; if(currentRole==='staff')return; return; }; return
{/* Desktop sidebar */}
Lira
{navContent}
{/* Mobile header */}
Lira
{/* Mobile nav overlay */} {mobileNav&&
{if(e.target===e.currentTarget)setMobileNav(false)}}> {navContent}
} {/* Main content */}
{page==='home'&&renderHome()} {page==='agenda'&&} {page==='conversations'&&} {page==='webchat'&&} {page==='waitlist'&&} {page==='lifecycle'&&} {page==='reports'&&} {page==='settings'&&}
; } ReactDOM.createRoot(document.getElementById('root')).render();