Ignore:
Timestamp:
08/30/24 15:44:27 (4 weeks ago)
Author:
223021 <daniel.ilievski.2@…>
Branches:
main
Parents:
0f0add0
Message:

Implemented Google login, additional file uploads, response messages and email notifications

File:
1 edited

Legend:

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

    r0f0add0 r4d97b63  
    1717import Roles from "../../enumerations/Roles";
    1818import {ApplicationActions} from "../../redux/actions/applicationActions";
     19import {notifyJobAdApply, notifyJobAdUpdate} from "../../utils/toastUtils";
    1920
    2021
     
    2526    const auth = useSelector(state => state.auth.currentUser)
    2627    const [resumeUrl, setResumeUrl] = useState("");
     28    const [additionalFileUrls, setAdditionalFileUrls] = useState([]);
    2729
    28     //const [resumeFile, setResumeFile] = useState(null);
     30    const [additionalFiles, setAdditionalFiles] = useState(null);
    2931    const toggleModal = () => {
    3032        setModal(!modal);
    3133    };
     34
     35    const {register, handleSubmit, control, formState: {errors}} = useForm();
    3236
    3337    useEffect(() => {
     
    3640                if (success) {
    3741                    setResumeUrl(response);
     42
     43                    if (application.additionalFileNames.length > 0) {
     44                        ApplicationActions.downloadAdditionalFiles(application.id, (success2, response) => {
     45                            if (success2) {
     46                                setAdditionalFileUrls(response);
     47                            }
     48                        })
     49                    }
    3850                }
    3951            })
    4052        }
    4153    }, [])
     54
     55    const updateApplication = async () => {
     56        try {
     57            const formData = new FormData();
     58            if (additionalFiles && additionalFiles.length > 0) {
     59                for (let i = 0; i < additionalFiles.length; i++) {
     60                    formData.append('additionalFiles', additionalFiles[i]);
     61                }
     62            }
     63
     64            dispatch(ApplicationActions.updateApplication(application.id, formData, (success) => {
     65                if (success) {
     66                    toggleModal()
     67                    window.location.reload()
     68                }
     69            }))
     70        } catch (err) {
     71            console.error(err)
     72        }
     73    }
    4274
    4375    function getFileName(path) {
     
    5082
    5183    return (<div className="modal-wrap">
    52         <button onClick={toggleModal} className="application-button">View application</button>
     84        {auth.role === Roles.RECRUITER ? <button onClick={toggleModal} className="application-button">View
     85            application</button> : (application.status === "UNDER_REVIEW" && application.response.length > 0 && additionalFileUrls.length === 0) ?
     86            <button onClick={toggleModal} className="application-button">Update application</button> :
     87            <button onClick={toggleModal} className="application-button">View application</button>}
     88
    5389        <Modal open={modal} onClose={toggleModal} center>
    5490            <div className="head-modal">
     
    5894
    5995            <div className="modal-content">
    60                 <form>
     96                <form onSubmit={handleSubmit(updateApplication)}>
    6197                    <div className="row">
    62                         <div className="col-md-6">
    63                             <label className="label">Why are you interested in joining our company?</label>
    64                             <textarea disabled type="text" defaultValue={application.questionAnswers[0]} disabled
    65                                       placeholder="Write your answer here..." className="application-textarea"/>
    66                             <br/><br/>
    67                             <label className="label">What makes you a good fit for this position?</label>
    68                             <textarea disabled type="text" defaultValue={application.questionAnswers[1]}
    69                                       placeholder="Write your answer here..." className="application-textarea"/>
    70                             <br/><br/>
    71                             <label className="label">What do you hope to achieve in your first 6 months in this
    72                                 role?</label>
    73                             <textarea disabled type="text" defaultValue={application.questionAnswers[2]}
    74                                       placeholder="Write your answer here..." className="application-textarea"/>
     98                        <div className="col-md-6 d-flex flex-column gap-4">
     99                            <div>
     100                                <label className="label">Why are you interested in joining our company?</label>
     101                                <textarea disabled type="text" defaultValue={application.questionAnswers[0]} disabled
     102                                          placeholder="Write your answer here..." className="application-textarea"/>
     103                            </div>
     104
     105                            <div>
     106                                <label className="label">What makes you a good fit for this position?</label>
     107                                <textarea disabled type="text" defaultValue={application.questionAnswers[1]}
     108                                          placeholder="Write your answer here..." className="application-textarea"/>
     109                            </div>
     110
     111                            <div>
     112                                <label className="label">What do you hope to achieve in your first 6 months in this
     113                                    role?</label>
     114                                <textarea disabled type="text" defaultValue={application.questionAnswers[2]}
     115                                          placeholder="Write your answer here..." className="application-textarea"/>
     116                            </div>
     117
    75118
    76119                        </div>
    77                         <div className="col-md-6">
    78                             <label htmlFor="start">Curriculum vitae (CV)</label>
    79                             <br/>
    80                             <a className="resume-link" href={resumeUrl} target="_blank"
    81                                rel="noopener noreferrer">{getFileName(application.fileName)}</a>
    82                             <br/>
     120                        <div className="col-md-6 d-flex flex-column gap-4">
     121                            <div>
     122                                <label className="label" htmlFor="start">Curriculum vitae (CV)</label>
    83123
    84                             <br/>
    85                             <label className="label">Message to the recruiter</label>
    86                             <textarea disabled type="text" defaultValue={application.message} placeholder="Optional..."
    87                                       className="application-textarea"/>
     124                                <a className="resume-link" href={resumeUrl} target="_blank"
     125                                   rel="noopener noreferrer">{getFileName(application.fileName)}</a>
     126                            </div>
     127
     128                            <div>
     129                                <label className="label">Message to the recruiter</label>
     130                                <textarea disabled type="text" defaultValue={application.message}
     131                                          placeholder="Optional..."
     132                                          className="application-textarea"/>
     133                            </div>
     134
     135
     136                            {additionalFileUrls.length > 0 ? (<div>
     137                                    <label className="label" htmlFor="start">Additional documents</label>
     138                                    <ul style={{listStyleType: "none", padding: 0, margin: 0}}>
     139                                        {additionalFileUrls.map((url, index) => (
     140                                            <li style={{marginBottom: 10}} key={index}>
     141                                                <a href={url} className="resume-link" download target="_blank">
     142                                                    {getFileName(url)}
     143                                                </a>
     144                                            </li>))}
     145                                    </ul>
     146                                </div>) : (<div>
     147                                    {(application.status === "UNDER_REVIEW" && application.response.length > 0 && auth.role == Roles.JOBSEEKER) &&
     148                                        <div>
     149                                            <label className="label" htmlFor="start">Additional documents</label>
     150                                            <input
     151                                                className="resume-link"
     152                                                onChange={(e) => setAdditionalFiles(e.target.files)}
     153                                                required type="file"
     154                                                id="fileUpload"
     155                                                accept=".pdf"
     156                                                multiple
     157                                            />
     158                                        </div>}
     159                                </div>
     160                            )}
     161
    88162
    89163                        </div>
    90164                    </div>
     165                    {(additionalFileUrls.length  === 0 && application.status === "UNDER_REVIEW" && application.response.length > 0 && auth.role == Roles.JOBSEEKER) &&
     166                        <div className="modal-buttons">
     167                            <div className="cancel-btn" onClick={toggleModal}> Cancel</div>
     168                            <button className="submit-btn"> Submit</button>
     169                        </div>}
    91170
    92171                </form>
     172
     173
    93174            </div>
    94175        </Modal>
Note: See TracChangeset for help on using the changeset viewer.