1 Inbox
2 Chat Thread
3 Special States
Section 1 — Inbox
Conversations List POSTER
9:41
All
Unread
Active Jobs
MH
Martinez Home Services 2m ago
We can start the kitchen remodel next Monday...
Kitchen Remodel
3
OP
Ohio Premier Plumbing 1h ago
The bathroom fixtures have been ordered and should...
Bathroom Renovation
AL
Akron Landscape Co 3h ago
I've attached the updated layout for your backyard...
Backyard Landscaping
1
SR
Summit Roofing LLC Yesterday
Thanks for the review! Let us know if you need...
Roof Repair
CE
Cuyahoga Electric Feb 20
The panel upgrade is complete. Please check and...
Electrical Panel
PosterMessages screen. Uses useQuery(api.poster.jobs.getMyJobs) and useQuery(api.messaging.messages.getUnreadCount). Filter tabs, SearchBar, ConversationItem cards with Avatar, unread badges, job tags.
Empty State POSTER
9:41

No Messages Yet

Messages will appear here when you connect with contractors on your jobs.

EmptyState with IconCircle style C (hero), deepBlue CTA. Shown when jobsWithContractors.length === 0.
Conversations List CONTRACTOR
9:41
All
DMs
Q&A
4 conversations · 2 unread
JW
James Wilson 5m ago
Hi, I'd like to discuss the timeline for the deck...
Deck Construction DM
2
SP
Sarah Parker 20m ago
What type of materials do you use for the siding?
Siding Replacement Q&A
1
RM
Rachel Miller 2h ago
Perfect, see you tomorrow at 9am for the inspection.
HVAC Installation DM
TK
Tom Kennedy Yesterday
Thanks for the great work on the basement finish!
Basement Finishing DM
ContractorMessagesScreen. Uses useQuery(api.contractor.messages.listUnifiedInbox). Terracotta header, DM/Q&A type badges, AI Chat button, filter pills (All/DMs/Q&A), unread counts.
Section 2 — Chat Thread
Chat Thread POSTER
9:41
MH
Martinez Home Services
Kitchen Remodel · Akron, OH
Kitchen Remodel — Full Renovation In Progress
Today
MH
Hi Sarah! I wanted to let you know the cabinets arrived this morning. We're on track to begin installation tomorrow.
MH
Here's a photo of the cabinets unpacked and ready to go.
That's great news! They look perfect. Will you need me to clear the countertops before you start?
MH
Yes, if you could clear the countertops by tonight, we can start at 8am sharp. The crew will handle everything else.
Contract signed by both parties
Done! Countertops are cleared. See you at 8am.
Type a message...
PosterConversationScreen. Uses useQuery(api.messaging.messages.listForJob), useMutation(api.messaging.messages.send). DeepBlue sent bubbles, Avatar+online dot, job context bar, system pill, read receipts.
Chat Thread CONTRACTOR
9:41
JW
James Wilson
Deck Construction · Cuyahoga Falls, OH
Deck Construction — Composite Deck Open
Yesterday
JW
Hi, I saw your bid and I'm really interested. Can you tell me more about the materials you'd use?
Bid Estimate
$8,450
Composite deck, 400 sq ft, Trex Select, includes railing and stairs
Today
JW
That looks great! When would you be available to come take measurements?
Site Visit Scheduled
I can come by Wednesday, Feb 26 at 10:00 AM to take measurements and finalize the details.
JW
Wednesday works perfectly. See you then!
Type a message...
ContractorConversationScreen. Terracotta sent bubbles, quote/bid card (special formatted message with amount), scheduling message with calendar icon, IconCircle style D for attachment.
Attachments & Actions POSTER
9:41
Today
MH
Let me know if you need anything else before we start.
Camera
Photo Library
Document
Send Quote
Schedule Visit
Location
Bottom sheet overlay triggered by attachment button. Uses IconCircle styles C, I, A, H, J, K for each action type. Camera and Photo Library use expo-image-picker.
Section 3 — Special States
AI Assistant POSTER
9:41
MH
Martinez Home Services
Kitchen Remodel · In Progress
3Bids AI Assistant is available to help
3Bids Assistant
Hi Sarah! I'm the 3Bids AI assistant. I can help you with scheduling, project FAQs, and communication with your contractor. What can I help you with?
This is an automated response
When is my contractor scheduled to arrive today?
3Bids Assistant
Based on your project schedule, Martinez Home Services is scheduled to arrive at 8:00 AM today for cabinet installation. They typically work until 4:00 PM. Would you like me to send them a reminder?
This is an automated response
Yes, send a reminder
What's the project timeline?
Message my contractor
Ask the AI assistant...
AI messages use MessageBubble with distinct ai style (lightInfo bg), IconCircle style K (robot icon). Quick reply chips below AI messages. Disclaimer text on every AI response. Uses api.ai.chat endpoint.
Typing & Notifications CONTRACTOR
9:41
3Bids
Rachel Miller
Just sent you a photo of the furnace. Can you take a look?
now
JW
James Wilson
Deck Construction
Today
I'll bring the composite samples so you can see the color options in person.
Read 8:47 AM
Also, did you want to add lighting to the deck? I can include it in the final quote.
Delivered
JW
Message Status Icons
Delivered
Delivered (double check)
Read
Type a message...
TypingIndicator component (3 animated dots). Push notification preview overlay at top. Read receipt states: single check (delivered), double check gray (delivered), double check blue (read). Uses Convex real-time subscriptions for live updates.

Data Architecture

Schema: messages

messages: defineTable({ jobId: v.id("jobs"), senderId: v.string(), // posterUsers | contractorUsers | adminUsers ID senderType: v.string(), // "poster" | "contractor" | "admin" receiverId: v.string(), receiverType: v.string(), content: v.string(), isRead: v.boolean(), isDeleted: v.optional(v.boolean()), attachmentUrl: v.optional(v.string()), attachmentName: v.optional(v.string()), editedAt: v.optional(v.number()), createdAt: v.number(), }) .index("by_job_id", ["jobId"]) .index("by_receiver_unread", ["receiverId", "isRead"])

Real-Time: Convex Subscriptions

// Messages update in real-time via Convex reactive queries. // useQuery() auto-subscribes to changes on the messages table. // When a new message is inserted, all subscribed clients // receive the update instantly — no polling needed.

Hooks & Queries

// Poster useQuery(api.poster.jobs.getMyJobs) // Inbox: jobs with contractors useQuery(api.messaging.messages.getUnreadCount) // Unread badge count useQuery(api.messaging.messages.listForJob) // Thread: messages for a job // Contractor useQuery(api.contractor.messages.listUnifiedInbox) // Unified DM + Q&A inbox useQuery(api.messaging.messages.listForJob) // Thread: messages for a job // Shared useMutation(api.messaging.messages.send) // Send a message useMutation(api.messaging.messages.markRead) // Mark conversation as read useMutation(api.features.storage.generateUploadUrl) // File upload URL

Components

components/messaging/ MessageBubble.tsx // Sent/received/system bubble with read receipts MessageInput.tsx // Input bar with attachment, quick replies, send ConversationHeader.tsx // Chat header with avatar, job context, actions ConversationItem.tsx // Inbox list card with unread badge, preview DateSeparator.tsx // "Today", "Yesterday" date dividers TypingIndicator.tsx // Animated 3-dot typing indicator index.ts // Barrel exports

Message Types

text Standard text message image Photo attachment (via expo-image-picker) video Video attachment (max 60s) document File attachment quote Bid/estimate card (structured: amount + description) system "Contract signed", "Payment received" etc. ai_response AI assistant response (distinct styling)

Screens

app/(poster)/messages/index.tsx // Poster inbox app/(poster)/messages/[id].tsx // Poster chat thread app/(contractor)/(tabs)/messages/index.tsx // Contractor unified inbox app/(contractor)/(tabs)/messages/[id].tsx // Contractor chat thread app/messages/[jobId].tsx // Shared job chat (generic)
Inbox & Threads
9:41
Inbox & Threads
Conversations
Jennifer Adams
Thanks for the estimate! When can you start?
2m
Robert Chen
Can we reschedule to Thursday?
1h
Maria Lopez
Photos attached of the basement
3h
Active Chat — Jennifer Adams
JA
Thanks for the estimate! When can you start?
MK
We can start next Monday. I'll send over the contract.
Type a message...
Chat & Actions
9:41
Chat & Actions
Quick Actions
Send Estimate
Share pricing with homeowner
Schedule Visit
Book consultation time
Share Photos
Send project photos
Conversation Preview
Detailed view with all project information, photos, and metadata.
Notification Preferences
Push notifications
Email digest
Sound alerts
Messaging Center
https://app.3bids.io/contractor/messages
3Bids
Inbox ⌘1
Contacts ⌘2
Templates ⌘3
Archived ⌘4
Analytics ⌘5
Settings ⌘6
MK
Mike Kowalski
Contractor
Settings ⌘,

Messaging Center

47
Active
+12
Today
2.4m
Avg Reply
98%
Response
Recent Messages
Jennifer Adams replied
2 minutes ago
Robert Chen sent photos
15 minutes ago
Maria Lopez read estimate
1 hour ago
Response Times