mirror of
https://github.com/ForFarmTeam/ForFarm.git
synced 2025-12-18 21:44:08 +01:00
115 lines
4.4 KiB
TypeScript
115 lines
4.4 KiB
TypeScript
// components/PriceAnalyticsCard.tsx
|
|
"use client";
|
|
|
|
import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card";
|
|
import { Button } from "@/components/ui/button";
|
|
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select";
|
|
import { RefreshCw } from "lucide-react";
|
|
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
|
|
import PriceAnalytics from "./PriceAnalytics";
|
|
import MarketComparisonTab from "./MarketComparisonTab";
|
|
import DemandAnalysis from "./DemandAnalysis";
|
|
|
|
interface PriceAnalyticsCardProps {
|
|
isLoading: boolean;
|
|
selectedCrop: string;
|
|
timeRange: string;
|
|
lastUpdated: Date;
|
|
onSelectCrop: (crop: string) => void;
|
|
onTimeRangeChange: (value: string) => void;
|
|
onRefresh: () => void;
|
|
historicalData: any;
|
|
marketComparison: any;
|
|
}
|
|
|
|
export default function PriceAnalyticsCard({
|
|
isLoading,
|
|
selectedCrop,
|
|
timeRange,
|
|
lastUpdated,
|
|
onSelectCrop,
|
|
onTimeRangeChange,
|
|
onRefresh,
|
|
historicalData,
|
|
marketComparison,
|
|
}: PriceAnalyticsCardProps) {
|
|
return (
|
|
<Card className="md:col-span-3">
|
|
<CardHeader className="pb-2">
|
|
<div className="flex flex-col md:flex-row justify-between md:items-center gap-4">
|
|
<div>
|
|
<CardTitle>Price Analytics</CardTitle>
|
|
<CardDescription>Track price trends and market movements</CardDescription>
|
|
</div>
|
|
<div className="flex flex-col sm:flex-row gap-2">
|
|
<Select value={selectedCrop} onValueChange={onSelectCrop}>
|
|
<SelectTrigger className="w-[180px]">
|
|
<SelectValue placeholder="Select crop" />
|
|
</SelectTrigger>
|
|
<SelectContent>
|
|
<SelectItem value="Corn">Corn</SelectItem>
|
|
<SelectItem value="Wheat">Wheat</SelectItem>
|
|
<SelectItem value="Soybeans">Soybeans</SelectItem>
|
|
<SelectItem value="Rice">Rice</SelectItem>
|
|
<SelectItem value="Potatoes">Potatoes</SelectItem>
|
|
<SelectItem value="Tomatoes">Tomatoes</SelectItem>
|
|
<SelectItem value="Apples">Apples</SelectItem>
|
|
<SelectItem value="Oranges">Oranges</SelectItem>
|
|
</SelectContent>
|
|
</Select>
|
|
|
|
<Select value={timeRange} onValueChange={onTimeRangeChange}>
|
|
<SelectTrigger className="w-[140px]">
|
|
<SelectValue placeholder="Time range" />
|
|
</SelectTrigger>
|
|
<SelectContent>
|
|
<SelectItem value="7">7 days</SelectItem>
|
|
<SelectItem value="14">14 days</SelectItem>
|
|
<SelectItem value="30">30 days</SelectItem>
|
|
<SelectItem value="90">90 days</SelectItem>
|
|
</SelectContent>
|
|
</Select>
|
|
</div>
|
|
</div>
|
|
</CardHeader>
|
|
<CardContent>
|
|
{isLoading ? (
|
|
<div className="w-full h-[300px] flex items-center justify-center">
|
|
<div className="text-center">
|
|
<RefreshCw className="h-8 w-8 animate-spin mx-auto text-primary/70" />
|
|
<p className="mt-2 text-sm text-muted-foreground">Loading market data...</p>
|
|
</div>
|
|
</div>
|
|
) : (
|
|
<Tabs defaultValue="price">
|
|
<TabsList className="mb-4">
|
|
<TabsTrigger value="price" className="gap-1">
|
|
Price Trend
|
|
</TabsTrigger>
|
|
<TabsTrigger value="comparison" className="gap-1">
|
|
Market Comparison
|
|
</TabsTrigger>
|
|
<TabsTrigger value="demand" className="gap-1">
|
|
Demand Analysis
|
|
</TabsTrigger>
|
|
</TabsList>
|
|
<TabsContent value="price" className="mt-0">
|
|
<PriceAnalytics historicalData={historicalData} isLoading={isLoading} selectedCrop={selectedCrop} />
|
|
</TabsContent>
|
|
<TabsContent value="comparison" className="mt-0">
|
|
<MarketComparisonTab
|
|
marketComparison={marketComparison}
|
|
selectedCrop={selectedCrop}
|
|
onSelectCrop={onSelectCrop}
|
|
/>
|
|
</TabsContent>
|
|
<TabsContent value="demand" className="mt-0">
|
|
<DemandAnalysis selectedCrop={selectedCrop} marketComparison={marketComparison} />
|
|
</TabsContent>
|
|
</Tabs>
|
|
)}
|
|
</CardContent>
|
|
</Card>
|
|
);
|
|
}
|