- Add NetworkMonitor with NetworkConnectivity protocol for DI and testability
- Deduplicate flag mapping (MenuBarLabel now uses TornDestination.flag(for:))
- Centralize logger subsystem string in TornConstants.logSubsystem
- Fold API error check into parseDataInBackground, removing double JSON parse
- Fix fetchFactionData double JSON parse (single parse with early error check)
- Parallelize user data parse and faction fetch with async let
- Deduplicate refreshNow() by delegating to startPolling()
- Remove redundant showLoginError state in SettingsView (use computed Binding)
- Batch watchlist saves after concurrent price fetches (N saves → 1 save)
- Add change detection for offline errorMsg to avoid no-op @Published updates
- Remove unused ObservableObject conformance from NetworkMonitor
- Fix tokens CodingKey (company_funds → donator)
- Replace print() calls with os.log Logger
- Remove stub UI tests that only asserted window.exists
Add in-app feedback prompt with progressive timing thresholds
(1 hour, 1 week, 1 month) and 5-minute cooldown. Includes
FeedbackPromptView, AppFeedbackState model, and comprehensive
test coverage.
- Use API timestamp directly for travel countdown calculations
- Add fallback to timeLeft for backward compatibility
- Add comprehensive test coverage for remainingSeconds method
- Bump version to 1.4.5
- Add CHANGELOG.md