|
1 |
| -import merge from 'lodash.merge' |
2 |
| - |
3 | 1 | import { SENDERS } from '../../index-types'
|
4 |
| -import { isCustom } from '../../message-utils' |
5 | 2 | import { WebchatAction } from './actions'
|
6 | 3 | import { WebchatState } from './types'
|
7 | 4 |
|
@@ -94,45 +91,40 @@ function updateMessageReducer(
|
94 | 91 | state: WebchatState,
|
95 | 92 | action: { type: WebchatAction; payload?: any }
|
96 | 93 | ) {
|
97 |
| - const msgIndex = state.messagesJSON.map(m => m.id).indexOf(action.payload.id) |
| 94 | + const messageId = action.payload.id |
| 95 | + const msgIndex = state.messagesJSON.map(m => m.id).indexOf(messageId) |
98 | 96 | if (msgIndex > -1) {
|
99 | 97 | const msgComponent = state.messagesComponents[msgIndex]
|
100 |
| - let updatedMessageComponents = {} |
101 | 98 | if (msgComponent) {
|
102 |
| - const updatedMsgComponent = { |
103 |
| - ...msgComponent, |
104 |
| - ...{ |
105 |
| - props: { ...msgComponent.props, ack: action.payload.ack }, |
106 |
| - }, |
| 99 | + msgComponent.props = { |
| 100 | + ...msgComponent.props, |
| 101 | + ack: action.payload.ack, |
107 | 102 | }
|
| 103 | + } |
108 | 104 |
|
109 |
| - if (isCustom(action.payload)) { |
110 |
| - // If the message is a custom message, update the json property to update props. |
111 |
| - // If user close and open the chat the message will render again with the new props. |
112 |
| - updatedMsgComponent.props.json = action.payload.data.json |
113 |
| - } |
| 105 | + const updatedMessagesComponents = msgComponent |
| 106 | + ? getUpdatedMessagesComponents(state, msgIndex, msgComponent) |
| 107 | + : state.messagesComponents |
114 | 108 |
|
115 |
| - updatedMessageComponents = { |
116 |
| - messagesComponents: [ |
117 |
| - ...state.messagesComponents.slice(0, msgIndex), |
118 |
| - { ...updatedMsgComponent }, |
119 |
| - ...state.messagesComponents.slice(msgIndex + 1), |
120 |
| - ], |
| 109 | + const messageJSON = state.messagesJSON.find(m => m.id === messageId) |
| 110 | + if (messageJSON) { |
| 111 | + messageJSON.data = { |
| 112 | + ...messageJSON.data, |
121 | 113 | }
|
122 | 114 | }
|
123 | 115 |
|
| 116 | + const updatedMessagesJSON = messageJSON |
| 117 | + ? getUpdatedMessagesJSON(state, msgIndex, action.payload) |
| 118 | + : state.messagesJSON |
| 119 | + |
124 | 120 | const numUnreadMessages = state.messagesComponents.filter(
|
125 | 121 | messageComponent => messageComponent.props.isUnread
|
126 | 122 | ).length
|
127 | 123 |
|
128 | 124 | return {
|
129 | 125 | ...state,
|
130 |
| - messagesJSON: [ |
131 |
| - ...state.messagesJSON.slice(0, msgIndex), |
132 |
| - { ...action.payload }, |
133 |
| - ...state.messagesJSON.slice(msgIndex + 1), |
134 |
| - ], |
135 |
| - ...updatedMessageComponents, |
| 126 | + messagesJSON: updatedMessagesJSON, |
| 127 | + messagesComponents: updatedMessagesComponents, |
136 | 128 | numUnreadMessages,
|
137 | 129 | }
|
138 | 130 | }
|
@@ -161,51 +153,65 @@ function updateCustomMessagePropsReducer(
|
161 | 153 | ) {
|
162 | 154 | const { messageId, props } = action.payload
|
163 | 155 |
|
164 |
| - // Similar to updateMessageReducer but only for custom messages |
| 156 | + // Similar to updateMessageReducer but only for custom messages when update props |
165 | 157 | const msgIndex = state.messagesJSON.map(m => m.id).indexOf(messageId)
|
166 | 158 | if (msgIndex > -1) {
|
167 | 159 | const msgComponent = state.messagesComponents[msgIndex]
|
168 |
| - let updatedMessageComponents = {} |
169 |
| - let updatedMessagesJSON = {} |
170 | 160 | if (msgComponent) {
|
171 |
| - const updatedMsgComponent = { |
172 |
| - ...msgComponent, |
173 |
| - ...{ |
174 |
| - props: { ...msgComponent.props, ack: action.payload.ack, ...props }, |
175 |
| - }, |
176 |
| - } |
177 |
| - |
178 |
| - updatedMessageComponents = { |
179 |
| - messagesComponents: [ |
180 |
| - ...state.messagesComponents.slice(0, msgIndex), |
181 |
| - { ...updatedMsgComponent }, |
182 |
| - ...state.messagesComponents.slice(msgIndex + 1), |
183 |
| - ], |
| 161 | + msgComponent.props = { |
| 162 | + ...msgComponent.props, |
| 163 | + ack: action.payload.ack, |
| 164 | + ...props, |
184 | 165 | }
|
185 | 166 | }
|
186 | 167 |
|
| 168 | + const updatedMessagesComponents = msgComponent |
| 169 | + ? getUpdatedMessagesComponents(state, msgIndex, msgComponent) |
| 170 | + : state.messagesComponents |
| 171 | + |
187 | 172 | const messageJSON = state.messagesJSON.find(m => m.id === messageId)
|
188 | 173 | if (messageJSON) {
|
189 | 174 | messageJSON.data = {
|
190 | 175 | ...messageJSON.data,
|
191 | 176 | ...props,
|
192 | 177 | }
|
193 |
| - |
194 |
| - updatedMessagesJSON = { |
195 |
| - messagesJSON: [ |
196 |
| - ...state.messagesJSON.slice(0, msgIndex), |
197 |
| - { ...messageJSON }, |
198 |
| - ...state.messagesJSON.slice(msgIndex + 1), |
199 |
| - ], |
200 |
| - } |
201 | 178 | }
|
202 | 179 |
|
| 180 | + const updatedMessagesJSON = messageJSON |
| 181 | + ? getUpdatedMessagesJSON(state, msgIndex, messageJSON) |
| 182 | + : state.messagesJSON |
| 183 | + |
203 | 184 | return {
|
204 | 185 | ...state,
|
205 |
| - ...updatedMessagesJSON, |
206 |
| - ...updatedMessageComponents, |
| 186 | + messagesJSON: updatedMessagesJSON, |
| 187 | + messagesComponents: updatedMessagesComponents, |
207 | 188 | }
|
208 | 189 | }
|
209 | 190 |
|
210 | 191 | return state
|
211 | 192 | }
|
| 193 | + |
| 194 | +// Helper functions to update messagesComponents and messagesJSON |
| 195 | +function getUpdatedMessagesComponents( |
| 196 | + state: WebchatState, |
| 197 | + msgIndex: number, |
| 198 | + updatedMessageComponent: any |
| 199 | +) { |
| 200 | + return [ |
| 201 | + ...state.messagesComponents.slice(0, msgIndex), |
| 202 | + { ...updatedMessageComponent }, |
| 203 | + ...state.messagesComponents.slice(msgIndex + 1), |
| 204 | + ] |
| 205 | +} |
| 206 | + |
| 207 | +function getUpdatedMessagesJSON( |
| 208 | + state: WebchatState, |
| 209 | + msgIndex: number, |
| 210 | + messageJSON: any |
| 211 | +) { |
| 212 | + return [ |
| 213 | + ...state.messagesJSON.slice(0, msgIndex), |
| 214 | + { ...messageJSON }, |
| 215 | + ...state.messagesJSON.slice(msgIndex + 1), |
| 216 | + ] |
| 217 | +} |
0 commit comments