diff --git a/app/views/RoomView/hooks/__tests__/useRoomMessaging.test.tsx b/app/views/RoomView/hooks/__tests__/useRoomMessaging.test.tsx index b5fa3ece4b..09386dbe73 100644 --- a/app/views/RoomView/hooks/__tests__/useRoomMessaging.test.tsx +++ b/app/views/RoomView/hooks/__tests__/useRoomMessaging.test.tsx @@ -3,7 +3,7 @@ import { Text } from 'react-native'; import { sendMessage as sendMessageRequest } from '../../../../lib/methods/sendMessage'; import { Review } from '../../../../lib/methods/helpers/review'; -import { events, logEvent } from '../../../../lib/methods/helpers/log'; +import log, { events, logEvent } from '../../../../lib/methods/helpers/log'; import { MessageActionProvider, useMessageAction } from '../../../../containers/message/stores/MessageActionStore'; import { useRoomMessaging } from '../useRoomMessaging'; @@ -48,6 +48,7 @@ jest.mock('../useRoomInit', () => ({ const mockSendMessageRequest = sendMessageRequest as jest.Mock; const mockReview = Review.pushPositiveEvent as jest.Mock; const mockLogEvent = logEvent as jest.Mock; +const mockLog = log as unknown as jest.Mock; const createDeferred = () => { let resolve!: () => void; @@ -143,13 +144,28 @@ describe('useRoomMessaging', () => { const { result } = renderRoomMessaging(); const clearLastSeen = require('../useRoomInit').useRoomInit.mock.results[0].value.clearLastSeen as jest.Mock; + const error = new Error('offline'); + act(() => result.current.sendMessage('hello')); await act(async () => { - deferred.reject(new Error('offline')); + deferred.reject(error); await Promise.resolve(); }); expect(clearLastSeen).not.toHaveBeenCalled(); expect(mockReview).not.toHaveBeenCalled(); + expect(mockLog).toHaveBeenCalledWith(error); + }); + + it('does nothing when there is no message to send', () => { + const { result } = renderRoomMessaging(); + + act(() => result.current.messageActionStore.getState().actions.setQuoteMessageIds(['quoted-message'])); + + act(() => result.current.sendMessage(undefined, true)); + + expect(mockSendMessageRequest).not.toHaveBeenCalled(); + expect(mockLogEvent).not.toHaveBeenCalled(); + expect(result.current.messageActionStore.getState().action).toEqual({ kind: 'quote', messageIds: ['quoted-message'] }); }); }); diff --git a/app/views/RoomView/hooks/useRoomMessaging.ts b/app/views/RoomView/hooks/useRoomMessaging.ts index dcc8990f33..b8ee88e5fc 100644 --- a/app/views/RoomView/hooks/useRoomMessaging.ts +++ b/app/views/RoomView/hooks/useRoomMessaging.ts @@ -8,9 +8,11 @@ import { createMessageActionStore } from '../../../containers/message/stores/Mes import { useAppSelector } from '../../../lib/hooks/useAppSelector'; import { useLiveRef } from '../../../lib/hooks/useLiveRef'; import { useMasterDetail } from '../../../lib/hooks/useMasterDetail'; +import log, { events, logEvent } from '../../../lib/methods/helpers/log'; +import { Review } from '../../../lib/methods/helpers/review'; +import { sendMessage as sendMessageRequest } from '../../../lib/methods/sendMessage'; import { getUserSelector } from '../../../selectors/login'; import { type IListContainerRef, type IUseRoomMessagingParams, type TListRef } from '../definitions'; -import { sendRoomMessage } from '../services/sendRoomMessage'; import { useMessageActions } from './useMessageActions'; import { useRoomInit } from './useRoomInit'; import { useRoomNavigation } from './useRoomNavigation'; @@ -70,16 +72,19 @@ export function useRoomMessaging({ rid, t, tmid, roomStore, ready, roomUserId, q const roomScreen = useRoomInit({ rid, tmid, isAuthenticated, roomStore, onThreadMessagesLoaded, ready }); - const sendMessage = (message?: string, tshow?: boolean) => - sendRoomMessage({ - rid, - message, - tmid, - user: userRef.current, - tshow, - onMessageSent: roomScreen.clearLastSeen, - resetAction - }); + const sendMessage = (message?: string, tshow?: boolean) => { + if (message === undefined) { + return; + } + logEvent(events.ROOM_SEND_MESSAGE); + sendMessageRequest(rid as string, message, tmid, userRef.current, tshow) + .then(() => { + roomScreen.clearLastSeen(); + Review.pushPositiveEvent(); + }) + .catch(log); + resetAction(); + }; return { messageActionStore, diff --git a/app/views/RoomView/services/__tests__/sendRoomMessage.test.ts b/app/views/RoomView/services/__tests__/sendRoomMessage.test.ts deleted file mode 100644 index 517d4ec736..0000000000 --- a/app/views/RoomView/services/__tests__/sendRoomMessage.test.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { Review } from '../../../../lib/methods/helpers/review'; -import { sendMessage } from '../../../../lib/methods/sendMessage'; -import { sendRoomMessage } from '../sendRoomMessage'; - -jest.mock('../../../../lib/methods/sendMessage', () => ({ - sendMessage: jest.fn(() => Promise.resolve()) -})); -jest.mock('../../../../lib/methods/helpers/review', () => ({ - Review: { pushPositiveEvent: jest.fn() } -})); -jest.mock('../../../../lib/methods/helpers/log', () => ({ - __esModule: true, - default: jest.fn(), - logEvent: jest.fn(), - events: { ROOM_SEND_MESSAGE: 'ROOM_SEND_MESSAGE' } -})); - -const mockSendMessage = sendMessage as jest.Mock; - -const user = { id: 'u1', username: 'user', token: 'tok' }; - -const send = (message?: string) => { - const onMessageSent = jest.fn(); - const resetAction = jest.fn(); - sendRoomMessage({ rid: 'rid-1', message, tmid: 'thread-1', user, tshow: true, onMessageSent, resetAction }); - return { onMessageSent, resetAction }; -}; - -describe('sendRoomMessage', () => { - beforeEach(() => jest.clearAllMocks()); - - it('sends the message, clears the unread divider and reports a positive review event', async () => { - const { onMessageSent, resetAction } = send('hello'); - - await Promise.resolve(); - - expect(mockSendMessage).toHaveBeenCalledWith('rid-1', 'hello', 'thread-1', user, true); - expect(onMessageSent).toHaveBeenCalledTimes(1); - expect(Review.pushPositiveEvent).toHaveBeenCalledTimes(1); - expect(resetAction).toHaveBeenCalledTimes(1); - }); - - it('no-ops when the message is undefined', () => { - const { onMessageSent, resetAction } = send(undefined); - - expect(mockSendMessage).not.toHaveBeenCalled(); - expect(onMessageSent).not.toHaveBeenCalled(); - expect(resetAction).not.toHaveBeenCalled(); - }); -}); diff --git a/app/views/RoomView/services/sendRoomMessage.ts b/app/views/RoomView/services/sendRoomMessage.ts deleted file mode 100644 index b482fd5e13..0000000000 --- a/app/views/RoomView/services/sendRoomMessage.ts +++ /dev/null @@ -1,35 +0,0 @@ -import log, { events, logEvent } from '../../../lib/methods/helpers/log'; -import { Review } from '../../../lib/methods/helpers/review'; -import { sendMessage } from '../../../lib/methods/sendMessage'; - -interface ISendRoomMessageParams { - rid?: string; - message?: string; - tmid?: string; - user: Parameters[3]; - tshow?: boolean; - onMessageSent: () => void; - resetAction: () => void; -} - -export const sendRoomMessage = ({ - rid, - message, - tmid, - user, - tshow, - onMessageSent, - resetAction -}: ISendRoomMessageParams): void => { - if (message === undefined) { - return; - } - logEvent(events.ROOM_SEND_MESSAGE); - sendMessage(rid as string, message, tmid, user, tshow) - .then(() => { - onMessageSent(); - Review.pushPositiveEvent(); - }) - .catch(log); - resetAction(); -};