"use client"; import { useState, useEffect, useCallback } from "react"; import { WorkflowFile } from "@/store/workflowStore"; import { getAllPresets } from "@/lib/quickstart/templates"; import { QuickstartBackButton } from "./QuickstartBackButton"; import { CommunityWorkflowMeta } from "@/types/quickstart"; interface QuickstartTemplatesViewProps { onBack: () => void; onWorkflowSelected: (workflow: WorkflowFile) => void; } export function QuickstartTemplatesView({ onBack, onWorkflowSelected, }: QuickstartTemplatesViewProps) { const [communityWorkflows, setCommunityWorkflows] = useState([]); const [isLoadingList, setIsLoadingList] = useState(true); const [loadingWorkflowId, setLoadingWorkflowId] = useState(null); const [error, setError] = useState(null); const presets = getAllPresets(); // Fetch community workflows on mount useEffect(() => { async function fetchCommunityWorkflows() { try { const response = await fetch("/api/community-workflows"); const result = await response.json(); if (result.success) { setCommunityWorkflows(result.workflows); } else { console.error("Failed to fetch community workflows:", result.error); } } catch (err) { console.error("Error fetching community workflows:", err); } finally { setIsLoadingList(false); } } fetchCommunityWorkflows(); }, []); const handlePresetSelect = useCallback( async (templateId: string) => { setLoadingWorkflowId(templateId); setError(null); try { const response = await fetch("/api/quickstart", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ templateId, contentLevel: "full", }), }); const result = await response.json(); if (!result.success) { throw new Error(result.error || "Failed to load template"); } if (result.workflow) { onWorkflowSelected(result.workflow); } } catch (err) { console.error("Error loading preset:", err); setError(err instanceof Error ? err.message : "Failed to load template"); } finally { setLoadingWorkflowId(null); } }, [onWorkflowSelected] ); const handleCommunitySelect = useCallback( async (workflowId: string) => { setLoadingWorkflowId(workflowId); setError(null); try { // Step 1: Get presigned download URL from API const response = await fetch(`/api/community-workflows/${workflowId}`); const result = await response.json(); if (!result.success || !result.downloadUrl) { throw new Error(result.error || "Failed to get download URL"); } // Step 2: Download workflow directly from R2 const workflowResponse = await fetch(result.downloadUrl); if (!workflowResponse.ok) { throw new Error("Failed to download workflow"); } const workflow = await workflowResponse.json(); onWorkflowSelected(workflow); } catch (err) { console.error("Error loading community workflow:", err); setError(err instanceof Error ? err.message : "Failed to load workflow"); } finally { setLoadingWorkflowId(null); } }, [onWorkflowSelected] ); const isLoading = loadingWorkflowId !== null; return (
{/* Header */}

Workflow Templates

{/* Content */}
{/* Description */}

Pre-built workflows to help you get started quickly. Select a template to load it into the canvas.

{/* Quick Start Templates */}

Quick Start

{presets.map((preset) => ( ))}
{/* Divider */}
{/* Community Workflows */}

Community Workflows

{isLoadingList ? (
) : communityWorkflows.length === 0 ? (

No community workflows available

) : (
{communityWorkflows.map((workflow) => ( ))}
)} {/* Discord CTA */}

Want to share your workflow?{" "} Join our Discord {" "} to submit it to the community templates.

{/* Error */} {error && (

{error}

)}
); }