fix: Search in spaces view

This commit is contained in:
krille-chan 2024-03-10 16:26:40 +01:00
parent c842e3454b
commit 6073b46cfc
No known key found for this signature in database
3 changed files with 29 additions and 11 deletions

View file

@ -266,7 +266,7 @@ class ChatListController extends State<ChatList>
}); });
} }
void onSearchEnter(String text) { void onSearchEnter(String text, {bool globalSearch = true}) {
if (text.isEmpty) { if (text.isEmpty) {
cancelSearch(unfocus: false); cancelSearch(unfocus: false);
return; return;
@ -276,7 +276,9 @@ class ChatListController extends State<ChatList>
isSearchMode = true; isSearchMode = true;
}); });
_coolDown?.cancel(); _coolDown?.cancel();
_coolDown = Timer(const Duration(milliseconds: 500), _search); if (globalSearch) {
_coolDown = Timer(const Duration(milliseconds: 500), _search);
}
} }
void startSearch() { void startSearch() {

View file

@ -9,8 +9,13 @@ import '../../widgets/matrix.dart';
class ChatListHeader extends StatelessWidget implements PreferredSizeWidget { class ChatListHeader extends StatelessWidget implements PreferredSizeWidget {
final ChatListController controller; final ChatListController controller;
final bool globalSearch;
const ChatListHeader({super.key, required this.controller}); const ChatListHeader({
super.key,
required this.controller,
this.globalSearch = true,
});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -47,7 +52,10 @@ class ChatListHeader extends StatelessWidget implements PreferredSizeWidget {
controller: controller.searchController, controller: controller.searchController,
focusNode: controller.searchFocusNode, focusNode: controller.searchFocusNode,
textInputAction: TextInputAction.search, textInputAction: TextInputAction.search,
onChanged: controller.onSearchEnter, onChanged: (text) => controller.onSearchEnter(
text,
globalSearch: globalSearch,
),
decoration: InputDecoration( decoration: InputDecoration(
fillColor: Theme.of(context).colorScheme.secondaryContainer, fillColor: Theme.of(context).colorScheme.secondaryContainer,
border: OutlineInputBorder( border: OutlineInputBorder(
@ -79,7 +87,7 @@ class ChatListHeader extends StatelessWidget implements PreferredSizeWidget {
.onPrimaryContainer, .onPrimaryContainer,
), ),
), ),
suffixIcon: controller.isSearchMode suffixIcon: controller.isSearchMode && globalSearch
? controller.isSearching ? controller.isSearching
? const Padding( ? const Padding(
padding: EdgeInsets.symmetric( padding: EdgeInsets.symmetric(

View file

@ -279,10 +279,17 @@ class _SpaceViewState extends State<SpaceView> {
if (activeSpaceId == null) { if (activeSpaceId == null) {
final rootSpaces = allSpaces final rootSpaces = allSpaces
.where( .where(
(space) => !allSpaces.any( (space) =>
(parentSpace) => parentSpace.spaceChildren !allSpaces.any(
.any((child) => child.roomId == space.id), (parentSpace) => parentSpace.spaceChildren
), .any((child) => child.roomId == space.id),
) &&
space
.getLocalizedDisplayname(MatrixLocals(L10n.of(context)!))
.toLowerCase()
.contains(
widget.controller.searchController.text.toLowerCase(),
),
) )
.toList(); .toList();
@ -347,7 +354,7 @@ class _SpaceViewState extends State<SpaceView> {
child: CustomScrollView( child: CustomScrollView(
controller: widget.scrollController, controller: widget.scrollController,
slivers: [ slivers: [
ChatListHeader(controller: widget.controller), ChatListHeader(controller: widget.controller, globalSearch: false),
SliverAppBar( SliverAppBar(
automaticallyImplyLeading: false, automaticallyImplyLeading: false,
primary: false, primary: false,
@ -490,7 +497,8 @@ class _SpaceViewState extends State<SpaceView> {
L10n.of(context)!.chat; L10n.of(context)!.chat;
if (widget.controller.isSearchMode && if (widget.controller.isSearchMode &&
!name.toLowerCase().contains( !name.toLowerCase().contains(
widget.controller.searchController.text, widget.controller.searchController.text
.toLowerCase(),
)) { )) {
return const SizedBox.shrink(); return const SizedBox.shrink();
} }