fooder-app/lib/screens/add_meal.dart

159 lines
4 KiB
Dart
Raw Permalink Normal View History

2023-07-30 14:40:45 +02:00
import 'package:flutter/material.dart';
2023-07-30 15:31:36 +02:00
import 'package:fooder/screens/based.dart';
import 'package:fooder/models/diary.dart';
2023-10-27 17:10:09 +02:00
import 'package:fooder/models/preset.dart';
import 'package:fooder/widgets/preset.dart';
2024-04-04 19:03:41 +02:00
import 'package:fooder/components/text.dart';
import 'package:fooder/components/floating_action_button.dart';
2023-07-30 14:40:45 +02:00
class AddMealScreen extends BasedScreen {
final Diary diary;
const AddMealScreen({super.key, required super.ctx, required this.diary});
2023-07-30 14:40:45 +02:00
@override
State<AddMealScreen> createState() => _AddMealScreen();
}
2024-04-04 19:03:41 +02:00
class _AddMealScreen extends BasedState<AddMealScreen> {
2023-07-30 14:40:45 +02:00
final nameController = TextEditingController();
2023-10-27 17:10:09 +02:00
final presetNameController = TextEditingController();
bool nameChanged = false;
List<Preset> presets = [];
2023-10-27 17:44:03 +02:00
Preset? selectedPreset;
Diary get diary => widget.diary;
2023-10-27 17:10:09 +02:00
Future<void> _getPresets() async {
var presets = await client.preset.list(presetNameController.text);
2023-10-27 17:10:09 +02:00
setState(() {
this.presets = presets;
2023-10-27 17:44:03 +02:00
selectedPreset = null;
2023-10-27 17:10:09 +02:00
});
}
2023-07-30 14:40:45 +02:00
2023-07-30 14:42:55 +02:00
@override
2023-08-28 14:45:32 +02:00
void initState() {
2023-07-30 14:42:55 +02:00
super.initState();
setState(() {
nameController.text = "Meal ${diary.meals.length + 1}";
2023-07-30 14:42:55 +02:00
});
2023-10-27 17:10:09 +02:00
_getPresets();
2023-07-30 14:42:55 +02:00
}
2023-07-30 14:40:45 +02:00
@override
void dispose() {
nameController.dispose();
super.dispose();
}
void popMeDaddy() {
2023-07-30 14:40:45 +02:00
Navigator.pop(
context,
);
}
Future<void> addMeal() async {
await client.meal.create(
2023-07-30 14:40:45 +02:00
name: nameController.text,
diaryId: diary.id,
2023-07-30 14:40:45 +02:00
);
popMeDaddy();
2023-07-30 14:40:45 +02:00
}
Future<void> deletePreset(Preset preset) async {
client.preset.delete(preset.id);
2023-10-27 17:33:57 +02:00
setState(() {
presets.remove(preset);
});
}
Future<void> deletePresetPopup(context, Preset preset) async {
2023-10-27 17:10:09 +02:00
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: const Text('Confirm deletion of the preset'),
actions: <Widget>[
IconButton(
icon: const Icon(Icons.cancel),
onPressed: () {
Navigator.pop(context);
},
),
IconButton(
icon: const Icon(Icons.delete),
onPressed: () {
deletePreset(preset);
2023-10-27 17:10:09 +02:00
Navigator.pop(context);
},
),
],
);
},
);
}
Future<void> addMealFromPreset() async {
2023-10-27 17:44:03 +02:00
if (selectedPreset == null) {
addMeal();
2023-10-27 17:10:09 +02:00
return;
}
await client.meal.createFromPreset(
2023-10-27 17:44:03 +02:00
name: nameChanged ? nameController.text : selectedPreset!.name,
diaryId: diary.id,
2023-10-27 17:44:03 +02:00
presetId: selectedPreset!.id,
2023-10-27 17:10:09 +02:00
);
popMeDaddy();
}
2023-07-30 14:40:45 +02:00
@override
Widget build(BuildContext context) {
return Scaffold(
2024-04-04 19:03:41 +02:00
appBar: appBar(),
2023-07-30 14:40:45 +02:00
body: Center(
2023-10-27 17:10:09 +02:00
child: Container(
constraints: const BoxConstraints(maxWidth: 720),
padding: const EdgeInsets.all(10),
child: ListView(children: <Widget>[
2024-04-04 19:03:41 +02:00
FTextInput(
labelText: 'Meal name',
2023-10-27 17:10:09 +02:00
controller: nameController,
onChanged: (_) => setState(() {
nameChanged = true;
}),
),
2024-04-04 19:03:41 +02:00
FTextInput(
labelText: 'Search presets',
2023-10-27 17:10:09 +02:00
controller: presetNameController,
onChanged: (_) => _getPresets(),
),
for (var preset in presets)
ListTile(
onTap: () {
setState(() {
presets = [preset];
presetNameController.text = preset.name;
2023-10-27 17:44:03 +02:00
selectedPreset = preset;
2023-10-27 17:10:09 +02:00
});
addMealFromPreset();
2023-10-27 17:10:09 +02:00
},
onLongPress: () {
deletePresetPopup(context, preset);
2023-10-27 17:10:09 +02:00
},
title: PresetWidget(
preset: preset,
),
),
]),
2023-07-30 14:40:45 +02:00
),
2023-10-27 17:10:09 +02:00
),
2024-04-04 19:03:41 +02:00
floatingActionButton: FActionButton(
onPressed: addMealFromPreset,
2024-04-04 19:03:41 +02:00
icon: Icons.playlist_add_rounded,
2023-07-30 14:40:45 +02:00
),
);
}
}