Changeset b248810 for jobvista-frontend/src
- Timestamp:
- 06/10/24 22:34:32 (5 months ago)
- Branches:
- main
- Children:
- befb988
- Parents:
- 28b3398
- Location:
- jobvista-frontend/src
- Files:
-
- 7 added
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
jobvista-frontend/src/App.js
r28b3398 rb248810 1 1 import logo from './logo.svg'; 2 2 import './App.css'; 3 import {useDispatch } from "react-redux";3 import {useDispatch, useSelector} from "react-redux"; 4 4 import {BrowserRouter} from "react-router-dom"; 5 5 import {Header} from "./views/static/Header"; 6 6 import {RoutesConfig} from "./auth/RoutesConfig"; 7 import {useEffect } from "react";7 import {useEffect, useState} from "react"; 8 8 import {AuthActions} from "./redux/actions/authActions"; 9 9 import {AUTH_TOKEN} from "./axios/axiosInstance"; 10 import {jwtDecode} from "jwt-decode"; 11 import {NoAccess} from "./views/static/NoAccess"; 10 12 11 13 function App() { … … 16 18 }, [dispatch]) 17 19 20 const [user, setUser] = useState(null); 21 const [loading, setLoading] = useState(true); 22 const auth = useSelector(state => state.auth); 23 24 useEffect(() => { 25 const token = localStorage.getItem(AUTH_TOKEN); 26 if (token !== null) { 27 try { 28 const decodedToken = jwtDecode(token); 29 setUser({ 30 name: decodedToken.name, 31 role: decodedToken.role, 32 hasAccess: auth.currentUser.access, 33 }); 34 setLoading(false); 35 } catch (error) { 36 console.error('Failed to decode token', error); 37 setLoading(false); 38 } 39 } else { 40 setLoading(false); 41 } 42 }, [auth]); 43 44 if (loading) { 45 return <NoAccess />; // Replace LoadingSpinner with your loading indicator component 46 } 47 18 48 return ( 19 49 <div className="App"> 20 50 <BrowserRouter> 21 <Header/> 22 <RoutesConfig/> 51 {user === null ? ( 52 <> 53 <Header /> 54 <RoutesConfig /> 55 </> 56 ) : user.hasAccess ? ( 57 <> 58 <Header /> 59 <RoutesConfig /> 60 </> 61 ) : ( 62 <NoAccess user={user}/> 63 )} 64 65 23 66 </BrowserRouter> 24 67 </div> -
jobvista-frontend/src/auth/RoutesConfig.js
r28b3398 rb248810 9 9 import {ApplicationsByJobAd} from "../views/applications/ApplicationsByJobAd"; 10 10 import {ApplicationsByJobSeeker} from "../views/applications/ApplicationsByJobSeeker"; 11 import {useEffect, useState} from "react"; 12 import {AUTH_TOKEN} from "../axios/axiosInstance"; 13 import {jwtDecode} from "jwt-decode"; 14 import {useSelector} from "react-redux"; 15 import {AdminPanel} from "../views/admin_panel/AdminPanel"; 11 16 export const RoutesConfig = () => { 12 17 … … 21 26 <Route path="/job-advertisements/:id" element={<JobAdDetails/>}></Route> 22 27 <Route path="/my-job-advertisements/:advertisement_id/applications" element={<ApplicationsByJobAd/>}></Route> 28 <Route path="/admin-panel" element={<AdminPanel/>}></Route> 23 29 </Routes> 24 30 ) -
jobvista-frontend/src/redux/actionTypes.js
r28b3398 rb248810 18 18 export const DOWNLOAD_RESUME = "DOWNLOAD_RESUME" 19 19 20 export const FETCH_RECRUITERS = "FETCH_RECRUITERS" 21 export const CHANGE_ACCESS = "CHANGE_ACCESS" 20 22 23 -
jobvista-frontend/src/redux/actions/authActions.js
r28b3398 rb248810 48 48 email: response.email, 49 49 name: response.name, 50 role: response.role 50 role: response.role, 51 access: response.hasAccess, 51 52 }; 52 53 dispatch({ -
jobvista-frontend/src/redux/reducers/jobAdvertisementReducer.js
r28b3398 rb248810 5 5 FETCH_JOB_ADVERTISEMENTS_BY_RECRUITER, FILTER_JOB_ADVERTISEMENTS, FILTER_JOB_ADVERTISEMENTS_BY_RECRUITER 6 6 } from "../actionTypes"; 7 import {sortElementsBy DateCreated} from "../../utils/utils";7 import {sortElementsBy} from "../../utils/utils"; 8 8 import {useSelector} from "react-redux"; 9 9 … … 22 22 return { 23 23 ...state, 24 jobAdvertisements: sortElementsBy DateCreated([...state.jobAdvertisements, action.jobAdvertisement]),25 jobAdvertisementsByRecruiter: sortElementsBy DateCreated([...state.jobAdvertisementsByRecruiter, action.jobAdvertisement])24 jobAdvertisements: sortElementsBy([...state.jobAdvertisements, action.jobAdvertisement]), 25 jobAdvertisementsByRecruiter: sortElementsBy([...state.jobAdvertisementsByRecruiter, action.jobAdvertisement], "postedOn") 26 26 } 27 27 case EDIT_JOB_ADVERTISEMENT: … … 30 30 31 31 return { 32 jobAdvertisements: sortElementsBy DateCreated([...jobAdvertisements, action.jobAdvertisement]),33 jobAdvertisementsByRecruiter: sortElementsBy DateCreated([...jobAdvertisementsByRecruiter, action.jobAdvertisement])32 jobAdvertisements: sortElementsBy([...jobAdvertisements, action.jobAdvertisement], "postedOn"), 33 jobAdvertisementsByRecruiter: sortElementsBy([...jobAdvertisementsByRecruiter, action.jobAdvertisement], "postedOn") 34 34 } 35 35 case DELETE_JOB_ADVERTISEMENT: … … 38 38 39 39 return { 40 jobAdvertisements: sortElementsBy DateCreated([...jobAdvertisements]),41 jobAdvertisementsByRecruiter: sortElementsBy DateCreated([...jobAdvertisementsByRecruiter])40 jobAdvertisements: sortElementsBy([...jobAdvertisements], "postedOn"), 41 jobAdvertisementsByRecruiter: sortElementsBy([...jobAdvertisementsByRecruiter], "postedOn") 42 42 } 43 43 … … 45 45 return { 46 46 ...state, 47 jobAdvertisements: sortElementsBy DateCreated(action.jobAdvertisements)47 jobAdvertisements: sortElementsBy(action.jobAdvertisements, "postedOn") 48 48 } 49 49 … … 52 52 return { 53 53 ...state, 54 jobAdvertisementsByRecruiter: sortElementsBy DateCreated(action.jobAdvertisementsByRecruiter)54 jobAdvertisementsByRecruiter: sortElementsBy(action.jobAdvertisementsByRecruiter, "postedOn") 55 55 } 56 56 -
jobvista-frontend/src/redux/store.js
r28b3398 rb248810 4 4 import jobAdReducer from "./reducers/jobAdvertisementReducer"; 5 5 import applicationReducer from "./reducers/applicationReducer" 6 import adminReducer from "./reducers/adminReducer" 7 import {AdminActions} from "./actions/adminActions"; 6 8 7 9 // const rootReducer = combineReducers({ … … 18 20 auth: authReducer, 19 21 jobAd: jobAdReducer, 20 appl: applicationReducer 22 appl: applicationReducer, 23 admin: adminReducer 21 24 }, 22 25 }); -
jobvista-frontend/src/utils/utils.js
r28b3398 rb248810 1 1 2 2 3 export const sortElementsBy DateCreated = (array) => {3 export const sortElementsBy = (array, column) => { 4 4 return array.slice().sort((a, b) => { 5 return new Date(b .postedOn).getTime() - new Date(a.postedOn).getTime()5 return new Date(b[column]).getTime() - new Date(a[column]).getTime() 6 6 }); 7 7 } … … 9 9 export const sortElementsBySubmissionDate = (array) => { 10 10 return array.slice().sort((a, b) => { 11 return new Date(b .postedOn).getTime() - new Date(a.postedOn).getTime()11 return new Date(b).getTime() - new Date(a.postedOn).getTime() 12 12 }); 13 13 } -
jobvista-frontend/src/views/dashboard/Dashboard.js
r28b3398 rb248810 4 4 import {useEffect, useState} from "react"; 5 5 import {JobAdvertisementActions} from "../../redux/actions/jobAdvertisementActions"; 6 import {formatRelativeTime, sortElementsBy DateCreated} from "../../utils/utils";6 import {formatRelativeTime, sortElementsBy} from "../../utils/utils"; 7 7 import {dataRangeOptions, industryOptions, industryOptionsFilter, sortOptions} from "../selectOptions"; 8 8 import Select from "react-select"; … … 10 10 import {Link} from "react-router-dom"; 11 11 import JobType from "../../enumerations/JobType"; 12 import {AUTH_TOKEN} from "../../axios/axiosInstance"; 13 import {jwtDecode} from "jwt-decode"; 12 14 13 export const Dashboard = ( ) => {15 export const Dashboard = (props) => { 14 16 15 17 const dispatch = useDispatch(); … … 17 19 const [jobAdvertisements, setJobAdvertisements] = useState([]); 18 20 let jobAdvertisementsState = useSelector(state => state.jobAd.jobAdvertisements) 19 const auth = useSelector(state => state.auth .currentUser);21 const auth = useSelector(state => state.auth); 20 22 21 const [role, setRole] = useState("");23 // const [role, setRole] = useState(""); 22 24 const [selectedSortOrder, setSelectedSortOrder] = useState("date_newest"); 23 25 const [selectedIndustry, setSelectedIndustry] = useState("all"); … … 25 27 const [dispatched, setDispatched] = useState(false) 26 28 27 useEffect(() => { 28 if (auth) { 29 setRole(auth.role); 30 } 31 }, [auth]); 29 // const [user, setUser] = useState(null); 30 // 31 // useEffect(() => { 32 // const token = localStorage.getItem(AUTH_TOKEN); 33 // if (token!=null) { 34 // try { 35 // const decodedToken = jwtDecode(token); 36 // setUser({ 37 // name: decodedToken.name, 38 // role: decodedToken.role, 39 // hasAccess: decodedToken.access, 40 // }); 41 // } catch (error) { 42 // console.error('Failed to decode token', error); 43 // } 44 // } 45 // console.log(user) 46 // }, [auth]); 47 48 // useEffect(() => { 49 // if (auth) { 50 // setRole(auth.role); 51 // } 52 // console.log(props) 53 // }, [auth]); 32 54 33 55 useEffect(() => { … … 35 57 dispatch(JobAdvertisementActions.fetchJobAdvertisements((success, response) => { 36 58 if (success && response.data.length > 0) { 37 setJobAdvertisements(sortElementsBy DateCreated(response.data))59 setJobAdvertisements(sortElementsBy(response.data)) 38 60 } 39 61 setDispatched(true) … … 62 84 63 85 return ( 86 64 87 <div className="container"> 65 88 <div className="head-dashboard-box"> -
jobvista-frontend/src/views/job_advertisements/JobAdvertisements.js
r28b3398 rb248810 5 5 import {useEffect, useState} from "react"; 6 6 import {JobAdvertisementActions} from "../../redux/actions/jobAdvertisementActions"; 7 import {formatRelativeTime, sortElementsBy DateCreated} from "../../utils/utils";7 import {formatRelativeTime, sortElementsBy} from "../../utils/utils"; 8 8 import {dataRangeOptions, industryOptions, industryOptionsFilter, sortOptions} from "../selectOptions"; 9 9 import Select from "react-select"; … … 37 37 dispatch(JobAdvertisementActions.fetchJobAdvertisementsByRecruiter((success, response) => { 38 38 if (success && response.data.length > 0) { 39 setJobAdvertisementsByRecruiter(sortElementsBy DateCreated(response.data))39 setJobAdvertisementsByRecruiter(sortElementsBy(response.data)) 40 40 } 41 41 console.log("Fetch job advertisements by recruiter GET") -
jobvista-frontend/src/views/static/Header.js
r28b3398 rb248810 1 1 import {Link, NavLink} from "react-router-dom"; 2 2 import "./Header.css" 3 import { jwtDecode } from "jwt-decode"; 3 4 import {useDispatch, useSelector} from 'react-redux'; 4 5 import {useEffect, useState} from "react"; … … 6 7 import Roles from "../../enumerations/Roles"; 7 8 import {useNavigate} from "react-router"; 9 import {AUTH_TOKEN} from "../../axios/axiosInstance"; 8 10 9 11 export const Header = (props) => { … … 16 18 const [username, setUsername] = useState(""); 17 19 20 const [user, setUser] = useState(""); 21 18 22 const signOut = () => { 19 23 dispatch(AuthActions.signOut()); 20 24 window.location = "/"; 21 25 } 26 27 useEffect(() => { 28 const token = localStorage.getItem(AUTH_TOKEN); 29 if (token!=null) { 30 try { 31 const decodedToken = jwtDecode(token); 32 setUser({ 33 name: decodedToken.name, 34 role: decodedToken.role, 35 hasAccess: decodedToken.hasAccess, 36 }); 37 } catch (error) { 38 console.error('Failed to decode token', error); 39 } 40 } 41 }, [auth]); 22 42 23 43 useEffect(() => { … … 49 69 </> 50 70 } 71 {role===Roles.ADMIN && 72 <> 73 <NavLink to="/admin-panel" className="nav-item nav-link">Admin Panel</NavLink> 74 </> 75 76 } 51 77 <NavLink to="/about" className="nav-item nav-link">About</NavLink> 52 78 <NavLink to="/contact" className="nav-item nav-link">Support</NavLink> … … 57 83 <img src="/images/user.png" width="45" height="45"/> 58 84 <div className="auth-box"> 59 <p className="user"><b>{username}</b></p> 60 <p className="role">{role==Roles.RECRUITER ? "Recruiter" : "Job Seeker"}</p> 85 <p className="user"><b>{user.name}</b></p> 86 {user.role==Roles.RECRUITER && <p className="role">Recruiter</p>} 87 {user.role==Roles.JOBSEEKER && <p className="role">Job Seeker</p>} 88 {user.role==Roles.ADMIN && <p className="role">Admin</p>} 89 {/*<p className="role">{user.role==Roles.RECRUITER ? "Recruiter" : "Job Seeker"}</p>*/} 61 90 </div> 62 91
Note:
See TracChangeset
for help on using the changeset viewer.