Skip to content

Commit 63925aa

Browse files
committed
inbox: Add label for archived channels in headers
Design inspired by the web version. Fixes zulip#800
1 parent b8a6064 commit 63925aa

16 files changed

+297
-72
lines changed

assets/l10n/app_en.arb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,10 @@
375375
"@unknownChannelName": {
376376
"description": "Replacement name for channel when it cannot be found in the store."
377377
},
378+
"channelArchivedLabel": "(archived)",
379+
"@channelArchivedLabel": {
380+
"description": "Label shown next to an archived channel's name in headers."
381+
},
378382
"composeBoxTopicHintText": "Topic",
379383
"@composeBoxTopicHintText": {
380384
"description": "Hint text for topic input widget in compose box."

lib/generated/l10n/zulip_localizations.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -603,6 +603,12 @@ abstract class ZulipLocalizations {
603603
/// **'(unknown channel)'**
604604
String get unknownChannelName;
605605

606+
/// Label shown next to an archived channel's name in headers.
607+
///
608+
/// In en, this message translates to:
609+
/// **'(archived)'**
610+
String get channelArchivedLabel;
611+
606612
/// Hint text for topic input widget in compose box.
607613
///
608614
/// In en, this message translates to:

lib/generated/l10n/zulip_localizations_ar.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,9 @@ class ZulipLocalizationsAr extends ZulipLocalizations {
295295
@override
296296
String get unknownChannelName => '(unknown channel)';
297297

298+
@override
299+
String get channelArchivedLabel => '(archived)';
300+
298301
@override
299302
String get composeBoxTopicHintText => 'Topic';
300303

lib/generated/l10n/zulip_localizations_en.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,9 @@ class ZulipLocalizationsEn extends ZulipLocalizations {
295295
@override
296296
String get unknownChannelName => '(unknown channel)';
297297

298+
@override
299+
String get channelArchivedLabel => '(archived)';
300+
298301
@override
299302
String get composeBoxTopicHintText => 'Topic';
300303

lib/generated/l10n/zulip_localizations_ja.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,9 @@ class ZulipLocalizationsJa extends ZulipLocalizations {
295295
@override
296296
String get unknownChannelName => '(unknown channel)';
297297

298+
@override
299+
String get channelArchivedLabel => '(archived)';
300+
298301
@override
299302
String get composeBoxTopicHintText => 'Topic';
300303

lib/generated/l10n/zulip_localizations_nb.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,9 @@ class ZulipLocalizationsNb extends ZulipLocalizations {
295295
@override
296296
String get unknownChannelName => '(unknown channel)';
297297

298+
@override
299+
String get channelArchivedLabel => '(archived)';
300+
298301
@override
299302
String get composeBoxTopicHintText => 'Topic';
300303

lib/generated/l10n/zulip_localizations_pl.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,9 @@ class ZulipLocalizationsPl extends ZulipLocalizations {
295295
@override
296296
String get unknownChannelName => '(nieznany kanał)';
297297

298+
@override
299+
String get channelArchivedLabel => '(archived)';
300+
298301
@override
299302
String get composeBoxTopicHintText => 'Wątek';
300303

lib/generated/l10n/zulip_localizations_ru.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,9 @@ class ZulipLocalizationsRu extends ZulipLocalizations {
295295
@override
296296
String get unknownChannelName => '(unknown channel)';
297297

298+
@override
299+
String get channelArchivedLabel => '(archived)';
300+
298301
@override
299302
String get composeBoxTopicHintText => 'Тема';
300303

lib/generated/l10n/zulip_localizations_sk.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,9 @@ class ZulipLocalizationsSk extends ZulipLocalizations {
295295
@override
296296
String get unknownChannelName => '(unknown channel)';
297297

298+
@override
299+
String get channelArchivedLabel => '(archived)';
300+
298301
@override
299302
String get composeBoxTopicHintText => 'Topic';
300303

lib/widgets/action_sheet.dart

Lines changed: 61 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -228,53 +228,31 @@ void showTopicActionSheet(BuildContext context, {
228228
final pageContext = PageRoot.contextOf(context);
229229

230230
final store = PerAccountStoreWidget.of(pageContext);
231+
final channel = store.streams[channelId];
231232
final subscription = store.subscriptions[channelId];
232233

233234
final optionButtons = <ActionSheetMenuItemButton>[];
234235

235-
// TODO(server-7): simplify this condition away
236-
final supportsUnmutingTopics = store.zulipFeatureLevel >= 170;
237-
// TODO(server-8): simplify this condition away
238-
final supportsFollowingTopics = store.zulipFeatureLevel >= 219;
239-
240-
final visibilityOptions = <UserTopicVisibilityPolicy>[];
241-
final visibilityPolicy = store.topicVisibilityPolicy(channelId, topic);
242-
if (subscription == null) {
243-
// Not subscribed to the channel; there is no user topic change to be made.
244-
} else if (!subscription.isMuted) {
245-
// Channel is subscribed and not muted.
246-
switch (visibilityPolicy) {
247-
case UserTopicVisibilityPolicy.muted:
248-
visibilityOptions.add(UserTopicVisibilityPolicy.none);
249-
if (supportsFollowingTopics) {
250-
visibilityOptions.add(UserTopicVisibilityPolicy.followed);
251-
}
252-
case UserTopicVisibilityPolicy.none:
253-
case UserTopicVisibilityPolicy.unmuted:
254-
visibilityOptions.add(UserTopicVisibilityPolicy.muted);
255-
if (supportsFollowingTopics) {
256-
visibilityOptions.add(UserTopicVisibilityPolicy.followed);
257-
}
258-
case UserTopicVisibilityPolicy.followed:
259-
visibilityOptions.add(UserTopicVisibilityPolicy.muted);
260-
if (supportsFollowingTopics) {
261-
visibilityOptions.add(UserTopicVisibilityPolicy.none);
262-
}
263-
case UserTopicVisibilityPolicy.unknown:
264-
// TODO(#1074): This should be unreachable as we keep `unknown` out of
265-
// our data structures.
266-
assert(false);
267-
}
268-
} else {
269-
// Channel is muted.
270-
if (supportsUnmutingTopics) {
236+
final isChannelArchived = channel?.isArchived == true;
237+
if (!isChannelArchived) {
238+
// TODO(server-7): simplify this condition away
239+
final supportsUnmutingTopics = store.zulipFeatureLevel >= 170;
240+
// TODO(server-8): simplify this condition away
241+
final supportsFollowingTopics = store.zulipFeatureLevel >= 219;
242+
243+
final visibilityOptions = <UserTopicVisibilityPolicy>[];
244+
final visibilityPolicy = store.topicVisibilityPolicy(channelId, topic);
245+
if (subscription == null) {
246+
// Not subscribed to the channel; there is no user topic change to be made.
247+
} else if (!subscription.isMuted) {
248+
// Channel is subscribed and not muted.
271249
switch (visibilityPolicy) {
272-
case UserTopicVisibilityPolicy.none:
273250
case UserTopicVisibilityPolicy.muted:
274-
visibilityOptions.add(UserTopicVisibilityPolicy.unmuted);
251+
visibilityOptions.add(UserTopicVisibilityPolicy.none);
275252
if (supportsFollowingTopics) {
276253
visibilityOptions.add(UserTopicVisibilityPolicy.followed);
277254
}
255+
case UserTopicVisibilityPolicy.none:
278256
case UserTopicVisibilityPolicy.unmuted:
279257
visibilityOptions.add(UserTopicVisibilityPolicy.muted);
280258
if (supportsFollowingTopics) {
@@ -290,20 +268,46 @@ void showTopicActionSheet(BuildContext context, {
290268
// our data structures.
291269
assert(false);
292270
}
271+
} else {
272+
// Channel is muted.
273+
if (supportsUnmutingTopics) {
274+
switch (visibilityPolicy) {
275+
case UserTopicVisibilityPolicy.none:
276+
case UserTopicVisibilityPolicy.muted:
277+
visibilityOptions.add(UserTopicVisibilityPolicy.unmuted);
278+
if (supportsFollowingTopics) {
279+
visibilityOptions.add(UserTopicVisibilityPolicy.followed);
280+
}
281+
case UserTopicVisibilityPolicy.unmuted:
282+
visibilityOptions.add(UserTopicVisibilityPolicy.muted);
283+
if (supportsFollowingTopics) {
284+
visibilityOptions.add(UserTopicVisibilityPolicy.followed);
285+
}
286+
case UserTopicVisibilityPolicy.followed:
287+
visibilityOptions.add(UserTopicVisibilityPolicy.muted);
288+
if (supportsFollowingTopics) {
289+
visibilityOptions.add(UserTopicVisibilityPolicy.none);
290+
}
291+
case UserTopicVisibilityPolicy.unknown:
292+
// TODO(#1074): This should be unreachable as we keep `unknown` out of
293+
// our data structures.
294+
assert(false);
295+
}
296+
}
297+
}
298+
optionButtons.addAll(visibilityOptions.map((to) {
299+
return UserTopicUpdateButton(
300+
currentVisibilityPolicy: visibilityPolicy,
301+
newVisibilityPolicy: to,
302+
narrow: TopicNarrow(channelId, topic),
303+
pageContext: pageContext);
304+
}));
305+
306+
if (someMessageIdInTopic != null) {
307+
optionButtons.add(ResolveUnresolveButton(pageContext: pageContext,
308+
topic: topic,
309+
someMessageIdInTopic: someMessageIdInTopic));
293310
}
294-
}
295-
optionButtons.addAll(visibilityOptions.map((to) {
296-
return UserTopicUpdateButton(
297-
currentVisibilityPolicy: visibilityPolicy,
298-
newVisibilityPolicy: to,
299-
narrow: TopicNarrow(channelId, topic),
300-
pageContext: pageContext);
301-
}));
302-
303-
if (someMessageIdInTopic != null) {
304-
optionButtons.add(ResolveUnresolveButton(pageContext: pageContext,
305-
topic: topic,
306-
someMessageIdInTopic: someMessageIdInTopic));
307311
}
308312

309313
final unreadCount = store.unreads.countInTopicNarrow(channelId, topic);
@@ -558,14 +562,19 @@ void showMessageActionSheet({required BuildContext context, required Message mes
558562
final messageListPage = MessageListPage.ancestorOf(pageContext);
559563
final isComposeBoxOffered = messageListPage.composeBoxController != null;
560564

565+
bool isInArchivedChannel = false;
566+
if (message is StreamMessage) {
567+
final channel = store.streams[message.streamId];
568+
isInArchivedChannel = channel?.isArchived == true;
569+
}
561570
final isMessageRead = message.flags.contains(MessageFlag.read);
562571
final markAsUnreadSupported = store.zulipFeatureLevel >= 155; // TODO(server-6)
563572
final showMarkAsUnreadButton = markAsUnreadSupported && isMessageRead;
564573

565574
final optionButtons = [
566575
ReactionButtons(message: message, pageContext: pageContext),
567576
StarButton(message: message, pageContext: pageContext),
568-
if (isComposeBoxOffered)
577+
if (isComposeBoxOffered && !isInArchivedChannel)
569578
QuoteAndReplyButton(message: message, pageContext: pageContext),
570579
if (showMarkAsUnreadButton)
571580
MarkAsUnreadButton(message: message, pageContext: pageContext),

0 commit comments

Comments
 (0)