Skip to content

Commit 7c66b2f

Browse files
authored
fix(frontend): fix widget new chat api (#608)
1 parent 3cda949 commit 7c66b2f

File tree

3 files changed

+14
-10
lines changed

3 files changed

+14
-10
lines changed

Diff for: frontend/app/src/components/chat/chat-hooks.tsx

+2-4
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import type { AppChatStreamState, StackVMState } from '@/components/chat/chat-st
66
import { useGtagFn } from '@/components/gtag-provider';
77
import { useBootstrapStatus } from '@/components/system/BootstrapStatusProvider';
88
import { useLatestRef } from '@/components/use-latest-ref';
9-
import { createContext, type ReactNode, type Ref, useContext, useEffect, useImperativeHandle, useState } from 'react';
9+
import { createContext, type ReactNode, useContext, useEffect, useState } from 'react';
1010

1111
export interface ChatsProviderValues {
1212
chats: Map<string, ChatController>;
@@ -30,7 +30,7 @@ const ChatsContext = createContext<ChatsProviderValues>({
3030

3131
const ChatControllerContext = createContext<ChatController | null>(null);
3232

33-
export function ChatsProvider ({ newChatRef, onChatCreated, children }: { children: ReactNode,newChatRef?: Ref<ChatsProviderValues['newChat'] | undefined>, onChatCreated?: (id: string, chat: Chat, controller: ChatController) => void }) {
33+
export function ChatsProvider ({ onChatCreated, children }: { children: ReactNode, onChatCreated?: (id: string, chat: Chat, controller: ChatController) => void }) {
3434
const bootstrapStatusRef = useLatestRef(useBootstrapStatus());
3535
const [chats, setChats] = useState(() => new Map<string, ChatController>);
3636

@@ -56,8 +56,6 @@ export function ChatsProvider ({ newChatRef, onChatCreated, children }: { childr
5656
});
5757
};
5858

59-
useImperativeHandle(newChatRef, () => newChat);
60-
6159
return (
6260
<ChatsContext.Provider value={{
6361
chats,

Diff for: frontend/app/src/components/chat/conversation.tsx

+7-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { MessageInput } from '@/components/chat/message-input';
88
import { SecuritySettingContext, withReCaptcha } from '@/components/security-setting-provider';
99
import { useSize } from '@/components/use-size';
1010
import { cn } from '@/lib/utils';
11-
import { type ChangeEvent, type FormEvent, type ReactNode, useContext, useState } from 'react';
11+
import { type ChangeEvent, type FormEvent, type ReactNode, type Ref, useContext, useImperativeHandle, useState } from 'react';
1212

1313
export interface ConversationProps {
1414
chatId?: string;
@@ -22,9 +22,10 @@ export interface ConversationProps {
2222
placeholder?: (controller: ChatController, postState: ReturnType<typeof useChatPostState>) => ReactNode;
2323
preventMutateBrowserHistory?: boolean;
2424
preventShiftMessageInput?: boolean;
25+
newChatRef?: Ref<ChatController['post'] | undefined>;
2526
}
2627

27-
export function Conversation ({ open, chat, chatId, history, placeholder, preventMutateBrowserHistory = false, preventShiftMessageInput = false, className }: ConversationProps) {
28+
export function Conversation ({ open, chat, chatId, history, placeholder, preventMutateBrowserHistory = false, preventShiftMessageInput = false, newChatRef, className }: ConversationProps) {
2829
const [inputElement, setInputElement] = useState<HTMLTextAreaElement | null>(null);
2930

3031
const controller = useChatController(chatId, chat, history, inputElement);
@@ -61,6 +62,10 @@ export function Conversation ({ open, chat, chatId, history, placeholder, preven
6162
const disabled = !!postState.params;
6263
const actionDisabled = disabled || !input.trim();
6364

65+
useImperativeHandle(newChatRef, () => {
66+
return controller.post.bind(controller);
67+
}, [controller]);
68+
6469
return (
6570
<ChatControllerProvider controller={controller}>
6671
{!postState.params && !groups.length && placeholder?.(controller, postState)}

Diff for: frontend/packages/widget-react/src/Widget.tsx

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import type { BootstrapStatus } from '@/api/system';
22
import { ManualScrollVoter } from '@/components/auto-scroll';
33
import { AutoScroll } from '@/components/auto-scroll/auto-scroll';
4-
import { ChatsProvider, type ChatsProviderValues } from '@/components/chat/chat-hooks';
4+
import type { ChatController } from '@/components/chat/chat-controller';
5+
import { ChatsProvider } from '@/components/chat/chat-hooks';
56
import { Conversation } from '@/components/chat/conversation';
67
import { useGtagFn } from '@/components/gtag-provider';
78
import { PortalProvider } from '@/components/portal-provider';
@@ -108,7 +109,7 @@ export const Widget = forwardRef<WidgetInstance, WidgetProps>(({ container, trig
108109
}
109110
}, [trigger]);
110111

111-
const newChatRef = useRef<ChatsProviderValues['newChat'] | undefined>(undefined);
112+
const newChatRef = useRef<ChatController['post'] | undefined>(undefined);
112113

113114
useImperativeHandle(ref, () => ({
114115
get open () {
@@ -128,7 +129,7 @@ export const Widget = forwardRef<WidgetInstance, WidgetProps>(({ container, trig
128129
},
129130
get initialized (): true { return true; },
130131
newChat (content: string) {
131-
newChatRef.current?.(undefined, [], {
132+
newChatRef.current?.({
132133
content,
133134
chat_engine: chatEngine,
134135
});
@@ -140,7 +141,6 @@ export const Widget = forwardRef<WidgetInstance, WidgetProps>(({ container, trig
140141
<BootstrapStatusProvider bootstrapStatus={bootstrapStatus}>
141142
<ExperimentalFeaturesProvider features={experimentalFeatures}>
142143
<ChatsProvider
143-
newChatRef={newChatRef}
144144
onChatCreated={id => {
145145
window.dispatchEvent(new CustomEvent('tidbainewchat', {
146146
detail: { id },
@@ -209,6 +209,7 @@ export const Widget = forwardRef<WidgetInstance, WidgetProps>(({ container, trig
209209
)}
210210
preventMutateBrowserHistory
211211
preventShiftMessageInput
212+
newChatRef={newChatRef}
212213
/>
213214
</div>
214215
</ScrollArea>

0 commit comments

Comments
 (0)