/* |-------------------------------------------------------------------------- | AgĂȘncia PSI |-------------------------------------------------------------------------- | Arquivo: src/features/patients/composables/usePatientMessages.js | | Mensagens de conversa do paciente. Carrega 200 mais recentes (in+out) | pra alimentar o card "Ultimas mensagens" (Visao Geral, top 4) e os | KPIs da aba Conversas. Conversa completa fica no PatientConversationsTab. |-------------------------------------------------------------------------- */ import { ref, computed } from 'vue'; import { supabase } from '@/lib/supabase/client'; export function usePatientMessages() { const messages = ref([]); const loading = ref(false); const error = ref(''); async function load(patientId) { if (!patientId) { messages.value = []; return; } loading.value = true; error.value = ''; messages.value = []; try { const { data, error: err } = await supabase .from('conversation_messages') .select('id, body, direction, created_at, channel, kanban_status') .eq('patient_id', patientId) .order('created_at', { ascending: false }) .limit(200); if (err) throw err; messages.value = data || []; } catch (e) { error.value = e?.message || 'Falha ao carregar mensagens.'; messages.value = []; } finally { loading.value = false; } } const recentes = computed(() => messages.value.slice(0, 4)); const totalIn = computed(() => messages.value.filter((m) => m.direction === 'in' || m.direction === 'inbound').length ); const totalOut = computed(() => messages.value.filter((m) => m.direction === 'out' || m.direction === 'outbound').length ); const ultimaMensagem = computed(() => messages.value[0] || null); const primeiraMensagem = computed(() => messages.value[messages.value.length - 1] || null); /** * Canais unicos usados nas mensagens (whatsapp, sms, email). */ const canais = computed(() => { const set = new Set(); for (const m of messages.value) if (m.channel) set.add(m.channel); return [...set]; }); return { messages, loading, error, load, recentes, totalIn, totalOut, ultimaMensagem, primeiraMensagem, canais }; }