link,[object Object]
Skip to content

Messaging System ​

Purpose: Describe buyer–seller messaging, limits, and data flow. Audience: Product, Developer Prerequisites: Authenticated user; conversations exist.

Overview

  • Conversations and messages tables power threaded messaging.
  • UI: Conversation list and message thread.

Core screens

  • Conversations: src/pages/Messages.tsx:85-94, 116-126 with ConversationList.
  • Thread: src/components/messaging/MessageThread.tsx:121-131, 166-173.

Hooks

  • Fetch messages: src/hooks/useMessages.ts:33-41 selects by conversation_id and orders by created_at.
  • Mark read: useMessages.ts:82-100 marks other-user unread as read and invalidates queries.
  • Send message: src/hooks/useSendMessage.ts inserts message, sends email notification to recipient, then invalidates cache.

Data model (key tables)

  • public.conversations
  • public.conversation_participants — maps users to conversations; used to find recipient (see useSendMessage.ts:129-138).
  • public.messages — conversation_id, sender_id, content, read, created_at.

Limits

  • Starter: 5 messages/day; Pro: unlimited. Enforcement via feature usage and UI warnings (see MessageLimitWarning.tsx).

Example

ts
// Send from MessageThread
sendMessage({ conversationId, content });
// On success, refresh thread and list
queryClient.invalidateQueries({ queryKey: ['messages', conversationId] });
queryClient.invalidateQueries({ queryKey: ['conversations', user?.id] });

Next steps

  • See docs/features/notifications.md for notifications.
  • See docs/data-model/schema.md for tables and relations.