diff --git a/nginx/default.conf b/nginx/default.conf index fa7f0ed2..77545a30 100644 --- a/nginx/default.conf +++ b/nginx/default.conf @@ -1,8 +1,6 @@ server { listen 80; - error_log /var/log/nginx/error.log debug; # todo testing remove me not for production use - location / { root /usr/share/nginx/html/; try_files $uri /index.html; @@ -19,6 +17,15 @@ server { proxy_ssl_verify off; } + location ~ ^/u/ops/.* { + proxy_pass https://uri.olympiangods.org; + proxy_set_header Host uri.olympiangods.org; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_ssl_verify off; + } + location /static/ { autoindex on; alias /usr/share/nginx/html/static/; diff --git a/src/components/Auth/Login.jsx b/src/components/Auth/Login.jsx index fd1b43bc..bf9645d0 100644 --- a/src/components/Auth/Login.jsx +++ b/src/components/Auth/Login.jsx @@ -77,13 +77,23 @@ const Login = () => { setErrors({}) const result = await login({ username: formData.username, password: formData.password }) - console.log("result: ", result) - navigate("/") + if (!result.data || !result.data?.orcid_meta) { + setErrors((prev) => ({ + ...prev, + auth: "Interlex API is not returning the user information, please contact the support at support@interlex.org", + })); + } else { + const { code, orcid_meta } = result.data; + if (code === 200 || code === 302) { + setUserData({ name: orcid_meta.name, id: orcid_meta.orcid }); + } + navigate("/") + } } catch (error) { console.error("Login error:", error); setErrors((prevErrors) => ({ ...prevErrors, - auth: "An unknown error occurred. Please try again", + auth: error.message + " - " + error.errors?.[0] || " - An unknown error occurred. Please try again", })); } finally { setIsLoading(false) diff --git a/src/components/Auth/Register.jsx b/src/components/Auth/Register.jsx index 9567b072..e5068b38 100644 --- a/src/components/Auth/Register.jsx +++ b/src/components/Auth/Register.jsx @@ -7,13 +7,16 @@ import { Paper, Typography, Alert, + CircularProgress, } from "@mui/material"; -import { ArrowBack } from "@mui/icons-material"; -import { Link, useNavigate } from "react-router-dom"; +import * as yup from "yup"; import FormField from "./UI/Formfield"; +import { API_CONFIG } from "../../config"; import PasswordField from "./UI/PasswordField"; -import { register } from "../../api/endpoints/apiService"; -import * as yup from "yup"; +import { ArrowBack } from "@mui/icons-material"; +import { Link, useNavigate } from "react-router-dom"; +import { GlobalDataContext } from "../../contexts/DataContext"; +// import { register } from "../../api/endpoints/apiService"; const schema = yup.object().shape({ firstName: yup.string().required("First name is a required field"), @@ -35,50 +38,96 @@ const Register = () => { }); const [errors, setErrors] = React.useState({}); + const [isLoading, setIsLoading] = React.useState(false); + const { setUserData } = React.useContext(GlobalDataContext); const navigate = useNavigate(); + React.useEffect(() => { + let eventMethod = window.addEventListener ? "addEventListener" : "attachEvent"; + let eventer = window[eventMethod]; + let messageEvent = eventMethod === "attachEvent" ? "onmessage" : "message"; + eventer(messageEvent, function (e) { + if (!e.data || !e.data.orcid_meta) return; + const { code, orcid_meta } = e.data; + + if (code === 200 || code === 302) { + setUserData({ name: orcid_meta.name, id: orcid_meta.orcid }); + navigate("/") + } else if (code === 401) { + setErrors((prev) => ({ + ...prev, + auth: "Invalid username or password. Please try again", + })); + } else { + setErrors((prev) => ({ + ...prev, + auth: "An unknown error occurred. Please try again", + })); + } + }); + + setIsLoading(false) + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isLoading]); + const registerUser = async () => { try { await schema.validate(formData, { abortEarly: false }) setErrors({}) + setIsLoading(true); - const response = await register({ - firstName: formData.firstName, - lastName: formData.lastName, - username: formData.username, - email: formData.email, - password: formData.password, - organization: formData.organization - }); - - if (response.status === 200) { - navigate("/"); - } else if(response.status === 401) { - setErrors((prevErrors) => ({ - ...prevErrors, - auth: "Invalid data. Please try again", - })) + // send a POST request to the server with the form data in a popup window + const dataForm = document.createElement("form"); + dataForm.action = `${API_CONFIG.REAL_API.NEWUSER_ILX}`; + dataForm.method = "POST"; + dataForm.style.display = "none"; + dataForm.target = "postPopup"; + dataForm.enctype = "application/x-www-form-urlencoded"; + for (const key in formData) { + const input = document.createElement("input"); + input.type = "hidden"; + input.name = key; + input.value = formData[key]; + dataForm.appendChild(input); + } + document.body.appendChild(dataForm); + const popup = window.open("", "postPopup", "width=600,height=600"); + if (popup) { + dataForm.submit(); + popup.focus(); } else { - const errorData = await response.json(); - setErrors((prevErrors) => ({ - ...prevErrors, - auth: errorData.message || "An unknown error occurred. Please try again", + alert("Popup blocked. Please allow popups for this site."); + setErrors((prev) => ({ + ...prev, + auth: "Popup blocked. Please allow popups for this site.", })); + setIsLoading(false); } + + document.body.removeChild(dataForm); } catch (error) { console.error("Registration error:", error); setErrors((prevErrors) => ({ ...prevErrors, - auth: "An unknown error occurred. Please try again", + auth: error.message + " - " + error.errors?.[0] || " - An unknown error occurred. Please try again", })); + } finally { + setIsLoading(false); } }; return ( <> + {isLoading && ( + + + + + + )} - + Return to page @@ -167,4 +216,4 @@ const Register = () => { ); }; -export default Register; \ No newline at end of file +export default Register; diff --git a/src/components/Header/index.jsx b/src/components/Header/index.jsx index f9526929..32745b90 100644 --- a/src/components/Header/index.jsx +++ b/src/components/Header/index.jsx @@ -219,7 +219,13 @@ const Header = () => { }; const handleMenuClick = (e, menu) => { - navigate(menu.href) + if (menu.label === 'Log out') { + setUserData(null, null); + navigate('/'); + } + if (menu.href) { + navigate(menu.href) + } } React.useEffect(() => { @@ -244,6 +250,8 @@ const Header = () => { console.log("Stored user in context ", user) if(user) { setIsLoggedIn(true) + } else { + setIsLoggedIn(false) } }, [user]) diff --git a/vite.config.js b/vite.config.js index 911b647f..56292794 100644 --- a/vite.config.js +++ b/vite.config.js @@ -16,7 +16,7 @@ export default defineConfig({ "Content-Type": "application/json", }, }, - "/u/ops/user-login": { + "^/u/ops/.*": { target: "https://uri.olympiangods.org", changeOrigin: true, secure: false,