From 704787a05ea04b9bf1d73afd1c10316a92376b51 Mon Sep 17 00:00:00 2001 From: Pritesh Date: Wed, 3 Jun 2026 04:29:39 +0530 Subject: [PATCH] feat(lead-gen): delayed Hire-an-Expert nudge on the workflow builder Co-Authored-By: Claude Opus 4.8 (1M context) --- .../workflow/[workflowId]/RenderWorkflow.tsx | 2 + .../components/lead-forms/HireExpertNudge.tsx | 89 +++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 ui/src/components/lead-forms/HireExpertNudge.tsx diff --git a/ui/src/app/workflow/[workflowId]/RenderWorkflow.tsx b/ui/src/app/workflow/[workflowId]/RenderWorkflow.tsx index 59a0ed54..e8f75629 100644 --- a/ui/src/app/workflow/[workflowId]/RenderWorkflow.tsx +++ b/ui/src/app/workflow/[workflowId]/RenderWorkflow.tsx @@ -14,6 +14,7 @@ import { createWorkflowDraftApiV1WorkflowWorkflowIdCreateDraftPost, getWorkflowV import type { DocumentResponseSchema, RecordingResponseSchema, ToolResponse } from '@/client/types.gen'; import { useNodeSpecs } from "@/components/flow/renderer"; import { FlowEdge, FlowNode, NodeType } from "@/components/flow/types"; +import { HireExpertNudge } from "@/components/lead-forms/HireExpertNudge"; import { Button } from '@/components/ui/button'; import { Sheet, SheetContent } from '@/components/ui/sheet'; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip'; @@ -481,6 +482,7 @@ function RenderWorkflow({ return (
+ {/* New Workflow Editor Header */} | null>(null); + + // Arm the 5-minute show timer (once per mount / workflow). + useEffect(() => { + if (typeof window === "undefined") return; + // Already shown+consumed for this workflow → skip. + if (localStorage.getItem(nudgeDoneKey(workflowId))) return; + + const showTimer = setTimeout(() => { + if (hasOpenedHireRef.current) return; // they engaged elsewhere; don't nag + if (localStorage.getItem(nudgeDoneKey(workflowId))) return; + setVisible(true); + posthog.capture(PostHogEvent.HIRE_NUDGE_SHOWN, { workflowId }); + // Auto-fade after 30s. Auto-expiry does NOT mark done (per spec). + fadeTimer.current = setTimeout(() => { + setVisible(false); + posthog.capture(PostHogEvent.HIRE_NUDGE_EXPIRED, { workflowId }); + }, AUTO_FADE_MS); + }, SHOW_DELAY_MS); + + return () => { + clearTimeout(showTimer); + if (fadeTimer.current) clearTimeout(fadeTimer.current); + }; + }, [workflowId, hasOpenedHireRef]); + + if (!visible) return null; + + const markDone = () => { + if (fadeTimer.current) clearTimeout(fadeTimer.current); + localStorage.setItem(nudgeDoneKey(workflowId), "1"); + setVisible(false); + }; + + const handleClick = () => { + posthog.capture(PostHogEvent.HIRE_NUDGE_CLICKED, { workflowId }); + markDone(); + openHireExpert("builder_nudge"); + }; + + const handleDismiss = () => { + posthog.capture(PostHogEvent.HIRE_NUDGE_DISMISSED, { workflowId }); + markDone(); + }; + + return ( +
+ + +
+ ); +}