import { useState, useEffect, useRef, useCallback } from "react" import { useNavigate, Link } from "react-router" import { Plus, Search, Filter, ArrowUpDown, Loader2 } from "lucide-react" import { Navbar } from "@/components/shared/navbar" import { Footer } from "@/components/shared/footer" import { FormInput } from "@/components/shared/form-input" import { FormButton } from "@/components/shared/form-button" import { FormCard } from "@/components/forms/form-card" import { useAuth } from "@/app/context/auth-context" import { getForms } from "@/lib/api" import type { FormSummary } from "@/lib/types" type StatusFilter = "all" | "has_responses" | "no_responses" type SortBy = "created_at" | "updated_at" type SortDir = "newest" | "oldest" const DEBOUNCE_MS = 400 export default function FormsPage() { const { user, loading } = useAuth() const navigate = useNavigate() const [search, setSearch] = useState("") const [statusFilter, setStatusFilter] = useState("all") const [sortBy, setSortBy] = useState("created_at") const [sortDir, setSortDir] = useState("newest") const [forms, setForms] = useState([]) const [totalForms, setTotalForms] = useState(0) const [loadingForms, setLoadingForms] = useState(true) const [error, setError] = useState(null) const debounceRef = useRef | null>(null) const isInitialLoad = useRef(true) useEffect(() => { if (!loading && !user) { navigate("/login") } }, [user, loading, navigate]) const fetchForms = useCallback(async (params: { search: string statusFilter: StatusFilter sortBy: SortBy sortDir: SortDir }) => { setError(null) setLoadingForms(true) try { const data = await getForms({ search: params.search || undefined, status: params.statusFilter === "all" ? undefined : params.statusFilter, sort_by: params.sortBy, sort_dir: params.sortDir, }) setForms(data) if (isInitialLoad.current) { setTotalForms(data.length) isInitialLoad.current = false } } catch { setError("Failed to load forms. Please try again.") } finally { setLoadingForms(false) } }, []) useEffect(() => { if (!user) return fetchForms({ search, statusFilter, sortBy, sortDir }) }, [user]) useEffect(() => { if (!user || isInitialLoad.current) return if (debounceRef.current) clearTimeout(debounceRef.current) debounceRef.current = setTimeout(() => { fetchForms({ search, statusFilter, sortBy, sortDir }) }, DEBOUNCE_MS) return () => { if (debounceRef.current) clearTimeout(debounceRef.current) } }, [search, statusFilter, sortBy, sortDir, user, fetchForms]) const hasActiveFilters = search !== "" || statusFilter !== "all" function clearAllFilters() { setSearch("") setStatusFilter("all") setSortBy("created_at") setSortDir("newest") } if (loading || loadingForms) { return (

Loading...

) } if (!user) return null return (

My Forms

Manage and preview all your forms in one place

New Form
setSearch(e.target.value)} className="pl-9" />

{loadingForms ? ( Searching... ) : ( <>Showing {forms.length}{totalForms > 0 ? ` of ${totalForms}` : ""} forms )}

{hasActiveFilters && ( )}
{error ? (

{error}

window.location.reload()} > Retry
) : forms.length > 0 ? (
{forms.map((form) => ( ))}
) : (

No forms found matching your criteria.

Clear filters
)}
) }