diff --git a/lib/shared/messages/message-specs.js b/lib/shared/messages/message-specs.js index 1f7fa8d66..5dcfde7c0 100644 --- a/lib/shared/messages/message-specs.js +++ b/lib/shared/messages/message-specs.js @@ -1,46 +1,48 @@ // @flow import { messageTypes, type MessageType } from '../../types/message-types'; import { addMembersMessageSpec } from './add-members-message-spec'; import { changeRoleMessageSpec } from './change-role-message-spec'; import { changeSettingsMessageSpec } from './change-settings-message-spec'; import { createEntryMessageSpec } from './create-entry-message-spec'; import { createSidebarMessageSpec } from './create-sidebar-message-spec'; import { createSubThreadMessageSpec } from './create-sub-thread-message-spec'; import { createThreadMessageSpec } from './create-thread-message-spec'; import { deleteEntryMessageSpec } from './delete-entry-message-spec'; import { editEntryMessageSpec } from './edit-entry-message-spec'; import { joinThreadMessageSpec } from './join-thread-message-spec'; import { leaveThreadMessageSpec } from './leave-thread-message-spec'; import { type MessageSpec } from './message-spec'; import { multimediaMessageSpec } from './multimedia-message-spec'; +import { reactionMessageSpec } from './reaction-message-spec'; import { removeMembersMessageSpec } from './remove-members-message-spec'; import { restoreEntryMessageSpec } from './restore-entry-message-spec'; import { sidebarSourceMessageSpec } from './sidebar-source-message-spec'; import { textMessageSpec } from './text-message-spec'; import { unsupportedMessageSpec } from './unsupported-message-spec'; import { updateRelationshipMessageSpec } from './update-relationship-message-spec'; export const messageSpecs: { [MessageType]: MessageSpec<*, *, *>, } = Object.freeze({ [messageTypes.TEXT]: textMessageSpec, [messageTypes.CREATE_THREAD]: createThreadMessageSpec, [messageTypes.ADD_MEMBERS]: addMembersMessageSpec, [messageTypes.CREATE_SUB_THREAD]: createSubThreadMessageSpec, [messageTypes.CHANGE_SETTINGS]: changeSettingsMessageSpec, [messageTypes.REMOVE_MEMBERS]: removeMembersMessageSpec, [messageTypes.CHANGE_ROLE]: changeRoleMessageSpec, [messageTypes.LEAVE_THREAD]: leaveThreadMessageSpec, [messageTypes.JOIN_THREAD]: joinThreadMessageSpec, [messageTypes.CREATE_ENTRY]: createEntryMessageSpec, [messageTypes.EDIT_ENTRY]: editEntryMessageSpec, [messageTypes.DELETE_ENTRY]: deleteEntryMessageSpec, [messageTypes.RESTORE_ENTRY]: restoreEntryMessageSpec, [messageTypes.UNSUPPORTED]: unsupportedMessageSpec, [messageTypes.IMAGES]: multimediaMessageSpec, [messageTypes.MULTIMEDIA]: multimediaMessageSpec, [messageTypes.UPDATE_RELATIONSHIP]: updateRelationshipMessageSpec, [messageTypes.SIDEBAR_SOURCE]: sidebarSourceMessageSpec, [messageTypes.CREATE_SIDEBAR]: createSidebarMessageSpec, + [messageTypes.REACTION]: reactionMessageSpec, }); diff --git a/lib/shared/messages/reaction-message-spec.js b/lib/shared/messages/reaction-message-spec.js new file mode 100644 index 000000000..82232ff71 --- /dev/null +++ b/lib/shared/messages/reaction-message-spec.js @@ -0,0 +1,88 @@ +// @flow + +import invariant from 'invariant'; + +import { + assertMessageType, + messageTypes, + type ClientDBMessageInfo, + type ReactionMessageData, + type RawReactionMessageInfo, + type ReactionMessageInfo, +} from '../../types/message-types'; +import type { RelativeUserInfo } from '../../types/user-types'; +import { messagePreviewText, removeCreatorAsViewer } from '../message-utils'; +import type { MessageSpec, MessageTitleParam } from './message-spec'; + +export const reactionMessageSpec: MessageSpec< + ReactionMessageData, + RawReactionMessageInfo, + ReactionMessageInfo, +> = Object.freeze({ + messageContentForClientDB(data: RawReactionMessageInfo): string { + return JSON.stringify({ + targetMessageID: data.targetMessageID, + reaction: data.reaction, + action: data.action, + }); + }, + + messageTitle({ + messageInfo, + threadInfo, + viewerContext, + }: MessageTitleParam) { + let validMessageInfo: ReactionMessageInfo = (messageInfo: ReactionMessageInfo); + if (viewerContext === 'global_viewer') { + validMessageInfo = removeCreatorAsViewer(validMessageInfo); + } + return messagePreviewText(validMessageInfo, threadInfo); + }, + + rawMessageInfoFromClientDB( + clientDBMessageInfo: ClientDBMessageInfo, + ): RawReactionMessageInfo { + const messageType = assertMessageType(parseInt(clientDBMessageInfo.type)); + invariant( + messageType === messageTypes.REACTION, + 'message must be of type REACTION', + ); + invariant( + clientDBMessageInfo.content !== undefined && + clientDBMessageInfo.content !== null, + 'content must be defined', + ); + const content = JSON.parse(clientDBMessageInfo.content); + + const rawReactionMessageInfo: RawReactionMessageInfo = { + type: messageTypes.REACTION, + id: clientDBMessageInfo.id, + threadID: clientDBMessageInfo.thread, + time: parseInt(clientDBMessageInfo.time), + creatorID: clientDBMessageInfo.user, + targetMessageID: content.targetMessageID, + reaction: content.reaction, + action: content.action, + }; + + return rawReactionMessageInfo; + }, + + createMessageInfo( + rawMessageInfo: RawReactionMessageInfo, + creator: RelativeUserInfo, + ): ReactionMessageInfo { + return { + type: messageTypes.REACTION, + id: rawMessageInfo.id, + threadID: rawMessageInfo.threadID, + creator, + time: rawMessageInfo.time, + targetMessageID: rawMessageInfo.targetMessageID, + reaction: rawMessageInfo.reaction, + action: rawMessageInfo.action, + }; + }, + + generatesNotifs: false, +});