@product7/feedback-sdk 1.4.8 → 1.4.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/feedback-sdk.js +125 -11
- package/dist/feedback-sdk.js.map +1 -1
- package/dist/feedback-sdk.min.js +1 -1
- package/dist/feedback-sdk.min.js.map +1 -1
- package/package.json +1 -1
- package/src/widgets/MessengerWidget.js +4 -1
- package/src/widgets/messenger/MessengerState.js +120 -10
- package/src/widgets/messenger/views/ChatView.js +1 -0
package/package.json
CHANGED
|
@@ -348,7 +348,10 @@ export class MessengerWidget extends BaseWidget {
|
|
|
348
348
|
},
|
|
349
349
|
};
|
|
350
350
|
|
|
351
|
-
this.messengerState.
|
|
351
|
+
this.messengerState.upsertMessage(conversation_id, localMessage, {
|
|
352
|
+
reconcileOwnOptimistic: true,
|
|
353
|
+
optimisticMatchWindowMs: 30000,
|
|
354
|
+
});
|
|
352
355
|
|
|
353
356
|
if (
|
|
354
357
|
!this.messengerState.isOpen ||
|
|
@@ -98,23 +98,133 @@ export class MessengerState {
|
|
|
98
98
|
this._notify('messagesUpdate', { conversationId, messages });
|
|
99
99
|
}
|
|
100
100
|
|
|
101
|
-
|
|
101
|
+
_getMessageAttachmentsSignature(message) {
|
|
102
|
+
if (!Array.isArray(message?.attachments) || message.attachments.length === 0) {
|
|
103
|
+
return '';
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
return message.attachments
|
|
107
|
+
.map((att) => `${att?.type || ''}:${att?.name || ''}`)
|
|
108
|
+
.join('|');
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
_findOptimisticMatchIndex(conversationId, incomingMessage, matchWindowMs) {
|
|
112
|
+
const messages = this.messages[conversationId] || [];
|
|
113
|
+
const incomingTimestamp = Date.parse(incomingMessage.timestamp);
|
|
114
|
+
const incomingSignature =
|
|
115
|
+
this._getMessageAttachmentsSignature(incomingMessage);
|
|
116
|
+
|
|
117
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
118
|
+
const candidate = messages[i];
|
|
119
|
+
if (!candidate?.isOptimistic || !candidate?.isOwn) {
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
if ((candidate.content || '') !== (incomingMessage.content || '')) {
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const candidateSignature =
|
|
127
|
+
this._getMessageAttachmentsSignature(candidate);
|
|
128
|
+
if (candidateSignature !== incomingSignature) {
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
const candidateTimestamp = Date.parse(candidate.timestamp);
|
|
133
|
+
if (
|
|
134
|
+
Number.isNaN(incomingTimestamp) ||
|
|
135
|
+
Number.isNaN(candidateTimestamp) ||
|
|
136
|
+
Math.abs(incomingTimestamp - candidateTimestamp) <= matchWindowMs
|
|
137
|
+
) {
|
|
138
|
+
return i;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
return -1;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
_updateConversationFromMessage(conversationId, message, countUnread) {
|
|
146
|
+
const conv = this.conversations.find((c) => c.id === conversationId);
|
|
147
|
+
if (!conv) {
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
conv.lastMessage = message.content;
|
|
152
|
+
conv.lastMessageTime = message.timestamp;
|
|
153
|
+
|
|
154
|
+
if (countUnread && !message.isOwn) {
|
|
155
|
+
conv.unread = (conv.unread || 0) + 1;
|
|
156
|
+
this._updateUnreadCount();
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
upsertMessage(conversationId, message, options = {}) {
|
|
102
161
|
if (!this.messages[conversationId]) {
|
|
103
162
|
this.messages[conversationId] = [];
|
|
104
163
|
}
|
|
105
|
-
this.messages[conversationId].push(message);
|
|
106
164
|
|
|
107
|
-
const
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
165
|
+
const reconcileOwnOptimistic = options.reconcileOwnOptimistic === true;
|
|
166
|
+
const optimisticMatchWindowMs = options.optimisticMatchWindowMs || 30000;
|
|
167
|
+
const messages = this.messages[conversationId];
|
|
168
|
+
const existingIndex =
|
|
169
|
+
message?.id != null
|
|
170
|
+
? messages.findIndex((msg) => msg?.id === message.id)
|
|
171
|
+
: -1;
|
|
172
|
+
|
|
173
|
+
if (existingIndex !== -1) {
|
|
174
|
+
messages[existingIndex] = {
|
|
175
|
+
...messages[existingIndex],
|
|
176
|
+
...message,
|
|
177
|
+
isOptimistic: false,
|
|
178
|
+
};
|
|
179
|
+
this._updateConversationFromMessage(
|
|
180
|
+
conversationId,
|
|
181
|
+
messages[existingIndex],
|
|
182
|
+
false
|
|
183
|
+
);
|
|
184
|
+
this._notify('messagesUpdate', {
|
|
185
|
+
conversationId,
|
|
186
|
+
messages: [...messages],
|
|
187
|
+
});
|
|
188
|
+
return messages[existingIndex];
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
if (reconcileOwnOptimistic && message?.isOwn) {
|
|
192
|
+
const optimisticIndex = this._findOptimisticMatchIndex(
|
|
193
|
+
conversationId,
|
|
194
|
+
message,
|
|
195
|
+
optimisticMatchWindowMs
|
|
196
|
+
);
|
|
197
|
+
if (optimisticIndex !== -1) {
|
|
198
|
+
messages[optimisticIndex] = {
|
|
199
|
+
...messages[optimisticIndex],
|
|
200
|
+
...message,
|
|
201
|
+
isOptimistic: false,
|
|
202
|
+
};
|
|
203
|
+
this._updateConversationFromMessage(
|
|
204
|
+
conversationId,
|
|
205
|
+
messages[optimisticIndex],
|
|
206
|
+
false
|
|
207
|
+
);
|
|
208
|
+
this._notify('messagesUpdate', {
|
|
209
|
+
conversationId,
|
|
210
|
+
messages: [...messages],
|
|
211
|
+
});
|
|
212
|
+
return messages[optimisticIndex];
|
|
114
213
|
}
|
|
115
214
|
}
|
|
116
215
|
|
|
117
|
-
|
|
216
|
+
const storedMessage = {
|
|
217
|
+
...message,
|
|
218
|
+
isOptimistic: Boolean(message?.isOptimistic),
|
|
219
|
+
};
|
|
220
|
+
messages.push(storedMessage);
|
|
221
|
+
this._updateConversationFromMessage(conversationId, storedMessage, true);
|
|
222
|
+
this._notify('messageAdded', { conversationId, message: storedMessage });
|
|
223
|
+
return storedMessage;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
addMessage(conversationId, message) {
|
|
227
|
+
return this.upsertMessage(conversationId, message);
|
|
118
228
|
}
|
|
119
229
|
|
|
120
230
|
updateConversation(conversationId, updates) {
|