Skip to content

Commit 8ef5f4f

Browse files
wip: compositionContext
1 parent 58854a4 commit 8ef5f4f

File tree

1 file changed

+29
-59
lines changed

1 file changed

+29
-59
lines changed

src/components/MessageInput/hooks/messageComposer/useMessageComposer.ts

Lines changed: 29 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,69 +1,34 @@
11
import { useEffect, useMemo, useRef, useState } from 'react';
2-
import { MessageComposer } from 'stream-chat';
2+
import { FixedSizeQueueCache, MessageComposer } from 'stream-chat';
33
import { useThreadContext } from '../../../Threads';
4-
import { useChannelStateContext, useMessageInputContext } from '../../../../context';
4+
import { useChatContext, useMessageInputContext } from '../../../../context';
55
import type { LocalMessage } from 'stream-chat';
66
import { 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-
548
export type UseMessageComposerParams = unknown;
559

5610
const queueCache = new FixedSizeQueueCache<string, MessageComposer>(64);
5711

5812
// eslint-disable-next-line @typescript-eslint/no-unused-vars
5913
export 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

Comments
 (0)