import ResourceFlowCard from '@/components/resource-flow/ResourceFlowCard'; import Button from '@/components/ui/Button'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/Card'; import { Flex, Stack } from '@/components/ui/layout'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/Tabs'; import { useResourceFlowsByOrganization } from '@/hooks/api'; import { useTranslation } from '@/hooks/useI18n'; import type { ResourceDirection } from '@/schemas/backend/resource-flow'; import { Plus } from 'lucide-react'; import React, { useMemo, useState } from 'react'; interface ResourceFlowListProps { organizationId: string; onAddResourceFlow?: (direction: ResourceDirection) => void; onViewMatches?: (resourceId: string) => void; } const ResourceFlowList: React.FC = ({ organizationId, onAddResourceFlow, onViewMatches, }) => { const { t } = useTranslation(); const [activeTab, setActiveTab] = useState('inputs'); const { data: resourceFlows, isLoading, error } = useResourceFlowsByOrganization(organizationId); // Normalize and memoize filtered flows to prevent recalculation on every render const safeResourceFlows = useMemo( () => (Array.isArray(resourceFlows) ? resourceFlows : []), [resourceFlows] ); const { inputFlows, outputFlows } = useMemo(() => { return { inputFlows: safeResourceFlows.filter((flow) => flow?.Direction === 'input'), outputFlows: safeResourceFlows.filter((flow) => flow?.Direction === 'output'), }; }, [safeResourceFlows]); // Show loading state only if we don't have any placeholder data if (isLoading && safeResourceFlows.length === 0) { return ( {t('resourceFlows.title')}

{t('common.loading')}

); } if (error) { return ( {t('resourceFlows.title')}

{t('common.error')}: {error.message}

); } return ( {t('resourceFlows.title')} {onAddResourceFlow && ( )} {t('resourceFlows.inputs')} ({inputFlows.length}) {t('resourceFlows.outputs')} ({outputFlows.length}) {inputFlows.length > 0 ? ( inputFlows.map((flow) => ( )) ) : (

{t('resourceFlows.noInputs')}

)}
{outputFlows.length > 0 ? ( outputFlows.map((flow) => ( )) ) : (

{t('resourceFlows.noOutputs')}

)}
); }; export default React.memo(ResourceFlowList);