diff --git a/lib/widgets/all_channels.dart b/lib/widgets/all_channels.dart index 3aaf0d8baf..442806d560 100644 --- a/lib/widgets/all_channels.dart +++ b/lib/widgets/all_channels.dart @@ -5,11 +5,13 @@ import '../api/route/channels.dart'; import '../generated/l10n/zulip_localizations.dart'; import '../log.dart'; import '../model/channel.dart'; +import '../model/narrow.dart'; import 'action_sheet.dart'; import 'actions.dart'; import 'app_bar.dart'; import 'button.dart'; import 'icons.dart'; +import 'message_list.dart'; import 'page.dart'; import 'remote_settings.dart'; import 'store.dart'; @@ -96,28 +98,34 @@ class AllChannelsListEntry extends StatelessWidget { final Subscription? subscription = channel is Subscription ? channel : null; final hasContentAccess = store.selfHasContentAccess(channel); - return Padding( - padding: EdgeInsetsDirectional.only(start: 8, end: 4), - child: Row(spacing: 6, children: [ - Icon( - size: 20, - color: colorSwatchFor(context, subscription).iconOnPlainBackground, - iconDataForStream(channel)), - Expanded( - child: Text( - style: TextStyle( - color: designVariables.textMessage, - fontSize: 17, - height: 20 / 17, - ).merge(weightVariableTextStyle(context, wght: 600)), - channel.name)), - if (hasContentAccess) _SubscribeToggle(channel: channel), - ZulipIconButton( - icon: ZulipIcons.more_horizontal, - onPressed: () { - showChannelActionSheet(context, channelId: channel.streamId); - }), - ])); + return InkWell( + onTap: !hasContentAccess ? null : () => Navigator.push(context, + MessageListPage.buildRoute(context: context, + narrow: ChannelNarrow(channel.streamId))), + onLongPress: () => showChannelActionSheet(context, channelId: channel.streamId), + child: ConstrainedBox(constraints: const BoxConstraints(minHeight: 44), + child: Padding( + padding: EdgeInsetsDirectional.only(start: 8, end: 12), + child: Row(spacing: 6, children: [ + Icon( + size: 20, + color: colorSwatchFor(context, subscription).iconOnPlainBackground, + iconDataForStream(channel)), + Expanded( + child: Text( + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: designVariables.textMessage, + fontSize: 17, + height: 20 / 17, + ).merge(weightVariableTextStyle(context, wght: 600)), + channel.name)), + IgnorePointer(ignoring: !hasContentAccess, + child: AnimatedOpacity(opacity: !hasContentAccess ? 0 : 1, + duration: Duration(milliseconds: 200), + child: _SubscribeToggle(channel: channel))) + ])))); } } diff --git a/test/widgets/all_channels_test.dart b/test/widgets/all_channels_test.dart index b47546be40..1beaa6ba79 100644 --- a/test/widgets/all_channels_test.dart +++ b/test/widgets/all_channels_test.dart @@ -12,6 +12,7 @@ import 'package:zulip/widgets/app_bar.dart'; import 'package:zulip/widgets/button.dart'; import 'package:zulip/widgets/home.dart'; import 'package:zulip/widgets/icons.dart'; +import 'package:zulip/widgets/message_list.dart'; import 'package:zulip/widgets/page.dart'; import 'package:zulip/widgets/remote_settings.dart'; import 'package:zulip/widgets/theme.dart'; @@ -194,29 +195,50 @@ void main() { check(findInRow(find.text(channel.name))).findsOne(); - final maybeToggle = tester.widgetList( - findInRow(find.byType(Toggle))).singleOrNull; + final toggle = tester.widget(findInRow(find.byType(Toggle))); + final opacityWidget = tester.widget(findInRow(find.byType(AnimatedOpacity))); + final ignoreWidget = tester.widget(findInRow(find.byType(IgnorePointer))); if (store.selfHasContentAccess(channel)) { final isSubscribed = channel is Subscription; - check(maybeToggle).isNotNull().value.equals(isSubscribed); + check(toggle).value.equals(isSubscribed); + check(opacityWidget.opacity).equals(1); + check(ignoreWidget.ignoring).isFalse(); } else { - check(maybeToggle).isNull(); + check(opacityWidget.opacity).equals(0); + check(ignoreWidget.ignoring).isTrue(); } - check(findInRow(find.byIcon(ZulipIcons.more_horizontal))).findsOne(); + final touchTargetSize = tester.getSize(findElement); + check(touchTargetSize.height).equals(44); } }); - testWidgets('tapping three-dots button opens channel action sheet', (tester) async { + testWidgets('open channel action sheet on long press', (tester) async { await setupAllChannelsPage(tester, channels: [eg.stream()]); - await tester.tap(find.byIcon(ZulipIcons.more_horizontal)); + await tester.longPress(find.byType(AllChannelsListEntry)); await tester.pump(); await transitionDurationObserver.pumpPastTransition(tester); check(find.byType(BottomSheet)).findsOne(); }); + testWidgets('navigate to channel feed on tap', (tester) async { + final channel = eg.stream(name: 'some-channel'); + await setupAllChannelsPage(tester, channels: [channel]); + + connection.prepare(json: eg.newestGetMessagesResult( + foundOldest: true, messages: [eg.streamMessage(stream: channel)]).toJson()); + await tester.tap(find.byType(AllChannelsListEntry)); + await tester.pump(); + await transitionDurationObserver.pumpPastTransition(tester); + + check(find.descendant( + of: find.byType(MessageListPage), + matching: find.text('some-channel')), + ).findsOne(); + }); + testWidgets('use toggle switch to subscribe/unsubscribe', (tester) async { final channel = eg.stream(); await setupAllChannelsPage(tester, channels: [channel]);