Timer: guard Resume by lifecycle state and use Restart after completion
Maintainers usually reply within 1 day
Nobody has claimed this yet.
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 48/100
Research direction
Start with the timer state and controls in Sources/StageKit/Views.swift, AppCoordinator.swift, Core.swift, QuickControls.swift, and StageKitController.swift; compare the existing compact-control and menu guards. Add idle and finished transitions to the timer-owner checks, then repeat both native reproductions with sound safely controlled. Done means all entry points agree on transport state, Restart follows the normal visible start path, and the installed build and restoration are recorded.
Written by the indexing model from the issue text.
Description
Outcome and priority
P2 functional defect. Timer controls should describe and perform the next valid action consistently on the page and floating window.
Native reproduction
Preview 2.3.0, build 20260928054038, clean source 00be555139f87d4557f48fcffc132b8621c251a2; macOS 26.5.1 (25F80), built-in display. Verified through Copy build details in the running app and bundle metadata.
Idle/reset: Open Annotate → Break timer with 5 minutes, stopped and hidden. Resume is enabled beside Start break. Click Resume: it becomes Pause and the preview counts down (04:53 observed), while the page still says Off and no timer window opens.
Finished: Set 0.1 minutes and turn the chime off for a synthetic test. Start break correctly opens a timer. At 00:00, its floating control says Restart. Return to the page: it says Resume. Click it: the timer stays at 00:00 and the UI does not change.
Normal Start opening the window is a useful passing comparison. The test restored 5 minutes, chime on and stopped/hidden state.
Source owner
The main page enables the secondary action based only on timerRunning. pauseResumeTimer marks a session started without the normal show/admission path. Countdown.resume refuses zero remaining time. Existing compact control guard and menu guard show the intended distinction.
Chosen behaviour
Use one transport state across entry points: Start for idle/reset, Pause for running, Resume for paused, Restart for finished. Guard Resume in the coordinator as well as views. Start/Restart uses normal admission, activity tracking and visible-window presentation. Hide/reopen preserves a running or paused session; it does not reset it. A duration edit during pause configures the next Start/Reset, preserving remaining time until then.
Acceptance
- Idle/reset cannot Resume a hidden new countdown or start a periodic update timer.
- Finished offers a working Restart; no enabled Resume no-op.
- Paused Resume preserves remaining time. Restart uses configured duration and opens the visible timer through the normal start path.
- Page, quick panel and floating transport controls resolve the same state. The existing Timer shortcut keeps its visibility-toggle meaning; it must not become Pause/Resume.
- Hide/reopen preserves position and time; independent Draw/Persona/Present jobs remain intact.
- Add idle and finished transitions to the timer-owner checks, then repeat both native reproductions with sound safely controlled.
- Record signed installed build and restoration.
Coordination
Second-pass request under #164/#134. #21 owns physical-display placement and receiver checks; this request fixes transport lifecycle without duplicating that work.
- Dominant language
- Swift
- Stars
- 0
- Forks
- 1
- Avg merge
- 8h 5m
- Merged PRs (30d)
- 215
Getting set up
- No Dockerfile or Docker Compose file
- Has a pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from Ship-Work/workbench
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
Maintainers usually reply within 1 day
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 70/100
Maintainers usually reply within 1 day
-
documentation good first issue help wanted
Difficulty 2/5 Half a day Newbie friendliness 74/100
Ship-Work/workbench#29 · 1 comment ·
Maintainers usually reply within 1 day
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 55/100
Maintainers usually reply within 1 day
All issues in Ship-Work/workbench
Similar issues
-
accessibility bug medium-priority mobile
Difficulty 2/5 1-3 hours Newbie friendliness 83/100
lognorman20/monaco#6247 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
swiftlang/swift-format#1312 ·