diff --git a/native/chat/reaction-message-utils.js b/native/chat/reaction-message-utils.js new file mode 100644 --- /dev/null +++ b/native/chat/reaction-message-utils.js @@ -0,0 +1,81 @@ +// @flow + +import invariant from 'invariant'; +import Alert from 'react-native/Libraries/Alert/Alert'; + +import { + sendReactionMessage, + sendReactionMessageActionTypes, +} from 'lib/actions/message-actions'; +import type { BindServerCall, DispatchFunctions } from 'lib/utils/action-utils'; + +import type { TooltipRoute } from '../navigation/tooltip.react'; + +function onPressReact( + route: + | TooltipRoute<'TextMessageTooltipModal'> + | TooltipRoute<'MultimediaMessageTooltipModal'> + | TooltipRoute<'RobotextMessageTooltipModal'>, + dispatchFunctions: DispatchFunctions, + bindServerCall: BindServerCall, +) { + const messageID = route.params.item.messageInfo.id; + invariant(messageID, 'messageID should be set'); + + const threadID = route.params.item.threadInfo.id; + invariant(threadID, 'threadID should be set'); + + sendReaction( + messageID, + threadID, + '👍', + 'add_reaction', + dispatchFunctions, + bindServerCall, + ); +} + +function sendReaction( + messageID: string, + threadID: string, + reaction: string, + action: 'add_reaction' | 'remove_reaction', + dispatchFunctions: DispatchFunctions, + bindServerCall: BindServerCall, +) { + const callSendReactionMessage = bindServerCall(sendReactionMessage); + + const reactionMessagePromise = (async () => { + try { + const result = await callSendReactionMessage({ + threadID, + targetMessageID: messageID, + reaction, + action, + }); + return { + serverID: result.id, + threadID, + time: result.newMessageInfo.time, + newMessageInfos: [result.newMessageInfo], + }; + } catch (e) { + Alert.alert( + 'Couldn’t send the reaction', + 'Please try again later', + [{ text: 'OK' }], + { + cancelable: true, + }, + ); + throw e; + } + })(); + + dispatchFunctions.dispatchActionPromise( + sendReactionMessageActionTypes, + reactionMessagePromise, + ); +} + +export { onPressReact };