diff --git a/apps/app/src/app/(app)/[orgId]/components/OnboardingTracker.tsx b/apps/app/src/app/(app)/[orgId]/components/OnboardingTracker.tsx index f69d86960..59e688566 100644 --- a/apps/app/src/app/(app)/[orgId]/components/OnboardingTracker.tsx +++ b/apps/app/src/app/(app)/[orgId]/components/OnboardingTracker.tsx @@ -4,9 +4,24 @@ import { Card, CardContent } from '@comp/ui/card'; import type { Onboarding } from '@db'; import { useRealtimeRun } from '@trigger.dev/react-hooks'; import { AnimatePresence, motion } from 'framer-motion'; -import { AlertTriangle, CheckCircle2, ChevronDown, ChevronUp, ChevronsDown, ChevronsUp, Loader2, Rocket, Settings, ShieldAlert, X, Zap } from 'lucide-react'; -import { createPortal } from 'react-dom'; +import { + AlertTriangle, + CheckCircle2, + ChevronDown, + ChevronUp, + ChevronsDown, + ChevronsUp, + Loader2, + Rocket, + Settings, + ShieldAlert, + X, + Zap, +} from 'lucide-react'; +import Link from 'next/link'; +import { usePathname } from 'next/navigation'; import { useEffect, useMemo, useState } from 'react'; +import { createPortal } from 'react-dom'; const ONBOARDING_STEPS = [ { key: 'vendors', label: 'Researching Vendors', order: 1 }, @@ -33,6 +48,8 @@ const getFriendlyStatusName = (status: string): string => { export const OnboardingTracker = ({ onboarding }: { onboarding: Onboarding }) => { const triggerJobId = onboarding.triggerJobId; + const pathname = usePathname(); + const orgId = pathname?.split('/')[1] || ''; const [mounted, setMounted] = useState(false); const [isMinimized, setIsMinimized] = useState(false); const [isDismissed, setIsDismissed] = useState(false); @@ -84,35 +101,38 @@ export const OnboardingTracker = ({ onboarding }: { onboarding: Onboarding }) => } const meta = run.metadata as Record; - + // Build vendorsStatus object from individual vendor status keys const vendorsStatus: Record = {}; const vendorsInfo = (meta.vendorsInfo as Array<{ id: string; name: string }>) || []; - + vendorsInfo.forEach((vendor) => { const statusKey = `vendor_${vendor.id}_status`; - vendorsStatus[vendor.id] = (meta[statusKey] as 'pending' | 'processing' | 'completed') || 'pending'; + vendorsStatus[vendor.id] = + (meta[statusKey] as 'pending' | 'processing' | 'completed') || 'pending'; }); - + // Build risksStatus object from individual risk status keys const risksStatus: Record = {}; const risksInfo = (meta.risksInfo as Array<{ id: string; name: string }>) || []; - + risksInfo.forEach((risk) => { const statusKey = `risk_${risk.id}_status`; - risksStatus[risk.id] = (meta[statusKey] as 'pending' | 'processing' | 'completed') || 'pending'; + risksStatus[risk.id] = + (meta[statusKey] as 'pending' | 'processing' | 'completed') || 'pending'; }); - + // Build policiesStatus object from individual policy status keys const policiesStatus: Record = {}; const policiesInfo = (meta.policiesInfo as Array<{ id: string; name: string }>) || []; - + policiesInfo.forEach((policy) => { // Check for individual policy status key: policy_{id}_status const statusKey = `policy_${policy.id}_status`; - policiesStatus[policy.id] = (meta[statusKey] as 'pending' | 'processing' | 'completed') || 'pending'; + policiesStatus[policy.id] = + (meta[statusKey] as 'pending' | 'processing' | 'completed') || 'pending'; }); - + return { vendors: meta.vendors === true, risk: meta.risk === true, @@ -152,7 +172,7 @@ export const OnboardingTracker = ({ onboarding }: { onboarding: Onboarding }) => if (!currentStep) return; const stepKey = currentStep.key; - + // Expand current step if it has items to show if (stepKey === 'vendors' && stepStatus.vendorsTotal > 0) { setIsVendorsExpanded(true); @@ -199,7 +219,7 @@ export const OnboardingTracker = ({ onboarding }: { onboarding: Onboarding }) => // Minimized view - show only current step if (isMinimized) { const isCompleted = run?.status === 'COMPLETED'; - + return createPortal( )} - + {!isCompleted && ( + + )} @@ -268,9 +290,7 @@ export const OnboardingTracker = ({ onboarding }: { onboarding: Onboarding }) =>

Initializing...

-

- Checking onboarding status -

+

Checking onboarding status

); @@ -281,9 +301,7 @@ export const OnboardingTracker = ({ onboarding }: { onboarding: Onboarding }) =>

Status Unavailable

-

- Could not retrieve status -

+

Could not retrieve status

- + {/* Step progress - scrollable */}
{ONBOARDING_STEPS.map((step) => { @@ -332,7 +350,7 @@ export const OnboardingTracker = ({ onboarding }: { onboarding: Onboarding }) => const isVendorsStep = step.key === 'vendors'; const isRisksStep = step.key === 'risk'; const isPoliciesStep = step.key === 'policies'; - + // Vendors step with expandable dropdown if (isVendorsStep && stepStatus.vendorsTotal > 0) { return ( @@ -372,7 +390,7 @@ export const OnboardingTracker = ({ onboarding }: { onboarding: Onboarding }) =>
- + {/* Expanded vendor list */} {isVendorsExpanded && stepStatus.vendorsInfo.length > 0 && ( const vendorStatus = stepStatus.vendorsStatus[vendor.id] || 'pending'; const isVendorCompleted = vendorStatus === 'completed'; const isVendorProcessing = vendorStatus === 'processing'; - - return ( -
+ + const content = ( + <> {isVendorCompleted ? ( - + ) : isVendorProcessing ? ( - + ) : ( -
+
)} > {vendor.name} + + ); + + return ( +
+ {isVendorCompleted && orgId ? ( + + {content} + + ) : ( + content + )}
); })} @@ -417,7 +451,7 @@ export const OnboardingTracker = ({ onboarding }: { onboarding: Onboarding }) =>
); } - + // Risks step with expandable dropdown if (isRisksStep && stepStatus.risksTotal > 0) { return ( @@ -457,7 +491,7 @@ export const OnboardingTracker = ({ onboarding }: { onboarding: Onboarding }) =>
- + {/* Expanded risk list */} {isRisksExpanded && stepStatus.risksInfo.length > 0 && ( const riskStatus = stepStatus.risksStatus[risk.id] || 'pending'; const isRiskCompleted = riskStatus === 'completed'; const isRiskProcessing = riskStatus === 'processing'; - - return ( -
+ + const content = ( + <> {isRiskCompleted ? ( - + ) : isRiskProcessing ? ( - + ) : ( -
+
)} > {risk.name} + + ); + + return ( +
+ {isRiskCompleted && orgId ? ( + + {content} + + ) : ( + content + )}
); })} @@ -502,7 +552,7 @@ export const OnboardingTracker = ({ onboarding }: { onboarding: Onboarding }) =>
); } - + if (isPoliciesStep && stepStatus.policiesTotal > 0) { // Policies step with expandable dropdown return ( @@ -534,15 +584,16 @@ export const OnboardingTracker = ({ onboarding }: { onboarding: Onboarding }) => {stepStatus.policiesCompleted}/{stepStatus.policiesTotal} - {isPoliciesExpanded ? ( - - ) : ( - - )} + {!isCompleted && + (isPoliciesExpanded ? ( + + ) : ( + + ))}
- + {/* Expanded policy list */} {isPoliciesExpanded && stepStatus.policiesInfo.length > 0 && ( >
{stepStatus.policiesInfo.map((policy) => { - const policyStatus = stepStatus.policiesStatus[policy.id] || 'pending'; + const policyStatus = + stepStatus.policiesStatus[policy.id] || 'pending'; const isPolicyCompleted = policyStatus === 'completed'; const isPolicyProcessing = policyStatus === 'processing'; - - return ( -
+ + const content = ( + <> {isPolicyCompleted ? ( - + ) : isPolicyProcessing ? ( - + ) : ( -
+
)} > {policy.name} + + ); + + return ( +
+ {isPolicyCompleted && orgId ? ( + + {content} + + ) : ( + content + )}
); })} @@ -587,7 +655,7 @@ export const OnboardingTracker = ({ onboarding }: { onboarding: Onboarding }) =>
); } - + // Regular step return (
@@ -622,9 +690,7 @@ export const OnboardingTracker = ({ onboarding }: { onboarding: Onboarding }) =>
-

- Setup Complete -

+

Setup Complete

- +
-

Your organization is ready!

+

+ Your organization is ready! +

All onboarding steps have been completed successfully.

- + {/* Show completed steps */}
{ONBOARDING_STEPS.map((step) => (
- - {step.label} - + {step.label}
))}
@@ -693,9 +759,7 @@ export const OnboardingTracker = ({ onboarding }: { onboarding: Onboarding }) =>

Unknown Status

-

- Status: {exhaustiveCheck} -

+

Status: {exhaustiveCheck}