mirror of
https://github.com/dograh-hq/dograh.git
synced 2026-07-07 11:02:12 +02:00
106 lines
4 KiB
TypeScript
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;
|
|
}
|
|
}
|