diff --git a/README.md b/README.md
index c4edfa0..24d0991 100644
--- a/README.md
+++ b/README.md
@@ -10,6 +10,12 @@ Ararat International School - платформа по обучению игры
- Express.js
- Mongo DB
+#### V 0.03
+- Добавленны UI компоненты: Input, Button, Modal
+- Валидация форм регистрации/авторизации
+- Модальное окно при ошибке
+- LoginForm и RegisterForm заменены на LoginPage и RegisterPage
+
#### V 0.02
- Mobx заменен Redux toolkit
diff --git a/client/package-lock.json b/client/package-lock.json
index d8236a7..4bc7645 100644
--- a/client/package-lock.json
+++ b/client/package-lock.json
@@ -8,18 +8,24 @@
"name": "araratchess",
"version": "0.0.0",
"dependencies": {
+ "@react-icons/all-files": "https://github.com/react-icons/react-icons/releases/download/v4.10.1/react-icons-all-files-4.10.1.tgz",
"@reduxjs/toolkit": "^1.9.5",
"@types/axios": "^0.14.0",
"@types/react-redux": "^7.1.25",
"@types/react-router-dom": "^5.3.3",
+ "@types/uniqid": "^5.3.2",
"axios": "^1.4.0",
+ "body-scroll-lock": "^4.0.0-beta.0",
+ "framer-motion": "^10.13.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-hook-form": "^7.45.2",
"react-redux": "^8.1.1",
- "react-router-dom": "^6.14.2"
+ "react-router-dom": "^6.14.2",
+ "uniqid": "^5.4.0"
},
"devDependencies": {
+ "@types/body-scroll-lock": "^3.1.0",
"@types/react": "^18.2.14",
"@types/react-dom": "^18.2.6",
"@typescript-eslint/eslint-plugin": "^5.61.0",
@@ -427,6 +433,21 @@
"node": ">=6.9.0"
}
},
+ "node_modules/@emotion/is-prop-valid": {
+ "version": "0.8.8",
+ "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz",
+ "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==",
+ "optional": true,
+ "dependencies": {
+ "@emotion/memoize": "0.7.4"
+ }
+ },
+ "node_modules/@emotion/memoize": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz",
+ "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==",
+ "optional": true
+ },
"node_modules/@esbuild/android-arm": {
"version": "0.18.14",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.14.tgz",
@@ -972,6 +993,15 @@
"node": ">= 8"
}
},
+ "node_modules/@react-icons/all-files": {
+ "version": "4.10.1",
+ "resolved": "https://github.com/react-icons/react-icons/releases/download/v4.10.1/react-icons-all-files-4.10.1.tgz",
+ "integrity": "sha512-jm/9akpfUQRYke8YArGwnoTTTcsCNFjzXfC9rUwrtnEDrV3EOXYOF+R5sFrIgHPn+DMp5nEWLlPV4fmnLCEpMQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "*"
+ }
+ },
"node_modules/@reduxjs/toolkit": {
"version": "1.9.5",
"resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.5.tgz",
@@ -1012,6 +1042,12 @@
"axios": "*"
}
},
+ "node_modules/@types/body-scroll-lock": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@types/body-scroll-lock/-/body-scroll-lock-3.1.0.tgz",
+ "integrity": "sha512-3owAC4iJub5WPqRhxd8INarF2bWeQq1yQHBgYhN0XLBJMpd5ED10RrJ3aKiAwlTyL5wK7RkBD4SZUQz2AAAMdA==",
+ "dev": true
+ },
"node_modules/@types/history": {
"version": "4.7.11",
"resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz",
@@ -1097,6 +1133,11 @@
"integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==",
"dev": true
},
+ "node_modules/@types/uniqid": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/@types/uniqid/-/uniqid-5.3.2.tgz",
+ "integrity": "sha512-/NYoaZpWsnAJDsGYeMNDeG3p3fuUb4AiC7MfKxi5VSu18tXd08w6Ch0fKW94T4FeLXXZwZPoFgHA1O0rDYKyMQ=="
+ },
"node_modules/@types/use-sync-external-store": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz",
@@ -1469,6 +1510,11 @@
"node": ">=8"
}
},
+ "node_modules/body-scroll-lock": {
+ "version": "4.0.0-beta.0",
+ "resolved": "https://registry.npmjs.org/body-scroll-lock/-/body-scroll-lock-4.0.0-beta.0.tgz",
+ "integrity": "sha512-a7tP5+0Mw3YlUJcGAKUqIBkYYGlYxk2fnCasq/FUph1hadxlTRjF+gAcZksxANnaMnALjxEddmSi/H3OR8ugcQ=="
+ },
"node_modules/brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
@@ -2278,6 +2324,34 @@
"url": "https://www.patreon.com/infusion"
}
},
+ "node_modules/framer-motion": {
+ "version": "10.13.0",
+ "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-10.13.0.tgz",
+ "integrity": "sha512-xKhw9VCizmwEHbopOfluaoVunGHSZyMztGbTvsgOYqCjaKu6qtlwWY1J+6GhL41NY1P157JgEikjDm67XCFnvQ==",
+ "dependencies": {
+ "tslib": "^2.4.0"
+ },
+ "optionalDependencies": {
+ "@emotion/is-prop-valid": "^0.8.2"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0",
+ "react-dom": "^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "react": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/framer-motion/node_modules/tslib": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz",
+ "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA=="
+ },
"node_modules/fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
@@ -3711,6 +3785,11 @@
"node": ">=14.17"
}
},
+ "node_modules/uniqid": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-5.4.0.tgz",
+ "integrity": "sha512-38JRbJ4Fj94VmnC7G/J/5n5SC7Ab46OM5iNtSstB/ko3l1b5g7ALt4qzHFgGciFkyiRNtDXtLNb+VsxtMSE77A=="
+ },
"node_modules/update-browserslist-db": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz",
diff --git a/client/package.json b/client/package.json
index b852158..b5c903f 100644
--- a/client/package.json
+++ b/client/package.json
@@ -10,18 +10,24 @@
"preview": "vite preview"
},
"dependencies": {
+ "@react-icons/all-files": "https://github.com/react-icons/react-icons/releases/download/v4.10.1/react-icons-all-files-4.10.1.tgz",
"@reduxjs/toolkit": "^1.9.5",
"@types/axios": "^0.14.0",
"@types/react-redux": "^7.1.25",
"@types/react-router-dom": "^5.3.3",
+ "@types/uniqid": "^5.3.2",
"axios": "^1.4.0",
+ "body-scroll-lock": "^4.0.0-beta.0",
+ "framer-motion": "^10.13.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-hook-form": "^7.45.2",
"react-redux": "^8.1.1",
- "react-router-dom": "^6.14.2"
+ "react-router-dom": "^6.14.2",
+ "uniqid": "^5.4.0"
},
"devDependencies": {
+ "@types/body-scroll-lock": "^3.1.0",
"@types/react": "^18.2.14",
"@types/react-dom": "^18.2.6",
"@typescript-eslint/eslint-plugin": "^5.61.0",
diff --git a/client/src/App.tsx b/client/src/App.tsx
index 8d77d04..52352b3 100644
--- a/client/src/App.tsx
+++ b/client/src/App.tsx
@@ -2,8 +2,8 @@ import { useEffect } from "react"
import RequireAuth from "./components/Auth/RequireAuth"
import OnlyUnauthorized from "./components/Auth/OnlyUnauthorized"
import IndexPage from "./pages/IndexPage"
-import LoginForm from "./components/LoginForm"
-import RegisterForm from "./components/RegisterForm"
+import LoginPage from "./pages/LoginPage"
+import RegisterPage from "./pages/RegisterPage"
import { BrowserRouter, Routes, Route } from 'react-router-dom'
import { checkAuth, userSlice } from "./store/reducers/UserSlice";
import { useAppDispatch, useAppSelector } from "./hooks/redux"
@@ -32,8 +32,8 @@ function App() {