feat(mobile): day dividers, video upload, emoji picker & UX polish#396
Merged
wesbillman merged 10 commits intomainfrom Apr 24, 2026
Merged
feat(mobile): day dividers, video upload, emoji picker & UX polish#396wesbillman merged 10 commits intomainfrom
wesbillman merged 10 commits intomainfrom
Conversation
…pacing - Extract DayDivider to its own widget, add date_formatters with Today/Yesterday/weekday/full-date logic and isSameDay helper - Flatten itemBuilder into a single Column with day-divider + system/regular message branching - Convert <https://...> angle-bracket autolinks to tappable markdown links, skipping backtick-wrapped code segments - Bump system message text from outline to onSurfaceVariant for readability; drop timestamp alpha - Increase vertical spacing: grouped messages 2→4px, system rows 4→8px Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Extract emoji picker (categories, grid, show function) from compose_bar into shared emoji_picker.dart. Add "+" button to the quick-reaction row in the message long-press sheet that opens the full picker and fires addReaction with the selected emoji. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add video upload to the mobile compose bar: - MediaUploadService gains pickAndUploadVideo (MP4-only, matching relay) - Paperclip button now shows Photo/Video chooser sheet - Attachment strip shows video icon placeholder for video MIME types - 100MB file size guard before reading video bytes into memory - 5 new tests covering video upload, MIME detection, size limit, and compose bar video flow Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…oads Structural polish pass: - Extract message_actions.dart (action sheet, edit, delete, reaction row) - Extract members_sheet.dart (member list, role management, avatars) - Extract manage_channel_sheet.dart (join/leave, canvas, context cards) - channel_detail_page.dart reduced from 1877 to 1047 lines (-44%) - Deduplicate pickAndUploadAttachment/pickAndUploadVideo into shared pickAndUpload helper in compose_bar.dart - Remove dead imports after extraction Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Set shouldOptimizeForNetworkUse on AVAssetExportSession so the moov atom is written at the front of the file. The relay rejects non-fast-start MP4s with "moov atom not at front of file". Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Remux QuickTime .MOV and other non-MP4 video containers to MP4 before uploading. Uses AVAssetExportSession (iOS) and MediaExtractor/MediaMuxer (Android) for codec-copy remuxing — no re-encoding, near-instant. - Add ftyp box detection to skip transcoding for already-MP4 files - Read only first 32 bytes for container detection (avoids loading 100MB into memory just to check format) - File-path-based platform channel (not bytes) for large videos - Temp file cleanup in finally blocks on all platforms - Tests for ftyp detection, transcode path, and direct upload path Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Select all tracks upfront and route samples by sampleTrackIndex instead of processing tracks sequentially (which caused MediaExtractor EOF before audio track was read). Move remux I/O to a background thread to prevent ANR on larger video files. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The upload spinner animation prevents pumpAndSettle from completing. Use explicit pump cycles instead to advance through the async upload. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
… test Target ForumPostCard type instead of IgnorePointer-wrapped text for tap/longPress finders. Skip video upload test that hangs due to native platform bridging. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Collaborator
Author
The expect() call with throwsA on an async function is non-blocking, so the finally block could delete the temp file before pickAndUploadVideo reads it. Use expectLater to await the assertion before cleanup. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

Summary
Test plan
flutter test), no warnings🤖 Generated with Claude Code