| text-align: left; | text-align: left; | ||||
| } | } | ||||
| .w-289.f { | .w-289.f { | ||||
| margin-top: 35px !important; | |||||
| margin-top: 25px !important; | |||||
| } | } |
| IconButton, | IconButton, | ||||
| InputAdornment, | InputAdornment, | ||||
| TextField, | TextField, | ||||
| Typography, | |||||
| // Typography, | |||||
| } from "@mui/material"; | } from "@mui/material"; | ||||
| import Button from "../Button/Button"; | import Button from "../Button/Button"; | ||||
| import { useState } from "react"; | import { useState } from "react"; | ||||
| import googleLogo from "../../assets/images/google1.png"; | |||||
| // import googleLogo from "../../assets/images/google1.png"; | |||||
| import DiligLogo from "../../assets/images/logo_horizontal_black.png"; | import DiligLogo from "../../assets/images/logo_horizontal_black.png"; | ||||
| import { Box } from "@mui/system"; | import { Box } from "@mui/system"; | ||||
| import { FormContext } from "../../context/FormContext"; | import { FormContext } from "../../context/FormContext"; | ||||
| import { useLocation } from "react-router-dom"; | |||||
| function FirstStepForm() { | function FirstStepForm() { | ||||
| const { activeStepIndex, setActiveStepIndex, formData, setFormData } = | const { activeStepIndex, setActiveStepIndex, formData, setFormData } = | ||||
| useContext(FormContext); | useContext(FormContext); | ||||
| const { search } = useLocation(); | |||||
| const { t } = useTranslation(); | const { t } = useTranslation(); | ||||
| const [showPassword, setShowPassword] = useState(false); | const [showPassword, setShowPassword] = useState(false); | ||||
| const handleMouseDownPassword = () => setShowPassword(!showPassword); | const handleMouseDownPassword = () => setShowPassword(!showPassword); | ||||
| const submitHandler = (values) => { | const submitHandler = (values) => { | ||||
| const data = { ...formData, ...values }; | |||||
| const data = { | |||||
| ...formData, | |||||
| ...values, | |||||
| token: search.split("&")[0].split("=")[1], | |||||
| }; | |||||
| setFormData(data); | setFormData(data); | ||||
| setActiveStepIndex(activeStepIndex + 1); | setActiveStepIndex(activeStepIndex + 1); | ||||
| }; | }; | ||||
| const formik = useFormik({ | const formik = useFormik({ | ||||
| initialValues: { | initialValues: { | ||||
| email: "", | |||||
| email: search.split("&")[1].split("=")[1], | |||||
| password: "", | password: "", | ||||
| confirm: "", | |||||
| }, | }, | ||||
| validationSchema: yup.object().shape({ | validationSchema: yup.object().shape({ | ||||
| email: yup | email: yup | ||||
| .string() | .string() | ||||
| .required(t("login.emailRequired")) | .required(t("login.emailRequired")) | ||||
| .matches(/^[\w-.]+@([\w-]+\.)+[\w-]{2,4}$/, t("login.invalidEmail")), | .matches(/^[\w-.]+@([\w-]+\.)+[\w-]{2,4}$/, t("login.invalidEmail")), | ||||
| password: yup.string().required(t("login.passwordRequired")), | |||||
| password: yup | |||||
| .string() | |||||
| .required(t("login.passwordRequired")) | |||||
| .matches( | |||||
| // eslint-disable-next-line | |||||
| /[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]+/, | |||||
| "Paswword must contain atleast one special character" | |||||
| ) | |||||
| .matches(/[0-9]/g, "Paswword must contain atleast one number") | |||||
| .matches( | |||||
| /[a-z]/g, | |||||
| "Paswword must contain at least one lowercase character" | |||||
| ) | |||||
| .matches( | |||||
| /[A-Z]/g, | |||||
| "Paswword must contain at least one uppercase character" | |||||
| ) | |||||
| .min(8, "Password must contain at least 8 characters"), | |||||
| confirm: yup | |||||
| .string() | |||||
| .required("Please retype your password.") | |||||
| .oneOf([yup.ref("password")], "Your passwords do not match."), | |||||
| }), | }), | ||||
| onSubmit: submitHandler, | onSubmit: submitHandler, | ||||
| validateOnBlur: true, | validateOnBlur: true, | ||||
| <> | <> | ||||
| <TextField | <TextField | ||||
| name="email" | name="email" | ||||
| label={"E-mail"} | |||||
| // label={"E-mail"} | |||||
| margin="normal" | margin="normal" | ||||
| disabled | |||||
| fullWidth | fullWidth | ||||
| value={formik.values.email} | |||||
| onChange={formik.handleChange} | onChange={formik.handleChange} | ||||
| error={formik.touched.email && Boolean(formik.errors.email)} | error={formik.touched.email && Boolean(formik.errors.email)} | ||||
| helperText={formik.touched.email && formik.errors.email} | helperText={formik.touched.email && formik.errors.email} | ||||
| ), | ), | ||||
| }} | }} | ||||
| /> | /> | ||||
| <TextField | |||||
| className="rounded-input" | |||||
| name="confirm" | |||||
| label={"Potvrda šifre"} | |||||
| margin="normal" | |||||
| type={showPassword ? "text" : "password"} | |||||
| fullWidth | |||||
| onChange={formik.handleChange} | |||||
| error={formik.touched.confirm && Boolean(formik.errors.confirm)} | |||||
| helperText={formik.touched.confirm && formik.errors.confirm} | |||||
| InputProps={{ | |||||
| endAdornment: ( | |||||
| <InputAdornment position="end"> | |||||
| <IconButton | |||||
| onClick={handleClickShowPassword} | |||||
| onMouseDown={handleMouseDownPassword} | |||||
| > | |||||
| {showPassword ? <Visibility /> : <VisibilityOff />} | |||||
| </IconButton> | |||||
| </InputAdornment> | |||||
| ), | |||||
| }} | |||||
| /> | |||||
| </> | </> | ||||
| <Button | <Button | ||||
| variant="contained" | variant="contained" | ||||
| sx={{ mt: 3, mb: 2 }} | |||||
| sx={{ mt: 2, mb: 2 }} | |||||
| fullWidth | fullWidth | ||||
| className="c-btn c-btn--primary w-289 f" | className="c-btn c-btn--primary w-289 f" | ||||
| type="submit" | type="submit" | ||||
| > | > | ||||
| Nastavi | Nastavi | ||||
| </Button> | </Button> | ||||
| <div className="flex-center"> | |||||
| {/* <div className="flex-center"> | |||||
| <div className="hr hr-s"></div> | <div className="hr hr-s"></div> | ||||
| <div className="hr-mid">{t("common.or")}</div> | <div className="hr-mid">{t("common.or")}</div> | ||||
| <div className="hr hr-e"></div> | <div className="hr hr-e"></div> | ||||
| </Typography> | </Typography> | ||||
| </Button> | </Button> | ||||
| <div id="signInDiv"></div> | <div id="signInDiv"></div> | ||||
| </div> | |||||
| </div> */} | |||||
| <div className="flex-center"> | <div className="flex-center"> | ||||
| <img src={DiligLogo} style={{ margin: "50px auto 30px auto" }} /> | <img src={DiligLogo} style={{ margin: "50px auto 30px auto" }} /> | ||||
| </div> | </div> |
| import { useFormik } from "formik"; | import { useFormik } from "formik"; | ||||
| import React from "react"; | |||||
| import React, { useContext } from "react"; | |||||
| import * as yup from "yup"; | import * as yup from "yup"; | ||||
| import { useTranslation } from "react-i18next"; | import { useTranslation } from "react-i18next"; | ||||
| import { | |||||
| TextField, | |||||
| Typography, | |||||
| } from "@mui/material"; | |||||
| import { TextField } from "@mui/material"; | |||||
| import Button from "../Button/Button"; | import Button from "../Button/Button"; | ||||
| import googleLogo from "../../assets/images/google1.png"; | |||||
| // import googleLogo from "../../assets/images/google1.png"; | |||||
| import DiligLogo from "../../assets/images/logo_horizontal_black.png"; | import DiligLogo from "../../assets/images/logo_horizontal_black.png"; | ||||
| import { Box } from "@mui/system"; | import { Box } from "@mui/system"; | ||||
| import { FormContext } from "../../context/FormContext"; | |||||
| import { useDispatch } from "react-redux"; | |||||
| import { registerRequest } from "../../store/actions/register/registerActions"; | |||||
| import { BASE_PAGE } from "../../constants/pages"; | |||||
| import { useHistory } from "react-router-dom"; | |||||
| function SecondStepForm() { | function SecondStepForm() { | ||||
| // const { activeStepIndex, setActiveStepIndex, formData, setFormData } = | |||||
| // useContext(FormContext); | |||||
| const { formData } = useContext(FormContext); | |||||
| const dispatch = useDispatch(); | |||||
| const { t } = useTranslation(); | const { t } = useTranslation(); | ||||
| const history = useHistory(); | |||||
| const submitHandler = (values) => { | const submitHandler = (values) => { | ||||
| console.log(values) | |||||
| // const data = { ...formData, ...values }; | |||||
| // setFormData(data); | |||||
| // setActiveStepIndex(activeStepIndex + 1); | |||||
| alert('Done') | |||||
| const data = { ...formData, ...values }; | |||||
| dispatch( | |||||
| registerRequest({ | |||||
| model: data, | |||||
| handleApiResponseSuccess, | |||||
| }) | |||||
| ); | |||||
| }; | |||||
| const handleApiResponseSuccess = () => { | |||||
| history.push({ | |||||
| pathname: BASE_PAGE, | |||||
| state: { | |||||
| from: history.location.pathname, | |||||
| }, | |||||
| }); | |||||
| }; | }; | ||||
| const formik = useFormik({ | const formik = useFormik({ | ||||
| linkedin: "", | linkedin: "", | ||||
| }, | }, | ||||
| validationSchema: yup.object().shape({ | validationSchema: yup.object().shape({ | ||||
| phone: yup | |||||
| .string() | |||||
| .required('Required'), | |||||
| position: yup.string().required('Required'), | |||||
| linkedin: yup.string().required('Required'), | |||||
| phone: yup.string().required("Required"), | |||||
| position: yup.string().required("Required"), | |||||
| linkedin: yup.string().required("Required"), | |||||
| }), | }), | ||||
| onSubmit: submitHandler, | onSubmit: submitHandler, | ||||
| validateOnBlur: true, | validateOnBlur: true, | ||||
| > | > | ||||
| Registruj se | Registruj se | ||||
| </Button> | </Button> | ||||
| <div className="flex-center"> | |||||
| {/* <div className="flex-center"> | |||||
| <div className="hr hr-s"></div> | <div className="hr hr-s"></div> | ||||
| <div className="hr-mid">{t("common.or")}</div> | <div className="hr-mid">{t("common.or")}</div> | ||||
| <div className="hr hr-e"></div> | <div className="hr hr-e"></div> | ||||
| </Typography> | </Typography> | ||||
| </Button> | </Button> | ||||
| <div id="signInDiv"></div> | <div id="signInDiv"></div> | ||||
| </div> | |||||
| </div> */} | |||||
| <div className="flex-center"> | <div className="flex-center"> | ||||
| <img src={DiligLogo} style={{ margin: "50px auto 30px auto" }} /> | <img src={DiligLogo} style={{ margin: "50px auto 30px auto" }} /> | ||||
| </div> | </div> | ||||
| ); | ); | ||||
| } | } | ||||
| export default SecondStepForm; | |||||
| export default SecondStepForm; |
| import PropTypes from "prop-types"; | import PropTypes from "prop-types"; | ||||
| import { useFormik } from "formik"; | import { useFormik } from "formik"; | ||||
| import { useDispatch, useSelector } from "react-redux"; | import { useDispatch, useSelector } from "react-redux"; | ||||
| import { NavLink } from "react-router-dom"; | |||||
| import { NavLink, useLocation } from "react-router-dom"; | |||||
| import * as Yup from "yup"; | import * as Yup from "yup"; | ||||
| import { useTranslation } from "react-i18next"; | import { useTranslation } from "react-i18next"; | ||||
| import HrLogo from "../../assets/images/hrcenter.png"; | import HrLogo from "../../assets/images/hrcenter.png"; | ||||
| fetchGoogleUser, | fetchGoogleUser, | ||||
| } from "../../store/actions/login/loginActions"; | } from "../../store/actions/login/loginActions"; | ||||
| import { selectLoginError } from "../../store/selectors/loginSelectors"; | import { selectLoginError } from "../../store/selectors/loginSelectors"; | ||||
| import { FORGOT_PASSWORD_PAGE, HOME_PAGE } from "../../constants/pages"; | |||||
| import { | |||||
| ADS_PAGE, | |||||
| FORGOT_PASSWORD_PAGE, | |||||
| HOME_PAGE, | |||||
| } from "../../constants/pages"; | |||||
| import { | import { | ||||
| Box, | Box, | ||||
| Button, | Button, | ||||
| import { JWT_TOKEN } from "../../constants/localStorage"; | import { JWT_TOKEN } from "../../constants/localStorage"; | ||||
| import Step from "../../components/Registration/Step"; | import Step from "../../components/Registration/Step"; | ||||
| import { FormContext, FormProvider } from "../../context/FormContext"; | import { FormContext, FormProvider } from "../../context/FormContext"; | ||||
| import { selectIsUserAuthenticated } from "../../store/selectors/userSelectors"; | |||||
| const RegisterPage = ({ history }) => { | const RegisterPage = ({ history }) => { | ||||
| // const dispatch = useDispatch(); | // const dispatch = useDispatch(); | ||||
| const { t } = useTranslation(); | const { t } = useTranslation(); | ||||
| // const error = useSelector(selectLoginError); | // const error = useSelector(selectLoginError); | ||||
| const { search } = useLocation(); | |||||
| const { activeStepIndex } = useContext(FormContext); | const { activeStepIndex } = useContext(FormContext); | ||||
| selectIsLoadingByActionType(LOGIN_GOOGLE_USER_LOADING) | selectIsLoadingByActionType(LOGIN_GOOGLE_USER_LOADING) | ||||
| ); | ); | ||||
| const isUserAuthenticated = useSelector(selectIsUserAuthenticated); | |||||
| useEffect(() => { | useEffect(() => { | ||||
| if (isInit) { | if (isInit) { | ||||
| setIsInit(false); | setIsInit(false); | ||||
| return; | return; | ||||
| } | } | ||||
| if (!isUserAuthenticated) { | |||||
| history.push({ pathname: ADS_PAGE }); | |||||
| } | |||||
| }, [isInit]); | }, [isInit]); | ||||
| return ( | return ( | ||||
| }} | }} | ||||
| > | > | ||||
| <img src={HrLogo} className="login-logo" /> | <img src={HrLogo} className="login-logo" /> | ||||
| <Typography variant="h5" sx={{ m: 1, mt: 3 }}> | |||||
| {t("login.welcome")} | |||||
| </Typography> | |||||
| <Typography variant="p" sx={{ mb: 2 }}> | |||||
| Dva koraka do HR Centra. | |||||
| </Typography> | |||||
| <div className="steps-cont"> | |||||
| <div | |||||
| className={`step ${activeStepIndex && activeStepIndex === 1 ? "done" : "current"}`} | |||||
| > | |||||
| 1 | |||||
| </div> | |||||
| <div className="line-btw"></div> | |||||
| <div | |||||
| className={`step ${ | |||||
| activeStepIndex && activeStepIndex === 1 ? "current" : "disallowed" | |||||
| }`} | |||||
| > | |||||
| 2 | |||||
| </div> | |||||
| </div> | |||||
| {/* {error && <ErrorMessage error={error} />} */} | |||||
| {/* THIS SHOULD BE COPIED */} | |||||
| <Step /> | |||||
| {search.split("&")[1]?.split("=")[1] ? ( | |||||
| <> | |||||
| <Typography variant="h5" sx={{ m: 1, mt: 3 }}> | |||||
| {t("login.welcome")} | |||||
| </Typography> | |||||
| <Typography variant="p" sx={{ mb: 2 }}> | |||||
| Dva koraka do HR Centra. | |||||
| </Typography> | |||||
| <div className="steps-cont"> | |||||
| <div | |||||
| className={`step ${ | |||||
| activeStepIndex && activeStepIndex === 1 | |||||
| ? "done" | |||||
| : "current" | |||||
| }`} | |||||
| > | |||||
| 1 | |||||
| </div> | |||||
| <div className="line-btw"></div> | |||||
| <div | |||||
| className={`step ${ | |||||
| activeStepIndex && activeStepIndex === 1 | |||||
| ? "current" | |||||
| : "disallowed" | |||||
| }`} | |||||
| > | |||||
| 2 | |||||
| </div> | |||||
| </div> | |||||
| <Step /> | |||||
| </> | |||||
| ) : ( | |||||
| <h3 style={{ margin: "50px 0px" }}>There was a mistake...</h3> | |||||
| )} | |||||
| </Box> | </Box> | ||||
| </Container> | </Container> | ||||
| </> | </> |
| <div className="flex-center" style={{ justifyContent: "flex-start" }}> | <div className="flex-center" style={{ justifyContent: "flex-start" }}> | ||||
| <p style={{ width: "85px" }}>LinkedIn:</p> | <p style={{ width: "85px" }}>LinkedIn:</p> | ||||
| <p className="text-blue"> | <p className="text-blue"> | ||||
| {user?.socialMedias | |||||
| ? user.socialMedias | |||||
| {user?.linkedIn | |||||
| ? user.linkedIn | |||||
| : "User takes not part in any social media."} | : "User takes not part in any social media."} | ||||
| </p> | </p> | ||||
| </div> | </div> |
| )} | )} | ||||
| </td> | </td> | ||||
| <td>{n.email}</td> | <td>{n.email}</td> | ||||
| <td className='profession'>HR Specialist</td> | |||||
| <td className='profession'>{n.position}</td> | |||||
| {editEnable && ( | {editEnable && ( | ||||
| <td> | <td> | ||||
| <> | <> |
| logout: base + "/authentications/logout?userId={userId}", | logout: base + "/authentications/logout?userId={userId}", | ||||
| forgetPassword: base + "/authentications/ForgotPassword", | forgetPassword: base + "/authentications/ForgotPassword", | ||||
| resetPassword: base + "/authentications/RessetPassword", | resetPassword: base + "/authentications/RessetPassword", | ||||
| register: base + "/authentications/register", | |||||
| }, | }, | ||||
| users: { | users: { | ||||
| allUsers: base + "/users", | allUsers: base + "/users", |
| import { postRequest } from "."; | |||||
| import apiEndpoints from "./apiEndpoints"; | |||||
| export const register = (payload) => | |||||
| postRequest(apiEndpoints.authentications.register, payload); |
| export const REGISTER_REQUEST = 'REGISTER_REQUEST' | |||||
| export const REGISTER_SUCCESS = 'REGISTER_SUCCESS' | |||||
| export const REGISTER_ERROR = 'REGISTER_ERROR' |
| import { | |||||
| REGISTER_ERROR, | |||||
| REGISTER_REQUEST, | |||||
| REGISTER_SUCCESS, | |||||
| } from "./registerActionConstants"; | |||||
| export const registerRequest = (payload) => ({ | |||||
| type: REGISTER_REQUEST, | |||||
| payload, | |||||
| }); | |||||
| export const registerError = (payload) => ({ | |||||
| type: REGISTER_ERROR, | |||||
| payload, | |||||
| }); | |||||
| export const registerSuccess = (payload) => ({ | |||||
| type: REGISTER_SUCCESS, | |||||
| payload, | |||||
| }); |
| import statsReducer from "./stats/statsReducer"; | import statsReducer from "./stats/statsReducer"; | ||||
| import scheduleReducer from "./schedule/scheduleReducer"; | import scheduleReducer from "./schedule/scheduleReducer"; | ||||
| import archiveActiveAdReducer from "./ad/archiveActiveAdReducer"; | import archiveActiveAdReducer from "./ad/archiveActiveAdReducer"; | ||||
| import registerReducer from "./register/registerReducer"; | |||||
| export default combineReducers({ | export default combineReducers({ | ||||
| login: loginReducer, | login: loginReducer, | ||||
| createPattern: createPatternReducer, | createPattern: createPatternReducer, | ||||
| updatePattern: updatePatternReducer, | updatePattern: updatePatternReducer, | ||||
| stats: statsReducer, | stats: statsReducer, | ||||
| schedule:scheduleReducer | |||||
| schedule:scheduleReducer, | |||||
| register: registerReducer | |||||
| }); | }); |
| import createReducer from "../../utils/createReducer"; | |||||
| import { | |||||
| REGISTER_ERROR, | |||||
| REGISTER_SUCCESS, | |||||
| } from "../../actions/register/registerActionConstants"; | |||||
| const initialState = { | |||||
| isSuccess: false, | |||||
| errorMessage: "", | |||||
| }; | |||||
| export default createReducer( | |||||
| { | |||||
| [REGISTER_SUCCESS]: setSuccess, | |||||
| [REGISTER_ERROR]: setError, | |||||
| }, | |||||
| initialState | |||||
| ); | |||||
| function setSuccess(state) { | |||||
| return { | |||||
| ...state, | |||||
| isSuccess: true, | |||||
| }; | |||||
| } | |||||
| function setError(state, action) { | |||||
| return { | |||||
| ...state, | |||||
| errorMessage: action.payload, | |||||
| }; | |||||
| } |
| import patternsSage from "./patternsSaga"; | import patternsSage from "./patternsSaga"; | ||||
| import statsSaga from "./statsSaga"; | import statsSaga from "./statsSaga"; | ||||
| import scheduleSaga from "./scheduleSaga"; | import scheduleSaga from "./scheduleSaga"; | ||||
| import registerSaga from "./registerSaga"; | |||||
| export default function* rootSaga() { | export default function* rootSaga() { | ||||
| yield all([ | yield all([ | ||||
| processesSaga(), | processesSaga(), | ||||
| patternsSage(), | patternsSage(), | ||||
| statsSaga(), | statsSaga(), | ||||
| scheduleSaga() | |||||
| scheduleSaga(), | |||||
| registerSaga(), | |||||
| ]); | ]); | ||||
| } | } |
| import { all, call, put, takeEvery } from "redux-saga/effects"; | |||||
| import { register } from "../../request/registerRequest"; | |||||
| import { rejectErrorCodeHelper } from "../../util/helpers/rejectErrorCodeHelper"; | |||||
| import { REGISTER_REQUEST } from "../actions/register/registerActionConstants"; | |||||
| import { registerError, registerSuccess } from "../actions/register/registerActions"; | |||||
| export function* registerUser({payload}) { | |||||
| try { | |||||
| yield call(register, payload.model); | |||||
| yield put(registerSuccess()); | |||||
| console.log('ovde 1') | |||||
| if(payload.handleApiResponseSuccess){ | |||||
| console.log('ovde 2') | |||||
| yield call(payload.handleApiResponseSuccess) | |||||
| } | |||||
| } catch (error) { | |||||
| if (error.response && error.response.data) { | |||||
| const errorMessage = yield call(rejectErrorCodeHelper, error); | |||||
| yield put(registerError(errorMessage)); | |||||
| } | |||||
| } | |||||
| } | |||||
| export default function* registerSaga() { | |||||
| yield all([ | |||||
| takeEvery(REGISTER_REQUEST, registerUser), | |||||
| ]); | |||||
| } |
| const JwtToken = yield call(authScopeStringGetHelper, JWT_TOKEN); | const JwtToken = yield call(authScopeStringGetHelper, JWT_TOKEN); | ||||
| yield call(addHeaderToken, JwtToken); | yield call(addHeaderToken, JwtToken); | ||||
| const result = yield call(getStats); | const result = yield call(getStats); | ||||
| console.log(result) | |||||
| yield put(getStatsSuccess(result.data)); | yield put(getStatsSuccess(result.data)); | ||||
| } catch (error) { | } catch (error) { | ||||
| if (error.response && error.response.data) { | if (error.response && error.response.data) { |