import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../../core/time.dart'; import '../../data/db/daos/tracker_dao.dart'; import '../../state/providers.dart'; class CheckInScreen extends ConsumerStatefulWidget { final String habitId; const CheckInScreen({super.key, required this.habitId}); @override ConsumerState createState() => _CheckInScreenState(); } class _CheckInScreenState extends ConsumerState { bool _saving = false; Future _record(String value) async { setState(() => _saving = true); try { final dao = ref.read(trackerDaoProvider); await dao.recordCheckIn(TrackerEntryDraft( habitId: widget.habitId, date: _ymd(nowKst()), value: value, )); if (!mounted) return; ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text(value == 'done' ? '체크인 완료' : '오늘은 비움')), ); Navigator.of(context).pop(); } catch (e) { if (!mounted) return; ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text('실패: $e')), ); } finally { if (mounted) setState(() => _saving = false); } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('체크인')), body: Padding( padding: const EdgeInsets.all(24), child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.stretch, children: [ Text('오늘 (${_ymd(nowKst())})', style: Theme.of(context).textTheme.titleLarge, textAlign: TextAlign.center), const SizedBox(height: 32), FilledButton( onPressed: _saving ? null : () => _record('done'), child: const Padding( padding: EdgeInsets.symmetric(vertical: 16), child: Text('완료', style: TextStyle(fontSize: 18)), ), ), const SizedBox(height: 12), OutlinedButton( onPressed: _saving ? null : () => _record('blank'), child: const Padding( padding: EdgeInsets.symmetric(vertical: 12), child: Text('비움'), ), ), ], ), ), ); } } String _ymd(DateTime d) => '${d.year.toString().padLeft(4, '0')}-' '${d.month.toString().padLeft(2, '0')}-' '${d.day.toString().padLeft(2, '0')}';