buster/web/src/layouts/ChatLayout/ChatContext/useAutoChangeLayout.ts

131 lines
4.0 KiB
TypeScript
Raw Normal View History

2025-03-05 04:52:33 +08:00
'use client';
2025-03-30 11:13:40 +08:00
import { useGetChatMessageMemoized, useGetChatMessage } from '@/api/buster_rest/chats';
2025-02-11 11:15:32 +08:00
import type { SelectedFile } from '../interfaces';
2025-03-05 04:52:33 +08:00
import { useEffect, useRef } from 'react';
2025-03-19 23:43:53 +08:00
import findLast from 'lodash/findLast';
import { BusterChatResponseMessage_file, FileType } from '@/api/asset_interfaces/chat';
import { useMemoizedFn } from '@/hooks';
import { useChatLayoutContextSelector } from '../ChatLayoutContext';
import { BusterRoutes, createBusterRoute } from '@/routes';
import { useAppLayoutContextSelector } from '@/context/BusterAppLayout';
2025-02-09 13:41:08 +08:00
export const useAutoChangeLayout = ({
lastMessageId,
2025-03-19 23:59:14 +08:00
onSetSelectedFile,
selectedFileId,
chatId
2025-02-09 13:41:08 +08:00
}: {
lastMessageId: string;
onSetSelectedFile: (file: SelectedFile) => void;
2025-03-19 23:59:14 +08:00
selectedFileId: string | undefined;
chatId: string | undefined;
2025-02-09 13:41:08 +08:00
}) => {
const onChangePage = useAppLayoutContextSelector((x) => x.onChangePage);
2025-03-12 01:27:34 +08:00
const previousLastMessageId = useRef<string | null>(null);
2025-03-14 02:11:22 +08:00
const reasoningMessagesLength = useGetChatMessage(
2025-03-05 11:29:16 +08:00
lastMessageId,
(x) => x?.reasoning_message_ids?.length || 0
);
2025-03-30 11:13:40 +08:00
const getChatMessageMemoized = useGetChatMessageMemoized();
const getFileHref = useGetFileHref({ chatId });
2025-03-19 23:43:53 +08:00
2025-03-14 02:11:22 +08:00
const isCompletedStream = useGetChatMessage(lastMessageId, (x) => x?.isCompletedStream);
2025-02-09 13:41:08 +08:00
const hasReasoning = !!reasoningMessagesLength;
2025-03-05 04:11:49 +08:00
2025-02-12 07:46:22 +08:00
//change the page to reasoning file if we get a reasoning message
//change the page to the file if we get a file
2025-02-09 13:41:08 +08:00
useEffect(() => {
if (
!isCompletedStream &&
hasReasoning &&
previousLastMessageId.current !== lastMessageId &&
chatId
) {
2025-02-09 13:41:08 +08:00
onSetSelectedFile({ id: lastMessageId, type: 'reasoning' });
2025-03-12 01:27:34 +08:00
previousLastMessageId.current = lastMessageId;
2025-02-09 13:41:08 +08:00
}
2025-03-19 23:43:53 +08:00
if (isCompletedStream) {
const chatMessage = getChatMessageMemoized(lastMessageId);
const lastFileId = findLast(chatMessage?.response_message_ids, (id) => {
const responseMessage = chatMessage?.response_messages[id];
return responseMessage?.type === 'file';
});
const lastFile = chatMessage?.response_messages[lastFileId || ''] as
| BusterChatResponseMessage_file
| undefined;
if (lastFileId && lastFile) {
if (selectedFileId !== lastFileId) {
}
const href = getFileHref({
fileId: lastFileId,
fileType: lastFile.file_type,
currentFile: lastFile
});
if (href) {
2025-04-09 03:32:00 +08:00
onChangePage(href);
onSetSelectedFile({
id: lastFileId,
type: lastFile.file_type,
versionNumber: lastFile.version_number
});
}
2025-03-19 23:43:53 +08:00
}
}
}, [isCompletedStream, chatId, hasReasoning, lastMessageId]);
2025-02-09 13:41:08 +08:00
};
const useGetFileHref = ({ chatId }: { chatId: string | undefined }) => {
const metricVersionNumber = useChatLayoutContextSelector((x) => x.metricVersionNumber);
const dashboardVersionNumber = useChatLayoutContextSelector((x) => x.dashboardVersionNumber);
const getFileHref = useMemoizedFn(
({
fileId,
fileType,
currentFile
}: {
fileId: string;
fileType: FileType;
currentFile: BusterChatResponseMessage_file | undefined;
}) => {
if (!currentFile || !chatId || metricVersionNumber || dashboardVersionNumber) return false;
if (fileType === 'metric') {
if (metricVersionNumber) return false;
return createBusterRoute({
route: BusterRoutes.APP_CHAT_ID_METRIC_ID_VERSION_NUMBER,
chatId: chatId,
metricId: fileId,
versionNumber: currentFile.version_number
});
}
if (fileType === 'dashboard') {
if (dashboardVersionNumber) return false;
return createBusterRoute({
route: BusterRoutes.APP_CHAT_ID_DASHBOARD_ID_VERSION_NUMBER,
chatId: chatId,
dashboardId: fileId,
versionNumber: currentFile.version_number
});
}
if (fileType === 'reasoning') {
return false;
}
const exhaustiveCheck: never = fileType;
return false;
}
);
return getFileHref;
};