DesktopInterface.tsx 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import "@/index.css"
  2. import { Router, Route, Navigate } from "@solidjs/router"
  3. import { MetaProvider } from "@solidjs/meta"
  4. import { Font } from "@opencode-ai/ui/font"
  5. import { Favicon } from "@opencode-ai/ui/favicon"
  6. import { MarkedProvider } from "@opencode-ai/ui/context/marked"
  7. import { DiffComponentProvider } from "@opencode-ai/ui/context/diff"
  8. import { Diff } from "@opencode-ai/ui/diff"
  9. import { GlobalSyncProvider, useGlobalSync } from "./context/global-sync"
  10. import Layout from "@/pages/layout"
  11. import DirectoryLayout from "@/pages/directory-layout"
  12. import Session from "@/pages/session"
  13. import { LayoutProvider } from "./context/layout"
  14. import { GlobalSDKProvider } from "./context/global-sdk"
  15. import { SessionProvider } from "./context/session"
  16. import { base64Encode } from "@opencode-ai/util/encode"
  17. import { createMemo, Show } from "solid-js"
  18. const host = import.meta.env.VITE_OPENCODE_SERVER_HOST ?? "127.0.0.1"
  19. const port = import.meta.env.VITE_OPENCODE_SERVER_PORT ?? "4096"
  20. const url =
  21. new URLSearchParams(document.location.search).get("url") ||
  22. (location.hostname.includes("opencode.ai") || location.hostname.includes("localhost")
  23. ? `http://${host}:${port}`
  24. : "/")
  25. export function DesktopInterface() {
  26. return (
  27. <MarkedProvider>
  28. <DiffComponentProvider component={Diff}>
  29. <GlobalSDKProvider url={url}>
  30. <GlobalSyncProvider>
  31. <LayoutProvider>
  32. <MetaProvider>
  33. <Font />
  34. <Router root={Layout}>
  35. <Route
  36. path="/"
  37. component={() => {
  38. const globalSync = useGlobalSync()
  39. const slug = createMemo(() => base64Encode(globalSync.data.defaultProject!.worktree))
  40. return <Navigate href={`${slug()}/session`} />
  41. }}
  42. />
  43. <Route path="/:dir" component={DirectoryLayout}>
  44. <Route path="/" component={() => <Navigate href="session" />} />
  45. <Route
  46. path="/session/:id?"
  47. component={(p) => (
  48. <Show when={p.params.id || true} keyed>
  49. <SessionProvider>
  50. <Session />
  51. </SessionProvider>
  52. </Show>
  53. )}
  54. />
  55. </Route>
  56. </Router>
  57. </MetaProvider>
  58. </LayoutProvider>
  59. </GlobalSyncProvider>
  60. </GlobalSDKProvider>
  61. </DiffComponentProvider>
  62. </MarkedProvider>
  63. )
  64. }