user token saved, login handled
This commit is contained in:
parent
b8e46b43fc
commit
1519eec83e
|
|
@ -11,6 +11,7 @@
|
|||
"@testing-library/jest-dom": "5.16.1",
|
||||
"@testing-library/react": "12.1.2",
|
||||
"@testing-library/user-event": "13.5.0",
|
||||
"axios": "^0.26.0",
|
||||
"node-sass": "^7.0.1",
|
||||
"react": "^17.0.2",
|
||||
"react-dom": "^17.0.2",
|
||||
|
|
@ -4460,6 +4461,14 @@
|
|||
"node": ">=4"
|
||||
}
|
||||
},
|
||||
"node_modules/axios": {
|
||||
"version": "0.26.0",
|
||||
"resolved": "https://registry.npmjs.org/axios/-/axios-0.26.0.tgz",
|
||||
"integrity": "sha512-lKoGLMYtHvFrPVt3r+RBMp9nh34N0M8zEfCWqdWZx6phynIEhQqAdydpyBAAG211zlhX9Rgu08cOamy6XjE5Og==",
|
||||
"dependencies": {
|
||||
"follow-redirects": "^1.14.8"
|
||||
}
|
||||
},
|
||||
"node_modules/axobject-query": {
|
||||
"version": "2.2.0",
|
||||
"resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz",
|
||||
|
|
@ -7656,9 +7665,9 @@
|
|||
"integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg=="
|
||||
},
|
||||
"node_modules/follow-redirects": {
|
||||
"version": "1.14.7",
|
||||
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz",
|
||||
"integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==",
|
||||
"version": "1.14.9",
|
||||
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz",
|
||||
"integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "individual",
|
||||
|
|
@ -20499,6 +20508,14 @@
|
|||
"resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.0.tgz",
|
||||
"integrity": "sha512-btWy2rze3NnxSSxb7LtNhPYYFrRoFBfjiGzmSc/5Hu47wApO2KNXjP/w7Nv2Uz/Fyr/pfEiwOkcXhDxu0jz5FA=="
|
||||
},
|
||||
"axios": {
|
||||
"version": "0.26.0",
|
||||
"resolved": "https://registry.npmjs.org/axios/-/axios-0.26.0.tgz",
|
||||
"integrity": "sha512-lKoGLMYtHvFrPVt3r+RBMp9nh34N0M8zEfCWqdWZx6phynIEhQqAdydpyBAAG211zlhX9Rgu08cOamy6XjE5Og==",
|
||||
"requires": {
|
||||
"follow-redirects": "^1.14.8"
|
||||
}
|
||||
},
|
||||
"axobject-query": {
|
||||
"version": "2.2.0",
|
||||
"resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz",
|
||||
|
|
@ -22886,9 +22903,9 @@
|
|||
"integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg=="
|
||||
},
|
||||
"follow-redirects": {
|
||||
"version": "1.14.7",
|
||||
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz",
|
||||
"integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ=="
|
||||
"version": "1.14.9",
|
||||
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz",
|
||||
"integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w=="
|
||||
},
|
||||
"forever-agent": {
|
||||
"version": "0.6.1",
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@
|
|||
"@testing-library/jest-dom": "5.16.1",
|
||||
"@testing-library/react": "12.1.2",
|
||||
"@testing-library/user-event": "13.5.0",
|
||||
"axios": "^0.26.0",
|
||||
"node-sass": "^7.0.1",
|
||||
"react": "^17.0.2",
|
||||
"react-dom": "^17.0.2",
|
||||
|
|
|
|||
46
src/App.js
46
src/App.js
|
|
@ -1,6 +1,10 @@
|
|||
// IMPORT MODULES
|
||||
import React from "react";
|
||||
import React, { useState, useEffect, useMemo } from "react";
|
||||
import { Routes, Route } from "react-router-dom";
|
||||
import { UserContext } from "./backend/UserContext";
|
||||
|
||||
// IMPORT FUNCTIONS
|
||||
import { getUserInfo } from "./backend/getUserInfo";
|
||||
|
||||
// IMPORT STYLES
|
||||
import "./styles/style.scss";
|
||||
|
|
@ -20,20 +24,34 @@ import SignUp from "./pages/SignUp";
|
|||
import Home from "./pages/Home";
|
||||
|
||||
const App = () => {
|
||||
const loginUrl = "http://95.85.124.85:8000/api/me";
|
||||
const [user, setUser] = useState();
|
||||
const providerValue = useMemo(() => ({ user, setUser }), [user, setUser]);
|
||||
useEffect(() => {
|
||||
const userToken = localStorage.getItem("userToken");
|
||||
if (userToken) {
|
||||
getUserInfo(loginUrl, userToken, setUser);
|
||||
}
|
||||
}, []);
|
||||
return (
|
||||
<div className="App">
|
||||
<Routes>
|
||||
<Route path="/" element={<Main />} />
|
||||
<Route path="/sign-in" element={<SignIn />} />
|
||||
<Route path="/sign-up" element={<SignUp />} />
|
||||
<Route path="/home" element={<Home ChildEl={Base} />} />
|
||||
<Route path="/home/cards" element={<Home ChildEl={Cards} />} />
|
||||
<Route path="/home/credits" element={<Home ChildEl={Credits} />} />
|
||||
<Route path="/home/contact-us" element={<Home ChildEl={ContactUs} />} />
|
||||
<Route path="/home/recovery" element={<Home ChildEl={Recovery} />} />
|
||||
<Route path="/home/profile" element={<Home ChildEl={Profile} />} />
|
||||
</Routes>
|
||||
</div>
|
||||
<UserContext.Provider value={providerValue}>
|
||||
<div className="App">
|
||||
<Routes>
|
||||
<Route path="/" element={<Main />} />
|
||||
<Route path="/sign-in" element={<SignIn />} />
|
||||
<Route path="/sign-up" element={<SignUp />} />
|
||||
<Route path="/home" element={<Home ChildEl={Base} />} />
|
||||
<Route path="/home/cards" element={<Home ChildEl={Cards} />} />
|
||||
<Route path="/home/credits" element={<Home ChildEl={Credits} />} />
|
||||
<Route
|
||||
path="/home/contact-us"
|
||||
element={<Home ChildEl={ContactUs} />}
|
||||
/>
|
||||
<Route path="/home/recovery" element={<Home ChildEl={Recovery} />} />
|
||||
<Route path="/home/profile" element={<Home ChildEl={Profile} />} />
|
||||
</Routes>
|
||||
</div>
|
||||
</UserContext.Provider>
|
||||
);
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,4 @@
|
|||
// IMPORT MODULES
|
||||
import { createContext } from "react";
|
||||
|
||||
export const UserContext = createContext(null);
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
// IMPORT MODULES
|
||||
import axios from "axios";
|
||||
|
||||
export const getUserInfo = (url, userToken, setState) => {
|
||||
axios.get(`${url}?token=${userToken}`).then((res, err) => {
|
||||
if (err) {
|
||||
return `Failed to fetch user info: ${err}`;
|
||||
}
|
||||
if (setState) {
|
||||
setState(res.data);
|
||||
} else {
|
||||
return res.data;
|
||||
}
|
||||
});
|
||||
};
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
// IMPORT MODULES
|
||||
import axios from "axios";
|
||||
|
||||
export const loginUser = (url, formData, setState, tokenSaved) => {
|
||||
axios.post(url, formData).then((res, err) => {
|
||||
setState(res.data.user);
|
||||
if (tokenSaved) {
|
||||
localStorage.setItem("userToken", res.data.token);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
|
@ -6,15 +6,16 @@ import { Link } from "react-router-dom";
|
|||
import logout from "../../icons/logout.svg";
|
||||
import up from "../../icons/clipboard.svg";
|
||||
|
||||
const SignForm = ({ setRecoveryOpen }) => {
|
||||
const SignForm = ({ setRecoveryOpen, setFormData }) => {
|
||||
const data = new FormData();
|
||||
const [inputValid, setInputValid] = useState({
|
||||
login: false,
|
||||
password: false,
|
||||
login: null,
|
||||
password: null,
|
||||
});
|
||||
const [btnEnabled, setBtnEnabled] = useState(false);
|
||||
|
||||
useEffect(() => {
|
||||
if (inputValid.login === true && inputValid.password === true) {
|
||||
if (inputValid.login && inputValid.password) {
|
||||
setBtnEnabled(true);
|
||||
} else {
|
||||
setBtnEnabled(false);
|
||||
|
|
@ -38,9 +39,10 @@ const SignForm = ({ setRecoveryOpen }) => {
|
|||
name="login"
|
||||
onChange={(e) => {
|
||||
if (e.target.value !== "") {
|
||||
setInputValid({ ...inputValid, login: true });
|
||||
setInputValid({ ...inputValid, login: e.target.value });
|
||||
data.append("username", e.target.value);
|
||||
} else {
|
||||
setInputValid({ ...inputValid, login: false });
|
||||
setInputValid({ ...inputValid, login: null });
|
||||
}
|
||||
}}
|
||||
/>
|
||||
|
|
@ -54,9 +56,9 @@ const SignForm = ({ setRecoveryOpen }) => {
|
|||
id="password"
|
||||
onChange={(e) => {
|
||||
if (e.target.value.length >= 8) {
|
||||
setInputValid({ ...inputValid, password: true });
|
||||
setInputValid({ ...inputValid, password: e.target.value });
|
||||
} else {
|
||||
setInputValid({ ...inputValid, password: false });
|
||||
setInputValid({ ...inputValid, password: null });
|
||||
}
|
||||
}}
|
||||
/>
|
||||
|
|
@ -75,7 +77,16 @@ const SignForm = ({ setRecoveryOpen }) => {
|
|||
</div>
|
||||
</div>
|
||||
<div className="sign-bottom">
|
||||
<button disabled={!btnEnabled} type="button" className="sign-btn">
|
||||
<button
|
||||
disabled={!btnEnabled}
|
||||
type="button"
|
||||
className="sign-btn"
|
||||
onClick={() => {
|
||||
data.append("username", inputValid.login);
|
||||
data.append("password", inputValid.password);
|
||||
setFormData(data);
|
||||
}}
|
||||
>
|
||||
<div>
|
||||
<h3>Войти</h3>
|
||||
<div className="btn-img">
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
// IMPORT MODULES
|
||||
import React, { useEffect } from "react";
|
||||
import React from "react";
|
||||
|
||||
// IMPORT COMPONENTS
|
||||
import Breadcrumb from "../components/global/Breadcrumb";
|
||||
|
|
|
|||
|
|
@ -1,5 +1,10 @@
|
|||
// IMPORT MODULES
|
||||
import React, { useState } from "react";
|
||||
import React, { useState, useContext, useEffect, useRef } from "react";
|
||||
import { useNavigate } from "react-router-dom";
|
||||
import { UserContext } from "../backend/UserContext";
|
||||
|
||||
// IMPORT FUNCTIONS
|
||||
import { loginUser } from "../backend/loginUser";
|
||||
|
||||
// IMPORT COMPONENTS
|
||||
import LogoBg from "../components/global/LogoBg";
|
||||
|
|
@ -11,7 +16,27 @@ import SignForm from "../components/sign/SignForm";
|
|||
import PasswordRec from "../components/sign/PasswordRec";
|
||||
|
||||
const SignIn = () => {
|
||||
const checkFirstLoad = useRef(true);
|
||||
const postUrl = "http://95.85.124.85:8000/api/login";
|
||||
const [formData, setFormData] = useState();
|
||||
const { user, setUser } = useContext(UserContext);
|
||||
const [recoveryOpen, setRecoveryOpen] = useState(false);
|
||||
const navigate = useNavigate();
|
||||
useEffect(() => {
|
||||
if (user) {
|
||||
navigate("/home");
|
||||
} else {
|
||||
navigate("/sign-in");
|
||||
}
|
||||
}, [user]);
|
||||
|
||||
useEffect(() => {
|
||||
if (checkFirstLoad.current) {
|
||||
checkFirstLoad.current = false;
|
||||
} else {
|
||||
loginUser(postUrl, formData, setUser, true);
|
||||
}
|
||||
}, [formData]);
|
||||
return (
|
||||
<section className="sign-in">
|
||||
<PasswordRec
|
||||
|
|
@ -22,7 +47,10 @@ const SignIn = () => {
|
|||
<LogoBg />
|
||||
<div className="container">
|
||||
<div className="sign-in-inner">
|
||||
<SignForm setRecoveryOpen={setRecoveryOpen} />
|
||||
<SignForm
|
||||
setRecoveryOpen={setRecoveryOpen}
|
||||
setFormData={setFormData}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<Footer />
|
||||
|
|
|
|||
Loading…
Reference in New Issue