From 32cf64eebed503f455e92b4c8596b3174259304b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20LAGACHE?= Date: Thu, 18 Jun 2026 11:58:18 +0200 Subject: [PATCH] feat(onboarding): step-agent-waiting polls real agent lastContact via useQuery --- .../actions/get-agent-status.action.ts | 16 ++++++++ .../onboarding/steps/step-agent-waiting.tsx | 41 ++++++++++++++----- 2 files changed, 47 insertions(+), 10 deletions(-) create mode 100644 src/features/onboarding/actions/get-agent-status.action.ts diff --git a/src/features/onboarding/actions/get-agent-status.action.ts b/src/features/onboarding/actions/get-agent-status.action.ts new file mode 100644 index 00000000..6049fa30 --- /dev/null +++ b/src/features/onboarding/actions/get-agent-status.action.ts @@ -0,0 +1,16 @@ +"use server"; + +import { userAction } from "@/lib/safe-actions/actions"; +import { z } from "zod"; +import { getAgentAction } from "@/features/agents/agents.action"; + +export const getAgentStatusAction = userAction + .schema(z.object({ agentId: z.string() })) + .action(async ({ parsedInput }) => { + const result = await getAgentAction(parsedInput.agentId); + if (!result?.data?.data) return { connected: false }; + const agent = result.data.data; + const lastContact = agent.lastContact ? new Date(agent.lastContact) : null; + const connected = lastContact !== null && Date.now() - lastContact.getTime() < 60_000; + return { connected }; + }); diff --git a/src/features/onboarding/steps/step-agent-waiting.tsx b/src/features/onboarding/steps/step-agent-waiting.tsx index 69452f2b..ef6258b1 100644 --- a/src/features/onboarding/steps/step-agent-waiting.tsx +++ b/src/features/onboarding/steps/step-agent-waiting.tsx @@ -1,23 +1,44 @@ "use client"; -import { useEffect, useRef } from "react"; +import { useEffect } from "react"; import { useOnboarding } from "@onboardjs/react"; -import { simulateAgentPing } from "@/features/onboarding/onboarding.mock"; +import { useQuery } from "@tanstack/react-query"; +import { Loader2 } from "lucide-react"; +import { getAgentStatusAction } from "@/features/onboarding/actions/get-agent-status.action"; +import type { OnboardingAgent } from "@/features/onboarding/onboarding.types"; export const StepAgentWaiting = () => { - const { next } = useOnboarding(); - const started = useRef(false); + const { next, state } = useOnboarding(); + const agents = (state?.context.flowData.agents ?? []) as OnboardingAgent[]; + const firstAgentId = agents[0]?.id; + + const { data } = useQuery({ + queryKey: ["agent-status", firstAgentId], + queryFn: async () => { + if (!firstAgentId) return { connected: false }; + const result = await getAgentStatusAction({ agentId: firstAgentId }); + return result?.data ?? { connected: false }; + }, + refetchInterval: 3000, + enabled: !!firstAgentId, + }); useEffect(() => { - if (started.current) return; - started.current = true; - simulateAgentPing().then(() => next()); - }, [next]); + if (data?.connected) { + next(); + } + }, [data?.connected, next]); return ( -
+
+

Waiting for your agent

-

Checking connectivity and database health...

+

+ Checking connectivity every 3 seconds… +

+ {agents.length > 0 && ( +

Agent: {agents[0].name}

+ )}
); };