"use client" import { useState, useEffect } from "react" import Link from "next/link" import { useUser } from "@stackframe/stack" import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card" import { Button } from "@/components/ui/button" import { Badge } from "@/components/ui/badge" import { Input } from "@/components/ui/input" import { Workflow, Search, Play, Star, User, Plus, Loader2, ArrowRight, Sparkles, Lock, Globe } from "lucide-react" interface WorkflowItem { id: string slug: string name: string description: string | null steps: { name: string }[] totalRuns: number starsCount: number visibility: string creatorId: string | null } // Featured workflow templates const FEATURED_TEMPLATES = [ { name: "Blog Post Creator", description: "Generate a complete blog post from a topic - research, write, and optimize", steps: 3, category: "Content" }, { name: "Social Media Campaign", description: "Create cohesive content for Twitter, LinkedIn, and Instagram", steps: 4, category: "Marketing" }, { name: "Product Launch Kit", description: "Generate product description, email, and social posts", steps: 3, category: "Business" }, { name: "Research & Summary", description: "Research a topic, summarize key points, create presentation", steps: 3, category: "Research" }, ] export function WorkflowLibrary() { const user = useUser() const [workflows, setWorkflows] = useState([]) const [myWorkflows, setMyWorkflows] = useState([]) const [loading, setLoading] = useState(true) const [loadingMy, setLoadingMy] = useState(true) const [searchQuery, setSearchQuery] = useState("") // Fetch public workflows useEffect(() => { const fetchWorkflows = async () => { try { const response = await fetch('/api/workflows?visibility=public&limit=20') if (response.ok) { const data = await response.json() setWorkflows(data.workflows || []) } } catch (error) { console.error('Failed to fetch workflows:', error) } finally { setLoading(false) } } fetchWorkflows() }, []) // Fetch user's own workflows (including private) useEffect(() => { const fetchMyWorkflows = async () => { if (!user?.id) { setLoadingMy(false) return } try { const response = await fetch(`/api/workflows?creatorId=${user.id}&limit=50`) if (response.ok) { const data = await response.json() setMyWorkflows(data.workflows || []) } } catch (error) { console.error('Failed to fetch my workflows:', error) } finally { setLoadingMy(false) } } fetchMyWorkflows() }, [user?.id]) const filteredWorkflows = workflows.filter(w => w.name.toLowerCase().includes(searchQuery.toLowerCase()) || w.description?.toLowerCase().includes(searchQuery.toLowerCase()) ) const filteredMyWorkflows = myWorkflows.filter(w => w.name.toLowerCase().includes(searchQuery.toLowerCase()) || w.description?.toLowerCase().includes(searchQuery.toLowerCase()) ) return (
{/* Hero */}

Workflow Library

Discover and use community-created prompt chains

{/* Actions */}
{/* Search */}
setSearchQuery(e.target.value)} className="pl-10" />
{/* My Workflows Section (for logged in users) */} {user && (

My Workflows

{loadingMy ? (
) : filteredMyWorkflows.length > 0 ? (
{filteredMyWorkflows.map((workflow) => (

{workflow.name}

{workflow.visibility === "public" ? ( ) : ( )} {workflow.visibility}
{workflow.description && (

{workflow.description}

)}
{(workflow.steps as any[])?.length || 0} steps {workflow.totalRuns} {workflow.starsCount}
))}
) : (

You haven't created any workflows yet.

)}
)} {/* Featured Templates */}

Featured Templates

{FEATURED_TEMPLATES.map((template, index) => ( {template.category}

{template.name}

{template.description}

{template.steps} steps
))}
{/* Community Workflows */}

Community Workflows

{loading ? (
) : filteredWorkflows.length > 0 ? (
{filteredWorkflows.map((workflow) => (

{workflow.name}

{(workflow.steps as any[])?.length || 0} steps
{workflow.description && (

{workflow.description}

)}
{workflow.totalRuns} {workflow.starsCount}
))}
) : (

No Public Workflows Yet

Be the first to share a workflow with the community!

)}
) }