mirror of
				https://github.com/immich-app/immich.git
				synced 2025-10-31 02:27:08 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			134 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			134 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
| import 'package:auto_route/auto_route.dart';
 | |
| import 'package:easy_localization/easy_localization.dart';
 | |
| import 'package:flutter/material.dart';
 | |
| import 'package:flutter_hooks/flutter_hooks.dart';
 | |
| import 'package:fluttertoast/fluttertoast.dart';
 | |
| import 'package:hooks_riverpod/hooks_riverpod.dart';
 | |
| import 'package:immich_mobile/modules/archive/providers/archive_asset_provider.dart';
 | |
| import 'package:immich_mobile/modules/home/ui/asset_grid/immich_asset_grid.dart';
 | |
| import 'package:immich_mobile/shared/models/asset.dart';
 | |
| import 'package:immich_mobile/shared/providers/asset.provider.dart';
 | |
| import 'package:immich_mobile/shared/ui/immich_loading_indicator.dart';
 | |
| import 'package:immich_mobile/shared/ui/immich_toast.dart';
 | |
| 
 | |
| class ArchivePage extends HookConsumerWidget {
 | |
|   const ArchivePage({super.key});
 | |
| 
 | |
|   @override
 | |
|   Widget build(BuildContext context, WidgetRef ref) {
 | |
|     final archivedAssets = ref.watch(archiveProvider);
 | |
|     final selectionEnabledHook = useState(false);
 | |
|     final selection = useState(<Asset>{});
 | |
|     final processing = useState(false);
 | |
| 
 | |
|     void selectionListener(
 | |
|       bool multiselect,
 | |
|       Set<Asset> selectedAssets,
 | |
|     ) {
 | |
|       selectionEnabledHook.value = multiselect;
 | |
|       selection.value = selectedAssets;
 | |
|     }
 | |
| 
 | |
|     AppBar buildAppBar(String count) {
 | |
|       return AppBar(
 | |
|         leading: IconButton(
 | |
|           onPressed: () => AutoRouter.of(context).pop(),
 | |
|           icon: const Icon(Icons.arrow_back_ios_rounded),
 | |
|         ),
 | |
|         centerTitle: true,
 | |
|         automaticallyImplyLeading: false,
 | |
|         title: const Text(
 | |
|           'archive_page_title',
 | |
|         ).tr(args: [count]),
 | |
|       );
 | |
|     }
 | |
| 
 | |
|     Widget buildBottomBar() {
 | |
|       return SafeArea(
 | |
|         child: Align(
 | |
|           alignment: Alignment.bottomCenter,
 | |
|           child: SizedBox(
 | |
|             height: 64,
 | |
|             child: Card(
 | |
|               child: Column(
 | |
|                 children: [
 | |
|                   ListTile(
 | |
|                     shape: RoundedRectangleBorder(
 | |
|                       borderRadius: BorderRadius.circular(10),
 | |
|                     ),
 | |
|                     leading: const Icon(
 | |
|                       Icons.unarchive_rounded,
 | |
|                     ),
 | |
|                     title: Text(
 | |
|                       'control_bottom_app_bar_unarchive'.tr(),
 | |
|                       style: const TextStyle(fontSize: 14),
 | |
|                     ),
 | |
|                     onTap: processing.value
 | |
|                         ? null
 | |
|                         : () async {
 | |
|                             processing.value = true;
 | |
|                             try {
 | |
|                               if (selection.value.isNotEmpty) {
 | |
|                                 await ref
 | |
|                                     .watch(assetProvider.notifier)
 | |
|                                     .toggleArchive(
 | |
|                                       selection.value.toList(),
 | |
|                                       false,
 | |
|                                     );
 | |
| 
 | |
|                                 final assetOrAssets = selection.value.length > 1
 | |
|                                     ? 'assets'
 | |
|                                     : 'asset';
 | |
|                                 ImmichToast.show(
 | |
|                                   context: context,
 | |
|                                   msg:
 | |
|                                       'Moved ${selection.value.length} $assetOrAssets to library',
 | |
|                                   gravity: ToastGravity.CENTER,
 | |
|                                 );
 | |
|                               }
 | |
|                             } finally {
 | |
|                               processing.value = false;
 | |
|                               selectionEnabledHook.value = false;
 | |
|                             }
 | |
|                           },
 | |
|                   )
 | |
|                 ],
 | |
|               ),
 | |
|             ),
 | |
|           ),
 | |
|         ),
 | |
|       );
 | |
|     }
 | |
| 
 | |
|     return archivedAssets.when(
 | |
|       loading: () => Scaffold(
 | |
|         appBar: buildAppBar("?"),
 | |
|         body: const Center(child: CircularProgressIndicator()),
 | |
|       ),
 | |
|       error: (error, stackTrace) => Scaffold(
 | |
|         appBar: buildAppBar("Error"),
 | |
|         body: Center(child: Text(error.toString())),
 | |
|       ),
 | |
|       data: (data) => Scaffold(
 | |
|         appBar: buildAppBar(data.totalAssets.toString()),
 | |
|         body: data.isEmpty
 | |
|             ? Center(
 | |
|                 child: Text('archive_page_no_archived_assets'.tr()),
 | |
|               )
 | |
|             : Stack(
 | |
|                 children: [
 | |
|                   ImmichAssetGrid(
 | |
|                     renderList: data,
 | |
|                     listener: selectionListener,
 | |
|                     selectionActive: selectionEnabledHook.value,
 | |
|                   ),
 | |
|                   if (selectionEnabledHook.value) buildBottomBar(),
 | |
|                   if (processing.value)
 | |
|                     const Center(child: ImmichLoadingIndicator())
 | |
|                 ],
 | |
|               ),
 | |
|       ),
 | |
|     );
 | |
|   }
 | |
| }
 |