diff --git a/.env b/.env
index a8f8557..56d4893 100644
--- a/.env
+++ b/.env
@@ -4,4 +4,5 @@ WDS_SOCKET_PORT=0
NODE_PATH=src/
REACT_APP_API_ROOT=http://localhost:8080
REACT_APP_HOME_URL=http://localhost:3000
-REACT_APP_API_URL=http://readyvery.com/api/v1
\ No newline at end of file
+REACT_APP_API_URL=http://readyvery.com/api/v1
+REACT_APP_KAKAO_LOGIN=http://localhost:8080/oauth2/authorization/kakao
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 2fdbafc..e88f4d9 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -21,6 +21,7 @@
"moment": "^2.29.4",
"react": "^18.2.0",
"react-bootstrap": "^2.9.1",
+ "react-cookie": "^6.1.1",
"react-dom": "^18.2.0",
"react-icons": "^4.11.0",
"react-modal": "^3.16.1",
@@ -4856,6 +4857,11 @@
"@types/node": "*"
}
},
+ "node_modules/@types/cookie": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.4.tgz",
+ "integrity": "sha512-7z/eR6O859gyWIAjuvBWFzNURmf2oPBmJlfVWkwehU5nzIyjwBsTh7WMmEEV4JFnHuQ3ex4oyTvfKzcyJVDBNA=="
+ },
"node_modules/@types/d3-color": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-2.0.6.tgz",
@@ -15864,6 +15870,19 @@
}
}
},
+ "node_modules/react-cookie": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/react-cookie/-/react-cookie-6.1.1.tgz",
+ "integrity": "sha512-fuFRpf8LH6SfmVMowDUIRywJF5jAUDUWrm0EI5VdXfTl5bPcJ7B0zWbuYpT0Tvikx7Gs18MlvAT+P+744dUz2g==",
+ "dependencies": {
+ "@types/hoist-non-react-statics": "^3.3.1",
+ "hoist-non-react-statics": "^3.3.2",
+ "universal-cookie": "^6.0.0"
+ },
+ "peerDependencies": {
+ "react": ">= 16.3.0"
+ }
+ },
"node_modules/react-dev-utils": {
"version": "12.0.1",
"resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz",
@@ -18296,6 +18315,15 @@
"node": ">=8"
}
},
+ "node_modules/universal-cookie": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/universal-cookie/-/universal-cookie-6.1.1.tgz",
+ "integrity": "sha512-33S9x3CpdUnnjwTNs2Fgc41WGve2tdLtvaK2kPSbZRc5pGpz2vQFbRWMxlATsxNNe/Cy8SzmnmbuBM85jpZPtA==",
+ "dependencies": {
+ "@types/cookie": "^0.5.1",
+ "cookie": "^0.5.0"
+ }
+ },
"node_modules/universalify": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
@@ -22680,6 +22708,11 @@
"@types/node": "*"
}
},
+ "@types/cookie": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.4.tgz",
+ "integrity": "sha512-7z/eR6O859gyWIAjuvBWFzNURmf2oPBmJlfVWkwehU5nzIyjwBsTh7WMmEEV4JFnHuQ3ex4oyTvfKzcyJVDBNA=="
+ },
"@types/d3-color": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-2.0.6.tgz",
@@ -30622,6 +30655,16 @@
"warning": "^4.0.3"
}
},
+ "react-cookie": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/react-cookie/-/react-cookie-6.1.1.tgz",
+ "integrity": "sha512-fuFRpf8LH6SfmVMowDUIRywJF5jAUDUWrm0EI5VdXfTl5bPcJ7B0zWbuYpT0Tvikx7Gs18MlvAT+P+744dUz2g==",
+ "requires": {
+ "@types/hoist-non-react-statics": "^3.3.1",
+ "hoist-non-react-statics": "^3.3.2",
+ "universal-cookie": "^6.0.0"
+ }
+ },
"react-dev-utils": {
"version": "12.0.1",
"resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz",
@@ -32396,6 +32439,15 @@
"crypto-random-string": "^2.0.0"
}
},
+ "universal-cookie": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/universal-cookie/-/universal-cookie-6.1.1.tgz",
+ "integrity": "sha512-33S9x3CpdUnnjwTNs2Fgc41WGve2tdLtvaK2kPSbZRc5pGpz2vQFbRWMxlATsxNNe/Cy8SzmnmbuBM85jpZPtA==",
+ "requires": {
+ "@types/cookie": "^0.5.1",
+ "cookie": "^0.5.0"
+ }
+ },
"universalify": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
diff --git a/package.json b/package.json
index 2fb1762..d2cf359 100644
--- a/package.json
+++ b/package.json
@@ -16,6 +16,7 @@
"moment": "^2.29.4",
"react": "^18.2.0",
"react-bootstrap": "^2.9.1",
+ "react-cookie": "^6.1.1",
"react-dom": "^18.2.0",
"react-icons": "^4.11.0",
"react-modal": "^3.16.1",
diff --git a/src/App.js b/src/App.js
index aa046df..198841d 100644
--- a/src/App.js
+++ b/src/App.js
@@ -1,25 +1,63 @@
-import { Route, Routes } from "react-router-dom";
+import axios from 'axios';
+import React, { Suspense } from 'react';
+import { useCookies } from "react-cookie";
+import { Route, Routes, useNavigate } from "react-router-dom";
import { RecoilRoot } from "recoil";
-import Inventory from "../src/pages/Inventory/Inventory";
+import InventoryPage from "../src/pages/Inventory/Inventory";
import Mypage from "../src/pages/Mypage/Mypage";
-import Sales from "../src/pages/Sales/Sales";
+import SalesPage from "../src/pages/Sales/Sales";
import "./App.css";
-import Home from "./pages/Home/Home";
+import Auth from "./hoc/auth.jsx";
+import useInterval from './hooks/useInterval.jsx';
+import HomePage from "./pages/Home/Home";
+import MainPage from "./pages/Main/MainPage.jsx";
function App() {
+ const [cookies, , removeCookies] = useCookies();
+ const navigate = useNavigate();
+ const apiUrl = process.env.REACT_APP_API_ROOT;
+
+ const NewLoginPage = Auth(MainPage, false);
+ const NewHomePage = Auth(HomePage, true);
+ const NewInventoryPage = Auth(InventoryPage, true);
+ const NewSalesPage = Auth(SalesPage, true);
+ const NewMyPage = Auth(Mypage, true);
+
+ const expiredTime = 1000 * 60 * 60 * 24;
+ useInterval(() => {
+ if(
+ cookies.refreshToken !== 'undefined' &&
+ cookies.refreshToken !== undefined &&
+ cookies.refreshToken
+ ){
+ const config = {
+ withCredentials: true,
+ }
+ axios.get(`${apiUrl}/api/v1/refresh/token`, config)
+ .then((response) => {
+ console.log(response);
+ if (!response.data) {
+ removeCookies();
+ navigate('/');
+ }
+ })
+ .catch((err) => {
+ navigate("/");
+ })
+ }
+ }, expiredTime - 60000);
return (
- {/* */}
-
+ Loading...
}>
- } />
- } />
- } />
- } />
+ } />
+ } />
+ } />
+ } />
+ } />
-
- {/* */}
+
);
diff --git a/src/Atom/status.jsx b/src/Atom/status.jsx
index c64e3e9..b795518 100644
--- a/src/Atom/status.jsx
+++ b/src/Atom/status.jsx
@@ -1,4 +1,5 @@
-import { atom } from "recoil";
+import axios from "axios";
+import { atom, selector } from "recoil";
export const storeState = atom({
key: "storeState", // 전역적으로 고유한 값
@@ -13,3 +14,58 @@ export const orderState = atom({
complete: 0,
},
});
+
+export const isAuthenticatedState = atom({
+ key: 'isAuthenticatedState',
+ default: false,
+});
+
+export const getAuthenticatedSelector = selector({
+ key: 'auth/get',
+ get: async ({get}) => {
+ return get(isAuthenticatedState);
+ },
+
+ set: ({set}) => {
+ set(isAuthenticatedState, (currentValue) => !currentValue);
+ }
+})
+
+export const loginState = atom({
+ key: 'loginState',
+ default: {
+ accessToken: null,
+ expiredTime: null
+ },
+});
+
+export const userState = atom({
+ key: 'userState',
+ dafault: null,
+})
+
+export const getUserSelector = selector({
+ key: 'user/get',
+ get: async ({get, set}) => {
+ try{
+ const apiUrl = process.env.REACT_APP_API_ROOT;
+ const config = {
+ withCredentials: true
+ };
+ const response = await axios.get(`${apiUrl}/api/v1/auth`, config)
+ const userData = response.data;
+ // if (JSON.stringify(userState) !== JSON.stringify(userData)) {
+ // // 다르면 userInfo 업데이트
+ // // set(userState, userData);
+ // }
+ return userData;
+ } catch (err){
+ // 에러처리
+ return "404";
+ }
+ },
+
+ set: ({set}, newValue) => {
+ set(userState, newValue)
+ }
+})
\ No newline at end of file
diff --git a/src/assets/icons/Big_LOGO.svg b/src/assets/icons/Big_LOGO.svg
new file mode 100644
index 0000000..eb2dae2
--- /dev/null
+++ b/src/assets/icons/Big_LOGO.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/assets/icons/img_kakao.png b/src/assets/icons/img_kakao.png
new file mode 100644
index 0000000..9bfced5
Binary files /dev/null and b/src/assets/icons/img_kakao.png differ
diff --git a/src/components/views/NavBar/NavBar.css b/src/components/views/NavBar/NavBar.css
index 09cfb25..093bec1 100644
--- a/src/components/views/NavBar/NavBar.css
+++ b/src/components/views/NavBar/NavBar.css
@@ -1,6 +1,7 @@
.navbar {
width: 8.875rem;
- height: 46.25rem;
+ /* height: 46.25rem; */
+ height: 45.75rem;
/* height: 42.5rem; */
background-color: #2e2d2d;
diff --git a/src/components/views/NavBar/NavBar.jsx b/src/components/views/NavBar/NavBar.jsx
index 4bac562..5dace46 100644
--- a/src/components/views/NavBar/NavBar.jsx
+++ b/src/components/views/NavBar/NavBar.jsx
@@ -1,6 +1,6 @@
import "bootstrap/dist/css/bootstrap.min.css";
import React from "react";
-import { Nav } from "react-bootstrap";
+import { Link } from "react-router-dom";
import { useRecoilCallback, useRecoilState } from "recoil";
import { storeState } from "../../../Atom/status";
import Home from "../../../assets/icons/Navbar/Home.svg"; //홈
@@ -24,8 +24,8 @@ const NavBar = () => {
return (
-
- {currentPath === "/" ? (
+
+ {currentPath === "/home" ? (
홈
@@ -36,9 +36,9 @@ const NavBar = () => {
홈
)}
-
+
-
+
{currentPath === "/Inventory" ? (
![InvenOn]({Inven})
@@ -50,9 +50,9 @@ const NavBar = () => {
재고관리
)}
-
+
-
+
{currentPath === "/Sales" ? (
![SalesOn]({Sales})
@@ -64,9 +64,9 @@ const NavBar = () => {
매출관리
)}
-
+
-
+
{currentPath === "/Mypage" ? (
![MypageOn]({Mypage})
@@ -78,10 +78,10 @@ const NavBar = () => {
마이페이지
)}
-
+
-
+
{Store ? (
![]()
{
영업종료
)}
-
+
);
};
diff --git a/src/hoc/auth.jsx b/src/hoc/auth.jsx
index 88327a9..770fff7 100644
--- a/src/hoc/auth.jsx
+++ b/src/hoc/auth.jsx
@@ -1,47 +1,61 @@
-// /* eslint-disable import/no-anonymous-default-export */
-// import React, { useEffect } from "react";
-// import Axios from "axios";
-// import { useDispatch } from "react-redux";
-// import { auth } from "../_actions/user_action";
-// import { useNavigate } from "react-router-dom";
+import moment from 'moment';
+import { useEffect } from 'react';
+import { useCookies } from 'react-cookie';
+import { useLocation, useNavigate } from 'react-router-dom';
+import { useRecoilValue, useSetRecoilState } from 'recoil';
+import { getUserSelector, loginState } from '../Atom/status';
-// export default function (SpecificComponent, option, adminRoute = null) {
-// function AuthenticationCheck(props) {
-// const navigate = useNavigate();
-// const dispatch = useDispatch();
-// useEffect(() => {
-// dispatch(auth())
-// .then((response) => {
-// console.log(response.payload);
-// if (!response.payload.isAuth) {
-// if (option) {
-// navigate("/login", { replace: true });
-// }
-// } else {
-// //로그인한 상태
-// if (adminRoute === 3 && response.payload.role !== 3) {
-// navigate("/", { replace: true });
-// } else if (adminRoute === 1 && response.payload.role !== 1) {
-// navigate("/", { replace: true });
-// } else {
-// if (option === false) {
-// navigate("/", { replace: true });
-// }
-// }
-// }
-// })
-// .catch((error) => {
-// if (error.response && error.response.status >= 400 && error.response.status < 500) {
-// // 클라이언트 오류 발생 (400번대 오류)
-// // 로그인 페이지로 되돌아가는 조건문 추가
-// navigate("/login");
-// } else {
-// // 서버 오류 또는 네트워크 오류 등의 다른 오류 처리
-// }
-// });
-// }, []);
+function Auth(SpecificComponent, option) {
+ function AuthenticationCheck(props) {
+ const navigate = useNavigate();
+ const location = useLocation();
+ const userInfo = useRecoilValue(getUserSelector);
+ const setIsLoggedIn = useSetRecoilState(loginState);
+ const [cookies] = useCookies(['accessToken']);
-// return ;
-// }
-// return AuthenticationCheck;
-// }
+
+ useEffect(() => {
+ const isAuth = window.localStorage.getItem("isAuthenticated")
+ if(userInfo === "404" && location.pathname !== "/"){
+ navigate("/");
+ } else {
+ if(!isAuth && cookies?.accessToken) {
+ // 첫 로그인 시
+ window.localStorage.setItem("isAuthenticated", true);
+ setIsLoggedIn({
+ accessToken: getAccessTokenFromCookie(),
+ expiredTime: moment().add(1, "hour").format("yyyy-MM-DD HH:mm:ss")
+ });
+ navigate("/home");
+ alert("로그인에 성공하셨습니다.");
+ } else{
+ if(cookies?.accessToken && location.pathname === "/"){
+ // 로그인 상태에서 로그인 화면으로 갔을 경우
+ navigate("/home");
+ }
+ }
+ }
+
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, []);
+ return ;
+}
+return AuthenticationCheck;
+}
+
+export const getAccessTokenFromCookie = () => {
+ const cookieString = document.cookie;
+ if(cookieString){
+ const cookies = cookieString.split("; ");
+
+ for (const cookie of cookies) {
+ const [name, value] = cookie.split("=");
+ if (name === "accessToken") {
+ return value;
+ }
+ }
+ }
+ return null;
+};
+
+export default Auth;
\ No newline at end of file
diff --git a/src/hoc/handleRefresh.jsx b/src/hoc/handleRefresh.jsx
new file mode 100644
index 0000000..7dd26ea
--- /dev/null
+++ b/src/hoc/handleRefresh.jsx
@@ -0,0 +1,39 @@
+import axios from "axios";
+import moment from "moment";
+import { useRecoilState } from 'recoil';
+import { loginState } from '../Atom/status';
+
+
+const Refresh = async () => {
+ const apiUrl = process.env.REACT_APP_API_ROOT;
+ const [loginInfo, setLoginInfo] = useRecoilState(loginState);
+ const expireAt = loginInfo.expiredTime;
+ console.log("만료확인");
+
+ // 토큰이 만료되었다면
+
+ if (moment(expireAt).diff(moment()) < 0) {
+ const config = {
+ withCredentials: true
+ }
+
+ console.log("토큰을 재발급합니다!");
+
+ //재발급 요청
+ const res = await axios.get(
+ `${apiUrl}/api/v1/refresh/token`,
+ config
+ );
+ console.log("재발급 성공", res);
+ setLoginInfo({
+ expiredTime: moment().add(1, "hour").format("yyyy-MM-DD HH:mm:ss")
+ });
+ }
+};
+
+const refreshErrorHandle = () => {
+ //Cookie.remove("refreshToken");
+};
+
+export { Refresh, refreshErrorHandle };
+
diff --git a/src/hooks/useInterval.jsx b/src/hooks/useInterval.jsx
new file mode 100644
index 0000000..ba0e134
--- /dev/null
+++ b/src/hooks/useInterval.jsx
@@ -0,0 +1,22 @@
+import { useEffect, useRef } from 'react';
+
+function useInterval(callback, delay) {
+ const savedCallback = useRef();
+
+ useEffect(() => {
+ savedCallback.current = callback;
+ }, [callback]);
+
+ useEffect(() => {
+ function tick() {
+ savedCallback.current();
+ }
+
+ if (delay !== null) {
+ const intervalId = setInterval(tick, delay);
+ return () => clearInterval(intervalId);
+ }
+ }, [delay]);
+}
+
+export default useInterval;
\ No newline at end of file
diff --git a/src/hooks/useOutSideClick.jsx b/src/hooks/useOutSideClick.jsx
deleted file mode 100644
index cebd397..0000000
--- a/src/hooks/useOutSideClick.jsx
+++ /dev/null
@@ -1,17 +0,0 @@
-// import { useEffect } from "react";
-
-// function useOutSideClick(ref, callback) {
-// useEffect(() => {
-// const handleClick = (event) => {
-// if (ref.current && !ref.current.contains(event.target)) {
-// callback?.();
-// }
-// };
-
-// window.addEventListener("mousedown", handleClick);
-
-// return () => window.removeEventListener("mousedown", handleClick);
-// }, [ref, callback]);
-// }
-
-// export default useOutSideClick;
diff --git a/src/index.js b/src/index.js
index 9633fae..82429ba 100644
--- a/src/index.js
+++ b/src/index.js
@@ -1,9 +1,10 @@
import React from "react";
+import { CookiesProvider } from 'react-cookie';
import ReactDOM from "react-dom/client";
-import "./index.css";
-import App from "./App";
import { BrowserRouter } from "react-router-dom";
import { ThemeProvider } from "styled-components";
+import App from "./App";
+import "./index.css";
import theme from "./style/theme/theme";
const root = ReactDOM.createRoot(document.getElementById("root"));
@@ -11,7 +12,9 @@ root.render(
+
+
diff --git a/src/pages/Home/Home.jsx b/src/pages/Home/Home.jsx
index a92891d..745dd5a 100644
--- a/src/pages/Home/Home.jsx
+++ b/src/pages/Home/Home.jsx
@@ -5,7 +5,8 @@ import NavBar from "../../components/views/NavBar/NavBar";
import MainHome from "./MainHome";
import Receipt from "./Receipt/Receipt";
-const Home = () => {
+function Home () {
+
return (
diff --git a/src/pages/Home/MainHome.jsx b/src/pages/Home/MainHome.jsx
index e6d969a..ef1cc4c 100644
--- a/src/pages/Home/MainHome.jsx
+++ b/src/pages/Home/MainHome.jsx
@@ -5,7 +5,7 @@ import Complete from "./StatusHome/Complete";
import Progress from "./StatusHome/Progress";
import Wait from "./StatusHome/Wait";
-const MainHome = () => {
+function MainHome (props) {
const [status, setStatus] = useState({
Wait: true,
Progress: false,
diff --git a/src/pages/Inventory/Inventory.css b/src/pages/Inventory/Inventory.css
index 435245c..5e5d655 100644
--- a/src/pages/Inventory/Inventory.css
+++ b/src/pages/Inventory/Inventory.css
@@ -5,8 +5,9 @@
nav{
width: 8.875rem;
- height: 46.25rem;
+ /* height: 46.25rem; */
/* height: 42.5rem; */
+ height: 45.75rem;
z-index: 1;
}
diff --git a/src/pages/Inventory/MainInven.css b/src/pages/Inventory/MainInven.css
index f4bf933..2de0b41 100644
--- a/src/pages/Inventory/MainInven.css
+++ b/src/pages/Inventory/MainInven.css
@@ -40,7 +40,7 @@
.mainInven-title__span3{
width: 60%;
- min-width: 39.625rem;
+ /* min-width: 39.625rem; */
}
.mainInven-category__modal{
@@ -72,7 +72,8 @@
.mainInven-category-content__wrapper{
width: 100%;
- height: calc(46.25rem - 5.0625rem);
+ height: calc(45.75rem - 5.0625rem);
+ /* height: calc(46.25rem - 5.0625rem); */
/* height: calc(42.5rem - 5.0625rem); */
overflow-y: auto;
overflow-x: hidden;
diff --git a/src/pages/Main/MainPage.css b/src/pages/Main/MainPage.css
new file mode 100644
index 0000000..a032044
--- /dev/null
+++ b/src/pages/Main/MainPage.css
@@ -0,0 +1,24 @@
+.mainpage-wrapper{
+ width: 100%;
+ /* height: 100%; */
+ background-color: #fff;
+
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: space-around;
+}
+
+.mainpage-btn__wrapper{
+ width: 37.5rem;
+ height: 5.625rem;
+ line-height: 5.625rem;
+ background-color: #ffe812;
+ border-radius: 0.875rem;
+}
+
+.mainpage-btn__wrapper span{
+ text-align: center;
+ font-family: "Regular";
+ font-size: 1.375rem;
+}
\ No newline at end of file
diff --git a/src/pages/Main/MainPage.jsx b/src/pages/Main/MainPage.jsx
new file mode 100644
index 0000000..c3ecef3
--- /dev/null
+++ b/src/pages/Main/MainPage.jsx
@@ -0,0 +1,20 @@
+import logo from "../../assets/icons/Big_LOGO.svg";
+import kakao from "../../assets/icons/img_kakao.png";
+import "./MainPage.css";
+
+function MainPage () {
+ const handleKakaoLogin = () => {
+ // console.log(process.env.REACT_APP_KAKAO_LOGIN);
+ window.location.href = `${process.env.REACT_APP_KAKAO_LOGIN}`;
+ };
+
+ return(
+
+
![logo]({logo})
+
+
+
+ )
+}
+
+export default MainPage;
\ No newline at end of file
diff --git a/src/pages/Mypage/MainMypage.jsx b/src/pages/Mypage/MainMypage.jsx
index 90b5e1c..1fd44d2 100644
--- a/src/pages/Mypage/MainMypage.jsx
+++ b/src/pages/Mypage/MainMypage.jsx
@@ -1,9 +1,22 @@
+import axios from "axios";
import React, { useEffect } from "react";
+import { useCookies } from "react-cookie";
+import { useNavigate } from "react-router-dom";
+import { useSetRecoilState } from 'recoil';
+import { isAuthenticatedState, loginState } from '../../Atom/status';
import kakao from "../../assets/icons/icon_kakao.svg";
import readyvery from "../../assets/icons/img_readyVery.svg";
+
+
import "./MainMypage.css";
const MainMypage = () => {
+ const navigate = useNavigate();
+ const apiUrl = process.env.REACT_APP_API_ROOT;
+ const [, ,removeCookies] = useCookies();
+ const setIsLoggedIn = useSetRecoilState(loginState);
+ const setIsAuthenticated = useSetRecoilState(isAuthenticatedState);
+
const fetchData = async () => {
// const response = await axios.get(`${process.env.REACT_APP_API_URL}/user/info`);
// console.log(response);
@@ -13,6 +26,31 @@ const MainMypage = () => {
fetchData();
}, []);
+ const handleLogout = () => {
+ const config = {
+ withCredentials: true,
+ };
+
+ axios.get(apiUrl + "/api/v1/user/logout", config)
+ .then((response) => {
+ console.log(response);
+ setIsAuthenticated(false);
+ setIsLoggedIn({
+ accessToken: null,
+ expiredTime: null
+ })
+ navigate("/");
+ removeCookies("accessToken");
+ removeCookies("JSESSIONID");
+ window.localStorage.setItem("isAuthenticated", false);
+ })
+ .catch((error) => {
+ alert("관리자에게 문의하세요.");
+ navigate("/");
+
+ });
+ }
+
return (
@@ -64,7 +102,7 @@ const MainMypage = () => {
-
로그아웃
+
로그아웃
);
};
diff --git a/src/pages/Mypage/Mypage.css b/src/pages/Mypage/Mypage.css
index 89dda7d..bdb94ab 100644
--- a/src/pages/Mypage/Mypage.css
+++ b/src/pages/Mypage/Mypage.css
@@ -4,8 +4,9 @@
nav{
width: 8.875rem;
- height: 46.25rem;
+ /* height: 46.25rem; */
/* height: 42.5rem; */
+ height: 45.75rem;
padding-top: 5.5rem;
}
diff --git a/src/pages/Mypage/Mypage.jsx b/src/pages/Mypage/Mypage.jsx
index ef02590..15739e9 100644
--- a/src/pages/Mypage/Mypage.jsx
+++ b/src/pages/Mypage/Mypage.jsx
@@ -5,7 +5,7 @@ import NavBar from "../../components/views/NavBar/NavBar";
import MainMypage from "./MainMypage";
import "./Mypage.css";
-const Mypage = () => {
+function Mypage (props) {
return (
diff --git a/src/pages/Sales/Sales.css b/src/pages/Sales/Sales.css
index 8f1d94a..55491e5 100644
--- a/src/pages/Sales/Sales.css
+++ b/src/pages/Sales/Sales.css
@@ -5,7 +5,8 @@
nav{
width: 8.875rem;
- height: 46.25rem;
+ /* height: 46.25rem; */
+ height: 45.75rem;
padding-top: 5.5rem;
}
diff --git a/src/pages/Sales/Sales.jsx b/src/pages/Sales/Sales.jsx
index d86129e..105ceff 100644
--- a/src/pages/Sales/Sales.jsx
+++ b/src/pages/Sales/Sales.jsx
@@ -4,7 +4,7 @@ import NavBar from "../../components/views/NavBar/NavBar";
import MainSales from "./MainSales";
import "./Sales.css";
-const Sales = () => {
+function Sales (props) {
return (