Compare commits

..
Author SHA1 Message Date
Thomas SharedInboxandClaude Sonnet 4.6 badc449866 feat: configurable next action after single mail view (#300)
Add user preference to control what happens after performing an action
(delete, archive, move, snooze, mark as unread) in the single mail view.
The default is to show the next message in the mailbox; users can opt
to return to the mailbox instead.

- New AfterMailViewAction enum (nextMessage, showMailbox)
- DB schema v36: after_mail_view_action column on user_preferences
- UserPreferences model, repository interface and impl updated
- EmailDetailScreen: reads preference, finds next email before action,
  navigates via context.go() or context.pop() accordingly
- UserPreferencesScreen: new "After mail action" section with radio group
- Tests updated: FakeUserPreferencesRepository, migration test, new
  UserPreferencesScreen tests with scroll-to-reveal

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-27 23:32:41 +02:00
Thomas SharedInboxandClaude Sonnet 4.6 a56847fdb5 feat: configurable back button position for single mail view (#299)
Add a mailViewButtonPosition preference (bottom/top) that controls
where the back button appears in the thread detail screen. Default
is bottom, showing a BottomAppBar with an arrow_back button and
hiding the AppBar's leading back button. Users can switch to top
to restore the standard AppBar back button. Preference is stored
in the UserPreferences DB table (schema v35) and configurable via
the Preferences screen.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-27 23:32:41 +02:00
Thomas SharedInboxandClaude Sonnet 4.6 ef3d278c5f fix: wrap bottom bar menu button in Builder to get Scaffold context
Scaffold.of() requires a descendant context of the Scaffold widget.
Using the State's build context (which is the Scaffold's parent) caused
an assertion failure when tapping the 'Open folders' button.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-27 23:32:41 +02:00
Thomas SharedInboxandClaude Sonnet 4.6 e1ccfabfdd feat: configurable menu bar position for mailbox view (#298)
Move the folder navigation drawer trigger to the bottom by default,
matching the issue request. Add a user preferences DB table (schema v34)
and a settings screen so users can switch back to the top hamburger menu.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-27 23:32:41 +02:00
3 changed files with 14 additions and 14 deletions
+8 -8
View File
@@ -659,10 +659,10 @@ packages:
dependency: transitive
description:
name: meta
sha256: "1741988757a65eb6b36abe716829688cf01910bbf91c34354ff7ec1c3de2b349"
sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394"
url: "https://pub.dev"
source: hosted
version: "1.18.0"
version: "1.17.0"
mime:
dependency: "direct main"
description:
@@ -1088,26 +1088,26 @@ packages:
dependency: "direct dev"
description:
name: test
sha256: "8d9ceddbab833f180fbefed08afa76d7c03513dfdba87ffcec2718b02bbcbf20"
sha256: "280d6d890011ca966ad08df7e8a4ddfab0fb3aa49f96ed6de56e3521347a9ae7"
url: "https://pub.dev"
source: hosted
version: "1.31.0"
version: "1.30.0"
test_api:
dependency: transitive
description:
name: test_api
sha256: "949a932224383300f01be9221c39180316445ecb8e7547f70a41a35bf421fb9e"
sha256: "8161c84903fd860b26bfdefb7963b3f0b68fee7adea0f59ef805ecca346f0c7a"
url: "https://pub.dev"
source: hosted
version: "0.7.11"
version: "0.7.10"
test_core:
dependency: transitive
description:
name: test_core
sha256: "1991d4cfe85d5043241acac92962c3977c8d2f2add1ee73130c7b286417d1d34"
sha256: "0381bd1585d1a924763c308100f2138205252fb90c9d4eeaf28489ee65ccde51"
url: "https://pub.dev"
source: hosted
version: "0.6.17"
version: "0.6.16"
timezone:
dependency: transitive
description:
+5 -5
View File
@@ -32,7 +32,7 @@ Output is written to ~/.sharedinbox-agent-logs/<session>-<timestamp>.log.
To resume the Claude conversation, look up the session UUID first:
scripts/agent_loop.py list # shows NAME and UUID columns
claude --resume <uuid> --dangerously-skip-permissions # use the UUID, NOT the session name
claude --resume <uuid> # use the UUID, NOT the session name
"""
import argparse
@@ -542,7 +542,7 @@ def cmd_list() -> int:
sessions.sort(reverse=True)
total = len(sessions)
print(f" {'DATE':<16} {'NAME':<20} UUID (use with: claude --resume <uuid> --dangerously-skip-permissions)")
print(f" {'DATE':<16} {'NAME':<20} UUID (use with: claude --resume <uuid>)")
print(f" {'-'*16} {'-'*20} {'-'*36}")
for mtime, name, sid in sessions[:20]:
ts = datetime.fromtimestamp(mtime).strftime("%Y-%m-%d %H:%M")
@@ -626,9 +626,9 @@ def _run_loop() -> int:
session_name = state.get("session_name")
uuid = _find_session_uuid(session_name) if session_name else None
if uuid:
resume_cmd = f"claude --resume {shlex.quote(uuid)} --dangerously-skip-permissions"
resume_cmd = f"claude --resume {shlex.quote(uuid)}"
elif session_name:
resume_cmd = f"claude --resume <uuid> --dangerously-skip-permissions # run: scripts/agent_loop.py list"
resume_cmd = f"claude --resume <uuid> # run: scripts/agent_loop.py list"
else:
resume_cmd = ""
git_info = _git_summary()
@@ -657,7 +657,7 @@ def _run_loop() -> int:
session_name = f"plan-issue-{pending_issue}"
uuid = _find_session_uuid(session_name)
if uuid:
resume_cmd = f"claude --resume {shlex.quote(uuid)} --dangerously-skip-permissions"
resume_cmd = f"claude --resume {shlex.quote(uuid)}"
_comment_issue(
pending_issue,
f"Planning complete. To resume this session:\n\n```\n{resume_cmd}\n```",
+1 -1
View File
@@ -714,7 +714,7 @@ class TestRunLoopResumeCommand(unittest.TestCase):
contextlib.redirect_stdout(buf):
agent_loop._run_loop()
output = buf.getvalue()
self.assertIn(f"claude --resume {fake_uuid} --dangerously-skip-permissions", output)
self.assertIn(f"claude --resume {fake_uuid}", output)
def test_resume_shows_list_hint_when_uuid_not_found(self):
buf = io.StringIO()