Skip to content

Commit ca574e1

Browse files
authored
resolve theopenconversationkit#145: skip loading delay before user messages (theopenconversationkit#146)
1 parent 84b1d74 commit ca574e1

File tree

4 files changed

+34
-17
lines changed

4 files changed

+34
-17
lines changed

src/components/Conversation/Conversation.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,11 @@ const Conversation = ({
138138
...rest
139139
}: Props): JSX.Element => {
140140
if (messages && messages.length !== 0) {
141-
const displayableMessageCount = useMessageCounter(messages, messageDelay);
141+
const displayableMessageCount = useMessageCounter(
142+
messages,
143+
messageDelay,
144+
(message) => 'author' in message && message.author === 'user',
145+
);
142146
const theme: TockTheme = useTheme();
143147
const displayableMessages = messages.slice(0, displayableMessageCount);
144148
const scrollContainer = useScrollBehaviour([displayableMessages]);

src/components/Conversation/hooks/useMessageCounter.ts

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,34 @@ import { Message } from '../../../model/messages';
44
export default function useMessageCounter(
55
messages: Message[],
66
delay: number,
7+
skipDelay: (message: Message) => boolean,
78
): 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-
);
9+
const [counter, setCounter] = useState(0);
1310
const targetValue = messages.length;
11+
const shouldDisplayNow = (m: Message) => m.alreadyDisplayed || skipDelay(m);
12+
const advance = () => {
13+
setCounter((c) => {
14+
// always increment the counter by at least one
15+
do {
16+
messages[c].alreadyDisplayed = true;
17+
c++;
18+
} while (c < targetValue && shouldDisplayNow(messages[c]));
19+
return c;
20+
});
21+
};
22+
23+
if (counter > targetValue) {
24+
setCounter(targetValue);
25+
} else if (counter < targetValue && shouldDisplayNow(messages[counter])) {
26+
advance();
27+
}
1428

1529
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);
30+
if (counter < targetValue) {
31+
const id = setTimeout(advance, delay);
32+
return () => clearTimeout(id);
2333
}
34+
return;
2435
}, [counter, targetValue]);
2536

2637
return counter;
Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,2 @@
1-
import Conversation from './Conversation';
2-
3-
export default Conversation;
1+
export { default } from './Conversation';
2+
export { default as useMessageCounter } from './hooks/useMessageCounter';

src/index.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@ export { default as Chat } from './components/Chat';
88
export { default as ChatInput } from './components/ChatInput';
99
export { default as Container } from './components/Container';
1010
export { default as Loader } from './components/Loader';
11-
export { default as Conversation } from './components/Conversation';
11+
export {
12+
default as Conversation,
13+
useMessageCounter,
14+
} from './components/Conversation';
1215
export { default as Image } from './components/Image';
1316
export {
1417
default as MessageBot,

0 commit comments

Comments
 (0)