import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import '../../core/exceptions.dart'; import '../../data/models/task.dart'; import '../../providers/notes_provider.dart'; import '../../providers/tasks_provider.dart'; class QuickCaptureScreen extends ConsumerStatefulWidget { const QuickCaptureScreen({super.key}); @override ConsumerState createState() => _QuickCaptureScreenState(); } class _QuickCaptureScreenState extends ConsumerState with SingleTickerProviderStateMixin { late final TabController _tabs; final _noteTitleController = TextEditingController(); final _noteContentController = TextEditingController(); final _taskTitleController = TextEditingController(); TaskPriority _taskPriority = TaskPriority.medium; bool _saving = false; @override void initState() { super.initState(); _tabs = TabController(length: 2, vsync: this); } @override void dispose() { _tabs.dispose(); _noteTitleController.dispose(); _noteContentController.dispose(); _taskTitleController.dispose(); super.dispose(); } Future _saveNote() async { final title = _noteTitleController.text.trim(); if (title.isEmpty) { ScaffoldMessenger.of(context) .showSnackBar(const SnackBar(content: Text('Title is required.'))); return; } setState(() => _saving = true); try { await ref .read(notesProvider.notifier) .create(title, _noteContentController.text); if (mounted) context.pop(); } on AppException catch (e) { if (mounted) { ScaffoldMessenger.of(context) .showSnackBar(SnackBar(content: Text(e.message))); } } finally { if (mounted) setState(() => _saving = false); } } Future _saveTask() async { final title = _taskTitleController.text.trim(); if (title.isEmpty) { ScaffoldMessenger.of(context) .showSnackBar(const SnackBar(content: Text('Title is required.'))); return; } setState(() => _saving = true); try { await ref.read(tasksProvider.notifier).create( title: title, status: TaskStatus.todo, priority: _taskPriority, ); if (mounted) context.pop(); } on AppException catch (e) { if (mounted) { ScaffoldMessenger.of(context) .showSnackBar(SnackBar(content: Text(e.message))); } } finally { if (mounted) setState(() => _saving = false); } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('Quick Capture'), bottom: TabBar( controller: _tabs, tabs: const [Tab(text: 'Note'), Tab(text: 'Task')], ), ), body: TabBarView( controller: _tabs, children: [ // Note tab Padding( padding: const EdgeInsets.all(16), child: Column( children: [ TextField( controller: _noteTitleController, decoration: const InputDecoration( labelText: 'Title', border: OutlineInputBorder(), ), textInputAction: TextInputAction.next, autofocus: true, ), const SizedBox(height: 12), Expanded( child: TextField( controller: _noteContentController, decoration: const InputDecoration( hintText: 'Content (optional, supports markdown)', border: OutlineInputBorder(), alignLabelWithHint: true, ), maxLines: null, expands: true, textAlignVertical: TextAlignVertical.top, keyboardType: TextInputType.multiline, ), ), const SizedBox(height: 12), SizedBox( width: double.infinity, child: FilledButton( onPressed: _saving ? null : _saveNote, child: _saving ? const SizedBox( height: 20, width: 20, child: CircularProgressIndicator(strokeWidth: 2), ) : const Text('Save Note'), ), ), ], ), ), // Task tab Padding( padding: const EdgeInsets.all(16), child: Column( children: [ TextField( controller: _taskTitleController, decoration: const InputDecoration( labelText: 'Task title', border: OutlineInputBorder(), ), autofocus: true, ), const SizedBox(height: 12), DropdownButtonFormField( initialValue: _taskPriority, decoration: const InputDecoration( labelText: 'Priority', border: OutlineInputBorder(), ), items: TaskPriority.values .map((p) => DropdownMenuItem(value: p, child: Text(p.label))) .toList(), onChanged: (v) => setState(() => _taskPriority = v!), ), const SizedBox(height: 16), SizedBox( width: double.infinity, child: FilledButton( onPressed: _saving ? null : _saveTask, child: _saving ? const SizedBox( height: 20, width: 20, child: CircularProgressIndicator(strokeWidth: 2), ) : const Text('Save Task'), ), ), ], ), ), ], ), ); } }