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

86.11% Statements 62/72
80% Branches 4/5
100% Functions 0/0
86.11% Lines 62/72

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 62 63 64 65 66 67 68 69 70 71 72 731x 1x 1x 1x 1x 1x 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 2x 2x 1x 1x 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 { IconReload } from '@tabler/icons-react';
import { memo, useCallback } from 'react';
import { FormattedMessage, useIntl } from 'react-intl';
import { generatePath } from 'react-router-dom';
import { match } from 'ts-pattern';
 
import { Button, Table } from '@allshares/studio-design-system';
import { routes } from '@amalia/core/routes';
import { useNavigate } from '@amalia/ext/react-router-dom';
import { canRegenerateThisPlanAgreementAssignment } from '@amalia/kernel/auth/shared';
import { useAbilityContext } from '@amalia/kernel/auth/state';
import { useIsPlanAgreementLoading, useRegeneratePlanAgreementDocs } from '@amalia/plan-agreements/state';
import { type PlanAgreement, type PlanAgreementAssignment } from '@amalia/plan-agreements/types';
 
export type PlanAgreementRegenerateAssignmentButtonProps = {
  readonly planAgreement: PlanAgreement;
  readonly assignment: PlanAgreementAssignment;
  readonly variant: 'button' | 'table-cell-icon-action';
  /** If this is set to true, will redirect to the edit page after regenerating the agreement */
  readonly redirectToEditPage?: boolean;
};
 
export const PlanAgreementRegenerateAssignmentButton = memo(function PlanAgreementRegenerateAssignmentButton({
  assignment,
  variant,
  planAgreement,
  redirectToEditPage = false,
}: PlanAgreementRegenerateAssignmentButtonProps) {
  const ability = useAbilityContext();
  const navigate = useNavigate();
  const { formatMessage } = useIntl();
 
  const { mutate: regenerateAgreement } = useRegeneratePlanAgreementDocs(planAgreement.id);
  const isPlanAgreementLoading = useIsPlanAgreementLoading(planAgreement.id);
 
  const handleClickRegenerate = useCallback(() => {
    regenerateAgreement({
      assignmentIds: [assignment.id],
    });
 
    if (redirectToEditPage) {
      navigate(generatePath(routes.PLAN_AGREEMENT_EDIT, { planAgreementId: planAgreement.id }));
    }
  }, [regenerateAgreement, navigate, planAgreement.id, redirectToEditPage, assignment.id]);
 
  if (!canRegenerateThisPlanAgreementAssignment(ability, planAgreement, assignment)) {
    return null;
  }
 
  return match(variant)
    .with('button', () => (
      <Button
        disabled={isPlanAgreementLoading}
        icon={<IconReload />}
        variant="primary-light"
        onClick={handleClickRegenerate}
      >
        <FormattedMessage defaultMessage="Regenerate" />
      </Button>
    ))
    .with('table-cell-icon-action', () => (
      <Table.Cell.IconAction
        disabled={isPlanAgreementLoading}
        icon={<IconReload />}
        label={formatMessage({
          defaultMessage: 'Regenerate agreement',
        })}
        onClick={handleClickRegenerate}
      />
    ))
    .exhaustive();
});