Use controller to remove files in RemoveSelectionHandler

This commit is contained in:
Ming Ming 2024-02-04 22:29:50 +08:00
parent 482158c6bf
commit 5278cda402
6 changed files with 31 additions and 48 deletions

View file

@ -1,16 +1,12 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:kiwi/kiwi.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:nc_photos/account.dart'; import 'package:nc_photos/account.dart';
import 'package:nc_photos/app_localizations.dart'; import 'package:nc_photos/app_localizations.dart';
import 'package:nc_photos/debug_util.dart'; import 'package:nc_photos/controller/files_controller.dart';
import 'package:nc_photos/di_container.dart';
import 'package:nc_photos/entity/file_descriptor.dart'; import 'package:nc_photos/entity/file_descriptor.dart';
import 'package:nc_photos/k.dart' as k; import 'package:nc_photos/k.dart' as k;
import 'package:nc_photos/navigation_manager.dart'; import 'package:nc_photos/navigation_manager.dart';
import 'package:nc_photos/snack_bar_manager.dart'; import 'package:nc_photos/snack_bar_manager.dart';
import 'package:nc_photos/use_case/inflate_file_descriptor.dart';
import 'package:nc_photos/use_case/remove.dart';
import 'package:nc_photos/widget/trashbin_browser.dart'; import 'package:nc_photos/widget/trashbin_browser.dart';
import 'package:np_codegen/np_codegen.dart'; import 'package:np_codegen/np_codegen.dart';
@ -18,11 +14,9 @@ part 'remove_selection_handler.g.dart';
@npLog @npLog
class RemoveSelectionHandler { class RemoveSelectionHandler {
RemoveSelectionHandler(this._c) const RemoveSelectionHandler({
: assert(require(_c)), required this.filesController,
assert(InflateFileDescriptor.require(_c)); });
static bool require(DiContainer c) => true;
/// Remove [selectedFiles] and return the removed count /// Remove [selectedFiles] and return the removed count
Future<int> call({ Future<int> call({
@ -31,44 +25,25 @@ class RemoveSelectionHandler {
bool shouldCleanupAlbum = true, bool shouldCleanupAlbum = true,
bool isRemoveOpened = false, bool isRemoveOpened = false,
bool isMoveToTrash = false, bool isMoveToTrash = false,
bool shouldShowProcessingText = true,
}) async { }) async {
final selectedFiles = await InflateFileDescriptor(_c)(account, selection); final String successText;
final String processingText, successText;
final String Function(int) failureText; final String Function(int) failureText;
if (isRemoveOpened) { if (isRemoveOpened) {
processingText = L10n.global().deleteProcessingNotification;
successText = L10n.global().deleteSuccessNotification; successText = L10n.global().deleteSuccessNotification;
failureText = (_) => L10n.global().deleteFailureNotification; failureText = (_) => L10n.global().deleteFailureNotification;
} else { } else {
processingText = L10n.global()
.deleteSelectedProcessingNotification(selectedFiles.length);
successText = L10n.global().deleteSelectedSuccessNotification; successText = L10n.global().deleteSelectedSuccessNotification;
failureText = failureText =
(count) => L10n.global().deleteSelectedFailureNotification(count); (count) => L10n.global().deleteSelectedFailureNotification(count);
} }
if (shouldShowProcessingText) {
SnackBarManager().showSnackBar(
SnackBar(
content: Text(processingText),
duration: k.snackBarDurationShort,
),
canBeReplaced: true,
);
}
var failureCount = 0; var failureCount = 0;
await Remove(KiwiContainer().resolve<DiContainer>())( await filesController.remove(
account, selection,
selectedFiles, errorBuilder: (fileIds) {
onError: (_, file, e, stackTrace) { failureCount = fileIds.length;
_log.shout( return RemoveFailureError(fileIds);
"[call] Failed while removing file: ${logFilename(file.fdPath)}",
e,
stackTrace);
++failureCount;
}, },
shouldCleanUp: shouldCleanupAlbum,
); );
final trashAction = isMoveToTrash final trashAction = isMoveToTrash
? SnackBarAction( ? SnackBarAction(
@ -93,8 +68,8 @@ class RemoveSelectionHandler {
action: trashAction, action: trashAction,
)); ));
} }
return selectedFiles.length - failureCount; return selection.length - failureCount;
} }
final DiContainer _c; final FilesController filesController;
} }

View file

@ -472,7 +472,6 @@ class _HomePhotosState extends State<HomePhotos>
} }
Future<void> _onSelectionDeletePressed(BuildContext context) async { Future<void> _onSelectionDeletePressed(BuildContext context) async {
final c = KiwiContainer().resolve<DiContainer>();
final selectedFiles = selectedListItems final selectedFiles = selectedListItems
.whereType<PhotoListFileItem>() .whereType<PhotoListFileItem>()
.map((e) => e.file) .map((e) => e.file)
@ -480,7 +479,9 @@ class _HomePhotosState extends State<HomePhotos>
setState(() { setState(() {
clearSelectedItems(); clearSelectedItems();
}); });
await RemoveSelectionHandler(c)( await RemoveSelectionHandler(
filesController: context.read<AccountController>().filesController,
)(
account: widget.account, account: widget.account,
selection: selectedFiles, selection: selectedFiles,
isMoveToTrash: true, isMoveToTrash: true,

View file

@ -8,6 +8,7 @@ import 'package:logging/logging.dart';
import 'package:nc_photos/account.dart'; import 'package:nc_photos/account.dart';
import 'package:nc_photos/app_localizations.dart'; import 'package:nc_photos/app_localizations.dart';
import 'package:nc_photos/bloc/search.dart'; import 'package:nc_photos/bloc/search.dart';
import 'package:nc_photos/controller/account_controller.dart';
import 'package:nc_photos/di_container.dart'; import 'package:nc_photos/di_container.dart';
import 'package:nc_photos/download_handler.dart'; import 'package:nc_photos/download_handler.dart';
import 'package:nc_photos/entity/file_descriptor.dart'; import 'package:nc_photos/entity/file_descriptor.dart';
@ -492,7 +493,6 @@ class _HomeSearchState extends State<HomeSearch>
} }
Future<void> _onSelectionDeletePressed(BuildContext context) async { Future<void> _onSelectionDeletePressed(BuildContext context) async {
final c = KiwiContainer().resolve<DiContainer>();
final selectedFiles = selectedListItems final selectedFiles = selectedListItems
.whereType<PhotoListFileItem>() .whereType<PhotoListFileItem>()
.map((e) => e.file) .map((e) => e.file)
@ -500,7 +500,9 @@ class _HomeSearchState extends State<HomeSearch>
setState(() { setState(() {
clearSelectedItems(); clearSelectedItems();
}); });
await RemoveSelectionHandler(c)( await RemoveSelectionHandler(
filesController: context.read<AccountController>().filesController,
)(
account: widget.account, account: widget.account,
selection: selectedFiles, selection: selectedFiles,
isMoveToTrash: true, isMoveToTrash: true,

View file

@ -8,6 +8,7 @@ import 'package:logging/logging.dart';
import 'package:nc_photos/account.dart'; import 'package:nc_photos/account.dart';
import 'package:nc_photos/app_localizations.dart'; import 'package:nc_photos/app_localizations.dart';
import 'package:nc_photos/bloc/ls_trashbin.dart'; import 'package:nc_photos/bloc/ls_trashbin.dart';
import 'package:nc_photos/controller/account_controller.dart';
import 'package:nc_photos/debug_util.dart'; import 'package:nc_photos/debug_util.dart';
import 'package:nc_photos/di_container.dart'; import 'package:nc_photos/di_container.dart';
import 'package:nc_photos/entity/file.dart'; import 'package:nc_photos/entity/file.dart';
@ -384,8 +385,9 @@ class _TrashbinBrowserState extends State<TrashbinBrowser>
} }
Future<void> _deleteFiles(List<FileDescriptor> files) async { Future<void> _deleteFiles(List<FileDescriptor> files) async {
final c = KiwiContainer().resolve<DiContainer>(); await RemoveSelectionHandler(
await RemoveSelectionHandler(c)( filesController: context.read<AccountController>().filesController,
)(
account: widget.account, account: widget.account,
selection: files, selection: files,
shouldCleanupAlbum: false, shouldCleanupAlbum: false,

View file

@ -1,10 +1,12 @@
import 'dart:async'; import 'dart:async';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:kiwi/kiwi.dart'; import 'package:kiwi/kiwi.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:nc_photos/account.dart'; import 'package:nc_photos/account.dart';
import 'package:nc_photos/app_localizations.dart'; import 'package:nc_photos/app_localizations.dart';
import 'package:nc_photos/controller/account_controller.dart';
import 'package:nc_photos/debug_util.dart'; import 'package:nc_photos/debug_util.dart';
import 'package:nc_photos/di_container.dart'; import 'package:nc_photos/di_container.dart';
import 'package:nc_photos/entity/file.dart'; import 'package:nc_photos/entity/file.dart';
@ -315,10 +317,11 @@ class _TrashbinViewerState extends State<TrashbinViewer> {
} }
Future<void> _delete(BuildContext context) async { Future<void> _delete(BuildContext context) async {
final c = KiwiContainer().resolve<DiContainer>();
final file = widget.streamFiles[_viewerController.currentPage]; final file = widget.streamFiles[_viewerController.currentPage];
_log.info("[_delete] Removing file: ${file.path}"); _log.info("[_delete] Removing file: ${file.path}");
final count = await RemoveSelectionHandler(c)( final count = await RemoveSelectionHandler(
filesController: context.read<AccountController>().filesController,
)(
account: widget.account, account: widget.account,
selection: [file], selection: [file],
shouldCleanupAlbum: false, shouldCleanupAlbum: false,

View file

@ -646,15 +646,15 @@ class _ViewerState extends State<Viewer>
void _onDeletePressed(BuildContext context) { void _onDeletePressed(BuildContext context) {
final index = _viewerController.currentPage; final index = _viewerController.currentPage;
final c = KiwiContainer().resolve<DiContainer>();
final file = _streamFilesView[index]; final file = _streamFilesView[index];
_log.info("[_onDeletePressed] Removing file: ${file.fdPath}"); _log.info("[_onDeletePressed] Removing file: ${file.fdPath}");
unawaited(RemoveSelectionHandler(c)( unawaited(RemoveSelectionHandler(
filesController: context.read<AccountController>().filesController,
)(
account: widget.account, account: widget.account,
selection: [file], selection: [file],
isRemoveOpened: true, isRemoveOpened: true,
isMoveToTrash: true, isMoveToTrash: true,
shouldShowProcessingText: false,
)); ));
_removeCurrentItemFromStream(context, index); _removeCurrentItemFromStream(context, index);
} }