import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../providers/auth_provider.dart'; import '../providers/time_provider.dart'; import '../services/time_service.dart'; class TimerWidget extends ConsumerStatefulWidget { const TimerWidget({super.key}); @override ConsumerState createState() => _TimerWidgetState(); } class _TimerWidgetState extends ConsumerState { Timer? _timer; Duration _elapsed = Duration.zero; String? _activeRegistrationId; @override void dispose() { _timer?.cancel(); super.dispose(); } void _startTimer(DateTime startTime, String registrationId) { _activeRegistrationId = registrationId; _timer = Timer.periodic(const Duration(seconds: 1), (timer) { if (mounted) { setState(() { _elapsed = DateTime.now().difference(startTime); }); } }); } void _stopTimer() { _timer?.cancel(); _activeRegistrationId = null; setState(() { _elapsed = Duration.zero; }); } Future _handleStartStop() async { final user = ref.read(currentUserProvider); final userData = await ref.read(userDataProvider.future); if (user == null || userData == null) return; final timeService = ref.read(timeServiceProvider); final activeReg = await ref.read(activeRegistrationProvider.future); try { if (activeReg != null) { // Stopp timer await timeService.stopTimer(activeReg.id, user.uid); _stopTimer(); ref.invalidate(activeRegistrationProvider); ref.invalidate(todayRegistrationsProvider); if (mounted) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('Timer stoppet'), backgroundColor: Colors.green, ), ); } } else { // Start timer final registrationId = await timeService.startTimer( userId: user.uid, organizationId: userData.organizationId, ); _startTimer(DateTime.now(), registrationId); ref.invalidate(activeRegistrationProvider); ref.invalidate(todayRegistrationsProvider); if (mounted) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('Timer startet'), backgroundColor: Colors.green, ), ); } } } catch (e) { if (mounted) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text('Feil: $e'), backgroundColor: Colors.red, ), ); } } } @override Widget build(BuildContext context) { final activeReg = ref.watch(activeRegistrationProvider); return activeReg.when( data: (registration) { if (registration != null && _activeRegistrationId == null) { // Start timer hvis det finnes en aktiv registrering WidgetsBinding.instance.addPostFrameCallback((_) { _startTimer(registration.startTime, registration.id); }); } final isActive = registration != null; final hours = _elapsed.inHours; final minutes = _elapsed.inMinutes.remainder(60); final seconds = _elapsed.inSeconds.remainder(60); return Card( elevation: 4, child: Padding( padding: const EdgeInsets.all(24.0), child: Column( children: [ Text( isActive ? 'Timer kjører' : 'Klar til å starte', style: Theme.of(context).textTheme.titleMedium, ), const SizedBox(height: 16), // Timer display Container( padding: const EdgeInsets.symmetric( horizontal: 32, vertical: 16, ), decoration: BoxDecoration( color: isActive ? Theme.of(context).colorScheme.primaryContainer : Theme.of(context).colorScheme.surfaceVariant, borderRadius: BorderRadius.circular(12), ), child: Text( '${hours.toString().padLeft(2, '0')}:${minutes.toString().padLeft(2, '0')}:${seconds.toString().padLeft(2, '0')}', style: Theme.of(context).textTheme.displayMedium?.copyWith( fontWeight: FontWeight.bold, fontFeatures: [const FontFeature.tabularFigures()], ), ), ), const SizedBox(height: 24), // Start/Stop button SizedBox( width: double.infinity, child: FilledButton.icon( onPressed: _handleStartStop, icon: Icon(isActive ? Icons.stop : Icons.play_arrow), label: Text(isActive ? 'Stopp' : 'Start'), style: FilledButton.styleFrom( padding: const EdgeInsets.symmetric(vertical: 16), backgroundColor: isActive ? Colors.red : Theme.of(context).colorScheme.primary, ), ), ), ], ), ), ); }, loading: () => const Card( child: Padding( padding: EdgeInsets.all(24.0), child: Center(child: CircularProgressIndicator()), ), ), error: (error, _) => Card( child: Padding( padding: const EdgeInsets.all(24.0), child: Text('Feil: $error'), ), ), ); } }