Fix mobile launch with a saved workspace

This commit is contained in:
Mohamed Boudra
2026-06-28 19:10:39 +07:00
committed by GitHub
parent 4968969c87
commit cb212b4e5c
6 changed files with 229 additions and 52 deletions
@@ -2,6 +2,7 @@ import { describe, expect, it, vi } from "vitest";
import {
resolveStartupBlocker,
resolveStartupNavigationReady,
resolveHostIndexRoute,
resolveStartupRoute,
shouldRunStartupGiveUpTimer,
startHostRuntimeBootstrap,
@@ -250,7 +251,7 @@ describe("resolveStartupRoute", () => {
).toEqual({ kind: "splash" });
});
it("restores the saved workspace only after the host registry proves the host exists", () => {
it("enters the host boundary for saved workspace restore after the host registry proves the host exists", () => {
expect(
resolveStartupRoute({
...baseIndexInput,
@@ -258,7 +259,7 @@ describe("resolveStartupRoute", () => {
workspaceSelection: { serverId: "server-1", workspaceId: "workspace-a" },
workspaceSelectionStatus: "exists",
}),
).toEqual({ kind: "redirect", href: "/h/server-1/workspace/workspace-a" });
).toEqual({ kind: "redirect", href: "/h/server-1" });
});
it("does not restore a saved workspace after workspace hydration proves it is missing", () => {
@@ -357,3 +358,55 @@ describe("resolveStartupRoute", () => {
).toEqual({ kind: "redirect", href: "/welcome" });
});
});
describe("resolveHostIndexRoute", () => {
it("restores the remembered workspace when the host index opens for the same host", () => {
expect(
resolveHostIndexRoute({
serverId: "server-saved",
workspaceSelection: { serverId: "server-saved", workspaceId: "workspace-a" },
workspaceSelectionStatus: "exists",
}),
).toEqual("/h/server-saved/workspace/workspace-a");
});
it("keeps restoring a remembered workspace before the host workspace list hydrates", () => {
expect(
resolveHostIndexRoute({
serverId: "server-saved",
workspaceSelection: { serverId: "server-saved", workspaceId: "workspace-a" },
workspaceSelectionStatus: "unknown",
}),
).toEqual("/h/server-saved/workspace/workspace-a");
});
it("opens global project selection when the remembered workspace is proven missing", () => {
expect(
resolveHostIndexRoute({
serverId: "server-saved",
workspaceSelection: { serverId: "server-saved", workspaceId: "workspace-a" },
workspaceSelectionStatus: "missing",
}),
).toEqual("/open-project");
});
it("opens global project selection when the remembered workspace belongs to another host", () => {
expect(
resolveHostIndexRoute({
serverId: "server-saved",
workspaceSelection: { serverId: "server-other", workspaceId: "workspace-a" },
workspaceSelectionStatus: "exists",
}),
).toEqual("/open-project");
});
it("opens global project selection when no workspace is remembered", () => {
expect(
resolveHostIndexRoute({
serverId: "server-saved",
workspaceSelection: null,
workspaceSelectionStatus: "unknown",
}),
).toEqual("/open-project");
});
});
@@ -174,6 +174,20 @@ export function resolveWorkspaceSelectionStatus(input: {
return input.hasHydratedWorkspaces ? "missing" : "unknown";
}
export function resolveHostIndexRoute(input: {
serverId: string;
workspaceSelection: ActiveWorkspaceSelection | null;
workspaceSelectionStatus: WorkspaceSelectionStatus;
}): Href {
if (
input.workspaceSelection?.serverId === input.serverId &&
shouldRestoreWorkspaceSelection(input)
) {
return buildHostWorkspaceRoute(input.serverId, input.workspaceSelection.workspaceId);
}
return buildOpenProjectRoute();
}
function isIndexPathname(pathname: string) {
return pathname === "/" || pathname === "";
}
@@ -198,12 +212,11 @@ function resolveReadyIndexStartupRoute(input: ResolveIndexStartupRouteInput): St
shouldRestoreWorkspaceSelection(input) &&
hostExists(input.hosts, input.workspaceSelection.serverId)
) {
// Native cold launch must enter the host boundary first. The host index
// owns workspace restore after its local dynamic params exist.
return {
kind: "redirect",
href: buildHostWorkspaceRoute(
input.workspaceSelection.serverId,
input.workspaceSelection.workspaceId,
),
href: buildHostRootRoute(input.workspaceSelection.serverId),
};
}