refactor: repartition server-side and client-side code
This commit is contained in:
75
app/.client/hooks/useChatHistory.ts
Normal file
75
app/.client/hooks/useChatHistory.ts
Normal file
@@ -0,0 +1,75 @@
|
||||
import { useLoaderData, useSearchParams } from '@remix-run/react';
|
||||
import { useCallback } from 'react';
|
||||
import type { Page, Section } from '~/types/actions';
|
||||
import type { ChatWithMessages } from '~/types/chat';
|
||||
import { useEditorStorage } from '../persistence/editor';
|
||||
|
||||
export interface ProjectData {
|
||||
pages?: Page[];
|
||||
sections?: Section[];
|
||||
projectData?: any;
|
||||
}
|
||||
|
||||
export function useChatHistory() {
|
||||
const { chat } = useLoaderData<{ chat?: ChatWithMessages }>();
|
||||
const { loadEditorProject } = useEditorStorage();
|
||||
const [searchParams] = useSearchParams();
|
||||
|
||||
/**
|
||||
* 加载项目数据,先从本地缓存中加载,如果本地缓存没有数据,则从服务器加载。
|
||||
*
|
||||
* @returns 项目数据。
|
||||
*/
|
||||
const getLoadProject = useCallback(async (): Promise<ProjectData | undefined> => {
|
||||
// 加载最新数据
|
||||
const pages = await loadEditorProject();
|
||||
if (pages) {
|
||||
return {
|
||||
pages,
|
||||
};
|
||||
}
|
||||
if (!chat) {
|
||||
return;
|
||||
}
|
||||
|
||||
const { messages } = chat;
|
||||
if (!messages || messages.length === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 返回特定消息 ID 的项目数据
|
||||
const currentMessageId = searchParams.get('rewindTo');
|
||||
if (currentMessageId) {
|
||||
const data = messages?.find((message) => message.id === currentMessageId);
|
||||
const pages = data?.page?.pages;
|
||||
if (pages) {
|
||||
return {
|
||||
pages: pages as unknown as Page[],
|
||||
};
|
||||
}
|
||||
}
|
||||
// 没有指定消息 ID,返回最新的项目数据
|
||||
const lastMessage = messages[messages.length - 1];
|
||||
if (lastMessage.page) {
|
||||
return {
|
||||
pages: lastMessage.page.pages as unknown as Page[],
|
||||
};
|
||||
}
|
||||
}, [chat, searchParams]);
|
||||
|
||||
/**
|
||||
* 获取聊天最新描述
|
||||
* @param chatId
|
||||
* @returns
|
||||
*/
|
||||
const getChatLatestDescription = useCallback(() => {
|
||||
if (!chat) {
|
||||
return '';
|
||||
}
|
||||
return chat.description || '';
|
||||
}, [chat]);
|
||||
return {
|
||||
getLoadProject,
|
||||
getChatLatestDescription,
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user