-
Notifications
You must be signed in to change notification settings - Fork 0
feat: Implement pause/resume UI controls for automation #6
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
- Add pause/resume state management to ClickItViewModel - Implement pauseAutomation() and resumeAutomation() methods - Add isPaused property and canPause/canResume computed properties - Update AppStatus enum with .paused case (orange color) - Redesign StatusHeaderCard with separate pause/resume and stop buttons - Integrate with ElapsedTimeManager pause/resume functionality - Update visual feedback overlay to show paused state (dimmed) - Add comprehensive test suite for pause/resume functionality - Handle external automation stops to clear pause state - Add testing helper method startAutomationForTesting() 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Summary of Changes
Hello @jsonify, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!
This pull request introduces a highly requested feature: the ability to pause and resume automation sessions. This significantly enhances user control and flexibility, allowing for temporary interruptions without needing to restart the entire process. The changes span across the UI, view model logic, and underlying automation coordination, all backed by a new set of dedicated tests.
Highlights
- Core Functionality: I've implemented comprehensive pause and resume capabilities for the ClickIt automation, allowing users to temporarily halt and then restart their automation sessions without losing progress or configuration.
- User Interface: The
StatusHeaderCardhas been redesigned to provide distinct 'Pause/Resume' and 'Stop' buttons when automation is active, improving clarity and control. The UI now also visually indicates a paused state. - State Management & Integration: I've introduced an
isPausedstate inClickItViewModeland integrated pause/resume logic withElapsedTimeManagerto ensure accurate time tracking andClickCoordinatorto control the automation's active status. Visual feedback is updated to reflect the paused state. - Testing: A new, comprehensive test suite (
PauseResumeTests.swift) has been added to validate the pause/resume functionality, covering various scenarios including state transitions, time tracking, and edge cases.
Using Gemini Code Assist
The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.
Invoking Gemini
You can request assistance from Gemini at any point in your pull request via creating an issue comment (i.e. comment on the pull request page) using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands.
| Feature | Command | Description |
|---|---|---|
| Code Review | /gemini review |
Performs a code review for the current pull request in its current state. |
| Pull Request Summary | /gemini summary |
Provides a summary of the current pull request in its current state. |
| Comment | @gemini-code-assist | Responds in comments when explicitly tagged, both in issue comments and review comments. |
| Help | /gemini help |
Displays a list of available commands. |
Customization
To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.
Limitations & Feedback
Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments or fill out our survey to provide feedback.
You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.
Footnotes
-
Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution. ↩
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Code Review
This pull request implements pause and resume functionality with UI controls, view model logic, and a test suite. The review focuses on improving state management in ClickItViewModel by using appStatus as the single source of truth, reducing code duplication, and improving test clarity. These changes enhance code robustness and maintainability.
| // MARK: - Published Properties | ||
| @Published var targetPoint: CGPoint? | ||
| @Published var isRunning = false | ||
| @Published var isPaused = false |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Having both isRunning and isPaused as separate @Published properties can lead to inconsistent states. Consider using the appStatus enum as the single source of truth and derive isRunning and isPaused as computed properties1.
Style Guide References
Footnotes
| } | ||
|
|
||
| var canPause: Bool { | ||
| isRunning && !isPaused |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| } | ||
|
|
||
| var canResume: Bool { | ||
| isPaused && !isRunning |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| let config = AutomationConfiguration( | ||
| location: point, | ||
| clickType: clickType, | ||
| clickInterval: Double(totalMilliseconds) / 1000.0, | ||
| targetApplication: nil, | ||
| maxClicks: durationMode == .clickCount ? maxClicks : nil, | ||
| maxDuration: durationMode == .timeLimit ? durationSeconds : nil, | ||
| stopOnError: stopOnError, | ||
| randomizeLocation: randomizeLocation, | ||
| locationVariance: CGFloat(randomizeLocation ? locationVariance : 0), | ||
| showVisualFeedback: showVisualFeedback, | ||
| useDynamicMouseTracking: false | ||
| ) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This AutomationConfiguration block is duplicated in startAutomationForTesting(). Extract this logic into a private helper method to avoid code duplication and improve maintainability1.
Style Guide References
Footnotes
| XCTAssertTrue(viewModel.canPause == false, "Should not be able to pause when not running") | ||
| XCTAssertTrue(viewModel.canResume == false, "Should not be able to resume when not running") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Use XCTAssertFalse for asserting that a boolean condition is false for better readability.
| XCTAssertTrue(viewModel.canPause == false, "Should not be able to pause when not running") | |
| XCTAssertTrue(viewModel.canResume == false, "Should not be able to resume when not running") | |
| XCTAssertFalse(viewModel.canPause, "Should not be able to pause when not running") | |
| XCTAssertFalse(viewModel.canResume, "Should not be able to resume when not running") |
|
|
||
| // Start automation and let time elapse | ||
| viewModel.startAutomationForTesting() | ||
| try? await Task.sleep(nanoseconds: 200_000_000) // 0.2 seconds |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Summary
Changes Made
isPausedstate,pauseAutomation()andresumeAutomation()methods.pausedcase with orange color indicatorPauseResumeTests.swiftTesting
🤖 Generated with Claude Code