93 lines
2.3 KiB
Dart
93 lines
2.3 KiB
Dart
import 'dart:async';
|
|
import 'dart:ui';
|
|
import 'package:flutter/material.dart';
|
|
|
|
class CooldownTimer extends StatefulWidget {
|
|
final DateTime createdAt;
|
|
final VoidCallback onTimerFinish;
|
|
|
|
const CooldownTimer({
|
|
Key? key,
|
|
required this.createdAt,
|
|
required this.onTimerFinish,
|
|
}) : super(key: key);
|
|
|
|
@override
|
|
_CooldownTimerState createState() => _CooldownTimerState();
|
|
}
|
|
|
|
class _CooldownTimerState extends State<CooldownTimer> {
|
|
late Timer _timer;
|
|
late Duration _timeRemaining;
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
_updateRemainingTime();
|
|
// Update the timer every second
|
|
_timer = Timer.periodic(const Duration(seconds: 1), (timer) {
|
|
_updateRemainingTime();
|
|
});
|
|
}
|
|
|
|
void _updateRemainingTime() {
|
|
final cooldownEnd = widget.createdAt.add(const Duration(minutes: 60));
|
|
final now = DateTime.now();
|
|
|
|
if (now.isAfter(cooldownEnd)) {
|
|
_timeRemaining = Duration.zero;
|
|
_timer.cancel();
|
|
// Notify the parent widget that the timer is done
|
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
|
widget.onTimerFinish();
|
|
});
|
|
} else {
|
|
_timeRemaining = cooldownEnd.difference(now);
|
|
}
|
|
// Trigger a rebuild
|
|
setState(() {});
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
_timer.cancel();
|
|
super.dispose();
|
|
}
|
|
|
|
String _formatDuration(Duration duration) {
|
|
final minutes = duration.inMinutes.remainder(60).toString().padLeft(2, '0');
|
|
final seconds = duration.inSeconds.remainder(60).toString().padLeft(2, '0');
|
|
return '$minutes:$seconds';
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
if (_timeRemaining == Duration.zero) {
|
|
return const SizedBox
|
|
.shrink(); // Or some other widget indicating it's enabled
|
|
}
|
|
|
|
return Row(
|
|
mainAxisSize: MainAxisSize.min,
|
|
children: [
|
|
Icon(
|
|
Icons.timer,
|
|
color: Colors.orange.shade700,
|
|
size: 18,
|
|
),
|
|
const SizedBox(width: 6),
|
|
Text(
|
|
_formatDuration(_timeRemaining),
|
|
style: TextStyle(
|
|
color: Colors.orange.shade700,
|
|
fontSize: 14,
|
|
fontWeight: FontWeight.bold,
|
|
fontFamily: 'monospace',
|
|
fontFeatures: const [FontFeature.tabularFigures()],
|
|
),
|
|
),
|
|
],
|
|
);
|
|
}
|
|
}
|