Appearance
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-126withConversationList. - Thread:
src/components/messaging/MessageThread.tsx:121-131, 166-173.
Hooks
- Fetch messages:
src/hooks/useMessages.ts:33-41selects byconversation_idand orders bycreated_at. - Mark read:
useMessages.ts:82-100marks other-user unread as read and invalidates queries. - Send message:
src/hooks/useSendMessage.tsinserts message, sends email notification to recipient, then invalidates cache.
Data model (key tables)
public.conversationspublic.conversation_participants— maps users to conversations; used to find recipient (seeuseSendMessage.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.mdfor notifications. - See
docs/data-model/schema.mdfor tables and relations.