index.tsx 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. /* @refresh reload */
  2. import "@/index.css"
  3. import { render } from "solid-js/web"
  4. import { Router, Route, Navigate } from "@solidjs/router"
  5. import { MetaProvider } from "@solidjs/meta"
  6. import { Fonts } from "@opencode-ai/ui/fonts"
  7. import { MarkedProvider } from "@opencode-ai/ui/context/marked"
  8. import { GlobalSyncProvider, useGlobalSync } from "./context/global-sync"
  9. import Layout from "@/pages/layout"
  10. import DirectoryLayout from "@/pages/directory-layout"
  11. import Session from "@/pages/session"
  12. import { LayoutProvider } from "./context/layout"
  13. import { GlobalSDKProvider } from "./context/global-sdk"
  14. import { SessionProvider } from "./context/session"
  15. import { base64Encode } from "./utils"
  16. import { createMemo, Show } from "solid-js"
  17. const host = import.meta.env.VITE_OPENCODE_SERVER_HOST ?? "127.0.0.1"
  18. const port = import.meta.env.VITE_OPENCODE_SERVER_PORT ?? "4096"
  19. const url =
  20. new URLSearchParams(document.location.search).get("url") ||
  21. (location.hostname.includes("opencode.ai") || location.hostname.includes("localhost")
  22. ? `http://${host}:${port}`
  23. : "/")
  24. const root = document.getElementById("root")
  25. if (import.meta.env.DEV && !(root instanceof HTMLElement)) {
  26. throw new Error(
  27. "Root element not found. Did you forget to add it to your index.html? Or maybe the id attribute got misspelled?",
  28. )
  29. }
  30. render(
  31. () => (
  32. <MarkedProvider>
  33. <GlobalSDKProvider url={url}>
  34. <GlobalSyncProvider>
  35. <LayoutProvider>
  36. <MetaProvider>
  37. <Fonts />
  38. <Router root={Layout}>
  39. <Route
  40. path="/"
  41. component={() => {
  42. const globalSync = useGlobalSync()
  43. const slug = createMemo(() => base64Encode(globalSync.data.defaultProject!.worktree))
  44. return <Navigate href={`${slug()}/session`} />
  45. }}
  46. />
  47. <Route path="/:dir" component={DirectoryLayout}>
  48. <Route path="/" component={() => <Navigate href="session" />} />
  49. <Route
  50. path="/session/:id?"
  51. component={(p) => (
  52. <Show when={p.params.id || true} keyed>
  53. <SessionProvider>
  54. <Session />
  55. </SessionProvider>
  56. </Show>
  57. )}
  58. />
  59. </Route>
  60. </Router>
  61. </MetaProvider>
  62. </LayoutProvider>
  63. </GlobalSyncProvider>
  64. </GlobalSDKProvider>
  65. </MarkedProvider>
  66. ),
  67. root!,
  68. )