|
@@ -1,64 +1,45 @@
|
|
|
import { useCallback, useEffect, useState } from "react"
|
|
import { useCallback, useEffect, useState } from "react"
|
|
|
import { useEvent } from "react-use"
|
|
import { useEvent } from "react-use"
|
|
|
|
|
+
|
|
|
import { ExtensionMessage } from "../../src/shared/ExtensionMessage"
|
|
import { ExtensionMessage } from "../../src/shared/ExtensionMessage"
|
|
|
|
|
+
|
|
|
|
|
+import { vscode } from "./utils/vscode"
|
|
|
|
|
+import { ExtensionStateContextProvider, useExtensionState } from "./context/ExtensionStateContext"
|
|
|
import ChatView from "./components/chat/ChatView"
|
|
import ChatView from "./components/chat/ChatView"
|
|
|
import HistoryView from "./components/history/HistoryView"
|
|
import HistoryView from "./components/history/HistoryView"
|
|
|
import SettingsView from "./components/settings/SettingsView"
|
|
import SettingsView from "./components/settings/SettingsView"
|
|
|
import WelcomeView from "./components/welcome/WelcomeView"
|
|
import WelcomeView from "./components/welcome/WelcomeView"
|
|
|
-import { ExtensionStateContextProvider, useExtensionState } from "./context/ExtensionStateContext"
|
|
|
|
|
-import { vscode } from "./utils/vscode"
|
|
|
|
|
import McpView from "./components/mcp/McpView"
|
|
import McpView from "./components/mcp/McpView"
|
|
|
import PromptsView from "./components/prompts/PromptsView"
|
|
import PromptsView from "./components/prompts/PromptsView"
|
|
|
|
|
|
|
|
-const AppContent = () => {
|
|
|
|
|
|
|
+type Tab = "settings" | "history" | "mcp" | "prompts" | "chat"
|
|
|
|
|
+
|
|
|
|
|
+const tabsByMessageAction: Partial<Record<NonNullable<ExtensionMessage["action"]>, Tab>> = {
|
|
|
|
|
+ chatButtonClicked: "chat",
|
|
|
|
|
+ settingsButtonClicked: "settings",
|
|
|
|
|
+ promptsButtonClicked: "prompts",
|
|
|
|
|
+ mcpButtonClicked: "mcp",
|
|
|
|
|
+ historyButtonClicked: "history",
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const App = () => {
|
|
|
const { didHydrateState, showWelcome, shouldShowAnnouncement } = useExtensionState()
|
|
const { didHydrateState, showWelcome, shouldShowAnnouncement } = useExtensionState()
|
|
|
- const [showSettings, setShowSettings] = useState(false)
|
|
|
|
|
- const [showHistory, setShowHistory] = useState(false)
|
|
|
|
|
- const [showMcp, setShowMcp] = useState(false)
|
|
|
|
|
- const [showPrompts, setShowPrompts] = useState(false)
|
|
|
|
|
const [showAnnouncement, setShowAnnouncement] = useState(false)
|
|
const [showAnnouncement, setShowAnnouncement] = useState(false)
|
|
|
|
|
+ const [tab, setTab] = useState<Tab>("chat")
|
|
|
|
|
|
|
|
- const handleMessage = useCallback((e: MessageEvent) => {
|
|
|
|
|
|
|
+ const onMessage = useCallback((e: MessageEvent) => {
|
|
|
const message: ExtensionMessage = e.data
|
|
const message: ExtensionMessage = e.data
|
|
|
- switch (message.type) {
|
|
|
|
|
- case "action":
|
|
|
|
|
- switch (message.action!) {
|
|
|
|
|
- case "settingsButtonClicked":
|
|
|
|
|
- setShowSettings(true)
|
|
|
|
|
- setShowHistory(false)
|
|
|
|
|
- setShowMcp(false)
|
|
|
|
|
- setShowPrompts(false)
|
|
|
|
|
- break
|
|
|
|
|
- case "historyButtonClicked":
|
|
|
|
|
- setShowSettings(false)
|
|
|
|
|
- setShowHistory(true)
|
|
|
|
|
- setShowMcp(false)
|
|
|
|
|
- setShowPrompts(false)
|
|
|
|
|
- break
|
|
|
|
|
- case "mcpButtonClicked":
|
|
|
|
|
- setShowSettings(false)
|
|
|
|
|
- setShowHistory(false)
|
|
|
|
|
- setShowMcp(true)
|
|
|
|
|
- setShowPrompts(false)
|
|
|
|
|
- break
|
|
|
|
|
- case "promptsButtonClicked":
|
|
|
|
|
- setShowSettings(false)
|
|
|
|
|
- setShowHistory(false)
|
|
|
|
|
- setShowMcp(false)
|
|
|
|
|
- setShowPrompts(true)
|
|
|
|
|
- break
|
|
|
|
|
- case "chatButtonClicked":
|
|
|
|
|
- setShowSettings(false)
|
|
|
|
|
- setShowHistory(false)
|
|
|
|
|
- setShowMcp(false)
|
|
|
|
|
- setShowPrompts(false)
|
|
|
|
|
- break
|
|
|
|
|
- }
|
|
|
|
|
- break
|
|
|
|
|
|
|
+
|
|
|
|
|
+ if (message.type === "action" && message.action) {
|
|
|
|
|
+ const newTab = tabsByMessageAction[message.action]
|
|
|
|
|
+
|
|
|
|
|
+ if (newTab) {
|
|
|
|
|
+ setTab(newTab)
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}, [])
|
|
}, [])
|
|
|
|
|
|
|
|
- useEvent("message", handleMessage)
|
|
|
|
|
|
|
+ useEvent("message", onMessage)
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
useEffect(() => {
|
|
|
if (shouldShowAnnouncement) {
|
|
if (shouldShowAnnouncement) {
|
|
@@ -71,42 +52,30 @@ const AppContent = () => {
|
|
|
return null
|
|
return null
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- return (
|
|
|
|
|
|
|
+ // Do not conditionally load ChatView, it's expensive and there's state we
|
|
|
|
|
+ // don't want to lose (user input, disableInput, askResponse promise, etc.)
|
|
|
|
|
+ return showWelcome ? (
|
|
|
|
|
+ <WelcomeView />
|
|
|
|
|
+ ) : (
|
|
|
<>
|
|
<>
|
|
|
- {showWelcome ? (
|
|
|
|
|
- <WelcomeView />
|
|
|
|
|
- ) : (
|
|
|
|
|
- <>
|
|
|
|
|
- {showSettings && <SettingsView onDone={() => setShowSettings(false)} />}
|
|
|
|
|
- {showHistory && <HistoryView onDone={() => setShowHistory(false)} />}
|
|
|
|
|
- {showMcp && <McpView onDone={() => setShowMcp(false)} />}
|
|
|
|
|
- {showPrompts && <PromptsView onDone={() => setShowPrompts(false)} />}
|
|
|
|
|
- {/* Do not conditionally load ChatView, it's expensive and there's state we don't want to lose (user input, disableInput, askResponse promise, etc.) */}
|
|
|
|
|
- <ChatView
|
|
|
|
|
- showHistoryView={() => {
|
|
|
|
|
- setShowSettings(false)
|
|
|
|
|
- setShowMcp(false)
|
|
|
|
|
- setShowPrompts(false)
|
|
|
|
|
- setShowHistory(true)
|
|
|
|
|
- }}
|
|
|
|
|
- isHidden={showSettings || showHistory || showMcp || showPrompts}
|
|
|
|
|
- showAnnouncement={showAnnouncement}
|
|
|
|
|
- hideAnnouncement={() => {
|
|
|
|
|
- setShowAnnouncement(false)
|
|
|
|
|
- }}
|
|
|
|
|
- />
|
|
|
|
|
- </>
|
|
|
|
|
- )}
|
|
|
|
|
|
|
+ {tab === "settings" && <SettingsView onDone={() => setTab("chat")} />}
|
|
|
|
|
+ {tab === "history" && <HistoryView onDone={() => setTab("chat")} />}
|
|
|
|
|
+ {tab === "mcp" && <McpView onDone={() => setTab("chat")} />}
|
|
|
|
|
+ {tab === "prompts" && <PromptsView onDone={() => setTab("chat")} />}
|
|
|
|
|
+ <ChatView
|
|
|
|
|
+ isHidden={tab !== "chat"}
|
|
|
|
|
+ showAnnouncement={showAnnouncement}
|
|
|
|
|
+ hideAnnouncement={() => setShowAnnouncement(false)}
|
|
|
|
|
+ showHistoryView={() => setTab("history")}
|
|
|
|
|
+ />
|
|
|
</>
|
|
</>
|
|
|
)
|
|
)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-const App = () => {
|
|
|
|
|
- return (
|
|
|
|
|
- <ExtensionStateContextProvider>
|
|
|
|
|
- <AppContent />
|
|
|
|
|
- </ExtensionStateContextProvider>
|
|
|
|
|
- )
|
|
|
|
|
-}
|
|
|
|
|
|
|
+const AppWithProviders = () => (
|
|
|
|
|
+ <ExtensionStateContextProvider>
|
|
|
|
|
+ <App />
|
|
|
|
|
+ </ExtensionStateContextProvider>
|
|
|
|
|
+)
|
|
|
|
|
|
|
|
-export default App
|
|
|
|
|
|
|
+export default AppWithProviders
|