Skip to content

Commit 19f63cd

Browse files
committed
action_sheet [nfc]: Move unsubscribe-from-channel logic to ZulipAction
1 parent b628dd9 commit 19f63cd

File tree

2 files changed

+47
-40
lines changed

2 files changed

+47
-40
lines changed

lib/widgets/action_sheet.dart

Lines changed: 1 addition & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import '../model/content.dart';
1717
import '../model/emoji.dart';
1818
import '../model/internal_link.dart';
1919
import '../model/narrow.dart';
20-
import '../model/realm.dart';
2120
import 'actions.dart';
2221
import 'button.dart';
2322
import 'color.dart';
@@ -634,45 +633,7 @@ class UnsubscribeButton extends ActionSheetMenuItemButton {
634633

635634
@override
636635
void onPressed() async {
637-
final store = PerAccountStoreWidget.of(pageContext);
638-
final subscription = store.subscriptions[channelId];
639-
if (subscription == null) return; // TODO could give feedback
640-
641-
// TODO(future) check if the self-user is a guest and the channel is not web-public
642-
final couldResubscribe = !subscription.inviteOnly
643-
|| store.selfHasPermissionForGroupSetting(subscription.canSubscribeGroup,
644-
GroupSettingType.stream, 'can_subscribe_group');
645-
if (!couldResubscribe) {
646-
// TODO(#1788) warn if org would lose content access (nobody can subscribe)
647-
final zulipLocalizations = ZulipLocalizations.of(pageContext);
648-
649-
final dialog = showSuggestedActionDialog(context: pageContext,
650-
title: zulipLocalizations.unsubscribeConfirmationDialogTitle(subscription.name),
651-
message: zulipLocalizations.unsubscribeConfirmationDialogMessageCannotResubscribe,
652-
destructiveActionButton: true,
653-
actionButtonText: zulipLocalizations.unsubscribeConfirmationDialogConfirmButton);
654-
if (await dialog.result != true) return;
655-
if (!pageContext.mounted) return;
656-
}
657-
658-
try {
659-
await unsubscribeFromChannel(PerAccountStoreWidget.of(pageContext).connection,
660-
subscriptions: [subscription.name]);
661-
} catch (e) {
662-
if (!pageContext.mounted) return;
663-
664-
String? errorMessage;
665-
switch (e) {
666-
case ZulipApiException():
667-
errorMessage = e.message;
668-
// TODO(#741) specific messages for common errors, like network errors
669-
// (support with reusable code)
670-
default:
671-
}
672-
673-
final title = ZulipLocalizations.of(pageContext).unsubscribeFailedTitle;
674-
showErrorDialog(context: pageContext, title: title, message: errorMessage);
675-
}
636+
await ZulipAction.unsubscribeFromChannel(pageContext, channelId: channelId);
676637
}
677638
}
678639

lib/widgets/actions.dart

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@ import '../api/exception.dart';
77
import '../api/model/model.dart';
88
import '../api/model/narrow.dart';
99
import '../api/route/messages.dart';
10+
import '../api/route/channels.dart' as channels_api;
1011
import '../generated/l10n/zulip_localizations.dart';
1112
import '../model/binding.dart';
1213
import '../model/narrow.dart';
14+
import '../model/realm.dart';
1315
import 'dialog.dart';
1416
import 'store.dart';
1517

@@ -239,6 +241,50 @@ abstract final class ZulipAction {
239241

240242
return fetchedMessage?.content;
241243
}
244+
245+
static Future<void> unsubscribeFromChannel(BuildContext context, {
246+
required int channelId,
247+
}) async {
248+
final store = PerAccountStoreWidget.of(context);
249+
final subscription = store.subscriptions[channelId];
250+
if (subscription == null) return; // TODO could give feedback
251+
252+
// TODO(future) check if the self-user is a guest and the channel is not web-public
253+
final couldResubscribe = !subscription.inviteOnly
254+
|| store.selfHasPermissionForGroupSetting(subscription.canSubscribeGroup,
255+
GroupSettingType.stream, 'can_subscribe_group');
256+
if (!couldResubscribe) {
257+
// TODO(#1788) warn if org would lose content access (nobody can subscribe)
258+
final zulipLocalizations = ZulipLocalizations.of(context);
259+
260+
final dialog = showSuggestedActionDialog(context: context,
261+
title: zulipLocalizations.unsubscribeConfirmationDialogTitle(subscription.name),
262+
message: zulipLocalizations.unsubscribeConfirmationDialogMessageCannotResubscribe,
263+
destructiveActionButton: true,
264+
actionButtonText: zulipLocalizations.unsubscribeConfirmationDialogConfirmButton);
265+
if (await dialog.result != true) return;
266+
if (!context.mounted) return;
267+
}
268+
269+
try {
270+
await channels_api.unsubscribeFromChannel(PerAccountStoreWidget.of(context).connection,
271+
subscriptions: [subscription.name]);
272+
} catch (e) {
273+
if (!context.mounted) return;
274+
275+
String? errorMessage;
276+
switch (e) {
277+
case ZulipApiException():
278+
errorMessage = e.message;
279+
// TODO(#741) specific messages for common errors, like network errors
280+
// (support with reusable code)
281+
default:
282+
}
283+
284+
final title = ZulipLocalizations.of(context).unsubscribeFailedTitle;
285+
showErrorDialog(context: context, title: title, message: errorMessage);
286+
}
287+
}
242288
}
243289

244290
/// Methods that act through platform APIs and show feedback in the UI.

0 commit comments

Comments
 (0)