import React, { useCallback, useMemo, useState } from 'react'; import { useProposalsForOrganization, useUpdateProposalStatus, } from '@/hooks/api/useProposalsAPI.ts'; import { useTranslation } from '@/hooks/useI18n.tsx'; import { useOrganizations } from '@/hooks/useOrganizations.ts'; import { Organization } from '@/types.ts'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/Tabs.tsx'; import ProposalCard from '@/components/organization/ProposalCard.tsx'; interface ProposalListProps { organization: Organization; } const ProposalList = ({ organization }: ProposalListProps) => { const { t } = useTranslation(); const { organizations } = useOrganizations(); const { data: proposalsData, isLoading } = useProposalsForOrganization(organization.ID); const updateProposalStatus = useUpdateProposalStatus(); const [activeTab, setActiveTab] = useState('incoming'); // Memoize proposals arrays to prevent unnecessary recalculations const incoming = useMemo( () => (Array.isArray(proposalsData?.incoming) ? proposalsData.incoming : []), [proposalsData] ); const outgoing = useMemo( () => (Array.isArray(proposalsData?.outgoing) ? proposalsData.outgoing : []), [proposalsData] ); // Memoize findOrg function to prevent recreation const findOrg = useCallback( (id: string) => { if (!id || !organizations || !Array.isArray(organizations)) return undefined; return organizations.find((o) => o?.ID === id); }, [organizations] ); // Memoize status update handler const handleStatusUpdate = useCallback( (id: string, status: 'pending' | 'accepted' | 'rejected') => { updateProposalStatus.mutate({ id, status }); }, [updateProposalStatus] ); const renderProposalList = useCallback( (proposals: typeof incoming, type: 'incoming' | 'outgoing') => { if (isLoading) { return
{t('common.loading')}
; } if (!Array.isArray(proposals) || proposals.length === 0) { return ({t('organizationPage.partnershipHub.noProposals')}
); } return (