All files / libs/plan-agreements/components/src/lib/badges/assignments/plan-agreement-assignment-badge PlanAgreementAssignmentBadge.tsx

100% Statements 92/92
92.3% Branches 12/13
100% Functions 0/0
100% Lines 92/92

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 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 931x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 12x 12x 12x 12x 12x 12x 12x 12x 1x 1x 1x 12x 12x 1x 1x 1x 12x 12x 2x 1x 1x 1x 1x 1x 1x 1x 12x 12x 12x 1x 1x 1x 12x 12x 12x 12x 12x 12x 12x 12x 12x 12x 12x 2x 2x 2x 12x 12x 12x 12x 12x 12x 12x 12x 1x 1x 1x 12x 12x 12x 1x 1x 1x 12x 12x 1x 1x 1x 12x 12x 12x 12x 1x  
import { Fragment, memo } from 'react';
import { FormattedMessage } from 'react-intl';
import { match, P } from 'ts-pattern';
 
import { Badge } from '@allshares/studio-design-system';
import { isPlanAgreementConfirmationRequired, isPlanAgreementFinalizable } from '@amalia/plan-agreements/shared';
import {
  PlanAgreementAssignmentStatus,
  PlanAgreementStatus,
  type PlanAgreement,
  type PlanAgreementAssignment,
} from '@amalia/plan-agreements/types';
 
export type PlanAgreementAssignmentBadgeProps = {
  readonly planAgreement?: PlanAgreement;
  readonly assignment?: PlanAgreementAssignment;
};
 
export const PlanAgreementAssignmentBadge = memo(function PlanAgreementAssignmentBadge({
  planAgreement,
  assignment,
}: PlanAgreementAssignmentBadgeProps) {
  return (
    <Fragment>
      {match({ planAgreement, assignment })
        .with({ planAgreement: P.nullish }, { assignment: P.nullish }, () => null)
        .with({ planAgreement: { error: P.not(P.nullish) } }, () => (
          <Badge variant="danger">
            <FormattedMessage defaultMessage="Error" />
          </Badge>
        ))
        .with({ planAgreement: { status: PlanAgreementStatus.ARCHIVED } }, () => (
          <Badge variant="warning">
            <FormattedMessage defaultMessage="Archived" />
          </Badge>
        ))
        .with({ planAgreement: { status: PlanAgreementStatus.DRAFT } }, ({ planAgreement }) =>
          isPlanAgreementFinalizable(planAgreement) ? (
            <Badge variant="missing">
              <FormattedMessage defaultMessage="Not finalized" />
            </Badge>
          ) : (
            <Badge variant="danger">
              <FormattedMessage defaultMessage="Incomplete" />
            </Badge>
          ),
        )
        .with({ assignment: { status: PlanAgreementAssignmentStatus.ERROR } }, () => (
          <Badge variant="danger">
            <FormattedMessage defaultMessage="Error at generation" />
          </Badge>
        ))
        .with(
          {
            assignment: {
              status: P.union(
                PlanAgreementAssignmentStatus.AGREEMENT_GENERATED,
                PlanAgreementAssignmentStatus.AGREEMENT_TO_GENERATE,
              ),
            },
          },
          () => (
            <Badge variant="pending">
              <FormattedMessage defaultMessage="Ready to send" />
            </Badge>
          ),
        )
        .with(
          {
            planAgreement: P.not(P.nullish),
            assignment: { status: PlanAgreementAssignmentStatus.AGREEMENT_SENT, seenDate: P.not(P.nullish) },
          },
          ({ planAgreement }) => (
            <Badge variant={isPlanAgreementConfirmationRequired(planAgreement) ? 'warning' : 'success'}>
              <FormattedMessage defaultMessage="Seen" />
            </Badge>
          ),
        )
        .with({ assignment: { status: PlanAgreementAssignmentStatus.AGREEMENT_SENT } }, () => (
          <Badge variant="missing">
            <FormattedMessage defaultMessage="Received" />
          </Badge>
        ))
        .with({ assignment: { status: PlanAgreementAssignmentStatus.CONFIRMED } }, () => (
          <Badge variant="success">
            <FormattedMessage defaultMessage="Confirmed" />
          </Badge>
        ))
        .otherwise(() => null)}
    </Fragment>
  );
});