diff --git a/src/libs/Pusher/EventType.js b/src/libs/Pusher/EventType.js index 76cb1b354c1d..b65ca8e7d7ac 100644 --- a/src/libs/Pusher/EventType.js +++ b/src/libs/Pusher/EventType.js @@ -4,6 +4,8 @@ */ export default { REPORT_COMMENT: 'reportComment', + REPORT_COMMENT_CHUNK: 'chunked-reportComment', + REPORT_COMMENT_EDIT_CHUNK: 'chunked-reportCommentEdit', REPORT_COMMENT_EDIT: 'reportCommentEdit', REPORT_TOGGLE_PINNED: 'reportTogglePinned', PREFERRED_LOCALE: 'preferredLocale', diff --git a/src/libs/Pusher/pusher.js b/src/libs/Pusher/pusher.js index 88e3c8943400..45e1fd2699b4 100644 --- a/src/libs/Pusher/pusher.js +++ b/src/libs/Pusher/pusher.js @@ -113,16 +113,14 @@ function bindEventToChannel(channel, eventName, eventCallback = () => {}, isChun const chunkedDataEvents = {}; const callback = (eventData) => { + let data; + try { + data = _.isObject(eventData) ? eventData : JSON.parse(eventData); + } catch (err) { + Log.alert('[Pusher] Unable to parse JSON response from Pusher', {error: err, eventData}); + return; + } if (!isChunked) { - let data; - - try { - data = _.isObject(eventData) ? eventData : JSON.parse(eventData); - } catch (err) { - Log.alert('[Pusher] Unable to parse JSON response from Pusher', {error: err, eventData}); - return; - } - eventCallback(data); return; } @@ -132,16 +130,16 @@ function bindEventToChannel(channel, eventName, eventCallback = () => {}, isChun // assigned to. // If we haven't seen this eventID yet, initialize it into our rolling list of packets. - if (!chunkedDataEvents[eventData.id]) { - chunkedDataEvents[eventData.id] = {chunks: [], receivedFinal: false}; + if (!chunkedDataEvents[data.id]) { + chunkedDataEvents[data.id] = {chunks: [], receivedFinal: false}; } // Add it to the rolling list. - const chunkedEvent = chunkedDataEvents[eventData.id]; - chunkedEvent.chunks[eventData.index] = eventData.chunk; + const chunkedEvent = chunkedDataEvents[data.id]; + chunkedEvent.chunks[data.index] = data.chunk; // If this is the last packet, mark that we've hit the end. - if (eventData.final) { + if (data.final) { chunkedEvent.receivedFinal = true; } @@ -158,7 +156,7 @@ function bindEventToChannel(channel, eventName, eventCallback = () => {}, isChun }); } - delete chunkedDataEvents[eventData.id]; + delete chunkedDataEvents[data.id]; } }; diff --git a/src/libs/actions/Report.js b/src/libs/actions/Report.js index f8b51506a25b..5d2e44d3b650 100644 --- a/src/libs/actions/Report.js +++ b/src/libs/actions/Report.js @@ -715,6 +715,24 @@ function subscribeToUserEvents() { ); }); + // Live-update a report's actions when a 'chunked report comment' event is received. + Pusher.subscribe(pusherChannelName, Pusher.TYPE.REPORT_COMMENT_CHUNK, (pushJSON) => { + Log.info( + `[Report] Handled ${Pusher.TYPE.REPORT_COMMENT_CHUNK} event sent by Pusher`, false, {reportID: pushJSON.reportID}, + ); + updateReportWithNewAction(pushJSON.reportID, pushJSON.reportAction, pushJSON.notificationPreference); + }, true, + () => { + NetworkConnection.triggerReconnectionCallbacks('pusher re-subscribed to private user channel'); + }) + .catch((error) => { + Log.info( + '[Report] Failed to subscribe to Pusher channel', + false, + {error, pusherChannelName, eventName: Pusher.TYPE.REPORT_COMMENT_CHUNK}, + ); + }); + // Live-update a report's actions when an 'edit comment' event is received. Pusher.subscribe(pusherChannelName, Pusher.TYPE.REPORT_COMMENT_EDIT, (pushJSON) => { Log.info( @@ -735,6 +753,26 @@ function subscribeToUserEvents() { ); }); + // Live-update a report's actions when an 'edit comment chunk' event is received. + Pusher.subscribe(pusherChannelName, Pusher.TYPE.REPORT_COMMENT_EDIT_CHUNK, (pushJSON) => { + Log.info( + `[Report] Handled ${Pusher.TYPE.REPORT_COMMENT_EDIT_CHUNK} event sent by Pusher`, false, { + reportActionID: pushJSON.reportActionID, + }, + ); + updateReportActionMessage(pushJSON.reportID, pushJSON.sequenceNumber, pushJSON.message); + }, true, + () => { + NetworkConnection.triggerReconnectionCallbacks('pusher re-subscribed to private user channel'); + }) + .catch((error) => { + Log.info( + '[Report] Failed to subscribe to Pusher channel', + false, + {error, pusherChannelName, eventName: Pusher.TYPE.REPORT_COMMENT_EDIT_CHUNK}, + ); + }); + // Live-update a report's pinned state when a 'report toggle pinned' event is received. Pusher.subscribe(pusherChannelName, Pusher.TYPE.REPORT_TOGGLE_PINNED, (pushJSON) => { Log.info(