import 'package:shared_preferences/shared_preferences.dart'; /// A model class to store timer state data class TimerData { static const String _startTimeKey = 'timer_start_time'; static const String _endTimeKey = 'timer_end_time'; static const String _pausedRemainingKey = 'timer_paused_remaining'; static const String _isRunningKey = 'timer_is_running'; static const String _isPausedKey = 'timer_is_paused'; // Timer start time in milliseconds since epoch final int? startTime; // Timer end time in milliseconds since epoch final int? endTime; // Remaining seconds when timer was paused final int? pausedRemaining; // Whether timer is currently running final bool isRunning; // Whether timer is currently paused final bool isPaused; TimerData({ this.startTime, this.endTime, this.pausedRemaining, this.isRunning = false, this.isPaused = false, }); /// Save timer data to SharedPreferences Future save() async { final prefs = await SharedPreferences.getInstance(); if (startTime != null) { await prefs.setInt(_startTimeKey, startTime!); } else { await prefs.remove(_startTimeKey); } if (endTime != null) { await prefs.setInt(_endTimeKey, endTime!); } else { await prefs.remove(_endTimeKey); } if (pausedRemaining != null) { await prefs.setInt(_pausedRemainingKey, pausedRemaining!); } else { await prefs.remove(_pausedRemainingKey); } await prefs.setBool(_isRunningKey, isRunning); await prefs.setBool(_isPausedKey, isPaused); } /// Load timer data from SharedPreferences static Future load() async { final prefs = await SharedPreferences.getInstance(); return TimerData( startTime: prefs.containsKey(_startTimeKey) ? prefs.getInt(_startTimeKey) : null, endTime: prefs.containsKey(_endTimeKey) ? prefs.getInt(_endTimeKey) : null, pausedRemaining: prefs.containsKey(_pausedRemainingKey) ? prefs.getInt(_pausedRemainingKey) : null, isRunning: prefs.getBool(_isRunningKey) ?? false, isPaused: prefs.getBool(_isPausedKey) ?? false, ); } /// Calculate remaining seconds based on current time and end time int calculateRemainingSeconds() { if (isPaused && pausedRemaining != null) { return pausedRemaining!; } if (endTime != null) { final now = DateTime.now().millisecondsSinceEpoch; final remaining = (endTime! - now) ~/ 1000; return remaining > 0 ? remaining : 0; } return 0; } /// Create a copy of this timer data with modified properties TimerData copyWith({ int? startTime, int? endTime, int? pausedRemaining, bool? isRunning, bool? isPaused, }) { return TimerData( startTime: startTime ?? this.startTime, endTime: endTime ?? this.endTime, pausedRemaining: pausedRemaining ?? this.pausedRemaining, isRunning: isRunning ?? this.isRunning, isPaused: isPaused ?? this.isPaused, ); } }