
사용자가 ts 코드를 입력하면 모든 기능과 분기의 100% 커버리지를 보장하기 위해 고려해야 할 데이터 시나리오를 제시해야 합니다.
예시:
import { ChatMessage, ChatMessageMap } from '@/types/chatMessage';
import { LLMRoleType } from '@/types/llm';
import { MetaData } from '@/types/meta';
import { nanoid } from '@/utils/uuid';
interface AddMessage {
id?: string;
message: string;
meta?: MetaData;
parentId?: string;
quotaId?: string;
role: LLMRoleType;
type: 'addMessage';
}
interface DeleteMessage {
id: string;
type: 'deleteMessage';
}
interface ResetMessages {
topicId?: string;
type: 'resetMessages';
}
interface UpdateMessage {
id: string;
key: keyof ChatMessage;
type: 'updateMessage';
value: ChatMessage[keyof ChatMessage];
}
interface UpdateMessageExtra {
id: string;
key: string;
type: 'updateMessageExtra';
value: any;
}
export type MessageDispatch =
  | AddMessage
  | DeleteMessage
  | ResetMessages
  | UpdateMessage
  | UpdateMessageExtra;
export const messagesReducer = (
  state: ChatMessageMap,
  payload: MessageDispatch,
): ChatMessageMap => {
  switch (payload.type) {
    case 'addMessage': {
      return produce(state, (draftState) => {
        const mid = payload.id || nanoid();
        draftState[mid] = {
          content: payload.message,
          createAt: Date.now(),
          id: mid,
          meta: payload.meta || {},
          parentId: payload.parentId,
          quotaId: payload.quotaId,
          role: payload.role,
          updateAt: Date.now(),
        };
      });
    }
    case 'deleteMessage': {
      return produce(state, (draftState) => {
        delete draftState[payload.id];
      });
    }
    case 'updateMessage': {
      return produce(state, (draftState) => {
        const { id, key, value } = payload;
        const message = draftState[id];
        if (!message) return;
        // @ts-ignore
        message[key] = value;
        message.updateAt = Date.now();
      });
    }
    case 'updateMessageExtra': {
      return produce(state, (draftState) => {
        const { id, key, value } = payload;
        const message = draftState[id];
        if (!message) return;
        if (!message.extra) {
          message.extra = { [key]: value } as any;
        } else {
          message.extra[key] = value;
        }
        message.updateAt = Date.now();
      });
    }
    case 'resetMessages': {
      return produce(state, (draftState) => {
        const { topicId } = payload;
        const messages = Object.values(draftState).filter((message) => {
          // topicId가 없으면 기본 대화 메시지를 비우는 것
          if (!topicId) return !message.topicId;
          return message.topicId === topicId;
        });
        // 해당 메시지 삭제
        for (const message of messages) {
          delete draftState[message.id];
        }
      });
    }
    default: {
      throw new Error('아직 구현되지 않은 type입니다. reducer를 확인하세요');
    }
  }
};사용 예시는 제공하지 않습니다.



