Ignore:
Timestamp:
06/17/24 21:59:14 (2 weeks ago)
Author:
223021 <daniel.ilievski.2@…>
Branches:
main
Children:
08f82ec
Parents:
b248810
Message:

Added an edit profile page for both job seekers and recruiters, where they can upload profile pictures/company logos and edit their profile data. Added profile page specifically for recruiters. Refactored existing code.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • jobvista-frontend/src/views/applications/ApplicationsByJobSeeker.js

    rb248810 rbefb988  
    22import {useEffect, useState} from "react";
    33import {ApplicationActions} from "../../redux/actions/applicationActions";
    4 import {ViewApplicationDetails} from "./ViewApplicationDetails";
     4import {ApplicationDetailsModal} from "./ApplicationDetailsModal";
    55import Select from "react-select";
     6
     7import {RecruiterActions} from "../../redux/actions/recruiterActions";
     8import {sortElementsBy} from "../../utils/utils";
    69
    710export const ApplicationsByJobSeeker = () => {
    811    const dispatch = useDispatch();
     12    const auth = useSelector(state => state.auth.currentUser);
     13
    914    const [applicationsByJobSeeker, setApplicationsByJobSeeker] = useState([]);
    1015    let applicationsByJobSeekerState = useSelector(state => state.appl.applicationsByJobSeeker);
    1116    const [dispatched, setDispatched] = useState(false);
    1217
     18    const [logos, setLogos] = useState({});
     19    let logosState = useSelector(state => state.images.logos)
     20    const [logoDispatched, setLogoDispatched] = useState(false);
     21
     22
     23
    1324    useEffect(() => {
    14         if(!dispatched && applicationsByJobSeekerState.length === 0) {
    15             dispatch(ApplicationActions.fetchApplicationsByJobSeeker((success, response) => {
     25        if(!dispatched && (applicationsByJobSeekerState.length === 0 || applicationsByJobSeekerState.length === 1) ) {
     26            dispatch(ApplicationActions.fetchApplicationsByJobSeeker(auth.id, (success, response) => {
    1627                if(success && response.data.length > 0) {
    17                     setApplicationsByJobSeeker(response.data);
     28                    setApplicationsByJobSeeker(sortElementsBy(response.data, "submittedOn"));
    1829                }
     30                setDispatched(true)
    1931                console.log("Fetch applications by job seeker GET")
    2032            }))
    21             setDispatched(true)
     33
    2234        } else {
    23             setApplicationsByJobSeeker(applicationsByJobSeekerState);
     35            setApplicationsByJobSeeker(sortElementsBy(applicationsByJobSeekerState, "submittedOn"));
    2436            console.log("Fetch applications by job seeker STATE")
    2537        }
    2638    }, [applicationsByJobSeekerState])
    2739
     40    useEffect(() => {
     41
     42        if(dispatched && !logoDispatched) {
     43            applicationsByJobSeeker.forEach(jobAd => {
     44                if(jobAd.recruiterId && !logos[jobAd.recruiterId]) {
     45                    fetchLogo(jobAd.recruiterId);
     46                }
     47            })
     48            setLogoDispatched(true)
     49            console.log("Fetch all logos GET")
     50        } else if (logoDispatched){
     51            setLogos(logosState)
     52            console.log("Fetch all logos STATE")
     53
     54        }
     55
     56    }, [dispatched, logosState])
     57
     58
     59
     60    const fetchLogo = (recruiterId) => {
     61        dispatch(RecruiterActions.downloadLogo(recruiterId, (success, response) => {
     62            if(success) {
     63                setLogos(prevLogos => ({...prevLogos, [recruiterId]: response}))
     64            }
     65        }));
     66    };
     67
    2868    const options = [
    29         {value: 'PROPOSED', label: <span><i className="fa-solid fa-paper-plane"></i> Proposed</span>},
    30         {value: 'UNDER_REVIEW', label: <span><i className="fa-solid fa-file-pen"></i> Under Review</span>},
    31         {value: 'ACCEPTED', label: <span><i className="fa-solid fa-user-check"></i> Accepted</span>},
    32         {value: 'DENIED', label: <span><i className="fa-solid fa-user-slash"></i> Denied</span>}
     69        {value: 'PROPOSED', label: <span className="status" style={{backgroundColor: '#4A90E2'}}><i className="fa-solid fa-paper-plane"></i> Proposed</span>},
     70        {value: 'UNDER_REVIEW', label: <span className="status" style={{backgroundColor: '#F5A623'}}><i className="fa-solid fa-file-pen"></i> Under Review</span>},
     71        {value: 'ACCEPTED', label: <span className="status" style={{backgroundColor: '#7ED321'}}><i className="fa-solid fa-user-check"></i> Accepted</span>},
     72        {value: 'DENIED', label: <span className="status" style={{backgroundColor: '#D0021B'}}><i className="fa-solid fa-user-slash"></i> Denied</span>}
    3373    ];
    3474
     
    4080
    4181    return (
    42         <div className="applications-container">
     82        <div className="custom-container">
     83
    4384            <div className="application-title">
    44 
     85                <h3>Application history</h3>
    4586            </div>
    4687            {applicationsByJobSeeker && applicationsByJobSeeker.map((application, index) => (
    4788                <div key={index} className="application-card">
    48                     <div className="left-box">
    49                         <span className="jobAd-title">{application.jobAdTitle}</span>
    50                         <br/>
    51                         <br/>
     89                    <div className="app-company-logo">
     90                        <img
     91                            // loading gif
     92                            src={logosState[application.recruiterId]}
     93                            alt=""
     94                            width={75} height={75}
     95                        />
     96                    </div>
     97
     98                    <div className="app-info">
     99                        <div className="jobAd-title">{application.jobAdTitle}</div>
    52100                        <div className="contact-info">
    53101                            <div className="contact-item">
     
    68116                    </div>
    69117
    70                     <div className="right-box">
    71                         <ViewApplicationDetails application={application}/>
    72                         <div className="select">
    73                             <Select isDisabled={true} options={options} defaultValue={handleDefaultValue(application.status)}/>
    74                         </div>
     118                    <div className="app-status">
     119                        <ApplicationDetailsModal application={application}/>
     120                        <> {handleDefaultValue(application.status).label}</>
     121                        {/*<div className="select">*/}
     122                        {/*    <Select isDisabled={true} options={options} />*/}
     123                        {/*</div>*/}
    75124
    76125                    </div>
Note: See TracChangeset for help on using the changeset viewer.