fix(regressions): restore member counts and improve duplicate-copy feedback

This commit is contained in:
Lukas Müllner 2026-03-05 15:10:32 +01:00
parent ff9aa57548
commit eab9000247
2 changed files with 73 additions and 10 deletions

View file

@ -476,11 +476,12 @@ class GarageScreenState extends State<GarageScreen> {
);
if (confirmed != true || targetId == null) return;
final targetCollectionId = targetId!;
if (isOwner) {
await supabase
.from('hotwheels')
.update({'collection_id': targetId})
.update({'collection_id': targetCollectionId})
.inFilter('id', _selectedIds.toList());
} else {
final userId = supabase.auth.currentUser?.id;
@ -492,22 +493,54 @@ class GarageScreenState extends State<GarageScreen> {
.where((car) => _selectedIds.contains(car['id'] as int))
.toList(growable: false);
final hwIds = sourceCars
.map((car) => car['hw_id'] as String)
.toSet()
.toList(growable: false);
final existing = await supabase
.from('hotwheels')
.select('hw_id')
.eq('collection_id', targetCollectionId)
.inFilter('hw_id', hwIds);
final existingHwIds = (existing as List)
.map((row) => row['hw_id'] as String)
.toSet();
final insertRows = sourceCars.map((car) {
final notes = car['notes'] as String?;
final imagePath = car['user_image_url'] as String?;
return <String, dynamic>{
'hw_id': car['hw_id'] as String,
'user_id': userId,
'collection_id': targetId,
'collection_id': targetCollectionId,
if (notes != null && notes.trim().isNotEmpty) 'notes': notes,
if (imagePath != null && imagePath.isNotEmpty)
'user_image_url': imagePath,
};
}).toList(growable: false);
}).where((row) => !existingHwIds.contains(row['hw_id'] as String)).toList(
growable: false,
);
final skippedDuplicates = sourceCars.length - insertRows.length;
if (insertRows.isEmpty) {
showGlobalSnackBar(
'All selected cars are already in the target collection.',
isError: true,
);
return;
}
if (insertRows.isNotEmpty) {
await supabase.from('hotwheels').insert(insertRows);
}
if (skippedDuplicates > 0) {
showGlobalSnackBar(
'$skippedDuplicates car(s) skipped because they already exist in target collection.',
);
}
}
if (!mounted) return;
@ -1069,6 +1102,21 @@ class GarageScreenState extends State<GarageScreen> {
throw Exception('You must be signed in to copy cars.');
}
final existing = await supabase
.from('hotwheels')
.select('id')
.eq('collection_id', targetId)
.eq('hw_id', car['hw_id'])
.maybeSingle();
if (existing != null) {
showGlobalSnackBar(
'${car['hw_id']} is already in the target collection.',
isError: true,
);
return;
}
final notes = car['notes'] as String?;
final imagePath = car['user_image_url'] as String?;
await supabase.from('hotwheels').insert({

View file

@ -114,14 +114,29 @@ class CollectionService {
final itemCounts = await getCollectionItemCounts(collectionIdList);
final memberCounts = <String, int>{};
final members = await supabase
.from('collection_members')
.select('collection_id')
.inFilter('collection_id', collectionIdList);
await Future.wait(collectionIdList.map((collectionId) async {
try {
final rows = await supabase.rpc('get_collection_members', params: {
'p_collection_id': collectionId,
});
memberCounts[collectionId] = (rows as List).length;
} catch (_) {
}
}));
for (final member in members) {
final collectionId = member['collection_id'] as String;
memberCounts[collectionId] = (memberCounts[collectionId] ?? 0) + 1;
final unresolvedIds = collectionIdList
.where((id) => !memberCounts.containsKey(id))
.toList(growable: false);
if (unresolvedIds.isNotEmpty) {
final members = await supabase
.from('collection_members')
.select('id, collection_id')
.inFilter('collection_id', unresolvedIds);
for (final member in members) {
final collectionId = member['collection_id'] as String;
memberCounts[collectionId] = (memberCounts[collectionId] ?? 0) + 1;
}
}
final collections = <Collection>[];