fix: state management - get current conv messages with selectAtom

This commit is contained in:
Louis 2023-09-29 15:01:28 +07:00 committed by Louis
parent 315b85591f
commit e7e932059a
2 changed files with 41 additions and 11 deletions

View File

@ -5,14 +5,24 @@ import ChatItem from "../ChatItem";
import { ChatMessage } from "@/_models/ChatMessage";
import useChatMessages from "@/_hooks/useChatMessages";
import {
currentChatMessagesAtom,
chatMessages,
getActiveConvoIdAtom,
showingTyping,
} from "@/_helpers/JotaiWrapper";
import { useAtomValue } from "jotai";
import { selectAtom } from "jotai/utils";
import LoadingIndicator from "../LoadingIndicator";
const ChatBody: React.FC = () => {
const messages = useAtomValue(currentChatMessagesAtom);
const activeConversationId = useAtomValue(getActiveConvoIdAtom) ?? "";
const messageList = useAtomValue(
selectAtom(
chatMessages,
useCallback((v) => v[activeConversationId], [activeConversationId])
)
);
const [content, setContent] = useState<React.JSX.Element[]>([]);
const isTyping = useAtomValue(showingTyping);
const [offset, setOffset] = useState(0);
const { loading, hasMore } = useChatMessages(offset);
@ -35,13 +45,18 @@ const ChatBody: React.FC = () => {
[loading, hasMore]
);
const content = messages.map((message, index) => {
if (messages.length === index + 1) {
// @ts-ignore
return <ChatItem ref={lastPostRef} message={message} key={message.id} />;
}
return <ChatItem message={message} key={message.id} />;
});
React.useEffect(() => {
const list = messageList?.map((message, index) => {
if (messageList?.length === index + 1) {
return (
// @ts-ignore
<ChatItem ref={lastPostRef} message={message} key={message.id} />
);
}
return <ChatItem message={message} key={message.id} />;
});
setContent(list);
}, [messageList, lastPostRef]);
return (
<div className="flex flex-col-reverse flex-1 py-4 overflow-y-auto scroll">

View File

@ -1,14 +1,16 @@
import {
addNewMessageAtom,
currentChatMessagesAtom,
chatMessages,
currentConversationAtom,
currentPromptAtom,
currentStreamingMessageAtom,
getActiveConvoIdAtom,
showingTyping,
updateMessageAtom,
} from "@/_helpers/JotaiWrapper";
import { useAtom, useAtomValue, useSetAtom } from "jotai";
import { selectAtom } from "jotai/utils";
import { DataService } from "../../shared/coreService";
import {
MessageSenderType,
@ -16,13 +18,21 @@ import {
toChatMessage,
} from "@/_models/ChatMessage";
import { executeSerial } from "@/_services/pluginService";
import { useCallback } from "react";
export default function useSendChatMessage() {
const currentConvo = useAtomValue(currentConversationAtom);
const updateStreamMessage = useSetAtom(currentStreamingMessageAtom);
const addNewMessage = useSetAtom(addNewMessageAtom);
const updateMessage = useSetAtom(updateMessageAtom);
const chatMessagesHistory = useAtomValue(currentChatMessagesAtom);
const activeConversationId = useAtomValue(getActiveConvoIdAtom) ?? "";
const chatMessagesHistory = useAtomValue(
selectAtom(
chatMessages,
useCallback((v) => v[activeConversationId], [activeConversationId])
)
);
const [currentPrompt, setCurrentPrompt] = useAtom(currentPromptAtom);
const [, setIsTyping] = useAtom(showingTyping);
const sendChatMessage = async () => {
@ -120,6 +130,11 @@ export default function useSendChatMessage() {
}
}
}
updateMessage(
responseChatMessage.id,
responseChatMessage.conversationId,
answer
);
await executeSerial(DataService.UPDATE_MESSAGE, {
...newResponse,
message: answer,