- Send and receive messages in real time
- Display messages in correct order
- Show message status (sending, sent, failed)
- Handle loading and reconnection
- Maintain smooth scrolling experience
- How do you handle real-time updates?
- What happens if messages arrive out of order?
- How do you handle offline users?
- How do you optimize rendering for large chats?
- How do you handle retries on failure?
- UI Layer
- Communication Layer
- State Management
- Message Lifecycle
- Caching / Persistence
- Performance
- Edge Cases
- Chat list (messages)
- Input box
- Send button
- Status indicators
- Messages aligned left/right (incoming/outgoing)
- Auto-scroll to latest message
- Preserve scroll when loading older messages
- Client requests new messages periodically
- Not efficient
- Persistent connection
- Server pushes messages in real time
- Client connects via WebSocket
- Server emits new messages
- Client updates UI instantly

- messages: array of chat messages
- sendingQueue: messages not yet confirmed
- connectionStatus: connected / disconnected
- loading: for older messages
- error: failed messages
- Separate server messages vs local temporary messages
id
text
senderId
timestamp
status (sending, sent, failed)

- User sends message
- Message added locally (optimistic update)
- UI shows "sending"
- Server acknowledges
- Update status → "sent"
- Show retry option
- Show message immediately without waiting for server
- Improves perceived performance
- Must handle failure cases

- Messages arriving out of order
- Duplicate messages
- Use timestamps or server sequence IDs
- Deduplicate using message IDs
- Always sort messages before rendering
- Keep messages in memory
- Store messages in localStorage / IndexedDB
- Load previous messages on reload
- Faster load
- Offline support
- Virtualized List: Render only visible messages
- Pagination: Load older messages on scroll up
- Batching Updates: Avoid frequent re-renders
- Memoization: Optimize message components
- Auto-scroll when new message arrives
- Do NOT auto-scroll if user is reading old messages
- Load older messages when scrolling up

- Failed message send
- Connection loss
- Retry mechanism
- Retry button
- Error indicator

- User sends message
- Add message locally (optimistic)
- Send via WebSocket
- Server responds
- Update message status
- New messages pushed from server
- UI updates
- Understanding of real-time systems
- Handling async flows
- Optimistic UI design
- State consistency
- Performance awareness












