From 3a98d1edb11fbdab8d1562f4d8ce797c592f7699 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aneta=20Jastrz=C4=99bska?= <1544710+anetaj@users.noreply.github.com> Date: Sat, 21 Sep 2024 18:06:26 +0200 Subject: [PATCH] add chat context --- extensions/void/src/sidebar/context.tsx | 77 +++++++++++++++++++++++++ extensions/void/src/sidebar/index.tsx | 26 +++++---- 2 files changed, 92 insertions(+), 11 deletions(-) create mode 100644 extensions/void/src/sidebar/context.tsx diff --git a/extensions/void/src/sidebar/context.tsx b/extensions/void/src/sidebar/context.tsx new file mode 100644 index 00000000..dabb836b --- /dev/null +++ b/extensions/void/src/sidebar/context.tsx @@ -0,0 +1,77 @@ +import React, { + ReactNode, + createContext, + useContext, + useEffect, + useState, +} from "react" +import * as vscode from "vscode" +import { ChatMessage, ChatThread, Selection } from "../shared_types" +import { getVSCodeAPI } from "./getVscodeApi" + +interface IChatProviderProps { + chatMessageHistory: ChatMessage[] + addMessageToHistory: (message: ChatMessage) => void + setPreviousThreads: (threads: any) => void +} + +const defaults = { + chatMessageHistory: [], + addMessageToHistory: () => {}, + setPreviousThreads: () => {}, + thread: { + id: "", + createdAt: "", + messages: [], + }, +} + +const ChatContext = createContext(defaults) + +function ChatProvider({ children }: { children: ReactNode }) { + const [previousThreads, setPreviousThreads] = useState([]) + const [thread, setThread] = useState(defaults.thread) + + useEffect(() => { + getVSCodeAPI().postMessage({ type: "getThreadHistory" }) + }, []) + + useEffect(() => { + if (thread.messages.length) { + getVSCodeAPI().postMessage({ type: "updateThread", thread }) + } + }, [thread]) + + const addMessageToHistory = (message: ChatMessage) => { + setThread((prev) => ({ + ...prev, + ...(!thread.id && { + id: new Date().getTime().toString(), + createdAt: new Date().toISOString(), + }), + messages: [...prev.messages, message], + })) + } + + return ( + + {children} + + ) +} + +function useChat(): IChatProviderProps { + const context = useContext(ChatContext) + if (context === undefined) { + throw new Error("useChat must be used within a ChatProvider") + } + return context +} + +export { ChatProvider, useChat } diff --git a/extensions/void/src/sidebar/index.tsx b/extensions/void/src/sidebar/index.tsx index cdd0ce57..8c754705 100644 --- a/extensions/void/src/sidebar/index.tsx +++ b/extensions/void/src/sidebar/index.tsx @@ -1,16 +1,20 @@ -import * as React from 'react' -import * as ReactDOM from 'react-dom/client' -import Sidebar from './Sidebar' +import * as React from "react" +import * as ReactDOM from "react-dom/client" +import Sidebar from "./Sidebar" +import { ChatProvider } from "./context" // mount the sidebar on the id="root" element -if (typeof document === 'undefined') { - console.log('index.tsx error: document was undefined') +if (typeof document === "undefined") { + console.log("index.tsx error: document was undefined") } -const rootElement = document.getElementById('root')! -console.log('root Element', rootElement) +const rootElement = document.getElementById("root")! +console.log("root Element", rootElement) + +const extension = ( + + + +) const root = ReactDOM.createRoot(rootElement) -root.render() - - - +root.render(extension)