forked from Cutlery/immich
		
	* refactor: autoroutex pushroute * refactor: autoroutex popRoute * refactor: autoroutex navigate and replace * chore: add doc comments for extension methods * refactor: Add LoggerMixin and refactor Album activities to use mixin * refactor: Activity page * chore: activity user from user constructor * fix: update current asset after build method * refactor: tests with similar structure as lib * chore: remove avoid-declaring-call-method rule from dcm analysis * test: fix proper expect order * test: activity_statistics_provider_test * test: activity_provider_test * test: use proper matchers * test: activity_text_field_test & dismissible_activity_test added * test: add http mock to return transparent image * test: download isar core libs during test * test: add widget tags to widget test cases * test: activity_tile_test * build: currentAlbumProvider to generator * movie add / remove like to activity input tile * test: activities_page_test.dart * chore: better error logs * chore: dismissibleactivity as statelesswidget --------- Co-authored-by: shalong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
		
			
				
	
	
		
			76 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
| import 'package:flutter/material.dart';
 | |
| import 'package:immich_mobile/modules/activities/widgets/activity_tile.dart';
 | |
| import 'package:immich_mobile/shared/ui/confirm_dialog.dart';
 | |
| 
 | |
| /// Wraps an [ActivityTile] and makes it dismissible
 | |
| class DismissibleActivity extends StatelessWidget {
 | |
|   final String activityId;
 | |
|   final ActivityTile body;
 | |
|   final Function(String)? onDismiss;
 | |
| 
 | |
|   const DismissibleActivity(
 | |
|     this.activityId,
 | |
|     this.body, {
 | |
|     this.onDismiss,
 | |
|     super.key,
 | |
|   });
 | |
| 
 | |
|   @override
 | |
|   Widget build(BuildContext context) {
 | |
|     return Dismissible(
 | |
|       key: Key(activityId),
 | |
|       dismissThresholds: const {
 | |
|         DismissDirection.horizontal: 0.7,
 | |
|       },
 | |
|       direction: DismissDirection.horizontal,
 | |
|       confirmDismiss: (direction) => onDismiss != null
 | |
|           ? showDialog(
 | |
|               context: context,
 | |
|               builder: (context) => ConfirmDialog(
 | |
|                 onOk: () {},
 | |
|                 title: "shared_album_activity_remove_title",
 | |
|                 content: "shared_album_activity_remove_content",
 | |
|                 ok: "delete_dialog_ok",
 | |
|               ),
 | |
|             )
 | |
|           : Future.value(false),
 | |
|       onDismissed: (_) async => onDismiss?.call(activityId),
 | |
|       // LTR
 | |
|       background: _DismissBackground(withDeleteIcon: onDismiss != null),
 | |
|       // RTL
 | |
|       secondaryBackground: _DismissBackground(
 | |
|         withDeleteIcon: onDismiss != null,
 | |
|         alignment: AlignmentDirectional.centerEnd,
 | |
|       ),
 | |
|       child: body,
 | |
|     );
 | |
|   }
 | |
| }
 | |
| 
 | |
| class _DismissBackground extends StatelessWidget {
 | |
|   final AlignmentDirectional alignment;
 | |
|   final bool withDeleteIcon;
 | |
| 
 | |
|   const _DismissBackground({
 | |
|     required this.withDeleteIcon,
 | |
|     this.alignment = AlignmentDirectional.centerStart,
 | |
|   });
 | |
| 
 | |
|   @override
 | |
|   Widget build(BuildContext context) {
 | |
|     return Container(
 | |
|       alignment: alignment,
 | |
|       color: withDeleteIcon ? Colors.red[400] : Colors.grey[600],
 | |
|       child: withDeleteIcon
 | |
|           ? const Padding(
 | |
|               padding: EdgeInsets.all(15),
 | |
|               child: Icon(
 | |
|                 Icons.delete_sweep_rounded,
 | |
|                 color: Colors.black,
 | |
|               ),
 | |
|             )
 | |
|           : null,
 | |
|     );
 | |
|   }
 | |
| }
 |