feature: Improved sync capability

This commit is contained in:
PartyDonut 2025-06-09 21:23:02 +02:00
parent f3e920ac79
commit c5c7f71b84
31 changed files with 500 additions and 344 deletions

View file

@ -11,30 +11,40 @@ part 'sync_provider_helpers.g.dart';
@riverpod
class SyncChildren extends _$SyncChildren {
@override
List<SyncedItem> build(SyncedItem arg) {
final syncedItemIsar = ref.watch(syncProvider.notifier).isar;
final allChildren = <SyncedItem>[];
List<SyncedItem> toProcess = [arg];
List<SyncedItem> build(SyncedItem root) {
final isar = ref.watch(syncProvider.notifier).isar;
final syncPath = ref.read(syncProvider.notifier).syncPath ?? "";
if (isar == null) return [];
final all = <SyncedItem>[];
List<SyncedItem> toProcess = [root];
while (toProcess.isNotEmpty) {
final currentLevel = toProcess.map(
(parent) {
final children = syncedItemIsar?.iSyncedItems.where().parentIdEqualTo(parent.id).sortBySortName().findAll();
return children?.map((e) => SyncedItem.fromIsar(e, ref.read(syncProvider.notifier).syncPath ?? "")) ??
<SyncedItem>[];
},
);
allChildren.addAll(currentLevel.expand((list) => list));
toProcess = currentLevel.expand((list) => list).toList();
final parentIds = toProcess.map((e) => e.id).toList();
final children = <ISyncedItem>[];
for (final id in parentIds) {
final results = isar.iSyncedItems.where().parentIdEqualTo(id).sortBySortName().findAll();
children.addAll(results);
}
if (children.isEmpty) break;
final wrapped = children.map((e) => SyncedItem.fromIsar(e, syncPath)).toList();
all.addAll(wrapped);
toProcess = wrapped;
}
return allChildren;
return all;
}
}
@riverpod
class SyncDownloadStatus extends _$SyncDownloadStatus {
@override
DownloadStream? build(SyncedItem arg) {
final nestedChildren = ref.watch(syncChildrenProvider(arg));
DownloadStream? build(SyncedItem arg, List<SyncedItem> children) {
final nestedChildren = children;
ref.watch(downloadTasksProvider(arg.id));
for (var element in nestedChildren) {
@ -64,20 +74,23 @@ class SyncDownloadStatus extends _$SyncDownloadStatus {
@riverpod
class SyncStatuses extends _$SyncStatuses {
@override
FutureOr<SyncStatus> build(SyncedItem arg) async {
final nestedChildren = ref.watch(syncChildrenProvider(arg));
FutureOr<SyncStatus> build(SyncedItem arg, List<SyncedItem>? children) async {
final nestedChildren = children;
ref.watch(downloadTasksProvider(arg.id));
for (var element in nestedChildren) {
ref.watch(downloadTasksProvider(element.id));
}
if (nestedChildren != null) {
for (var element in nestedChildren) {
ref.watch(downloadTasksProvider(element.id));
}
for (var i = 0; i < nestedChildren.length; i++) {
final item = nestedChildren[i];
if (item.hasVideoFile && !await item.videoFile.exists()) {
return SyncStatus.partially;
for (var i = 0; i < nestedChildren.length; i++) {
final item = nestedChildren[i];
if (item.hasVideoFile && !await item.videoFile.exists()) {
return SyncStatus.partially;
}
}
}
if (arg.hasVideoFile && !await arg.videoFile.exists()) {
return SyncStatus.partially;
}
@ -88,17 +101,21 @@ class SyncStatuses extends _$SyncStatuses {
@riverpod
class SyncSize extends _$SyncSize {
@override
int? build(SyncedItem arg) {
final nestedChildren = ref.watch(syncChildrenProvider(arg));
int? build(SyncedItem arg, List<SyncedItem>? children) {
final nestedChildren = children;
ref.watch(downloadTasksProvider(arg.id));
for (var element in nestedChildren) {
ref.watch(downloadTasksProvider(element.id));
}
int size = arg.fileSize ?? 0;
for (var element in nestedChildren) {
size += element.fileSize ?? 0;
if (nestedChildren != null) {
for (var element in nestedChildren) {
ref.watch(downloadTasksProvider(element.id));
}
for (var element in nestedChildren) {
size += element.fileSize ?? 0;
}
}
return size;
}
}