All files / libs/plan-agreements/components/src/lib/buttons/assignments/plan-agreement-send-assignments-button PlanAgreementSendAssignmentsButton.tsx

100% Statements 49/49
100% Branches 6/6
100% Functions 1/1
100% Lines 49/49

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 501x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 1x 1x 1x 3x 3x 3x 3x 2x 2x 2x 2x 2x 2x 2x 2x 3x 3x 3x  
import { IconSend } from '@tabler/icons-react';
import { useCallback, useMemo } from 'react';
import { FormattedMessage } from 'react-intl';
 
import { Button } from '@allshares/studio-design-system';
import { canSendThisPlanAgreementAssignment } from '@amalia/kernel/auth/shared';
import { useAbilityContext } from '@amalia/kernel/auth/state';
import { useIsPlanAgreementLoading, useSendPlanAgreementAssignments } from '@amalia/plan-agreements/state';
import { type PlanAgreement } from '@amalia/plan-agreements/types';
 
export interface PlanAgreementSendAssignmentsButtonProps {
  readonly planAgreement: PlanAgreement;
}
 
export const PlanAgreementSendAssignmentsButton = function PlanAgreementSendAssignmentsButton({
  planAgreement,
}: PlanAgreementSendAssignmentsButtonProps) {
  const ability = useAbilityContext();
 
  const { mutate: sendPlanAgreementAssignments } = useSendPlanAgreementAssignments(planAgreement.id);
  const isPlanAgreementLoading = useIsPlanAgreementLoading(planAgreement.id);
 
  const assignmentsToSend = useMemo(
    () =>
      planAgreement.assignments.filter((assignment) =>
        canSendThisPlanAgreementAssignment(ability, planAgreement, assignment),
      ),
    [ability, planAgreement],
  );
 
  const handleClickSendAgreements = useCallback(() => {
    sendPlanAgreementAssignments({
      assignmentIds: assignmentsToSend.map((assignment) => assignment.id),
    });
  }, [assignmentsToSend, sendPlanAgreementAssignments]);
 
  return (
    !!assignmentsToSend.length && (
      <Button
        disabled={isPlanAgreementLoading}
        icon={<IconSend />}
        variant="primary"
        onClick={handleClickSendAgreements}
      >
        <FormattedMessage defaultMessage="Send to everyone" />
      </Button>
    )
  );
};