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 { 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()], ), ), ], ); } }