11import 'package:flutter/material.dart' ;
22import 'package:flutter_it/flutter_it.dart' ;
3+ import 'package:matrix/matrix_api_lite/generated/model.dart' ;
34import 'package:yaru/yaru.dart' ;
45
56import '../../chat_room/create_or_edit/edit_room_manager.dart' ;
@@ -12,8 +13,16 @@ import '../../common/view/confirm.dart';
1213import '../../common/view/ui_constants.dart' ;
1314import '../../l10n/l10n.dart' ;
1415
16+ enum ChatSpacesSearchType { regular, sliver }
17+
1518class ChatSpacesSearchList extends StatelessWidget with WatchItMixin {
16- const ChatSpacesSearchList ({super .key});
19+ const ChatSpacesSearchList ({super .key})
20+ : _type = ChatSpacesSearchType .regular;
21+
22+ const ChatSpacesSearchList .sliver ({super .key})
23+ : _type = ChatSpacesSearchType .sliver;
24+
25+ final ChatSpacesSearchType _type;
1726
1827 @override
1928 Widget build (BuildContext context) {
@@ -27,66 +36,108 @@ class ChatSpacesSearchList extends StatelessWidget with WatchItMixin {
2736 (SearchManager m) => m.spaceSearch? .length ?? 0 ,
2837 );
2938 if (spaceSearch == null ) {
30- return const Center (
31- child: Padding (padding: EdgeInsets .all (kBigPadding), child: Progress ()),
32- );
39+ return _type == ChatSpacesSearchType .sliver
40+ ? const SliverToBoxAdapter (
41+ child: Center (
42+ child: Padding (
43+ padding: EdgeInsets .all (kBigPadding),
44+ child: Progress (),
45+ ),
46+ ),
47+ )
48+ : const Center (
49+ child: Padding (
50+ padding: EdgeInsets .all (kBigPadding),
51+ child: Progress (),
52+ ),
53+ );
3354 }
3455
3556 if (archiveActive ||
3657 roomsFilter != RoomsFilter .spaces ||
3758 spaceSearchL == 0 ) {
38- return const SizedBox .shrink ();
59+ return _type == ChatSpacesSearchType .sliver
60+ ? const SliverToBoxAdapter (child: SizedBox .shrink ())
61+ : const SizedBox .shrink ();
62+ }
63+
64+ if (_type == ChatSpacesSearchType .sliver) {
65+ return SliverList (
66+ delegate: SliverChildBuilderDelegate (
67+ (context, index) => _itemBuilder (context, index, spaceSearch),
68+ childCount: spaceSearchL,
69+ ),
70+ );
3971 }
4072
4173 return ListView .builder (
4274 itemCount: spaceSearchL,
43- itemBuilder: (context, index) {
44- final chunk = spaceSearch.elementAt (index);
45- return Padding (
46- padding: const EdgeInsets .only (bottom: 5 ),
47- child: YaruMasterTile (
48- key: ValueKey (chunk.roomId),
49- leading: ChatAvatar (avatarUri: chunk.avatarUrl),
50- title: Text (
51- '${chunk .roomType == 'm.space' ? '(${context .l10n .space }) ' : '' }'
52- '${chunk .name ?? chunk .canonicalAlias ?? '' }' ,
53- ),
54- subtitle: Tooltip (
55- margin: const EdgeInsets .all (kBigPadding),
56- message: chunk.topic ?? ' ' ,
57- child: Text (chunk.canonicalAlias ?? chunk.topic ?? '' ),
58- ),
59- onTap: () => ConfirmationDialog .show (
60- title: Text (
61- chunk.joinRule == 'knock'
62- ? context.l10n.knock
63- : context.l10n.joinRoom,
64- ),
65- content: Column (
66- mainAxisSize: MainAxisSize .min,
67- spacing: kMediumPadding,
68- children: [
69- ChatAvatar (avatarUri: chunk.avatarUrl),
70- Padding (
71- padding: const EdgeInsets .only (top: 8.0 ),
72- child: Text (
73- chunk.canonicalAlias ?? chunk.name ?? chunk.roomId,
74- ),
75- ),
76- ],
77- ),
78- context: context,
79- onConfirm: () async {
80- Navigator .of (context).pop ();
81- di <EditRoomManager >().knockOrJoinCommand.run ((
82- roomId: chunk.roomId,
83- knock: chunk.joinRule == 'knock' ,
84- ));
85- },
75+ itemBuilder: (context, index) =>
76+ _itemBuilder (context, index, spaceSearch),
77+ );
78+ }
79+
80+ Widget ? _itemBuilder (
81+ BuildContext context,
82+ int index,
83+ List <PublishedRoomsChunk >? spaceSearch,
84+ ) {
85+ final chunk = spaceSearch? .elementAtOrNull (index);
86+ if (chunk == null ) {
87+ return const SizedBox .shrink ();
88+ }
89+ return Padding (
90+ padding: const EdgeInsets .only (bottom: 5 ),
91+ child: ChatSpacesDiscoverTile (chunk: chunk),
92+ );
93+ }
94+ }
95+
96+ class ChatSpacesDiscoverTile extends StatelessWidget {
97+ const ChatSpacesDiscoverTile ({super .key, required this .chunk});
98+
99+ final PublishedRoomsChunk chunk;
100+
101+ @override
102+ Widget build (BuildContext context) {
103+ return YaruMasterTile (
104+ key: ValueKey (chunk.roomId),
105+ leading: ChatAvatar (avatarUri: chunk.avatarUrl),
106+ title: Text (
107+ '${chunk .roomType == 'm.space' ? '(${context .l10n .space }) ' : '' }'
108+ '${chunk .name ?? chunk .canonicalAlias ?? '' }' ,
109+ ),
110+ subtitle: Tooltip (
111+ margin: const EdgeInsets .all (kBigPadding),
112+ message: chunk.topic ?? ' ' ,
113+ child: Text (chunk.canonicalAlias ?? chunk.topic ?? '' ),
114+ ),
115+ onTap: () => ConfirmationDialog .show (
116+ title: Text (
117+ chunk.joinRule == 'knock'
118+ ? context.l10n.knock
119+ : context.l10n.joinRoom,
120+ ),
121+ content: Column (
122+ mainAxisSize: MainAxisSize .min,
123+ spacing: kMediumPadding,
124+ children: [
125+ ChatAvatar (avatarUri: chunk.avatarUrl),
126+ Padding (
127+ padding: const EdgeInsets .only (top: 8.0 ),
128+ child: Text (chunk.canonicalAlias ?? chunk.name ?? chunk.roomId),
86129 ),
87- ),
88- );
89- },
130+ ],
131+ ),
132+ context: context,
133+ onConfirm: () async {
134+ Navigator .of (context).pop ();
135+ di <EditRoomManager >().knockOrJoinCommand.run ((
136+ roomId: chunk.roomId,
137+ knock: chunk.joinRule == 'knock' ,
138+ ));
139+ },
140+ ),
90141 );
91142 }
92143}
0 commit comments