diff --git a/web/chat/reaction-message-utils.js b/web/chat/reaction-message-utils.js index b0abfceb5..9422a9bfa 100644 --- a/web/chat/reaction-message-utils.js +++ b/web/chat/reaction-message-utils.js @@ -1,80 +1,104 @@ // @flow +import invariant from 'invariant'; import * as React from 'react'; import { sendReactionMessage, sendReactionMessageActionTypes, } from 'lib/actions/message-actions'; import { useModalContext } from 'lib/components/modal-provider.react'; +import { messageTypes } from 'lib/types/message-types'; +import type { RawReactionMessageInfo } from 'lib/types/messages/reaction'; import { useDispatchActionPromise, useServerCall, } from 'lib/utils/action-utils'; import Alert from '../modals/alert.react'; +import { useSelector } from '../redux/redux-utils'; function useOnClickReact( messageID: ?string, localID: string, threadID: string, reaction: string, action: 'add_reaction' | 'remove_reaction', ): (event: SyntheticEvent) => mixed { const { pushModal } = useModalContext(); + const viewerID = useSelector( + state => state.currentUserInfo && state.currentUserInfo.id, + ); + const callSendReactionMessage = useServerCall(sendReactionMessage); const dispatchActionPromise = useDispatchActionPromise(); return React.useCallback( (event: SyntheticEvent) => { event.preventDefault(); if (!messageID) { return; } + invariant(viewerID, 'viewerID should be set'); + const reactionMessagePromise = (async () => { try { const result = await callSendReactionMessage({ threadID, localID, targetMessageID: messageID, reaction, action, }); return { serverID: result.id, threadID, time: result.newMessageInfo.time, newMessageInfos: [result.newMessageInfo], }; } catch (e) { pushModal( Please try again later , ); throw e; } })(); + const startingPayload: RawReactionMessageInfo = { + type: messageTypes.REACTION, + threadID, + localID, + creatorID: viewerID, + time: Date.now(), + targetMessageID: messageID, + reaction, + action, + }; + dispatchActionPromise( sendReactionMessageActionTypes, reactionMessagePromise, + undefined, + startingPayload, ); }, [ - action, - callSendReactionMessage, - dispatchActionPromise, messageID, - pushModal, - reaction, threadID, localID, + viewerID, + reaction, + action, + dispatchActionPromise, + callSendReactionMessage, + pushModal, ], ); } export { useOnClickReact };