Skip to content

Commit af3d505

Browse files
committed
new-dm: Support unselecting a user by tapping chip in input
1 parent 0f9f98c commit af3d505

File tree

2 files changed

+47
-23
lines changed

2 files changed

+47
-23
lines changed

lib/widgets/new_dm_sheet.dart

Lines changed: 30 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,8 @@ class _NewDmPickerState extends State<NewDmPicker> with PerAccountStoreAwareStat
132132
_NewDmHeader(selectedUserIds: selectedUserIds),
133133
_NewDmSearchBar(
134134
controller: searchController,
135-
selectedUserIds: selectedUserIds),
135+
selectedUserIds: selectedUserIds,
136+
unselectUser: _unselectUser),
136137
Expanded(
137138
child: _NewDmUserList(
138139
filteredUsers: filteredUsers,
@@ -214,10 +215,12 @@ class _NewDmSearchBar extends StatelessWidget {
214215
const _NewDmSearchBar({
215216
required this.controller,
216217
required this.selectedUserIds,
218+
required this.unselectUser,
217219
});
218220

219221
final TextEditingController controller;
220222
final Set<int> selectedUserIds;
223+
final void Function(int) unselectUser;
221224

222225
// void _removeUser
223226

@@ -265,7 +268,7 @@ class _NewDmSearchBar extends StatelessWidget {
265268
crossAxisAlignment: WrapCrossAlignment.center,
266269
children: [
267270
for (final userId in selectedUserIds)
268-
_SelectedUserChip(userId: userId),
271+
_SelectedUserChip(userId: userId, unselectUser: unselectUser),
269272
// The IntrinsicWidth lets the text field participate in the Wrap
270273
// when its content fits on the same line with a user chip,
271274
// by preventing it from expanding to fill the available width. See:
@@ -276,9 +279,13 @@ class _NewDmSearchBar extends StatelessWidget {
276279
}
277280

278281
class _SelectedUserChip extends StatelessWidget {
279-
const _SelectedUserChip({required this.userId});
282+
const _SelectedUserChip({
283+
required this.userId,
284+
required this.unselectUser,
285+
});
280286

281287
final int userId;
288+
final void Function(int) unselectUser;
282289

283290
@override
284291
Widget build(BuildContext context) {
@@ -287,24 +294,26 @@ class _SelectedUserChip extends StatelessWidget {
287294
final clampedTextScaler = MediaQuery.textScalerOf(context)
288295
.clamp(maxScaleFactor: 1.5);
289296

290-
return DecoratedBox(
291-
decoration: BoxDecoration(
292-
color: designVariables.bgMenuButtonSelected,
293-
borderRadius: BorderRadius.circular(3)),
294-
child: Row(mainAxisSize: MainAxisSize.min, children: [
295-
Avatar(userId: userId, size: clampedTextScaler.scale(22), borderRadius: 3),
296-
Flexible(
297-
child: Padding(
298-
padding: const EdgeInsetsDirectional.fromSTEB(5, 3, 4, 3),
299-
child: Text(store.userDisplayName(userId),
300-
textScaler: clampedTextScaler,
301-
maxLines: 1,
302-
overflow: TextOverflow.ellipsis,
303-
style: TextStyle(
304-
fontSize: 16,
305-
height: 16 / 16,
306-
color: designVariables.labelMenuButton)))),
307-
]));
297+
return GestureDetector(
298+
onTap: () => unselectUser(userId),
299+
child: DecoratedBox(
300+
decoration: BoxDecoration(
301+
color: designVariables.bgMenuButtonSelected,
302+
borderRadius: BorderRadius.circular(3)),
303+
child: Row(mainAxisSize: MainAxisSize.min, children: [
304+
Avatar(userId: userId, size: clampedTextScaler.scale(22), borderRadius: 3),
305+
Flexible(
306+
child: Padding(
307+
padding: const EdgeInsetsDirectional.fromSTEB(5, 3, 4, 3),
308+
child: Text(store.userDisplayName(userId),
309+
textScaler: clampedTextScaler,
310+
maxLines: 1,
311+
overflow: TextOverflow.ellipsis,
312+
style: TextStyle(
313+
fontSize: 16,
314+
height: 16 / 16,
315+
color: designVariables.labelMenuButton)))),
316+
])));
308317
}
309318
}
310319

test/widgets/new_dm_sheet_test.dart

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,15 @@ void main() {
6363
Finder findUserTile(User user) =>
6464
find.widgetWithText(InkWell, user.fullName).first;
6565

66-
Finder findUserChip(User user) =>
67-
find.byWidgetPredicate((widget) =>
66+
Finder findUserChip(User user) {
67+
final findAvatar = find.byWidgetPredicate((widget) =>
6868
widget is Avatar
6969
&& widget.userId == user.userId
7070
&& widget.size == 22);
7171

72+
return find.ancestor(of: findAvatar, matching: find.byType(GestureDetector));
73+
}
74+
7275
testWidgets('shows header with correct buttons', (tester) async {
7376
await setupSheet(tester, users: []);
7477

@@ -201,6 +204,18 @@ void main() {
201204
}
202205
}
203206

207+
208+
testWidgets('tapping user chip deselects the user', (tester) async {
209+
await setupSheet(tester, users: [eg.selfUser, eg.otherUser, eg.thirdUser]);
210+
211+
await tester.tap(findUserTile(eg.otherUser));
212+
await tester.pump();
213+
checkUserSelected(tester, eg.otherUser, true);
214+
await tester.tap(findUserChip(eg.otherUser));
215+
await tester.pump();
216+
checkUserSelected(tester, eg.otherUser, false);
217+
});
218+
204219
testWidgets('selecting and deselecting a user', (tester) async {
205220
final user = eg.user(fullName: 'Test User');
206221
await setupSheet(tester, users: [eg.selfUser, user]);

0 commit comments

Comments
 (0)