@lobehub/chat
Version:
Lobe Chat - an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.
68 lines (56 loc) • 1.86 kB
text/typescript
import { produce } from 'immer';
import { CreateTopicParams } from '@/services/topic/type';
import { ChatTopic } from '@/types/topic';
interface AddChatTopicAction {
type: 'addTopic';
value: CreateTopicParams & { id?: string };
}
interface UpdateChatTopicAction {
id: string;
type: 'updateTopic';
value: Partial<ChatTopic>;
}
interface DeleteChatTopicAction {
id: string;
type: 'deleteTopic';
}
export type ChatTopicDispatch = AddChatTopicAction | UpdateChatTopicAction | DeleteChatTopicAction;
export const topicReducer = (state: ChatTopic[] = [], payload: ChatTopicDispatch): ChatTopic[] => {
switch (payload.type) {
case 'addTopic': {
return produce(state, (draftState) => {
draftState.unshift({
...payload.value,
createdAt: Date.now(),
favorite: false,
id: payload.value.id ?? Date.now().toString(),
sessionId: payload.value.sessionId ? payload.value.sessionId : undefined,
updatedAt: Date.now(),
});
return draftState.sort((a, b) => Number(b.favorite) - Number(a.favorite));
});
}
case 'updateTopic': {
return produce(state, (draftState) => {
const { value, id } = payload;
const topicIndex = draftState.findIndex((topic) => topic.id === id);
if (topicIndex !== -1) {
// TODO: updatedAt 类型后续需要修改为 Date
// @ts-ignore
draftState[topicIndex] = { ...draftState[topicIndex], ...value, updatedAt: new Date() };
}
});
}
case 'deleteTopic': {
return produce(state, (draftState) => {
const topicIndex = draftState.findIndex((topic) => topic.id === payload.id);
if (topicIndex !== -1) {
draftState.splice(topicIndex, 1);
}
});
}
default: {
return state;
}
}
};