Skip to content

Commit 70e43cd

Browse files
Fabien HervéFabilin
authored andcommitted
resolve theopenconversationkit#119: avoid playing display animation twice
1 parent f19e346 commit 70e43cd

File tree

5 files changed

+31
-30
lines changed

5 files changed

+31
-30
lines changed

src/TockContext.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ export enum MessageType {
9191

9292
export interface Message {
9393
type: MessageType;
94-
isStoredInLocalStorage?: boolean;
94+
alreadyDisplayed?: boolean;
9595
}
9696

9797
export interface TextMessage extends Message {

src/components/Conversation/Conversation.tsx

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import Loader from '../Loader';
1010
import Image from '../Image';
1111
import QuickReplyList from '../QuickReplyList';
1212
import InlineQuickReplyList from '../InlineQuickReplyList';
13-
import useIntervalCounter from './hooks/useIntervalCounter';
13+
import useMessageCounter from './hooks/useMessageCounter';
1414
import useScrollBehaviour from './hooks/useScrollBehaviour';
1515
import { useTheme } from '@emotion/react';
1616
import '../../styles/theme';
@@ -139,12 +139,7 @@ const Conversation = ({
139139
...rest
140140
}: Props) => {
141141
if (messages && messages.length !== 0) {
142-
const displayableMessageCount = useIntervalCounter(
143-
messages.filter((message) => message.isStoredInLocalStorage === true)
144-
.length,
145-
messages.length,
146-
messageDelay,
147-
);
142+
const displayableMessageCount = useMessageCounter(messages, messageDelay);
148143
const theme: TockTheme = useTheme();
149144
const displayableMessages = messages.slice(0, displayableMessageCount);
150145
const scrollContainer = useScrollBehaviour([displayableMessages]);

src/components/Conversation/hooks/useIntervalCounter.ts

Lines changed: 0 additions & 21 deletions
This file was deleted.
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { useState, useEffect } from 'react';
2+
import { Message } from '../../../TockContext';
3+
4+
export default function useMessageCounter(
5+
messages: Message[],
6+
delay: number,
7+
): number {
8+
const [counter, setCounter] = useState(
9+
() =>
10+
// Exempt previously displayed messages from the loading animation
11+
messages.filter((message) => message.alreadyDisplayed === true).length,
12+
);
13+
const targetValue = messages.length;
14+
15+
useEffect(() => {
16+
if (counter > targetValue) {
17+
setCounter(targetValue);
18+
} else if (counter < targetValue) {
19+
setTimeout(() => {
20+
messages[counter].alreadyDisplayed = true;
21+
setCounter(counter + 1);
22+
}, delay);
23+
}
24+
}, [counter, targetValue]);
25+
26+
return counter;
27+
}

src/useTock.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -446,7 +446,7 @@ const useTock: (
446446
dispatch({
447447
type: 'ADD_MESSAGE',
448448
messages: history.map((message: Message) => {
449-
message.isStoredInLocalStorage = true;
449+
message.alreadyDisplayed = true;
450450
return message;
451451
}),
452452
});

0 commit comments

Comments
 (0)