import React, { useState, useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; import { FaPlus, FaCalendarAlt, FaEdit, FaTrash, FaPlayCircle, FaRegClock, FaFlask, FaMicrophone, FaHeadphones, FaPodcast, FaCheck } from 'react-icons/fa'; import { MdOutlineWorkspaces } from 'react-icons/md'; import { TiFlowMerge } from 'react-icons/ti'; import './Workflows.css'; const Workflows = () => { const navigate = useNavigate(); const [workflows, setWorkflows] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [deleteConfirmId, setDeleteConfirmId] = useState(null); useEffect(() => { fetchWorkflows(); }, []); const fetchWorkflows = async () => { try { const token = localStorage.getItem('token'); const response = await fetch('http://localhost:8000/api/workflows', { headers: { 'Authorization': `Bearer ${token}` } }); if (!response.ok) { throw new Error('Failed to fetch workflows'); } const data = await response.json(); setWorkflows(data); setLoading(false); } catch (err) { console.error('Error fetching workflows:', err); setError(err.message); setLoading(false); } }; const handleWorkflowClick = (workflowId) => { navigate(`/workflows/workflow/${workflowId}`); }; const handleCreateWorkflow = () => { // Use -1 to indicate a new workflow navigate(`/workflows/workflow/-1`); }; const handleDeleteClick = (e, workflowId) => { e.stopPropagation(); // Prevent workflow card click setDeleteConfirmId(workflowId); }; const handleDeleteConfirm = async (e, workflowId) => { e.stopPropagation(); // Prevent workflow card click try { const token = localStorage.getItem('token'); const response = await fetch(`http://localhost:8000/api/workflows/${workflowId}`, { method: 'DELETE', headers: { 'Authorization': `Bearer ${token}` } }); if (!response.ok) { throw new Error('Failed to delete workflow'); } // Remove from state setWorkflows(workflows.filter(w => w.id !== workflowId)); setDeleteConfirmId(null); } catch (err) { console.error('Error deleting workflow:', err); setError(err.message); } }; const handleDeleteCancel = (e) => { e.stopPropagation(); // Prevent workflow card click setDeleteConfirmId(null); }; const getRandomGradient = () => { const gradients = [ 'linear-gradient(135deg, #6366F1, #8B5CF6)', 'linear-gradient(135deg, #3B82F6, #6366F1)', 'linear-gradient(135deg, #10B981, #3B82F6)', 'linear-gradient(135deg, #F59E0B, #10B981)', 'linear-gradient(135deg, #EF4444, #F59E0B)', 'linear-gradient(135deg, #EC4899, #8B5CF6)', 'linear-gradient(135deg, #8B5CF6, #EC4899)', 'linear-gradient(135deg, #6366F1, #EC4899)' ]; return gradients[Math.floor(Math.random() * gradients.length)]; }; const formatDate = (dateString) => { const date = new Date(dateString); return new Intl.DateTimeFormat('en-US', { month: 'short', day: 'numeric', year: 'numeric' }).format(date); }; if (loading) { return (
Loading your workflows...
); } if (error) { return (
⚠️ Error: {error}
); } return (

Your Podcast Workflows

Manage and edit your podcast workflow templates

{workflows.length} Workflows
{workflows.length === 0 ? (

No Workflows Yet

You haven't created any workflows yet. Click the "New Workflow" button to get started!

) : ( workflows.map((workflow) => (
handleWorkflowClick(workflow.id)} style={{ '--card-gradient': getRandomGradient() }} >
{deleteConfirmId === workflow.id ? (
) : ( )}

{workflow.name}

{workflow.description || 'No description available'}

{formatDate(workflow.created_at)}
Last edited: {formatDate(workflow.updated_at || workflow.created_at)}
{workflow.insights ? ( Ready ) : ( Draft )}
)) )}
); }; export default Workflows;