import 'package:flutter/material.dart'; import 'package:fooder/screens/based.dart'; import 'package:fooder/models/diary.dart'; import 'package:fooder/models/preset.dart'; import 'package:fooder/widgets/preset.dart'; class AddMealScreen extends BasedScreen { final Diary diary; const AddMealScreen( {super.key, required super.apiClient, required this.diary}); @override State createState() => _AddMealScreen(); } class _AddMealScreen extends State { final nameController = TextEditingController(); final presetNameController = TextEditingController(); bool nameChanged = false; List presets = []; Preset? selectedPreset; Future _getPresets() async { var presetsMap = await widget.apiClient.getPresets(presetNameController.text); setState(() { presets = (presetsMap['presets'] as List) .map((e) => Preset.fromJson(e as Map)) .toList(); selectedPreset = null; }); } @override void initState() { super.initState(); setState(() { nameController.text = "Meal ${widget.diary.meals.length}"; }); _getPresets(); } @override void dispose() { nameController.dispose(); super.dispose(); } void popMeDaddy() { Navigator.pop( context, ); } void showError(String message) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text(message, textAlign: TextAlign.center), backgroundColor: Theme.of(context).colorScheme.error, ), ); } Future _addMeal() async { await widget.apiClient.addMeal( name: nameController.text, diaryId: widget.diary.id, ); popMeDaddy(); } Future _deletePreset(Preset preset) async { widget.apiClient.deletePreset(preset.id); setState(() { presets.remove(preset); }); } Future deletePreset(context, Preset preset) async { showDialog( context: context, builder: (context) { return AlertDialog( title: const Text('Confirm deletion of the preset'), actions: [ IconButton( icon: const Icon(Icons.cancel), onPressed: () { Navigator.pop(context); }, ), IconButton( icon: const Icon(Icons.delete), onPressed: () { _deletePreset(preset); Navigator.pop(context); }, ), ], ); }, ); } Future _addMealFromPreset() async { if (selectedPreset == null) { _addMeal(); return; } await widget.apiClient.addMealFromPreset( name: nameChanged ? nameController.text : selectedPreset!.name, diaryId: widget.diary.id, presetId: selectedPreset!.id, ); popMeDaddy(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( backgroundColor: Theme.of(context).colorScheme.inversePrimary, title: Text("πŸ…΅πŸ…ΎπŸ…ΎπŸ…³πŸ…΄πŸ†", style: logoStyle(context)), ), body: Center( child: Container( constraints: const BoxConstraints(maxWidth: 720), padding: const EdgeInsets.all(10), child: ListView(children: [ TextFormField( decoration: const InputDecoration( labelText: 'Meal name', ), controller: nameController, onChanged: (_) => setState(() { nameChanged = true; }), ), TextFormField( decoration: const InputDecoration( hintText: 'Search presets', ), controller: presetNameController, onChanged: (_) => _getPresets(), ), for (var preset in presets) ListTile( onTap: () { setState(() { presets = [preset]; presetNameController.text = preset.name; selectedPreset = preset; }); _addMealFromPreset(); }, onLongPress: () { deletePreset(context, preset); }, title: PresetWidget( preset: preset, ), ), ]), ), ), floatingActionButton: FloatingActionButton( onPressed: _addMealFromPreset, child: const Icon(Icons.add), ), ); } }