adds syncing

This commit is contained in:
2025-08-27 16:17:21 +02:00
parent 1191d06e53
commit 709cf2cbd9
24 changed files with 3809 additions and 226 deletions

View File

@@ -1,7 +1,9 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../models/supplement.dart';
import 'package:uuid/uuid.dart';
import '../models/ingredient.dart';
import '../models/supplement.dart';
import '../providers/supplement_provider.dart';
// Helper class to manage ingredient text controllers
@@ -22,6 +24,8 @@ class IngredientController {
name: nameController.text.trim(),
amount: double.tryParse(amountController.text) ?? 0.0,
unit: selectedUnit,
syncId: const Uuid().v4(),
lastModified: DateTime.now(),
);
}
@@ -46,10 +50,10 @@ class _AddSupplementScreenState extends State<AddSupplementScreen> {
final _brandController = TextEditingController();
final _numberOfUnitsController = TextEditingController();
final _notesController = TextEditingController();
// Multi-ingredient support with persistent controllers
List<IngredientController> _ingredientControllers = [];
String _selectedUnitType = 'capsules';
int _frequencyPerDay = 1;
List<String> _reminderTimes = ['08:00'];
@@ -195,7 +199,7 @@ class _AddSupplementScreenState extends State<AddSupplementScreen> {
_selectedUnitType = supplement.unitType;
_frequencyPerDay = supplement.frequencyPerDay;
_reminderTimes = List.from(supplement.reminderTimes);
// Initialize ingredient controllers from existing ingredients
_ingredientControllers.clear();
if (supplement.ingredients.isEmpty) {
@@ -556,13 +560,15 @@ class _AddSupplementScreenState extends State<AddSupplementScreen> {
void _saveSupplement() async {
if (_formKey.currentState!.validate()) {
// Validate that we have at least one ingredient with name and amount
final validIngredients = _ingredientControllers.where((controller) =>
controller.nameController.text.trim().isNotEmpty &&
final validIngredients = _ingredientControllers.where((controller) =>
controller.nameController.text.trim().isNotEmpty &&
(double.tryParse(controller.amountController.text) ?? 0) > 0
).map((controller) => Ingredient(
name: controller.nameController.text.trim(),
amount: double.tryParse(controller.amountController.text) ?? 0,
amount: double.tryParse(controller.amountController.text) ?? 0.0,
unit: controller.selectedUnit,
syncId: const Uuid().v4(),
lastModified: DateTime.now(),
)).toList();
if (validIngredients.isEmpty) {
@@ -588,7 +594,7 @@ class _AddSupplementScreenState extends State<AddSupplementScreen> {
);
final provider = context.read<SupplementProvider>();
try {
if (widget.supplement != null) {
await provider.updateSupplement(supplement);
@@ -598,10 +604,10 @@ class _AddSupplementScreenState extends State<AddSupplementScreen> {
if (mounted) {
Navigator.of(context).pop();
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(widget.supplement != null
content: Text(widget.supplement != null
? 'Supplement updated successfully!'
: 'Supplement added successfully!'),
backgroundColor: Colors.green,
@@ -627,12 +633,12 @@ class _AddSupplementScreenState extends State<AddSupplementScreen> {
_brandController.dispose();
_numberOfUnitsController.dispose();
_notesController.dispose();
// Dispose all ingredient controllers
for (final controller in _ingredientControllers) {
controller.dispose();
}
super.dispose();
}
}