Skip to content

Commit 0f47628

Browse files
committed
all_channels: Also confirm before unsubscribing here, not just action sheet
Fixes #1878.
1 parent 50e487b commit 0f47628

File tree

2 files changed

+38
-2
lines changed

2 files changed

+38
-2
lines changed

lib/widgets/all_channels.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import '../generated/l10n/zulip_localizations.dart';
66
import '../log.dart';
77
import '../model/channel.dart';
88
import 'action_sheet.dart';
9+
import 'actions.dart';
910
import 'app_bar.dart';
1011
import 'button.dart';
1112
import 'icons.dart';
@@ -137,8 +138,8 @@ class _SubscribeToggle extends StatelessWidget {
137138
await subscribeToChannel(store.connection,
138139
subscriptions: [channel.name]);
139140
} else {
140-
await unsubscribeFromChannel(store.connection,
141-
subscriptions: [channel.name]);
141+
await ZulipAction.unsubscribeFromChannel(context,
142+
channelId: channel.streamId);
142143
}
143144
},
144145
// TODO(#741) interpret API errors for user

test/widgets/all_channels_test.dart

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import 'package:zulip/widgets/button.dart';
1313
import 'package:zulip/widgets/home.dart';
1414
import 'package:zulip/widgets/icons.dart';
1515
import 'package:zulip/widgets/page.dart';
16+
import 'package:zulip/widgets/remote_settings.dart';
1617
import 'package:zulip/widgets/theme.dart';
1718

1819
import '../api/fake_api.dart';
@@ -23,6 +24,7 @@ import '../example_data.dart' as eg;
2324
import '../model/test_store.dart';
2425
import '../stdlib_checks.dart';
2526
import 'checks.dart';
27+
import 'dialog_checks.dart';
2628
import 'test_app.dart';
2729

2830
void main() {
@@ -238,4 +240,37 @@ void main() {
238240
'subscriptions': jsonEncode([channel.name]),
239241
});
240242
});
243+
244+
testWidgets('Toggle "off" to unsubscribe, but without resubscribe permission', (tester) async {
245+
final channel = eg.stream(
246+
inviteOnly: true, canSubscribeGroup: eg.groupSetting(members: []));
247+
final subscription = eg.subscription(channel);
248+
249+
(Widget, Widget) checkConfirmDialog() => checkSuggestedActionDialog(tester,
250+
expectedTitle: 'Unsubscribe from ${channel.name}?',
251+
expectedMessage: 'Once you leave this channel, you will not be able to rejoin.',
252+
expectDestructiveActionButton: true,
253+
expectedActionButtonText: 'Unsubscribe');
254+
255+
await setupAllChannelsPage(tester, channels: [subscription]);
256+
257+
await tester.tap(find.byType(Toggle));
258+
await tester.pump();
259+
final (_, cancelButton) = checkConfirmDialog();
260+
await tester.tap(find.byWidget(cancelButton));
261+
await tester.pump();
262+
check(connection.lastRequest).isNull();
263+
await tester.pump(RemoteSettingBuilder.localEchoIdleTimeout);
264+
265+
await tester.tap(find.byType(Toggle));
266+
await tester.pump();
267+
final (unsubscribeButton, _) = checkConfirmDialog();
268+
await tester.tap(find.byWidget(unsubscribeButton));
269+
check(connection.lastRequest).isA<http.Request>()
270+
..method.equals('DELETE')
271+
..url.path.equals('/api/v1/users/me/subscriptions')
272+
..bodyFields.deepEquals({
273+
'subscriptions': jsonEncode([channel.name]),
274+
});
275+
});
241276
}

0 commit comments

Comments
 (0)