| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- import "@/index.css"
- import { ErrorBoundary, Show, lazy, type ParentProps } from "solid-js"
- import { Router, Route, Navigate } from "@solidjs/router"
- import { MetaProvider } from "@solidjs/meta"
- import { Font } from "@opencode-ai/ui/font"
- import { MarkedProvider } from "@opencode-ai/ui/context/marked"
- import { DiffComponentProvider } from "@opencode-ai/ui/context/diff"
- import { CodeComponentProvider } from "@opencode-ai/ui/context/code"
- import { I18nProvider } from "@opencode-ai/ui/context"
- import { Diff } from "@opencode-ai/ui/diff"
- import { Code } from "@opencode-ai/ui/code"
- import { ThemeProvider } from "@opencode-ai/ui/theme"
- import { GlobalSyncProvider } from "@/context/global-sync"
- import { PermissionProvider } from "@/context/permission"
- import { LayoutProvider } from "@/context/layout"
- import { GlobalSDKProvider } from "@/context/global-sdk"
- import { ServerProvider, useServer } from "@/context/server"
- import { SettingsProvider } from "@/context/settings"
- import { TerminalProvider } from "@/context/terminal"
- import { PromptProvider } from "@/context/prompt"
- import { FileProvider } from "@/context/file"
- import { NotificationProvider } from "@/context/notification"
- import { DialogProvider } from "@opencode-ai/ui/context/dialog"
- import { CommandProvider } from "@/context/command"
- import { LanguageProvider, useLanguage } from "@/context/language"
- import { usePlatform } from "@/context/platform"
- import { Logo } from "@opencode-ai/ui/logo"
- import Layout from "@/pages/layout"
- import DirectoryLayout from "@/pages/directory-layout"
- import { ErrorPage } from "./pages/error"
- import { iife } from "@opencode-ai/util/iife"
- import { Suspense } from "solid-js"
- const Home = lazy(() => import("@/pages/home"))
- const Session = lazy(() => import("@/pages/session"))
- const Loading = () => <div class="size-full" />
- function UiI18nBridge(props: ParentProps) {
- const language = useLanguage()
- return <I18nProvider value={{ locale: language.locale, t: language.t }}>{props.children}</I18nProvider>
- }
- declare global {
- interface Window {
- __OPENCODE__?: { updaterEnabled?: boolean; serverPassword?: string }
- }
- }
- function MarkedProviderWithNativeParser(props: ParentProps) {
- const platform = usePlatform()
- return <MarkedProvider nativeParser={platform.parseMarkdown}>{props.children}</MarkedProvider>
- }
- export function AppBaseProviders(props: ParentProps) {
- return (
- <MetaProvider>
- <Font />
- <ThemeProvider>
- <LanguageProvider>
- <UiI18nBridge>
- <ErrorBoundary fallback={(error) => <ErrorPage error={error} />}>
- <DialogProvider>
- <MarkedProviderWithNativeParser>
- <DiffComponentProvider component={Diff}>
- <CodeComponentProvider component={Code}>{props.children}</CodeComponentProvider>
- </DiffComponentProvider>
- </MarkedProviderWithNativeParser>
- </DialogProvider>
- </ErrorBoundary>
- </UiI18nBridge>
- </LanguageProvider>
- </ThemeProvider>
- </MetaProvider>
- )
- }
- function ServerKey(props: ParentProps) {
- const server = useServer()
- return (
- <Show when={server.url} keyed>
- {props.children}
- </Show>
- )
- }
- export function AppInterface(props: { defaultUrl?: string }) {
- const defaultServerUrl = () => {
- if (props.defaultUrl) return props.defaultUrl
- if (location.hostname.includes("opencode.ai")) return "http://localhost:4096"
- if (import.meta.env.DEV)
- return `http://${import.meta.env.VITE_OPENCODE_SERVER_HOST ?? "localhost"}:${import.meta.env.VITE_OPENCODE_SERVER_PORT ?? "4096"}`
- return window.location.origin
- }
- return (
- <ServerProvider defaultUrl={defaultServerUrl()}>
- <ServerKey>
- <GlobalSDKProvider>
- <GlobalSyncProvider>
- <Router
- root={(props) => (
- <SettingsProvider>
- <PermissionProvider>
- <LayoutProvider>
- <NotificationProvider>
- <CommandProvider>
- <Layout>{props.children}</Layout>
- </CommandProvider>
- </NotificationProvider>
- </LayoutProvider>
- </PermissionProvider>
- </SettingsProvider>
- )}
- >
- <Route
- path="/"
- component={() => (
- <Suspense fallback={<Loading />}>
- <Home />
- </Suspense>
- )}
- />
- <Route path="/:dir" component={DirectoryLayout}>
- <Route path="/" component={() => <Navigate href="session" />} />
- <Route
- path="/session/:id?"
- component={(p) => (
- <Show when={p.params.id ?? "new"}>
- <TerminalProvider>
- <FileProvider>
- <PromptProvider>
- <Suspense fallback={<Loading />}>
- <Session />
- </Suspense>
- </PromptProvider>
- </FileProvider>
- </TerminalProvider>
- </Show>
- )}
- />
- </Route>
- </Router>
- </GlobalSyncProvider>
- </GlobalSDKProvider>
- </ServerKey>
- </ServerProvider>
- )
- }
|