diff --git a/components/ChatView/MessageView.tsx b/components/ChatView/MessageView.tsx new file mode 100644 index 0000000..1d52385 --- /dev/null +++ b/components/ChatView/MessageView.tsx @@ -0,0 +1,13 @@ +import { Message } from "../../types"; + +interface Props { + message: Message; +} + +const Message = (props: Props) => { + const message = props.message; + + return
{message.content}
; +}; + +export default Message; diff --git a/components/ChatView/Sidebar.tsx b/components/ChatView/Sidebar.tsx new file mode 100644 index 0000000..72ca290 --- /dev/null +++ b/components/ChatView/Sidebar.tsx @@ -0,0 +1,32 @@ +import { useChatStore, useUserStore } from "../../store"; +import { User } from "../../types"; + +const Sidebar = () => { + const userStore = useUserStore(); + const chatStore = useChatStore(); + + const handleAssistantClick = (user: User) => { + for (const chat of chatStore.chatList) { + if (chat.userId === user.id) { + chatStore.setCurrentChat(chat); + return; + } + } + chatStore.createChat(user); + }; + + return ( +
+

Assistant list

+
+ {userStore.assistantList.map((assistant) => ( +

handleAssistantClick(assistant)} key={assistant.id}> + {assistant.name} +

+ ))} +
+
+ ); +}; + +export default Sidebar; diff --git a/components/ChatView/Textarea.tsx b/components/ChatView/Textarea.tsx new file mode 100644 index 0000000..cb50e13 --- /dev/null +++ b/components/ChatView/Textarea.tsx @@ -0,0 +1,59 @@ +import axios from "axios"; +import { useRef, useState } from "react"; +import { useChatStore, useMessageStore, useUserStore } from "../../store"; +import { UserRole } from "../../types"; +import { generateUUID } from "../../utils"; +import Icon from "../Icon"; + +const Textarea = () => { + const userStore = useUserStore(); + const chatStore = useChatStore(); + const messageStore = useMessageStore(); + const [value, setValue] = useState(""); + const textareaRef = useRef(null); + + const handleChange = (e: React.ChangeEvent) => { + setValue(e.target.value); + }; + + const handleSend = async () => { + if (!chatStore.currentChat) { + return; + } + + const currentChat = chatStore.currentChat; + messageStore.addMessage({ + id: generateUUID(), + chatId: currentChat.id, + creatorId: userStore.currentUser.id, + createdAt: Date.now(), + content: value, + }); + setValue(""); + textareaRef.current!.value = ""; + + const messageList = messageStore.getState().messageList.filter((message) => message.chatId === currentChat.id); + const { data } = await axios.post("/api/chat", { + messages: messageList.map((message) => ({ + role: message.creatorId === userStore.currentUser.id ? UserRole.User : UserRole.Assistant, + content: message.content, + })), + }); + messageStore.addMessage({ + id: generateUUID(), + chatId: currentChat.id, + creatorId: currentChat.userId, + createdAt: Date.now(), + content: data, + }); + }; + + return ( +
+