radgrad/radgrad2

View on GitHub
app/imports/ui/pages/admin/AdminManageInternshipsPage.tsx

Summary

Maintainability
A
25 mins
Test Coverage
import React, { useState } from 'react';
import { Button, Message, Progress } from 'semantic-ui-react';
import { defineMethod } from '../../../api/base/BaseCollection.methods';
import { Internships } from '../../../api/internship/InternshipCollection';
import { incrementMissedUploadsMethod, removeAllInternshipsMethod } from '../../../api/internship/InternshipCollection.methods';
import RadGradSegment from '../../components/shared/RadGradSegment';
import { PAGEIDS } from '../../utilities/PageIDs';
import RadGradAlert from '../../utilities/RadGradAlert';
import PageLayout from '../PageLayout';
import { processInternAlohaInternships } from '../../../api/internship/import/process-canonical';

const headerPaneTitle = 'Internship Management';
const headerPaneBody = 'Tools to get internships from InternAloha and define them in the RadGrad database.';

const AdminManageInternshipsPage: React.FC = () => {
  const [deleteWorking, setDeleteWorking] = useState(false);
  const [uploadWorking, setUploadWorking] = useState(false);
  const [defineWorking, setDefineWorking] = useState(false);
  const [defineProgress, setDefineProgress] = useState(0);
  const [internships, setInternships] = useState([]);
  const [message, setMessage] = useState('Click the Upload internships button');

  const handleDeleteClick = () => {
    setDeleteWorking(true);
    removeAllInternshipsMethod.callPromise({});
    setMessage('Cleared internships');
    setDeleteWorking(false);
  };

  const handleUploadClick = async () => {
    setUploadWorking(true);
    await incrementMissedUploadsMethod.callPromise({});
    const gottenInternships = await processInternAlohaInternships();
    setInternships(gottenInternships);
    setMessage(`Uploaded ${gottenInternships.length} internships`);
    setUploadWorking(false);
    setDefineProgress(0);
  };

  const defineInternships = async () => {
    setDefineWorking(true);
    const collectionName = Internships.getCollectionName();
    const numInternships = internships.length;
    let numDefined = 0;
    let progress = 0;
    for (const definitionData of internships) {
      // eslint-disable-next-line no-await-in-loop
      await defineMethod.callPromise({ collectionName, definitionData }).catch(error => RadGradAlert.failure('Define internship failed', `${definitionData.postion}`, error.message));
      numDefined++;
      progress = numDefined / numInternships * 100;
      if (numDefined % 100 === 0) {
        setDefineProgress(progress);
      }
    }
    setMessage(`Defined ${internships.length} internships`);
    setDefineWorking(false);
  };

  return (
    <PageLayout id={PAGEIDS.MANAGE_INTERNSHIPS} headerPaneTitle={headerPaneTitle} headerPaneBody={headerPaneBody}>
      <Button color="red" onClick={handleDeleteClick} loading={deleteWorking}>
        Delete internships
      </Button>{' '}
      <Button onClick={handleUploadClick} loading={uploadWorking}>
        Upload internships
      </Button>{' '}
      <Button onClick={defineInternships} loading={defineWorking}>
        Define Internships
      </Button>
      {defineWorking ? <RadGradSegment header="Defining internships"><Progress percent={defineProgress} indicating /></RadGradSegment> : ''}
      <Message>
        <Message.Header>{message}</Message.Header>
      </Message>
    </PageLayout>
  );
};

export default AdminManageInternshipsPage;