App.tsx 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import { useCallback, useEffect, useState } from "react"
  2. import { useEvent } from "react-use"
  3. import { ExtensionMessage } from "../../src/shared/ExtensionMessage"
  4. import ChatView from "./components/chat/ChatView"
  5. import HistoryView from "./components/history/HistoryView"
  6. import SettingsView from "./components/settings/SettingsView"
  7. import WelcomeView from "./components/welcome/WelcomeView"
  8. import { ExtensionStateContextProvider, useExtensionState } from "./context/ExtensionStateContext"
  9. import { vscode } from "./utils/vscode"
  10. import McpView from "./components/mcp/McpView"
  11. const AppContent = () => {
  12. const { didHydrateState, showWelcome, shouldShowAnnouncement } = useExtensionState()
  13. const [showSettings, setShowSettings] = useState(false)
  14. const [showHistory, setShowHistory] = useState(false)
  15. const [showMcp, setShowMcp] = useState(false)
  16. const [showAnnouncement, setShowAnnouncement] = useState(false)
  17. const handleMessage = useCallback((e: MessageEvent) => {
  18. const message: ExtensionMessage = e.data
  19. switch (message.type) {
  20. case "action":
  21. switch (message.action!) {
  22. case "settingsButtonClicked":
  23. setShowSettings(true)
  24. setShowHistory(false)
  25. setShowMcp(false)
  26. break
  27. case "historyButtonClicked":
  28. setShowSettings(false)
  29. setShowHistory(true)
  30. setShowMcp(false)
  31. break
  32. case "mcpButtonClicked":
  33. setShowSettings(false)
  34. setShowHistory(false)
  35. setShowMcp(true)
  36. break
  37. case "chatButtonClicked":
  38. setShowSettings(false)
  39. setShowHistory(false)
  40. setShowMcp(false)
  41. break
  42. }
  43. break
  44. }
  45. }, [])
  46. useEvent("message", handleMessage)
  47. useEffect(() => {
  48. if (shouldShowAnnouncement) {
  49. setShowAnnouncement(true)
  50. vscode.postMessage({ type: "didShowAnnouncement" })
  51. }
  52. }, [shouldShowAnnouncement])
  53. if (!didHydrateState) {
  54. return null
  55. }
  56. return (
  57. <>
  58. {showWelcome ? (
  59. <WelcomeView />
  60. ) : (
  61. <>
  62. {showSettings && <SettingsView onDone={() => setShowSettings(false)} />}
  63. {showHistory && <HistoryView onDone={() => setShowHistory(false)} />}
  64. {showMcp && <McpView onDone={() => setShowMcp(false)} />}
  65. {/* Do not conditionally load ChatView, it's expensive and there's state we don't want to lose (user input, disableInput, askResponse promise, etc.) */}
  66. <ChatView
  67. showHistoryView={() => {
  68. setShowSettings(false)
  69. setShowMcp(false)
  70. setShowHistory(true)
  71. }}
  72. isHidden={showSettings || showHistory || showMcp}
  73. showAnnouncement={showAnnouncement}
  74. hideAnnouncement={() => {
  75. setShowAnnouncement(false)
  76. }}
  77. />
  78. </>
  79. )}
  80. </>
  81. )
  82. }
  83. const App = () => {
  84. return (
  85. <ExtensionStateContextProvider>
  86. <AppContent />
  87. </ExtensionStateContextProvider>
  88. )
  89. }
  90. export default App