Simplify search (#4222)

* Hide user and public course search in main chat list search

* Remove chat header and instructions when search chat list, add message when no chats/DMs found

* Use same filtering method as chat list to check if search has no results

* chore: remove unreferences widget, revert unused changes to widget, remove unreferenced copy

---------

Co-authored-by: ggurdin <ggurdin@gmail.com>
This commit is contained in:
Kelrap 2025-10-21 13:35:50 -04:00 committed by GitHub
parent 188db715dd
commit 48d06e1353
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 83 additions and 179 deletions

View file

@ -5284,6 +5284,7 @@
"activityDropdownDesc": "When youre done with this activity, click below",
"activityAnalyticsListBody": "These are your completed activities! After finishing activities, you can view them here.",
"languageMismatchTitle": "Language mismatch",
"emptyChatSearch": "No DMs or chats found. Make sure your search is spelled correctly.",
"languageMismatchDesc": "Your target language doesn't match the language of this activity. Update your target language?",
"reportWordIssueTooltip": "Report word information issue",
"tokenInfoFeedbackDialogTitle": "Word Information Feedback",

View file

@ -8,16 +8,15 @@ import 'package:fluffychat/l10n/l10n.dart';
import 'package:fluffychat/pages/chat_list/chat_list.dart';
import 'package:fluffychat/pages/chat_list/chat_list_item.dart';
import 'package:fluffychat/pages/chat_list/dummy_chat_list_item.dart';
import 'package:fluffychat/pages/chat_list/search_title.dart';
import 'package:fluffychat/pangea/bot/widgets/bot_face_svg.dart';
import 'package:fluffychat/pangea/chat_list/widgets/pangea_chat_list_header.dart';
import 'package:fluffychat/pangea/chat_settings/utils/bot_client_extension.dart';
import 'package:fluffychat/pangea/course_chats/course_chats_page.dart';
import 'package:fluffychat/pangea/instructions/instructions_enum.dart';
import 'package:fluffychat/pangea/instructions/instructions_inline_tooltip.dart';
import 'package:fluffychat/pangea/public_spaces/public_room_bottom_sheet.dart';
import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart';
import 'package:fluffychat/utils/stream_extension.dart';
import 'package:fluffychat/widgets/adaptive_dialogs/user_dialog.dart';
import 'package:fluffychat/widgets/adaptive_dialogs/public_room_dialog.dart';
import 'package:fluffychat/widgets/avatar.dart';
import 'package:fluffychat/widgets/future_loading_dialog.dart';
import '../../config/themes.dart';
@ -106,53 +105,44 @@ class ChatListViewBody extends StatelessWidget {
// icon: const Icon(Icons.explore_outlined),
// ),
// PublicRoomsHorizontalList(publicRooms: publicRooms),
// Pangea#
SearchTitle(
// #Pangea
// title: L10n.of(context).publicSpaces,
title: L10n.of(context).publicCourses,
// icon: const Icon(Icons.workspaces_outlined),
icon: const Icon(Icons.groups_outlined),
// Pangea#
),
PublicRoomsHorizontalList(publicRooms: publicSpaces),
SearchTitle(
title: L10n.of(context).users,
icon: const Icon(Icons.group_outlined),
),
AnimatedContainer(
clipBehavior: Clip.hardEdge,
decoration: const BoxDecoration(),
height: userSearchResult == null ||
userSearchResult.results.isEmpty
? 0
: 106,
duration: FluffyThemes.animationDuration,
curve: FluffyThemes.animationCurve,
child: userSearchResult == null
? null
// #Pangea
: UserSearchResultsList(
userSearchResult: userSearchResult,
),
// : ListView.builder(
// scrollDirection: Axis.horizontal,
// itemCount: userSearchResult.results.length,
// itemBuilder: (context, i) => _SearchItem(
// title:
// userSearchResult.results[i].displayName ??
// userSearchResult
// .results[i].userId.localpart ??
// L10n.of(context).unknownDevice,
// avatar: userSearchResult.results[i].avatarUrl,
// onPressed: () => UserDialog.show(
// context: context,
// profile: userSearchResult.results[i],
// ),
// ),
// ),
// Pangea#
),
// SearchTitle(
// title: L10n.of(context).publicSpaces,
// icon: const Icon(Icons.workspaces_outlined),
// ),
// PublicRoomsHorizontalList(publicRooms: publicSpaces),
// SearchTitle(
// title: L10n.of(context).users,
// icon: const Icon(Icons.group_outlined),
// ),
// AnimatedContainer(
// clipBehavior: Clip.hardEdge,
// decoration: const BoxDecoration(),
// height: userSearchResult == null ||
// userSearchResult.results.isEmpty
// ? 0
// : 106,
// duration: FluffyThemes.animationDuration,
// curve: FluffyThemes.animationCurve,
// child: userSearchResult == null
// ? null
// : ListView.builder(
// scrollDirection: Axis.horizontal,
// itemCount: userSearchResult.results.length,
// itemBuilder: (context, i) => _SearchItem(
// title:
// userSearchResult.results[i].displayName ??
// userSearchResult
// .results[i].userId.localpart ??
// L10n.of(context).unknownDevice,
// avatar: userSearchResult.results[i].avatarUrl,
// onPressed: () => UserDialog.show(
// context: context,
// profile: userSearchResult.results[i],
// ),
// ),
// ),
// ),
// Pangea#
],
// #Pangea
// if (!controller.isSearchMode && AppConfig.showPresences)
@ -220,21 +210,38 @@ class ChatListViewBody extends StatelessWidget {
// .toList(),
// ),
// ),
// Pangea#
if (controller.isSearchMode)
SearchTitle(
title: L10n.of(context).chats,
icon: const Icon(Icons.forum_outlined),
// if (controller.isSearchMode)
// SearchTitle(
// title: L10n.of(context).chats,
// icon: const Icon(Icons.forum_outlined),
// ),
if (!controller.isSearchMode)
const InstructionsInlineTooltip(
instructionsEnum: InstructionsEnum.chatListTooltip,
padding: EdgeInsets.only(
left: 16.0,
right: 16.0,
bottom: 16.0,
),
),
// #Pangea
const InstructionsInlineTooltip(
instructionsEnum: InstructionsEnum.chatListTooltip,
padding: EdgeInsets.only(
left: 16.0,
right: 16.0,
bottom: 16.0,
if (controller.isSearchMode &&
rooms
.where(
(room) => room
.getLocalizedDisplayname(
MatrixLocals(L10n.of(context)),
)
.toLowerCase()
.contains(filter),
)
.isEmpty)
Padding(
padding: const EdgeInsetsGeometry.all(16.0),
child: Text(
L10n.of(context).emptyChatSearch,
textAlign: TextAlign.center,
),
),
),
// if (client.prevBatch != null &&
// rooms.isEmpty &&
// !controller.isSearchMode) ...[
@ -356,10 +363,7 @@ class ChatListViewBody extends StatelessWidget {
}
}
// #Pangea
// class PublicRoomsHorizontalList extends StatelessWidget {
class PublicRoomsHorizontalList extends StatefulWidget {
// Pangea#
class PublicRoomsHorizontalList extends StatelessWidget {
const PublicRoomsHorizontalList({
super.key,
required this.publicRooms,
@ -367,23 +371,6 @@ class PublicRoomsHorizontalList extends StatefulWidget {
final List<PublicRoomsChunk>? publicRooms;
// #Pagngea
@override
PublicRoomsHorizontalListState createState() =>
PublicRoomsHorizontalListState();
}
class PublicRoomsHorizontalListState extends State<PublicRoomsHorizontalList> {
List<PublicRoomsChunk>? get publicRooms => widget.publicRooms;
final ScrollController _scrollController = ScrollController();
@override
void dispose() {
_scrollController.dispose();
super.dispose();
}
// Pangea#
@override
Widget build(BuildContext context) {
final publicRooms = this.publicRooms;
@ -395,46 +382,21 @@ class PublicRoomsHorizontalListState extends State<PublicRoomsHorizontalList> {
curve: FluffyThemes.animationCurve,
child: publicRooms == null
? null
:
// #Pangea
Scrollbar(
thumbVisibility: true,
controller: _scrollController,
child:
// Pangea#
ListView.builder(
// #Pangea
controller: _scrollController,
// Pangea#
scrollDirection: Axis.horizontal,
itemCount: publicRooms.length,
itemBuilder: (context, i) => _SearchItem(
title: publicRooms[i].name ??
publicRooms[i].canonicalAlias?.localpart ??
// #Pangea
// L10n.of(context).group,
L10n.of(context).chat,
// Pangea#
avatar: publicRooms[i].avatarUrl,
// #Pangea
onPressed: () => PublicRoomBottomSheet.show(
context: context,
: ListView.builder(
scrollDirection: Axis.horizontal,
itemCount: publicRooms.length,
itemBuilder: (context, i) => _SearchItem(
title: publicRooms[i].name ??
publicRooms[i].canonicalAlias?.localpart ??
L10n.of(context).group,
avatar: publicRooms[i].avatarUrl,
onPressed: () => showAdaptiveDialog(
context: context,
builder: (c) => PublicRoomDialog(
roomAlias:
publicRooms[i].canonicalAlias ?? publicRooms[i].roomId,
chunk: publicRooms[i],
),
// onPressed: () => showAdaptiveDialog(
// context: context,
// builder: (c) => PublicRoomDialog(
// roomAlias: publicRooms[i].canonicalAlias ??
// publicRooms[i].roomId,
// chunk: publicRooms[i],
// ),
// ),
radius: BorderRadius.circular(
AppConfig.borderRadius / 2,
),
// Pangea#
),
),
),
@ -446,19 +408,11 @@ class _SearchItem extends StatelessWidget {
final String title;
final Uri? avatar;
final void Function() onPressed;
// #Pangea
final BorderRadius? radius;
final String? userId;
// Pangea#
const _SearchItem({
required this.title,
this.avatar,
required this.onPressed,
// #Pangea
this.radius,
this.userId,
// Pangea#
});
@override
@ -473,10 +427,6 @@ class _SearchItem extends StatelessWidget {
Avatar(
mxContent: avatar,
name: title,
// #Pangea
borderRadius: radius,
userId: userId,
// Pangea#
),
Padding(
padding: const EdgeInsets.all(8.0),
@ -495,50 +445,3 @@ class _SearchItem extends StatelessWidget {
),
);
}
// #Pangea
class UserSearchResultsList extends StatefulWidget {
final SearchUserDirectoryResponse userSearchResult;
const UserSearchResultsList({
required this.userSearchResult,
super.key,
});
@override
UserSearchResultsListState createState() => UserSearchResultsListState();
}
class UserSearchResultsListState extends State<UserSearchResultsList> {
final ScrollController _scrollController = ScrollController();
@override
void dispose() {
_scrollController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scrollbar(
thumbVisibility: true,
controller: _scrollController,
child: ListView.builder(
controller: _scrollController,
scrollDirection: Axis.horizontal,
itemCount: widget.userSearchResult.results.length,
itemBuilder: (context, i) => _SearchItem(
title: widget.userSearchResult.results[i].displayName ??
widget.userSearchResult.results[i].userId.localpart ??
L10n.of(context).unknownDevice,
avatar: widget.userSearchResult.results[i].avatarUrl,
userId: widget.userSearchResult.results[i].userId,
onPressed: () => UserDialog.show(
context: context,
profile: widget.userSearchResult.results[i],
),
),
),
);
}
}
// Pangea#