diff --git a/apps/next/src/components/agent-workspace/agent-workspace-shell.tsx b/apps/next/src/components/agent-workspace/agent-workspace-shell.tsx index 19244f8..d93cf7a 100644 --- a/apps/next/src/components/agent-workspace/agent-workspace-shell.tsx +++ b/apps/next/src/components/agent-workspace/agent-workspace-shell.tsx @@ -65,17 +65,27 @@ export const AgentWorkspaceShell = ({ jobId }: { jobId: Id<'agentJobs'> }) => { | null | undefined; const messages = - useQuery(api.agentJobs.listMessages, { jobId, limit: 200 }) ?? []; + useQuery( + api.agentJobs.listMessages, + job ? { jobId, limit: 200 } : 'skip', + ) ?? []; const events = - useQuery(api.agentJobs.listEvents, { jobId, limit: 200 }) ?? []; + useQuery(api.agentJobs.listEvents, job ? { jobId, limit: 200 } : 'skip') ?? + []; const workspaceChanges = - useQuery(api.agentJobs.listWorkspaceChanges, { jobId, limit: 200 }) ?? []; + useQuery( + api.agentJobs.listWorkspaceChanges, + job ? { jobId, limit: 200 } : 'skip', + ) ?? []; const interactions = - useQuery(api.agentJobs.listInteractionRequests, { - jobId, - status: 'all', - }) ?? []; - const uiState = useQuery(api.agentJobs.getWorkspaceUiState, { jobId }); + useQuery( + api.agentJobs.listInteractionRequests, + job ? { jobId, status: 'all' } : 'skip', + ) ?? []; + const uiState = useQuery( + api.agentJobs.getWorkspaceUiState, + job ? { jobId } : 'skip', + ); const patchUiState = useMutation(api.agentJobs.patchWorkspaceUiState); const createJobForThread = useMutation(api.agentJobs.createForThread); const deleteWorkspace = useMutation(api.agentJobs.deleteWorkspace); diff --git a/apps/next/tests/component/agent-workspace-shell.test.tsx b/apps/next/tests/component/agent-workspace-shell.test.tsx index 3e61bd9..3da755c 100644 --- a/apps/next/tests/component/agent-workspace-shell.test.tsx +++ b/apps/next/tests/component/agent-workspace-shell.test.tsx @@ -1,11 +1,12 @@ import { render, screen } from '@testing-library/react'; +import { getFunctionName } from 'convex/server'; import { describe, expect, it, vi } from 'vitest'; import { AgentWorkspaceShell } from '../../src/components/agent-workspace/agent-workspace-shell'; const { mockUseMutation, mockUseQuery } = vi.hoisted(() => ({ mockUseMutation: vi.fn(() => vi.fn()), - mockUseQuery: vi.fn(() => null), + mockUseQuery: vi.fn(), })); vi.mock('convex/react', () => ({ @@ -21,11 +22,29 @@ vi.mock('sonner', () => ({ })); describe('AgentWorkspaceShell', () => { - it('renders a missing state when the job query returns null', () => { + it('renders a missing state and skips dependent queries for a null job', () => { + mockUseQuery.mockImplementation((query) => + getFunctionName(query) === 'agentJobs:get' ? null : undefined, + ); + render(); expect( screen.getByText('This workspace was not found.'), ).toBeInTheDocument(); + expect( + mockUseQuery.mock.calls.map(([query]) => getFunctionName(query)), + ).toEqual([ + 'agentJobs:get', + 'agentJobs:listMessages', + 'agentJobs:listEvents', + 'agentJobs:listWorkspaceChanges', + 'agentJobs:listInteractionRequests', + 'agentJobs:getWorkspaceUiState', + ]); + expect(mockUseQuery.mock.calls[0]?.[1]).toEqual({ jobId: 'job-1' }); + for (let call = 2; call <= 6; call += 1) { + expect(mockUseQuery.mock.calls[call - 1]?.[1]).toBe('skip'); + } }); });