mirror of
https://github.com/immich-app/immich.git
synced 2024-12-25 10:43:13 +02:00
fix(mobile): fix asset removal edge cases (#2251)
Co-authored-by: Fynn Petersen-Frey <zoodyy@users.noreply.github.com> Co-authored-by: Alex <alex.tran1502@gmail.com>
This commit is contained in:
parent
100866be37
commit
1a64075027
@ -9,6 +9,7 @@ import 'package:immich_mobile/shared/models/store.dart';
|
|||||||
import 'package:immich_mobile/shared/models/user.dart';
|
import 'package:immich_mobile/shared/models/user.dart';
|
||||||
import 'package:immich_mobile/shared/providers/db.provider.dart';
|
import 'package:immich_mobile/shared/providers/db.provider.dart';
|
||||||
import 'package:immich_mobile/utils/async_mutex.dart';
|
import 'package:immich_mobile/utils/async_mutex.dart';
|
||||||
|
import 'package:immich_mobile/utils/builtin_extensions.dart';
|
||||||
import 'package:immich_mobile/utils/diff.dart';
|
import 'package:immich_mobile/utils/diff.dart';
|
||||||
import 'package:immich_mobile/utils/tuple.dart';
|
import 'package:immich_mobile/utils/tuple.dart';
|
||||||
import 'package:isar/isar.dart';
|
import 'package:isar/isar.dart';
|
||||||
@ -674,7 +675,9 @@ Pair<List<int>, List<Asset>> _handleAssetRemoval(
|
|||||||
return const Pair([], []);
|
return const Pair([], []);
|
||||||
}
|
}
|
||||||
deleteCandidates.sort(Asset.compareById);
|
deleteCandidates.sort(Asset.compareById);
|
||||||
|
deleteCandidates.uniqueConsecutive((a) => a.id);
|
||||||
existing.sort(Asset.compareById);
|
existing.sort(Asset.compareById);
|
||||||
|
existing.uniqueConsecutive((a) => a.id);
|
||||||
final triple = _diffAssets(
|
final triple = _diffAssets(
|
||||||
existing,
|
existing,
|
||||||
deleteCandidates,
|
deleteCandidates,
|
||||||
|
@ -18,3 +18,20 @@ extension DurationExtension on String {
|
|||||||
return int.parse(this);
|
return int.parse(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extension ListExtension<E> on List<E> {
|
||||||
|
List<E> uniqueConsecutive<T>([T Function(E element)? key]) {
|
||||||
|
key ??= (E e) => e as T;
|
||||||
|
int i = 1, j = 1;
|
||||||
|
for (; i < length; i++) {
|
||||||
|
if (key(this[i]) != key(this[i - 1])) {
|
||||||
|
if (i != j) {
|
||||||
|
this[j] = this[i];
|
||||||
|
}
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
length = length == 0 ? 0 : j;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -15,4 +15,35 @@ void main() {
|
|||||||
expect("a:b:c".toDuration(), null);
|
expect("a:b:c".toDuration(), null);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
group('Test uniqueConsecutive', () {
|
||||||
|
test('empty', () {
|
||||||
|
final a = [];
|
||||||
|
expect(a.uniqueConsecutive(), []);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('singleElement', () {
|
||||||
|
final a = [5];
|
||||||
|
expect(a.uniqueConsecutive(), [5]);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('noDuplicates', () {
|
||||||
|
final a = [1, 2, 3];
|
||||||
|
expect(a.uniqueConsecutive(), [1, 2, 3]);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('unsortedDuplicates', () {
|
||||||
|
final a = [1, 2, 1, 3];
|
||||||
|
expect(a.uniqueConsecutive(), [1, 2, 1, 3]);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('sortedDuplicates', () {
|
||||||
|
final a = [6, 6, 2, 3, 3, 3, 4, 5, 1, 1];
|
||||||
|
expect(a.uniqueConsecutive(), [6, 2, 3, 4, 5, 1]);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('withKey', () {
|
||||||
|
final a = ["a", "bb", "cc", "ddd"];
|
||||||
|
expect(a.uniqueConsecutive((s) => s.length), ["a", "bb", "ddd"]);
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user