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

86.88% Statements 53/61
100% Branches 4/4
100% Functions 0/0
86.88% Lines 53/61

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 50 51 52 53 54 55 56 57 58 59 60 61 621x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 1x 1x 1x 2x 2x 2x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x                 1x 1x 1x  
import { IconSend } from '@tabler/icons-react';
import { memo, useCallback } from 'react';
import { FormattedMessage, useIntl } from 'react-intl';
import { match } from 'ts-pattern';
 
import { Button, Table } 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, type PlanAgreementAssignment } from '@amalia/plan-agreements/types';
 
type PlanAgreementSendAssignmentButtonProps = {
  readonly planAgreement: PlanAgreement;
  readonly assignment: PlanAgreementAssignment;
  readonly variant: 'button' | 'table-cell-icon-action';
};
 
export const PlanAgreementSendAssignmentButton = memo(function PlanAgreementSendAssignmentButton({
  assignment,
  variant,
  planAgreement,
}: PlanAgreementSendAssignmentButtonProps) {
  const ability = useAbilityContext();
  const { formatMessage } = useIntl();
 
  const { mutate: sendPlanAgreementAssignments } = useSendPlanAgreementAssignments(planAgreement.id);
  const isPlanAgreementLoading = useIsPlanAgreementLoading(planAgreement.id);
 
  const handleClickSendAssignment = useCallback(() => {
    sendPlanAgreementAssignments({
      assignmentIds: [assignment.id],
    });
  }, [sendPlanAgreementAssignments, assignment.id]);
 
  if (!canSendThisPlanAgreementAssignment(ability, planAgreement, assignment)) {
    return null;
  }
 
  return match(variant)
    .with('button', () => (
      <Button
        disabled={isPlanAgreementLoading}
        icon={<IconSend />}
        variant="primary"
        onClick={handleClickSendAssignment}
      >
        <FormattedMessage defaultMessage="Send" />
      </Button>
    ))
    .with('table-cell-icon-action', () => (
      <Table.Cell.IconAction
        disabled={isPlanAgreementLoading}
        icon={<IconSend />}
        label={formatMessage({
          defaultMessage: 'Send agreement',
        })}
        onClick={handleClickSendAssignment}
      />
    ))
    .exhaustive();
});