feat: add MessageGroupBubble component (Phase 2)
Created unified renderer for MessageGroup objects from useMessageGroups hook.
Single component that handles all message types with clean type-based rendering.
Component Architecture:
- Consumes MessageGroup interface from Phase 1
- Single switch on group.type for rendering logic
- Reuses existing sub-components (no duplication):
* ReasoningToggle for reasoning blocks
* ToolCallItem for tool calls
* ExpandableMessageContent for text
* CompactionBar for compaction alerts
* OrphanedToolReturn for orphaned returns
- Same interaction props as MessageBubbleEnhanced (backward compatible)
Rendering Logic by Type:
- compaction: CompactionBar with hideability based on settings
- tool_return_orphaned: OrphanedToolReturn (defensive case)
- tool_call: ReasoningToggle (if present) + ToolCallItem with call + return
- user: Image gallery + ExpandableMessageContent in bubble
- assistant: ReasoningToggle (if present) + "(co said)" + content + copy button
Key Features:
- Reasoning always co-located with content (no separate FlatList items)
- Streaming indicator styling (opacity: 0.95) via group.isStreaming flag
- Proper spacing for last message (lastMessageNeedsSpace prop)
- Copy button with checkmark feedback
- Type-safe throughout
This component exists alongside MessageBubbleEnhanced (non-breaking).
Next phases will integrate it into ChatScreen and eventually deprecate the old component.
Phase 2 complete. Next: Phase 3 (ChatScreen integration).