diff options
| author | Luke Parker <[email protected]> | 2026-03-07 15:42:14 +1000 |
|---|---|---|
| committer | GitHub <[email protected]> | 2026-03-07 15:42:14 +1000 |
| commit | 8a95be492d460050ab53161be7185dc1c1783eef (patch) | |
| tree | 5ca0897716d089d8d61250d252e49aff4c444089 /packages/app/src | |
| parent | c42c5a0cc6742078bdc7484fdbbba5013d1841d7 (diff) | |
| download | opencode-8a95be492d460050ab53161be7185dc1c1783eef.tar.gz opencode-8a95be492d460050ab53161be7185dc1c1783eef.zip | |
fix(windows): git path resolution for modified files across Git Bash, MSYS2, and Cygwin (#16422)
Diffstat (limited to 'packages/app/src')
| -rw-r--r-- | packages/app/src/pages/directory-layout.tsx | 83 |
1 files changed, 58 insertions, 25 deletions
diff --git a/packages/app/src/pages/directory-layout.tsx b/packages/app/src/pages/directory-layout.tsx index 71b52180f..fdf321f2d 100644 --- a/packages/app/src/pages/directory-layout.tsx +++ b/packages/app/src/pages/directory-layout.tsx @@ -1,26 +1,27 @@ -import { createEffect, createMemo, Show, type ParentProps } from "solid-js" +import { batch, createEffect, createMemo, Show, type ParentProps } from "solid-js" import { createStore } from "solid-js/store" -import { useNavigate, useParams } from "@solidjs/router" +import { useLocation, useNavigate, useParams } from "@solidjs/router" import { SDKProvider } from "@/context/sdk" import { SyncProvider, useSync } from "@/context/sync" import { LocalProvider } from "@/context/local" +import { useGlobalSDK } from "@/context/global-sdk" import { DataProvider } from "@opencode-ai/ui/context" +import { base64Encode } from "@opencode-ai/util/encode" import { decode64 } from "@/utils/base64" import { showToast } from "@opencode-ai/ui/toast" import { useLanguage } from "@/context/language" - function DirectoryDataProvider(props: ParentProps<{ directory: string }>) { - const params = useParams() const navigate = useNavigate() const sync = useSync() + const slug = createMemo(() => base64Encode(props.directory)) return ( <DataProvider data={sync.data} directory={props.directory} - onNavigateToSession={(sessionID: string) => navigate(`/${params.dir}/session/${sessionID}`)} - onSessionHref={(sessionID: string) => `/${params.dir}/session/${sessionID}`} + onNavigateToSession={(sessionID: string) => navigate(`/${slug()}/session/${sessionID}`)} + onSessionHref={(sessionID: string) => `/${slug()}/session/${sessionID}`} > <LocalProvider>{props.children}</LocalProvider> </DataProvider> @@ -30,31 +31,63 @@ function DirectoryDataProvider(props: ParentProps<{ directory: string }>) { export default function Layout(props: ParentProps) { const params = useParams() const navigate = useNavigate() + const location = useLocation() const language = useLanguage() - const [store, setStore] = createStore({ invalid: "" }) - const directory = createMemo(() => { - return decode64(params.dir) ?? "" - }) + const globalSDK = useGlobalSDK() + const directory = createMemo(() => decode64(params.dir) ?? "") + const [state, setState] = createStore({ invalid: "", resolved: "" }) createEffect(() => { if (!params.dir) return - if (directory()) return - if (store.invalid === params.dir) return - setStore("invalid", params.dir) - showToast({ - variant: "error", - title: language.t("common.requestFailed"), - description: language.t("directory.error.invalidUrl"), - }) - navigate("/", { replace: true }) + const raw = directory() + if (!raw) { + if (state.invalid === params.dir) return + setState("invalid", params.dir) + showToast({ + variant: "error", + title: language.t("common.requestFailed"), + description: language.t("directory.error.invalidUrl"), + }) + navigate("/", { replace: true }) + return + } + + const current = params.dir + globalSDK + .createClient({ + directory: raw, + throwOnError: true, + }) + .path.get() + .then((x) => { + if (params.dir !== current) return + const next = x.data?.directory ?? raw + batch(() => { + setState("invalid", "") + setState("resolved", next) + }) + if (next === raw) return + const path = location.pathname.slice(current.length + 1) + navigate(`/${base64Encode(next)}${path}${location.search}${location.hash}`, { replace: true }) + }) + .catch(() => { + if (params.dir !== current) return + batch(() => { + setState("invalid", "") + setState("resolved", raw) + }) + }) }) + return ( - <Show when={directory()}> - <SDKProvider directory={directory}> - <SyncProvider> - <DirectoryDataProvider directory={directory()}>{props.children}</DirectoryDataProvider> - </SyncProvider> - </SDKProvider> + <Show when={state.resolved}> + {(resolved) => ( + <SDKProvider directory={resolved}> + <SyncProvider> + <DirectoryDataProvider directory={resolved()}>{props.children}</DirectoryDataProvider> + </SyncProvider> + </SDKProvider> + )} </Show> ) } |
