dograh/ui/src/app/workflow/[workflowId]/page.tsx

106 lines
4 KiB
TypeScript

'use client';
import { useParams, useSearchParams } from 'next/navigation';
import posthog from 'posthog-js';
import { useEffect, useMemo, useState } from 'react';
import RenderWorkflow from '@/app/workflow/[workflowId]/RenderWorkflow';
import { getWorkflowApiV1WorkflowFetchWorkflowIdGet } from '@/client/sdk.gen';
import type { WorkflowResponse } from '@/client/types.gen';
import { FlowEdge, FlowNode } from '@/components/flow/types';
import SpinLoader from '@/components/SpinLoader';
import { PostHogEvent } from '@/constants/posthog-events';
import { useAuth } from '@/lib/auth';
import logger from '@/lib/logger';
import { WorkflowConfigurations } from '@/types/workflow-configurations';
import WorkflowLayout from '../WorkflowLayout';
export default function WorkflowDetailPage() {
const params = useParams();
const searchParams = useSearchParams();
const [workflow, setWorkflow] = useState<WorkflowResponse | undefined>(undefined);
const [loading, setLoading] = useState(true);
const [error, setError] = useState<string | null>(null);
const { user, redirectToLogin, loading: authLoading } = useAuth();
// Redirect if not authenticated
useEffect(() => {
if (!authLoading && !user) {
redirectToLogin();
}
}, [authLoading, user, redirectToLogin]);
useEffect(() => {
const fetchWorkflow = async () => {
if (!user) return;
try {
const response = await getWorkflowApiV1WorkflowFetchWorkflowIdGet({
path: {
workflow_id: Number(params.workflowId)
},
});
const workflow = response.data;
setWorkflow(workflow);
posthog.capture(PostHogEvent.WORKFLOW_EDITOR_OPENED, {
workflow_id: workflow?.id,
workflow_name: workflow?.name,
});
} catch (err) {
setError('Failed to fetch workflow');
logger.error(`Error fetching workflow: ${err}`);
} finally {
setLoading(false);
}
};
if (user) {
fetchWorkflow();
}
}, [params.workflowId, user]);
const stableUser = useMemo(() => user, [user]);
const openTesterOnLoad = searchParams.get('onboarding') === 'web_call';
if (loading) {
return (
<WorkflowLayout>
<SpinLoader />
</WorkflowLayout>
);
}
else if (error || !workflow) {
return (
<WorkflowLayout showFeaturesNav={false}>
<div className="flex items-center justify-center min-h-screen">
<div className="text-lg text-destructive">{error || 'Workflow not found'}</div>
</div>
</WorkflowLayout>
);
}
else {
return stableUser ? (
<RenderWorkflow
initialWorkflowName={workflow.name}
workflowId={workflow.id}
workflowUuid={workflow.workflow_uuid ?? undefined}
initialTotalRuns={workflow.total_runs ?? 0}
openTesterOnLoad={openTesterOnLoad}
initialFlow={{
nodes: workflow.workflow_definition.nodes as FlowNode[],
edges: workflow.workflow_definition.edges as FlowEdge[],
viewport: { x: 0, y: 0, zoom: 0 }
}}
initialTemplateContextVariables={workflow.template_context_variables as Record<string, string> || {}}
initialWorkflowConfigurations={
workflow.workflow_configurations
? (workflow.workflow_configurations as WorkflowConfigurations)
: undefined
}
initialVersionNumber={workflow.version_number ?? null}
initialVersionStatus={workflow.version_status ?? null}
user={stableUser}
/>
) : null;
}
}