1- import React , { useEffect , useRef , useState } from 'react' ;
1+ import React from 'react' ;
22
33import { MessageTextContainer , MessageTextContainerProps } from './MessageTextContainer' ;
44
55import { useMessageContext } from '../../../contexts' ;
66import type { DefaultStreamChatGenerics } from '../../../types/types' ;
7-
8- const DEFAULT_LETTER_INTERVAL = 0 ;
9- const DEFAULT_RENDERING_LETTER_COUNT = 2 ;
7+ import { useStreamingMessage } from '../hooks/useStreamingMessage' ;
108
119export type StreamingMessageViewProps <
1210 StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics ,
@@ -20,33 +18,16 @@ export const StreamingMessageView = <
2018> (
2119 props : StreamingMessageViewProps < StreamChatGenerics > ,
2220) => {
23- const {
24- letterInterval = DEFAULT_LETTER_INTERVAL ,
25- renderingLetterCount = DEFAULT_RENDERING_LETTER_COUNT ,
26- ...restProps
27- } = props ;
28- const { message } = useMessageContext < StreamChatGenerics > ( ) ;
21+ const { letterInterval, renderingLetterCount, ...restProps } = props ;
22+ const { message : messageFromProps } = restProps ;
23+ const { message : messageFromContext } = useMessageContext < StreamChatGenerics > ( ) ;
24+ const message = messageFromProps || messageFromContext ;
2925 const { text = '' } = message ;
30- const [ streamedMessageText , setStreamedMessageText ] = useState < string > ( text ) ;
31- const textCursor = useRef < number > ( text . length ) ;
32-
33- useEffect ( ( ) => {
34- const textLength = text . length ;
35- const interval = setInterval ( ( ) => {
36- if ( ! text || textCursor . current >= textLength ) {
37- clearInterval ( interval ) ;
38- }
39- // TODO: make this configurable maybe
40- const newCursorValue = textCursor . current + renderingLetterCount ;
41- const newText = text . substring ( 0 , newCursorValue ) ;
42- textCursor . current += newText . length - textCursor . current ;
43- setStreamedMessageText ( newText ) ;
44- } , letterInterval ) ;
45-
46- return ( ) => {
47- clearInterval ( interval ) ;
48- } ;
49- } , [ letterInterval , renderingLetterCount , text ] ) ;
26+ const { streamedMessageText } = useStreamingMessage ( {
27+ letterInterval,
28+ renderingLetterCount,
29+ text,
30+ } ) ;
5031
5132 return (
5233 < MessageTextContainer message = { { ...message , text : streamedMessageText } } { ...restProps } />
0 commit comments