11import { useEffect , useMemo , useRef , useState } from 'react' ;
2- import { MessageComposer } from 'stream-chat' ;
2+ import { FixedSizeQueueCache , MessageComposer } from 'stream-chat' ;
33import { useThreadContext } from '../../../Threads' ;
4- import { useChannelStateContext , useMessageInputContext } from '../../../../context' ;
4+ import { useChatContext , useMessageInputContext } from '../../../../context' ;
55import type { LocalMessage } from 'stream-chat' ;
66import { useLegacyThreadContext } from '../../../Thread' ;
77
8- class FixedSizeQueueCache < K , T > {
9- private keys : Array < K > ;
10- private size : number ;
11- private valueByKey : Map < K , T > ;
12- constructor ( size : number ) {
13- if ( ! size ) throw new Error ( 'Size must be greater than 0' ) ;
14- this . keys = [ ] ;
15- this . size = size ;
16- this . valueByKey = new Map ( ) ;
17- }
18-
19- add ( key : K , value : T ) {
20- const index = this . keys . indexOf ( key ) ;
21-
22- if ( index > - 1 ) {
23- this . keys . splice ( this . keys . indexOf ( key ) , 1 ) ;
24- } else if ( this . keys . length >= this . size ) {
25- const elementKey = this . keys . shift ( ) ;
26-
27- if ( elementKey ) {
28- this . valueByKey . delete ( elementKey ) ;
29- }
30- }
31-
32- this . keys . push ( key ) ;
33- this . valueByKey . set ( key , value ) ;
34- }
35-
36- peek ( key : K ) {
37- const value = this . valueByKey . get ( key ) ;
38-
39- return value ;
40- }
41-
42- get ( key : K ) {
43- const foundElement = this . peek ( key ) ;
44-
45- if ( foundElement && this . keys . indexOf ( key ) !== this . size - 1 ) {
46- this . keys . splice ( this . keys . indexOf ( key ) , 1 ) ;
47- this . keys . push ( key ) ;
48- }
49-
50- return foundElement ;
51- }
52- }
53-
548export type UseMessageComposerParams = unknown ;
559
5610const queueCache = new FixedSizeQueueCache < string , MessageComposer > ( 64 ) ;
5711
5812// eslint-disable-next-line @typescript-eslint/no-unused-vars
5913export const useMessageComposer = ( _unused : UseMessageComposerParams = { } ) => {
60- const { channel } = useChannelStateContext ( ) ;
14+ const { channel, client } = useChatContext ( ) ;
6115 const { message : editedMessage } = useMessageInputContext ( ) ;
6216 // legacy thread will receive new composer
6317 const { legacyThread : parentMessage , messageDraft } = useLegacyThreadContext ( ) ;
6418 const threadInstance = useThreadContext ( ) ;
6519 const detachedMessageComposerRef = useRef < MessageComposer > (
66- new MessageComposer ( { channel, tag : 'detached' } ) ,
20+ new MessageComposer ( {
21+ client,
22+ compositionContext : {
23+ created_at : new Date ( ) ,
24+ deleted_at : null ,
25+ id : 'detached' ,
26+ pinned_at : null ,
27+ status : '' ,
28+ type : 'regular' ,
29+ updated_at : new Date ( ) ,
30+ } ,
31+ } ) ,
6732 ) ;
6833
6934 const [ cachedEditedMessage , setCachedEditedMessage ] = useState <
@@ -86,31 +51,30 @@ export const useMessageComposer = (_unused: UseMessageComposerParams = {}) => {
8651 // editedMessage ?? thread ?? parentMessage ?? channel;
8752 const messageComposer = useMemo ( ( ) => {
8853 if ( cachedEditedMessage ) {
89- const tag = `edited- message-${ cachedEditedMessage . id } ` ;
54+ const tag : MessageComposer [ 'tag' ] = `message-${ cachedEditedMessage . id } ` ;
9055
9156 const element = queueCache . get ( tag ) ;
9257 if ( element ) return element ;
9358
9459 const c = new MessageComposer ( {
95- channel ,
60+ client ,
9661 composition : cachedEditedMessage ,
97- tag ,
62+ compositionContext : cachedEditedMessage ,
9863 } ) ;
9964
10065 return c ;
10166 } else if ( threadInstance ) {
10267 return threadInstance . messageComposer ;
10368 } else if ( cachedParentMessage ) {
104- const tag = `parent-message -${ cachedParentMessage . id } ` ;
69+ const tag : MessageComposer [ 'tag' ] = `legacy_thread -${ cachedParentMessage . id } ` ;
10570
10671 const element = queueCache . get ( tag ) ;
10772 if ( element ) return element ;
10873
10974 const c = new MessageComposer ( {
110- channel ,
75+ client ,
11176 composition : messageDraft ,
112- tag,
113- threadId : cachedParentMessage . id ,
77+ compositionContext : cachedParentMessage ,
11478 } ) ;
11579
11680 return c ;
@@ -124,11 +88,17 @@ export const useMessageComposer = (_unused: UseMessageComposerParams = {}) => {
12488 cachedEditedMessage ,
12589 cachedParentMessage ,
12690 channel ,
127- messageDraft , // TODO: set message draft after the fact
91+ client ,
92+ messageDraft ,
12893 threadInstance ,
12994 ] ) ;
13095
131- if ( ! queueCache . peek ( messageComposer . tag ) ) {
96+ if (
97+ ( [ 'legacy_thread' , 'message' ] as MessageComposer [ 'contextType' ] [ ] ) . includes (
98+ messageComposer . contextType ,
99+ ) &&
100+ ! queueCache . peek ( messageComposer . tag )
101+ ) {
132102 queueCache . add ( messageComposer . tag , messageComposer ) ;
133103 }
134104
0 commit comments