mirror of
				https://github.com/KevinMidboe/immich.git
				synced 2025-10-29 17:40:28 +00:00 
			
		
		
		
	Implemented delete asset on device and on database (#22)
* refactor serving file function asset service * Remove PhotoViewer for now since it creates a problem in 2.10 * Added error message for wrong decode file and logo for failed to load file * Fixed error when read stream cannot be created and crash server * Added method to get all assets as a raw array * Implemented cleaner way of grouping image * Implemented operation to delete assets in the database * Implemented delete on database operation * Implemented delete on device operation * Fixed issue display wrong information when the auto backup is enabled after deleting all assets
This commit is contained in:
		@@ -1,10 +1,15 @@
 | 
			
		||||
import 'package:flutter/material.dart';
 | 
			
		||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
 | 
			
		||||
import 'package:immich_mobile/modules/home/providers/asset.provider.dart';
 | 
			
		||||
import 'package:immich_mobile/modules/home/providers/home_page_state.provider.dart';
 | 
			
		||||
 | 
			
		||||
class DeleteDialog extends StatelessWidget {
 | 
			
		||||
class DeleteDialog extends ConsumerWidget {
 | 
			
		||||
  const DeleteDialog({Key? key}) : super(key: key);
 | 
			
		||||
 | 
			
		||||
  @override
 | 
			
		||||
  Widget build(BuildContext context) {
 | 
			
		||||
  Widget build(BuildContext context, WidgetRef ref) {
 | 
			
		||||
    final homePageState = ref.watch(homePageStateProvider);
 | 
			
		||||
 | 
			
		||||
    return AlertDialog(
 | 
			
		||||
      backgroundColor: Colors.grey[200],
 | 
			
		||||
      shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
 | 
			
		||||
@@ -21,7 +26,12 @@ class DeleteDialog extends StatelessWidget {
 | 
			
		||||
          ),
 | 
			
		||||
        ),
 | 
			
		||||
        TextButton(
 | 
			
		||||
          onPressed: () {},
 | 
			
		||||
          onPressed: () {
 | 
			
		||||
            ref.watch(assetProvider.notifier).deleteAssets(homePageState.selectedItems);
 | 
			
		||||
            ref.watch(homePageStateProvider.notifier).disableMultiSelect();
 | 
			
		||||
 | 
			
		||||
            Navigator.of(context).pop();
 | 
			
		||||
          },
 | 
			
		||||
          child: Text(
 | 
			
		||||
            "Delete",
 | 
			
		||||
            style: TextStyle(color: Colors.red[400]),
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,6 @@ import 'package:badges/badges.dart';
 | 
			
		||||
import 'package:flutter/material.dart';
 | 
			
		||||
import 'package:google_fonts/google_fonts.dart';
 | 
			
		||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
 | 
			
		||||
import 'package:immich_mobile/modules/login/models/authentication_state.model.dart';
 | 
			
		||||
import 'package:immich_mobile/modules/login/providers/authentication.provider.dart';
 | 
			
		||||
 | 
			
		||||
import 'package:immich_mobile/routing/router.dart';
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
 | 
			
		||||
import 'package:immich_mobile/modules/home/providers/asset.provider.dart';
 | 
			
		||||
import 'package:immich_mobile/modules/login/models/authentication_state.model.dart';
 | 
			
		||||
import 'package:immich_mobile/modules/login/providers/authentication.provider.dart';
 | 
			
		||||
import 'package:immich_mobile/shared/providers/backup.provider.dart';
 | 
			
		||||
 | 
			
		||||
class ProfileDrawer extends ConsumerWidget {
 | 
			
		||||
  const ProfileDrawer({Key? key}) : super(key: key);
 | 
			
		||||
@@ -57,6 +58,7 @@ class ProfileDrawer extends ConsumerWidget {
 | 
			
		||||
              bool res = await ref.read(authenticationProvider.notifier).logout();
 | 
			
		||||
 | 
			
		||||
              if (res) {
 | 
			
		||||
                ref.watch(backupProvider.notifier).cancelBackup();
 | 
			
		||||
                ref.watch(assetProvider.notifier).clearAllAsset();
 | 
			
		||||
                AutoRouter.of(context).popUntilRoot();
 | 
			
		||||
              }
 | 
			
		||||
 
 | 
			
		||||
@@ -7,6 +7,7 @@ import 'package:hive_flutter/hive_flutter.dart';
 | 
			
		||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
 | 
			
		||||
import 'package:immich_mobile/constants/hive_box.dart';
 | 
			
		||||
import 'package:immich_mobile/modules/home/providers/home_page_state.provider.dart';
 | 
			
		||||
import 'package:immich_mobile/modules/login/providers/authentication.provider.dart';
 | 
			
		||||
import 'package:immich_mobile/shared/models/immich_asset.model.dart';
 | 
			
		||||
import 'package:immich_mobile/routing/router.dart';
 | 
			
		||||
 | 
			
		||||
@@ -25,6 +26,7 @@ class ThumbnailImage extends HookConsumerWidget {
 | 
			
		||||
 | 
			
		||||
    var selectedAsset = ref.watch(homePageStateProvider).selectedItems;
 | 
			
		||||
    var isMultiSelectEnable = ref.watch(homePageStateProvider).isMultiSelectEnable;
 | 
			
		||||
    var deviceId = ref.watch(authenticationProvider).deviceId;
 | 
			
		||||
 | 
			
		||||
    Widget _buildSelectionIcon(ImmichAsset asset) {
 | 
			
		||||
      if (selectedAsset.contains(asset)) {
 | 
			
		||||
@@ -42,6 +44,7 @@ class ThumbnailImage extends HookConsumerWidget {
 | 
			
		||||
 | 
			
		||||
    return GestureDetector(
 | 
			
		||||
      onTap: () {
 | 
			
		||||
        debugPrint("View ${asset.id}");
 | 
			
		||||
        if (isMultiSelectEnable && selectedAsset.contains(asset) && selectedAsset.length == 1) {
 | 
			
		||||
          ref.watch(homePageStateProvider.notifier).disableMultiSelect();
 | 
			
		||||
        } else if (isMultiSelectEnable && selectedAsset.contains(asset) && selectedAsset.length > 1) {
 | 
			
		||||
@@ -99,9 +102,10 @@ class ThumbnailImage extends HookConsumerWidget {
 | 
			
		||||
                  child: CircularProgressIndicator(value: downloadProgress.progress),
 | 
			
		||||
                ),
 | 
			
		||||
                errorWidget: (context, url, error) {
 | 
			
		||||
                  debugPrint("Error Loading Thumbnail Widget $error");
 | 
			
		||||
                  cacheKey.value += 1;
 | 
			
		||||
                  return const Icon(Icons.error);
 | 
			
		||||
                  return Icon(
 | 
			
		||||
                    Icons.image_not_supported_outlined,
 | 
			
		||||
                    color: Theme.of(context).primaryColor,
 | 
			
		||||
                  );
 | 
			
		||||
                },
 | 
			
		||||
              ),
 | 
			
		||||
            ),
 | 
			
		||||
@@ -116,6 +120,15 @@ class ThumbnailImage extends HookConsumerWidget {
 | 
			
		||||
                    )
 | 
			
		||||
                  : Container(),
 | 
			
		||||
            ),
 | 
			
		||||
            Positioned(
 | 
			
		||||
              right: 10,
 | 
			
		||||
              bottom: 5,
 | 
			
		||||
              child: Icon(
 | 
			
		||||
                (deviceId != asset.deviceId) ? Icons.cloud_done_outlined : Icons.photo_library_rounded,
 | 
			
		||||
                color: Colors.white,
 | 
			
		||||
                size: 18,
 | 
			
		||||
              ),
 | 
			
		||||
            )
 | 
			
		||||
          ],
 | 
			
		||||
        ),
 | 
			
		||||
      ),
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user