import React, { useState, useEffect } from "react"; import { DashboardLayout } from "./layout"; import { Card, CardContent, CardHeader, CardTitle } from "~/components/ui/card"; import { Progress } from "~/components/ui/progress"; import { Badge } from "~/components/ui/badge"; import { Button } from "~/components/ui/button"; import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, LineChart, Line, } from "recharts"; import apiService from "~/lib/api"; import toast from "react-hot-toast"; import { Calendar, TrendingUp, TrendingDown, Target, Lightbulb, DollarSign, Minus, CheckCircle, BookOpen, } from "lucide-react"; import { Tabs, TabsList, TabsTrigger, TabsContent } from "~/components/ui/tabs"; import { CustomBarChart } from "~/components/ui/custom-bar-chart"; import { DashboardCustomBarChart } from "./dashboard-custom-bar-chart"; import { Label, PolarGrid, PolarRadiusAxis, RadialBar, RadialBarChart, } from "recharts"; import { ChartContainer } from "~/components/ui/chart"; import { formatNumber } from "~/lib/utils"; export function DashboardHome() { const [dashboardData, setDashboardData] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { fetchDashboardData(); }, []); const fetchDashboardData = async () => { try { setLoading(true); setError(null); // First authenticate if needed const token = localStorage.getItem("auth_token"); if (!token) { await apiService.login("inogen_admin", "123456"); } // Fetch top cards data const topCardsResponse = await apiService.call({ main_page_first_function: {}, }); // Fetch left section data const leftCardsResponse = await apiService.call({ main_page_second_function: {}, }); const topCardsResponseData = JSON.parse(topCardsResponse?.data); const leftCardsResponseData = JSON.parse(leftCardsResponse?.data); console.log("API Responses:", { topCardsResponseData, leftCardsResponseData, }); // Use real API data structure with English keys const topData = topCardsResponseData || {}; const leftData = leftCardsResponseData || {}; const realData = { topData: topData, leftData: leftData, chartData: leftCardsResponseData?.chartData || [], }; setDashboardData(realData); } catch (error) { console.error("Error fetching dashboard data:", error); const errorMessage = error instanceof Error ? error.message : "خطای نامشخص"; setError(`خطا در بارگذاری داده‌ها: ${errorMessage}`); toast.error(`خطا در بارگذاری داده‌ها: ${errorMessage}`); } finally { setLoading(false); } }; // RadialBarChart data for ideas visualization const getIdeasChartData = () => { if (!dashboardData?.topData) return [{ browser: "safari", visitors: 0, fill: "var(--color-safari)" }]; const registered = parseFloat( dashboardData.topData.registered_innovation_technology_idea || "0", ); const ongoing = parseFloat( dashboardData.topData.ongoing_innovation_technology_ideas || "0", ); const percentage = registered > 0 ? Math.round((ongoing / registered) * 100) : 0; return [ { browser: "safari", visitors: percentage, fill: "var(--color-safari)" }, ]; }; const chartData = getIdeasChartData(); const chartConfig = { visitors: { label: "Ideas Progress", }, safari: { label: "Safari", color: "var(--chart-2)", }, }; if (loading) { return (
); } if (error || !dashboardData) { return (

خطا در بارگذاری داده‌ها

{error || "خطای نامشخص در بارگذاری داده‌های داشبورد رخ داده است"}

); } return (
{/* Top Cards Row - Redesigned to match other components */}
{/* Ideas Card */}

ایده‌های فناوری و نوآوری

0 ? Math.round( (parseFloat( dashboardData.topData ?.ongoing_innovation_technology_ideas || "0", ) / parseFloat( dashboardData.topData ?.registered_innovation_technology_idea || "1", )) * 100, ) : 0, fill: "green", }, ]} startAngle={90} endAngle={ 90 + ((parseFloat( dashboardData.topData ?.registered_innovation_technology_idea || "0", ) > 0 ? Math.round( (parseFloat( dashboardData.topData ?.ongoing_innovation_technology_ideas || "0", ) / parseFloat( dashboardData.topData ?.registered_innovation_technology_idea || "1", )) * 100, ) : 0) / 100) * 360 } innerRadius={35} outerRadius={55} >
ثبت شده :
{formatNumber( dashboardData.topData ?.registered_innovation_technology_idea || "0", )}
در حال اجرا :
{formatNumber( dashboardData.topData ?.ongoing_innovation_technology_ideas || "0", )}
{/* Revenue Card */}

افزایش درآمد مبتنی بر فناوری و نوآوری

{formatNumber( dashboardData.topData ?.technology_innovation_based_revenue_growth || "0", )}

میلیون ریال
/

{formatNumber( Math.round( dashboardData.topData ?.technology_innovation_based_revenue_growth_percent, ) || "0", )} %

درصد به کل درآمد
{/* Cost Reduction Card */}

کاهش هزینه ها مبتنی بر فناوری و نوآوری

{formatNumber( Math.round( parseFloat( dashboardData.topData?.technology_innovation_based_cost_reduction?.replace( /,/g, "", ) || "0", ) / 1000000, ), )}

میلیون ریال
/

{formatNumber( Math.round( dashboardData.topData ?.technology_innovation_based_cost_reduction_percent, ) || "0", )} %

درصد به کل هزینه
{/* Budget Ratio Card */}

نسبت تحقق بودجه فناوی و نوآوری

مصوب :
{formatNumber( Math.round( parseFloat( dashboardData.topData?.approved_innovation_budget_achievement_ratio?.replace( /,/g, "", ) || "0", ) / 1000000000, ), )}
جذب شده :
{formatNumber( Math.round( parseFloat( dashboardData.topData?.allocated_innovation_budget_achievement_ratio?.replace( /,/g, "", ) || "0", ) / 1000000000, ), )}
{/* Main Content with Tabs */} مقایسه ای شماتیک
{/* Right Section - Charts */}
{/* Main Chart */} تحلیل ارزش‌ها

نمودار مقایسه‌ای عملکرد ماهانه

{/* Left Section - Status Cards */}
{/* Technology Intensity */}
شدت فناوری

% {formatNumber( Math.round( dashboardData.leftData?.technology_intensity || 0, ), )}

{/* Program Status */} {/* Publications */} انتشارات فناوری و نوآوری
کتاب:
{formatNumber( dashboardData.leftData?.printed_books_count || "0", )}
پتنت:
{formatNumber( dashboardData.leftData?.registered_patents_count || "0", )}
گزارش:
{formatNumber( dashboardData.leftData?.published_reports_count || "0", )}
مقاله:
{formatNumber( dashboardData.leftData?.printed_articles_count || "0", )}
{/* Promotion */} ترویج فناوری و نوآوری
کنفرانس:
{formatNumber( dashboardData.leftData?.attended_conferences_count || "0", )}
شرکت در رویداد:
{formatNumber( dashboardData.leftData?.attended_events_count || "0", )}
نمایشگاه:
{formatNumber( dashboardData.leftData?.attended_exhibitions_count || "0", )}
برگزاری رویداد:
{formatNumber( dashboardData.leftData?.organized_events_count || "0", )}
); } export default DashboardHome;