Skip to main content
Glama
useChat.ts•3.58 kB
import { useState, useEffect } from 'react' import { supabase } from '../lib/supabase' import type { Tables, InsertDto } from '../lib/supabase' type ChatMessage = Tables<'chat_messages'> export function useChat(tenantId: string) { const [messages, setMessages] = useState<ChatMessage[]>([]) const [loading, setLoading] = useState(true) const [error, setError] = useState<string | null>(null) // Fetch initial messages useEffect(() => { fetchMessages() }, [tenantId]) // Subscribe to real-time updates useEffect(() => { const subscription = supabase .channel('chat_messages') .on( 'postgres_changes', { event: '*', schema: 'public', table: 'chat_messages', filter: `tenant_id=eq.${tenantId}` }, (payload) => { if (payload.eventType === 'INSERT') { setMessages(prev => [...prev, payload.new as ChatMessage]) } else if (payload.eventType === 'UPDATE') { setMessages(prev => prev.map(msg => msg.id === payload.new.id ? payload.new as ChatMessage : msg ) ) } else if (payload.eventType === 'DELETE') { setMessages(prev => prev.filter(msg => msg.id !== payload.old.id) ) } } ) .subscribe() return () => { subscription.unsubscribe() } }, [tenantId]) const fetchMessages = async () => { try { setLoading(true) const { data, error } = await supabase .from('chat_messages') .select('*') .eq('tenant_id', tenantId) .order('created_at', { ascending: true }) if (error) { setError(error.message) return } setMessages(data || []) } catch (err) { setError('Failed to fetch messages') } finally { setLoading(false) } } const sendMessage = async (message: string, userId: string, context?: any) => { try { const newMessage: InsertDto<'chat_messages'> = { user_id: userId, tenant_id: tenantId, message, context, message_type: 'text', status: 'sent' } const { data, error } = await supabase .from('chat_messages') .insert(newMessage) .select() .single() if (error) { setError(error.message) return { error } } return { data } } catch (err) { setError('Failed to send message') return { error: err } } } const updateMessageStatus = async (messageId: string, status: 'sent' | 'delivered' | 'read') => { try { const { error } = await supabase .from('chat_messages') .update({ status }) .eq('id', messageId) if (error) { setError(error.message) return { error } } return { success: true } } catch (err) { setError('Failed to update message status') return { error: err } } } const deleteMessage = async (messageId: string) => { try { const { error } = await supabase .from('chat_messages') .delete() .eq('id', messageId) if (error) { setError(error.message) return { error } } return { success: true } } catch (err) { setError('Failed to delete message') return { error: err } } } return { messages, loading, error, sendMessage, updateMessageStatus, deleteMessage, refetch: fetchMessages } }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/ChiragPatankar/MCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server