- Added UndoService with 10-action history stack.
- Integrated Undo Snackbar into EmailListScreen and EmailDetailScreen.
- Added EmailRepository.cancelPendingChange to optimize undo by removing
unsynced local mutations.
- Fixed sorting bug in compareMailboxes for unknown roles.
- Increased unit coverage to 83% with new model and utility tests.
- Verified with full test suite (task check).
Email detail screen now renders the message htmlBody with the flutter_html
widget when present, falling back to SelectableText for plain-text-only mail.
Remote http(s) images are blocked by default to defeat tracking pixels; an
opt-in "Load remote images" button reveals them per-screen.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Reply and reply-all now prefill the compose body with the original message
quoted as plain text (> lines). New Forward button sets Fwd: subject and
the same quoted body, leaving To/Cc empty for the user to fill.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Added mark_email_unread_outlined icon to the toolbar. Calls setFlag(seen:false)
then pops back to the list so the email reappears as unread.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Added lint rule to analysis_options.yaml and ran dart fix --apply to convert
125 relative imports in 33 files to package:sharedinbox/... style.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Fix BODY[] → BODY.PEEK[] for body and attachment fetches so opening an
email does not silently set \Seen as an IMAP side-effect
- deleteEmail now moves to Trash (if a trash-role mailbox exists) instead
of hard-deleting with UID EXPUNGE; falls back to EXPUNGE only when
already in Trash or no Trash folder is found
- Add confirmation dialogs to all three delete entry-points: detail-view
delete button, batch-delete in list view, and swipe-to-delete
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Use xdg-open directly on Linux for opening attachments (fixes 'file type not supported' error)
- Add mime package for comprehensive MIME type detection in compose screen
- Show file size and MIME type for attachments in compose screen
- Add open/preview button for attachments in compose screen
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
- Add file_picker and open_file dependencies
- EmailDraft gains attachmentFilePaths; EmailAttachment gains fetchPartId
- sendEmail attaches files via MessageBuilder.addFile()
- downloadAttachment fetches the specific MIME part from IMAP, caches to
local filesystem; subsequent calls return the cached file without a
network round-trip
- ComposeScreen: attach-file button + removable attachment list
- EmailDetailScreen: per-attachment download/open button with spinner
- 3 new unit tests covering send-with-attachment, download, and cache hit
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- email_detail: add Move-to-folder button (bottom-sheet mailbox picker,
excludes current folder, calls moveEmail on server)
- email_list: show amber star for flagged, paperclip for attachments
in trailing area alongside date
- PLAN.md: mark phase 8 done
- README: add flag/move/attachment to working features
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- compose_screen: show From dropdown when >1 account, auto-select first
account when none pre-selected (fixes silent failure on new mail)
- email_detail_screen: add flag/unflag star button with amber highlight
- PLAN.md: collapse completed phases, list remaining UI gaps
- README: fix stale "vendored" package reference, update platform table,
add Working Features section
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
IMAP/SMTP email client with offline-first architecture:
sync engine writes to Drift (SQLite), UI reads reactively
from the local DB. enough_mail vendored under packages/.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>