import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/constants/enums.dart'; import 'package:immich_mobile/domain/models/album/album.model.dart'; import 'package:immich_mobile/generated/translations.g.dart'; import 'package:immich_mobile/presentation/actions/action.widget.dart'; import 'package:immich_mobile/presentation/actions/archive.action.dart'; import 'package:immich_mobile/presentation/actions/asset_debug.action.dart'; import 'package:immich_mobile/presentation/actions/delete.action.dart'; import 'package:immich_mobile/presentation/actions/download.action.dart'; import 'package:immich_mobile/presentation/actions/edit_datetime.action.dart'; import 'package:immich_mobile/presentation/actions/edit_location.action.dart'; import 'package:immich_mobile/presentation/actions/favorite.action.dart'; import 'package:immich_mobile/presentation/actions/lock.action.dart'; import 'package:immich_mobile/presentation/actions/share.action.dart'; import 'package:immich_mobile/presentation/actions/share_link.action.dart'; import 'package:immich_mobile/presentation/actions/stack.action.dart'; import 'package:immich_mobile/presentation/widgets/album/album_selector.widget.dart'; import 'package:immich_mobile/presentation/widgets/bottom_sheet/base_bottom_sheet.widget.dart'; import 'package:immich_mobile/providers/infrastructure/action.provider.dart'; import 'package:immich_mobile/widgets/common/immich_toast.dart'; class ArchiveBottomSheet extends ConsumerStatefulWidget { const ArchiveBottomSheet({super.key}); @override ConsumerState createState() => _ArchiveBottomSheetState(); } class _ArchiveBottomSheetState extends ConsumerState { late final DraggableScrollableController sheetController; @override void initState() { super.initState(); sheetController = DraggableScrollableController(); } @override void dispose() { sheetController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { Future addToAlbum(RemoteAlbum album) async { final result = await ref.read(actionProvider.notifier).addToAlbum(ActionSource.timeline, album); if (!context.mounted) { return; } if (!result.success) { ImmichToast.show(context: context, msg: context.t.scaffold_body_error_occurred, toastType: ToastType.error); return; } ImmichToast.show( context: context, msg: result.count == 0 ? context.t.add_to_album_bottom_sheet_already_exists(album: album.name) : context.t.add_to_album_bottom_sheet_added(album: album.name), ); } Future onKeyboardExpand() { return sheetController.animateTo(0.85, duration: const Duration(milliseconds: 200), curve: Curves.easeInOut); } return BaseBottomSheet( controller: sheetController, initialChildSize: 0.25, maxChildSize: 0.85, shouldCloseOnMinExtent: false, actions: const [ .new(action: AssetDebugAction(source: .timeline)), .new(action: ShareAction(source: .timeline)), .new(action: ShareLinkAction(source: .timeline)), .new(action: ArchiveAction(source: .timeline)), .new(action: FavoriteAction(source: .timeline)), .new(action: DownloadAction(source: .timeline)), .new(action: DeleteAction(source: .timeline)), .new(action: EditDateTimeAction(source: .timeline)), .new(action: EditLocationAction(source: .timeline)), .new(action: LockAction(source: .timeline)), .new(action: StackAction(source: .timeline)), .new(action: CleanupLocalAction(source: .timeline)), ], slivers: [ const AddToAlbumHeader(), AlbumSelector(onAlbumSelected: addToAlbum, onKeyboardExpanded: onKeyboardExpand), ], ); } }