fix: Downloads resetting with multiple active downloads (#606)

feat: Add sync count icon to menu bars
This commit is contained in:
PartyDonut 2025-11-12 19:51:09 +01:00 committed by GitHub
parent 493f40645c
commit d8f613de07
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 105 additions and 67 deletions

View file

@ -44,6 +44,11 @@ class BackgroundDownloader extends _$BackgroundDownloader {
if (status == TaskStatus.complete || status == TaskStatus.canceled) {
ref.read(downloadTasksProvider(update.task.taskId).notifier).update((state) => DownloadStream.empty());
ref
.read(activeDownloadTasksProvider.notifier)
.update((state) => state.where((element) => element.taskId != update.task.taskId).toList());
ref.read(syncProvider.notifier).cleanupTemporaryFiles();
}
case TaskProgressUpdate():
final progress = update.progress;

View file

@ -54,9 +54,10 @@ class SyncDownloadStatus extends _$SyncDownloadStatus {
if (childItem.videoFile.existsSync()) {
fullySyncedChildren++;
}
if (downloadStream.hasDownload) {
if (downloadStream.isEnqueuedOrDownloading) {
downloadCount++;
fullProgress += downloadStream.progress;
fullProgress += downloadStream.progress.clamp(0.0, 1.0);
mainStream = mainStream.copyWith(
status: mainStream.status != TaskStatus.running ? downloadStream.status : mainStream.status,
);

View file

@ -3,7 +3,6 @@ import 'dart:convert';
import 'dart:developer';
import 'dart:io';
import 'package:fladder/util/string_extensions.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart' hide ConnectionState;
@ -42,11 +41,16 @@ import 'package:fladder/providers/user_provider.dart';
import 'package:fladder/screens/shared/fladder_snackbar.dart';
import 'package:fladder/util/duration_extensions.dart';
import 'package:fladder/util/localization_helper.dart';
import 'package:fladder/util/string_extensions.dart';
final syncProvider = StateNotifierProvider<SyncNotifier, SyncSettingsModel>((ref) => throw UnimplementedError());
final downloadTasksProvider = StateProvider.family<DownloadStream, String?>((ref, id) => DownloadStream.empty());
final activeDownloadTasksProvider = StateProvider<List<DownloadTask>>((ref) {
return [];
});
class SyncNotifier extends StateNotifier<SyncSettingsModel> {
SyncNotifier(this.ref, this.mobileDirectory) : super(SyncSettingsModel()) {
_init();
@ -130,6 +134,9 @@ class SyncNotifier extends StateNotifier<SyncSettingsModel> {
}
Future<void> cleanupTemporaryFiles() async {
final activeDownloads = ref.read(activeDownloadTasksProvider);
if (activeDownloads.isNotEmpty) return;
// List of directories to check
final directories = [
//Desktop directory
@ -518,6 +525,11 @@ class SyncNotifier extends StateNotifier<SyncSettingsModel> {
allowPause: true,
);
ref.read(activeDownloadTasksProvider.notifier).update((state) {
final existingTasks = state.where((element) => element.taskId != downloadTask.taskId).toList();
return [...existingTasks, downloadTask];
});
final defaultDownloadStream = DownloadStream(id: syncItem.id, task: downloadTask, status: TaskStatus.enqueued);
ref.read(downloadTasksProvider(syncItem.id).notifier).update((state) => defaultDownloadStream);
return await ref.read(backgroundDownloaderProvider).enqueue(downloadTask);
@ -621,7 +633,7 @@ extension SyncNotifierHelpers on SyncNotifier {
if (parent == null) {
await _db.insertItem(syncItem);
}
return syncItem.copyWith(
fileSize: response.mediaSources?.firstOrNull?.size ?? 0,
syncing: false,