All files / libs/plan-agreements/components/src/lib/buttons/agreements/plan-agreement-bulk-download-button PlanAgreementBulkDownloadButton.tsx

95.91% Statements 47/49
75% Branches 3/4
100% Functions 0/0
95.91% Lines 47/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 1x 1x 2x 2x 2x 2x 2x 2x 2x 2x 2x 1x 1x 1x 1x 1x 1x     2x 2x 2x 2x 1x 1x 1x 1x 1x 1x 1x 1x 2x 2x 1x  
import { IconDownload } from '@tabler/icons-react';
import { memo, useCallback } from 'react';
import { FormattedMessage } from 'react-intl';
 
import { Button, useSnackbars } from '@allshares/studio-design-system';
import { toError } from '@amalia/ext/typescript';
import { canBulkDownloadThisPlanAgreement } from '@amalia/kernel/auth/shared';
import { useAbilityContext } from '@amalia/kernel/auth/state';
import { useBulkDownloadPlanAgreementDocs, useIsPlanAgreementLoading } from '@amalia/plan-agreements/state';
import { type PlanAgreement } from '@amalia/plan-agreements/types';
import { DownloadsApiClient } from '@amalia/reporting/exports/state';
 
export interface PlanAgreementBulkDownloadButtonProps {
  readonly planAgreement: PlanAgreement;
}
 
export const PlanAgreementBulkDownloadButton = memo(function PlanAgreementBulkDownloadButton({
  planAgreement,
}: PlanAgreementBulkDownloadButtonProps) {
  const ability = useAbilityContext();
  const { snackError } = useSnackbars();
 
  const { mutateAsync: bulkDownloadPlanAgreementDocs } = useBulkDownloadPlanAgreementDocs(planAgreement.id);
  const isPlanAgreementLoading = useIsPlanAgreementLoading(planAgreement.id);
 
  const handleClickDownload = useCallback(async () => {
    try {
      const agreementsZipStream = await bulkDownloadPlanAgreementDocs();
      const agreementsZipBlob = new Blob([agreementsZipStream], { type: 'application/zip' });
 
      DownloadsApiClient.downloadFile(agreementsZipBlob, planAgreement.name, 'zip');
    } catch (error) {
      snackError(toError(error).message);
    }
  }, [bulkDownloadPlanAgreementDocs, planAgreement.name, snackError]);
 
  return (
    canBulkDownloadThisPlanAgreement(ability, planAgreement) && (
      <Button
        disabled={isPlanAgreementLoading}
        icon={<IconDownload />}
        variant="primary-light"
        onClick={handleClickDownload}
      >
        <FormattedMessage defaultMessage="Export" />
      </Button>
    )
  );
});