Skip to content

Commit b1dde57

Browse files
authored
Merge pull request #2708 from daostack/CW-system-crash-react
System crash with #310 error in useDiscussionById.ts:376
2 parents 7fc4213 + 95d8d63 commit b1dde57

File tree

3 files changed

+202
-185
lines changed

3 files changed

+202
-185
lines changed

src/shared/components/Chat/ChatMessage/ChatMessage.tsx

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -405,12 +405,8 @@ const ChatMessage = ({
405405
[isMessageEditLoading, handleCheckboxChange, isMessageEditAllowed],
406406
);
407407

408-
if (isSystemMessage && discussionMessage.parsedText.length === 0) {
409-
return null;
410-
}
411-
412-
const emojiButton = useCallback(
413-
() => (
408+
const EmojiButton = useCallback(() => {
409+
return (
414410
<ReactWithEmoji
415411
emojiButtonClassName={styles.emojiButton}
416412
discussionId={discussionMessage.discussionId}
@@ -422,13 +418,16 @@ const ChatMessage = ({
422418
}
423419
isNotCurrentUserMessage={isNotCurrentUserMessage}
424420
/>
425-
),
426-
[
427-
discussionMessage.discussionId,
428-
discussionMessage.id,
429-
isNotCurrentUserMessage,
430-
],
431-
);
421+
);
422+
}, [
423+
discussionMessage.discussionId,
424+
discussionMessage.id,
425+
isNotCurrentUserMessage,
426+
]);
427+
428+
if (isSystemMessage && discussionMessage.parsedText.length === 0) {
429+
return null;
430+
}
432431

433432
return (
434433
<ChatMessageContext.Provider value={chatMessageContextValue}>
@@ -442,7 +441,7 @@ const ChatMessage = ({
442441
[styles.systemMessageContainer]: isSystemMessage,
443442
})}
444443
>
445-
{!isSystemMessage && !isNotCurrentUserMessage && emojiButton}
444+
{!isSystemMessage && !isNotCurrentUserMessage && <EmojiButton />}
446445
{isNotCurrentUserMessage &&
447446
(isUserDiscussionMessage || isBotMessage) && (
448447
<div className={styles.iconWrapper} onClick={handleUserClick}>
@@ -584,7 +583,7 @@ const ChatMessage = ({
584583
</div>
585584
</>
586585
)}
587-
{!isSystemMessage && isNotCurrentUserMessage && emojiButton}
586+
{!isSystemMessage && isNotCurrentUserMessage && <EmojiButton />}
588587
</div>
589588
</li>
590589
</ChatMessageContext.Provider>

src/shared/hooks/useCases/useDiscussionMessagesById.ts

Lines changed: 137 additions & 129 deletions
Original file line numberDiff line numberDiff line change
@@ -238,75 +238,79 @@ export const useDiscussionMessagesById = ({
238238
setIsBatchLoading(true);
239239
}
240240

241-
DiscussionMessageService.subscribeToDiscussionMessagesByDiscussionId(
242-
discussionId,
243-
lastVisible && lastVisible[discussionId],
244-
async (
245-
addedDiscussionMessages,
246-
modifiedDiscussionMessages,
247-
removedDiscussionMessages,
248-
lastVisibleDocument,
249-
) => {
250-
const updatedDiscussionMessages = [
251-
...addedDiscussionMessages,
252-
...modifiedDiscussionMessages,
253-
];
254-
setLastVisible((prevVisible) => ({
255-
...prevVisible,
256-
[discussionId]: lastVisibleDocument,
257-
}));
258-
259-
const hasLastVisibleDocument = !!lastVisibleDocument?.data();
260-
261-
const discussionsWithText = await Promise.all(
262-
updatedDiscussionMessages.map(async (discussionMessage) => {
263-
const isUserDiscussionMessage =
264-
checkIsUserDiscussionMessage(discussionMessage);
265-
const isSystemMessage =
266-
checkIsSystemDiscussionMessage(discussionMessage);
267-
268-
const parsedText = await getTextFromTextEditorString({
269-
userId,
270-
ownerId: isUserDiscussionMessage
271-
? discussionMessage.ownerId
272-
: null,
273-
textEditorString: discussionMessage.text,
274-
users,
275-
commonId: discussionMessage.commonId,
276-
systemMessage: isSystemMessage ? discussionMessage : undefined,
277-
getCommonPagePath,
278-
getCommonPageAboutTabPath,
279-
directParent,
280-
onUserClick,
281-
onFeedItemClick,
282-
onInternalLinkClick,
283-
});
284-
285-
return {
286-
...discussionMessage,
287-
parsedText,
288-
};
289-
}),
290-
);
291-
if (
292-
discussionsWithText.length < MESSAGES_NUMBER_IN_BATCH &&
293-
!hasLastVisibleDocument
294-
) {
295-
setIsEndOfList((prevIsEndOfList) => ({
296-
...prevIsEndOfList,
297-
[discussionId]: true,
241+
try {
242+
DiscussionMessageService.subscribeToDiscussionMessagesByDiscussionId(
243+
discussionId,
244+
lastVisible && lastVisible[discussionId],
245+
async (
246+
addedDiscussionMessages,
247+
modifiedDiscussionMessages,
248+
removedDiscussionMessages,
249+
lastVisibleDocument,
250+
) => {
251+
const updatedDiscussionMessages = [
252+
...addedDiscussionMessages,
253+
...modifiedDiscussionMessages,
254+
];
255+
setLastVisible((prevVisible) => ({
256+
...prevVisible,
257+
[discussionId]: lastVisibleDocument,
298258
}));
299-
}
300-
dispatch(
301-
cacheActions.updateDiscussionMessagesStateByDiscussionId({
302-
discussionId,
303-
removedDiscussionMessages,
304-
updatedDiscussionMessages: discussionsWithText,
305-
}),
306-
);
307-
setIsBatchLoading(false);
308-
},
309-
);
259+
260+
const hasLastVisibleDocument = !!lastVisibleDocument?.data();
261+
262+
const discussionsWithText = await Promise.all(
263+
updatedDiscussionMessages.map(async (discussionMessage) => {
264+
const isUserDiscussionMessage =
265+
checkIsUserDiscussionMessage(discussionMessage);
266+
const isSystemMessage =
267+
checkIsSystemDiscussionMessage(discussionMessage);
268+
269+
const parsedText = await getTextFromTextEditorString({
270+
userId,
271+
ownerId: isUserDiscussionMessage
272+
? discussionMessage.ownerId
273+
: null,
274+
textEditorString: discussionMessage.text,
275+
users,
276+
commonId: discussionMessage.commonId,
277+
systemMessage: isSystemMessage ? discussionMessage : undefined,
278+
getCommonPagePath,
279+
getCommonPageAboutTabPath,
280+
directParent,
281+
onUserClick,
282+
onFeedItemClick,
283+
onInternalLinkClick,
284+
});
285+
286+
return {
287+
...discussionMessage,
288+
parsedText,
289+
};
290+
}),
291+
);
292+
if (
293+
discussionsWithText.length < MESSAGES_NUMBER_IN_BATCH &&
294+
!hasLastVisibleDocument
295+
) {
296+
setIsEndOfList((prevIsEndOfList) => ({
297+
...prevIsEndOfList,
298+
[discussionId]: true,
299+
}));
300+
}
301+
dispatch(
302+
cacheActions.updateDiscussionMessagesStateByDiscussionId({
303+
discussionId,
304+
removedDiscussionMessages,
305+
updatedDiscussionMessages: discussionsWithText,
306+
}),
307+
);
308+
setIsBatchLoading(false);
309+
},
310+
);
311+
} catch(err) {
312+
setIsBatchLoading(false);
313+
}
310314
};
311315

312316
useDeepCompareEffect(() => {
@@ -324,70 +328,74 @@ export const useDiscussionMessagesById = ({
324328
return;
325329
}
326330

327-
const discussionMessages = [...state.data];
328-
329-
// if (discussionMessages.length > 0 && users.length === 0) {
330-
// return;
331-
// }
331+
try {
332+
const discussionMessages = [...state.data];
332333

333-
const filteredMessages = discussionMessages.filter(
334-
({ moderation }) =>
335-
moderation?.flag !== ModerationFlags.Hidden || hasPermissionToHide,
336-
);
337-
const loadedDiscussionMessages = await Promise.all(
338-
filteredMessages.map(async (d) => {
339-
const newDiscussionMessage = { ...d };
340-
const parentMessage = filteredMessages.find(
341-
({ id }) => id === d.parentId,
342-
);
343-
if (
344-
checkIsUserDiscussionMessage(d) &&
345-
checkIsUserDiscussionMessage(newDiscussionMessage)
346-
) {
347-
const commonMemberMessageOwner = [
348-
AI_USER,
349-
AI_PRO_USER,
350-
...users,
351-
...externalCommonUsers,
352-
].find((o) => o.uid === d.ownerId);
353-
const messageOwner =
354-
commonMemberMessageOwner ||
355-
(await UserService.getUserById(d.ownerId));
356-
newDiscussionMessage.owner = messageOwner;
357-
if (!commonMemberMessageOwner && messageOwner) {
358-
dispatch(
359-
cacheActions.addUserToExternalCommonUsers({
360-
user: messageOwner,
361-
}),
362-
);
363-
}
364-
}
365-
newDiscussionMessage.parentMessage = parentMessage
366-
? {
367-
id: parentMessage.id,
368-
text: parentMessage.text,
369-
ownerName: parentMessage?.ownerName,
370-
...(checkIsUserDiscussionMessage(parentMessage) && {
371-
ownerId: parentMessage.ownerId,
372-
}),
373-
moderation: parentMessage?.moderation,
374-
images: parentMessage?.images,
375-
files: parentMessage?.files,
376-
createdAt: parentMessage.createdAt,
334+
const filteredMessages = discussionMessages.filter(
335+
({ moderation }) =>
336+
moderation?.flag !== ModerationFlags.Hidden || hasPermissionToHide,
337+
);
338+
const loadedDiscussionMessages = await Promise.all(
339+
filteredMessages.map(async (d) => {
340+
const newDiscussionMessage = { ...d };
341+
const parentMessage = filteredMessages.find(
342+
({ id }) => id === d.parentId,
343+
);
344+
if (
345+
checkIsUserDiscussionMessage(d) &&
346+
checkIsUserDiscussionMessage(newDiscussionMessage)
347+
) {
348+
const commonMemberMessageOwner = [
349+
AI_USER,
350+
AI_PRO_USER,
351+
...users,
352+
...externalCommonUsers,
353+
].find((o) => o.uid === d.ownerId);
354+
const messageOwner =
355+
commonMemberMessageOwner ||
356+
(await UserService.getUserById(d.ownerId));
357+
newDiscussionMessage.owner = messageOwner;
358+
if (!commonMemberMessageOwner && messageOwner) {
359+
dispatch(
360+
cacheActions.addUserToExternalCommonUsers({
361+
user: messageOwner,
362+
}),
363+
);
377364
}
378-
: null;
379-
380-
return newDiscussionMessage;
381-
}),
382-
);
383-
384-
setDiscussionMessagesWithOwners(loadedDiscussionMessages);
385-
setIsFirstBatchLoaded((prev) => ({
386-
...prev,
387-
[discussionId]: true,
388-
}));
365+
}
366+
newDiscussionMessage.parentMessage = parentMessage
367+
? {
368+
id: parentMessage.id,
369+
text: parentMessage.text,
370+
ownerName: parentMessage?.ownerName,
371+
...(checkIsUserDiscussionMessage(parentMessage) && {
372+
ownerId: parentMessage.ownerId,
373+
}),
374+
moderation: parentMessage?.moderation,
375+
images: parentMessage?.images,
376+
files: parentMessage?.files,
377+
createdAt: parentMessage.createdAt,
378+
}
379+
: null;
380+
381+
return newDiscussionMessage;
382+
}),
383+
);
384+
385+
setDiscussionMessagesWithOwners(loadedDiscussionMessages);
386+
setIsFirstBatchLoaded((prev) => ({
387+
...prev,
388+
[discussionId]: true,
389+
}));
390+
} catch(err) {
391+
setDiscussionMessagesWithOwners([]);
392+
setIsFirstBatchLoaded((prev) => ({
393+
...prev,
394+
[discussionId]: true,
395+
}));
396+
}
389397
})();
390-
}, [state.data, hasPermissionToHide, users, externalCommonUsers]);
398+
}, [state.data, hasPermissionToHide, users, externalCommonUsers, discussionId]);
391399

392400
return {
393401
...state,

0 commit comments

Comments
 (0)