import { useState, useCallback, useEffect, useMemo } from "react";
import { useNavigate } from "react-router";
import { Masthead } from "../components/Masthead";
import { WorkflowBoard } from "../components/workflow/WorkflowBoard";
import { useContracts } from "../hooks/useContracts";
import { useAuth } from "../contexts/AuthContext";
import type { ContractPhase, ContractStatus } from "../lib/api";
type StatusFilter = "all" | ContractStatus;
export default function WorkflowPage() {
const { isAuthenticated, isAuthConfigured, isLoading: authLoading } = useAuth();
const navigate = useNavigate();
// Redirect to login if not authenticated (when auth is configured)
useEffect(() => {
if (!authLoading && isAuthConfigured && !isAuthenticated) {
navigate("/login");
}
}, [authLoading, isAuthConfigured, isAuthenticated, navigate]);
// Show loading while checking auth
if (authLoading) {
return (
);
}
// Don't render if not authenticated (will redirect)
if (isAuthConfigured && !isAuthenticated) {
return null;
}
return ;
}
function WorkflowPageContent() {
const navigate = useNavigate();
const { contracts, loading, error, changePhase, saveContract } = useContracts();
const [statusFilter, setStatusFilter] = useState("all");
const [isCreating, setIsCreating] = useState(false);
const [newContractName, setNewContractName] = useState("");
// Filter contracts by status
const filteredContracts = useMemo(() => {
if (statusFilter === "all") {
return contracts;
}
return contracts.filter((c) => c.status === statusFilter);
}, [contracts, statusFilter]);
const handleContractClick = useCallback(
(contractId: string) => {
navigate(`/contracts/${contractId}`);
},
[navigate]
);
const handlePhaseChange = useCallback(
async (contractId: string, newPhase: ContractPhase) => {
await changePhase(contractId, newPhase);
},
[changePhase]
);
const handleCreateContract = useCallback(async () => {
if (!newContractName.trim()) return;
const contract = await saveContract({
name: newContractName.trim(),
});
if (contract) {
setNewContractName("");
setIsCreating(false);
navigate(`/contracts/${contract.id}`);
}
}, [newContractName, saveContract, navigate]);
const handleCancelCreate = useCallback(() => {
setNewContractName("");
setIsCreating(false);
}, []);
return (
{error && (
{error}
)}
{/* Header with filter and create button */}
Board
{/* Status filter */}
{(["all", "active", "completed", "archived"] as StatusFilter[]).map(
(status) => (
)
)}
{/* Create contract modal */}
{isCreating && (
)}
{/* Board */}
{loading ? (
) : filteredContracts.length === 0 && statusFilter === "all" ? (
No contracts yet
) : (
)}
);
}