Skip to content
Open
34 changes: 5 additions & 29 deletions lib/api/model/events.dart

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

api: Replace `stream` with `channel` for MessageType
…

This too is technically out of scope for #1982, but it's fine to have.

Original file line number Diff line number Diff line change
Expand Up @@ -1423,7 +1423,7 @@ class DeleteMessageEvent extends Event {
factory DeleteMessageEvent.fromJson(Map<String, dynamic> json) {
final result = _$DeleteMessageEventFromJson(json);
// Crunchy-shell validation
if (result.messageType == MessageType.stream) {
if (result.messageType == .stream) {
result.streamId as int;
result.topic as String;
}
Expand All @@ -1434,30 +1434,6 @@ class DeleteMessageEvent extends Event {
Map<String, dynamic> toJson() => _$DeleteMessageEventToJson(this);
}

/// As in [DeleteMessageEvent.messageType],
/// [UpdateMessageFlagsMessageDetail.type],
/// or [TypingEvent.messageType].
@JsonEnum(alwaysCreate: true)
enum MessageType {
stream,
direct;
}

class MessageTypeConverter extends JsonConverter<MessageType, String> {
const MessageTypeConverter();

@override
MessageType fromJson(String json) {
if (json == 'private') json = 'direct'; // TODO(server-future)
return $enumDecode(_$MessageTypeEnumMap, json);
}

@override
String toJson(MessageType object) {
return _$MessageTypeEnumMap[object]!;
}
}

/// A Zulip event of type `update_message_flags`.
///
/// For the corresponding API docs, see subclasses.
Expand Down Expand Up @@ -1557,10 +1533,10 @@ class UpdateMessageFlagsMessageDetail {
final result = _$UpdateMessageFlagsMessageDetailFromJson(json);
// Crunchy-shell validation
switch (result.type) {
case MessageType.stream:
case .stream:
result.streamId as int;
result.topic as String;
case MessageType.direct:
case .direct:
result.userIds as List<int>;
}
return result;
Expand Down Expand Up @@ -1647,10 +1623,10 @@ class TypingEvent extends Event {
final result = _$TypingEventFromJson(json);
// Crunchy-shell validation
switch (result.messageType) {
case MessageType.stream:
case .stream:
result.streamId as int;
result.topic as String;
case MessageType.direct:
case .direct:
result.recipientIds as List<int>;
}
return result;
Expand Down
5 changes: 0 additions & 5 deletions lib/api/model/events.g.dart

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

28 changes: 28 additions & 0 deletions lib/api/model/model.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1289,6 +1289,34 @@ sealed class Message<T extends Conversation> extends MessageBase<T> {
Map<String, dynamic> toJson();
}

/// As in [DeleteMessageEvent.messageType],
/// [UpdateMessageFlagsMessageDetail.type],
/// or [TypingEvent.messageType].
@JsonEnum(alwaysCreate: true)
enum MessageType {
stream,
direct;

factory fromJson(String json) {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: Don't think we've used nameless constructors yet.

Suggested change
factory fromJson(String json) {
factory MessageType.fromJson(String json) {

Also without the name, it's easy to confuse it as a method.

if (json == 'private') json = 'direct'; // TODO(server-future)
return $enumDecode(_$MessageTypeEnumMap, json);
Comment on lines +1301 to 1303

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: Now that there are more than one cases, let's use switch pattern matching.

}
}

class MessageTypeConverter extends JsonConverter<MessageType, String> {
const MessageTypeConverter();

@override
MessageType fromJson(String json) {
return MessageType.fromJson(json);
}

@override
String toJson(MessageType object) {
return _$MessageTypeEnumMap[object]!;
}
}

/// https://zulip.com/api/update-message-flags#available-flags
@JsonEnum(fieldRename: FieldRename.snake, alwaysCreate: true)
enum MessageFlag {
Expand Down
5 changes: 5 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.

2 changes: 1 addition & 1 deletion lib/model/narrow.dart
Original file line number Diff line number Diff line change
Expand Up @@ -241,7 +241,7 @@ class DmNarrow extends Narrow implements SendableNarrow {
UpdateMessageFlagsMessageDetail detail, {
required int selfUserId,
}) {
assert(detail.type == MessageType.direct);
assert(detail.type == .direct);
return DmNarrow.withOtherUsers(detail.userIds!, selfUserId: selfUserId);
}

Expand Down
2 changes: 1 addition & 1 deletion lib/model/recent_senders.dart
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ class RecentSenders {
}

void handleDeleteMessageEvent(DeleteMessageEvent event, Map<int, Message> cachedMessages) {
if (event.messageType != MessageType.stream) return;
if (event.messageType != .stream) return;

final messagesByUser = <int, List<int>>{};
for (final id in event.messageIds) {
Expand Down
4 changes: 2 additions & 2 deletions lib/model/typing_status.dart
Original file line number Diff line number Diff line change
Expand Up @@ -63,9 +63,9 @@ class TypingStatus extends HasRealmStore with ChangeNotifier {

void handleTypingEvent(TypingEvent event) {
SendableNarrow narrow = switch (event.messageType) {
MessageType.direct => DmNarrow(
.direct => DmNarrow(
allRecipientIds: event.recipientIds!, selfUserId: selfUserId),
MessageType.stream => TopicNarrow(event.streamId!, event.topic!),
.stream => TopicNarrow(event.streamId!, event.topic!),
};

bool hasUpdate = false;
Expand Down
8 changes: 4 additions & 4 deletions lib/model/unreads.dart
Original file line number Diff line number Diff line change
Expand Up @@ -412,13 +412,13 @@ class Unreads extends PerAccountStoreBase with ChangeNotifier {
void handleDeleteMessageEvent(DeleteMessageEvent event) {
mentions.removeAll(event.messageIds);
switch (event.messageType) {
case MessageType.stream:
case .stream:
// All the messages are in [event.streamId] and [event.topic],
// so we can be more efficient than _removeAllInStreamsAndDms.
final streamId = event.streamId!;
final topic = event.topic!;
_removeAllInStreamTopic(Set.of(event.messageIds), streamId, topic);
case MessageType.direct:
case .direct:
_removeAllInStreamsAndDms(event.messageIds, expectOnlyDms: true);
}
for (final messageId in event.messageIds) {
Expand Down Expand Up @@ -490,13 +490,13 @@ class Unreads extends PerAccountStoreBase with ChangeNotifier {
mentions.add(messageId);
}
switch (detail.type) {
case MessageType.stream:
case .stream:
final UpdateMessageFlagsMessageDetail(:streamId, :topic) = detail;
locatorMap[messageId] = TopicNarrow(streamId!, topic!);
final topics = (newlyUnreadInStreams[streamId] ??= makeTopicKeyedMap());
final messageIds = (topics[topic] ??= QueueList());
messageIds.add(messageId);
case MessageType.direct:
case .direct:
final narrow = DmNarrow.ofUpdateMessageFlagsMessageDetail(selfUserId: selfUserId,
detail);
locatorMap[messageId] = narrow;
Expand Down
6 changes: 3 additions & 3 deletions test/api/model/events_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -275,7 +275,7 @@ void main() {
'type': 'delete_message',
'message_ids': [1, 2, 3],
'message_type': 'private',
})).messageType.equals(MessageType.direct);
})).messageType.equals(.direct);
});

group('update_message_flags/remove', () {
Expand Down Expand Up @@ -310,7 +310,7 @@ void main() {
...messageDetail,
'type': 'private',
}}})).messageDetails.isNotNull()
.values.single.type.equals(MessageType.direct);
.values.single.type.equals(.direct);
});
});

Expand Down Expand Up @@ -343,7 +343,7 @@ void main() {
check(TypingEvent.fromJson({
...directMessageJson,
'message_type': 'private',
})).messageType.equals(MessageType.direct);
})).messageType.equals(.direct);
});

test('stream type missing streamId/topic', () {
Expand Down
10 changes: 5 additions & 5 deletions test/example_data.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1107,7 +1107,7 @@ DeleteMessageEvent deleteMessageEvent(List<StreamMessage> messages) {
return DeleteMessageEvent(
id: 0,
messageIds: messages.map((message) => message.id).toList(),
messageType: MessageType.stream,
messageType: .stream,
streamId: messages[0].streamId,
topic: messages[0].topic,
);
Expand Down Expand Up @@ -1255,14 +1255,14 @@ UpdateMessageFlagsRemoveEvent updateMessageFlagsRemoveEvent(
message.id,
switch (message) {
StreamMessage() => UpdateMessageFlagsMessageDetail(
type: MessageType.stream,
type: .stream,
mentioned: mentioned,
streamId: message.streamId,
topic: message.topic,
userIds: null,
),
DmMessage() => UpdateMessageFlagsMessageDetail(
type: MessageType.direct,
type: .direct,
mentioned: mentioned,
streamId: null,
topic: null,
Expand Down Expand Up @@ -1293,13 +1293,13 @@ TypingEvent typingEvent(SendableNarrow narrow, TypingOp op, int senderId) {
switch (narrow) {
case TopicNarrow():
return TypingEvent(id: 0, op: op, senderId: senderId,
messageType: MessageType.stream,
messageType: .stream,
streamId: narrow.channelId,
topic: narrow.topic,
recipientIds: null);
case DmNarrow():
return TypingEvent(id: 0, op: op, senderId: senderId,
messageType: MessageType.direct,
messageType: .direct,
recipientIds: narrow.allRecipientIds,
streamId: null,
topic: null);
Expand Down
2 changes: 1 addition & 1 deletion test/model/recent_senders_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ void main() {
model.handleDeleteMessageEvent(DeleteMessageEvent(
id: 0,
messageIds: [messages[1].id],
messageType: MessageType.stream,
messageType: .stream,
streamId: stream.streamId,
topic: eg.t('oThEr'),
), {messages[1].id: messages[1]});
Expand Down
18 changes: 9 additions & 9 deletions test/model/unreads_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -855,7 +855,7 @@ void main() {
final event = switch (message) {
StreamMessage() => DeleteMessageEvent(
id: 0,
messageType: MessageType.stream,
messageType: .stream,
messageIds: [message.id],
streamId: message.streamId,
topic: () {
Expand All @@ -867,7 +867,7 @@ void main() {
),
DmMessage() => DeleteMessageEvent(
id: 0,
messageType: MessageType.direct,
messageType: .direct,
messageIds: [message.id],
streamId: null,
topic: null,
Expand All @@ -888,7 +888,7 @@ void main() {
model.handleDeleteMessageEvent(DeleteMessageEvent(
id: 0,
messageIds: [11, 12],
messageType: MessageType.stream,
messageType: .stream,
streamId: stream1.streamId,
topic: eg.t('a'),
));
Expand All @@ -897,7 +897,7 @@ void main() {
model.handleDeleteMessageEvent(DeleteMessageEvent(
id: 0,
messageIds: [13, 14],
messageType: MessageType.stream,
messageType: .stream,
streamId: stream2.streamId,
topic: eg.t('b'),
));
Expand All @@ -906,7 +906,7 @@ void main() {
model.handleDeleteMessageEvent(DeleteMessageEvent(
id: 0,
messageIds: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
messageType: MessageType.direct,
messageType: .direct,
streamId: null,
topic: null,
));
Expand All @@ -922,7 +922,7 @@ void main() {
model.handleDeleteMessageEvent(DeleteMessageEvent(
id: 0,
messageIds: [message.id],
messageType: MessageType.stream,
messageType: .stream,
streamId: message.streamId,
topic: message.topic,
));
Expand All @@ -941,7 +941,7 @@ void main() {
model.handleDeleteMessageEvent(DeleteMessageEvent(
id: 0,
messageIds: [message.id],
messageType: MessageType.direct,
messageType: .direct,
streamId: null,
topic: null,
));
Expand Down Expand Up @@ -1373,15 +1373,15 @@ void main() {
messages: [message1.id, message2.id, message3.id, message4.id],
messageDetails: {
message1.id: UpdateMessageFlagsMessageDetail(
type: MessageType.stream,
type: .stream,
mentioned: false,
streamId: stream.streamId,
topic: eg.t(topic),
userIds: null,
),
// message 2 and 3 have their details missing
message4.id: UpdateMessageFlagsMessageDetail(
type: MessageType.direct,
type: .direct,
mentioned: false,
streamId: null,
topic: null,
Expand Down