UNPKG

@lobehub/ui

Version:

Lobe UI is an open-source UI component library for building AIGC web apps

1 lines 3.41 kB
{"version":3,"file":"messageReducer.mjs","names":[],"sources":["../../../src/chat/EditableMessageList/messageReducer.ts"],"sourcesContent":["import { produce } from 'immer';\n\nimport type { ChatMessageError, LLMMessage, LLMRoleType } from '@/chat/types';\n\nexport type MessageDispatch =\n | { message: LLMMessage; type: 'addMessage' }\n | { index: number; message: LLMMessage; type: 'insertMessage' }\n | { index: number; type: 'deleteMessage' }\n | { type: 'resetMessages' }\n | { index: number; message: string; type: 'updateMessage' }\n | { index: number; role: LLMRoleType; type: 'updateMessageRole' }\n //\n | { message: string; type: 'addUserMessage' }\n | { responseStream: string[]; type: 'updateLatestBotMessage' }\n | { index: number; message: string; type: 'updateMessageChoice' }\n | {\n error: ChatMessageError | undefined;\n index: number;\n type: 'setErrorMessage';\n };\n\nexport const messagesReducer = (state: LLMMessage[], payload: MessageDispatch): LLMMessage[] => {\n switch (payload.type) {\n case 'addMessage': {\n return [...state, payload.message];\n }\n\n case 'insertMessage': {\n return produce(state, (draftState) => {\n draftState.splice(payload.index, 0, payload.message);\n });\n }\n\n case 'deleteMessage': {\n return state.filter((_, index) => index !== payload.index);\n }\n case 'resetMessages': {\n return [];\n }\n\n case 'updateMessage': {\n return produce(state, (draftState) => {\n const { index, message } = payload;\n\n draftState[index].content = message;\n });\n }\n case 'updateMessageRole': {\n return produce(state, (draftState) => {\n const { index, role } = payload;\n\n draftState[index].role = role;\n });\n }\n\n case 'addUserMessage': {\n return produce(state, (draftState) => {\n draftState.push({ content: payload.message, role: 'user' });\n });\n }\n\n case 'updateLatestBotMessage': {\n return produce(state, () => {\n const { responseStream } = payload;\n const newMessage = { content: responseStream.join(''), role: 'assistant' };\n\n return [...state.slice(0, -1), newMessage];\n });\n }\n\n case 'setErrorMessage': {\n return produce(state, (draftState) => {\n const { index, error } = payload;\n\n // @ts-ignore\n draftState[index].error = error;\n });\n }\n\n default: {\n throw new Error('暂未实现的 type,请检查 reducer');\n }\n }\n};\n"],"mappings":";;;AAqBA,MAAa,mBAAmB,OAAqB,YAA2C;AAC9F,SAAQ,QAAQ,MAAhB;EACE,KAAK,aACH,QAAO,CAAC,GAAG,OAAO,QAAQ,QAAQ;EAGpC,KAAK,gBACH,QAAO,QAAQ,QAAQ,eAAe;AACpC,cAAW,OAAO,QAAQ,OAAO,GAAG,QAAQ,QAAQ;IACpD;EAGJ,KAAK,gBACH,QAAO,MAAM,QAAQ,GAAG,UAAU,UAAU,QAAQ,MAAM;EAE5D,KAAK,gBACH,QAAO,EAAE;EAGX,KAAK,gBACH,QAAO,QAAQ,QAAQ,eAAe;GACpC,MAAM,EAAE,OAAO,YAAY;AAE3B,cAAW,OAAO,UAAU;IAC5B;EAEJ,KAAK,oBACH,QAAO,QAAQ,QAAQ,eAAe;GACpC,MAAM,EAAE,OAAO,SAAS;AAExB,cAAW,OAAO,OAAO;IACzB;EAGJ,KAAK,iBACH,QAAO,QAAQ,QAAQ,eAAe;AACpC,cAAW,KAAK;IAAE,SAAS,QAAQ;IAAS,MAAM;IAAQ,CAAC;IAC3D;EAGJ,KAAK,yBACH,QAAO,QAAQ,aAAa;GAC1B,MAAM,EAAE,mBAAmB;GAC3B,MAAM,aAAa;IAAE,SAAS,eAAe,KAAK,GAAG;IAAE,MAAM;IAAa;AAE1E,UAAO,CAAC,GAAG,MAAM,MAAM,GAAG,GAAG,EAAE,WAAW;IAC1C;EAGJ,KAAK,kBACH,QAAO,QAAQ,QAAQ,eAAe;GACpC,MAAM,EAAE,OAAO,UAAU;AAGzB,cAAW,OAAO,QAAQ;IAC1B;EAGJ,QACE,OAAM,IAAI,MAAM,yBAAyB"}