From 9219590d64fa69b4db6b75ba98d5f673c438e6f4 Mon Sep 17 00:00:00 2001 From: Ramnique Singh <30795890+ramnique@users.noreply.github.com> Date: Mon, 18 Aug 2025 13:51:28 +0530 Subject: [PATCH] load /workflow from backend --- .../app/projects/[projectId]/workflow/app.tsx | 67 ++++++++----------- .../projects/[projectId]/workflow/page.tsx | 26 ++++++- 2 files changed, 52 insertions(+), 41 deletions(-) diff --git a/apps/rowboat/app/projects/[projectId]/workflow/app.tsx b/apps/rowboat/app/projects/[projectId]/workflow/app.tsx index 081768db..1044810f 100644 --- a/apps/rowboat/app/projects/[projectId]/workflow/app.tsx +++ b/apps/rowboat/app/projects/[projectId]/workflow/app.tsx @@ -1,5 +1,4 @@ "use client"; -import { MCPServer, WithStringId } from "../../../lib/types/types"; import { DataSource } from "@/src/entities/models/data-source"; import { Project } from "@/src/entities/models/project"; import { z } from "zod"; @@ -9,12 +8,13 @@ import { Spinner } from "@heroui/react"; import { listDataSources } from "../../../actions/data-source.actions"; import { revertToLiveWorkflow } from "@/app/actions/project.actions"; import { fetchProject } from "@/app/actions/project.actions"; -import { Workflow, WorkflowTool } from "@/app/lib/types/workflow_types"; -import { getEligibleModels } from "@/app/actions/billing.actions"; +import { Workflow } from "@/app/lib/types/workflow_types"; import { ModelsResponse } from "@/app/lib/types/billing_types"; export function App({ - projectId, + initialProjectData, + initialDataSources, + eligibleModels, useRag, useRagUploads, useRagS3Uploads, @@ -22,7 +22,9 @@ export function App({ defaultModel, chatWidgetHost, }: { - projectId: string; + initialProjectData: z.infer; + initialDataSources: z.infer[]; + eligibleModels: z.infer | "*"; useRag: boolean; useRagUploads: boolean; useRagS3Uploads: boolean; @@ -31,11 +33,9 @@ export function App({ chatWidgetHost: string; }) { const [mode, setMode] = useState<'draft' | 'live'>('draft'); - const [project, setProject] = useState | null>(null); - const [dataSources, setDataSources] = useState[] | null>(null); - const [projectConfig, setProjectConfig] = useState | null>(null); + const [project, setProject] = useState>(initialProjectData); + const [dataSources, setDataSources] = useState[]>(initialDataSources); const [loading, setLoading] = useState(false); - const [eligibleModels, setEligibleModels] = useState | "*">("*"); console.log('workflow app.tsx render'); @@ -45,44 +45,39 @@ export function App({ workflow = project?.liveWorkflow; } - const loadData = useCallback(async () => { + const reloadData = useCallback(async () => { setLoading(true); const [ - project, - dataSources, - eligibleModels, + projectData, + sourcesData, ] = await Promise.all([ - fetchProject(projectId), - listDataSources(projectId), - getEligibleModels(), + fetchProject(initialProjectData.id), + listDataSources(initialProjectData.id), ]); - setProject(project); - setDataSources(dataSources); - setEligibleModels(eligibleModels); + setProject(projectData); + setDataSources(sourcesData); setLoading(false); - }, [projectId]); + }, [initialProjectData.id]); const handleProjectToolsUpdate = useCallback(async () => { // Lightweight refresh for tool-only updates - const projectConfig = await fetchProject(projectId); + const projectConfig = await fetchProject(initialProjectData.id); setProject(projectConfig); - setProjectConfig(projectConfig); - }, [projectId]); + }, [initialProjectData.id]); const handleDataSourcesUpdate = useCallback(async () => { // Refresh data sources - const updatedDataSources = await listDataSources(projectId); + const updatedDataSources = await listDataSources(initialProjectData.id); setDataSources(updatedDataSources); - }, [projectId]); + }, [initialProjectData.id]); const handleProjectConfigUpdate = useCallback(async () => { // Refresh project config when project name or other settings change - const updatedProjectConfig = await fetchProject(projectId); + const updatedProjectConfig = await fetchProject(initialProjectData.id); setProject(updatedProjectConfig); - setProjectConfig(updatedProjectConfig); - }, [projectId]); + }, [initialProjectData.id]); // Auto-update data sources when there are pending ones useEffect(() => { @@ -92,7 +87,7 @@ export function App({ if (!hasPendingSources) return; const interval = setInterval(async () => { - const updatedDataSources = await listDataSources(projectId); + const updatedDataSources = await listDataSources(initialProjectData.id); setDataSources(updatedDataSources); // Stop polling if no more pending sources @@ -103,11 +98,7 @@ export function App({ }, 7000); // Poll every 7 seconds (reduced from 3) return () => clearInterval(interval); - }, [dataSources, projectId]); - // Add this useEffect for initial load - useEffect(() => { - loadData(); - }, [mode, loadData, projectId]); + }, [dataSources, initialProjectData.id]); function handleSetMode(mode: 'draft' | 'live') { setMode(mode); @@ -115,8 +106,8 @@ export function App({ async function handleRevertToLive() { setLoading(true); - await revertToLiveWorkflow(projectId); - loadData(); + await revertToLiveWorkflow(initialProjectData.id); + reloadData(); } // if workflow is null, show the selector @@ -128,11 +119,11 @@ export function App({ } {!loading && !workflow &&
No workflow found!
} {!loading && project && workflow && (dataSources !== null) && ('projectsRepository'); +const dataSourceRepository = container.resolve('dataSourcesRepository'); const DEFAULT_MODEL = process.env.PROVIDER_DEFAULT_MODEL || "gpt-4.1"; @@ -20,18 +25,33 @@ export default async function Page( } ) { const params = await props.params; - await requireActiveBillingSubscription(); + const customer = await requireActiveBillingSubscription(); console.log('->>> workflow page being rendered'); const project = await projectsRepository.fetch(params.projectId); if (!project) { notFound(); } + const sources = []; + let cursor = undefined; + do { + const result = await dataSourceRepository.list(project.id, undefined, cursor); + sources.push(...result.items); + cursor = result.nextCursor; + } while (cursor); + + let eligibleModels: z.infer | "*" = '*'; + if (USE_BILLING) { + eligibleModels = await getEligibleModels(customer._id); + } + console.log('/workflow page.tsx serve'); return (