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 { 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 */}

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

ثبت شده :‌
{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_percent || '0')}

درصد به کل درآمد

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

میلیون ریال
{/* Cost Reduction Card */}

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

%{formatNumber(dashboardData.topData?.technology_innovation_based_cost_reduction_percent || '0')}

درصد به کل هزینه

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

میلیون ریال
{/* 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(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;