diff --git a/.github/workflows/deploy-main.yml b/.github/workflows/deploy-main.yml index e4bda03c..79ad28a5 100644 --- a/.github/workflows/deploy-main.yml +++ b/.github/workflows/deploy-main.yml @@ -28,6 +28,7 @@ jobs: echo "REACT_APP_E_BOOK_LIBRARY=$REACT_APP_E_BOOK_LIBRARY" >> .env echo "REACT_APP_SUGGESTION=$REACT_APP_SUGGESTION" >> .env echo "REACT_APP_GA_ID=$REACT_APP_GA_ID" >> .env + echo "REACT_APP_SENTRY=$REACT_APP_SENTRY" >> .env echo "PORT=$PORT" >> .env env: REACT_APP_API: ${{ secrets.REACT_APP_API }} @@ -53,12 +54,4 @@ jobs: AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} run: | - aws s3 sync ./build s3://42library.kr --region ap-northeast-2 - - - name: invalidate CDN cache - env: - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - AWS_CDN_DISTRIBUTION_ID: ${{ secrets.AWS_CDN_DISTRIBUTION_ID }} - run: | - aws cloudfront create-invalidation --distribution-id ${{ secrets.AWS_CDN_DISTRIBUTION_ID }} --paths "/*" --region ap-northeast-2 + aws s3 sync ./build s3://42library.kr --region ap-northeast-2 --delete diff --git a/package.json b/package.json index 62c8352c..97d155dc 100644 --- a/package.json +++ b/package.json @@ -4,8 +4,8 @@ "private": true, "dependencies": { "@ladle/react": "^2.13.0", + "@react-spring/web": "^9.7.3", "@sentry/react": "^7.53.0", - "@sentry/tracing": "^7.53.0", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^14.0.0", "@testing-library/user-event": "^14.4.3", @@ -51,6 +51,7 @@ ] }, "devDependencies": { + "@sentry/types": "^7.93.0", "@types/react": "^18.2.6", "@types/react-dom": "^18.2.4", "@types/react-router-dom": "^5.3.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0c55ed7e..ce5e2f87 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,12 +8,12 @@ dependencies: '@ladle/react': specifier: ^2.13.0 version: 2.13.0(react-dom@18.2.0)(react@18.2.0) + '@react-spring/web': + specifier: ^9.7.3 + version: 9.7.3(react-dom@18.2.0)(react@18.2.0) '@sentry/react': specifier: ^7.53.0 version: 7.53.0(react@18.2.0) - '@sentry/tracing': - specifier: ^7.53.0 - version: 7.53.0 '@testing-library/jest-dom': specifier: ^5.16.5 version: 5.16.5 @@ -73,6 +73,9 @@ dependencies: version: 3.3.1 devDependencies: + '@sentry/types': + specifier: ^7.93.0 + version: 7.93.0 '@types/react': specifier: ^18.2.6 version: 18.2.6 @@ -765,6 +768,54 @@ packages: '@nodelib/fs.scandir': 2.1.5 fastq: 1.15.0 + /@react-spring/animated@9.7.3(react@18.2.0): + resolution: {integrity: sha512-5CWeNJt9pNgyvuSzQH+uy2pvTg8Y4/OisoscZIR8/ZNLIOI+CatFBhGZpDGTF/OzdNFsAoGk3wiUYTwoJ0YIvw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@react-spring/shared': 9.7.3(react@18.2.0) + '@react-spring/types': 9.7.3 + react: 18.2.0 + dev: false + + /@react-spring/core@9.7.3(react@18.2.0): + resolution: {integrity: sha512-IqFdPVf3ZOC1Cx7+M0cXf4odNLxDC+n7IN3MDcVCTIOSBfqEcBebSv+vlY5AhM0zw05PDbjKrNmBpzv/AqpjnQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@react-spring/animated': 9.7.3(react@18.2.0) + '@react-spring/shared': 9.7.3(react@18.2.0) + '@react-spring/types': 9.7.3 + react: 18.2.0 + dev: false + + /@react-spring/shared@9.7.3(react@18.2.0): + resolution: {integrity: sha512-NEopD+9S5xYyQ0pGtioacLhL2luflh6HACSSDUZOwLHoxA5eku1UPuqcJqjwSD6luKjjLfiLOspxo43FUHKKSA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@react-spring/types': 9.7.3 + react: 18.2.0 + dev: false + + /@react-spring/types@9.7.3: + resolution: {integrity: sha512-Kpx/fQ/ZFX31OtlqVEFfgaD1ACzul4NksrvIgYfIFq9JpDHFwQkMVZ10tbo0FU/grje4rcL4EIrjekl3kYwgWw==} + dev: false + + /@react-spring/web@9.7.3(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-BXt6BpS9aJL/QdVqEIX9YoUy8CE6TJrU0mNCqSoxdXlIeNcEBWOfIyE6B14ENNsyQKS3wOWkiJfco0tCr/9tUg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@react-spring/animated': 9.7.3(react@18.2.0) + '@react-spring/core': 9.7.3(react@18.2.0) + '@react-spring/shared': 9.7.3(react@18.2.0) + '@react-spring/types': 9.7.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /@remix-run/router@1.6.2: resolution: {integrity: sha512-LzqpSrMK/3JBAVBI9u3NWtOhWNw5AMQfrUFYB0+bDHTSw17z++WJLsPsxAuK+oSddsxk4d7F/JcdDPM1M5YAhA==} engines: {node: '>=14'} @@ -824,18 +875,16 @@ packages: '@sentry/utils': 7.53.0 dev: false - /@sentry/tracing@7.53.0: - resolution: {integrity: sha512-s0vwXOyn3BEFzuHRGFfZJycmLMnKi74wDoForvbWxhoxgUJNAocuShVSMx4pClCaNtfkOGgD/axG2wxSpLHHxQ==} - engines: {node: '>=8'} - dependencies: - '@sentry-internal/tracing': 7.53.0 - dev: false - /@sentry/types@7.53.0: resolution: {integrity: sha512-hqlbrCL8nfDfjlF6wh4NHNW9plhWJ1m2BSqRyspcxOC44e293BPfwjUzr0aQapJK/aRkHROnfAtzsEu2awNPzg==} engines: {node: '>=8'} dev: false + /@sentry/types@7.93.0: + resolution: {integrity: sha512-UnzUccNakhFRA/esWBWP+0v7cjNg+RilFBQC03Mv9OEMaZaS29zSbcOGtRzuFOXXLBdbr44BWADqpz3VW0XaNw==} + engines: {node: '>=8'} + dev: true + /@sentry/utils@7.53.0: resolution: {integrity: sha512-T3F2DkXB9fDjUIAcrOMrGCnquyTQxTyTb5Mh+NbFBevQn32fHehQ62VraLhe20HTVy8YBFkXisvLu6HeOZ5Mog==} engines: {node: '>=8'} diff --git a/src/App.jsx b/src/App.tsx similarity index 86% rename from src/App.jsx rename to src/App.tsx index a7371532..995ea886 100644 --- a/src/App.jsx +++ b/src/App.tsx @@ -1,7 +1,10 @@ import { useEffect } from "react"; -import { BrowserRouter, Route, Routes } from "react-router-dom"; -import { useSetRecoilState } from "recoil"; +import { BrowserRouter, Route } from "react-router-dom"; +import { useRecoilValue, useResetRecoilState } from "recoil"; import { install } from "ga-gtag"; +import { isUserExpiredAtom, userAtom } from "./atom/userAtom"; +import { SentryRoutes } from "./config/sentry"; + import BookDetail from "./component/book/BookDetail"; import Footer from "./component/utils/Footer"; import NotFound from "./component/utils/NotFound"; @@ -18,31 +21,28 @@ import History from "./component/history/History"; import ReservedLoan from "./component/reservedloan/ReservedLoan"; import ReturnBook from "./component/return/ReturnBook"; import UserManagement from "./component/userManagement/UserManagement"; -import AddBook from "./component/addbook/AddBook"; -import MyPageRoutes from "./component/mypage/MyPageRoutes"; -import userState from "./atom/userState"; -import Mypage from "./component/mypage/Mypage"; -import EditEmailOrPassword from "./component/mypage/EditEmailOrPassword"; -import LimitedRoute from "./LimitedRoute"; -import { isExpiredDate } from "./util/date"; -import BookManagement from "./component/bookManagement/BookManagement"; -import ReviewManagement from "./component/reviewManagement/ReviewManagement"; import BookStock from "./component/bookStock/BookStock"; import ELibraryIn42Box from "./component/eLibraryIn42Box/EventPage"; import SuperTagManagement from "./component/superTag/SuperTagManagement"; import SubTagManagement from "./component/subTag/SubTagManagement"; import Portals from "./component/utils/Portals"; +import LimitedRoute from "./LimitedRoute"; +import AddBook from "./component/addbook/AddBook"; +import BookManagement from "./component/bookManagement/BookManagement"; +import EditEmailOrPassword from "./component/mypage/EditEmailOrPassword"; +import MyPageRoutes from "./component/mypage/MyPageRoutes"; +import Mypage from "./component/mypage/Mypage"; +import ReviewManagement from "./component/reviewManagement/ReviewManagement"; import "./asset/css/reset.css"; function App() { - const setUser = useSetRecoilState(userState); - useEffect(() => { - install(import.meta.env.REACT_APP_GA_ID); - const localUser = JSON.parse(window.localStorage.getItem("user")); + const isUserExpired = useRecoilValue(isUserExpiredAtom); + const resetUser = useResetRecoilState(userAtom); - if (localUser?.isLogin) { - if (!isExpiredDate(localUser?.expire)) setUser(localUser); - else window.localStorage.removeItem("user"); + useEffect(() => install(import.meta.env.REACT_APP_GA_ID), []); + useEffect(() => { + if (isUserExpired) { + resetUser(); } }, []); @@ -51,7 +51,7 @@ function App() {