"use client"; import { useState } from "react"; import { useRouter } from "next/navigation"; import { motion, AnimatePresence } from "framer-motion"; import { Search, Plus, Filter, SlidersHorizontal, Leaf, Calendar, AlertTriangle, Loader2 } from "lucide-react"; import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription } from "@/components/ui/dialog"; import { Separator } from "@/components/ui/separator"; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuLabel, } from "@/components/ui/dropdown-menu"; import { Badge } from "@/components/ui/badge"; import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; import { FarmCard } from "./farm-card"; import { AddFarmForm } from "./add-farm-form"; import type { Farm } from "@/types"; import { fetchFarms, createFarm } from "@/api/farm"; export default function FarmSetupPage() { const router = useRouter(); const queryClient = useQueryClient(); const [searchQuery, setSearchQuery] = useState(""); const [activeFilter, setActiveFilter] = useState("all"); const [sortOrder, setSortOrder] = useState<"newest" | "oldest" | "alphabetical">("newest"); const [isDialogOpen, setIsDialogOpen] = useState(false); const { data: farms, isLoading, isError, error, } = useQuery({ queryKey: ["farms"], queryFn: fetchFarms, staleTime: 60 * 1000, }); const mutation = useMutation({ mutationFn: (data: Partial) => createFarm(data), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["farms"] }); setIsDialogOpen(false); }, }); const filteredAndSortedFarms = (farms || []) .filter( (farm) => (activeFilter === "all" || farm.type === activeFilter) && (farm.name.toLowerCase().includes(searchQuery.toLowerCase()) || farm.location.toLowerCase().includes(searchQuery.toLowerCase()) || farm.type.toLowerCase().includes(searchQuery.toLowerCase())) ) .sort((a, b) => { if (sortOrder === "newest") { return new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime(); } else if (sortOrder === "oldest") { return new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime(); } else { return a.name.localeCompare(b.name); } }); // Get distinct farm types. const farmTypes = ["all", ...new Set((farms || []).map((farm) => farm.type))]; const handleAddFarm = async (data: Partial) => { await mutation.mutateAsync(data); }; return (
{/* Header */}

Your Farms

Manage and monitor all your agricultural properties

setSearchQuery(e.target.value)} />
{/* Filtering and sorting controls */}
{farmTypes.map((type) => ( setActiveFilter(type)}> {type === "all" ? "All Farms" : type} ))}
Sort by setSortOrder("newest")}> Newest first {sortOrder === "newest" && } setSortOrder("oldest")}> Oldest first {sortOrder === "oldest" && } setSortOrder("alphabetical")}> Alphabetical {sortOrder === "alphabetical" && }
{/* Error state */} {isError && ( Error {(error as Error)?.message} )} {/* Loading state */} {isLoading && (

Loading your farms...

)} {/* Empty state */} {!isLoading && !isError && filteredAndSortedFarms.length === 0 && (

No farms found

{searchQuery || activeFilter !== "all" ? (

No farms match your current filters. Try adjusting your search or filters.

) : (

You haven't added any farms yet. Get started by adding your first farm.

)}
)} {/* Grid of farm cards */} {!isLoading && !isError && filteredAndSortedFarms.length > 0 && (
setIsDialogOpen(true)} /> {filteredAndSortedFarms.map((farm, index) => ( router.push(`/farms/${farm.id}`)} /> ))}
)}
{/* Add Farm Dialog */} Add New Farm Fill out the details below to add a new farm to your account. setIsDialogOpen(false)} />
); } /** * A helper component for the Check icon. */ function Check({ className }: { className?: string }) { return ( ); }