background upload plugin

add schemas

sync variants

formatting

initial implementation

use existing db, wip

move to separate folder

fix table definitions

wip

wiring it up
This commit is contained in:
mertalev
2025-11-09 20:09:08 -05:00
parent af22f9b014
commit c70146c4a8
67 changed files with 17482 additions and 1260 deletions
@@ -93,7 +93,7 @@ class _DriftBackupPageState extends ConsumerState<DriftBackupPage> {
Logger("DriftBackupPage").warning("Remote sync did not complete successfully, skipping backup");
return;
}
await backupNotifier.startBackup(currentUser.id);
await backupNotifier.startBackup();
}
Future<void> stopBackup() async {
@@ -116,11 +116,10 @@ class _DriftBackupAlbumSelectionPageState extends ConsumerState<DriftBackupAlbum
unawaited(
backupNotifier.cancel().whenComplete(
() => backgroundSync.syncRemote().then((success) {
if (success) {
return backupNotifier.startBackup(user.id);
} else {
Logger('DriftBackupAlbumSelectionPage').warning('Background sync failed, not starting backup');
if (!success) {
Logger('DriftBackupAlbumSelectionPage').warning('Remote sync failed');
}
return backupNotifier.startBackup();
}),
),
);
@@ -63,7 +63,7 @@ class DriftBackupOptionsPage extends ConsumerWidget {
backupNotifier.cancel().whenComplete(
() => backgroundSync.syncRemote().then((success) {
if (success) {
return backupNotifier.startBackup(currentUser.id);
return backupNotifier.startBackup();
} else {
Logger('DriftBackupOptionsPage').warning('Background sync failed, not starting backup');
}
@@ -8,8 +8,8 @@ import 'package:immich_mobile/entities/store.entity.dart';
import 'package:immich_mobile/providers/auth.provider.dart';
import 'package:immich_mobile/providers/background_sync.provider.dart';
import 'package:immich_mobile/providers/backup/backup.provider.dart';
import 'package:immich_mobile/providers/backup/drift_backup.provider.dart';
import 'package:immich_mobile/providers/gallery_permission.provider.dart';
import 'package:immich_mobile/providers/infrastructure/platform.provider.dart';
import 'package:immich_mobile/providers/server_info.provider.dart';
import 'package:immich_mobile/providers/websocket.provider.dart';
import 'package:immich_mobile/routing/router.dart';
@@ -53,7 +53,6 @@ class SplashScreenPageState extends ConsumerState<SplashScreenPage> {
final infoProvider = ref.read(serverInfoProvider.notifier);
final wsProvider = ref.read(websocketProvider.notifier);
final backgroundManager = ref.read(backgroundSyncProvider);
final backupProvider = ref.read(driftBackupProvider.notifier);
unawaited(
ref.read(authProvider.notifier).saveAuthInfo(accessToken: accessToken).then(
@@ -63,22 +62,13 @@ class SplashScreenPageState extends ConsumerState<SplashScreenPage> {
unawaited(infoProvider.getServerInfo());
if (Store.isBetaTimelineEnabled) {
bool syncSuccess = false;
await Future.wait([
backgroundManager.syncLocal(full: true),
backgroundManager.syncRemote().then((success) => syncSuccess = success),
backgroundManager.syncRemote(),
]);
if (syncSuccess) {
await Future.wait([
backgroundManager.hashAssets().then((_) {
_resumeBackup(backupProvider);
}),
_resumeBackup(backupProvider),
]);
} else {
await backgroundManager.hashAssets();
}
await backgroundManager.hashAssets();
await uploadApi.refresh();
if (Store.get(StoreKey.syncAlbums, false)) {
await backgroundManager.syncLinkedAlbum();
@@ -126,17 +116,6 @@ class SplashScreenPageState extends ConsumerState<SplashScreenPage> {
}
}
Future<void> _resumeBackup(DriftBackupNotifier notifier) async {
final isEnableBackup = Store.get(StoreKey.enableBackup, false);
if (isEnableBackup) {
final currentUser = Store.tryGet(StoreKey.currentUser);
if (currentUser != null) {
unawaited(notifier.handleBackupResume(currentUser.id));
}
}
}
@override
Widget build(BuildContext context) {
return const Scaffold(
@@ -37,10 +37,7 @@ class ShareIntentPage extends HookConsumerWidget {
}
void upload() async {
for (final attachment in candidates) {
await ref.read(shareIntentUploadProvider.notifier).upload(attachment.file);
}
await ref.read(shareIntentUploadProvider.notifier).upload(candidates);
isUploaded.value = true;
}
@@ -212,6 +209,11 @@ class UploadStatusIcon extends StatelessWidget {
color: context.primaryColor,
semanticLabel: 'paused'.tr(),
),
UploadStatus.preparing => Icon(
Icons.hourglass_top_rounded,
color: context.primaryColor,
semanticLabel: 'preparing'.tr(),
),
};
return statusIcon;