Skip to content

Commit a8805f9

Browse files
author
Sravan S
authored
fix: clear timeout in useLayoutEffect (#431)
To remove memory leak warnings~ fixes: sendbird.atlassian.net/browse/UIKIT-3320
1 parent 2edd1f9 commit a8805f9

File tree

1 file changed

+33
-24
lines changed
  • src/smart-components/Channel/components/Message

1 file changed

+33
-24
lines changed

src/smart-components/Channel/components/Message/index.tsx

Lines changed: 33 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ type MessageUIProps = {
3838
renderMessageContent?: () => React.ReactElement;
3939
};
4040

41+
// todo: Refactor this component, is too complex now
4142
const Message = (props: MessageUIProps): React.FC<MessageUIProps> | React.ReactElement => {
4243
const {
4344
message,
@@ -134,39 +135,47 @@ const Message = (props: MessageUIProps): React.FC<MessageUIProps> | React.ReactE
134135
}, [showEdit, message?.reactions?.length]);
135136

136137
useLayoutEffect(() => {
137-
if (highLightedMessageId === message.messageId) {
138-
if (useMessageScrollRef && useMessageScrollRef.current) {
139-
useMessageScrollRef.current.scrollIntoView({ block: 'center', inline: 'center' });
140-
setIsAnimated(false);
141-
setTimeout(() => {
142-
setIsHighlighted(true);
143-
}, 500);
144-
setTimeout(() => {
145-
setHighLightedMessageId(0);
146-
onMessageHighlighted?.();
147-
}, 1600);
148-
}
138+
let animationTimeout = null;
139+
let messageHighlightedTimeout = null;
140+
if (highLightedMessageId === message.messageId && useMessageScrollRef?.current) {
141+
useMessageScrollRef.current.scrollIntoView({ block: 'center', inline: 'center' });
142+
setIsAnimated(false);
143+
animationTimeout = setTimeout(() => {
144+
setIsHighlighted(true);
145+
}, 500);
146+
messageHighlightedTimeout = setTimeout(() => {
147+
setHighLightedMessageId(0);
148+
onMessageHighlighted?.();
149+
}, 1600);
149150
} else {
150151
setIsHighlighted(false);
151152
}
153+
return () => {
154+
clearTimeout(animationTimeout);
155+
clearTimeout(messageHighlightedTimeout);
156+
}
152157
}, [highLightedMessageId, useMessageScrollRef.current, message.messageId]);
153158

154159
useLayoutEffect(() => {
155-
if (animatedMessageId === message.messageId) {
156-
if (useMessageScrollRef && useMessageScrollRef.current) {
157-
useMessageScrollRef.current.scrollIntoView({ block: 'center', inline: 'center' });
158-
setIsHighlighted(false);
159-
setTimeout(() => {
160-
setIsAnimated(true);
161-
}, 500);
162-
setTimeout(() => {
163-
setAnimatedMessageId(0);
164-
onMessageAnimated?.();
165-
}, 1600);
166-
}
160+
let animationTimeout = null;
161+
let messageAnimatedTimeout = null;
162+
if (animatedMessageId === message.messageId && useMessageScrollRef?.current) {
163+
useMessageScrollRef.current.scrollIntoView({ block: 'center', inline: 'center' });
164+
setIsHighlighted(false);
165+
animationTimeout = setTimeout(() => {
166+
setIsAnimated(true);
167+
}, 500);
168+
messageAnimatedTimeout = setTimeout(() => {
169+
setAnimatedMessageId(0);
170+
onMessageAnimated?.();
171+
}, 1600);
167172
} else {
168173
setIsAnimated(false);
169174
}
175+
return () => {
176+
clearTimeout(animationTimeout);
177+
clearTimeout(messageAnimatedTimeout);
178+
}
170179
}, [animatedMessageId, useMessageScrollRef.current, message.messageId, onMessageAnimated]);
171180
const renderedMessage = useMemo(() => {
172181
return renderMessage?.({

0 commit comments

Comments
 (0)