Skip to content

fix(mobile): clearer schedule editor copy and one time zone style - #232

Merged
jayleaton merged 2 commits into
mainfrom
fix/schedules-mobile-editor-exit-20261113
Nov 13, 2026
Merged

jayleaton merged 2 commits into
mainfrom
fix/schedules-mobile-editor-exit-20261113

Conversation

@jayleaton

Copy link
Copy Markdown
Owner

Follow-up copy fixes from the #227 captures. The editor-exit bug (item 1) is not fixed here; see below.

  • Type row. The schedule type row was "Runs", which was easy to confuse with "Runs on" (machine) and "Runs go to" (destination). It's now Type, inside the Schedule section. "Runs on", "Runs go to" and "Run in" (workspace) are accurate and unchanged.
  • Next run. Runs within the coming week read "Next run Monday at 9:00 am" instead of "Next run next Monday at …". A run exactly a week out shares today's weekday, so it shows the date instead.
  • One zone style. The editor's Time row used the generic zone name ("Thailand Time", "PT"), while the list used the short name at the run time ("GMT+7", "PST"). scheduleTimeZoneLabel now always uses the short name, at the run time when there is one and now otherwise. Web and mobile both call it, so the editor and the list agree on both clients.

Not in this PR: the editor can't be left with unsaved changes

I couldn't find the cause by reading the code, and there's no iOS Simulator on this machine to test against, so I haven't shipped a guess. What I checked:

  • React Navigation's path works in principle. goBack() emits beforeRemove on the editor route, usePreventRemove calls preventDefault() and then the callback, and the callback calls Dialog.alert, which is native Alert.alert.
  • No other beforeRemove listener or usePreventRemove sits on that route.
  • The custom header honours headerBackVisible: false, and the guarded Back bar button calls navigation.goBack().

The only thing this editor does differently from the two other screens that guard removal (ThreadFilesRouteScreen, ZipArchiveView) is guardBack. That hides native Back, adds a JS bar button, and sets gestureEnabled: false. With the gesture off, an edge swipe can never ask anything. The iOS card stack already blocks a native dismiss for a prevented route and calls goBack() in onNativeDismissPrevented. So dropping guardBack for this screen is the first experiment to try on a device.

Verification

  • scheduledTaskTimeZone.test.ts: the updated assertion (generic name → short name) failed first, then passed. The web settings logic and browser tests and the mobile draft tests pass: 68 tests.
  • vp run check:changed passes all steps.

Captures still needed, from the MacBook at 390pt, light and dark:

  • the editor's Schedule section showing the Type row and its open menu;
  • the list with a run 2–6 days out ("Next run Monday at …");
  • the editor's Time row on an Asia/Bangkok server, showing GMT+7.

Implemented by Claude Opus 5.5 in Claude Code (T3 Code).

🤖 Generated with Claude Code

The schedule type row is "Type", next runs within the week read
"Next run Monday at …", and the editor's Time row names the zone the
same way as the list (GMT+7, PST) on web and mobile.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions github-actions Bot added vouch:trusted Author is trusted by repo permissions or the VOUCHED list. size:S labels Nov 13, 2026
@github-actions

github-actions Bot commented Nov 13, 2026 •

Copy link
Copy Markdown

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

Provider Metric Main baseline This PR Impact PR ceiling
Codex Total thread wire 5.0 KiB 5.0 KiB 0 B (0.0%) 6.8 KiB ✅
Codex Thread snapshot wire 3.8 KiB 3.8 KiB 0 B (0.0%) 4.9 KiB ✅
Codex Live turn WebSocket wire 1.2 KiB 1.2 KiB 0 B (0.0%) 2.0 KiB ✅
Codex Live turn WebSocket decoded 21.5 KiB 21.5 KiB 0 B (0.0%) 24.4 KiB ✅
Codex Live turn messages 1 1 0 (0.0%) 8 ✅
Claude Total thread wire 5.0 KiB 5.0 KiB 0 B (0.0%) 6.8 KiB ✅
Claude Thread snapshot wire 3.8 KiB 3.8 KiB 0 B (0.0%) 4.9 KiB ✅
Claude Live turn WebSocket wire 1.2 KiB 1.2 KiB 0 B (0.0%) 2.0 KiB ✅
Claude Live turn WebSocket decoded 21.9 KiB 21.9 KiB 0 B (0.0%) 24.4 KiB ✅
Claude Live turn messages 1 1 0 (0.0%) 8 ✅

Baseline: f1747c1 · PR result: 9c7fd8c · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 108.5 KiB
  • Claude decoded thread snapshot: 108.8 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

The editor's guardBack hid the system Back button behind a custom one and
turned off swipe-back. With the system back item gone, UIKit stops the edge
swipe before react-native-screens can report it as a prevented dismiss, so
swiping did nothing and the Discard changes dialog never appeared.

The V5 stack already blocks native dismissal for routes guarded by
usePreventRemove and routes the attempt to goBack, which raises the guard's
dialog. Remove guardBack so system Back and swipe both go through that path.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions github-actions Bot added size:M and removed size:S labels Nov 13, 2026
@jayleaton
jayleaton merged commit fef4efd into main Nov 13, 2026
29 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M vouch:trusted Author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant