mirror of
https://github.com/HKUDS/nanobot.git
synced 2026-08-07 21:08:34 +03:00
fix(webui): preserve newly created topic route
This commit is contained in:
+13
-3
@@ -1004,6 +1004,7 @@ function Shell({
|
|||||||
useState<Record<string, WorkspaceScopePayload>>({});
|
useState<Record<string, WorkspaceScopePayload>>({});
|
||||||
const runningChatIdsRef = useRef<Set<string>>(new Set());
|
const runningChatIdsRef = useRef<Set<string>>(new Set());
|
||||||
const activeChatIdRef = useRef<string | null>(null);
|
const activeChatIdRef = useRef<string | null>(null);
|
||||||
|
const pendingCreatedSessionKeyRef = useRef<string | null>(null);
|
||||||
const hostSidebarPreviewCloseTimerRef = useRef<number | null>(null);
|
const hostSidebarPreviewCloseTimerRef = useRef<number | null>(null);
|
||||||
const effectiveRuntimeSurface =
|
const effectiveRuntimeSurface =
|
||||||
settingsSnapshot?.surface ?? settingsSnapshot?.runtime_surface ?? runtimeSurface;
|
settingsSnapshot?.surface ?? settingsSnapshot?.runtime_surface ?? runtimeSurface;
|
||||||
@@ -1181,8 +1182,15 @@ function Shell({
|
|||||||
}, [loading, sessions]);
|
}, [loading, sessions]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (loading || !activeKey) return;
|
if (loading) return;
|
||||||
if (sessions.some((session) => session.key === activeKey)) return;
|
const pendingCreatedKey = pendingCreatedSessionKeyRef.current;
|
||||||
|
if (pendingCreatedKey && sessions.some((session) => session.key === pendingCreatedKey)) {
|
||||||
|
pendingCreatedSessionKeyRef.current = null;
|
||||||
|
}
|
||||||
|
if (!activeKey || sessions.some((session) => session.key === activeKey)) return;
|
||||||
|
// WebKit can commit the route before useSessions' optimistic insert.
|
||||||
|
// Keep that just-created destination valid until the session list catches up.
|
||||||
|
if (pendingCreatedKey === activeKey) return;
|
||||||
const currentRoute = readShellRoute();
|
const currentRoute = readShellRoute();
|
||||||
navigate(
|
navigate(
|
||||||
currentRoute.view === "chat"
|
currentRoute.view === "chat"
|
||||||
@@ -1366,9 +1374,11 @@ function Shell({
|
|||||||
try {
|
try {
|
||||||
const scope = workspaceScope ?? activeWorkspaceScope;
|
const scope = workspaceScope ?? activeWorkspaceScope;
|
||||||
const chatId = await createChat(scope);
|
const chatId = await createChat(scope);
|
||||||
|
const key = `websocket:${chatId}`;
|
||||||
|
pendingCreatedSessionKeyRef.current = key;
|
||||||
navigate({
|
navigate({
|
||||||
view: "chat",
|
view: "chat",
|
||||||
activeKey: `websocket:${chatId}`,
|
activeKey: key,
|
||||||
settingsSection: "overview",
|
settingsSection: "overview",
|
||||||
});
|
});
|
||||||
setMobileSidebarOpen(false);
|
setMobileSidebarOpen(false);
|
||||||
|
|||||||
@@ -367,6 +367,23 @@ describe("App layout", () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("keeps a just-created topic route while the session list catches up", async () => {
|
||||||
|
render(<App />);
|
||||||
|
|
||||||
|
await waitFor(() => expect(connectSpy).toHaveBeenCalled());
|
||||||
|
fireEvent.change(screen.getByRole("textbox", { name: "Message input" }), {
|
||||||
|
target: { value: "/model" },
|
||||||
|
});
|
||||||
|
fireEvent.click(screen.getByRole("button", { name: "Send message" }));
|
||||||
|
|
||||||
|
await waitFor(() => expect(createChatSpy).toHaveBeenCalledTimes(1));
|
||||||
|
await waitFor(() =>
|
||||||
|
expect(window.location.hash).toBe(
|
||||||
|
`#/chat/${encodeURIComponent("websocket:chat-1")}`,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
it("restores the Settings route after a restart fallback hash", async () => {
|
it("restores the Settings route after a restart fallback hash", async () => {
|
||||||
localStorage.setItem("nanobot-webui.restartStartedAt", String(Date.now()));
|
localStorage.setItem("nanobot-webui.restartStartedAt", String(Date.now()));
|
||||||
localStorage.setItem("nanobot-webui.restartRoute", "#/settings?section=channels");
|
localStorage.setItem("nanobot-webui.restartRoute", "#/settings?section=channels");
|
||||||
|
|||||||
Reference in New Issue
Block a user