stream-chat-react 13.13.3 → 13.13.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/AIStateIndicator/hooks/useAIState.d.ts +1 -0
- package/dist/components/AIStateIndicator/hooks/useAIState.js +8 -0
- package/dist/components/Chat/hooks/useChat.js +1 -1
- package/dist/components/Message/StreamedMessageText.js +9 -3
- package/dist/components/Message/hooks/useMessageTextStreaming.d.ts +2 -1
- package/dist/components/Message/hooks/useMessageTextStreaming.js +7 -1
- package/dist/components/MessageList/hooks/useMarkRead.js +2 -0
- package/dist/index.browser.cjs +23 -3
- package/dist/index.browser.cjs.map +2 -2
- package/dist/index.node.cjs +23 -3
- package/dist/index.node.cjs.map +2 -2
- package/package.json +1 -1
|
@@ -4,6 +4,7 @@ export const AIStates = {
|
|
|
4
4
|
ExternalSources: 'AI_STATE_EXTERNAL_SOURCES',
|
|
5
5
|
Generating: 'AI_STATE_GENERATING',
|
|
6
6
|
Idle: 'AI_STATE_IDLE',
|
|
7
|
+
Stop: 'AI_STATE_STOP',
|
|
7
8
|
Thinking: 'AI_STATE_THINKING',
|
|
8
9
|
};
|
|
9
10
|
/**
|
|
@@ -30,9 +31,16 @@ export const useAIState = (channel) => {
|
|
|
30
31
|
setAiState(AIStates.Idle);
|
|
31
32
|
}
|
|
32
33
|
});
|
|
34
|
+
const indicatorStoppedListener = channel.on('ai_indicator.stop', (event) => {
|
|
35
|
+
const { cid } = event;
|
|
36
|
+
if (channel.cid === cid) {
|
|
37
|
+
setAiState(AIStates.Stop);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
33
40
|
return () => {
|
|
34
41
|
indicatorChangedListener.unsubscribe();
|
|
35
42
|
indicatorClearedListener.unsubscribe();
|
|
43
|
+
indicatorStoppedListener.unsubscribe();
|
|
36
44
|
};
|
|
37
45
|
}, [channel]);
|
|
38
46
|
return { aiState };
|
|
@@ -24,7 +24,7 @@ export const useChat = ({ client, defaultLanguage = 'en', i18nInstance, initialN
|
|
|
24
24
|
useEffect(() => {
|
|
25
25
|
if (!client)
|
|
26
26
|
return;
|
|
27
|
-
const version = "13.13.
|
|
27
|
+
const version = "13.13.5";
|
|
28
28
|
const userAgent = client.getUserAgent();
|
|
29
29
|
if (!userAgent.includes('stream-chat-react')) {
|
|
30
30
|
// result looks like: 'stream-chat-react-2.3.2-stream-chat-javascript-client-browser-2.2.2'
|
|
@@ -1,16 +1,22 @@
|
|
|
1
|
-
import React from 'react';
|
|
1
|
+
import React, { useEffect } from 'react';
|
|
2
2
|
import { MessageText } from './MessageText';
|
|
3
|
-
import { useMessageContext } from '../../context';
|
|
3
|
+
import { useChannelStateContext, useMessageContext } from '../../context';
|
|
4
4
|
import { useMessageTextStreaming } from './hooks';
|
|
5
5
|
export const StreamedMessageText = (props) => {
|
|
6
6
|
const { message: messageFromProps, renderingLetterCount, renderText, streamingLetterIntervalMs, } = props;
|
|
7
7
|
const { message: messageFromContext } = useMessageContext('StreamedMessageText');
|
|
8
|
+
const { channel } = useChannelStateContext();
|
|
8
9
|
const message = messageFromProps || messageFromContext;
|
|
9
10
|
const { text = '' } = message;
|
|
10
|
-
const { streamedMessageText } = useMessageTextStreaming({
|
|
11
|
+
const { skipAnimation, streamedMessageText } = useMessageTextStreaming({
|
|
11
12
|
renderingLetterCount,
|
|
12
13
|
streamingLetterIntervalMs,
|
|
13
14
|
text,
|
|
14
15
|
});
|
|
16
|
+
useEffect(() => {
|
|
17
|
+
channel?.on('ai_indicator.stop', () => {
|
|
18
|
+
skipAnimation();
|
|
19
|
+
});
|
|
20
|
+
}, [channel, skipAnimation]);
|
|
15
21
|
return (React.createElement(MessageText, { message: { ...message, text: streamedMessageText }, renderText: renderText }));
|
|
16
22
|
};
|
|
@@ -11,5 +11,6 @@ export type UseMessageTextStreamingProps = Pick<StreamedMessageTextProps, 'strea
|
|
|
11
11
|
* @returns {{ streamedMessageText: string }} - A substring of the text property, up until we've finished rendering the typewriter animation.
|
|
12
12
|
*/
|
|
13
13
|
export declare const useMessageTextStreaming: ({ renderingLetterCount, streamingLetterIntervalMs, text, }: UseMessageTextStreamingProps) => {
|
|
14
|
-
|
|
14
|
+
readonly skipAnimation: import("../../../utils/useStableCallback").StableCallback<[], void>;
|
|
15
|
+
readonly streamedMessageText: string;
|
|
15
16
|
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { useEffect, useRef, useState } from 'react';
|
|
2
|
+
import { useStableCallback } from '../../../utils/useStableCallback';
|
|
2
3
|
const DEFAULT_LETTER_INTERVAL = 30;
|
|
3
4
|
const DEFAULT_RENDERING_LETTER_COUNT = 2;
|
|
4
5
|
/**
|
|
@@ -17,6 +18,7 @@ export const useMessageTextStreaming = ({ renderingLetterCount = DEFAULT_RENDERI
|
|
|
17
18
|
const interval = setInterval(() => {
|
|
18
19
|
if (!text || textCursor.current >= textLength) {
|
|
19
20
|
clearInterval(interval);
|
|
21
|
+
return;
|
|
20
22
|
}
|
|
21
23
|
const newCursorValue = textCursor.current + renderingLetterCount;
|
|
22
24
|
const newText = text.substring(0, newCursorValue);
|
|
@@ -27,5 +29,9 @@ export const useMessageTextStreaming = ({ renderingLetterCount = DEFAULT_RENDERI
|
|
|
27
29
|
clearInterval(interval);
|
|
28
30
|
};
|
|
29
31
|
}, [streamingLetterIntervalMs, renderingLetterCount, text]);
|
|
30
|
-
|
|
32
|
+
const skipAnimation = useStableCallback(() => {
|
|
33
|
+
textCursor.current = text.length;
|
|
34
|
+
setStreamedMessageText(text);
|
|
35
|
+
});
|
|
36
|
+
return { skipAnimation, streamedMessageText };
|
|
31
37
|
};
|
|
@@ -19,6 +19,8 @@ export const useMarkRead = ({ isMessageListScrolledToBottom, messageListIsThread
|
|
|
19
19
|
const { markRead, setChannelUnreadUiState } = useChannelActionContext('useMarkRead');
|
|
20
20
|
const { channel } = useChannelStateContext('useMarkRead');
|
|
21
21
|
useEffect(() => {
|
|
22
|
+
if (!channel.getConfig()?.read_events)
|
|
23
|
+
return;
|
|
22
24
|
const shouldMarkRead = () => !document.hidden &&
|
|
23
25
|
!wasMarkedUnread &&
|
|
24
26
|
!messageListIsThread &&
|
package/dist/index.browser.cjs
CHANGED
|
@@ -729,6 +729,7 @@ var AIStates = {
|
|
|
729
729
|
ExternalSources: "AI_STATE_EXTERNAL_SOURCES",
|
|
730
730
|
Generating: "AI_STATE_GENERATING",
|
|
731
731
|
Idle: "AI_STATE_IDLE",
|
|
732
|
+
Stop: "AI_STATE_STOP",
|
|
732
733
|
Thinking: "AI_STATE_THINKING"
|
|
733
734
|
};
|
|
734
735
|
var useAIState = (channel) => {
|
|
@@ -750,9 +751,16 @@ var useAIState = (channel) => {
|
|
|
750
751
|
setAiState(AIStates.Idle);
|
|
751
752
|
}
|
|
752
753
|
});
|
|
754
|
+
const indicatorStoppedListener = channel.on("ai_indicator.stop", (event) => {
|
|
755
|
+
const { cid } = event;
|
|
756
|
+
if (channel.cid === cid) {
|
|
757
|
+
setAiState(AIStates.Stop);
|
|
758
|
+
}
|
|
759
|
+
});
|
|
753
760
|
return () => {
|
|
754
761
|
indicatorChangedListener.unsubscribe();
|
|
755
762
|
indicatorClearedListener.unsubscribe();
|
|
763
|
+
indicatorStoppedListener.unsubscribe();
|
|
756
764
|
};
|
|
757
765
|
}, [channel]);
|
|
758
766
|
return { aiState };
|
|
@@ -16927,6 +16935,7 @@ var useMessageTextStreaming = ({
|
|
|
16927
16935
|
const interval = setInterval(() => {
|
|
16928
16936
|
if (!text8 || textCursor.current >= textLength) {
|
|
16929
16937
|
clearInterval(interval);
|
|
16938
|
+
return;
|
|
16930
16939
|
}
|
|
16931
16940
|
const newCursorValue = textCursor.current + renderingLetterCount;
|
|
16932
16941
|
const newText = text8.substring(0, newCursorValue);
|
|
@@ -16937,7 +16946,11 @@ var useMessageTextStreaming = ({
|
|
|
16937
16946
|
clearInterval(interval);
|
|
16938
16947
|
};
|
|
16939
16948
|
}, [streamingLetterIntervalMs, renderingLetterCount, text8]);
|
|
16940
|
-
|
|
16949
|
+
const skipAnimation = useStableCallback(() => {
|
|
16950
|
+
textCursor.current = text8.length;
|
|
16951
|
+
setStreamedMessageText(text8);
|
|
16952
|
+
});
|
|
16953
|
+
return { skipAnimation, streamedMessageText };
|
|
16941
16954
|
};
|
|
16942
16955
|
|
|
16943
16956
|
// src/components/Message/hooks/useMessageReminder.ts
|
|
@@ -24077,13 +24090,19 @@ var StreamedMessageText = (props) => {
|
|
|
24077
24090
|
streamingLetterIntervalMs
|
|
24078
24091
|
} = props;
|
|
24079
24092
|
const { message: messageFromContext } = useMessageContext("StreamedMessageText");
|
|
24093
|
+
const { channel } = useChannelStateContext();
|
|
24080
24094
|
const message = messageFromProps || messageFromContext;
|
|
24081
24095
|
const { text: text8 = "" } = message;
|
|
24082
|
-
const { streamedMessageText } = useMessageTextStreaming({
|
|
24096
|
+
const { skipAnimation, streamedMessageText } = useMessageTextStreaming({
|
|
24083
24097
|
renderingLetterCount,
|
|
24084
24098
|
streamingLetterIntervalMs,
|
|
24085
24099
|
text: text8
|
|
24086
24100
|
});
|
|
24101
|
+
(0, import_react160.useEffect)(() => {
|
|
24102
|
+
channel?.on("ai_indicator.stop", () => {
|
|
24103
|
+
skipAnimation();
|
|
24104
|
+
});
|
|
24105
|
+
}, [channel, skipAnimation]);
|
|
24087
24106
|
return /* @__PURE__ */ import_react160.default.createElement(
|
|
24088
24107
|
MessageText,
|
|
24089
24108
|
{
|
|
@@ -28622,6 +28641,7 @@ var useMarkRead = ({
|
|
|
28622
28641
|
const { markRead, setChannelUnreadUiState } = useChannelActionContext("useMarkRead");
|
|
28623
28642
|
const { channel } = useChannelStateContext("useMarkRead");
|
|
28624
28643
|
(0, import_react173.useEffect)(() => {
|
|
28644
|
+
if (!channel.getConfig()?.read_events) return;
|
|
28625
28645
|
const shouldMarkRead = () => !document.hidden && !wasMarkedUnread && !messageListIsThread && isMessageListScrolledToBottom && client.user?.id && !hasReadLastMessage(channel, client.user.id);
|
|
28626
28646
|
const onVisibilityChange = () => {
|
|
28627
28647
|
if (shouldMarkRead()) markRead();
|
|
@@ -37399,7 +37419,7 @@ var useChat = ({
|
|
|
37399
37419
|
};
|
|
37400
37420
|
(0, import_react289.useEffect)(() => {
|
|
37401
37421
|
if (!client) return;
|
|
37402
|
-
const version = "13.13.
|
|
37422
|
+
const version = "13.13.5";
|
|
37403
37423
|
const userAgent = client.getUserAgent();
|
|
37404
37424
|
if (!userAgent.includes("stream-chat-react")) {
|
|
37405
37425
|
client.setUserAgent(`stream-chat-react-${version}-${userAgent}`);
|