فهرست منبع

Fix bug in delete when shared files are selected

Neeraj Gupta 1 سال پیش
والد
کامیت
ed43970aac

+ 2 - 0
lib/generated/intl/messages_en.dart

@@ -361,6 +361,8 @@ class MessageLookup extends MessageLookupByLibrary {
         "cancelSubscription":
         "cancelSubscription":
             MessageLookupByLibrary.simpleMessage("Cancel subscription"),
             MessageLookupByLibrary.simpleMessage("Cancel subscription"),
         "cannotAddMorePhotosAfterBecomingViewer": m6,
         "cannotAddMorePhotosAfterBecomingViewer": m6,
+        "cannotDeleteSharedFiles":
+            MessageLookupByLibrary.simpleMessage("Cannot delete shared files"),
         "centerPoint": MessageLookupByLibrary.simpleMessage("Center point"),
         "centerPoint": MessageLookupByLibrary.simpleMessage("Center point"),
         "changeEmail": MessageLookupByLibrary.simpleMessage("Change email"),
         "changeEmail": MessageLookupByLibrary.simpleMessage("Change email"),
         "changePassword":
         "changePassword":

+ 10 - 0
lib/generated/l10n.dart

@@ -3282,6 +3282,16 @@ class S {
     );
     );
   }
   }
 
 
+  /// `Cannot delete shared files`
+  String get cannotDeleteSharedFiles {
+    return Intl.message(
+      'Cannot delete shared files',
+      name: 'cannotDeleteSharedFiles',
+      desc: '',
+      args: [],
+    );
+  }
+
   /// `The download could not be completed`
   /// `The download could not be completed`
   String get theDownloadCouldNotBeCompleted {
   String get theDownloadCouldNotBeCompleted {
     return Intl.message(
     return Intl.message(

+ 1 - 0
lib/l10n/intl_en.arb

@@ -468,6 +468,7 @@
   "updateAvailable": "Update available",
   "updateAvailable": "Update available",
   "ignoreUpdate": "Ignore",
   "ignoreUpdate": "Ignore",
   "downloading": "Downloading...",
   "downloading": "Downloading...",
+  "cannotDeleteSharedFiles": "Cannot delete shared files",
   "theDownloadCouldNotBeCompleted": "The download could not be completed",
   "theDownloadCouldNotBeCompleted": "The download could not be completed",
   "retry": "Retry",
   "retry": "Retry",
   "backedUpFolders": "Backed up folders",
   "backedUpFolders": "Backed up folders",

+ 1 - 0
lib/models/files_split.dart

@@ -13,6 +13,7 @@ class FilesSplit {
 
 
   int get totalFileOwnedCount =>
   int get totalFileOwnedCount =>
       pendingUploads.length + ownedByCurrentUser.length;
       pendingUploads.length + ownedByCurrentUser.length;
+  int get count => totalFileOwnedCount + ownedByOtherUsers.length;
 
 
   static FilesSplit split(Iterable<EnteFile> files, int currentUserID) {
   static FilesSplit split(Iterable<EnteFile> files, int currentUserID) {
     final List<EnteFile> ownedByCurrentUser = [],
     final List<EnteFile> ownedByCurrentUser = [],

+ 1 - 1
lib/ui/viewer/actions/file_selection_actions_widget.dart

@@ -383,7 +383,7 @@ class _FileSelectionActionsWidgetState
   }
   }
 
 
   Future<void> _onDeleteClick() async {
   Future<void> _onDeleteClick() async {
-    return showDeleteSheet(context, widget.selectedFiles);
+    return showDeleteSheet(context, widget.selectedFiles, split);
   }
   }
 
 
   Future<void> _removeFilesFromAlbum() async {
   Future<void> _removeFilesFromAlbum() async {

+ 18 - 13
lib/utils/delete_file_util.dart

@@ -4,6 +4,7 @@ import 'dart:math';
 
 
 import 'package:flutter/material.dart';
 import 'package:flutter/material.dart';
 import 'package:logging/logging.dart';
 import 'package:logging/logging.dart';
+import "package:path/path.dart";
 import 'package:photo_manager/photo_manager.dart';
 import 'package:photo_manager/photo_manager.dart';
 import 'package:photos/core/constants.dart';
 import 'package:photos/core/constants.dart';
 import 'package:photos/core/event_bus.dart';
 import 'package:photos/core/event_bus.dart';
@@ -14,6 +15,7 @@ import "package:photos/events/force_reload_trash_page_event.dart";
 import 'package:photos/events/local_photos_updated_event.dart';
 import 'package:photos/events/local_photos_updated_event.dart';
 import "package:photos/generated/l10n.dart";
 import "package:photos/generated/l10n.dart";
 import 'package:photos/models/file/file.dart';
 import 'package:photos/models/file/file.dart';
+import "package:photos/models/files_split.dart";
 import 'package:photos/models/selected_files.dart';
 import 'package:photos/models/selected_files.dart';
 import 'package:photos/models/trash_item_request.dart';
 import 'package:photos/models/trash_item_request.dart';
 import 'package:photos/services/remote_sync_service.dart';
 import 'package:photos/services/remote_sync_service.dart';
@@ -500,18 +502,21 @@ Future<bool> shouldProceedWithDeletion(BuildContext context) async {
 Future<void> showDeleteSheet(
 Future<void> showDeleteSheet(
   BuildContext context,
   BuildContext context,
   SelectedFiles selectedFiles,
   SelectedFiles selectedFiles,
+  FilesSplit filesSplit,
 ) async {
 ) async {
-  bool containsUploadedFile = false, containsLocalFile = false;
-  for (final file in selectedFiles.files) {
-    if (file.uploadedFileID != null) {
-      debugPrint("${file.toString()} is uploaded");
-      containsUploadedFile = true;
-    }
-    if (file.localID != null) {
-      debugPrint("${file.toString()} has local");
-      containsLocalFile = true;
-    }
+  if (selectedFiles.files.length != filesSplit.count) {
+    throw AssertionError("Unexpected state, #{selectedFiles.files.length} != "
+        "${filesSplit.count}");
+  }
+  final List<EnteFile> deletableFiles =
+      filesSplit.ownedByCurrentUser + filesSplit.pendingUploads;
+  if (deletableFiles.isEmpty && filesSplit.ownedByOtherUsers.isNotEmpty) {
+    showShortToast(context, S.of(context).cannotDeleteSharedFiles);
+    return;
   }
   }
+  final containsUploadedFile = deletableFiles.any((f) => f.isUploaded);
+  final containsLocalFile = deletableFiles.any((f) => f.localID != null);
+
   final List<ButtonWidget> buttons = [];
   final List<ButtonWidget> buttons = [];
   final bool isBothLocalAndRemote = containsUploadedFile && containsLocalFile;
   final bool isBothLocalAndRemote = containsUploadedFile && containsLocalFile;
   final bool isLocalOnly = !containsUploadedFile;
   final bool isLocalOnly = !containsUploadedFile;
@@ -545,7 +550,7 @@ Future<void> showDeleteSheet(
         onTap: () async {
         onTap: () async {
           await deleteFilesFromRemoteOnly(
           await deleteFilesFromRemoteOnly(
             context,
             context,
-            selectedFiles.files.toList(),
+            deletableFiles,
           ).then(
           ).then(
             (value) {
             (value) {
               showShortToast(context, S.of(context).movedToTrash);
               showShortToast(context, S.of(context).movedToTrash);
@@ -572,7 +577,7 @@ Future<void> showDeleteSheet(
         shouldSurfaceExecutionStates: false,
         shouldSurfaceExecutionStates: false,
         isInAlert: true,
         isInAlert: true,
         onTap: () async {
         onTap: () async {
-          await deleteFilesOnDeviceOnly(context, selectedFiles.files.toList());
+          await deleteFilesOnDeviceOnly(context, deletableFiles);
         },
         },
       ),
       ),
     );
     );
@@ -591,7 +596,7 @@ Future<void> showDeleteSheet(
         onTap: () async {
         onTap: () async {
           await deleteFilesFromEverywhere(
           await deleteFilesFromEverywhere(
             context,
             context,
-            selectedFiles.files.toList(),
+            deletableFiles,
           );
           );
         },
         },
       ),
       ),