diff --git a/frontend/src/app/workspace/agents/[agent_name]/chats/[thread_id]/page.tsx b/frontend/src/app/workspace/agents/[agent_name]/chats/[thread_id]/page.tsx index 62e256026..128eba6c3 100644 --- a/frontend/src/app/workspace/agents/[agent_name]/chats/[thread_id]/page.tsx +++ b/frontend/src/app/workspace/agents/[agent_name]/chats/[thread_id]/page.tsx @@ -259,10 +259,10 @@ export default function AgentChatPage() {
diff --git a/frontend/src/components/workspace/chats/chat-page.tsx b/frontend/src/components/workspace/chats/chat-page.tsx index 2c5b6e287..a4b66f8de 100644 --- a/frontend/src/components/workspace/chats/chat-page.tsx +++ b/frontend/src/components/workspace/chats/chat-page.tsx @@ -280,10 +280,10 @@ export default function ChatPage() {
{!isMock && } diff --git a/frontend/tests/e2e/agent-chat.spec.ts b/frontend/tests/e2e/agent-chat.spec.ts index 9993a87e3..807d1a1be 100644 --- a/frontend/tests/e2e/agent-chat.spec.ts +++ b/frontend/tests/e2e/agent-chat.spec.ts @@ -47,6 +47,54 @@ test.describe("Agent chat", () => { ).toBeVisible(); }); + test("mobile agent welcome keeps the sidebar trigger clickable", async ({ + page, + }) => { + await page.setViewportSize({ width: 390, height: 664 }); + mockLangGraphAPI(page, { + agents: [ + { + ...MOCK_AGENTS[0]!, + description: "这是一个用于验证移动端欢迎页布局的测试智能体。".repeat( + 16, + ), + }, + ], + }); + + await page.goto("/workspace/agents/test-agent/chats/new"); + await page.evaluate(() => { + document.cookie = "locale=zh-CN; path=/; SameSite=Lax"; + }); + await page.reload(); + + const sidebarTrigger = page + .locator("[data-sidebar='trigger']:visible") + .first(); + await expect(sidebarTrigger).toBeVisible({ timeout: 15_000 }); + const triggerBox = await sidebarTrigger.boundingBox(); + expect(triggerBox).not.toBeNull(); + const triggerReceivesPointerEvents = await page.evaluate( + ({ x, y }) => { + const trigger = document.elementFromPoint(x, y); + return trigger?.closest("[data-sidebar='trigger']") !== null; + }, + { + x: triggerBox!.x + triggerBox!.width / 2, + y: triggerBox!.y + triggerBox!.height / 2, + }, + ); + expect(triggerReceivesPointerEvents).toBe(true); + await page.mouse.click( + triggerBox!.x + triggerBox!.width / 2, + triggerBox!.y + triggerBox!.height / 2, + ); + + await expect( + page.locator("[data-mobile='true'][data-sidebar='sidebar']"), + ).toBeVisible(); + }); + test("keeps new-chat drafts isolated between agents", async ({ page }) => { mockLangGraphAPI(page, { agents: MOCK_AGENTS }); diff --git a/frontend/tests/e2e/sidebar.spec.ts b/frontend/tests/e2e/sidebar.spec.ts index 15a8c19b8..a93c746ca 100644 --- a/frontend/tests/e2e/sidebar.spec.ts +++ b/frontend/tests/e2e/sidebar.spec.ts @@ -77,10 +77,14 @@ test.describe("Sidebar navigation", () => { test("mobile welcome layout stays within viewport and opens sidebar", async ({ page, }) => { - await page.setViewportSize({ width: 390, height: 844 }); + await page.setViewportSize({ width: 390, height: 664 }); mockLangGraphAPI(page); await page.goto("/workspace/chats/new"); + await page.evaluate(() => { + document.cookie = "locale=zh-CN; path=/; SameSite=Lax"; + }); + await page.reload(); const viewportWidth = page.viewportSize()?.width ?? 390; const expectInsideViewport = async ( @@ -93,7 +97,7 @@ test.describe("Sidebar navigation", () => { expect(box!.x + box!.width).toBeLessThanOrEqual(viewportWidth + 1); }; - await expectInsideViewport(page.getByText(/Welcome to|欢迎使用/).first()); + await expectInsideViewport(page.getByText(/欢迎使用 🦌 DeerFlow/).first()); await expectInsideViewport(page.getByRole("textbox").first()); await expectInsideViewport(page.locator("[data-slot='suggestions-list']")); @@ -101,7 +105,23 @@ test.describe("Sidebar navigation", () => { .locator("[data-sidebar='trigger']:visible") .first(); await expect(mobileSidebarTrigger).toBeVisible(); - await mobileSidebarTrigger.click(); + const triggerBox = await mobileSidebarTrigger.boundingBox(); + expect(triggerBox).not.toBeNull(); + const triggerReceivesPointerEvents = await page.evaluate( + ({ x, y }) => { + const trigger = document.elementFromPoint(x, y); + return trigger?.closest("[data-sidebar='trigger']") !== null; + }, + { + x: triggerBox!.x + triggerBox!.width / 2, + y: triggerBox!.y + triggerBox!.height / 2, + }, + ); + expect(triggerReceivesPointerEvents).toBe(true); + await page.mouse.click( + triggerBox!.x + triggerBox!.width / 2, + triggerBox!.y + triggerBox!.height / 2, + ); const mobileSidebar = page.locator( "[data-mobile='true'][data-sidebar='sidebar']",