app.tsx 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import "@/index.css"
  2. import { ErrorBoundary, Show, type ParentProps } from "solid-js"
  3. import { Router, Route, Navigate } from "@solidjs/router"
  4. import { MetaProvider } from "@solidjs/meta"
  5. import { Font } from "@opencode-ai/ui/font"
  6. import { MarkedProvider } from "@opencode-ai/ui/context/marked"
  7. import { DiffComponentProvider } from "@opencode-ai/ui/context/diff"
  8. import { CodeComponentProvider } from "@opencode-ai/ui/context/code"
  9. import { Diff } from "@opencode-ai/ui/diff"
  10. import { Code } from "@opencode-ai/ui/code"
  11. import { ThemeProvider } from "@opencode-ai/ui/theme"
  12. import { GlobalSyncProvider } from "@/context/global-sync"
  13. import { PermissionProvider } from "@/context/permission"
  14. import { LayoutProvider } from "@/context/layout"
  15. import { GlobalSDKProvider } from "@/context/global-sdk"
  16. import { ServerProvider, useServer } from "@/context/server"
  17. import { TerminalProvider } from "@/context/terminal"
  18. import { PromptProvider } from "@/context/prompt"
  19. import { FileProvider } from "@/context/file"
  20. import { NotificationProvider } from "@/context/notification"
  21. import { DialogProvider } from "@opencode-ai/ui/context/dialog"
  22. import { CommandProvider } from "@/context/command"
  23. import Layout from "@/pages/layout"
  24. import Home from "@/pages/home"
  25. import DirectoryLayout from "@/pages/directory-layout"
  26. import Session from "@/pages/session"
  27. import { ErrorPage } from "./pages/error"
  28. import { iife } from "@opencode-ai/util/iife"
  29. declare global {
  30. interface Window {
  31. __OPENCODE__?: { updaterEnabled?: boolean; port?: number }
  32. }
  33. }
  34. const defaultServerUrl = iife(() => {
  35. const param = new URLSearchParams(document.location.search).get("url")
  36. if (param) return param
  37. if (location.hostname.includes("opencode.ai")) return "http://localhost:4096"
  38. if (window.__OPENCODE__) return `http://127.0.0.1:${window.__OPENCODE__.port}`
  39. if (import.meta.env.DEV)
  40. return `http://${import.meta.env.VITE_OPENCODE_SERVER_HOST ?? "localhost"}:${import.meta.env.VITE_OPENCODE_SERVER_PORT ?? "4096"}`
  41. return window.location.origin
  42. })
  43. function ServerKey(props: ParentProps) {
  44. const server = useServer()
  45. return (
  46. <Show when={server.url} keyed>
  47. {props.children}
  48. </Show>
  49. )
  50. }
  51. export function App() {
  52. return (
  53. <MetaProvider>
  54. <Font />
  55. <ThemeProvider>
  56. <ErrorBoundary fallback={(error) => <ErrorPage error={error} />}>
  57. <DialogProvider>
  58. <MarkedProvider>
  59. <DiffComponentProvider component={Diff}>
  60. <CodeComponentProvider component={Code}>
  61. <ServerProvider defaultUrl={defaultServerUrl}>
  62. <ServerKey>
  63. <GlobalSDKProvider>
  64. <GlobalSyncProvider>
  65. <Router
  66. root={(props) => (
  67. <PermissionProvider>
  68. <LayoutProvider>
  69. <NotificationProvider>
  70. <CommandProvider>
  71. <Layout>{props.children}</Layout>
  72. </CommandProvider>
  73. </NotificationProvider>
  74. </LayoutProvider>
  75. </PermissionProvider>
  76. )}
  77. >
  78. <Route path="/" component={Home} />
  79. <Route path="/:dir" component={DirectoryLayout}>
  80. <Route path="/" component={() => <Navigate href="session" />} />
  81. <Route
  82. path="/session/:id?"
  83. component={(p) => (
  84. <Show when={p.params.id ?? "new"} keyed>
  85. <TerminalProvider>
  86. <FileProvider>
  87. <PromptProvider>
  88. <Session />
  89. </PromptProvider>
  90. </FileProvider>
  91. </TerminalProvider>
  92. </Show>
  93. )}
  94. />
  95. </Route>
  96. </Router>
  97. </GlobalSyncProvider>
  98. </GlobalSDKProvider>
  99. </ServerKey>
  100. </ServerProvider>
  101. </CodeComponentProvider>
  102. </DiffComponentProvider>
  103. </MarkedProvider>
  104. </DialogProvider>
  105. </ErrorBoundary>
  106. </ThemeProvider>
  107. </MetaProvider>
  108. )
  109. }