This commit is contained in:
Alex 2025-06-16 12:48:18 -05:00
parent 09ea99f058
commit 1b752717bf
No known key found for this signature in database
GPG Key ID: 53CD082B3A5E1082
13 changed files with 44 additions and 189 deletions

View File

@ -15,3 +15,8 @@ const int kBatchHashSizeLimit = 1024 * 1024 * 1024; // 1GB
// Secure storage keys // Secure storage keys
const String kSecuredPinCode = "secured_pin_code"; const String kSecuredPinCode = "secured_pin_code";
// background_downloader task groups
const kManualUploadGroup = 'manual_upload_group';
const kBackupGroup = 'backup_group';
const kBackupLivePhotoGroup = 'backup_live_photo_group';

View File

@ -5,7 +5,6 @@ import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
import 'package:immich_mobile/domain/models/local_album.model.dart'; import 'package:immich_mobile/domain/models/local_album.model.dart';
import 'package:immich_mobile/infrastructure/repositories/db.repository.dart'; import 'package:immich_mobile/infrastructure/repositories/db.repository.dart';
import 'package:immich_mobile/providers/infrastructure/db.provider.dart'; import 'package:immich_mobile/providers/infrastructure/db.provider.dart';
import 'package:platform/platform.dart';
import "package:immich_mobile/utils/database.utils.dart"; import "package:immich_mobile/utils/database.utils.dart";
final backupRepositoryProvider = Provider<IBackupRepository>( final backupRepositoryProvider = Provider<IBackupRepository>(
@ -15,10 +14,7 @@ final backupRepositoryProvider = Provider<IBackupRepository>(
class DriftBackupRepository extends DriftDatabaseRepository class DriftBackupRepository extends DriftDatabaseRepository
implements IBackupRepository { implements IBackupRepository {
final Drift _db; final Drift _db;
final Platform _platform; const DriftBackupRepository(this._db) : super(_db);
const DriftBackupRepository(this._db, {Platform? platform})
: _platform = platform ?? const LocalPlatform(),
super(_db);
@override @override
Future<List<LocalAsset>> getAssets(String albumId) { Future<List<LocalAsset>> getAssets(String albumId) {

View File

@ -6,9 +6,9 @@ abstract interface class IUploadRepository {
void enqueueAll(List<UploadTask> tasks); void enqueueAll(List<UploadTask> tasks);
Future<bool> cancel(String id); Future<bool> cancel(String id);
Future<bool> cancelAll(); Future<bool> cancelAll(String group);
Future<void> pauseAll(); Future<void> pauseAll(String group);
Future<void> deleteAllTrackingRecords(); Future<void> deleteAllTrackingRecords(String group);
Future<void> deleteRecordsWithIds(List<String> id); Future<void> deleteRecordsWithIds(List<String> id);
Future<List<TaskRecord>> getRecords([TaskStatus? status]); Future<List<TaskRecord>> getRecords([TaskStatus? status]);
} }

View File

@ -1,6 +1,3 @@
import 'dart:io';
import 'dart:math';
import 'package:auto_route/auto_route.dart'; import 'package:auto_route/auto_route.dart';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';

View File

@ -134,7 +134,7 @@ class ShareIntentUploadStateNotifier
} }
Future<void> upload(File file) { Future<void> upload(File file) {
return _uploadService.buildUploadTask(file); return _uploadService.buildUploadTask(file, group: kManualUploadGroup);
} }
Future<bool> cancelUpload(String id) { Future<bool> cancelUpload(String id) {

View File

@ -1,12 +1,10 @@
import 'dart:io'; import 'dart:io';
import 'package:background_downloader/background_downloader.dart';
import 'package:cancellation_token_http/http.dart'; import 'package:cancellation_token_http/http.dart';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/constants/constants.dart';
import 'package:immich_mobile/domain/models/store.model.dart'; import 'package:immich_mobile/domain/models/store.model.dart';
import 'package:immich_mobile/entities/album.entity.dart'; import 'package:immich_mobile/entities/album.entity.dart';
import 'package:immich_mobile/entities/backup_album.entity.dart'; import 'package:immich_mobile/entities/backup_album.entity.dart';
@ -22,7 +20,6 @@ import 'package:immich_mobile/models/backup/current_upload_asset.model.dart';
import 'package:immich_mobile/models/backup/error_upload_asset.model.dart'; import 'package:immich_mobile/models/backup/error_upload_asset.model.dart';
import 'package:immich_mobile/models/backup/success_upload_asset.model.dart'; import 'package:immich_mobile/models/backup/success_upload_asset.model.dart';
import 'package:immich_mobile/models/server_info/server_disk_info.model.dart'; import 'package:immich_mobile/models/server_info/server_disk_info.model.dart';
import 'package:immich_mobile/models/upload/share_intent_attachment.model.dart';
import 'package:immich_mobile/providers/app_life_cycle.provider.dart'; import 'package:immich_mobile/providers/app_life_cycle.provider.dart';
import 'package:immich_mobile/providers/auth.provider.dart'; import 'package:immich_mobile/providers/auth.provider.dart';
import 'package:immich_mobile/providers/backup/error_backup_list.provider.dart'; import 'package:immich_mobile/providers/backup/error_backup_list.provider.dart';
@ -33,7 +30,6 @@ import 'package:immich_mobile/services/background.service.dart';
import 'package:immich_mobile/services/backup.service.dart'; import 'package:immich_mobile/services/backup.service.dart';
import 'package:immich_mobile/services/backup_album.service.dart'; import 'package:immich_mobile/services/backup_album.service.dart';
import 'package:immich_mobile/services/server_info.service.dart'; import 'package:immich_mobile/services/server_info.service.dart';
import 'package:immich_mobile/services/upload.service.dart';
import 'package:immich_mobile/utils/backup_progress.dart'; import 'package:immich_mobile/utils/backup_progress.dart';
import 'package:immich_mobile/utils/diff.dart'; import 'package:immich_mobile/utils/diff.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
@ -51,7 +47,6 @@ final backupProvider =
ref.watch(albumMediaRepositoryProvider), ref.watch(albumMediaRepositoryProvider),
ref.watch(fileMediaRepositoryProvider), ref.watch(fileMediaRepositoryProvider),
ref.watch(backupAlbumServiceProvider), ref.watch(backupAlbumServiceProvider),
ref.watch(uploadServiceProvider),
ref, ref,
); );
}); });
@ -66,7 +61,6 @@ class BackupNotifier extends StateNotifier<BackUpState> {
this._albumMediaRepository, this._albumMediaRepository,
this._fileMediaRepository, this._fileMediaRepository,
this._backupAlbumService, this._backupAlbumService,
this._uploadService,
this.ref, this.ref,
) : super( ) : super(
BackUpState( BackUpState(
@ -106,10 +100,7 @@ class BackupNotifier extends StateNotifier<BackUpState> {
), ),
iCloudDownloadProgress: 0.0, iCloudDownloadProgress: 0.0,
), ),
) { );
_uploadService.onUploadStatus = _uploadStatusCallback;
_uploadService.onTaskProgress = _taskProgressCallback;
}
final log = Logger('BackupNotifier'); final log = Logger('BackupNotifier');
final BackupService _backupService; final BackupService _backupService;
@ -120,7 +111,6 @@ class BackupNotifier extends StateNotifier<BackUpState> {
final IAlbumMediaRepository _albumMediaRepository; final IAlbumMediaRepository _albumMediaRepository;
final IFileMediaRepository _fileMediaRepository; final IFileMediaRepository _fileMediaRepository;
final BackupAlbumService _backupAlbumService; final BackupAlbumService _backupAlbumService;
final UploadService _uploadService;
final Ref ref; final Ref ref;
/// ///
@ -498,7 +488,7 @@ class BackupNotifier extends StateNotifier<BackUpState> {
Future<void> startBackupProcess() async { Future<void> startBackupProcess() async {
debugPrint("Start backup process"); debugPrint("Start backup process");
assert(state.backupProgress == BackUpProgressEnum.idle); assert(state.backupProgress == BackUpProgressEnum.idle);
// state = state.copyWith(backupProgress: BackUpProgressEnum.inProgress); state = state.copyWith(backupProgress: BackUpProgressEnum.inProgress);
await getBackupInfo(); await getBackupInfo();
@ -532,89 +522,21 @@ class BackupNotifier extends StateNotifier<BackUpState> {
state = state.copyWith(iCloudDownloadProgress: progress); state = state.copyWith(iCloudDownloadProgress: progress);
}); });
// await _backupService.backupAsset( await _backupService.backupAsset(
// assetsWillBeBackup, assetsWillBeBackup,
// state.cancelToken, state.cancelToken,
// pmProgressHandler: pmProgressHandler, pmProgressHandler: pmProgressHandler,
// onSuccess: _onAssetUploaded, onSuccess: _onAssetUploaded,
// onProgress: _onUploadProgress, onProgress: _onUploadProgress,
// onCurrentAsset: _onSetCurrentBackupAsset, onCurrentAsset: _onSetCurrentBackupAsset,
// onError: _onBackupError, onError: _onBackupError,
// ); );
await _backupService.uploadAssets(assetsWillBeBackup);
await notifyBackgroundServiceCanRun(); await notifyBackgroundServiceCanRun();
} else { } else {
openAppSettings(); openAppSettings();
} }
} }
void _updateUploadStatus(TaskStatusUpdate task, TaskStatus status) async {
if (status == TaskStatus.canceled) {
return;
}
final taskId = task.task.taskId;
final uploadStatus = switch (task.status) {
TaskStatus.complete => UploadStatus.complete,
TaskStatus.failed => UploadStatus.failed,
TaskStatus.canceled => UploadStatus.canceled,
TaskStatus.enqueued => UploadStatus.enqueued,
TaskStatus.running => UploadStatus.running,
TaskStatus.paused => UploadStatus.paused,
TaskStatus.notFound => UploadStatus.notFound,
TaskStatus.waitingToRetry => UploadStatus.waitingtoRetry
};
// state = [
// for (final attachment in state)
// if (attachment.id == taskId.toInt())
// attachment.copyWith(status: uploadStatus)
// else
// attachment,
// ];
}
void _uploadStatusCallback(TaskStatusUpdate update) {
_updateUploadStatus(update, update.status);
switch (update.status) {
case TaskStatus.complete:
// if (update.responseStatusCode == 200) {
// if (kDebugMode) {
// debugPrint("[COMPLETE] ${update.task.taskId} - DUPLICATE");
// }
// } else {
// if (kDebugMode) {
// debugPrint("[COMPLETE] ${update.task.taskId}");
// }
// }
break;
default:
break;
}
}
void _taskProgressCallback(TaskProgressUpdate update) {
// Ignore if the task is canceled or completed
if (update.progress == downloadFailed ||
update.progress == downloadCompleted) {
return;
}
// print("[_taskProgressCallback] $update");
final taskId = update.task.taskId;
// state = [
// for (final attachment in state)
// if (attachment.id == taskId.toInt())
// attachment.copyWith(uploadProgress: update.progress)
// else
// attachment,
// ];
}
void setAvailableAlbums(availableAlbums) { void setAvailableAlbums(availableAlbums) {
state = state.copyWith( state = state.copyWith(
availableAlbums: availableAlbums, availableAlbums: availableAlbums,

View File

@ -6,8 +6,6 @@ import 'package:background_downloader/background_downloader.dart';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/domain/utils/background_sync.dart';
import 'package:immich_mobile/providers/background_sync.provider.dart';
import 'package:immich_mobile/services/exp_backup.service.dart'; import 'package:immich_mobile/services/exp_backup.service.dart';
import 'package:immich_mobile/services/upload.service.dart'; import 'package:immich_mobile/services/upload.service.dart';
@ -158,7 +156,6 @@ final expBackupProvider =
return ExpBackupNotifier( return ExpBackupNotifier(
ref.watch(expBackupServiceProvider), ref.watch(expBackupServiceProvider),
ref.watch(uploadServiceProvider), ref.watch(uploadServiceProvider),
ref.watch(backgroundSyncProvider),
); );
}); });
@ -166,7 +163,6 @@ class ExpBackupNotifier extends StateNotifier<ExpBackupState> {
ExpBackupNotifier( ExpBackupNotifier(
this._backupService, this._backupService,
this._uploadService, this._uploadService,
this._backgroundSyncManager,
) : super( ) : super(
ExpBackupState( ExpBackupState(
totalCount: 0, totalCount: 0,
@ -183,7 +179,6 @@ class ExpBackupNotifier extends StateNotifier<ExpBackupState> {
final ExpBackupService _backupService; final ExpBackupService _backupService;
final UploadService _uploadService; final UploadService _uploadService;
final BackgroundSyncManager _backgroundSyncManager;
StreamSubscription<TaskStatusUpdate>? _statusSubscription; StreamSubscription<TaskStatusUpdate>? _statusSubscription;
StreamSubscription<TaskProgressUpdate>? _progressSubscription; StreamSubscription<TaskProgressUpdate>? _progressSubscription;

View File

@ -1,7 +1,7 @@
import 'package:background_downloader/background_downloader.dart'; import 'package:background_downloader/background_downloader.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/constants/constants.dart';
import 'package:immich_mobile/interfaces/upload.interface.dart'; import 'package:immich_mobile/interfaces/upload.interface.dart';
import 'package:immich_mobile/utils/upload.dart';
final uploadRepositoryProvider = Provider((ref) => UploadRepository()); final uploadRepositoryProvider = Provider((ref) => UploadRepository());
@ -19,12 +19,12 @@ class UploadRepository implements IUploadRepository {
taskQueue.maxConcurrent = 5; taskQueue.maxConcurrent = 5;
FileDownloader().addTaskQueue(taskQueue); FileDownloader().addTaskQueue(taskQueue);
FileDownloader().registerCallbacks( FileDownloader().registerCallbacks(
group: kUploadGroup, group: kBackupGroup,
taskStatusCallback: (update) => onUploadStatus?.call(update), taskStatusCallback: (update) => onUploadStatus?.call(update),
taskProgressCallback: (update) => onTaskProgress?.call(update), taskProgressCallback: (update) => onTaskProgress?.call(update),
); );
FileDownloader().registerCallbacks( FileDownloader().registerCallbacks(
group: kUploadLivePhotoGroup, group: kBackupLivePhotoGroup,
taskStatusCallback: (update) => onUploadStatus?.call(update), taskStatusCallback: (update) => onUploadStatus?.call(update),
taskProgressCallback: (update) => onTaskProgress?.call(update), taskProgressCallback: (update) => onTaskProgress?.call(update),
); );
@ -36,8 +36,8 @@ class UploadRepository implements IUploadRepository {
} }
@override @override
Future<void> deleteAllTrackingRecords() { Future<void> deleteAllTrackingRecords(String group) {
return FileDownloader().database.deleteAllRecords(group: kUploadGroup); return FileDownloader().database.deleteAllRecords(group: group);
} }
@override @override
@ -46,14 +46,14 @@ class UploadRepository implements IUploadRepository {
} }
@override @override
Future<bool> cancelAll() { Future<bool> cancelAll(String group) {
taskQueue.removeTasksWithGroup(kUploadGroup); taskQueue.removeTasksWithGroup(group);
return FileDownloader().cancelAll(group: kUploadGroup); return FileDownloader().cancelAll(group: group);
} }
@override @override
Future<void> pauseAll() { Future<void> pauseAll(String group) {
return FileDownloader().pauseAll(group: kUploadGroup); return FileDownloader().pauseAll(group: group);
} }
@override @override
@ -64,7 +64,7 @@ class UploadRepository implements IUploadRepository {
@override @override
Future<List<TaskRecord>> getRecords([TaskStatus? status]) { Future<List<TaskRecord>> getRecords([TaskStatus? status]) {
if (status == null) { if (status == null) {
return FileDownloader().database.allRecords(group: kUploadGroup); return FileDownloader().database.allRecords(group: kBackupGroup);
} }
return FileDownloader().database.allRecordsWithStatus(status); return FileDownloader().database.allRecordsWithStatus(status);

View File

@ -2,7 +2,6 @@ import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'package:background_downloader/background_downloader.dart';
import 'package:cancellation_token_http/http.dart' as http; import 'package:cancellation_token_http/http.dart' as http;
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -29,7 +28,6 @@ import 'package:immich_mobile/repositories/file_media.repository.dart';
import 'package:immich_mobile/services/album.service.dart'; import 'package:immich_mobile/services/album.service.dart';
import 'package:immich_mobile/services/api.service.dart'; import 'package:immich_mobile/services/api.service.dart';
import 'package:immich_mobile/services/app_settings.service.dart'; import 'package:immich_mobile/services/app_settings.service.dart';
import 'package:immich_mobile/services/upload.service.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:openapi/api.dart'; import 'package:openapi/api.dart';
import 'package:path/path.dart' as p; import 'package:path/path.dart' as p;
@ -45,7 +43,6 @@ final backupServiceProvider = Provider(
ref.watch(fileMediaRepositoryProvider), ref.watch(fileMediaRepositoryProvider),
ref.watch(assetRepositoryProvider), ref.watch(assetRepositoryProvider),
ref.watch(assetMediaRepositoryProvider), ref.watch(assetMediaRepositoryProvider),
ref.watch(uploadServiceProvider),
), ),
); );
@ -59,7 +56,6 @@ class BackupService {
final IFileMediaRepository _fileMediaRepository; final IFileMediaRepository _fileMediaRepository;
final IAssetRepository _assetRepository; final IAssetRepository _assetRepository;
final IAssetMediaRepository _assetMediaRepository; final IAssetMediaRepository _assetMediaRepository;
final UploadService _uploadService;
BackupService( BackupService(
this._apiService, this._apiService,
@ -69,7 +65,6 @@ class BackupService {
this._fileMediaRepository, this._fileMediaRepository,
this._assetRepository, this._assetRepository,
this._assetMediaRepository, this._assetMediaRepository,
this._uploadService,
); );
Future<List<String>?> getDeviceBackupAsset() async { Future<List<String>?> getDeviceBackupAsset() async {
@ -254,52 +249,6 @@ class BackupService {
); );
} }
uploadAssets(
Iterable<BackupCandidate> assets,
) async {
final hasPermission = await _checkPermissions();
if (!hasPermission) {
return false;
}
List<BackupCandidate> candidates = assets.toList();
List<UploadTask> uploadTasks = [];
for (final candidate in candidates) {
final Asset asset = candidate.asset;
File? file;
File? livePhotoFile;
file = await asset.local!.originFile.timeout(const Duration(seconds: 5));
if (asset.local!.isLivePhoto) {
livePhotoFile = await asset.local!.originFileWithSubtype
.timeout(const Duration(seconds: 5));
}
if (file != null) {
String? originalFileName =
await _assetMediaRepository.getOriginalFilename(asset.localId!) ??
asset.fileName;
final task = await _uploadService.buildUploadTask(
file,
originalFileName: originalFileName,
deviceAssetId: asset.localId,
);
uploadTasks.add(task);
}
}
if (uploadTasks.isEmpty) {
debugPrint("No assets to upload");
return false;
}
print("Uploading ${uploadTasks.length} assets");
_uploadService.enqueueTasks(uploadTasks);
}
Future<bool> backupAsset( Future<bool> backupAsset(
Iterable<BackupCandidate> assets, Iterable<BackupCandidate> assets,
http.CancellationToken cancelToken, { http.CancellationToken cancelToken, {

View File

@ -5,9 +5,9 @@ import 'dart:io';
import 'package:background_downloader/background_downloader.dart'; import 'package:background_downloader/background_downloader.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:immich_mobile/constants/constants.dart';
import 'package:immich_mobile/domain/interfaces/local_asset.interface.dart'; import 'package:immich_mobile/domain/interfaces/local_asset.interface.dart';
import 'package:immich_mobile/providers/infrastructure/asset.provider.dart'; import 'package:immich_mobile/providers/infrastructure/asset.provider.dart';
import 'package:immich_mobile/utils/upload.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:path/path.dart' as p; import 'package:path/path.dart' as p;
import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart';
@ -172,6 +172,7 @@ class ExpBackupService {
originalFileName: originalFileName, originalFileName: originalFileName,
deviceAssetId: asset.id, deviceAssetId: asset.id,
metadata: metadata, metadata: metadata,
group: kBackupGroup,
); );
} }
@ -198,13 +199,13 @@ class ExpBackupService {
originalFileName: asset.name, originalFileName: asset.name,
deviceAssetId: asset.id, deviceAssetId: asset.id,
fields: fields, fields: fields,
group: kUploadLivePhotoGroup, group: kBackupLivePhotoGroup,
); );
} }
Future<void> cancel() async { Future<void> cancel() async {
shouldCancel = true; shouldCancel = true;
await _uploadService.cancel(); await _uploadService.cancelAllForGroup(kBackupGroup);
} }
} }

View File

@ -3,12 +3,12 @@ import 'dart:io';
import 'package:background_downloader/background_downloader.dart'; import 'package:background_downloader/background_downloader.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/constants/constants.dart';
import 'package:immich_mobile/domain/models/store.model.dart'; import 'package:immich_mobile/domain/models/store.model.dart';
import 'package:immich_mobile/entities/store.entity.dart'; import 'package:immich_mobile/entities/store.entity.dart';
import 'package:immich_mobile/interfaces/upload.interface.dart'; import 'package:immich_mobile/interfaces/upload.interface.dart';
import 'package:immich_mobile/repositories/upload.repository.dart'; import 'package:immich_mobile/repositories/upload.repository.dart';
import 'package:immich_mobile/services/api.service.dart'; import 'package:immich_mobile/services/api.service.dart';
import 'package:immich_mobile/utils/upload.dart';
import 'package:path/path.dart'; import 'package:path/path.dart';
final uploadServiceProvider = Provider( final uploadServiceProvider = Provider(
@ -61,13 +61,13 @@ class UploadService {
return FileDownloader().cancelTaskWithId(id); return FileDownloader().cancelTaskWithId(id);
} }
Future<void> cancel() async { Future<void> cancelAllForGroup(String group) async {
await _uploadRepository.cancelAll(); await _uploadRepository.cancelAll(group);
await _uploadRepository.deleteAllTrackingRecords(); await _uploadRepository.deleteAllTrackingRecords(group);
} }
Future<void> pause() { Future<void> pauseAll() {
return _uploadRepository.pauseAll(); return _uploadRepository.pauseAll(kBackupGroup);
} }
Future<List<TaskRecord>> getRecords() async { Future<List<TaskRecord>> getRecords() async {
@ -81,11 +81,11 @@ class UploadService {
Future<UploadTask> buildUploadTask( Future<UploadTask> buildUploadTask(
File file, { File file, {
required String group,
Map<String, String>? fields, Map<String, String>? fields,
String? originalFileName, String? originalFileName,
String? deviceAssetId, String? deviceAssetId,
String? metadata, String? metadata,
String group = kUploadGroup,
}) async { }) async {
return _buildTask( return _buildTask(
deviceAssetId ?? hash(file.path).toString(), deviceAssetId ?? hash(file.path).toString(),
@ -100,10 +100,10 @@ class UploadService {
Future<UploadTask> _buildTask( Future<UploadTask> _buildTask(
String id, String id,
File file, { File file, {
required String group,
Map<String, String>? fields, Map<String, String>? fields,
String? originalFileName, String? originalFileName,
String? metadata, String? metadata,
String group = kUploadGroup,
}) async { }) async {
final serverEndpoint = Store.get(StoreKey.serverEndpoint); final serverEndpoint = Store.get(StoreKey.serverEndpoint);
final url = Uri.parse('$serverEndpoint/assets').toString(); final url = Uri.parse('$serverEndpoint/assets').toString();

View File

@ -1,2 +0,0 @@
const kUploadGroup = 'upload_group';
const kUploadLivePhotoGroup = 'upload_live_photo_group';

View File

@ -1,15 +1,7 @@
import 'dart:io';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/extensions/build_context_extensions.dart'; import 'package:immich_mobile/extensions/build_context_extensions.dart';
import 'package:immich_mobile/providers/backup/exp_backup.provider.dart'; import 'package:immich_mobile/providers/backup/exp_backup.provider.dart';
import 'package:immich_mobile/widgets/backup/asset_info_table.dart';
import 'package:immich_mobile/widgets/backup/error_chip.dart';
import 'package:immich_mobile/widgets/backup/icloud_download_progress_bar.dart';
import 'package:immich_mobile/widgets/backup/upload_progress_bar.dart';
import 'package:immich_mobile/widgets/backup/upload_stats.dart';
class CurrentUploadingAssetInfoBox extends ConsumerWidget { class CurrentUploadingAssetInfoBox extends ConsumerWidget {
const CurrentUploadingAssetInfoBox({super.key}); const CurrentUploadingAssetInfoBox({super.key});