diff --git a/auth/lib/ui/code_timer_progress.dart b/auth/lib/ui/code_timer_progress.dart index 520a18d76c..58386fe438 100644 --- a/auth/lib/ui/code_timer_progress.dart +++ b/auth/lib/ui/code_timer_progress.dart @@ -7,10 +7,12 @@ import 'package:flutter/material.dart'; class CodeTimerProgress extends StatefulWidget { final int period; final bool isCompactMode; + final int timeOffsetInMilliseconds; const CodeTimerProgress({ super.key, required this.period, this.isCompactMode = false, + this.timeOffsetInMilliseconds = 0, }); @override @@ -20,7 +22,7 @@ class CodeTimerProgress extends StatefulWidget { class _CodeTimerProgressState extends State { late final Timer _timer; late final ValueNotifier _progress; - late final int _periodInMicros; + late final int _periodInMilii; // Reduce update frequency final int _updateIntervalMs = @@ -29,29 +31,30 @@ class _CodeTimerProgressState extends State { @override void initState() { super.initState(); - _periodInMicros = widget.period * 1000000; + _periodInMilii = widget.period * 1000; _progress = ValueNotifier(0.0); - _updateTimeRemaining(DateTime.now().microsecondsSinceEpoch); + _updateTimeRemaining(DateTime.now().millisecondsSinceEpoch); _timer = Timer.periodic(Duration(milliseconds: _updateIntervalMs), (timer) { - final now = DateTime.now().microsecondsSinceEpoch; + final now = DateTime.now().millisecondsSinceEpoch; _updateTimeRemaining(now); }); } - void _updateTimeRemaining(int currentMicros) { + void _updateTimeRemaining(int currentMilliSeconds) { // More efficient time calculation using modulo - final elapsed = (currentMicros) % _periodInMicros; - final timeRemaining = _periodInMicros - elapsed; - _progress.value = timeRemaining / _periodInMicros; + final elapsed = (currentMilliSeconds + widget.timeOffsetInMilliseconds) % + _periodInMilii; + final timeRemaining = _periodInMilii - elapsed; + _progress.value = timeRemaining / _periodInMilii; } @override void didUpdateWidget(covariant CodeTimerProgress oldWidget) { super.didUpdateWidget(oldWidget); if (oldWidget.period != widget.period) { - _periodInMicros = widget.period * 1000000; - _updateTimeRemaining(DateTime.now().microsecondsSinceEpoch); + _periodInMilii = widget.period * 1000; + _updateTimeRemaining(DateTime.now().millisecondsSinceEpoch); } } diff --git a/auth/lib/ui/code_widget.dart b/auth/lib/ui/code_widget.dart index 3ccb7ab67b..be9c2b8a69 100644 --- a/auth/lib/ui/code_widget.dart +++ b/auth/lib/ui/code_widget.dart @@ -152,6 +152,8 @@ class _CodeWidgetState extends State { key: ValueKey('period_${widget.code.period}'), period: widget.code.period, isCompactMode: widget.isCompactMode, + timeOffsetInMilliseconds: + PreferenceService.instance.timeOffsetInMilliSeconds(), ), widget.isCompactMode ? const SizedBox(height: 4)