bugfix: changing times for supplements now still allows for proper

syncing
This commit is contained in:
2025-08-28 11:44:14 +02:00
parent 731ac1567d
commit 142359bf94
2 changed files with 111 additions and 90 deletions

View File

@@ -557,21 +557,24 @@ 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) =>
final validIngredients = _ingredientControllers
.where((controller) =>
controller.nameController.text.trim().isNotEmpty &&
(double.tryParse(controller.amountController.text) ?? 0) > 0
).map((controller) => Ingredient(
(double.tryParse(controller.amountController.text) ?? 0) > 0)
.map((controller) => Ingredient(
name: controller.nameController.text.trim(),
amount: double.tryParse(controller.amountController.text) ?? 0.0,
unit: controller.selectedUnit,
syncId: const Uuid().v4(),
lastModified: DateTime.now(),
)).toList();
))
.toList();
if (validIngredients.isEmpty) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text('Please add at least one ingredient with name and amount'),
content:
Text('Please add at least one ingredient with name and amount'),
),
);
return;
@@ -580,14 +583,20 @@ class _AddSupplementScreenState extends State<AddSupplementScreen> {
final supplement = Supplement(
id: widget.supplement?.id,
name: _nameController.text.trim(),
brand: _brandController.text.trim().isNotEmpty ? _brandController.text.trim() : null,
brand: _brandController.text.trim().isNotEmpty
? _brandController.text.trim()
: null,
ingredients: validIngredients,
numberOfUnits: int.parse(_numberOfUnitsController.text),
unitType: _selectedUnitType,
frequencyPerDay: _frequencyPerDay,
reminderTimes: _reminderTimes,
notes: _notesController.text.trim().isNotEmpty ? _notesController.text.trim() : null,
notes: _notesController.text.trim().isNotEmpty
? _notesController.text.trim()
: null,
createdAt: widget.supplement?.createdAt ?? DateTime.now(),
syncId: widget.supplement?.syncId, // Preserve syncId on update
lastModified: DateTime.now(), // Always update lastModified on save
);
final provider = context.read<SupplementProvider>();

View File

@@ -289,19 +289,23 @@ class DatabaseSyncService {
// Get all supplements from remote database
final remoteMaps = await remoteDb.query('supplements');
final remoteSupplements = remoteMaps.map((map) => Supplement.fromMap(map)).toList();
final remoteSupplements =
remoteMaps.map((map) => Supplement.fromMap(map)).toList();
if (kDebugMode) {
print('SupplementsLog: Found ${remoteSupplements.length} supplements in remote database');
print(
'SupplementsLog: Found ${remoteSupplements.length} supplements in remote database');
for (final supplement in remoteSupplements) {
print('SupplementsLog: Remote supplement: ${supplement.name} (syncId: ${supplement.syncId}, deleted: ${supplement.isDeleted})');
print(
'SupplementsLog: Remote supplement: ${supplement.name} (syncId: ${supplement.syncId}, deleted: ${supplement.isDeleted})');
}
}
for (final remoteSupplement in remoteSupplements) {
if (remoteSupplement.syncId.isEmpty) {
if (kDebugMode) {
print('SupplementsLog: Skipping supplement ${remoteSupplement.name} - no syncId');
print(
'SupplementsLog: Skipping supplement ${remoteSupplement.name} - no syncId');
}
continue;
}
@@ -316,22 +320,28 @@ class DatabaseSyncService {
if (existingMaps.isEmpty) {
// New supplement from remote - insert it
if (!remoteSupplement.isDeleted) {
final supplementToInsert = remoteSupplement.copyWith(id: null);
await localDb.insert('supplements', supplementToInsert.toMap());
// Manually create a new map without the id to ensure it's null
final mapToInsert = remoteSupplement.toMap();
mapToInsert.remove('id');
await localDb.insert('supplements', mapToInsert);
if (kDebugMode) {
print('SupplementsLog: ✓ Inserted new supplement: ${remoteSupplement.name}');
print(
'SupplementsLog: ✓ Inserted new supplement: ${remoteSupplement.name}');
}
} else {
if (kDebugMode) {
print('SupplementsLog: Skipping deleted supplement: ${remoteSupplement.name}');
print(
'SupplementsLog: Skipping deleted supplement: ${remoteSupplement.name}');
}
}
} else {
// Existing supplement - update if remote is newer
final existingSupplement = Supplement.fromMap(existingMaps.first);
if (remoteSupplement.lastModified.isAfter(existingSupplement.lastModified)) {
final supplementToUpdate = remoteSupplement.copyWith(id: existingSupplement.id);
if (remoteSupplement.lastModified
.isAfter(existingSupplement.lastModified)) {
final supplementToUpdate =
remoteSupplement.copyWith(id: existingSupplement.id);
await localDb.update(
'supplements',
supplementToUpdate.toMap(),
@@ -339,11 +349,13 @@ class DatabaseSyncService {
whereArgs: [existingSupplement.id],
);
if (kDebugMode) {
print('SupplementsLog: ✓ Updated supplement: ${remoteSupplement.name}');
print(
'SupplementsLog: ✓ Updated supplement: ${remoteSupplement.name}');
}
} else {
if (kDebugMode) {
print('SupplementsLog: Local supplement ${remoteSupplement.name} is newer, keeping local version');
print(
'SupplementsLog: Local supplement ${remoteSupplement.name} is newer, keeping local version');
}
}
}