immich/mobile/lib/presentation/widgets/bottom_sheet/archive_bottom_sheet.widget.dart
shenlong a8b3b30aba
chore: migrate mobile translations accessor (4) (#30671)
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2026-08-11 14:41:13 +05:30

96 lines
3.8 KiB
Dart

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<ArchiveBottomSheet> createState() => _ArchiveBottomSheetState();
}
class _ArchiveBottomSheetState extends ConsumerState<ArchiveBottomSheet> {
late final DraggableScrollableController sheetController;
@override
void initState() {
super.initState();
sheetController = DraggableScrollableController();
}
@override
void dispose() {
sheetController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
Future<void> 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<void> 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 <ActionColumnButton>[
.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),
],
);
}
}