Skip to content
Snippets Groups Projects
useDownloadPublicationsAsCSVFile.ts 2.3 KiB
Newer Older
import { ZERO } from '@/constants/common';
import { downloadFileFromBlob } from '@/redux/export/export.utils';
import { useAppSelector } from '@/redux/hooks/useAppSelector';
import { modelsNameMapSelector } from '@/redux/models/models.selectors';
import {
  filteredSizeSelector,
  publicationsListDataSelector,
  searchValueSelector,
} from '@/redux/publications/publications.selectors';
import { Publication } from '@/types/models';
import { StandarizedPublication } from '@/types/publications';
import { useState } from 'react';
import { getBasePublications } from './getBasePublications';
import { getStandarizedPublications } from './getStandarizedPublications';
import { mapStandarizedPublicationsToCSVString } from './mapStandarizedPublicationsToCSVString';

export type DownloadPublicationsAsCSVFile = () => Promise<void>;

interface UseDownloadPublicationsAsCSVFileResult {
  downloadPublicationsAsCSVFile: DownloadPublicationsAsCSVFile;
  isLoading: boolean;
}

const CSV_FILE_NAME = 'publications.csv';

export const useDownloadPublicationsAsCSVFile = (): UseDownloadPublicationsAsCSVFileResult => {
  const [isLoading, setIsLoading] = useState<boolean>(false);
  const modelNameIdMap = useAppSelector(modelsNameMapSelector);
  const numberOfPublications = useAppSelector(filteredSizeSelector);
  const searchValue = useAppSelector(searchValueSelector);
  const searchedPublicationsList = useAppSelector(publicationsListDataSelector);

  const getAllBasePublications = async (): Promise<Publication[]> =>
    getBasePublications({
      length: numberOfPublications || ZERO,
    });

  const getPublicationsAsList = async (): Promise<StandarizedPublication[]> => {
    const publications =
      searchValue && searchedPublicationsList
        ? searchedPublicationsList
        : await getAllBasePublications();
    const standardizedPublications = await getStandarizedPublications({
      publications,
      modelNameIdMap,
    return standardizedPublications;
  };

  const downloadPublicationsAsCSVFile = async (): Promise<void> => {
    setIsLoading(true);
    const data = await getPublicationsAsList();
    const dataString = mapStandarizedPublicationsToCSVString(data);
    downloadFileFromBlob(dataString, CSV_FILE_NAME);
    setIsLoading(false);
  };

  return {
    downloadPublicationsAsCSVFile,
    isLoading,
  };
};