Skip to content

Distinguish muted users in UI #1429

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 14 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified assets/icons/ZulipIcons.ttf
Binary file not shown.
3 changes: 3 additions & 0 deletions assets/icons/eye.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions assets/icons/eye_off.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
10 changes: 10 additions & 0 deletions assets/icons/person.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
File renamed without changes
14 changes: 5 additions & 9 deletions assets/l10n/app_en.arb
Original file line number Diff line number Diff line change
Expand Up @@ -983,17 +983,13 @@
"@noEarlierMessages": {
"description": "Text to show at the start of a message list if there are no earlier messages."
},
"mutedSender": "Muted sender",
"@mutedSender": {
"description": "Name for a muted user to display in message list."
},
"revealButtonLabel": "Reveal message for muted sender",
"@revealButtonLabel": {
"description": "Label for the button revealing hidden message from a muted sender in message list."
},
"mutedUser": "Muted user",
"@mutedUser": {
"description": "Name for a muted user to display all over the app."
"description": "Text to display in place of a muted user's name"
},
"revealButtonLabel": "Reveal message",
"@revealButtonLabel": {
"description": "Label for the button revealing hidden message from a muted user in message list."
},
"scrollToBottomTooltip": "Scroll to bottom",
"@scrollToBottomTooltip": {
Expand Down
19 changes: 19 additions & 0 deletions lib/api/model/events.dart
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ sealed class Event {
}
// case 'muted_topics': … // TODO(#422) we ignore this feature on older servers
case 'user_topic': return UserTopicEvent.fromJson(json);
case 'muted_users': return MutedUsersEvent.fromJson(json);
case 'message': return MessageEvent.fromJson(json);
case 'update_message': return UpdateMessageEvent.fromJson(json);
case 'delete_message': return DeleteMessageEvent.fromJson(json);
Expand Down Expand Up @@ -733,6 +734,24 @@ class UserTopicEvent extends Event {
Map<String, dynamic> toJson() => _$UserTopicEventToJson(this);
}

/// A Zulip event of type `muted_users`: https://zulip.com/api/get-events#muted_users
@JsonSerializable(fieldRename: FieldRename.snake)
class MutedUsersEvent extends Event {
@override
@JsonKey(includeToJson: true)
String get type => 'muted_users';

final List<MutedUserItem> mutedUsers;

MutedUsersEvent({required super.id, required this.mutedUsers});

factory MutedUsersEvent.fromJson(Map<String, dynamic> json) =>
_$MutedUsersEventFromJson(json);

@override
Map<String, dynamic> toJson() => _$MutedUsersEventToJson(this);
}

/// A Zulip event of type `message`: https://zulip.com/api/get-events#message
@JsonSerializable(fieldRename: FieldRename.snake)
class MessageEvent extends Event {
Expand Down
16 changes: 16 additions & 0 deletions lib/api/model/events.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions lib/api/model/initial_snapshot.dart
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ class InitialSnapshot {

// final List<…> mutedTopics; // TODO(#422) we ignore this feature on older servers

final List<MutedUserItem> mutedUsers;

final Map<String, RealmEmojiItem> realmEmoji;

final List<RecentDmConversation> recentPrivateConversations;
Expand Down Expand Up @@ -132,6 +134,7 @@ class InitialSnapshot {
required this.serverTypingStartedExpiryPeriodMilliseconds,
required this.serverTypingStoppedWaitPeriodMilliseconds,
required this.serverTypingStartedWaitPeriodMilliseconds,
required this.mutedUsers,
required this.realmEmoji,
required this.recentPrivateConversations,
required this.savedSnippets,
Expand Down
5 changes: 5 additions & 0 deletions lib/api/model/initial_snapshot.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

16 changes: 16 additions & 0 deletions lib/api/model/model.dart
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,22 @@ class CustomProfileFieldExternalAccountData {
Map<String, dynamic> toJson() => _$CustomProfileFieldExternalAccountDataToJson(this);
}

/// An item in the [InitialSnapshot.mutedUsers] or [MutedUsersEvent].
///
/// For docs, search for "muted_users:"
/// in <https://zulip.com/api/register-queue>.
@JsonSerializable(fieldRename: FieldRename.snake)
class MutedUserItem {
final int id;

const MutedUserItem({required this.id});

factory MutedUserItem.fromJson(Map<String, dynamic> json) =>
_$MutedUserItemFromJson(json);

Map<String, dynamic> toJson() => _$MutedUserItemToJson(this);
}

/// An item in [InitialSnapshot.realmEmoji] or [RealmEmojiUpdateEvent].
///
/// For docs, search for "realm_emoji:"
Expand Down
6 changes: 6 additions & 0 deletions lib/api/model/model.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

16 changes: 5 additions & 11 deletions lib/generated/l10n/zulip_localizations.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1463,24 +1463,18 @@ abstract class ZulipLocalizations {
/// **'No earlier messages'**
String get noEarlierMessages;

/// Name for a muted user to display in message list.
/// Text to display in place of a muted user's name
///
/// In en, this message translates to:
/// **'Muted sender'**
String get mutedSender;
/// **'Muted user'**
String get mutedUser;

/// Label for the button revealing hidden message from a muted sender in message list.
/// Label for the button revealing hidden message from a muted user in message list.
///
/// In en, this message translates to:
/// **'Reveal message for muted sender'**
/// **'Reveal message'**
String get revealButtonLabel;

/// Name for a muted user to display all over the app.
///
/// In en, this message translates to:
/// **'Muted user'**
String get mutedUser;

/// Tooltip for button to scroll to bottom.
///
/// In en, this message translates to:
Expand Down
7 changes: 2 additions & 5 deletions lib/generated/l10n/zulip_localizations_ar.dart
Original file line number Diff line number Diff line change
Expand Up @@ -797,13 +797,10 @@ class ZulipLocalizationsAr extends ZulipLocalizations {
String get noEarlierMessages => 'No earlier messages';

@override
String get mutedSender => 'Muted sender';

@override
String get revealButtonLabel => 'Reveal message for muted sender';
String get mutedUser => 'Muted user';

@override
String get mutedUser => 'Muted user';
String get revealButtonLabel => 'Reveal message';

@override
String get scrollToBottomTooltip => 'Scroll to bottom';
Expand Down
7 changes: 2 additions & 5 deletions lib/generated/l10n/zulip_localizations_de.dart
Original file line number Diff line number Diff line change
Expand Up @@ -797,13 +797,10 @@ class ZulipLocalizationsDe extends ZulipLocalizations {
String get noEarlierMessages => 'No earlier messages';

@override
String get mutedSender => 'Muted sender';

@override
String get revealButtonLabel => 'Reveal message for muted sender';
String get mutedUser => 'Muted user';

@override
String get mutedUser => 'Muted user';
String get revealButtonLabel => 'Reveal message';

@override
String get scrollToBottomTooltip => 'Scroll to bottom';
Expand Down
7 changes: 2 additions & 5 deletions lib/generated/l10n/zulip_localizations_en.dart
Original file line number Diff line number Diff line change
Expand Up @@ -797,13 +797,10 @@ class ZulipLocalizationsEn extends ZulipLocalizations {
String get noEarlierMessages => 'No earlier messages';

@override
String get mutedSender => 'Muted sender';

@override
String get revealButtonLabel => 'Reveal message for muted sender';
String get mutedUser => 'Muted user';

@override
String get mutedUser => 'Muted user';
String get revealButtonLabel => 'Reveal message';

@override
String get scrollToBottomTooltip => 'Scroll to bottom';
Expand Down
7 changes: 2 additions & 5 deletions lib/generated/l10n/zulip_localizations_ja.dart
Original file line number Diff line number Diff line change
Expand Up @@ -797,13 +797,10 @@ class ZulipLocalizationsJa extends ZulipLocalizations {
String get noEarlierMessages => 'No earlier messages';

@override
String get mutedSender => 'Muted sender';

@override
String get revealButtonLabel => 'Reveal message for muted sender';
String get mutedUser => 'Muted user';

@override
String get mutedUser => 'Muted user';
String get revealButtonLabel => 'Reveal message';

@override
String get scrollToBottomTooltip => 'Scroll to bottom';
Expand Down
7 changes: 2 additions & 5 deletions lib/generated/l10n/zulip_localizations_nb.dart
Original file line number Diff line number Diff line change
Expand Up @@ -797,13 +797,10 @@ class ZulipLocalizationsNb extends ZulipLocalizations {
String get noEarlierMessages => 'No earlier messages';

@override
String get mutedSender => 'Muted sender';

@override
String get revealButtonLabel => 'Reveal message for muted sender';
String get mutedUser => 'Muted user';

@override
String get mutedUser => 'Muted user';
String get revealButtonLabel => 'Reveal message';

@override
String get scrollToBottomTooltip => 'Scroll to bottom';
Expand Down
7 changes: 2 additions & 5 deletions lib/generated/l10n/zulip_localizations_pl.dart
Original file line number Diff line number Diff line change
Expand Up @@ -808,13 +808,10 @@ class ZulipLocalizationsPl extends ZulipLocalizations {
String get noEarlierMessages => 'Brak historii';

@override
String get mutedSender => 'Muted sender';

@override
String get revealButtonLabel => 'Reveal message for muted sender';
String get mutedUser => 'Muted user';

@override
String get mutedUser => 'Muted user';
String get revealButtonLabel => 'Reveal message';

@override
String get scrollToBottomTooltip => 'Przewiń do dołu';
Expand Down
7 changes: 2 additions & 5 deletions lib/generated/l10n/zulip_localizations_ru.dart
Original file line number Diff line number Diff line change
Expand Up @@ -811,13 +811,10 @@ class ZulipLocalizationsRu extends ZulipLocalizations {
String get noEarlierMessages => 'Предшествующих сообщений нет';

@override
String get mutedSender => 'Muted sender';

@override
String get revealButtonLabel => 'Reveal message for muted sender';
String get mutedUser => 'Muted user';

@override
String get mutedUser => 'Muted user';
String get revealButtonLabel => 'Reveal message';

@override
String get scrollToBottomTooltip => 'Пролистать вниз';
Expand Down
7 changes: 2 additions & 5 deletions lib/generated/l10n/zulip_localizations_sk.dart
Original file line number Diff line number Diff line change
Expand Up @@ -799,13 +799,10 @@ class ZulipLocalizationsSk extends ZulipLocalizations {
String get noEarlierMessages => 'No earlier messages';

@override
String get mutedSender => 'Muted sender';

@override
String get revealButtonLabel => 'Reveal message for muted sender';
String get mutedUser => 'Muted user';

@override
String get mutedUser => 'Muted user';
String get revealButtonLabel => 'Reveal message';

@override
String get scrollToBottomTooltip => 'Scroll to bottom';
Expand Down
7 changes: 2 additions & 5 deletions lib/generated/l10n/zulip_localizations_uk.dart
Original file line number Diff line number Diff line change
Expand Up @@ -811,13 +811,10 @@ class ZulipLocalizationsUk extends ZulipLocalizations {
String get noEarlierMessages => 'Немає попередніх повідомлень';

@override
String get mutedSender => 'Muted sender';

@override
String get revealButtonLabel => 'Reveal message for muted sender';
String get mutedUser => 'Muted user';

@override
String get mutedUser => 'Muted user';
String get revealButtonLabel => 'Reveal message';

@override
String get scrollToBottomTooltip => 'Прокрутити вниз';
Expand Down
7 changes: 2 additions & 5 deletions lib/generated/l10n/zulip_localizations_zh.dart
Original file line number Diff line number Diff line change
Expand Up @@ -797,13 +797,10 @@ class ZulipLocalizationsZh extends ZulipLocalizations {
String get noEarlierMessages => 'No earlier messages';

@override
String get mutedSender => 'Muted sender';

@override
String get revealButtonLabel => 'Reveal message for muted sender';
String get mutedUser => 'Muted user';

@override
String get mutedUser => 'Muted user';
String get revealButtonLabel => 'Reveal message';

@override
String get scrollToBottomTooltip => 'Scroll to bottom';
Expand Down
8 changes: 6 additions & 2 deletions lib/model/autocomplete.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import 'compose.dart';
import 'emoji.dart';
import 'narrow.dart';
import 'store.dart';
import 'user.dart';

extension ComposeContentAutocomplete on ComposeContentController {
AutocompleteIntent<ComposeAutocompleteQuery>? autocompleteIntent() {
Expand Down Expand Up @@ -449,6 +450,8 @@ class MentionAutocompleteView extends AutocompleteView<MentionAutocompleteQuery,
required PerAccountStore store,
required Narrow narrow,
}) {
// return store.allUsers.whereNot((user) => store.isUserMuted(user.userId)).toList()
// ..sort(_comparator(store: store, narrow: narrow));
return store.allUsers.toList()
..sort(_comparator(store: store, narrow: narrow));
}
Expand Down Expand Up @@ -649,7 +652,7 @@ class MentionAutocompleteView extends AutocompleteView<MentionAutocompleteQuery,
}

MentionAutocompleteResult? _testUser(MentionAutocompleteQuery query, User user) {
if (query.testUser(user, store.autocompleteViewManager.autocompleteDataCache)) {
if (query.testUser(user, store.autocompleteViewManager.autocompleteDataCache, store)) {
return UserMentionAutocompleteResult(userId: user.userId);
}
return null;
Expand Down Expand Up @@ -754,9 +757,10 @@ class MentionAutocompleteQuery extends ComposeAutocompleteQuery {
|| wildcardOption.localizedCanonicalString(localizations).contains(_lowercase);
}

bool testUser(User user, AutocompleteDataCache cache) {
bool testUser(User user, AutocompleteDataCache cache, UserStore userStore) {
// TODO(#236) test email too, not just name
if (!user.isActive) return false;
if (userStore.isUserMuted(user.userId)) return false;

return _testName(user, cache);
}
Expand Down
Loading
Loading