/** * Organization proposal management hook * Handles proposal modal state and submission logic * Separated from other concerns for better SRP */ import { useCallback, useMemo, useState } from 'react'; import type { Organization, ResourceFlow } from '@/types.ts'; import { useCreateProposal } from '@/hooks/api/useProposalsAPI.ts'; import { useAuth } from '@/contexts/AuthContext.tsx'; interface ProposalModalContext { targetOrg: Organization; resource: ResourceFlow; resourceType: 'input' | 'output'; } export const useOrganizationProposals = (organization: Organization | undefined) => { const { user } = useAuth(); const createProposalMutation = useCreateProposal(); const [isProposalModalOpen, setIsProposalModalOpen] = useState(false); const [proposalContext, setProposalContext] = useState(null); const openProposalModal = useCallback( (resource: ResourceFlow, resourceType: 'input' | 'output') => { if (!organization) return; setProposalContext({ targetOrg: organization, resource, resourceType }); setIsProposalModalOpen(true); }, [organization] ); const closeProposalModal = useCallback(() => { setIsProposalModalOpen(false); setProposalContext(null); }, []); const submitProposal = useCallback( (message: string) => { if (!proposalContext || !user) return; createProposalMutation.mutate({ from_org_id: user.id, to_org_id: proposalContext.targetOrg.ID, resource_id: proposalContext.resource.ID, resource_type: proposalContext.resourceType, resource_name: proposalContext.resource.Type, message: message, }); closeProposalModal(); }, [proposalContext, user, createProposalMutation, closeProposalModal] ); const proposalState = useMemo( () => ({ isModalOpen: isProposalModalOpen, modalContext: proposalContext, }), [isProposalModalOpen, proposalContext] ); const actions = useMemo( () => ({ openProposalModal, closeProposalModal, submitProposal, }), [openProposalModal, closeProposalModal, submitProposal] ); return { proposalState, actions, }; };