All files / libs/plan-agreements/components/src/lib/buttons/agreements/plan-agreement-delete-button PlanAgreementDeleteButton.tsx

85.48% Statements 53/62
100% Branches 5/5
100% Functions 0/0
85.48% Lines 53/62

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 631x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 1x 3x 3x 3x 1x 1x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x                   2x 2x 1x  
import { IconTrash } from '@tabler/icons-react';
import { memo, useCallback } from 'react';
import { useIntl } from 'react-intl';
import { match } from 'ts-pattern';
 
import { IconButton, Table } from '@allshares/studio-design-system';
import { canDeleteThisPlanAgreement } from '@amalia/kernel/auth/shared';
import { useAbilityContext } from '@amalia/kernel/auth/state';
import { useIsPlanAgreementLoading } from '@amalia/plan-agreements/state';
import { type PlanAgreement } from '@amalia/plan-agreements/types';
 
import { usePlanAgreementsModalsContext } from '../../../modals';
 
interface PlanAgreementDeleteButtonProps {
  readonly planAgreement: PlanAgreement;
  readonly variant: 'icon-button' | 'table-cell-icon-action';
}
 
export const PlanAgreementDeleteButton = memo(function PlanAgreementDeleteButton({
  planAgreement,
  variant,
}: PlanAgreementDeleteButtonProps) {
  const ability = useAbilityContext();
  const { formatMessage } = useIntl();
 
  const { openDeletePlanAgreementModal } = usePlanAgreementsModalsContext();
  const isPlanAgreementLoading = useIsPlanAgreementLoading(planAgreement.id);
 
  const handleClickDelete = useCallback(() => {
    openDeletePlanAgreementModal(planAgreement);
  }, [openDeletePlanAgreementModal, planAgreement]);
 
  if (!canDeleteThisPlanAgreement(ability, planAgreement)) {
    return null;
  }
 
  return match(variant)
    .with('icon-button', () => (
      <IconButton
        disabled={isPlanAgreementLoading}
        icon={<IconTrash />}
        outline="shadow"
        variant="danger"
        label={formatMessage({
          defaultMessage: 'Delete plan agreement',
        })}
        onClick={handleClickDelete}
      />
    ))
    .with('table-cell-icon-action', () => (
      <Table.Cell.IconAction
        disabled={isPlanAgreementLoading}
        icon={<IconTrash />}
        variant="danger"
        label={formatMessage({
          defaultMessage: 'Delete plan agreement',
        })}
        onClick={handleClickDelete}
      />
    ))
    .exhaustive();
});