feat(ios): Extract orchestration helpers to ScheduleHelper

Extract iOS orchestration logic from plugin to dedicated helper,
matching Android's ScheduleHelper.kt pattern. This completes the
P2.1 native plugin refactoring for both platforms.

Changes:
- Created DailyNotificationScheduleHelper.swift (192 lines)
  - scheduleDailyNotification(): Full orchestration (cancel, clear, save, schedule, prefetch)
  - scheduleDualNotification(): Dual scheduling coordination
  - clearRolloverState(): Rollover state cleanup helper
  - getHealthStatus(): Status combination from multiple sources
- Refactored DailyNotificationPlugin.swift to delegate to helper
  - Reduced plugin by 236 lines (1854 → 1807 LOC)
  - Total iOS reduction: 11.7% (2047 → 1807 LOC)
- Updated documentation
  - docs/progress/00-STATUS.md: Marked verification complete, added helper extraction
  - docs/progress/01-CHANGELOG-WORK.md: Added iOS helper extraction entry
  - docs/progress/P2.1-REFACTORING-COMPLETE.md: Updated with helper extraction
  - docs/00-INDEX.md: Added reference to refactoring summary

Verification:
- TypeScript typecheck: PASS
- Build: PASS
- Tests: PASS (115 tests, 8 test suites)
- External API behavior unchanged

Files changed:
- ios/Plugin/DailyNotificationScheduleHelper.swift (new, 192 lines)
- ios/Plugin/DailyNotificationPlugin.swift (198 insertions, 434 deletions)
- docs/progress/00-STATUS.md (verification status updated)
- docs/progress/01-CHANGELOG-WORK.md (changelog entry added)
- docs/00-INDEX.md (index reference added)

Related:
- Completes P2.1 iOS refactoring (27 methods across 3 batches)
- Matches Android ScheduleHelper.kt pattern
- Total P2.1: 55 methods refactored (28 Android + 27 iOS)
This commit is contained in:
Matthew Raymer
2025-12-24 06:35:03 +00:00
parent 4586e64245
commit 1dca99ad17
12 changed files with 1552 additions and 448 deletions

View File

@@ -0,0 +1,134 @@
# P2.1 iOS Batch A - Current State Directive
**Purpose:** State snapshot for reconstituting work on iOS Batch A refactoring
**Owner:** Development Team
**Created:** 2025-12-23
**Status:** ready
**Baseline:** See `docs/progress/00-STATUS.md` (v1.0.11-p3-complete)
---
## Current Work Status
**Phase:** P2.1 - iOS Native Plugin Refactoring (Batch A)
**Goal:** Refactor pure delegation methods to thin adapter pattern
**Status:** in_progress — 4/7 methods refactored
---
## Target Methods (Batch A)
### ✅ 1. `getLastNotification()`
- **File:** `ios/Plugin/DailyNotificationPlugin.swift`
- **Status:** ✅ Complete
- **Change:** Simplified conditional logic, cleaner delegation pattern
- **Lines reduced:** ~5 lines
### ✅ 2. `cancelAllNotifications()`
- **File:** `ios/Plugin/DailyNotificationPlugin.swift`
- **Status:** ✅ Complete
- **Change:** Simplified cleanup logic, clearer delegation comments
- **Lines reduced:** ~5 lines
### ✅ 3. `getBackgroundTaskStatus()`
- **File:** `ios/Plugin/DailyNotificationPlugin.swift`
- **Status:** ✅ Complete
- **Change:** Delegated storage access, clearer variable extraction
- **Lines reduced:** ~2 lines
### ✅ 4. `getDualScheduleStatus()` + `getHealthStatus()`
- **File:** `ios/Plugin/DailyNotificationPlugin.swift`
- **Status:** ✅ Complete (partial - simplified, full delegation in future batch)
- **Change:** Simplified conditional logic in `getHealthStatus()`, added delegation comments
- **Lines reduced:** ~5 lines
### ⏭️ 5. `getScheduledReminders()`
- **File:** `ios/Plugin/DailyNotificationPlugin.swift`
- **Status:** Deferred to Batch C (glue method - combines multiple sources)
- **Reason:** Combines UserDefaults and notification center - needs orchestration logic
- **Target Service:** `DailyNotificationStorage` (needs method to combine sources)
### ⏭️ 6. `checkForMissedBGTask()` (private)
- **File:** `ios/Plugin/DailyNotificationPlugin.swift`
- **Status:** Deferred (private method, may need service method creation)
- **Target Service:** `DailyNotificationBackgroundTaskManager` or `DailyNotificationReactivationManager`
### ⏭️ 7. `getNextScheduledNotificationTime()` (private)
- **File:** `ios/Plugin/DailyNotificationPlugin.swift`
- **Status:** Deferred (private method, already delegates to scheduler)
- **Target Service:** `DailyNotificationScheduler`
---
## Service Initialization (Current State)
Services are initialized in `load()`:
```swift
storage = DailyNotificationStorage(databasePath: database.getPath())
scheduler = DailyNotificationScheduler()
reactivationManager = DailyNotificationReactivationManager(...)
stateActor = DailyNotificationStateActor(...) // iOS 13+
```
**Missing:** `DailyNotificationBackgroundTaskManager` is not initialized in plugin (may need to add)
---
## Implementation Notes
### iOS-Specific Patterns
- Methods use `@objc func` annotation
- Error handling: `call.reject(message, code)` and `call.resolve(result)`
- Async operations use `Task { }` blocks
- Services are optional (`var storage: DailyNotificationStorage?`), need nil checks
- State actor requires `await` for async access
### Differences from Android
- iOS uses async/await (Swift concurrency) vs Kotlin coroutines
- Services are optional properties (need nil checks)
- State actor pattern for thread-safe access (iOS 13+)
- Background task manager exists but may not be initialized in plugin
---
## Next Steps
1. **Review each method** - Read current implementation
2. **Identify service methods** - Check if service methods exist or need creation
3. **Refactor one method at a time** - Start with simplest (`cancelAllNotifications`)
4. **Test after each change** - Ensure external API unchanged
5. **Commit incrementally** - 1-2 methods per commit
---
## Progress Summary
- **Methods refactored:** 4/7 (public methods that can be pure delegation)
- **Methods deferred:** 3 (private methods or glue methods for later batches)
- **Lines reduced:** ~9 lines (net reduction: 27 removed, 18 added)
- **Complexity reduction:** Low (pure delegation, simplified conditionals)
- **Risk:** Low (no business logic changes, only code cleanup)
## Completed Refactorings
1.`getLastNotification()` - Simplified conditional logic
2.`cancelAllNotifications()` - Simplified cleanup logic
3.`getBackgroundTaskStatus()` - Delegated storage access
4.`getDualScheduleStatus()` + `getHealthStatus()` - Simplified conditionals
## Deferred Methods
- `getScheduledReminders()` - Deferred to Batch C (glue method combining multiple sources)
- `checkForMissedBGTask()` - Deferred (private method, may need service method creation)
- `getNextScheduledNotificationTime()` - Deferred (private method, already delegates)
---
## Success Criteria
- [x] 4 public methods refactored to thin adapters
- [x] No business logic changes (only code cleanup)
- [x] External API behavior unchanged
- [ ] Tests pass (pending verification)
- [x] Documentation updated