Skip to content

Commit 997b930

Browse files
recent dms [nfc]: Allow onDmSelect callback, notifying the selected DM
This will be used soon to provide a specific behaviour when selecting a DM, where if specified it will replace the default behaviour of routing to the message list page of the selected DM narrow.
1 parent b1866eb commit 997b930

File tree

2 files changed

+38
-15
lines changed

2 files changed

+38
-15
lines changed

lib/widgets/new_dm_sheet.dart

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,13 @@ import 'color.dart';
88
import 'icons.dart';
99
import 'message_list.dart';
1010
import 'page.dart';
11+
import 'recent_dm_conversations.dart';
1112
import 'store.dart';
1213
import 'text.dart';
1314
import 'theme.dart';
1415
import 'user.dart';
1516

16-
void showNewDmSheet(BuildContext context) {
17+
void showNewDmSheet(BuildContext context, OnDmSelectCallback? onDmSelect) {
1718
final pageContext = PageRoot.contextOf(context);
1819
final store = PerAccountStoreWidget.of(context);
1920
showModalBottomSheet<void>(
@@ -29,12 +30,14 @@ void showNewDmSheet(BuildContext context) {
2930
padding: EdgeInsets.only(bottom: MediaQuery.viewInsetsOf(context).bottom),
3031
child: PerAccountStoreWidget(
3132
accountId: store.accountId,
32-
child: NewDmPicker())));
33+
child: NewDmPicker(onDmSelect: onDmSelect))));
3334
}
3435

3536
@visibleForTesting
3637
class NewDmPicker extends StatefulWidget {
37-
const NewDmPicker({super.key});
38+
const NewDmPicker({super.key, this.onDmSelect});
39+
40+
final OnDmSelectCallback? onDmSelect;
3841

3942
@override
4043
State<NewDmPicker> createState() => _NewDmPickerState();
@@ -132,7 +135,7 @@ class _NewDmPickerState extends State<NewDmPicker> with PerAccountStoreAwareStat
132135
@override
133136
Widget build(BuildContext context) {
134137
return Column(crossAxisAlignment: CrossAxisAlignment.stretch, children: [
135-
_NewDmHeader(selectedUserIds: selectedUserIds),
138+
_NewDmHeader(selectedUserIds: selectedUserIds, onDmSelect: widget.onDmSelect),
136139
_NewDmSearchBar(
137140
controller: searchController,
138141
selectedUserIds: selectedUserIds,
@@ -148,9 +151,10 @@ class _NewDmPickerState extends State<NewDmPicker> with PerAccountStoreAwareStat
148151
}
149152

150153
class _NewDmHeader extends StatelessWidget {
151-
const _NewDmHeader({required this.selectedUserIds});
154+
const _NewDmHeader({required this.selectedUserIds, required this.onDmSelect});
152155

153156
final Set<int> selectedUserIds;
157+
final OnDmSelectCallback? onDmSelect;
154158

155159
Widget _buildCancelButton(BuildContext context) {
156160
final designVariables = DesignVariables.of(context);
@@ -178,8 +182,14 @@ class _NewDmHeader extends StatelessWidget {
178182
final narrow = DmNarrow.withUsers(
179183
selectedUserIds.toList(),
180184
selfUserId: store.selfUserId);
181-
Navigator.pushReplacement(context,
182-
MessageListPage.buildRoute(context: context, narrow: narrow));
185+
if (onDmSelect != null) {
186+
// Pop the new DMs action sheet.
187+
Navigator.pop(context);
188+
onDmSelect!(context, narrow);
189+
} else {
190+
Navigator.pushReplacement(context,
191+
MessageListPage.buildRoute(context: context, narrow: narrow));
192+
}
183193
},
184194
child: Text(zulipLocalizations.newDmSheetComposeButtonLabel,
185195
style: TextStyle(

lib/widgets/recent_dm_conversations.dart

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,17 @@ import 'theme.dart';
1414
import 'unread_count_badge.dart';
1515
import 'user.dart';
1616

17+
typedef OnDmSelectCallback = void Function(BuildContext context, DmNarrow narrow);
18+
1719
class RecentDmConversationsPageBody extends StatefulWidget {
1820
const RecentDmConversationsPageBody({
1921
super.key,
2022
this.hideDmsIfUserCantPost = false,
23+
this.onDmSelect,
2124
});
2225

2326
final bool hideDmsIfUserCantPost;
27+
final OnDmSelectCallback? onDmSelect;
2428

2529
@override
2630
State<RecentDmConversationsPageBody> createState() => _RecentDmConversationsPageBodyState();
@@ -91,11 +95,17 @@ class _RecentDmConversationsPageBodyState extends State<RecentDmConversationsPag
9195
}
9296
return RecentDmConversationsItem(
9397
narrow: narrow,
94-
unreadCount: unreadsModel!.countInDmNarrow(narrow));
98+
unreadCount: unreadsModel!.countInDmNarrow(narrow),
99+
onDmSelect: widget.onDmSelect
100+
?? (context, narrow) {
101+
Navigator.push(context,
102+
MessageListPage.buildRoute(context: context,
103+
narrow: narrow));
104+
});
95105
})),
96106
Positioned(
97107
bottom: 21,
98-
child: _NewDmButton()),
108+
child: _NewDmButton(onDmSelect: widget.onDmSelect)),
99109
]);
100110
}
101111
}
@@ -105,10 +115,12 @@ class RecentDmConversationsItem extends StatelessWidget {
105115
super.key,
106116
required this.narrow,
107117
required this.unreadCount,
118+
required this.onDmSelect,
108119
});
109120

110121
final DmNarrow narrow;
111122
final int unreadCount;
123+
final OnDmSelectCallback onDmSelect;
112124

113125
static const double _avatarSize = 32;
114126

@@ -151,10 +163,7 @@ class RecentDmConversationsItem extends StatelessWidget {
151163
return Material(
152164
color: backgroundColor,
153165
child: InkWell(
154-
onTap: () {
155-
Navigator.push(context,
156-
MessageListPage.buildRoute(context: context, narrow: narrow));
157-
},
166+
onTap: () => onDmSelect(context, narrow),
158167
child: ConstrainedBox(constraints: const BoxConstraints(minHeight: 48),
159168
child: Row(crossAxisAlignment: CrossAxisAlignment.center, children: [
160169
Padding(padding: const EdgeInsetsDirectional.fromSTEB(12, 8, 0, 8),
@@ -188,7 +197,11 @@ class RecentDmConversationsItem extends StatelessWidget {
188197
}
189198

190199
class _NewDmButton extends StatefulWidget {
191-
const _NewDmButton();
200+
const _NewDmButton({
201+
required this.onDmSelect,
202+
});
203+
204+
final OnDmSelectCallback? onDmSelect;
192205

193206
@override
194207
State<_NewDmButton> createState() => _NewDmButtonState();
@@ -210,7 +223,7 @@ class _NewDmButtonState extends State<_NewDmButton> {
210223
: designVariables.fabLabel;
211224

212225
return GestureDetector(
213-
onTap: () => showNewDmSheet(context),
226+
onTap: () => showNewDmSheet(context, widget.onDmSelect),
214227
onTapDown: (_) => setState(() => _pressed = true),
215228
onTapUp: (_) => setState(() => _pressed = false),
216229
onTapCancel: () => setState(() => _pressed = false),

0 commit comments

Comments
 (0)