2025-02-01 06:21:50 +08:00
|
|
|
import React, { useState } from 'react';
|
|
|
|
import {
|
|
|
|
createContext,
|
|
|
|
ContextSelector,
|
|
|
|
useContextSelector
|
|
|
|
} from '@fluentui/react-context-selector';
|
|
|
|
import { useMemoizedFn } from 'ahooks';
|
2025-02-05 13:04:26 +08:00
|
|
|
import type { BusterDatasetListItem, BusterSearchResult, FileType } from '@/api/asset_interfaces';
|
2025-02-01 06:21:50 +08:00
|
|
|
|
|
|
|
export const useBusterNewChat = () => {
|
|
|
|
const [selectedChatDataSource, setSelectedChatDataSource] =
|
|
|
|
useState<BusterDatasetListItem | null>(null);
|
|
|
|
const [loadingNewChat, setLoadingNewChat] = useState(false);
|
2025-02-05 13:04:26 +08:00
|
|
|
const [prompt, setPrompt] = useState('');
|
2025-02-01 06:21:50 +08:00
|
|
|
|
|
|
|
const onSetPrompt = useMemoizedFn((prompt: string) => {
|
|
|
|
setPrompt(prompt);
|
|
|
|
});
|
|
|
|
|
2025-02-05 13:10:39 +08:00
|
|
|
const onSelectSearchAsset = useMemoizedFn(async (asset: BusterSearchResult) => {
|
|
|
|
setLoadingNewChat(true);
|
|
|
|
console.log('select search asset');
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
|
|
setLoadingNewChat(false);
|
|
|
|
onSetPrompt('');
|
|
|
|
});
|
2025-02-01 06:21:50 +08:00
|
|
|
|
|
|
|
const onStartNewChat = useMemoizedFn(async (prompt: string) => {
|
|
|
|
setLoadingNewChat(true);
|
2025-02-05 13:10:39 +08:00
|
|
|
console.log('start new chat');
|
2025-02-01 06:21:50 +08:00
|
|
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
|
|
setLoadingNewChat(false);
|
2025-02-05 13:10:39 +08:00
|
|
|
onSetPrompt('');
|
2025-02-01 06:21:50 +08:00
|
|
|
});
|
|
|
|
|
2025-02-05 13:04:26 +08:00
|
|
|
const onStartChatFromFile = useMemoizedFn(
|
2025-02-05 13:10:39 +08:00
|
|
|
async ({}: { prompt: string; fileId: string; fileType: FileType }) => {
|
|
|
|
setLoadingNewChat(true);
|
|
|
|
console.log('start chat from file');
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
|
|
setLoadingNewChat(false);
|
|
|
|
onSetPrompt('');
|
|
|
|
}
|
2025-02-05 13:04:26 +08:00
|
|
|
);
|
|
|
|
|
|
|
|
const onFollowUpChat = useMemoizedFn(
|
|
|
|
async ({ prompt, messageId }: { prompt: string; messageId: string }) => {
|
|
|
|
setLoadingNewChat(true);
|
2025-02-05 13:10:39 +08:00
|
|
|
console.log('follow up chat');
|
2025-02-05 13:04:26 +08:00
|
|
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
|
|
setLoadingNewChat(false);
|
2025-02-05 13:10:39 +08:00
|
|
|
onSetPrompt('');
|
2025-02-05 13:04:26 +08:00
|
|
|
}
|
|
|
|
);
|
|
|
|
|
|
|
|
const onReplaceMessageInChat = useMemoizedFn(
|
2025-02-05 13:10:39 +08:00
|
|
|
async ({ prompt, messageId }: { prompt: string; messageId: string }) => {
|
|
|
|
setLoadingNewChat(true);
|
|
|
|
console.log('replace message in chat');
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
|
|
setLoadingNewChat(false);
|
|
|
|
onSetPrompt('');
|
|
|
|
}
|
2025-02-05 13:04:26 +08:00
|
|
|
);
|
|
|
|
|
2025-02-01 06:21:50 +08:00
|
|
|
const onSetSelectedChatDataSource = useMemoizedFn((dataSource: BusterDatasetListItem | null) => {
|
|
|
|
setSelectedChatDataSource(dataSource);
|
|
|
|
});
|
|
|
|
|
|
|
|
return {
|
|
|
|
onStartNewChat,
|
|
|
|
loadingNewChat,
|
|
|
|
onSelectSearchAsset,
|
|
|
|
selectedChatDataSource,
|
2025-02-05 13:04:26 +08:00
|
|
|
onSetSelectedChatDataSource,
|
|
|
|
onSetPrompt,
|
|
|
|
onFollowUpChat,
|
|
|
|
prompt,
|
|
|
|
onStartChatFromFile,
|
|
|
|
onReplaceMessageInChat
|
2025-02-01 06:21:50 +08:00
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
export const BusterNewChatContext = createContext<ReturnType<typeof useBusterNewChat>>(
|
|
|
|
{} as ReturnType<typeof useBusterNewChat>
|
|
|
|
);
|
|
|
|
|
|
|
|
export const BusterNewChatProvider: React.FC<{
|
|
|
|
children: React.ReactNode;
|
|
|
|
}> = ({ children }) => {
|
|
|
|
const value = useBusterNewChat();
|
|
|
|
return <BusterNewChatContext.Provider value={value}>{children}</BusterNewChatContext.Provider>;
|
|
|
|
};
|
|
|
|
|
|
|
|
export const useBusterNewChatContextSelector = <T,>(
|
|
|
|
selector: ContextSelector<ReturnType<typeof useBusterNewChat>, T>
|
|
|
|
) => useContextSelector(BusterNewChatContext, selector);
|