fix: expand sheet when album search is focused (#20651)

* fix: expand sheet when album search is focused

* convert GeneralBottomSheet to ConsumerStatefulWidget

* fix: cleaning up

---------

Co-authored-by: Alex <alex.tran1502@gmail.com>
This commit is contained in:
Brandon Wees 2025-08-04 20:35:57 -05:00 committed by GitHub
parent a91bb399f0
commit 081307ced2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 35 additions and 5 deletions

View File

@ -27,8 +27,9 @@ typedef AlbumSelectorCallback = void Function(RemoteAlbum album);
class AlbumSelector extends ConsumerStatefulWidget { class AlbumSelector extends ConsumerStatefulWidget {
final AlbumSelectorCallback onAlbumSelected; final AlbumSelectorCallback onAlbumSelected;
final Function? onKeyboardExpanded;
const AlbumSelector({super.key, required this.onAlbumSelected}); const AlbumSelector({super.key, required this.onAlbumSelected, this.onKeyboardExpanded});
@override @override
ConsumerState<AlbumSelector> createState() => _AlbumSelectorState(); ConsumerState<AlbumSelector> createState() => _AlbumSelectorState();
@ -52,6 +53,12 @@ class _AlbumSelectorState extends ConsumerState<AlbumSelector> {
searchController.addListener(() { searchController.addListener(() {
onSearch(searchController.text, filterMode); onSearch(searchController.text, filterMode);
}); });
searchFocusNode.addListener(() {
if (searchFocusNode.hasFocus) {
widget.onKeyboardExpanded?.call();
}
});
} }
void onSearch(String searchTerm, QuickFilterMode sortMode) { void onSearch(String searchTerm, QuickFilterMode sortMode) {

View File

@ -25,12 +25,30 @@ import 'package:immich_mobile/providers/server_info.provider.dart';
import 'package:immich_mobile/providers/timeline/multiselect.provider.dart'; import 'package:immich_mobile/providers/timeline/multiselect.provider.dart';
import 'package:immich_mobile/widgets/common/immich_toast.dart'; import 'package:immich_mobile/widgets/common/immich_toast.dart';
class GeneralBottomSheet extends ConsumerWidget { class GeneralBottomSheet extends ConsumerStatefulWidget {
final double? minChildSize; final double? minChildSize;
const GeneralBottomSheet({super.key, this.minChildSize}); const GeneralBottomSheet({super.key, this.minChildSize});
@override @override
Widget build(BuildContext context, WidgetRef ref) { ConsumerState<GeneralBottomSheet> createState() => _GeneralBottomSheetState();
}
class _GeneralBottomSheetState extends ConsumerState<GeneralBottomSheet> {
late DraggableScrollableController sheetController;
@override
void initState() {
super.initState();
sheetController = DraggableScrollableController();
}
@override
void dispose() {
sheetController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
final multiselect = ref.watch(multiSelectProvider); final multiselect = ref.watch(multiSelectProvider);
final isTrashEnable = ref.watch(serverInfoProvider.select((state) => state.serverFeatures.trash)); final isTrashEnable = ref.watch(serverInfoProvider.select((state) => state.serverFeatures.trash));
@ -59,9 +77,14 @@ class GeneralBottomSheet extends ConsumerWidget {
ref.read(multiSelectProvider.notifier).reset(); ref.read(multiSelectProvider.notifier).reset();
} }
Future<void> onKeyboardExpand() {
return sheetController.animateTo(0.85, duration: const Duration(milliseconds: 200), curve: Curves.easeInOut);
}
return BaseBottomSheet( return BaseBottomSheet(
controller: sheetController,
initialChildSize: 0.45, initialChildSize: 0.45,
minChildSize: minChildSize, minChildSize: widget.minChildSize,
maxChildSize: 0.85, maxChildSize: 0.85,
shouldCloseOnMinExtent: false, shouldCloseOnMinExtent: false,
actions: [ actions: [
@ -90,7 +113,7 @@ class GeneralBottomSheet extends ConsumerWidget {
], ],
slivers: [ slivers: [
const AddToAlbumHeader(), const AddToAlbumHeader(),
AlbumSelector(onAlbumSelected: addAssetsToAlbum), AlbumSelector(onAlbumSelected: addAssetsToAlbum, onKeyboardExpanded: onKeyboardExpand),
], ],
); );
} }