Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 3432 | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |

import React, { useState } from 'react';
import { useParams } from 'react-router-dom';
import { useDispatch } from 'react-redux';
import { Button, Grid } from '@mui/material';

import { axios, parse } from '@utils';
import { useFetch } from '@hooks';
import { addNotification } from '@store/notification/notification.actions';

import Spinner from '@components/UI/Spinner';
import JobCard from '@components/job/job-card';
import JobAttr from '@components/job/job-attr';
import CompanyInfo from '@components/job/company-info';
import ApplyModal from '@components/job/apply-modal';

const JobViewPage = () => {
  const [showApplyModal, setShowApplyModal] = useState(false);
  const [loading, setLoading] = useState(false);
  const { uuid } = useParams();
  const dispatch = useDispatch();

  const { data: job, isLoading, mutate } = useFetch(`/job/view/${uuid}`);
  const isJobApplied = job?.job_apply_operation === 'remove-apply';

  const toggleApplyModal = () => setShowApplyModal(!showApplyModal);

  const toggleApplication = () => {
    mutate({
      ...job,
      job_apply_operation: isJobApplied ? 'apply' : 'remove-apply'
    });
  };

  const removeApply = async () => {
    setLoading(true);
    try {
      const response = await axios.post(`/job/remove-apply-job/${job.job_uuid}`);
      const { data, success } = response.data;
      if (!success) throw new Error('Error al eliminar la aplicación');
      dispatch(addNotification({ style: 'success', msg: data }));
      toggleApplication();
    } catch (error) {
      dispatch(addNotification({ style: 'danger', msg: error.message }));
    } finally {
      setLoading(false);
    }
  };

  const apply = async (jobApply) => {
    setLoading(true);

    try {
      const url = `/job/apply-job/${job.job_uuid}`;
      const formData = new FormData();
      Object.entries(jobApply).map(([key, value]) => formData.append(key, value));

      const response = await axios.post(url, formData);
      const { data, success } = response.data;

      if (!success) throw new Error('Error al aplicar al trabajo');

      dispatch(addNotification({ style: 'success', msg: data }));
      toggleApplication();
      toggleApplyModal();
    } catch (error) {
      dispatch(addNotification({ styled: 'danger', msg: error.message }));
    } finally {
      setLoading(false);
    }
  };

  if (isLoading) {
    return <Spinner />;
  }

  return (
    <>
      <Grid container spacing={1}>
        <Grid size={{ xs: 12, md: 8 }} sx={{ display: 'flex', flexDirection: 'column', gap: 0.5 }}>
          <JobCard job={job} />

          <JobAttr title='Visión general' info={parse(job?.job_description)} />
          <JobAttr title='Último día de aplicación' info={job?.last_date_of_application} />
          <JobAttr title='Tipo de empleo' info={job?.employment_type} />
          <JobAttr title='Ubicación' info={job?.location} />
          <JobAttr title='Experiencia' info={job?.experience} />
          <JobAttr title='Salario' info={job?.salary} />
          <JobAttr title='Categoría' info={job?.job_category} />
          <JobAttr title='Habilidades' info={job?.job_skills} />
          <JobAttr title='Idiomas' info={job?.job_languages} />
          <JobAttr title='Grados' info={job?.job_degrees} />
        </Grid>

        <Grid size={{ xs: 12, md: 4 }} sx={{ display: 'flex', flexDirection: 'column', gap: 0.5 }}>
          <Button
            variant={isJobApplied ? 'secondary' : 'primary'}
            onClick={isJobApplied ? removeApply : toggleApplyModal}
            disabled={loading}
          >
            {isJobApplied ? 'Quitar aplicación' : 'Aplicar'}
          </Button>

          <CompanyInfo company={job} />
        </Grid>
      </Grid>

      <ApplyModal
        show={showApplyModal}
        profiles={job?.user_profiles}
        onConfirm={apply}
        onClose={toggleApplyModal}
      />
    </>
  );
};

export default JobViewPage;