import { MainLayout } from '@/components/layout/MainLayout.tsx'; import PageHeader from '@/components/layout/PageHeader.tsx'; import Badge from '@/components/ui/Badge.tsx'; import Button from '@/components/ui/Button.tsx'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/Card.tsx'; import { Container, Flex, Grid, Stack } from '@/components/ui/layout'; import Spinner from '@/components/ui/Spinner.tsx'; import MyOrganizations from '@/components/user/MyOrganizations.tsx'; import { useAuth } from '@/contexts/AuthContext.tsx'; import { useUserOrganizations } from '@/hooks/api/useOrganizationsAPI.ts'; import { useProposals } from '@/hooks/api/useProposalsAPI.ts'; import { useTranslation } from '@/hooks/useI18n.tsx'; import { useNavigation } from '@/hooks/useNavigation.tsx'; import type { BackendOrganization } from '@/schemas/backend/organization'; import type { Proposal } from '@/types.ts'; import { Target } from 'lucide-react'; import { useCallback } from 'react'; import { useNavigate } from 'react-router-dom'; const UserDashboard = () => { const { t } = useTranslation(); const { handleBackNavigation, handleFooterNavigate } = useNavigation(); const { user } = useAuth(); const navigate = useNavigate(); // Get all proposals for user's organizations const { data: proposalsData, isLoading: isLoadingProposals } = useProposals(); // Get user's organizations const { data: userOrganizations, isLoading: isLoadingOrganizations } = useUserOrganizations(); const handleSelectOrganization = useCallback( (org: BackendOrganization) => { setSelectedOrg(org); navigate(`/organization/${org.ID}`); }, [navigate] ); const handleAddOrganization = useCallback(() => { navigate('/map'); }, [navigate]); // Safely handle proposals data - ensure it's always an array const proposals: Proposal[] = Array.isArray(proposalsData?.proposals) ? proposalsData.proposals : []; const pendingProposals = Array.isArray(proposals) ? proposals.filter((p) => p?.status === 'pending') : []; return ( {/* Quick Stats */} {t('userDashboard.myOrganizations')} {isLoadingOrganizations ? ( ) : (
{Array.isArray(userOrganizations) ? userOrganizations.length : 0}
)}
{t('userDashboard.pendingProposals')}
{pendingProposals.length}
{t('userDashboard.totalProposals')}
{proposals.length}
{/* My Organizations */} {t('userDashboard.myOrganizations')} {/* Recent Proposals */} {isLoadingProposals ? (
) : proposals.length > 0 ? ( {t('userDashboard.recentProposals')}
{proposals.slice(0, 5).map((proposal: Proposal) => (

{proposal.message || t('userDashboard.proposalNoMessage')}

{t('userDashboard.proposalStatus')}:{' '} {t(`organizationPage.status.${proposal.status}`)}

{t(`organizationPage.status.${proposal.status}`)}
))}
{proposals.length > 5 && (
)}
) : ( {t('userDashboard.recentProposals')}

{t('userDashboard.noProposalsTitle')}

{t('userDashboard.noProposalsDesc')}

)}
); }; export default UserDashboard;