app.tsx 3.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import "@/index.css"
  2. import { ErrorBoundary, Show } 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 { GlobalSyncProvider } from "@/context/global-sync"
  12. import { LayoutProvider } from "@/context/layout"
  13. import { GlobalSDKProvider } from "@/context/global-sdk"
  14. import { TerminalProvider } from "@/context/terminal"
  15. import { PromptProvider } from "@/context/prompt"
  16. import { NotificationProvider } from "@/context/notification"
  17. import { DialogProvider } from "@opencode-ai/ui/context/dialog"
  18. import { CommandProvider } from "@/context/command"
  19. import Layout from "@/pages/layout"
  20. import Home from "@/pages/home"
  21. import DirectoryLayout from "@/pages/directory-layout"
  22. import Session from "@/pages/session"
  23. import { ErrorPage } from "./pages/error"
  24. import { iife } from "@opencode-ai/util/iife"
  25. declare global {
  26. interface Window {
  27. __OPENCODE__?: { updaterEnabled?: boolean; port?: number }
  28. }
  29. }
  30. const url = iife(() => {
  31. const param = new URLSearchParams(document.location.search).get("url")
  32. if (param) return param
  33. if (location.hostname.includes("opencode.ai")) return "http://localhost:4096"
  34. if (window.__OPENCODE__) return `http://127.0.0.1:${window.__OPENCODE__.port}`
  35. if (import.meta.env.DEV)
  36. return `http://${import.meta.env.VITE_OPENCODE_SERVER_HOST ?? "localhost"}:${import.meta.env.VITE_OPENCODE_SERVER_PORT ?? "4096"}`
  37. return window.location.origin
  38. })
  39. export function App() {
  40. return (
  41. <MetaProvider>
  42. <Font />
  43. <ErrorBoundary fallback={(error) => <ErrorPage error={error} />}>
  44. <DialogProvider>
  45. <MarkedProvider>
  46. <DiffComponentProvider component={Diff}>
  47. <CodeComponentProvider component={Code}>
  48. <GlobalSDKProvider url={url}>
  49. <GlobalSyncProvider>
  50. <LayoutProvider>
  51. <NotificationProvider>
  52. <Router
  53. root={(props) => (
  54. <CommandProvider>
  55. <Layout>{props.children}</Layout>
  56. </CommandProvider>
  57. )}
  58. >
  59. <Route path="/" component={Home} />
  60. <Route path="/:dir" component={DirectoryLayout}>
  61. <Route path="/" component={() => <Navigate href="session" />} />
  62. <Route
  63. path="/session/:id?"
  64. component={(p) => (
  65. <Show when={p.params.id || true} keyed>
  66. <TerminalProvider>
  67. <PromptProvider>
  68. <Session />
  69. </PromptProvider>
  70. </TerminalProvider>
  71. </Show>
  72. )}
  73. />
  74. </Route>
  75. </Router>
  76. </NotificationProvider>
  77. </LayoutProvider>
  78. </GlobalSyncProvider>
  79. </GlobalSDKProvider>
  80. </CodeComponentProvider>
  81. </DiffComponentProvider>
  82. </MarkedProvider>
  83. </DialogProvider>
  84. </ErrorBoundary>
  85. </MetaProvider>
  86. )
  87. }