From 3ec4d9d1db6c0815290cd2941805d62d92cd4ed6 Mon Sep 17 00:00:00 2001 From: claudiuintech Date: Sun, 6 Dec 2020 17:04:22 +0200 Subject: [PATCH 1/4] add logout and logged status in context --- client/.eslintcache | 2 +- client/debug.log | 1 + client/src/App.scss | 32 ++++++++++++++ client/src/_variables.scss | 1 + .../src/admin/components/AppointmentForm.tsx | 39 +++++++++++++++++ client/src/admin/components/Header.tsx | 43 +++++++++++++++---- client/src/admin/components/Sidebar.tsx | 1 - client/src/admin/pages/Appointments.tsx | 11 ++++- client/src/admin/scss/AdminLayout.scss | 2 +- client/src/admin/scss/Header.scss | 15 ++++++- client/src/admin/scss/Sidebar.scss | 5 --- client/src/context/UserContext.tsx | 37 ++++++++++++++-- client/src/frontend/components/Header.tsx | 14 ++---- client/src/frontend/pages/SignIn.tsx | 17 +++++--- client/src/frontend/pages/SignUp.tsx | 2 +- server/package-lock.json | 10 +++++ 16 files changed, 194 insertions(+), 38 deletions(-) create mode 100644 client/src/admin/components/AppointmentForm.tsx diff --git a/client/.eslintcache b/client/.eslintcache index 4f9731d..6ddf30f 100644 --- a/client/.eslintcache +++ b/client/.eslintcache @@ -1 +1 @@ -[{"D:\\Proiecte\\React\\appointments-management\\client\\src\\App.tsx":"1","D:\\Proiecte\\React\\appointments-management\\client\\src\\reportWebVitals.ts":"2","D:\\Proiecte\\React\\appointments-management\\client\\src\\index.tsx":"3","D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\pages\\SignUp.tsx":"4","D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\components\\Header.tsx":"5","D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\components\\Slider.tsx":"6","D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\pages\\Home.tsx":"7","D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\pages\\SignIn.tsx":"8","D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\pages\\Dashboard.tsx":"9","D:\\Proiecte\\React\\appointments-management\\client\\src\\PrivateRoute.tsx":"10","D:\\Proiecte\\React\\appointments-management\\client\\src\\context\\UserContext.tsx":"11","D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\FontLayout.tsx":"12","D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\components\\Header.tsx":"13","D:\\Proiecte\\React\\appointments-management\\client\\src\\NormalRoute.tsx":"14","D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\components\\Sidebar.tsx":"15","D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\AdminLayout.tsx":"16","D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\pages\\Appointments.tsx":"17"},{"size":1336,"mtime":1607067020969,"results":"18","hashOfConfig":"19"},{"size":425,"mtime":1606681596334,"results":"20","hashOfConfig":"19"},{"size":478,"mtime":1606682379499,"results":"21","hashOfConfig":"19"},{"size":3218,"mtime":1606825872057,"results":"22","hashOfConfig":"19"},{"size":1534,"mtime":1606850181213,"results":"23","hashOfConfig":"19"},{"size":642,"mtime":1606834898726,"results":"24","hashOfConfig":"19"},{"size":228,"mtime":1606834817660,"results":"25","hashOfConfig":"19"},{"size":2797,"mtime":1606850118837,"results":"26","hashOfConfig":"19"},{"size":795,"mtime":1607023453128,"results":"27","hashOfConfig":"19"},{"size":444,"mtime":1606932488816,"results":"28","hashOfConfig":"19"},{"size":369,"mtime":1606849749147,"results":"29","hashOfConfig":"19"},{"size":284,"mtime":1606931412551,"results":"30","hashOfConfig":"19"},{"size":1291,"mtime":1607018333527,"results":"31","hashOfConfig":"19"},{"size":288,"mtime":1606933258145,"results":"32","hashOfConfig":"19"},{"size":2097,"mtime":1607067025614,"results":"33","hashOfConfig":"19"},{"size":869,"mtime":1607064950585,"results":"34","hashOfConfig":"19"},{"size":5497,"mtime":1607107679126,"results":"35","hashOfConfig":"19"},{"filePath":"36","messages":"37","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"38"},"12pxieb",{"filePath":"39","messages":"40","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"41","messages":"42","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"43","messages":"44","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"45","usedDeprecatedRules":"46"},{"filePath":"47","messages":"48","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"49","messages":"50","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"51","messages":"52","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"53","messages":"54","errorCount":0,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"55","messages":"56","errorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"57"},{"filePath":"58","messages":"59","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"60","messages":"61","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"62","messages":"63","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"64","messages":"65","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"66","messages":"67","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"68","messages":"69","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"70","messages":"71","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"72","messages":"73","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},"D:\\Proiecte\\React\\appointments-management\\client\\src\\App.tsx",["74"],"import React, { FC } from 'react';\nimport { BrowserRouter as Router, Switch, Route } from 'react-router-dom'\n\nimport './App.scss'\n\n//Routes\nimport PrivateRoute from './PrivateRoute'\nimport NormalRoute from './NormalRoute'\n\n//Front pages\nimport SignUp from './frontend/pages/SignUp'\nimport Home from './frontend/pages/Home'\nimport SignIn from './frontend/pages/SignIn'\n\n//Dashboard pages\nimport Dashboard from './admin/pages/Dashboard'\nimport Appointments from './admin/pages/Appointments'\n\n//Layout\nimport FrontLayout from './frontend/FontLayout'\nimport AdminLayout from './admin/AdminLayout'\n\n\n//Context\nimport { UserProvider } from './context/UserContext'\n\n\nconst App: FC = () => {\n return (\n
\n \n \n \n \n \n \n \n \n \n \n \n
\n );\n}\n\nexport default App;\n","D:\\Proiecte\\React\\appointments-management\\client\\src\\reportWebVitals.ts",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\index.tsx",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\pages\\SignUp.tsx",["75"],"import React, { useState } from \"react\";\r\nimport axios from \"axios\";\r\nimport { Row, Col, Form, Input, Button, Checkbox, Select } from \"antd\";\r\n\r\nimport \"../scss/SignUp.scss\";\r\n\r\nconst { Option } = Select;\r\n\r\nconst SignUp = () => {\r\n\tconst [username, setUsername] = useState(\"\");\r\n\tconst [password, setPassword] = useState(\"\");\r\n\tconst [email, setEmail] = useState(\"\");\r\n\tconst [role, setRole] = useState(\"\");\r\n\r\n\tconst handleRole = value => {\r\n\t\tsetRole(value);\r\n\t};\r\n\r\n\tconst createAccount = async () => {\r\n\t\ttry {\r\n\t\t\tconst result = await axios({\r\n\t\t\t\tmethod: \"POST\",\r\n\t\t\t\turl: \"http://localhost:4000/auth/signup\",\r\n\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\r\n\t\t\t\tdata: { username, email, role, password },\r\n });\r\n setUsername('')\r\n setEmail('')\r\n setRole('')\r\n setPassword('')\r\n\t\t} catch (error) {\r\n\t\t\tconsole.log(error.response.data.message);\r\n }\r\n\t};\r\n\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\r\n\t\t\t\r\n\t\t\t\t

Create new account

\r\n\t\t\t\t

\r\n\t\t\t\t\tAdd your informations below and create a new acccount in 10\r\n\t\t\t\t\tseconds.\r\n\t\t\t\t

\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t setUsername(e.target.value)}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t setEmail(e.target.value)}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t setPassword(e.target.value)}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tRemember me\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\r\n\t\t\t\r\n\t\t
\r\n\t);\r\n};\r\n\r\nexport default SignUp;\r\n",["76","77"],"D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\components\\Header.tsx",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\components\\Slider.tsx",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\pages\\Home.tsx",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\pages\\SignIn.tsx",["78","79","80"],"D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\pages\\Dashboard.tsx",["81","82"],"import React from 'react'\r\nimport { Card, Col, Row } from 'antd'\r\nimport { UserContext } from '../../context/UserContext' \r\n\r\nimport { CalendarOutlined } from '@ant-design/icons'\r\n\r\nconst Dashboard = () => {\r\n return (\r\n \r\n \r\n \r\n Card content\r\n \r\n \r\n \r\n \r\n Card content\r\n \r\n \r\n \r\n \r\n Card content\r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default Dashboard\r\n","D:\\Proiecte\\React\\appointments-management\\client\\src\\PrivateRoute.tsx",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\context\\UserContext.tsx",["83"],"D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\FontLayout.tsx",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\components\\Header.tsx",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\NormalRoute.tsx",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\components\\Sidebar.tsx",["84"],"D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\AdminLayout.tsx",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\pages\\Appointments.tsx",["85"],{"ruleId":"86","severity":1,"message":"87","line":2,"column":43,"nodeType":"88","messageId":"89","endLine":2,"endColumn":48},{"ruleId":"86","severity":1,"message":"90","line":21,"column":10,"nodeType":"88","messageId":"89","endLine":21,"endColumn":16},{"ruleId":"91","replacedBy":"92"},{"ruleId":"93","replacedBy":"94"},{"ruleId":"86","severity":1,"message":"95","line":1,"column":27,"nodeType":"88","messageId":"89","endLine":1,"endColumn":37},{"ruleId":"86","severity":1,"message":"96","line":4,"column":16,"nodeType":"88","messageId":"89","endLine":4,"endColumn":26},{"ruleId":"86","severity":1,"message":"97","line":4,"column":28,"nodeType":"88","messageId":"89","endLine":4,"endColumn":36},{"ruleId":"86","severity":1,"message":"98","line":3,"column":10,"nodeType":"88","messageId":"89","endLine":3,"endColumn":21},{"ruleId":"86","severity":1,"message":"99","line":5,"column":10,"nodeType":"88","messageId":"89","endLine":5,"endColumn":26},{"ruleId":"86","severity":1,"message":"100","line":1,"column":17,"nodeType":"88","messageId":"89","endLine":1,"endColumn":25},{"ruleId":"86","severity":1,"message":"100","line":1,"column":17,"nodeType":"88","messageId":"89","endLine":1,"endColumn":25},{"ruleId":"86","severity":1,"message":"101","line":97,"column":12,"nodeType":"88","messageId":"89","endLine":97,"endColumn":23},"@typescript-eslint/no-unused-vars","'Route' is defined but never used.","Identifier","unusedVar","'result' is assigned a value but never used.","no-native-reassign",["102"],"no-negated-in-lhs",["103"],"'useContext' is defined but never used.","'useHistory' is defined but never used.","'Redirect' is defined but never used.","'UserContext' is defined but never used.","'CalendarOutlined' is defined but never used.","'useState' is defined but never used.","'searchInput' is assigned a value but never used.","no-global-assign","no-unsafe-negation"] \ No newline at end of file +[{"D:\\Proiecte\\React\\appointments-management\\client\\src\\App.tsx":"1","D:\\Proiecte\\React\\appointments-management\\client\\src\\reportWebVitals.ts":"2","D:\\Proiecte\\React\\appointments-management\\client\\src\\index.tsx":"3","D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\pages\\SignUp.tsx":"4","D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\components\\Header.tsx":"5","D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\components\\Slider.tsx":"6","D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\pages\\Home.tsx":"7","D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\pages\\SignIn.tsx":"8","D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\pages\\Dashboard.tsx":"9","D:\\Proiecte\\React\\appointments-management\\client\\src\\PrivateRoute.tsx":"10","D:\\Proiecte\\React\\appointments-management\\client\\src\\context\\UserContext.tsx":"11","D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\FontLayout.tsx":"12","D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\components\\Header.tsx":"13","D:\\Proiecte\\React\\appointments-management\\client\\src\\NormalRoute.tsx":"14","D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\components\\Sidebar.tsx":"15","D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\AdminLayout.tsx":"16","D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\pages\\Appointments.tsx":"17","D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\components\\AppointmentForm.tsx":"18"},{"size":1382,"mtime":1607107903546,"results":"19","hashOfConfig":"20"},{"size":440,"mtime":1607107903553,"results":"21","hashOfConfig":"20"},{"size":494,"mtime":1607107903552,"results":"22","hashOfConfig":"20"},{"size":3209,"mtime":1607159900486,"results":"23","hashOfConfig":"20"},{"size":1432,"mtime":1607266316016,"results":"24","hashOfConfig":"20"},{"size":642,"mtime":1606834898726,"results":"25","hashOfConfig":"20"},{"size":228,"mtime":1607107903550,"results":"26","hashOfConfig":"20"},{"size":3029,"mtime":1607176318581,"results":"27","hashOfConfig":"20"},{"size":795,"mtime":1607107903548,"results":"28","hashOfConfig":"20"},{"size":444,"mtime":1607107903546,"results":"29","hashOfConfig":"20"},{"size":1171,"mtime":1607266979337,"results":"30","hashOfConfig":"20"},{"size":284,"mtime":1607107903549,"results":"31","hashOfConfig":"20"},{"size":2213,"mtime":1607266250776,"results":"32","hashOfConfig":"20"},{"size":288,"mtime":1606933258145,"results":"33","hashOfConfig":"20"},{"size":2061,"mtime":1607108621533,"results":"34","hashOfConfig":"20"},{"size":869,"mtime":1607107903547,"results":"35","hashOfConfig":"20"},{"size":5691,"mtime":1607163583234,"results":"36","hashOfConfig":"20"},{"size":972,"mtime":1607160361242,"results":"37","hashOfConfig":"20"},{"filePath":"38","messages":"39","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},"12pxieb",{"filePath":"40","messages":"41","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"42","messages":"43","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"44","messages":"45","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"46","usedDeprecatedRules":"47"},{"filePath":"48","messages":"49","errorCount":0,"warningCount":4,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"50","messages":"51","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"52","messages":"53","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"54","messages":"55","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"47"},{"filePath":"56","messages":"57","errorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"58","usedDeprecatedRules":"47"},{"filePath":"59","messages":"60","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"61"},{"filePath":"62","messages":"63","errorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"64","messages":"65","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"66","messages":"67","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"68","messages":"69","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"70","messages":"71","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"72","messages":"73","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"74","messages":"75","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"76","usedDeprecatedRules":"47"},{"filePath":"77","messages":"78","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"79"},"D:\\Proiecte\\React\\appointments-management\\client\\src\\App.tsx",["80"],"D:\\Proiecte\\React\\appointments-management\\client\\src\\reportWebVitals.ts",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\index.tsx",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\pages\\SignUp.tsx",["81"],"import React, { useState } from \"react\";\r\nimport axios from \"axios\";\r\nimport { Row, Col, Form, Input, Button, Checkbox, Select } from \"antd\";\r\n\r\nimport \"../scss/SignUp.scss\";\r\n\r\nconst { Option } = Select;\r\n\r\nconst SignUp = () => {\r\n\tconst [username, setUsername] = useState(\"\");\r\n\tconst [password, setPassword] = useState(\"\");\r\n\tconst [email, setEmail] = useState(\"\");\r\n\tconst [role, setRole] = useState(\"\");\r\n\r\n\tconst handleRole = value => {\r\n\t\tsetRole(value);\r\n\t};\r\n\r\n\tconst createAccount = async () => {\r\n\t\ttry {\r\n\t\t\tconst result = await axios({\r\n\t\t\t\tmethod: \"POST\",\r\n\t\t\t\turl: \"http://localhost:4000/auth/signup\",\r\n\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\r\n\t\t\t\tdata: { username, email, role, password },\r\n });\r\n setUsername('')\r\n setEmail('')\r\n setRole('')\r\n\t\t\tsetPassword('')\r\n\t\t} catch (error) {\r\n\t\t\tconsole.log(error.response.data.message);\r\n }\r\n\t};\r\n\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\r\n\t\t\t\r\n\t\t\t\t

Create new account

\r\n\t\t\t\t

\r\n\t\t\t\t\tAdd your informations below and create a new acccount in 10\r\n\t\t\t\t\tseconds.\r\n\t\t\t\t

\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t setUsername(e.target.value)}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t setEmail(e.target.value)}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t setPassword(e.target.value)}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tRemember me\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\r\n\t\t\t\r\n\t\t
\r\n\t);\r\n};\r\n\r\nexport default SignUp;\r\n",["82","83"],"D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\components\\Header.tsx",["84","85","86","87"],"D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\components\\Slider.tsx",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\pages\\Home.tsx",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\pages\\SignIn.tsx",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\pages\\Dashboard.tsx",["88","89"],"import React from 'react'\r\nimport { Card, Col, Row } from 'antd'\r\nimport { UserContext } from '../../context/UserContext' \r\n\r\nimport { CalendarOutlined } from '@ant-design/icons'\r\n\r\nconst Dashboard = () => {\r\n return (\r\n \r\n \r\n \r\n Card content\r\n \r\n \r\n \r\n \r\n Card content\r\n \r\n \r\n \r\n \r\n Card content\r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default Dashboard\r\n","D:\\Proiecte\\React\\appointments-management\\client\\src\\PrivateRoute.tsx",[],["90","91"],"D:\\Proiecte\\React\\appointments-management\\client\\src\\context\\UserContext.tsx",["92","93"],"D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\FontLayout.tsx",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\components\\Header.tsx",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\NormalRoute.tsx",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\components\\Sidebar.tsx",["94"],"D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\AdminLayout.tsx",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\pages\\Appointments.tsx",["95"],"import React, { useState } from 'react'\r\nimport { Table, Input, Button, Space, Skeleton } from 'antd';\r\nimport Highlighter from 'react-highlight-words';\r\nimport { SearchOutlined } from '@ant-design/icons';\r\n\r\n\r\nconst data = [\r\n {\r\n key: '1',\r\n name: 'John Brown',\r\n status: 'In progress',\r\n address: 'New York No. 1 Lake Park',\r\n },\r\n {\r\n key: '2',\r\n name: 'Joe Black',\r\n status: 'In progress',\r\n address: 'London No. 1 Lake Park',\r\n },\r\n {\r\n key: '3',\r\n name: 'Jim Green',\r\n status: 'Done',\r\n address: 'Sidney No. 1 Lake Park',\r\n },\r\n {\r\n key: '4',\r\n name: 'Jim Red',\r\n status: 'Done',\r\n address: 'London No. 2 Lake Park',\r\n },\r\n {\r\n key: '5',\r\n name: 'John Brown',\r\n status: 'In progress',\r\n address: 'New York No. 1 Lake Park',\r\n },\r\n {\r\n key: '6',\r\n name: 'Joe Black',\r\n status: 'In progress',\r\n address: 'London No. 1 Lake Park',\r\n },\r\n {\r\n key: '7',\r\n name: 'Jim Green',\r\n status: 'Done',\r\n address: 'Sidney No. 1 Lake Park',\r\n },\r\n {\r\n key: '8',\r\n name: 'Jim Red',\r\n status: 'Done',\r\n address: 'London No. 2 Lake Park',\r\n },\r\n {\r\n key: '9',\r\n name: 'John Brown',\r\n status: 'In progress',\r\n address: 'New York No. 1 Lake Park',\r\n },\r\n {\r\n key: '10',\r\n name: 'Joe Black',\r\n status: 'In progress',\r\n address: 'London No. 1 Lake Park',\r\n },\r\n {\r\n key: '11',\r\n name: 'Jim Green',\r\n status: 'Done',\r\n address: 'Sidney No. 1 Lake Park',\r\n },\r\n {\r\n key: '12',\r\n name: 'Jim Red',\r\n status: 'Done',\r\n address: 'London No. 2 Lake Park',\r\n },\r\n {\r\n key: '13',\r\n name: 'John Brown',\r\n status: 'In progress',\r\n address: 'New York No. 1 Lake Park',\r\n },\r\n {\r\n key: '14',\r\n name: 'Joe Black',\r\n status: 'In progress',\r\n address: 'London No. 1 Lake Park',\r\n },\r\n ];\r\n\r\nconst Appointments = () => {\r\n const [searchText, setSearchText] = useState('')\r\n const [searchedColumn, setSearchedColumn] = useState('')\r\n const [searchInput, setSearchInput]: any = useState('')\r\n const [loading, setLoading] = useState(true)\r\n\r\n setTimeout(() => {\r\n setLoading(false)\r\n }, 3000)\r\n\r\n const getColumnSearchProps = dataIndex => ({\r\n filterDropdown: ({ setSelectedKeys, selectedKeys, confirm, clearFilters }) => (\r\n
\r\n {\r\n setSearchInput(node);\r\n }}\r\n placeholder={`Search ${dataIndex}`}\r\n value={selectedKeys[0]}\r\n onChange={e => setSelectedKeys(e.target.value ? [e.target.value] : [])}\r\n onPressEnter={() => handleSearch(selectedKeys, confirm, dataIndex)}\r\n style={{ width: 188, marginBottom: 8, display: 'block' }}\r\n />\r\n \r\n handleSearch(selectedKeys, confirm, dataIndex)}\r\n icon={}\r\n size=\"small\"\r\n style={{ width: 90 }}\r\n >\r\n Search\r\n \r\n \r\n \r\n
\r\n ),\r\n filterIcon: filtered => ,\r\n onFilter: (value, record) =>\r\n record[dataIndex]\r\n ? record[dataIndex].toString().toLowerCase().includes(value.toLowerCase())\r\n : '',\r\n render: text =>\r\n searchedColumn === dataIndex ? (\r\n \r\n ) : (\r\n text\r\n ),\r\n });\r\n \r\n const handleSearch = (selectedKeys, confirm, dataIndex) => {\r\n confirm();\r\n \r\n setSearchedColumn(dataIndex)\r\n };\r\n \r\n const handleReset = clearFilters => {\r\n clearFilters();\r\n setSearchText('')\r\n };\r\n const columns = [\r\n {\r\n title: 'Name',\r\n dataIndex: 'name',\r\n key: 'name',\r\n width: '30%',\r\n ...getColumnSearchProps('name'),\r\n },\r\n {\r\n title: 'Status',\r\n dataIndex: 'status',\r\n key: 'status',\r\n width: '20%',\r\n filters: [\r\n {\r\n text: 'Open',\r\n value: 'Open',\r\n },\r\n {\r\n text: 'In progress',\r\n value: 'In progress',\r\n },\r\n {\r\n text: 'Done',\r\n value: 'Done',\r\n },\r\n ],\r\n onFilter: (value, record) => record.status.indexOf(value) === 0,\r\n sorter: (a, b) => a.status.length - b.status.length,\r\n \r\n },\r\n {\r\n title: 'Address',\r\n dataIndex: 'address',\r\n key: 'address',\r\n ...getColumnSearchProps('address'),\r\n },\r\n ];\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default Appointments\r\n","D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\components\\AppointmentForm.tsx",["96"],"import React, { useState } from 'react';\r\nimport {\r\n Form,\r\n Input,\r\n Button,\r\n DatePicker,\r\n Space\r\n} from 'antd';\r\n\r\nconst AppointmentForm = ({ closeDrawer }) => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default AppointmentForm\r\n",{"ruleId":"97","severity":1,"message":"98","line":2,"column":43,"nodeType":"99","messageId":"100","endLine":2,"endColumn":48},{"ruleId":"97","severity":1,"message":"101","line":21,"column":10,"nodeType":"99","messageId":"100","endLine":21,"endColumn":16},{"ruleId":"102","replacedBy":"103"},{"ruleId":"104","replacedBy":"105"},{"ruleId":"97","severity":1,"message":"106","line":1,"column":29,"nodeType":"99","messageId":"100","endLine":1,"endColumn":37},{"ruleId":"97","severity":1,"message":"107","line":1,"column":39,"nodeType":"99","messageId":"100","endLine":1,"endColumn":48},{"ruleId":"97","severity":1,"message":"108","line":2,"column":16,"nodeType":"99","messageId":"100","endLine":2,"endColumn":26},{"ruleId":"97","severity":1,"message":"109","line":5,"column":35,"nodeType":"99","messageId":"100","endLine":5,"endColumn":42},{"ruleId":"97","severity":1,"message":"110","line":3,"column":10,"nodeType":"99","messageId":"100","endLine":3,"endColumn":21},{"ruleId":"97","severity":1,"message":"111","line":5,"column":10,"nodeType":"99","messageId":"100","endLine":5,"endColumn":26},{"ruleId":"102","replacedBy":"112"},{"ruleId":"104","replacedBy":"113"},{"ruleId":"114","severity":1,"message":"115","line":18,"column":8,"nodeType":"116","endLine":18,"endColumn":10,"suggestions":"117"},{"ruleId":"97","severity":1,"message":"118","line":25,"column":11,"nodeType":"99","messageId":"100","endLine":25,"endColumn":23},{"ruleId":"97","severity":1,"message":"106","line":1,"column":17,"nodeType":"99","messageId":"100","endLine":1,"endColumn":25},{"ruleId":"97","severity":1,"message":"119","line":97,"column":12,"nodeType":"99","messageId":"100","endLine":97,"endColumn":23},{"ruleId":"97","severity":1,"message":"106","line":1,"column":17,"nodeType":"99","messageId":"100","endLine":1,"endColumn":25},"@typescript-eslint/no-unused-vars","'Route' is defined but never used.","Identifier","unusedVar","'result' is assigned a value but never used.","no-native-reassign",["120"],"no-negated-in-lhs",["121"],"'useState' is defined but never used.","'useEffect' is defined but never used.","'useHistory' is defined but never used.","'message' is defined but never used.","'UserContext' is defined but never used.","'CalendarOutlined' is defined but never used.",["120"],["121"],"react-hooks/exhaustive-deps","React Hook useEffect has a missing dependency: 'isAuth'. Either include it or remove the dependency array.","ArrayExpression",["122"],"'handleLogout' is assigned a value but never used.","'searchInput' is assigned a value but never used.","no-global-assign","no-unsafe-negation",{"desc":"123","fix":"124"},"Update the dependencies array to be: [isAuth]",{"range":"125","text":"126"},[550,552],"[isAuth]"] \ No newline at end of file diff --git a/client/debug.log b/client/debug.log index 17afd44..fc57ff3 100644 --- a/client/debug.log +++ b/client/debug.log @@ -1,3 +1,4 @@ [1130/104044.364:ERROR:directory_reader_win.cc(43)] FindFirstFile: The system cannot find the path specified. (0x3) [1130/232520.008:ERROR:directory_reader_win.cc(43)] FindFirstFile: The system cannot find the path specified. (0x3) [1201/201921.277:ERROR:directory_reader_win.cc(43)] FindFirstFile: The system cannot find the path specified. (0x3) +[1206/153751.263:ERROR:directory_reader_win.cc(43)] FindFirstFile: The system cannot find the path specified. (0x3) diff --git a/client/src/App.scss b/client/src/App.scss index ec0a27a..39345f2 100644 --- a/client/src/App.scss +++ b/client/src/App.scss @@ -28,3 +28,35 @@ } } /*End default Ant override*/ + +/*Custom components*/ +.custom-button-primary { + background-color: $thirdColor; + border-radius: 25px; + border: none; + transition: all 0.3s ease-in-out; + a { + color: #000; + font-weight: bold; + transition: all 0.3s ease-in-out; + span.anticon { + background-color: $primaryColor; + border-radius: 50%; + padding: 4px; + color: #fff; + margin-left: 5px; + transition: all 0.3s ease-in-out; + } + } + + &:hover { + background-color: $primaryColor; + a { + color: #fff !important; + span.anticon { + background-color: $thirdColor; + color: #000; + } + } + } +} diff --git a/client/src/_variables.scss b/client/src/_variables.scss index 8081296..86f2437 100644 --- a/client/src/_variables.scss +++ b/client/src/_variables.scss @@ -1,2 +1,3 @@ $primaryColor: #0057ff; $secondaryColor: #fdfdfd; +$thirdColor: #eeeefb; diff --git a/client/src/admin/components/AppointmentForm.tsx b/client/src/admin/components/AppointmentForm.tsx new file mode 100644 index 0000000..f860664 --- /dev/null +++ b/client/src/admin/components/AppointmentForm.tsx @@ -0,0 +1,39 @@ +import React, { useState } from 'react'; +import { + Form, + Input, + Button, + DatePicker, + Space +} from 'antd'; + +const AppointmentForm = ({ closeDrawer }) => { + return ( + <> +
+ + + + + + + + + + + + + + + ) +} + +export default AppointmentForm diff --git a/client/src/admin/components/Header.tsx b/client/src/admin/components/Header.tsx index f51978e..c097527 100644 --- a/client/src/admin/components/Header.tsx +++ b/client/src/admin/components/Header.tsx @@ -1,6 +1,8 @@ -import React from 'react' -import { Row, Col, Avatar, Tooltip, Dropdown, Menu } from 'antd' -import { UserOutlined } from '@ant-design/icons'; +import React, { useState } from 'react' +import { Row, Col, Avatar, Tooltip, Dropdown, Menu, Drawer, Button } from 'antd' +import { UserOutlined, PlusOutlined } from '@ant-design/icons'; + +import AppointmentForm from '../components/AppointmentForm' import '../scss/Header.scss' @@ -26,15 +28,40 @@ const adminMenu = ( ); const Header = () => { + const [toggleDrawer, setToggleDrawer] = useState(false); + + const showDrawer = () => { + setToggleDrawer(true) + }; + + const closeDrawer = () => { + setToggleDrawer(false) + }; + return (
- - - } className="admin-avatar" /> - - + + diff --git a/client/src/admin/pages/Appointments.tsx b/client/src/admin/pages/Appointments.tsx index 15af688..5d0a3c7 100644 --- a/client/src/admin/pages/Appointments.tsx +++ b/client/src/admin/pages/Appointments.tsx @@ -1,5 +1,5 @@ import React, { useState } from 'react' -import { Table, Input, Button, Space } from 'antd'; +import { Table, Input, Button, Space, Skeleton } from 'antd'; import Highlighter from 'react-highlight-words'; import { SearchOutlined } from '@ant-design/icons'; @@ -95,6 +95,11 @@ const Appointments = () => { const [searchText, setSearchText] = useState('') const [searchedColumn, setSearchedColumn] = useState('') const [searchInput, setSearchInput]: any = useState('') + const [loading, setLoading] = useState(true) + + setTimeout(() => { + setLoading(false) + }, 3000) const getColumnSearchProps = dataIndex => ({ filterDropdown: ({ setSelectedKeys, selectedKeys, confirm, clearFilters }) => ( @@ -193,7 +198,9 @@ const Appointments = () => { ]; return (
-
+ +
+ ) } diff --git a/client/src/admin/scss/AdminLayout.scss b/client/src/admin/scss/AdminLayout.scss index ca4e8c0..8a70146 100644 --- a/client/src/admin/scss/AdminLayout.scss +++ b/client/src/admin/scss/AdminLayout.scss @@ -2,7 +2,7 @@ .admin { .close-menu { - width: 90px; + width: 0; } .admin-content { padding: 25px; diff --git a/client/src/admin/scss/Header.scss b/client/src/admin/scss/Header.scss index 31f4ccf..32661a8 100644 --- a/client/src/admin/scss/Header.scss +++ b/client/src/admin/scss/Header.scss @@ -4,7 +4,12 @@ background-color: $secondaryColor; padding: 11px 25px; .user-info { - text-align: right; + display: flex; + justify-content: flex-end; + align-items: center; + .appointments-btn { + margin-right: 15px; + } .admin-avatar { &:hover { cursor: pointer; @@ -12,3 +17,11 @@ } } } +.appointments-drawer { + .ant-drawer-content-wrapper { + width: 500px !important; + @media (max-width: 500px) { + width: 100vw !important; + } + } +} diff --git a/client/src/admin/scss/Sidebar.scss b/client/src/admin/scss/Sidebar.scss index 29d5ba0..b7ca531 100644 --- a/client/src/admin/scss/Sidebar.scss +++ b/client/src/admin/scss/Sidebar.scss @@ -7,11 +7,6 @@ display: flex; justify-content: space-between; padding: 10px; - .logo { - width: 90px; - height: 32px; - background-color: rgba(0, 0, 0, 0.5); - } } .ant-menu { background-color: $secondaryColor; diff --git a/client/src/context/UserContext.tsx b/client/src/context/UserContext.tsx index 7939bb2..b8fe482 100644 --- a/client/src/context/UserContext.tsx +++ b/client/src/context/UserContext.tsx @@ -1,12 +1,43 @@ -import React, { useState, createContext } from 'react' +import React, { createContext, useState, useEffect } from 'react' +import { message } from 'antd' +import { useHistory } from 'react-router-dom' export const UserContext = createContext('') export const UserProvider = (props) => { - const isAuth: any = localStorage.getItem('appointments_management_login_token') + const isAuth: string | null = JSON.stringify(localStorage.getItem('appointments_management_login_token')) + + let history = useHistory() + const [loggedUser, setLoggedUser] = useState(false) + + useEffect(() => { + if(isAuth) { + setLoggedUser(true) + } + + }, []) + + const isLogged = { + isAuth: isAuth, + loggedUser: loggedUser + } + + const handleLogout = () => { + localStorage.removeItem('appointments_management_login_token') + setLoggedUser(false) + message.info({ + content: 'Logged out with success', + duration: 3, + style: { + bottom: '30px', + right: '30px' + }, + }); + history.push('/') + } return ( - + { props.children } ) diff --git a/client/src/frontend/components/Header.tsx b/client/src/frontend/components/Header.tsx index 1ae8dfb..27abdf1 100644 --- a/client/src/frontend/components/Header.tsx +++ b/client/src/frontend/components/Header.tsx @@ -1,22 +1,16 @@ -import React, { useContext } from 'react' +import React, { useContext, useState, useEffect } from 'react' import { Link, useHistory } from 'react-router-dom' import { UserContext } from '../../context/UserContext' -import { Row, Col, Button, Space } from 'antd'; -import { PlusOutlined, LoginOutlined, LogoutOutlined } from '@ant-design/icons'; +import { Row, Col, Button, Space, message } from 'antd'; +import { PlusOutlined, LoginOutlined, RightOutlined } from '@ant-design/icons'; import '../scss/Header.scss' const Header = () => { - let history = useHistory() const isAuth = useContext(UserContext) - const handleLogout = () => { - localStorage.removeItem('appointments_management_login_token') - history.push('/') - } - return (
@@ -27,7 +21,7 @@ const Header = () => {
{ isAuth ? - + : <> \r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\r\n\t\t\t\r\n\t\t\r\n\t);\r\n};\r\n\r\nexport default SignUp;\r\n",["82","83"],"D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\components\\Header.tsx",["84","85","86","87"],"D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\components\\Slider.tsx",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\pages\\Home.tsx",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\pages\\SignIn.tsx",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\pages\\Dashboard.tsx",["88","89"],"import React from 'react'\r\nimport { Card, Col, Row } from 'antd'\r\nimport { UserContext } from '../../context/UserContext' \r\n\r\nimport { CalendarOutlined } from '@ant-design/icons'\r\n\r\nconst Dashboard = () => {\r\n return (\r\n \r\n \r\n \r\n Card content\r\n \r\n \r\n \r\n \r\n Card content\r\n \r\n \r\n \r\n \r\n Card content\r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default Dashboard\r\n","D:\\Proiecte\\React\\appointments-management\\client\\src\\PrivateRoute.tsx",[],["90","91"],"D:\\Proiecte\\React\\appointments-management\\client\\src\\context\\UserContext.tsx",["92","93"],"D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\FontLayout.tsx",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\components\\Header.tsx",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\NormalRoute.tsx",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\components\\Sidebar.tsx",["94"],"D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\AdminLayout.tsx",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\pages\\Appointments.tsx",["95"],"import React, { useState } from 'react'\r\nimport { Table, Input, Button, Space, Skeleton } from 'antd';\r\nimport Highlighter from 'react-highlight-words';\r\nimport { SearchOutlined } from '@ant-design/icons';\r\n\r\n\r\nconst data = [\r\n {\r\n key: '1',\r\n name: 'John Brown',\r\n status: 'In progress',\r\n address: 'New York No. 1 Lake Park',\r\n },\r\n {\r\n key: '2',\r\n name: 'Joe Black',\r\n status: 'In progress',\r\n address: 'London No. 1 Lake Park',\r\n },\r\n {\r\n key: '3',\r\n name: 'Jim Green',\r\n status: 'Done',\r\n address: 'Sidney No. 1 Lake Park',\r\n },\r\n {\r\n key: '4',\r\n name: 'Jim Red',\r\n status: 'Done',\r\n address: 'London No. 2 Lake Park',\r\n },\r\n {\r\n key: '5',\r\n name: 'John Brown',\r\n status: 'In progress',\r\n address: 'New York No. 1 Lake Park',\r\n },\r\n {\r\n key: '6',\r\n name: 'Joe Black',\r\n status: 'In progress',\r\n address: 'London No. 1 Lake Park',\r\n },\r\n {\r\n key: '7',\r\n name: 'Jim Green',\r\n status: 'Done',\r\n address: 'Sidney No. 1 Lake Park',\r\n },\r\n {\r\n key: '8',\r\n name: 'Jim Red',\r\n status: 'Done',\r\n address: 'London No. 2 Lake Park',\r\n },\r\n {\r\n key: '9',\r\n name: 'John Brown',\r\n status: 'In progress',\r\n address: 'New York No. 1 Lake Park',\r\n },\r\n {\r\n key: '10',\r\n name: 'Joe Black',\r\n status: 'In progress',\r\n address: 'London No. 1 Lake Park',\r\n },\r\n {\r\n key: '11',\r\n name: 'Jim Green',\r\n status: 'Done',\r\n address: 'Sidney No. 1 Lake Park',\r\n },\r\n {\r\n key: '12',\r\n name: 'Jim Red',\r\n status: 'Done',\r\n address: 'London No. 2 Lake Park',\r\n },\r\n {\r\n key: '13',\r\n name: 'John Brown',\r\n status: 'In progress',\r\n address: 'New York No. 1 Lake Park',\r\n },\r\n {\r\n key: '14',\r\n name: 'Joe Black',\r\n status: 'In progress',\r\n address: 'London No. 1 Lake Park',\r\n },\r\n ];\r\n\r\nconst Appointments = () => {\r\n const [searchText, setSearchText] = useState('')\r\n const [searchedColumn, setSearchedColumn] = useState('')\r\n const [searchInput, setSearchInput]: any = useState('')\r\n const [loading, setLoading] = useState(true)\r\n\r\n setTimeout(() => {\r\n setLoading(false)\r\n }, 3000)\r\n\r\n const getColumnSearchProps = dataIndex => ({\r\n filterDropdown: ({ setSelectedKeys, selectedKeys, confirm, clearFilters }) => (\r\n
\r\n {\r\n setSearchInput(node);\r\n }}\r\n placeholder={`Search ${dataIndex}`}\r\n value={selectedKeys[0]}\r\n onChange={e => setSelectedKeys(e.target.value ? [e.target.value] : [])}\r\n onPressEnter={() => handleSearch(selectedKeys, confirm, dataIndex)}\r\n style={{ width: 188, marginBottom: 8, display: 'block' }}\r\n />\r\n \r\n handleSearch(selectedKeys, confirm, dataIndex)}\r\n icon={}\r\n size=\"small\"\r\n style={{ width: 90 }}\r\n >\r\n Search\r\n \r\n \r\n \r\n
\r\n ),\r\n filterIcon: filtered => ,\r\n onFilter: (value, record) =>\r\n record[dataIndex]\r\n ? record[dataIndex].toString().toLowerCase().includes(value.toLowerCase())\r\n : '',\r\n render: text =>\r\n searchedColumn === dataIndex ? (\r\n \r\n ) : (\r\n text\r\n ),\r\n });\r\n \r\n const handleSearch = (selectedKeys, confirm, dataIndex) => {\r\n confirm();\r\n \r\n setSearchedColumn(dataIndex)\r\n };\r\n \r\n const handleReset = clearFilters => {\r\n clearFilters();\r\n setSearchText('')\r\n };\r\n const columns = [\r\n {\r\n title: 'Name',\r\n dataIndex: 'name',\r\n key: 'name',\r\n width: '30%',\r\n ...getColumnSearchProps('name'),\r\n },\r\n {\r\n title: 'Status',\r\n dataIndex: 'status',\r\n key: 'status',\r\n width: '20%',\r\n filters: [\r\n {\r\n text: 'Open',\r\n value: 'Open',\r\n },\r\n {\r\n text: 'In progress',\r\n value: 'In progress',\r\n },\r\n {\r\n text: 'Done',\r\n value: 'Done',\r\n },\r\n ],\r\n onFilter: (value, record) => record.status.indexOf(value) === 0,\r\n sorter: (a, b) => a.status.length - b.status.length,\r\n \r\n },\r\n {\r\n title: 'Address',\r\n dataIndex: 'address',\r\n key: 'address',\r\n ...getColumnSearchProps('address'),\r\n },\r\n ];\r\n return (\r\n
\r\n \r\n
\r\n \r\n \r\n )\r\n}\r\n\r\nexport default Appointments\r\n","D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\components\\AppointmentForm.tsx",["96"],"import React, { useState } from 'react';\r\nimport {\r\n Form,\r\n Input,\r\n Button,\r\n DatePicker,\r\n Space\r\n} from 'antd';\r\n\r\nconst AppointmentForm = ({ closeDrawer }) => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default AppointmentForm\r\n",{"ruleId":"97","severity":1,"message":"98","line":2,"column":43,"nodeType":"99","messageId":"100","endLine":2,"endColumn":48},{"ruleId":"97","severity":1,"message":"101","line":21,"column":10,"nodeType":"99","messageId":"100","endLine":21,"endColumn":16},{"ruleId":"102","replacedBy":"103"},{"ruleId":"104","replacedBy":"105"},{"ruleId":"97","severity":1,"message":"106","line":1,"column":29,"nodeType":"99","messageId":"100","endLine":1,"endColumn":37},{"ruleId":"97","severity":1,"message":"107","line":1,"column":39,"nodeType":"99","messageId":"100","endLine":1,"endColumn":48},{"ruleId":"97","severity":1,"message":"108","line":2,"column":16,"nodeType":"99","messageId":"100","endLine":2,"endColumn":26},{"ruleId":"97","severity":1,"message":"109","line":5,"column":35,"nodeType":"99","messageId":"100","endLine":5,"endColumn":42},{"ruleId":"97","severity":1,"message":"110","line":3,"column":10,"nodeType":"99","messageId":"100","endLine":3,"endColumn":21},{"ruleId":"97","severity":1,"message":"111","line":5,"column":10,"nodeType":"99","messageId":"100","endLine":5,"endColumn":26},{"ruleId":"102","replacedBy":"112"},{"ruleId":"104","replacedBy":"113"},{"ruleId":"114","severity":1,"message":"115","line":18,"column":8,"nodeType":"116","endLine":18,"endColumn":10,"suggestions":"117"},{"ruleId":"97","severity":1,"message":"118","line":25,"column":11,"nodeType":"99","messageId":"100","endLine":25,"endColumn":23},{"ruleId":"97","severity":1,"message":"106","line":1,"column":17,"nodeType":"99","messageId":"100","endLine":1,"endColumn":25},{"ruleId":"97","severity":1,"message":"119","line":97,"column":12,"nodeType":"99","messageId":"100","endLine":97,"endColumn":23},{"ruleId":"97","severity":1,"message":"106","line":1,"column":17,"nodeType":"99","messageId":"100","endLine":1,"endColumn":25},"@typescript-eslint/no-unused-vars","'Route' is defined but never used.","Identifier","unusedVar","'result' is assigned a value but never used.","no-native-reassign",["120"],"no-negated-in-lhs",["121"],"'useState' is defined but never used.","'useEffect' is defined but never used.","'useHistory' is defined but never used.","'message' is defined but never used.","'UserContext' is defined but never used.","'CalendarOutlined' is defined but never used.",["120"],["121"],"react-hooks/exhaustive-deps","React Hook useEffect has a missing dependency: 'isAuth'. Either include it or remove the dependency array.","ArrayExpression",["122"],"'handleLogout' is assigned a value but never used.","'searchInput' is assigned a value but never used.","no-global-assign","no-unsafe-negation",{"desc":"123","fix":"124"},"Update the dependencies array to be: [isAuth]",{"range":"125","text":"126"},[550,552],"[isAuth]"] \ No newline at end of file +[{"C:\\Projects\\appoiments-mangement\\client\\src\\index.tsx":"1","C:\\Projects\\appoiments-mangement\\client\\src\\frontend\\pages\\SignIn.tsx":"2","C:\\Projects\\appoiments-mangement\\client\\src\\admin\\pages\\Dashboard.tsx":"3","C:\\Projects\\appoiments-mangement\\client\\src\\PrivateRoute.tsx":"4","C:\\Projects\\appoiments-mangement\\client\\src\\admin\\components\\AppointmentForm.tsx":"5","C:\\Projects\\appoiments-mangement\\client\\src\\frontend\\components\\Slider.tsx":"6","C:\\Projects\\appoiments-mangement\\client\\src\\context\\UserContext.tsx":"7","C:\\Projects\\appoiments-mangement\\client\\src\\admin\\components\\Header.tsx":"8"},{"size":494,"mtime":1606820941613,"results":"9","hashOfConfig":"10"},{"size":3029,"mtime":1607267120860,"results":"11","hashOfConfig":"10"},{"size":795,"mtime":1607267120857,"results":"12","hashOfConfig":"10"},{"size":444,"mtime":1606946273860,"results":"13","hashOfConfig":"10"},{"size":972,"mtime":1607267120854,"results":"14","hashOfConfig":"10"},{"size":642,"mtime":1606820941610,"results":"15","hashOfConfig":"10"},{"size":841,"mtime":1607267953770,"results":"16","hashOfConfig":"10"},{"size":2419,"mtime":1607268270364,"results":"17","hashOfConfig":"10"},{"filePath":"18","messages":"19","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"gaewab",{"filePath":"20","messages":"21","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22","messages":"23","errorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"24","messages":"25","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"26"},{"filePath":"27","messages":"28","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"29"},{"filePath":"30","messages":"31","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32","messages":"33","errorCount":0,"warningCount":4,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"34","messages":"35","errorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},"C:\\Projects\\appoiments-mangement\\client\\src\\index.tsx",[],"C:\\Projects\\appoiments-mangement\\client\\src\\frontend\\pages\\SignIn.tsx",[],"C:\\Projects\\appoiments-mangement\\client\\src\\admin\\pages\\Dashboard.tsx",["36","37"],"C:\\Projects\\appoiments-mangement\\client\\src\\PrivateRoute.tsx",[],["38","39"],"C:\\Projects\\appoiments-mangement\\client\\src\\admin\\components\\AppointmentForm.tsx",["40"],"import React, { useState } from 'react';\r\nimport {\r\n Form,\r\n Input,\r\n Button,\r\n DatePicker,\r\n Space\r\n} from 'antd';\r\n\r\nconst AppointmentForm = ({ closeDrawer }) => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default AppointmentForm\r\n","C:\\Projects\\appoiments-mangement\\client\\src\\frontend\\components\\Slider.tsx",[],"C:\\Projects\\appoiments-mangement\\client\\src\\context\\UserContext.tsx",["41","42","43","44"],"C:\\Projects\\appoiments-mangement\\client\\src\\admin\\components\\Header.tsx",["45","46"],{"ruleId":"47","severity":1,"message":"48","line":3,"column":10,"nodeType":"49","messageId":"50","endLine":3,"endColumn":21},{"ruleId":"47","severity":1,"message":"51","line":5,"column":10,"nodeType":"49","messageId":"50","endLine":5,"endColumn":26},{"ruleId":"52","replacedBy":"53"},{"ruleId":"54","replacedBy":"55"},{"ruleId":"47","severity":1,"message":"56","line":1,"column":17,"nodeType":"49","messageId":"50","endLine":1,"endColumn":25},{"ruleId":"47","severity":1,"message":"57","line":2,"column":10,"nodeType":"49","messageId":"50","endLine":2,"endColumn":17},{"ruleId":"47","severity":1,"message":"58","line":20,"column":6,"nodeType":"49","messageId":"50","endLine":20,"endColumn":13},{"ruleId":"59","severity":1,"message":"60","line":27,"column":5,"nodeType":"61","endLine":27,"endColumn":7,"suggestions":"62"},{"ruleId":"47","severity":1,"message":"63","line":29,"column":8,"nodeType":"49","messageId":"50","endLine":29,"endColumn":16},{"ruleId":"47","severity":1,"message":"64","line":23,"column":10,"nodeType":"49","messageId":"50","endLine":23,"endColumn":16},{"ruleId":"47","severity":1,"message":"65","line":23,"column":18,"nodeType":"49","messageId":"50","endLine":23,"endColumn":28},"@typescript-eslint/no-unused-vars","'UserContext' is defined but never used.","Identifier","unusedVar","'CalendarOutlined' is defined but never used.","no-native-reassign",["66"],"no-negated-in-lhs",["67"],"'useState' is defined but never used.","'message' is defined but never used.","'history' is assigned a value but never used.","react-hooks/exhaustive-deps","React Hook useEffect has a missing dependency: 'isAuth'. Either include it or remove the dependency array.","ArrayExpression",["68"],"'isLogged' is assigned a value but never used.","'isAuth' is assigned a value but never used.","'loggedUser' is assigned a value but never used.","no-global-assign","no-unsafe-negation",{"desc":"69","fix":"70"},"Update the dependencies array to be: [isAuth]",{"range":"71","text":"72"},[634,636],"[isAuth]"] \ No newline at end of file diff --git a/client/src/admin/components/Header.tsx b/client/src/admin/components/Header.tsx index c097527..2e719d1 100644 --- a/client/src/admin/components/Header.tsx +++ b/client/src/admin/components/Header.tsx @@ -1,70 +1,110 @@ -import React, { useState } from 'react' -import { Row, Col, Avatar, Tooltip, Dropdown, Menu, Drawer, Button } from 'antd' -import { UserOutlined, PlusOutlined } from '@ant-design/icons'; +import React, { useContext, useState } from "react"; +import { + Row, + Col, + Avatar, + Tooltip, + Dropdown, + Menu, + Drawer, + Button, + message, +} from "antd"; +import { UserOutlined, PlusOutlined } from "@ant-design/icons"; +import { useHistory } from "react-router-dom"; -import AppointmentForm from '../components/AppointmentForm' +import AppointmentForm from "../components/AppointmentForm"; +import "../scss/Header.scss"; +import { UserContext } from "../../context/UserContext"; -import '../scss/Header.scss' +const Header = () => { + const [toggleDrawer, setToggleDrawer] = useState(false); + const { isAuth, loggedUser } = useContext(UserContext); + const history = useHistory(); -const adminMenu = ( - - - - 1st menu item - - - - - 2nd menu item - - - - - 3rd menu item - - - - ); + const handleLogout = () => { + localStorage.removeItem("appointments_management_login_token"); -const Header = () => { - const [toggleDrawer, setToggleDrawer] = useState(false); + message.info({ + content: "Logged out with success", + duration: 3, + style: { + bottom: "30px", + right: "30px", + }, + }); + history.push("/"); + }; + + const adminMenu = ( + + Logout + + + 2nd menu item + + + + + 3rd menu item + + + + ); - const showDrawer = () => { - setToggleDrawer(true) - }; + const showDrawer = () => { + setToggleDrawer(true); + }; - const closeDrawer = () => { - setToggleDrawer(false) - }; + const closeDrawer = () => { + setToggleDrawer(false); + }; - return ( - - - - - + + + \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default AppointmentForm\r\n","C:\\Projects\\appoiments-mangement\\client\\src\\frontend\\components\\Slider.tsx",[],"C:\\Projects\\appoiments-mangement\\client\\src\\context\\UserContext.tsx",["41","42","43","44"],"C:\\Projects\\appoiments-mangement\\client\\src\\admin\\components\\Header.tsx",["45","46"],{"ruleId":"47","severity":1,"message":"48","line":3,"column":10,"nodeType":"49","messageId":"50","endLine":3,"endColumn":21},{"ruleId":"47","severity":1,"message":"51","line":5,"column":10,"nodeType":"49","messageId":"50","endLine":5,"endColumn":26},{"ruleId":"52","replacedBy":"53"},{"ruleId":"54","replacedBy":"55"},{"ruleId":"47","severity":1,"message":"56","line":1,"column":17,"nodeType":"49","messageId":"50","endLine":1,"endColumn":25},{"ruleId":"47","severity":1,"message":"57","line":2,"column":10,"nodeType":"49","messageId":"50","endLine":2,"endColumn":17},{"ruleId":"47","severity":1,"message":"58","line":20,"column":6,"nodeType":"49","messageId":"50","endLine":20,"endColumn":13},{"ruleId":"59","severity":1,"message":"60","line":27,"column":5,"nodeType":"61","endLine":27,"endColumn":7,"suggestions":"62"},{"ruleId":"47","severity":1,"message":"63","line":29,"column":8,"nodeType":"49","messageId":"50","endLine":29,"endColumn":16},{"ruleId":"47","severity":1,"message":"64","line":23,"column":10,"nodeType":"49","messageId":"50","endLine":23,"endColumn":16},{"ruleId":"47","severity":1,"message":"65","line":23,"column":18,"nodeType":"49","messageId":"50","endLine":23,"endColumn":28},"@typescript-eslint/no-unused-vars","'UserContext' is defined but never used.","Identifier","unusedVar","'CalendarOutlined' is defined but never used.","no-native-reassign",["66"],"no-negated-in-lhs",["67"],"'useState' is defined but never used.","'message' is defined but never used.","'history' is assigned a value but never used.","react-hooks/exhaustive-deps","React Hook useEffect has a missing dependency: 'isAuth'. Either include it or remove the dependency array.","ArrayExpression",["68"],"'isLogged' is assigned a value but never used.","'isAuth' is assigned a value but never used.","'loggedUser' is assigned a value but never used.","no-global-assign","no-unsafe-negation",{"desc":"69","fix":"70"},"Update the dependencies array to be: [isAuth]",{"range":"71","text":"72"},[634,636],"[isAuth]"] \ No newline at end of file +[{"D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\components\\Header.tsx":"1","D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\components\\Header.tsx":"2","D:\\Proiecte\\React\\appointments-management\\client\\src\\context\\UserContext.tsx":"3","D:\\Proiecte\\React\\appointments-management\\client\\src\\index.tsx":"4","D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\pages\\SignUp.tsx":"5","D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\pages\\Home.tsx":"6","D:\\Proiecte\\React\\appointments-management\\client\\src\\PrivateRoute.tsx":"7","D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\components\\AppointmentForm.tsx":"8","D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\pages\\SignIn.tsx":"9","D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\AdminLayout.tsx":"10","D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\components\\Slider.tsx":"11","D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\components\\Sidebar.tsx":"12","D:\\Proiecte\\React\\appointments-management\\client\\src\\NormalRoute.tsx":"13","D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\FontLayout.tsx":"14","D:\\Proiecte\\React\\appointments-management\\client\\src\\LoggedPrivateRoutes.tsx":"15","D:\\Proiecte\\React\\appointments-management\\client\\src\\reportWebVitals.ts":"16","D:\\Proiecte\\React\\appointments-management\\client\\src\\App.tsx":"17"},{"size":2479,"mtime":1607720881943,"results":"18","hashOfConfig":"19"},{"size":1422,"mtime":1607720942955,"results":"20","hashOfConfig":"19"},{"size":655,"mtime":1607721690338,"results":"21","hashOfConfig":"19"},{"size":494,"mtime":1607107903552,"results":"22","hashOfConfig":"19"},{"size":3731,"mtime":1607717410700,"results":"23","hashOfConfig":"19"},{"size":228,"mtime":1607107903550,"results":"24","hashOfConfig":"19"},{"size":589,"mtime":1607721365718,"results":"25","hashOfConfig":"19"},{"size":972,"mtime":1607160361242,"results":"26","hashOfConfig":"19"},{"size":3411,"mtime":1607721782039,"results":"27","hashOfConfig":"19"},{"size":869,"mtime":1607107903547,"results":"28","hashOfConfig":"19"},{"size":642,"mtime":1607107903550,"results":"29","hashOfConfig":"19"},{"size":2061,"mtime":1607108621533,"results":"30","hashOfConfig":"19"},{"size":294,"mtime":1607721458393,"results":"31","hashOfConfig":"19"},{"size":284,"mtime":1607107903549,"results":"32","hashOfConfig":"19"},{"size":551,"mtime":1607721593324,"results":"33","hashOfConfig":"19"},{"size":440,"mtime":1607107903553,"results":"34","hashOfConfig":"19"},{"size":1452,"mtime":1607719169347,"results":"35","hashOfConfig":"19"},{"filePath":"36","messages":"37","errorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},"12pxieb",{"filePath":"38","messages":"39","errorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"40","messages":"41","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"42","messages":"43","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"44"},{"filePath":"45","messages":"46","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"47"},{"filePath":"48","messages":"49","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"44"},{"filePath":"50","messages":"51","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"52","messages":"53","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"54"},{"filePath":"55","messages":"56","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"57","messages":"58","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"59","messages":"60","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"44"},{"filePath":"61","messages":"62","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"63","messages":"64","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"65","messages":"66","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"67","messages":"68","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"69","messages":"70","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"71","messages":"72","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"73"},"D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\components\\Header.tsx",["74","75"],"D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\components\\Header.tsx",["76","77"],"D:\\Proiecte\\React\\appointments-management\\client\\src\\context\\UserContext.tsx",["78"],"D:\\Proiecte\\React\\appointments-management\\client\\src\\index.tsx",[],["79","80"],"D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\pages\\SignUp.tsx",["81"],"import React, { useState } from \"react\";\r\nimport axios from \"axios\";\r\nimport { Row, Col, Form, Input, Button, Checkbox, Select, message } from \"antd\";\r\nimport { Link, useHistory } from 'react-router-dom'\r\n\r\n\r\nimport \"../scss/SignUp.scss\";\r\n\r\nconst { Option } = Select;\r\n\r\nconst SignUp = () => {\r\n\tconst [username, setUsername] = useState(\"\");\r\n\tconst [password, setPassword] = useState(\"\");\r\n\tconst [email, setEmail] = useState(\"\");\r\n\tconst [role, setRole] = useState(\"\");\r\n\tconst history = useHistory()\r\n\r\n\tconst handleRole = value => {\r\n\t\tsetRole(value);\r\n\t};\r\n\r\n\tconst createAccount = async () => {\r\n\t\ttry {\r\n\t\t\tconst result = await axios({\r\n\t\t\t\tmethod: \"POST\",\r\n\t\t\t\turl: \"http://localhost:4000/auth/signup\",\r\n\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\r\n\t\t\t\tdata: { username, email, role, password },\r\n });\r\n setUsername('')\r\n setEmail('')\r\n setRole('')\r\n\t\t\tsetPassword('')\r\n\t\t\thistory.push('/sign-in')\r\n\t\t\tmessage.success({\r\n content: 'Account created with success',\r\n duration: 3,\r\n style: {\r\n bottom: '30px',\r\n right: '30px'\r\n },\r\n });\r\n\t\t} catch (error) {\r\n\t\t\tconsole.log(error.response.data.message);\r\n }\r\n\t};\r\n\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\r\n\t\t\t\r\n\t\t\t\t

Create new account

\r\n\t\t\t\t

\r\n\t\t\t\t\tAdd your informations below and create a new acccount in 10\r\n\t\t\t\t\tseconds.\r\n\t\t\t\t

\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t setUsername(e.target.value)}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t setEmail(e.target.value)}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t setPassword(e.target.value)}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tRemember me\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n Already have an account? \r\n \r\n\t\t\t\r\n\r\n\t\t\t\r\n\t\t
\r\n\t);\r\n};\r\n\r\nexport default SignUp;\r\n","D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\pages\\Home.tsx",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\PrivateRoute.tsx",["82"],"D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\components\\AppointmentForm.tsx",["83"],"import React, { useState } from 'react';\r\nimport {\r\n Form,\r\n Input,\r\n Button,\r\n DatePicker,\r\n Space\r\n} from 'antd';\r\n\r\nconst AppointmentForm = ({ closeDrawer }) => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default AppointmentForm\r\n","D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\pages\\SignIn.tsx",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\AdminLayout.tsx",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\components\\Slider.tsx",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\components\\Sidebar.tsx",["84"],"D:\\Proiecte\\React\\appointments-management\\client\\src\\NormalRoute.tsx",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\FontLayout.tsx",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\LoggedPrivateRoutes.tsx",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\reportWebVitals.ts",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\App.tsx",["85"],"import React, { FC } from 'react';\r\nimport { BrowserRouter as Router, Switch, Route } from 'react-router-dom'\r\n\r\nimport './App.scss'\r\n\r\n//Routes\r\nimport PrivateRoute from './PrivateRoute'\r\nimport NormalRoute from './NormalRoute'\r\nimport LoggedPrivateRoute from './LoggedPrivateRoutes'\r\n\r\n//Front pages\r\nimport SignUp from './frontend/pages/SignUp'\r\nimport Home from './frontend/pages/Home'\r\nimport SignIn from './frontend/pages/SignIn'\r\n\r\n//Dashboard pages\r\nimport Dashboard from './admin/pages/Dashboard'\r\nimport Appointments from './admin/pages/Appointments'\r\n\r\n//Layout\r\nimport FrontLayout from './frontend/FontLayout'\r\nimport AdminLayout from './admin/AdminLayout'\r\n\r\n\r\n//Context\r\nimport { UserProvider } from './context/UserContext'\r\n\r\n\r\nconst App: FC = () => {\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n );\r\n}\r\n\r\nexport default App;\r\n",{"ruleId":"86","severity":1,"message":"87","line":1,"column":39,"nodeType":"88","messageId":"89","endLine":1,"endColumn":48},{"ruleId":"86","severity":1,"message":"90","line":25,"column":9,"nodeType":"88","messageId":"89","endLine":25,"endColumn":19},{"ruleId":"86","severity":1,"message":"87","line":1,"column":29,"nodeType":"88","messageId":"89","endLine":1,"endColumn":38},{"ruleId":"86","severity":1,"message":"91","line":5,"column":35,"nodeType":"88","messageId":"89","endLine":5,"endColumn":42},{"ruleId":"92","severity":1,"message":"93","line":23,"column":5,"nodeType":"94","endLine":23,"endColumn":20,"suggestions":"95"},{"ruleId":"96","replacedBy":"97"},{"ruleId":"98","replacedBy":"99"},{"ruleId":"86","severity":1,"message":"100","line":24,"column":10,"nodeType":"88","messageId":"89","endLine":24,"endColumn":16},{"ruleId":"86","severity":1,"message":"90","line":10,"column":12,"nodeType":"88","messageId":"89","endLine":10,"endColumn":22},{"ruleId":"86","severity":1,"message":"101","line":1,"column":17,"nodeType":"88","messageId":"89","endLine":1,"endColumn":25},{"ruleId":"86","severity":1,"message":"101","line":1,"column":17,"nodeType":"88","messageId":"89","endLine":1,"endColumn":25},{"ruleId":"86","severity":1,"message":"102","line":2,"column":43,"nodeType":"88","messageId":"89","endLine":2,"endColumn":48},"@typescript-eslint/no-unused-vars","'useEffect' is defined but never used.","Identifier","unusedVar","'loggedUser' is assigned a value but never used.","'message' is defined but never used.","react-hooks/exhaustive-deps","React Hook useEffect has a missing dependency: 'isAuth'. Either include it or remove the dependency array.","ArrayExpression",["103"],"no-native-reassign",["104"],"no-negated-in-lhs",["105"],"'result' is assigned a value but never used.","'useState' is defined but never used.","'Route' is defined but never used.",{"desc":"106","fix":"107"},"no-global-assign","no-unsafe-negation","Update the dependencies array to be: [isAuth, setLoggedUser]",{"range":"108","text":"109"},[474,489],"[isAuth, setLoggedUser]"] \ No newline at end of file diff --git a/client/debug.log b/client/debug.log index fc57ff3..c858c2e 100644 --- a/client/debug.log +++ b/client/debug.log @@ -2,3 +2,4 @@ [1130/232520.008:ERROR:directory_reader_win.cc(43)] FindFirstFile: The system cannot find the path specified. (0x3) [1201/201921.277:ERROR:directory_reader_win.cc(43)] FindFirstFile: The system cannot find the path specified. (0x3) [1206/153751.263:ERROR:directory_reader_win.cc(43)] FindFirstFile: The system cannot find the path specified. (0x3) +[1211/204950.867:ERROR:directory_reader_win.cc(43)] FindFirstFile: The system cannot find the path specified. (0x3) diff --git a/client/src/App.tsx b/client/src/App.tsx index 5b7cb27..1531477 100644 --- a/client/src/App.tsx +++ b/client/src/App.tsx @@ -6,6 +6,7 @@ import './App.scss' //Routes import PrivateRoute from './PrivateRoute' import NormalRoute from './NormalRoute' +import LoggedPrivateRoute from './LoggedPrivateRoutes' //Front pages import SignUp from './frontend/pages/SignUp' @@ -32,8 +33,8 @@ const App: FC = () => { - - + + diff --git a/client/src/LoggedPrivateRoutes.tsx b/client/src/LoggedPrivateRoutes.tsx new file mode 100644 index 0000000..0e3c0bb --- /dev/null +++ b/client/src/LoggedPrivateRoutes.tsx @@ -0,0 +1,18 @@ +import React, { useContext } from 'react' +import { Route, Redirect } from "react-router-dom" +import { UserContext } from './context/UserContext'; + + +const LoggedPrivateRoutes = ({ component: Component, layout: Layout, ...rest }) => { + const {loggedUser } = useContext(UserContext); + + return ( + ( + !loggedUser + ? + : + )} /> + ) +} + +export default LoggedPrivateRoutes diff --git a/client/src/NormalRoute.tsx b/client/src/NormalRoute.tsx index e13e66b..bd6a794 100644 --- a/client/src/NormalRoute.tsx +++ b/client/src/NormalRoute.tsx @@ -2,6 +2,7 @@ import React from 'react' import { Route } from "react-router-dom"; const NormalRoute = ({ component: Component, layout: Layout, ...rest }) => ( + ( )} /> diff --git a/client/src/PrivateRoute.tsx b/client/src/PrivateRoute.tsx index b5b0517..25e6c28 100644 --- a/client/src/PrivateRoute.tsx +++ b/client/src/PrivateRoute.tsx @@ -1,15 +1,21 @@ -import React from 'react'; +import React, { useContext } from 'react'; import { Route, Redirect } from "react-router-dom"; +import { UserContext } from './context/UserContext'; + const isAuth = localStorage.getItem('appointments_management_login_token') -const PrivateRoute = ({ component: Component, layout: Layout, ...rest }) => ( +const PrivateRoute = ({ component: Component, layout: Layout, ...rest }) => { + const {loggedUser } = useContext(UserContext); + + return ( ( isAuth ? : )} /> -) + ) +} export default PrivateRoute; \ No newline at end of file diff --git a/client/src/admin/components/Header.tsx b/client/src/admin/components/Header.tsx index 2e719d1..5ccb14b 100644 --- a/client/src/admin/components/Header.tsx +++ b/client/src/admin/components/Header.tsx @@ -1,4 +1,4 @@ -import React, { useContext, useState } from "react"; +import React, { useContext, useState, useEffect } from "react"; import { Row, Col, @@ -8,24 +8,30 @@ import { Menu, Drawer, Button, - message, + message } from "antd"; import { UserOutlined, PlusOutlined } from "@ant-design/icons"; -import { useHistory } from "react-router-dom"; +import { useHistory } from 'react-router-dom' import AppointmentForm from "../components/AppointmentForm"; import "../scss/Header.scss"; import { UserContext } from "../../context/UserContext"; + const Header = () => { const [toggleDrawer, setToggleDrawer] = useState(false); - const { isAuth, loggedUser } = useContext(UserContext); - const history = useHistory(); + let history = useHistory(); + const {loggedUser, setLoggedUser } = useContext(UserContext); + + + const handleLogout = () => { localStorage.removeItem("appointments_management_login_token"); + setLoggedUser(false) + message.info({ content: "Logged out with success", duration: 3, @@ -33,9 +39,11 @@ const Header = () => { bottom: "30px", right: "30px", }, - }); + }); history.push("/"); }; + + const adminMenu = ( diff --git a/client/src/context/UserContext.tsx b/client/src/context/UserContext.tsx index 7806bbf..c1a110a 100644 --- a/client/src/context/UserContext.tsx +++ b/client/src/context/UserContext.tsx @@ -1,39 +1,33 @@ import React, { createContext, useState, useEffect } from "react"; -import { message } from "antd"; -import { useHistory } from "react-router-dom"; -type Context = { - isAuth: string | null; - loggedUser: boolean; -}; -export const UserContext = createContext({ - isAuth: "", - loggedUser: false, +export type User = { + loggedUser: boolean, + setLoggedUser?: any +}; + +export const UserContext = createContext({ + loggedUser: false }); -export const UserProvider = props => { - const isAuth: string | null = JSON.stringify( - localStorage.getItem("appointments_management_login_token") - ); - let history = useHistory(); +export const UserProvider = props => { + const isAuth = localStorage.getItem("appointments_management_login_token") + const [loggedUser, setLoggedUser] = useState(false); useEffect(() => { - if (isAuth) { - setLoggedUser(true); + if(isAuth) { + setLoggedUser(true) } - }, []); + }, [setLoggedUser]) - const isLogged = { - isAuth: isAuth, - loggedUser: loggedUser, - }; + const value = { loggedUser, setLoggedUser} return ( - + {props.children} ); }; + diff --git a/client/src/frontend/components/Header.tsx b/client/src/frontend/components/Header.tsx index 27abdf1..22eb122 100644 --- a/client/src/frontend/components/Header.tsx +++ b/client/src/frontend/components/Header.tsx @@ -1,5 +1,5 @@ -import React, { useContext, useState, useEffect } from 'react' -import { Link, useHistory } from 'react-router-dom' +import React, { useContext, useEffect } from 'react' +import { Link } from 'react-router-dom' import { UserContext } from '../../context/UserContext' import { Row, Col, Button, Space, message } from 'antd'; @@ -9,8 +9,7 @@ import { PlusOutlined, LoginOutlined, RightOutlined } from '@ant-design/icons'; import '../scss/Header.scss' const Header = () => { - const isAuth = useContext(UserContext) - + const { loggedUser } = useContext(UserContext) return (
@@ -20,7 +19,8 @@ const Header = () => {
- { isAuth ? + + { loggedUser ? : <> diff --git a/client/src/frontend/pages/SignIn.tsx b/client/src/frontend/pages/SignIn.tsx index 26e9594..34bf8fe 100644 --- a/client/src/frontend/pages/SignIn.tsx +++ b/client/src/frontend/pages/SignIn.tsx @@ -1,15 +1,17 @@ -import React, { useState } from 'react' +import React, { useState, useContext } from 'react' import axios from 'axios' import{Row, Col, Button, Form, Input, message } from 'antd' -import { Link } from 'react-router-dom' +import { Link, useHistory } from 'react-router-dom' import '../scss/SignIn.scss' +import { UserContext } from '../../context/UserContext' -const SignIn = ({ history }) => { +const SignIn = () => { const [password, setPassword] = useState('') const [email, setEmail] = useState('') - + const history = useHistory() + const { setLoggedUser } = useContext(UserContext); const handleLogin = async () => { try { @@ -22,6 +24,7 @@ const SignIn = ({ history }) => { const loginToken = result.data.accessToken localStorage.setItem('appointments_management_login_token', loginToken) + setLoggedUser(true) history.push('/dashboard') message.success({ content: 'Login with success', @@ -32,7 +35,14 @@ const SignIn = ({ history }) => { }, }); } catch (error) { - console.log(error.response.data.message) + message.error({ + content: 'Wrong email or password', + duration: 2, + style: { + bottom: '30px', + right: '30px' + }, + }); } } diff --git a/client/src/frontend/pages/SignUp.tsx b/client/src/frontend/pages/SignUp.tsx index 3f282c7..17605fd 100644 --- a/client/src/frontend/pages/SignUp.tsx +++ b/client/src/frontend/pages/SignUp.tsx @@ -1,6 +1,8 @@ import React, { useState } from "react"; import axios from "axios"; -import { Row, Col, Form, Input, Button, Checkbox, Select } from "antd"; +import { Row, Col, Form, Input, Button, Checkbox, Select, message } from "antd"; +import { Link, useHistory } from 'react-router-dom' + import "../scss/SignUp.scss"; @@ -11,6 +13,7 @@ const SignUp = () => { const [password, setPassword] = useState(""); const [email, setEmail] = useState(""); const [role, setRole] = useState(""); + const history = useHistory() const handleRole = value => { setRole(value); @@ -28,6 +31,15 @@ const SignUp = () => { setEmail('') setRole('') setPassword('') + history.push('/sign-in') + message.success({ + content: 'Account created with success', + duration: 3, + style: { + bottom: '30px', + right: '30px' + }, + }); } catch (error) { console.log(error.response.data.message); } @@ -126,6 +138,9 @@ const SignUp = () => { + + Already have an account? + Date: Sun, 13 Dec 2020 19:27:30 +0200 Subject: [PATCH 4/4] deleted isAuth variable any type --- client/.eslintcache | 2 +- client/debug.log | 1 + client/src/admin/pages/Appointments.tsx | 2 +- client/src/frontend/pages/SignIn.tsx | 5 +++-- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/client/.eslintcache b/client/.eslintcache index b79f445..1a9b290 100644 --- a/client/.eslintcache +++ b/client/.eslintcache @@ -1 +1 @@ -[{"D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\components\\Header.tsx":"1","D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\components\\Header.tsx":"2","D:\\Proiecte\\React\\appointments-management\\client\\src\\context\\UserContext.tsx":"3","D:\\Proiecte\\React\\appointments-management\\client\\src\\index.tsx":"4","D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\pages\\SignUp.tsx":"5","D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\pages\\Home.tsx":"6","D:\\Proiecte\\React\\appointments-management\\client\\src\\PrivateRoute.tsx":"7","D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\components\\AppointmentForm.tsx":"8","D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\pages\\SignIn.tsx":"9","D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\AdminLayout.tsx":"10","D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\components\\Slider.tsx":"11","D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\components\\Sidebar.tsx":"12","D:\\Proiecte\\React\\appointments-management\\client\\src\\NormalRoute.tsx":"13","D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\FontLayout.tsx":"14","D:\\Proiecte\\React\\appointments-management\\client\\src\\LoggedPrivateRoutes.tsx":"15","D:\\Proiecte\\React\\appointments-management\\client\\src\\reportWebVitals.ts":"16","D:\\Proiecte\\React\\appointments-management\\client\\src\\App.tsx":"17"},{"size":2479,"mtime":1607720881943,"results":"18","hashOfConfig":"19"},{"size":1422,"mtime":1607720942955,"results":"20","hashOfConfig":"19"},{"size":655,"mtime":1607721690338,"results":"21","hashOfConfig":"19"},{"size":494,"mtime":1607107903552,"results":"22","hashOfConfig":"19"},{"size":3731,"mtime":1607717410700,"results":"23","hashOfConfig":"19"},{"size":228,"mtime":1607107903550,"results":"24","hashOfConfig":"19"},{"size":589,"mtime":1607721365718,"results":"25","hashOfConfig":"19"},{"size":972,"mtime":1607160361242,"results":"26","hashOfConfig":"19"},{"size":3411,"mtime":1607721782039,"results":"27","hashOfConfig":"19"},{"size":869,"mtime":1607107903547,"results":"28","hashOfConfig":"19"},{"size":642,"mtime":1607107903550,"results":"29","hashOfConfig":"19"},{"size":2061,"mtime":1607108621533,"results":"30","hashOfConfig":"19"},{"size":294,"mtime":1607721458393,"results":"31","hashOfConfig":"19"},{"size":284,"mtime":1607107903549,"results":"32","hashOfConfig":"19"},{"size":551,"mtime":1607721593324,"results":"33","hashOfConfig":"19"},{"size":440,"mtime":1607107903553,"results":"34","hashOfConfig":"19"},{"size":1452,"mtime":1607719169347,"results":"35","hashOfConfig":"19"},{"filePath":"36","messages":"37","errorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},"12pxieb",{"filePath":"38","messages":"39","errorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"40","messages":"41","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"42","messages":"43","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"44"},{"filePath":"45","messages":"46","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"47"},{"filePath":"48","messages":"49","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"44"},{"filePath":"50","messages":"51","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"52","messages":"53","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"54"},{"filePath":"55","messages":"56","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"57","messages":"58","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"59","messages":"60","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"44"},{"filePath":"61","messages":"62","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"63","messages":"64","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"65","messages":"66","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"67","messages":"68","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"69","messages":"70","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"71","messages":"72","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"73"},"D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\components\\Header.tsx",["74","75"],"D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\components\\Header.tsx",["76","77"],"D:\\Proiecte\\React\\appointments-management\\client\\src\\context\\UserContext.tsx",["78"],"D:\\Proiecte\\React\\appointments-management\\client\\src\\index.tsx",[],["79","80"],"D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\pages\\SignUp.tsx",["81"],"import React, { useState } from \"react\";\r\nimport axios from \"axios\";\r\nimport { Row, Col, Form, Input, Button, Checkbox, Select, message } from \"antd\";\r\nimport { Link, useHistory } from 'react-router-dom'\r\n\r\n\r\nimport \"../scss/SignUp.scss\";\r\n\r\nconst { Option } = Select;\r\n\r\nconst SignUp = () => {\r\n\tconst [username, setUsername] = useState(\"\");\r\n\tconst [password, setPassword] = useState(\"\");\r\n\tconst [email, setEmail] = useState(\"\");\r\n\tconst [role, setRole] = useState(\"\");\r\n\tconst history = useHistory()\r\n\r\n\tconst handleRole = value => {\r\n\t\tsetRole(value);\r\n\t};\r\n\r\n\tconst createAccount = async () => {\r\n\t\ttry {\r\n\t\t\tconst result = await axios({\r\n\t\t\t\tmethod: \"POST\",\r\n\t\t\t\turl: \"http://localhost:4000/auth/signup\",\r\n\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\r\n\t\t\t\tdata: { username, email, role, password },\r\n });\r\n setUsername('')\r\n setEmail('')\r\n setRole('')\r\n\t\t\tsetPassword('')\r\n\t\t\thistory.push('/sign-in')\r\n\t\t\tmessage.success({\r\n content: 'Account created with success',\r\n duration: 3,\r\n style: {\r\n bottom: '30px',\r\n right: '30px'\r\n },\r\n });\r\n\t\t} catch (error) {\r\n\t\t\tconsole.log(error.response.data.message);\r\n }\r\n\t};\r\n\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\r\n\t\t\t\r\n\t\t\t\t

Create new account

\r\n\t\t\t\t

\r\n\t\t\t\t\tAdd your informations below and create a new acccount in 10\r\n\t\t\t\t\tseconds.\r\n\t\t\t\t

\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t setUsername(e.target.value)}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t setEmail(e.target.value)}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t setPassword(e.target.value)}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tRemember me\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n Already have an account? \r\n \r\n\t\t\t\r\n\r\n\t\t\t\r\n\t\t
\r\n\t);\r\n};\r\n\r\nexport default SignUp;\r\n","D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\pages\\Home.tsx",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\PrivateRoute.tsx",["82"],"D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\components\\AppointmentForm.tsx",["83"],"import React, { useState } from 'react';\r\nimport {\r\n Form,\r\n Input,\r\n Button,\r\n DatePicker,\r\n Space\r\n} from 'antd';\r\n\r\nconst AppointmentForm = ({ closeDrawer }) => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default AppointmentForm\r\n","D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\pages\\SignIn.tsx",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\AdminLayout.tsx",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\components\\Slider.tsx",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\components\\Sidebar.tsx",["84"],"D:\\Proiecte\\React\\appointments-management\\client\\src\\NormalRoute.tsx",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\FontLayout.tsx",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\LoggedPrivateRoutes.tsx",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\reportWebVitals.ts",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\App.tsx",["85"],"import React, { FC } from 'react';\r\nimport { BrowserRouter as Router, Switch, Route } from 'react-router-dom'\r\n\r\nimport './App.scss'\r\n\r\n//Routes\r\nimport PrivateRoute from './PrivateRoute'\r\nimport NormalRoute from './NormalRoute'\r\nimport LoggedPrivateRoute from './LoggedPrivateRoutes'\r\n\r\n//Front pages\r\nimport SignUp from './frontend/pages/SignUp'\r\nimport Home from './frontend/pages/Home'\r\nimport SignIn from './frontend/pages/SignIn'\r\n\r\n//Dashboard pages\r\nimport Dashboard from './admin/pages/Dashboard'\r\nimport Appointments from './admin/pages/Appointments'\r\n\r\n//Layout\r\nimport FrontLayout from './frontend/FontLayout'\r\nimport AdminLayout from './admin/AdminLayout'\r\n\r\n\r\n//Context\r\nimport { UserProvider } from './context/UserContext'\r\n\r\n\r\nconst App: FC = () => {\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n );\r\n}\r\n\r\nexport default App;\r\n",{"ruleId":"86","severity":1,"message":"87","line":1,"column":39,"nodeType":"88","messageId":"89","endLine":1,"endColumn":48},{"ruleId":"86","severity":1,"message":"90","line":25,"column":9,"nodeType":"88","messageId":"89","endLine":25,"endColumn":19},{"ruleId":"86","severity":1,"message":"87","line":1,"column":29,"nodeType":"88","messageId":"89","endLine":1,"endColumn":38},{"ruleId":"86","severity":1,"message":"91","line":5,"column":35,"nodeType":"88","messageId":"89","endLine":5,"endColumn":42},{"ruleId":"92","severity":1,"message":"93","line":23,"column":5,"nodeType":"94","endLine":23,"endColumn":20,"suggestions":"95"},{"ruleId":"96","replacedBy":"97"},{"ruleId":"98","replacedBy":"99"},{"ruleId":"86","severity":1,"message":"100","line":24,"column":10,"nodeType":"88","messageId":"89","endLine":24,"endColumn":16},{"ruleId":"86","severity":1,"message":"90","line":10,"column":12,"nodeType":"88","messageId":"89","endLine":10,"endColumn":22},{"ruleId":"86","severity":1,"message":"101","line":1,"column":17,"nodeType":"88","messageId":"89","endLine":1,"endColumn":25},{"ruleId":"86","severity":1,"message":"101","line":1,"column":17,"nodeType":"88","messageId":"89","endLine":1,"endColumn":25},{"ruleId":"86","severity":1,"message":"102","line":2,"column":43,"nodeType":"88","messageId":"89","endLine":2,"endColumn":48},"@typescript-eslint/no-unused-vars","'useEffect' is defined but never used.","Identifier","unusedVar","'loggedUser' is assigned a value but never used.","'message' is defined but never used.","react-hooks/exhaustive-deps","React Hook useEffect has a missing dependency: 'isAuth'. Either include it or remove the dependency array.","ArrayExpression",["103"],"no-native-reassign",["104"],"no-negated-in-lhs",["105"],"'result' is assigned a value but never used.","'useState' is defined but never used.","'Route' is defined but never used.",{"desc":"106","fix":"107"},"no-global-assign","no-unsafe-negation","Update the dependencies array to be: [isAuth, setLoggedUser]",{"range":"108","text":"109"},[474,489],"[isAuth, setLoggedUser]"] \ No newline at end of file +[{"D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\components\\Header.tsx":"1","D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\components\\Header.tsx":"2","D:\\Proiecte\\React\\appointments-management\\client\\src\\context\\UserContext.tsx":"3","D:\\Proiecte\\React\\appointments-management\\client\\src\\index.tsx":"4","D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\pages\\SignUp.tsx":"5","D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\pages\\Home.tsx":"6","D:\\Proiecte\\React\\appointments-management\\client\\src\\PrivateRoute.tsx":"7","D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\components\\AppointmentForm.tsx":"8","D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\pages\\SignIn.tsx":"9","D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\AdminLayout.tsx":"10","D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\components\\Slider.tsx":"11","D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\components\\Sidebar.tsx":"12","D:\\Proiecte\\React\\appointments-management\\client\\src\\NormalRoute.tsx":"13","D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\FontLayout.tsx":"14","D:\\Proiecte\\React\\appointments-management\\client\\src\\LoggedPrivateRoutes.tsx":"15","D:\\Proiecte\\React\\appointments-management\\client\\src\\reportWebVitals.ts":"16","D:\\Proiecte\\React\\appointments-management\\client\\src\\App.tsx":"17","D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\pages\\Appointments.tsx":"18"},{"size":2479,"mtime":1607720881943,"results":"19","hashOfConfig":"20"},{"size":1422,"mtime":1607720942955,"results":"21","hashOfConfig":"20"},{"size":655,"mtime":1607880256663,"results":"22","hashOfConfig":"20"},{"size":494,"mtime":1607107903552,"results":"23","hashOfConfig":"20"},{"size":3731,"mtime":1607717410700,"results":"24","hashOfConfig":"20"},{"size":228,"mtime":1607107903550,"results":"25","hashOfConfig":"20"},{"size":589,"mtime":1607721365718,"results":"26","hashOfConfig":"20"},{"size":972,"mtime":1607160361242,"results":"27","hashOfConfig":"20"},{"size":3477,"mtime":1607778975279,"results":"28","hashOfConfig":"20"},{"size":869,"mtime":1607107903547,"results":"29","hashOfConfig":"20"},{"size":642,"mtime":1607107903550,"results":"30","hashOfConfig":"20"},{"size":2061,"mtime":1607108621533,"results":"31","hashOfConfig":"20"},{"size":294,"mtime":1607721458393,"results":"32","hashOfConfig":"20"},{"size":284,"mtime":1607107903549,"results":"33","hashOfConfig":"20"},{"size":551,"mtime":1607721593324,"results":"34","hashOfConfig":"20"},{"size":440,"mtime":1607107903553,"results":"35","hashOfConfig":"20"},{"size":1452,"mtime":1607719169347,"results":"36","hashOfConfig":"20"},{"size":5698,"mtime":1607880113676,"results":"37","hashOfConfig":"20"},{"filePath":"38","messages":"39","errorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},"12pxieb",{"filePath":"40","messages":"41","errorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"42","messages":"43","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"44","messages":"45","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"46"},{"filePath":"47","messages":"48","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"49"},{"filePath":"50","messages":"51","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"46"},{"filePath":"52","messages":"53","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"54","messages":"55","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"56"},{"filePath":"57","messages":"58","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"59","messages":"60","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"61","messages":"62","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"46"},{"filePath":"63","messages":"64","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"65","messages":"66","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"67","messages":"68","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"69","messages":"70","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"71"},{"filePath":"72","messages":"73","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"74","messages":"75","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"76"},{"filePath":"77","messages":"78","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},"D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\components\\Header.tsx",["79","80"],"D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\components\\Header.tsx",["81","82"],"D:\\Proiecte\\React\\appointments-management\\client\\src\\context\\UserContext.tsx",["83"],"D:\\Proiecte\\React\\appointments-management\\client\\src\\index.tsx",[],["84","85"],"D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\pages\\SignUp.tsx",["86"],"import React, { useState } from \"react\";\r\nimport axios from \"axios\";\r\nimport { Row, Col, Form, Input, Button, Checkbox, Select, message } from \"antd\";\r\nimport { Link, useHistory } from 'react-router-dom'\r\n\r\n\r\nimport \"../scss/SignUp.scss\";\r\n\r\nconst { Option } = Select;\r\n\r\nconst SignUp = () => {\r\n\tconst [username, setUsername] = useState(\"\");\r\n\tconst [password, setPassword] = useState(\"\");\r\n\tconst [email, setEmail] = useState(\"\");\r\n\tconst [role, setRole] = useState(\"\");\r\n\tconst history = useHistory()\r\n\r\n\tconst handleRole = value => {\r\n\t\tsetRole(value);\r\n\t};\r\n\r\n\tconst createAccount = async () => {\r\n\t\ttry {\r\n\t\t\tconst result = await axios({\r\n\t\t\t\tmethod: \"POST\",\r\n\t\t\t\turl: \"http://localhost:4000/auth/signup\",\r\n\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\r\n\t\t\t\tdata: { username, email, role, password },\r\n });\r\n setUsername('')\r\n setEmail('')\r\n setRole('')\r\n\t\t\tsetPassword('')\r\n\t\t\thistory.push('/sign-in')\r\n\t\t\tmessage.success({\r\n content: 'Account created with success',\r\n duration: 3,\r\n style: {\r\n bottom: '30px',\r\n right: '30px'\r\n },\r\n });\r\n\t\t} catch (error) {\r\n\t\t\tconsole.log(error.response.data.message);\r\n }\r\n\t};\r\n\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\r\n\t\t\t\r\n\t\t\t\t

Create new account

\r\n\t\t\t\t

\r\n\t\t\t\t\tAdd your informations below and create a new acccount in 10\r\n\t\t\t\t\tseconds.\r\n\t\t\t\t

\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t setUsername(e.target.value)}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t setEmail(e.target.value)}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t setPassword(e.target.value)}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tRemember me\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n Already have an account? \r\n \r\n\t\t\t\r\n\r\n\t\t\t\r\n\t\t
\r\n\t);\r\n};\r\n\r\nexport default SignUp;\r\n","D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\pages\\Home.tsx",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\PrivateRoute.tsx",["87"],"D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\components\\AppointmentForm.tsx",["88"],"import React, { useState } from 'react';\r\nimport {\r\n Form,\r\n Input,\r\n Button,\r\n DatePicker,\r\n Space\r\n} from 'antd';\r\n\r\nconst AppointmentForm = ({ closeDrawer }) => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default AppointmentForm\r\n","D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\pages\\SignIn.tsx",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\AdminLayout.tsx",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\components\\Slider.tsx",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\components\\Sidebar.tsx",["89"],"D:\\Proiecte\\React\\appointments-management\\client\\src\\NormalRoute.tsx",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\frontend\\FontLayout.tsx",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\LoggedPrivateRoutes.tsx",[],["90","91"],"D:\\Proiecte\\React\\appointments-management\\client\\src\\reportWebVitals.ts",[],"D:\\Proiecte\\React\\appointments-management\\client\\src\\App.tsx",["92"],"import React, { FC } from 'react';\r\nimport { BrowserRouter as Router, Switch, Route } from 'react-router-dom'\r\n\r\nimport './App.scss'\r\n\r\n//Routes\r\nimport PrivateRoute from './PrivateRoute'\r\nimport NormalRoute from './NormalRoute'\r\nimport LoggedPrivateRoute from './LoggedPrivateRoutes'\r\n\r\n//Front pages\r\nimport SignUp from './frontend/pages/SignUp'\r\nimport Home from './frontend/pages/Home'\r\nimport SignIn from './frontend/pages/SignIn'\r\n\r\n//Dashboard pages\r\nimport Dashboard from './admin/pages/Dashboard'\r\nimport Appointments from './admin/pages/Appointments'\r\n\r\n//Layout\r\nimport FrontLayout from './frontend/FontLayout'\r\nimport AdminLayout from './admin/AdminLayout'\r\n\r\n\r\n//Context\r\nimport { UserProvider } from './context/UserContext'\r\n\r\n\r\nconst App: FC = () => {\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n );\r\n}\r\n\r\nexport default App;\r\n","D:\\Proiecte\\React\\appointments-management\\client\\src\\admin\\pages\\Appointments.tsx",["93"],{"ruleId":"94","severity":1,"message":"95","line":1,"column":39,"nodeType":"96","messageId":"97","endLine":1,"endColumn":48},{"ruleId":"94","severity":1,"message":"98","line":25,"column":9,"nodeType":"96","messageId":"97","endLine":25,"endColumn":19},{"ruleId":"94","severity":1,"message":"95","line":1,"column":29,"nodeType":"96","messageId":"97","endLine":1,"endColumn":38},{"ruleId":"94","severity":1,"message":"99","line":5,"column":35,"nodeType":"96","messageId":"97","endLine":5,"endColumn":42},{"ruleId":"100","severity":1,"message":"101","line":23,"column":5,"nodeType":"102","endLine":23,"endColumn":20,"suggestions":"103"},{"ruleId":"104","replacedBy":"105"},{"ruleId":"106","replacedBy":"107"},{"ruleId":"94","severity":1,"message":"108","line":24,"column":10,"nodeType":"96","messageId":"97","endLine":24,"endColumn":16},{"ruleId":"94","severity":1,"message":"98","line":10,"column":12,"nodeType":"96","messageId":"97","endLine":10,"endColumn":22},{"ruleId":"94","severity":1,"message":"109","line":1,"column":17,"nodeType":"96","messageId":"97","endLine":1,"endColumn":25},{"ruleId":"94","severity":1,"message":"109","line":1,"column":17,"nodeType":"96","messageId":"97","endLine":1,"endColumn":25},{"ruleId":"104","replacedBy":"110"},{"ruleId":"106","replacedBy":"111"},{"ruleId":"94","severity":1,"message":"112","line":2,"column":43,"nodeType":"96","messageId":"97","endLine":2,"endColumn":48},{"ruleId":"94","severity":1,"message":"113","line":97,"column":12,"nodeType":"96","messageId":"97","endLine":97,"endColumn":23},"@typescript-eslint/no-unused-vars","'useEffect' is defined but never used.","Identifier","unusedVar","'loggedUser' is assigned a value but never used.","'message' is defined but never used.","react-hooks/exhaustive-deps","React Hook useEffect has a missing dependency: 'isAuth'. Either include it or remove the dependency array.","ArrayExpression",["114"],"no-native-reassign",["115"],"no-negated-in-lhs",["116"],"'result' is assigned a value but never used.","'useState' is defined but never used.",["115"],["116"],"'Route' is defined but never used.","'searchInput' is assigned a value but never used.",{"desc":"117","fix":"118"},"no-global-assign","no-unsafe-negation","Update the dependencies array to be: [isAuth, setLoggedUser]",{"range":"119","text":"120"},[474,489],"[isAuth, setLoggedUser]"] \ No newline at end of file diff --git a/client/debug.log b/client/debug.log index c858c2e..71ef32a 100644 --- a/client/debug.log +++ b/client/debug.log @@ -3,3 +3,4 @@ [1201/201921.277:ERROR:directory_reader_win.cc(43)] FindFirstFile: The system cannot find the path specified. (0x3) [1206/153751.263:ERROR:directory_reader_win.cc(43)] FindFirstFile: The system cannot find the path specified. (0x3) [1211/204950.867:ERROR:directory_reader_win.cc(43)] FindFirstFile: The system cannot find the path specified. (0x3) +[1212/144259.801:ERROR:directory_reader_win.cc(43)] FindFirstFile: The system cannot find the path specified. (0x3) diff --git a/client/src/admin/pages/Appointments.tsx b/client/src/admin/pages/Appointments.tsx index 5d0a3c7..1c9b832 100644 --- a/client/src/admin/pages/Appointments.tsx +++ b/client/src/admin/pages/Appointments.tsx @@ -94,7 +94,7 @@ const data = [ const Appointments = () => { const [searchText, setSearchText] = useState('') const [searchedColumn, setSearchedColumn] = useState('') - const [searchInput, setSearchInput]: any = useState('') + const [searchInput, setSearchInput]: any | null = useState('') const [loading, setLoading] = useState(true) setTimeout(() => { diff --git a/client/src/frontend/pages/SignIn.tsx b/client/src/frontend/pages/SignIn.tsx index 34bf8fe..4fba171 100644 --- a/client/src/frontend/pages/SignIn.tsx +++ b/client/src/frontend/pages/SignIn.tsx @@ -19,9 +19,10 @@ const SignIn = () => { method: 'POST', url: 'http://localhost:4000/auth/signin', headers: { 'Content-Type': 'application/json' }, - data: JSON.stringify({ email, password }), + data: { email, password }, }) - + console.log(result) + console.log(result.config.data.email) const loginToken = result.data.accessToken localStorage.setItem('appointments_management_login_token', loginToken) setLoggedUser(true)