import { MainLayout } from '@/components/layout/MainLayout.tsx'; import PageHeader from '@/components/layout/PageHeader.tsx'; import OrganizationStatistics from '@/components/organization/OrganizationStatistics.tsx'; import ResourceFlowList from '@/components/resource-flow/ResourceFlowList.tsx'; import Button from '@/components/ui/Button.tsx'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/Card.tsx'; import DateRangePicker, { type DateRange } from '@/components/ui/DateRangePicker.tsx'; import MetricItem from '@/components/ui/MetricItem.tsx'; import Spinner from '@/components/ui/Spinner.tsx'; import { Container, Flex, Grid, Stack } from '@/components/ui/layout'; import { useOrganizationStatistics } from '@/hooks/api/useAnalyticsAPI.ts'; import { useOrganization } from '@/hooks/api/useOrganizationsAPI.ts'; import { useProposalsForOrganization } from '@/hooks/api/useProposalsAPI.ts'; import { useTranslation } from '@/hooks/useI18n.tsx'; import { useNavigation } from '@/hooks/useNavigation.tsx'; import { Activity, BarChart3, Briefcase, DollarSign, Leaf, MapPin, Target, TrendingUp, } from 'lucide-react'; import { useEffect, useMemo, useState } from 'react'; import { useNavigate, useParams } from 'react-router-dom'; import { formatCurrency, formatNumber } from '../lib/fin'; const OrganizationDashboardPage = () => { const { id } = useParams<{ id: string }>(); const navigate = useNavigate(); const { t } = useTranslation(); const { handleFooterNavigate } = useNavigation(); // Fetch organization data const { data: organization, isLoading: isLoadingOrg } = useOrganization(id); const { data: stats, isLoading: isLoadingStats } = useOrganizationStatistics(id); const { data: proposalsData } = useProposalsForOrganization(id); const [dateRange, setDateRange] = useState({ startDate: null, endDate: null, preset: '30d', }); useEffect(() => { if (!isLoadingOrg && !organization) { navigate('/map'); } }, [organization, isLoadingOrg, navigate]); // use central fin utilities // Calculate proposals summary const proposalsSummary = useMemo(() => { const incoming = Array.isArray(proposalsData?.incoming) ? proposalsData.incoming : []; const outgoing = Array.isArray(proposalsData?.outgoing) ? proposalsData.outgoing : []; const pendingIncoming = incoming.filter((p) => p?.status === 'pending'); const pendingOutgoing = outgoing.filter((p) => p?.status === 'pending'); return { total: incoming.length + outgoing.length, incoming: incoming.length, outgoing: outgoing.length, pending: pendingIncoming.length + pendingOutgoing.length, pendingIncoming: pendingIncoming.length, pendingOutgoing: pendingOutgoing.length, }; }, [proposalsData]); const isLoading = isLoadingOrg || isLoadingStats; if (isLoading) { return (
); } if (!organization) { return null; } return ( navigate(`/organization/${id}`)} /> {/* Organization Statistics */} {/* Key Metrics Overview */} {stats && ( } label={t('organizationDashboard.totalSites')} value={formatNumber(stats.total_sites)} /> } label={t('organizationDashboard.resourceFlows')} value={formatNumber(stats.total_resource_flows)} /> } label={t('organizationDashboard.activeMatches')} value={formatNumber(stats.active_matches)} /> } label={t('organizationDashboard.totalMatches')} value={formatNumber(stats.total_matches)} /> )} {/* Impact Metrics */} {stats && (stats.co2_savings_tonnes > 0 || stats.economic_value_eur > 0) && (
{t('organizationDashboard.co2Saved')}
{formatNumber(stats.co2_savings_tonnes)} {t('common.tonnes')}

{t('organizationDashboard.totalSavings')}

{t('organizationDashboard.economicValue')}
{formatCurrency(stats.economic_value_eur)}

{t('organizationDashboard.totalValue')}

)} {/* Proposals Summary */} {proposalsSummary.total > 0 && ( {t('organizationDashboard.proposals')}
{proposalsSummary.total}

{t('organizationDashboard.totalProposals')}

{proposalsSummary.pending}

{t('organizationDashboard.pendingProposals')}

{proposalsSummary.incoming}

{t('organizationDashboard.incomingProposals')}

)} {/* Resource Flows */} {t('organizationDashboard.resourceFlows')} {/* Quick Actions */} {t('organizationDashboard.quickActions')}
); }; export default OrganizationDashboardPage;