From a8480951b23d3ff44889fb82ebec3a5677d63a17 Mon Sep 17 00:00:00 2001 From: Divya Gandhi Date: Tue, 2 Apr 2024 09:52:13 +0530 Subject: [PATCH 01/82] Update home --- src/Components/Home/JobOpportunity.jsx | 135 ++++++++++++------------- src/Components/Home/LatestPosts.jsx | 61 ++++++++++- src/Components/Home/ShareNotes.jsx | 93 +++++++++++++++++ src/Components/Home/Sidebar.jsx | 4 +- src/Pages/Home.jsx | 2 + 5 files changed, 225 insertions(+), 70 deletions(-) create mode 100644 src/Components/Home/ShareNotes.jsx diff --git a/src/Components/Home/JobOpportunity.jsx b/src/Components/Home/JobOpportunity.jsx index 80c8477..00807da 100644 --- a/src/Components/Home/JobOpportunity.jsx +++ b/src/Components/Home/JobOpportunity.jsx @@ -1,87 +1,86 @@ -import React from 'react' +import React from 'react'; import CalendarTodayIcon from '@mui/icons-material/CalendarToday'; import AccessTimeOutlinedIcon from '@mui/icons-material/AccessTimeOutlined'; import SmartphoneOutlinedIcon from '@mui/icons-material/SmartphoneOutlined'; -const cardData=[ + +const cardData = [ { - "heading1":'Internship', - "heading2":'Company Name', - "body":"We are seeking highly motivated and enthusiastic", - "body1":"Technology intern to join us", - "icon":, - "time":"3 Months", - "timeicon":, - 'timelimit':'Part-time', - "mode":"Online", - "mobile": , - "date":"24th March" + "heading1": 'Internship', + "heading2": 'Company Name', + "body": "We are seeking highly motivated and enthusiastic technology intern to join us", + "icon": , + "time": "3 Months", + "timeicon": , + 'timelimit': 'Part-time', + "mode": "Online", + "mobile": , + "date": "24th March,2024" }, { - "heading1":'Internship', - "heading2":'Company Name', - "body":"We are seeking highly motivated and enthusiastic", - "body1":"Technology intern to join us", - "icon":, - "time":"3 Months", - "timeicon":, - 'timelimit':'Part-time', - "mode":"Online", - "mobile": , - "date":"24th March", + "heading1": 'Internship', + "heading2": 'Company Name', + "body": "We are seeking highly motivated and enthusiastic technology intern to join us", + "icon": , + "time": "3 Months", + "timeicon": , + 'timelimit': 'Part-time', + "mode": "Online", + "mobile": , + "date": "24th March,2024", }, { - "heading1":'Internship', - "heading2":'Company Name', - "body":"We are seeking highly motivated and enthusiastic", - "body1":"Technology intern to join us", - "icon":, - "time":"3 Months", - "timeicon":, - 'timelimit':'Part-time', - "mode":"Online", - "mobile": , - "date":"24th March", + "heading1": 'Internship', + "heading2": 'Company Name', + "body": "We are seeking highly motivated and enthusiastic technology intern to join us", + "icon": , + "time": "3 Months", + "timeicon": , + 'timelimit': 'Part-time', + "mode": "Online", + "mobile": , + "date": "24th March,2024", }, ] + function JobOpportunity() { return (
-

+

Explore Latest Job Opportunities -

-
-
- {cardData.map((data,i)=>{ - return < div className=' flex flex-col border p-3 rounded-l-lg rounded-r-lg bg-custom-gray' key={i}> -

{data.heading1}

-

{data.heading2}

-

{data.body}

-

{data.body1}

-
-
- {data.icon } -

{data.time}

-
-
- {data.timeicon} -

{data.timelimit}

-
-
- {data.mobile} -

{data.mode}

-
-
-

{data.date}

-
-
-
- })} -
- - +
+
+ {cardData.map((data, i) => { + return
+
+

{data.heading1}

+

{data.heading2}

+

{data.body}

+
+
+ {data.icon } +

{data.time}

+
+
+ {data.timeicon} +

{data.timelimit}

+
+
+ {data.mobile} +

{data.mode}

+
+
+

{data.date}

+
+
+
+ +
+ })} +
+

See more

) } -export default JobOpportunity \ No newline at end of file +export default JobOpportunity; diff --git a/src/Components/Home/LatestPosts.jsx b/src/Components/Home/LatestPosts.jsx index 72025f0..61cada8 100644 --- a/src/Components/Home/LatestPosts.jsx +++ b/src/Components/Home/LatestPosts.jsx @@ -1,8 +1,67 @@ import React from 'react' +import FavoriteBorderOutlinedIcon from '@mui/icons-material/FavoriteBorderOutlined'; + + +const cardData = [ + { + "heading1": 'Post Title', + + "body": "Hello tech enthusiastics and innovators! Are you ready to show case your skills,collabrate with like-minded individuals,and create ground-breaking solutions for real-world challenges? ", + "icon": , + + + 'timelimit': '100 + Likes', + + }, + { + "heading1": 'Post Title', + + "body": "Hello tech enthusiastics and innovators! Are you ready to show case your skills,collabrate with like-minded individuals,and create ground-breaking solutions for real-world challenges?", + "icon": , + + 'timelimit': '100 + Likes', + + }, + { + "heading1": 'Post Title', + + "body": "Hello tech enthusiastics and innovators! Are you ready to show case your skills,collabrate with like-minded individuals,and create ground-breaking solutions for real-world challenges?", + "icon": , + + + 'timelimit': '100 + Likes', + + }, +] function LatestPosts() { return ( -
LatestPosts
+
+

+ Latest Posts +

+
+
+ {cardData.map((data, i) => { + return
+
+

{data.heading1}

+ +

{data.body}

+
+
+ {data.icon } +

{data.timelimit}

+
+

Categories

+
+
+ +
+ })} +
+

See more

+
) } diff --git a/src/Components/Home/ShareNotes.jsx b/src/Components/Home/ShareNotes.jsx new file mode 100644 index 0000000..d9dd5ca --- /dev/null +++ b/src/Components/Home/ShareNotes.jsx @@ -0,0 +1,93 @@ +import React from 'react' + +import StarIcon from '@mui/icons-material/Star'; +import PictureAsPdfOutlinedIcon from '@mui/icons-material/PictureAsPdfOutlined'; + + +const cardData = [ + { + "heading1": 'Notes Title', + + "body": "Check out these Study Buddy Notes crafted by students who have been through coding sub.. ", + "icon": , + "department":" Department", + + 'timelimit': '100 + Likes', + 'pdf': + + }, + { + "heading1": 'Notes Title', + + "body": "Check out these Study Buddy Notes crafted by students who have been through coding sub..", + "icon": , + "department":" Department", + 'timelimit': '100 + Likes', + 'pdf': + + }, + { + "heading1": 'Notes Title', + "body": "Check out these Study Buddy Notes crafted by students who have been through coding sub..", + "icon": , + "department":" Department", + 'pdf':, + 'timelimit': '100 + Likes', + + }, + { + "heading1": 'Notes Title', + "body": "Check out these Study Buddy Notes crafted by students who have been through coding sub..", + "icon": , + "department":" Department", + 'pdf': + + + }, + { + "heading1": 'Notes Title', + "body": "Check out these Study Buddy Notes crafted by students who have been through coding sub..", + "icon": , + "department":" Department", + 'pdf': + + }, + ] +function ShareNotes() { + return ( +
+

+ Share Notes +

+
+
+ {cardData.map((data, i) => { + return
+
+
+

{data.heading1}

+
+ {data.icon} +

4.6

+
+ +
+
+

{data.body}

+
+
+ + {data.department} + {data.pdf} +
+
+ +
+ })} +
+

See more

+
+ ) +} + +export default ShareNotes \ No newline at end of file diff --git a/src/Components/Home/Sidebar.jsx b/src/Components/Home/Sidebar.jsx index 106e9d0..f0008e3 100644 --- a/src/Components/Home/Sidebar.jsx +++ b/src/Components/Home/Sidebar.jsx @@ -6,7 +6,8 @@ import AddIcon from '@mui/icons-material/Add'; function Sidebar() { return ( -
+
+

NOTENG

@@ -65,6 +66,7 @@ function Sidebar() {
+
); } diff --git a/src/Pages/Home.jsx b/src/Pages/Home.jsx index 934d346..892752c 100644 --- a/src/Pages/Home.jsx +++ b/src/Pages/Home.jsx @@ -2,6 +2,7 @@ import React from 'react' import Sidebar from '../Components/Home/Sidebar' import JobOpportunity from '../Components/Home/JobOpportunity' import LatestPosts from '../Components/Home/LatestPosts' +import ShareNotes from '../Components/Home/ShareNotes' function Home() { return (
@@ -9,6 +10,7 @@ function Home() {
+
) From a00438fd3bbf039b73735d57fc600d68c0026cd1 Mon Sep 17 00:00:00 2001 From: MonilMehta Date: Tue, 2 Apr 2024 10:41:46 +0530 Subject: [PATCH 02/82] Added Post Creation Page Added page and navigation for post creation, also fixed sidebar sizing issue. --- package-lock.json | 117 ++---------------------- package.json | 1 + src/App.js | 2 + src/Components/Home/Sidebar.jsx | 21 +++-- src/Pages/PostJob/PostJob.css | 77 ++++++++++++++++ src/Pages/PostJob/PostJob.jsx | 153 ++++++++++++++++++++++++++++++++ src/index.js | 1 + 7 files changed, 255 insertions(+), 117 deletions(-) create mode 100644 src/Pages/PostJob/PostJob.css create mode 100644 src/Pages/PostJob/PostJob.jsx diff --git a/package-lock.json b/package-lock.json index 4d17eaa..dae907a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "dependencies": { "@emotion/react": "^11.11.4", "@emotion/styled": "^11.11.5", + "@fontsource/poppins": "^5.0.13", "@mui/icons-material": "^5.15.14", "@mui/material": "^5.15.14", "@testing-library/jest-dom": "^5.17.0", @@ -2575,6 +2576,11 @@ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" }, + "node_modules/@fontsource/poppins": { + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/@fontsource/poppins/-/poppins-5.0.13.tgz", + "integrity": "sha512-8G9odFoxH43oZpvq43fpGucm8iHm6iatu0M1LIshb+tx3/y6YBXenVED7CI4resvPz6hyDu8a2vHSh9vrpe+wQ==" + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", @@ -4141,104 +4147,6 @@ "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/@testing-library/dom": { - "version": "9.3.4", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz", - "integrity": "sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.1.3", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@testing-library/dom/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@testing-library/dom/node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", - "peer": true, - "dependencies": { - "deep-equal": "^2.0.5" - } - }, - "node_modules/@testing-library/dom/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@testing-library/dom/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@testing-library/dom/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "peer": true - }, - "node_modules/@testing-library/dom/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/dom/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@testing-library/jest-dom": { "version": "5.17.0", "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz", @@ -17737,19 +17645,6 @@ "is-typedarray": "^1.0.0" } }, - "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", diff --git a/package.json b/package.json index 9d688e9..309d47c 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "dependencies": { "@emotion/react": "^11.11.4", "@emotion/styled": "^11.11.5", + "@fontsource/poppins": "^5.0.13", "@mui/icons-material": "^5.15.14", "@mui/material": "^5.15.14", "@testing-library/jest-dom": "^5.17.0", diff --git a/src/App.js b/src/App.js index 3ee714e..2ce5431 100644 --- a/src/App.js +++ b/src/App.js @@ -1,11 +1,13 @@ import './App.css' import Home from './Pages/Home' import {BrowserRouter,Route,Routes} from 'react-router-dom' +import PostJob from './Pages/PostJob/PostJob'; function App() { return ( }/> + }/> ); diff --git a/src/Components/Home/Sidebar.jsx b/src/Components/Home/Sidebar.jsx index 106e9d0..42c5a67 100644 --- a/src/Components/Home/Sidebar.jsx +++ b/src/Components/Home/Sidebar.jsx @@ -3,10 +3,19 @@ import PersonOutlineIcon from '@mui/icons-material/PersonOutline'; import SearchIcon from '@mui/icons-material/Search'; import HomeOutlinedIcon from '@mui/icons-material/HomeOutlined'; import AddIcon from '@mui/icons-material/Add'; +import { useNavigate } from 'react-router-dom'; -function Sidebar() { + +const Sidebar = () => { + const navigate = useNavigate(); + function handleHomeClick(){ + navigate('/') + } + function createJob(){ + navigate('/createjob') + } return ( -
+

NOTENG

@@ -24,7 +33,7 @@ function Sidebar() {
-
+
@@ -39,7 +48,7 @@ function Sidebar() {
-
+

Add Job Opportunity

@@ -65,7 +74,7 @@ function Sidebar() {
- ); + ) } -export default Sidebar; +export default Sidebar diff --git a/src/Pages/PostJob/PostJob.css b/src/Pages/PostJob/PostJob.css new file mode 100644 index 0000000..fd78d13 --- /dev/null +++ b/src/Pages/PostJob/PostJob.css @@ -0,0 +1,77 @@ +.custom-heading { + font-family: Poppins; + font-size: 40px; + } + + .maincontent { + width: 100%; + font-family: Poppins; + color: #20222E; + } + + .maincontent label { + font-size: 20px; + } + + .maincontent input { + font-size: 15px; + } + + .inputarea { + background-color: #fff; + border: 1px solid #ccc; + } + .job-button-container { + display: flex; + margin-bottom: 20px; + } + + .job-button-container button { + width: 270px; + padding: 10px; + font-size: 14px; + font-weight: 500; + color: #333; + background-color: #fff; + border: 1px solid #ccc; + border-radius: 4px; + cursor: pointer; + } + + .job-button-container button:hover { + background-color: #eef2f8; + } + + .job-button-container button.selected { + background-color: #394dfd; + color: #fff; + } + + @media only screen and (max-width: 768px) { + .job-button-container { + flex-direction: column; + } + + .job-button-container button { + width: 100%; /* Make buttons full width */ + margin-bottom: 10px; /* Add some space between buttons */ + } + } + + .submit-button { + width: 530px; + height: 65px; + font-family: Poppins; + font-size: 20px; + color: white; + background-color: #394dfd; + border: none; + border-radius: 8px; + cursor: pointer; + } + + +.submit-btn{ + display: flex; + justify-content: center; +} \ No newline at end of file diff --git a/src/Pages/PostJob/PostJob.jsx b/src/Pages/PostJob/PostJob.jsx new file mode 100644 index 0000000..478f79a --- /dev/null +++ b/src/Pages/PostJob/PostJob.jsx @@ -0,0 +1,153 @@ +import React, { useState } from 'react'; +import Sidebar from '../../Components/Home/Sidebar'; +import './PostJob.css'; // Import CSS file for styles + +const PostJob = () => { + const [jobType, setJobType] = useState(null); + const [jobLocation, setJobLocation] = useState(null); + + // Function to handle the selection of job type + const handleJobTypeSelection = (type) => { + setJobType(type); + setFormData({ + ...formData, + jobType: type + }); + }; + + // Function to handle the selection of job location + const handleJobLocationSelection = (location) => { + setJobLocation(location); + + setFormData({ + ...formData, + jobLocation: location + }); + }; + const [formData, setFormData] = useState({ + companyName: '', + companyLocation: '', + companyNumber: '', + jobDescription: '', + jobTenure: '', + jobType: null, + jobRequirements: '', + jobLocation: null + }); + + // Function to handle input change + const handleInputChange = (e) => { + const { name, value } = e.target; + setFormData({ + ...formData, + [name]: value + }); + }; + + // Function to handle form submission + const handleSubmit = (e) => { + e.preventDefault(); + // Perform POST request with formData + console.log(formData); + }; + return ( +
+ + <> +
+

+ Post Job Opportunities +

+
+ +
+
+ + +
+
+
+ + +
+
+ + +
+
+
+ + +
+
+
+ + +
+
+ + +
+
+
+ + +
+
+ +
+ + +
+ + +
+
+ +
+ +
+ + +
+
+
+
+ +
+
+ + +
+ +
+ ); +} + +export default PostJob; diff --git a/src/index.js b/src/index.js index d563c0f..97b50ee 100644 --- a/src/index.js +++ b/src/index.js @@ -3,6 +3,7 @@ import ReactDOM from 'react-dom/client'; import './index.css'; import App from './App'; import reportWebVitals from './reportWebVitals'; +import "@fontsource/poppins"; // Defaults to weight 400 const root = ReactDOM.createRoot(document.getElementById('root')); root.render( From 2dec3753d807359f50f69255a3db4ed2a6e0eacf Mon Sep 17 00:00:00 2001 From: MonilMehta Date: Tue, 2 Apr 2024 10:45:49 +0530 Subject: [PATCH 03/82] Update Sidebar.jsx --- src/Components/Home/Sidebar.jsx | 82 ++++++++++++++++----------------- 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/src/Components/Home/Sidebar.jsx b/src/Components/Home/Sidebar.jsx index ba30304..0033b54 100644 --- a/src/Components/Home/Sidebar.jsx +++ b/src/Components/Home/Sidebar.jsx @@ -5,15 +5,17 @@ import HomeOutlinedIcon from '@mui/icons-material/HomeOutlined'; import AddIcon from '@mui/icons-material/Add'; import { useNavigate } from 'react-router-dom'; - const Sidebar = () => { const navigate = useNavigate(); + function handleHomeClick(){ - navigate('/') + navigate('/'); } + function createJob(){ - navigate('/createjob') + navigate('/createjob'); } + return (
@@ -21,7 +23,7 @@ const Sidebar = () => {

NOTENG

Hey, John Doe

-
+
@@ -33,50 +35,48 @@ const Sidebar = () => {
-
-
- +
+
+ +
+

Home

-

Home

-
-
-
- +
+
+ +
+

Discover

-

Discover

-
-
-
-
-
- +
+
+
+
+ +
+

Add Job Opportunity

-

Add Job Opportunity

-
-
-
- +
+
+ +
+

Create New Post

-

Create New Post

-
-
-
- +
+
+ +
+

Upload Notes

-

Upload Notes

-
-
-
- +
+
+ +
+

Share Video

-

Share Video

-
+
-
-
-
- ) + ); } -export default Sidebar +export default Sidebar; From fd9181f2cf70bff06ed059988f16514ae40afe59 Mon Sep 17 00:00:00 2001 From: MonilMehta Date: Wed, 3 Apr 2024 00:06:45 +0530 Subject: [PATCH 04/82] Added Post Details Page --- package-lock.json | 9 +++ package.json | 1 + src/App.js | 4 +- src/Components/Home/Sidebar.jsx | 8 +- src/Pages/{PostJob => }/PostJob.jsx | 4 +- src/Pages/ViewJob.jsx | 91 ++++++++++++++++++++++ src/assets/BackButton.png | Bin 0 -> 951 bytes src/{Pages/PostJob => styles}/PostJob.css | 0 src/styles/ViewJob.css | 69 ++++++++++++++++ 9 files changed, 179 insertions(+), 7 deletions(-) rename src/Pages/{PostJob => }/PostJob.jsx (98%) create mode 100644 src/Pages/ViewJob.jsx create mode 100644 src/assets/BackButton.png rename src/{Pages/PostJob => styles}/PostJob.css (100%) create mode 100644 src/styles/ViewJob.css diff --git a/package-lock.json b/package-lock.json index dae907a..4e4fa5f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,6 +18,7 @@ "@testing-library/user-event": "^13.5.0", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-icons": "^5.0.1", "react-router-dom": "^6.22.3", "react-scripts": "5.0.1", "web-vitals": "^2.1.4" @@ -15511,6 +15512,14 @@ "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" }, + "node_modules/react-icons": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.0.1.tgz", + "integrity": "sha512-WqLZJ4bLzlhmsvme6iFdgO8gfZP17rfjYEJ2m9RsZjZ+cc4k1hTzknEz63YS1MeT50kVzoa1Nz36f4BEx+Wigw==", + "peerDependencies": { + "react": "*" + } + }, "node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", diff --git a/package.json b/package.json index 309d47c..63ede19 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "@testing-library/user-event": "^13.5.0", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-icons": "^5.0.1", "react-router-dom": "^6.22.3", "react-scripts": "5.0.1", "web-vitals": "^2.1.4" diff --git a/src/App.js b/src/App.js index 2ce5431..13d4801 100644 --- a/src/App.js +++ b/src/App.js @@ -1,13 +1,15 @@ import './App.css' import Home from './Pages/Home' import {BrowserRouter,Route,Routes} from 'react-router-dom' -import PostJob from './Pages/PostJob/PostJob'; +import PostJob from './Pages/PostJob'; +import ViewJob from './Pages/ViewJob'; function App() { return ( }/> }/> + }/> ); diff --git a/src/Components/Home/Sidebar.jsx b/src/Components/Home/Sidebar.jsx index 0033b54..66e4d81 100644 --- a/src/Components/Home/Sidebar.jsx +++ b/src/Components/Home/Sidebar.jsx @@ -49,25 +49,25 @@ const Sidebar = () => {
-
+

Add Job Opportunity

-
+

Create New Post

-
+

Upload Notes

-
+
diff --git a/src/Pages/PostJob/PostJob.jsx b/src/Pages/PostJob.jsx similarity index 98% rename from src/Pages/PostJob/PostJob.jsx rename to src/Pages/PostJob.jsx index 478f79a..db332db 100644 --- a/src/Pages/PostJob/PostJob.jsx +++ b/src/Pages/PostJob.jsx @@ -1,6 +1,6 @@ import React, { useState } from 'react'; -import Sidebar from '../../Components/Home/Sidebar'; -import './PostJob.css'; // Import CSS file for styles +import Sidebar from '../Components/Home/Sidebar'; +import '../styles/PostJob.css'; const PostJob = () => { const [jobType, setJobType] = useState(null); diff --git a/src/Pages/ViewJob.jsx b/src/Pages/ViewJob.jsx new file mode 100644 index 0000000..78684e1 --- /dev/null +++ b/src/Pages/ViewJob.jsx @@ -0,0 +1,91 @@ +import React from 'react'; +import { useNavigate } from 'react-router-dom'; +import Sidebar from '../Components/Home/Sidebar'; +import BackButton from '../assets/BackButton.png'; +import { Button } from '@mui/material'; +import '../styles/ViewJob.css'; + +const ViewJob = () => { + const navigate = useNavigate(); + + const handleGoBack = (event) => { + event.preventDefault(); + navigate.goBack(); + }; + + return ( +
+ + <> +
+
+ +

+ Post Job Opportunities +

+
+
+
+

Company Name

+

U, 15, Bhaktivedanta Swami Rd, opp. Cooper Hospital, + Navpada, JVPD Scheme, Vile Parle, Mumbai, + Maharashtra 400056

+
+ + + + +
+
+
+

Job Description

+

We are seeking a highly motivated and enthusiastic Technology Intern to join our dynamic team. + As an intern, you will have the opportunity to gain hands-on experience in various aspects of technology, including software development, + data analysis, and IT support. You will work closely with our experienced professionals on real-world projects and contribute to the success of our company.

+ +

Job Requirements

+

+

    +
  • Currently enrolled in a Bachelor's or Master's degree program in Computer Science, Information Technology, or related field
  • +
  • Strong understanding of programming languages such as Python, Java, or C++
  • +
  • Knowledge of database management systems and data analysis tools
  • +
  • Excellent problem-solving and analytical skills
  • +
  • Ability to work independently and in a team environment
  • +
  • Excellent communication and interpersonal skills
  • +
  • Must be available to work a minimum of 20 hours per week
  • +
+

+
+
+
+

Posted By:

+

Monil Mehta

+
+
+

24th March 2024

+

15:18

+
+
+ +
+
+ +
+ +
+ ) +} + +export default ViewJob diff --git a/src/assets/BackButton.png b/src/assets/BackButton.png new file mode 100644 index 0000000000000000000000000000000000000000..8c52ab7332f43c6dfd95d08591571ed47dd90522 GIT binary patch literal 951 zcmV;o14#UdP)6ljEH>qjTOa~0A8G!d2M^P}V6kTzO` zqq5BGy%~5~c?@ZzTzHu5`?qgkPJX71QsJZHQ?0U$GT~pRXRu%Yai>kSETcr2Wj`N$ zz0;;cmPuXMBv~d^Vbf%p)PzlxWl|9~RhCIyI8N5Grj3wg5*0RGmPt%_l{A ziN`2u6}uXvNNs94OnSfmJ$!`eBGtviFll~X>yl1=d1#unk_`Zpq?K*)m?Euo6VC)` z<=eEnrL}CtccpE)n(D$UtA`KLf2XJIRZG9L%4MYXw}*fJHaTxn*)meQuxbQnr9w{N z7vg*myO0xzupuCzL&ymP!B5WO87r|m3()oT0XCadww%sc4iZ~j$F>&4{5-ahf^En+ z0R_AK8KxfQAj+I2|C&n!!kHFFSpaQ9R=Ft&aQUz|wX|(}ivr4A*CwFt{`!Z35`YWO zs|ggVkOBCvy2`7?cftC@(qWlGyOen>Jum{p1675OR#wgJ) Z{{R(?jgb2Mh?D>T002ovPDHLkV1ftlsk#6F literal 0 HcmV?d00001 diff --git a/src/Pages/PostJob/PostJob.css b/src/styles/PostJob.css similarity index 100% rename from src/Pages/PostJob/PostJob.css rename to src/styles/PostJob.css diff --git a/src/styles/ViewJob.css b/src/styles/ViewJob.css new file mode 100644 index 0000000..980daca --- /dev/null +++ b/src/styles/ViewJob.css @@ -0,0 +1,69 @@ +.backButton img{ + margin-left: 3vw; + margin-right: 6vw; + height: auto; + margin-top: 30px; +} +.company-name{ + margin:32px 0px 10px 3vw; + font-family: Poppins; + font-weight: 600; + font-size: 32px; +} +.company-location{ + margin:15px 0px 10px 3vw; + font-family: Poppins; + max-width: 540px; + color: #8391A1; +} +.badges1{ + margin-left: 3vw; + width: 150px; + justify-content: center; + margin-bottom: 24px; + margin-top: 8px; + height: 36px; +} +.badges{ + margin-left: 3vw; + width: 150px; + justify-content: center; + margin-bottom: 24px; + margin-top: 8px; + height: 36px; +} +.job-descrip { + font-family: Poppins; + max-width: 1060px; + color: #8391A1; + margin-left: 3vw; + box-shadow: 0px 4px 12px rgba(247, 248, 249, 0.5); + background-color: #F7F8F9; + border: 1px solid #E8ECF4; + padding: 14px 24px 14px 24px; + border-radius: 10px; +} +ul{ + list-style:circle; + margin-left: 5px; +} +.poster-details{ + color: #8391A1; + font-size: 20px; + font-family: Poppins; + margin-left: 3vw; + padding: 24px; +} +.post-datetime{ + color: #8391A1; + font-size: 20px; + font-family: Poppins; + margin-left: 2vw; + padding: 24px; +} +.contactbutton{ + max-width: 24vw; + padding: 24px; + margin-left: auto; + margin-right: 4vw; +} \ No newline at end of file From 2fbe06b3406b601573b769d85a5cc8b1db8da107 Mon Sep 17 00:00:00 2001 From: Divya Gandhi Date: Wed, 3 Apr 2024 12:19:40 +0530 Subject: [PATCH 05/82] RESPONSIVE HOME PAGE --- src/Components/Home/JobOpportunity.jsx | 32 ++++++++++++------------- src/Components/Home/LatestPosts.jsx | 16 ++++++------- src/Components/Home/ShareNotes.jsx | 6 ++--- src/Components/Home/SharedResources.jsx | 14 +++++++++++ src/Components/Home/Sidebar.jsx | 4 ++-- src/Pages/Home.jsx | 2 ++ 6 files changed, 45 insertions(+), 29 deletions(-) create mode 100644 src/Components/Home/SharedResources.jsx diff --git a/src/Components/Home/JobOpportunity.jsx b/src/Components/Home/JobOpportunity.jsx index 00807da..e8c4112 100644 --- a/src/Components/Home/JobOpportunity.jsx +++ b/src/Components/Home/JobOpportunity.jsx @@ -8,36 +8,36 @@ const cardData = [ "heading1": 'Internship', "heading2": 'Company Name', "body": "We are seeking highly motivated and enthusiastic technology intern to join us", - "icon": , + "icon": , "time": "3 Months", - "timeicon": , + "timeicon": , 'timelimit': 'Part-time', "mode": "Online", - "mobile": , + "mobile": , "date": "24th March,2024" }, { "heading1": 'Internship', "heading2": 'Company Name', "body": "We are seeking highly motivated and enthusiastic technology intern to join us", - "icon": , + "icon": , "time": "3 Months", - "timeicon": , + "timeicon": , 'timelimit': 'Part-time', "mode": "Online", - "mobile": , + "mobile": , "date": "24th March,2024", }, { "heading1": 'Internship', "heading2": 'Company Name', "body": "We are seeking highly motivated and enthusiastic technology intern to join us", - "icon": , + "icon": , "time": "3 Months", - "timeicon": , + "timeicon": , 'timelimit': 'Part-time', "mode": "Online", - "mobile": , + "mobile": , "date": "24th March,2024", }, ] @@ -45,11 +45,11 @@ const cardData = [ function JobOpportunity() { return (
-

+

Explore Latest Job Opportunities

-
+
{cardData.map((data, i) => { return
@@ -59,18 +59,18 @@ function JobOpportunity() {
{data.icon } -

{data.time}

+

{data.time}

{data.timeicon} -

{data.timelimit}

+

{data.timelimit}

{data.mobile} -

{data.mode}

+

{data.mode}

-

{data.date}

+

{data.date}

@@ -78,7 +78,7 @@ function JobOpportunity() {
})}
-

See more

+

See more

) } diff --git a/src/Components/Home/LatestPosts.jsx b/src/Components/Home/LatestPosts.jsx index 61cada8..1d8aedb 100644 --- a/src/Components/Home/LatestPosts.jsx +++ b/src/Components/Home/LatestPosts.jsx @@ -37,30 +37,30 @@ const cardData = [ function LatestPosts() { return (
-

- Latest Posts +

+ Latest Posts

-
+
{cardData.map((data, i) => { return
-

{data.heading1}

+

{data.heading1}

-

{data.body}

+

{data.body}

{data.icon } -

{data.timelimit}

+

{data.timelimit}

-

Categories

+

Categories

})}
-

See more

+

See more

) } diff --git a/src/Components/Home/ShareNotes.jsx b/src/Components/Home/ShareNotes.jsx index d9dd5ca..dc57d78 100644 --- a/src/Components/Home/ShareNotes.jsx +++ b/src/Components/Home/ShareNotes.jsx @@ -56,11 +56,11 @@ const cardData = [ function ShareNotes() { return (
-

+

Share Notes

-
+
{cardData.map((data, i) => { return
@@ -77,7 +77,7 @@ function ShareNotes() {
- {data.department} +

{data.department}

{data.pdf}
diff --git a/src/Components/Home/SharedResources.jsx b/src/Components/Home/SharedResources.jsx new file mode 100644 index 0000000..9f66127 --- /dev/null +++ b/src/Components/Home/SharedResources.jsx @@ -0,0 +1,14 @@ +import React from 'react' + +function SharedResources() { + return ( +
+

+ Explore Shared Video Resources +

+
+
+ ) +} + +export default SharedResources \ No newline at end of file diff --git a/src/Components/Home/Sidebar.jsx b/src/Components/Home/Sidebar.jsx index f0008e3..0fbe63a 100644 --- a/src/Components/Home/Sidebar.jsx +++ b/src/Components/Home/Sidebar.jsx @@ -6,8 +6,8 @@ import AddIcon from '@mui/icons-material/Add'; function Sidebar() { return ( -
-
+
+

NOTENG

diff --git a/src/Pages/Home.jsx b/src/Pages/Home.jsx index 892752c..12b2b18 100644 --- a/src/Pages/Home.jsx +++ b/src/Pages/Home.jsx @@ -3,6 +3,7 @@ import Sidebar from '../Components/Home/Sidebar' import JobOpportunity from '../Components/Home/JobOpportunity' import LatestPosts from '../Components/Home/LatestPosts' import ShareNotes from '../Components/Home/ShareNotes' +import SharedResources from '../Components/Home/SharedResources' function Home() { return (
@@ -11,6 +12,7 @@ function Home() { +
) From 6a083244ee91c1f53f7ff3261872fcd5ff6f79a6 Mon Sep 17 00:00:00 2001 From: Divya Gandhi Date: Wed, 3 Apr 2024 18:29:35 +0530 Subject: [PATCH 06/82] Changes --- src/Components/Home/Sidebar.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Components/Home/Sidebar.jsx b/src/Components/Home/Sidebar.jsx index 0fbe63a..394275a 100644 --- a/src/Components/Home/Sidebar.jsx +++ b/src/Components/Home/Sidebar.jsx @@ -7,7 +7,7 @@ import AddIcon from '@mui/icons-material/Add'; function Sidebar() { return (
-
+

NOTENG

From b470c6de90829581acbcecced0609ab4693a5812 Mon Sep 17 00:00:00 2001 From: Divya Gandhi Date: Wed, 3 Apr 2024 18:41:19 +0530 Subject: [PATCH 07/82] For responsive --- package-lock.json | 111 ++++++++++++++++++++++++++++++++ src/Components/Home/Sidebar.jsx | 93 +++++++++++++------------- 2 files changed, 158 insertions(+), 46 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4e4fa5f..96b0b01 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4148,6 +4148,104 @@ "url": "https://github.com/sponsors/gregberge" } }, + "node_modules/@testing-library/dom": { + "version": "9.3.4", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz", + "integrity": "sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.1.3", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@testing-library/dom/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@testing-library/dom/node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "peer": true, + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/@testing-library/dom/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@testing-library/dom/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@testing-library/dom/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "peer": true + }, + "node_modules/@testing-library/dom/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/dom/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@testing-library/jest-dom": { "version": "5.17.0", "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz", @@ -17654,6 +17752,19 @@ "is-typedarray": "^1.0.0" } }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", diff --git a/src/Components/Home/Sidebar.jsx b/src/Components/Home/Sidebar.jsx index de0b39f..ab89883 100644 --- a/src/Components/Home/Sidebar.jsx +++ b/src/Components/Home/Sidebar.jsx @@ -18,61 +18,62 @@ const Sidebar = () => { return (
-
-
-
-

NOTENG

-

Hey, John Doe

-
-
-
- +
+
+
+

NOTENG

+

Hey, John Doe

+
+
+
+ +
-
-
- -
- +
+ +
+ +
-
-
-
- +
+
+ +
+

Home

-

Home

-
-
-
- +
+
+ +
+

Discover

-

Discover

-
-
-
-
-
- +
+
+
+
+ +
+

Add Job Opportunity

-

Add Job Opportunity

-
-
-
- +
+
+ +
+

Create New Post

-

Create New Post

-
-
-
- +
+
+ +
+

Upload Notes

-

Upload Notes

-
-
-
- +
+
+ +
+

Share Video

-

Share Video

From 0dd5667c5179ad5d7aa05f6fc6f4c7a95a251265 Mon Sep 17 00:00:00 2001 From: Divya Gandhi Date: Thu, 4 Apr 2024 02:29:54 +0530 Subject: [PATCH 08/82] Responsive done successfully --- src/Components/Home/JobOpportunity.jsx | 8 +- src/Components/Home/LatestPosts.jsx | 2 +- src/Components/Home/ShareNotes.jsx | 4 +- src/Components/Home/Sidebar.jsx | 118 +++++++++++++--------- src/Components/Home/Sidebarresponsive.jsx | 18 ++++ src/Pages/Home.jsx | 4 +- 6 files changed, 97 insertions(+), 57 deletions(-) create mode 100644 src/Components/Home/Sidebarresponsive.jsx diff --git a/src/Components/Home/JobOpportunity.jsx b/src/Components/Home/JobOpportunity.jsx index e8c4112..6341747 100644 --- a/src/Components/Home/JobOpportunity.jsx +++ b/src/Components/Home/JobOpportunity.jsx @@ -48,11 +48,11 @@ function JobOpportunity() {

Explore Latest Job Opportunities

-
-
+
+
{cardData.map((data, i) => { - return
-
+ return
+

{data.heading1}

{data.heading2}

{data.body}

diff --git a/src/Components/Home/LatestPosts.jsx b/src/Components/Home/LatestPosts.jsx index 1d8aedb..9149f58 100644 --- a/src/Components/Home/LatestPosts.jsx +++ b/src/Components/Home/LatestPosts.jsx @@ -43,7 +43,7 @@ function LatestPosts() {
{cardData.map((data, i) => { - return
+ return

{data.heading1}

diff --git a/src/Components/Home/ShareNotes.jsx b/src/Components/Home/ShareNotes.jsx index dc57d78..91ad71e 100644 --- a/src/Components/Home/ShareNotes.jsx +++ b/src/Components/Home/ShareNotes.jsx @@ -62,7 +62,7 @@ function ShareNotes() {
{cardData.map((data, i) => { - return
+ return

{data.heading1}

@@ -90,4 +90,4 @@ function ShareNotes() { ) } -export default ShareNotes \ No newline at end of file +export default ShareNotes \ No newline at end of file diff --git a/src/Components/Home/Sidebar.jsx b/src/Components/Home/Sidebar.jsx index ab89883..0a9769d 100644 --- a/src/Components/Home/Sidebar.jsx +++ b/src/Components/Home/Sidebar.jsx @@ -1,78 +1,98 @@ -import React from 'react'; +import React, { useState } from 'react'; import PersonOutlineIcon from '@mui/icons-material/PersonOutline'; import SearchIcon from '@mui/icons-material/Search'; import HomeOutlinedIcon from '@mui/icons-material/HomeOutlined'; import AddIcon from '@mui/icons-material/Add'; import { useNavigate } from 'react-router-dom'; +import Sidebarresponsive from './Sidebarresponsive'; +import CloseIcon from '@mui/icons-material/Close'; const Sidebar = () => { const navigate = useNavigate(); + const [isOpen, setIsOpen] = useState(false); - function handleHomeClick(){ + function handleHomeClick() { navigate('/'); } - function createJob(){ + function createJob() { navigate('/createjob'); } + function toggleSidebar() { + setIsOpen(!isOpen); + document.body.style.overflowY = isOpen ? 'auto' : 'hidden'; + } + return ( -
-
-
-
-

NOTENG

-

Hey, John Doe

+
+ {!isOpen && ( +
+ +
+ )} +
+
+ +
+
-
-
- +
+
+

NOTENG

+

Hey, John Doe

+ +
+
+
+ +
-
-
- -
- +
+ +
+ +
-
-
-
- +
+
+ +
+

Home

-

Home

-
-
-
- +
+
+ +
+

Discover

-

Discover

-
-
-
-
-
- +
+
+
+
+ +
+

Add Job Opportunity

-

Add Job Opportunity

-
-
-
- +
+
+ +
+

Create New Post

-

Create New Post

-
-
-
- +
+
+ +
+

Upload Notes

-

Upload Notes

-
-
-
- +
+
+ +
+

Share Video

-

Share Video

diff --git a/src/Components/Home/Sidebarresponsive.jsx b/src/Components/Home/Sidebarresponsive.jsx new file mode 100644 index 0000000..55d45d7 --- /dev/null +++ b/src/Components/Home/Sidebarresponsive.jsx @@ -0,0 +1,18 @@ +import React from 'react' +import MoreVertIcon from '@mui/icons-material/MoreVert'; + +function Sidebarresponsive() { + + return ( + +
+
+ +
+ +
+ + ) +} + +export default Sidebarresponsive \ No newline at end of file diff --git a/src/Pages/Home.jsx b/src/Pages/Home.jsx index 12b2b18..a54faef 100644 --- a/src/Pages/Home.jsx +++ b/src/Pages/Home.jsx @@ -4,10 +4,12 @@ import JobOpportunity from '../Components/Home/JobOpportunity' import LatestPosts from '../Components/Home/LatestPosts' import ShareNotes from '../Components/Home/ShareNotes' import SharedResources from '../Components/Home/SharedResources' +import Sidebarresponsive from '../Components/Home/Sidebarresponsive' function Home() { return ( -
+
+
From 24708ca5dd5d5e893323236463d9bdc1a2328682 Mon Sep 17 00:00:00 2001 From: Divya Gandhi Date: Thu, 4 Apr 2024 08:18:30 +0530 Subject: [PATCH 09/82] modification --- src/Components/Home/Sidebar.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Components/Home/Sidebar.jsx b/src/Components/Home/Sidebar.jsx index 0a9769d..e0eb9df 100644 --- a/src/Components/Home/Sidebar.jsx +++ b/src/Components/Home/Sidebar.jsx @@ -32,7 +32,7 @@ const Sidebar = () => {
)}
-
+
From 1acc45984dd615136dff8f0cc945f12bc3cfed3c Mon Sep 17 00:00:00 2001 From: Divya Gandhi Date: Thu, 4 Apr 2024 11:07:13 +0530 Subject: [PATCH 10/82] Sidebar changes --- src/Components/Home/Sidebar.jsx | 2 +- src/Components/Home/Sidebarresponsive.jsx | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Components/Home/Sidebar.jsx b/src/Components/Home/Sidebar.jsx index e0eb9df..56d5794 100644 --- a/src/Components/Home/Sidebar.jsx +++ b/src/Components/Home/Sidebar.jsx @@ -32,7 +32,7 @@ const Sidebar = () => {
)}
-
+
diff --git a/src/Components/Home/Sidebarresponsive.jsx b/src/Components/Home/Sidebarresponsive.jsx index 55d45d7..d804fbb 100644 --- a/src/Components/Home/Sidebarresponsive.jsx +++ b/src/Components/Home/Sidebarresponsive.jsx @@ -4,13 +4,14 @@ import MoreVertIcon from '@mui/icons-material/MoreVert'; function Sidebarresponsive() { return ( - -
+
+
+
) } From b07422c8966e20c0dd6adf2426b5a16008c7758a Mon Sep 17 00:00:00 2001 From: anshshah23 Date: Fri, 5 Apr 2024 01:22:47 +0530 Subject: [PATCH 11/82] ansh shah@DESKTOP-5GQJ8J9 MINGW64 /d/React/React-Login-App (frontend) --- package-lock.json | 58 +++++++++++ package.json | 3 + src/App.js | 36 +++++-- src/Login.css | 125 ++++++++++++++++++++++ src/LoginPage/Layout.jsx | 11 ++ src/LoginPage/LinkPage.jsx | 20 ++++ src/LoginPage/Login.jsx | 101 ++++++++++++++++++ src/LoginPage/Register.jsx | 183 +++++++++++++++++++++++++++++++++ src/LoginPage/RequireAuth.jsx | 17 +++ src/LoginPage/Unauthorized.jsx | 20 ++++ src/LoginPage/Users.jsx | 50 +++++++++ src/api/axios.js | 12 +++ src/context/AuthProvider.js | 15 +++ src/hooks/useAuth.js | 10 ++ src/hooks/useAxiosPrivate.js | 44 ++++++++ src/hooks/useRefreshToken.js | 21 ++++ src/index.js | 16 ++- 17 files changed, 733 insertions(+), 9 deletions(-) create mode 100644 src/Login.css create mode 100644 src/LoginPage/Layout.jsx create mode 100644 src/LoginPage/LinkPage.jsx create mode 100644 src/LoginPage/Login.jsx create mode 100644 src/LoginPage/Register.jsx create mode 100644 src/LoginPage/RequireAuth.jsx create mode 100644 src/LoginPage/Unauthorized.jsx create mode 100644 src/LoginPage/Users.jsx create mode 100644 src/api/axios.js create mode 100644 src/context/AuthProvider.js create mode 100644 src/hooks/useAuth.js create mode 100644 src/hooks/useAxiosPrivate.js create mode 100644 src/hooks/useRefreshToken.js diff --git a/package-lock.json b/package-lock.json index 96b0b01..4fd07cd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,9 @@ "@emotion/react": "^11.11.4", "@emotion/styled": "^11.11.5", "@fontsource/poppins": "^5.0.13", + "@fortawesome/fontawesome-free": "^6.5.2", + "@fortawesome/free-solid-svg-icons": "^6.5.2", + "@fortawesome/react-fontawesome": "^0.2.0", "@mui/icons-material": "^5.15.14", "@mui/material": "^5.15.14", "@testing-library/jest-dom": "^5.17.0", @@ -2582,6 +2585,61 @@ "resolved": "https://registry.npmjs.org/@fontsource/poppins/-/poppins-5.0.13.tgz", "integrity": "sha512-8G9odFoxH43oZpvq43fpGucm8iHm6iatu0M1LIshb+tx3/y6YBXenVED7CI4resvPz6hyDu8a2vHSh9vrpe+wQ==" }, + "node_modules/@fortawesome/fontawesome-common-types": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.2.tgz", + "integrity": "sha512-gBxPg3aVO6J0kpfHNILc+NMhXnqHumFxOmjYCFfOiLZfwhnnfhtsdA2hfJlDnj+8PjAs6kKQPenOTKj3Rf7zHw==", + "hasInstallScript": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/fontawesome-free": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.5.2.tgz", + "integrity": "sha512-hRILoInAx8GNT5IMkrtIt9blOdrqHOnPBH+k70aWUAqPZPgopb9G5EQJFpaBx/S8zp2fC+mPW349Bziuk1o28Q==", + "hasInstallScript": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/fontawesome-svg-core": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.5.2.tgz", + "integrity": "sha512-5CdaCBGl8Rh9ohNdxeeTMxIj8oc3KNBgIeLMvJosBMdslK/UnEB8rzyDRrbKdL1kDweqBPo4GT9wvnakHWucZw==", + "hasInstallScript": true, + "peer": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.5.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-solid-svg-icons": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.5.2.tgz", + "integrity": "sha512-QWFZYXFE7O1Gr1dTIp+D6UcFUF0qElOnZptpi7PBUMylJh+vFmIedVe1Ir6RM1t2tEQLLSV1k7bR4o92M+uqlw==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.5.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/react-fontawesome": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz", + "integrity": "sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw==", + "dependencies": { + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "@fortawesome/fontawesome-svg-core": "~1 || ~6", + "react": ">=16.3" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", diff --git a/package.json b/package.json index 63ede19..dc68758 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,9 @@ "@emotion/react": "^11.11.4", "@emotion/styled": "^11.11.5", "@fontsource/poppins": "^5.0.13", + "@fortawesome/fontawesome-free": "^6.5.2", + "@fortawesome/free-solid-svg-icons": "^6.5.2", + "@fortawesome/react-fontawesome": "^0.2.0", "@mui/icons-material": "^5.15.14", "@mui/material": "^5.15.14", "@testing-library/jest-dom": "^5.17.0", diff --git a/src/App.js b/src/App.js index 13d4801..4110534 100644 --- a/src/App.js +++ b/src/App.js @@ -1,17 +1,41 @@ import './App.css' import Home from './Pages/Home' -import {BrowserRouter,Route,Routes} from 'react-router-dom' +import { BrowserRouter, Route, Routes } from 'react-router-dom' import PostJob from './Pages/PostJob'; import ViewJob from './Pages/ViewJob'; + +import Register from './LoginPage/Register'; +import Login from './LoginPage/Login'; +import Layout from './LoginPage/Layout'; +import Unauthorized from './LoginPage/Unauthorized'; +import LinkPage from './LoginPage/LinkPage'; +import RequireAuth from './LoginPage/RequireAuth'; + +const ROLES = { + 'User': 2001 +} + function App() { return ( - + - }/> - }/> - }/> + }> + {/* public routes */} + } /> + } /> + } /> + } /> + + {/* we want to protect these routes */} + }> + } /> + } /> + } /> + + + - + ); } diff --git a/src/Login.css b/src/Login.css new file mode 100644 index 0000000..ad4aa42 --- /dev/null +++ b/src/Login.css @@ -0,0 +1,125 @@ +@import url('https://fonts.googleapis.com/css2?family=Nunito&display=swap'); + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +html { + font-family: 'Nunito', sans-serif; + font-size: 22px; + color: #fff; +} + +body { + min-height: 100vh; + background-color: dodgerblue; +} + +.App { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + min-height: 100vh; + padding: 1rem 0.5rem; +} + +section { + width: 100%; + max-width: 420px; + min-height: 400px; + display: flex; + flex-direction: column; + justify-content: flex-start; + padding: 1rem; + background-color: rgba(0,0,0,0.4); +} + +form { + display: flex; + flex-direction: column; + justify-content: space-evenly; + flex-grow: 1; + padding-bottom: 1rem; +} + +a, a:visited { + color: #fff; +} + +input[type="text"], +input[type="password"], +button, +textarea { + font-family: 'Nunito', sans-serif; + font-size: 22px; + padding: 0.25rem; + border-radius: 0.5rem; +} + +label, +button { + margin-top: 1rem; +} + +button { + padding: 0.5rem; +} + +li { + list-style-type: none; +} + +.instructions { + font-size: 0.75rem; + border-radius: 0.5rem; + background: #000; + color: #fff; + padding: 0.25rem; + position: relative; + bottom: -10px; +} + +.instructions > svg { + margin-right: 0.25rem; +} + +.offscreen { + position: absolute; + left: -9999px; +} + +.hide { + display: none; +} + +.valid { + color: limegreen; + margin-left: 0.25rem; +} + +.invalid { + color: red; + margin-left: 0.25rem; +} + +.errmsg { + background-color: lightpink; + color: firebrick; + font-weight: bold; + padding: 0.5rem; + margin-bottom: 0.5rem; +} + +.line { + display: inline-block; +} + +.flexGrow { + flex-grow: 1; + display: flex; + justify-content: flex-start; + align-items: flex-end; +} diff --git a/src/LoginPage/Layout.jsx b/src/LoginPage/Layout.jsx new file mode 100644 index 0000000..7d5a015 --- /dev/null +++ b/src/LoginPage/Layout.jsx @@ -0,0 +1,11 @@ +import { Outlet } from "react-router-dom" + +const Layout = () => { + return ( +
+ +
+ ) +} + +export default Layout diff --git a/src/LoginPage/LinkPage.jsx b/src/LoginPage/LinkPage.jsx new file mode 100644 index 0000000..3400f61 --- /dev/null +++ b/src/LoginPage/LinkPage.jsx @@ -0,0 +1,20 @@ +import { Link } from "react-router-dom" + +const LinkPage = () => { + return ( +
+

Links

+
+

Public

+ Login + Register +
+

Private

+ Home + Editors Page + Admin Page +
+ ) +} + +export default LinkPage diff --git a/src/LoginPage/Login.jsx b/src/LoginPage/Login.jsx new file mode 100644 index 0000000..3cb7df1 --- /dev/null +++ b/src/LoginPage/Login.jsx @@ -0,0 +1,101 @@ +import { useRef, useState, useEffect } from 'react'; +import useAuth from '../hooks/useAuth'; +import { Link, useNavigate, useLocation } from 'react-router-dom'; + +import axios from '../api/axios'; +const LOGIN_URL = '/auth'; + +const Login = () => { + const { setAuth } = useAuth(); + + const navigate = useNavigate(); + const location = useLocation(); + const from = location.state?.from?.pathname || "/"; + + const userRef = useRef(); + const errRef = useRef(); + + const [user, setUser] = useState(''); + const [pwd, setPwd] = useState(''); + const [errMsg, setErrMsg] = useState(''); + + useEffect(() => { + userRef.current.focus(); + }, []) + + useEffect(() => { + setErrMsg(''); + }, [user, pwd]) + + const handleSubmit = async (e) => { + e.preventDefault(); + + try { + const response = await axios.post(LOGIN_URL, + JSON.stringify({ user, pwd }), + { + headers: { 'Content-Type': 'application/json' }, + withCredentials: true + } + ); + console.log(JSON.stringify(response?.data)); + //console.log(JSON.stringify(response)); + const accessToken = response?.data?.accessToken; + const roles = response?.data?.roles; + setAuth({ user, pwd, roles, accessToken }); + setUser(''); + setPwd(''); + navigate(from, { replace: true }); + } catch (err) { + if (!err?.response) { + setErrMsg('No Server Response'); + } else if (err.response?.status === 400) { + setErrMsg('Missing Username or Password'); + } else if (err.response?.status === 401) { + setErrMsg('Unauthorized'); + } else { + setErrMsg('Login Failed'); + } + errRef.current.focus(); + } + } + + return ( + +
+

{errMsg}

+

Sign In

+
+ + setUser(e.target.value)} + value={user} + required + /> + + + setPwd(e.target.value)} + value={pwd} + required + /> + +
+

+ Need an Account?
+ + Sign Up + +

+
+ + ) +} + +export default Login diff --git a/src/LoginPage/Register.jsx b/src/LoginPage/Register.jsx new file mode 100644 index 0000000..5c790cf --- /dev/null +++ b/src/LoginPage/Register.jsx @@ -0,0 +1,183 @@ +import { useRef, useState, useEffect } from "react"; +import { faCheck, faTimes, faInfoCircle } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import axios from '../api/axios'; +import { Link } from "react-router-dom"; + +const USER_REGEX = /^[A-z][A-z0-9-_]{3,23}$/; +const PWD_REGEX = /^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#$%]).{8,24}$/; +const REGISTER_URL = '/register'; + +const Register = () => { + const userRef = useRef(); + const errRef = useRef(); + + const [user, setUser] = useState(''); + const [validName, setValidName] = useState(false); + const [userFocus, setUserFocus] = useState(false); + + const [pwd, setPwd] = useState(''); + const [validPwd, setValidPwd] = useState(false); + const [pwdFocus, setPwdFocus] = useState(false); + + const [matchPwd, setMatchPwd] = useState(''); + const [validMatch, setValidMatch] = useState(false); + const [matchFocus, setMatchFocus] = useState(false); + + const [errMsg, setErrMsg] = useState(''); + const [success, setSuccess] = useState(false); + + useEffect(() => { + userRef.current.focus(); + }, []) + + useEffect(() => { + setValidName(USER_REGEX.test(user)); + }, [user]) + + useEffect(() => { + setValidPwd(PWD_REGEX.test(pwd)); + setValidMatch(pwd === matchPwd); + }, [pwd, matchPwd]) + + useEffect(() => { + setErrMsg(''); + }, [user, pwd, matchPwd]) + + const handleSubmit = async (e) => { + e.preventDefault(); + // if button enabled with JS hack + const v1 = USER_REGEX.test(user); + const v2 = PWD_REGEX.test(pwd); + if (!v1 || !v2) { + setErrMsg("Invalid Entry"); + return; + } + try { + const response = await axios.post(REGISTER_URL, + JSON.stringify({ user, pwd }), + { + headers: { 'Content-Type': 'application/json' }, + withCredentials: true + } + ); + // TODO: remove console.logs before deployment + console.log(JSON.stringify(response?.data)); + //console.log(JSON.stringify(response)) + setSuccess(true); + //clear state and controlled inputs + setUser(''); + setPwd(''); + setMatchPwd(''); + } catch (err) { + if (!err?.response) { + setErrMsg('No Server Response'); + } else if (err.response?.status === 409) { + setErrMsg('Username Taken'); + } else { + setErrMsg('Registration Failed') + } + errRef.current.focus(); + } + } + + return ( + <> + {success ? ( +
+

Success!

+

+ Sign In +

+
+ ) : ( +
+

{errMsg}

+

Register

+
+ + setUser(e.target.value)} + value={user} + required + aria-invalid={validName ? "false" : "true"} + aria-describedby="uidnote" + onFocus={() => setUserFocus(true)} + onBlur={() => setUserFocus(false)} + /> +

+ + 4 to 24 characters.
+ Must begin with a letter.
+ Letters, numbers, underscores, hyphens allowed. +

+ + + + setPwd(e.target.value)} + value={pwd} + required + aria-invalid={validPwd ? "false" : "true"} + aria-describedby="pwdnote" + onFocus={() => setPwdFocus(true)} + onBlur={() => setPwdFocus(false)} + /> +

+ + 8 to 24 characters.
+ Must include uppercase and lowercase letters, a number and a special character.
+ Allowed special characters: ! @ # $ % +

+ + + + setMatchPwd(e.target.value)} + value={matchPwd} + required + aria-invalid={validMatch ? "false" : "true"} + aria-describedby="confirmnote" + onFocus={() => setMatchFocus(true)} + onBlur={() => setMatchFocus(false)} + /> +

+ + Must match the first password input field. +

+ + +
+

+ Already registered?
+ + Sign In + +

+
+ )} + + ) +} + +export default Register diff --git a/src/LoginPage/RequireAuth.jsx b/src/LoginPage/RequireAuth.jsx new file mode 100644 index 0000000..7d450fc --- /dev/null +++ b/src/LoginPage/RequireAuth.jsx @@ -0,0 +1,17 @@ +import { useLocation, Navigate, Outlet } from "react-router-dom"; +import useAuth from "../hooks/useAuth"; + +const RequireAuth = ({ allowedRoles }) => { + const { auth } = useAuth(); + const location = useLocation(); + + return ( + auth?.roles?.find(role => allowedRoles?.includes(role)) + ? + : auth?.user + ? + : + ); +} + +export default RequireAuth; \ No newline at end of file diff --git a/src/LoginPage/Unauthorized.jsx b/src/LoginPage/Unauthorized.jsx new file mode 100644 index 0000000..22bbdcf --- /dev/null +++ b/src/LoginPage/Unauthorized.jsx @@ -0,0 +1,20 @@ +import { useNavigate } from "react-router-dom" + +const Unauthorized = () => { + const navigate = useNavigate(); + + const goBack = () => navigate(-1); + + return ( +
+

Unauthorized

+
+

You do not have access to the requested page.

+
+ +
+
+ ) +} + +export default Unauthorized diff --git a/src/LoginPage/Users.jsx b/src/LoginPage/Users.jsx new file mode 100644 index 0000000..4233224 --- /dev/null +++ b/src/LoginPage/Users.jsx @@ -0,0 +1,50 @@ +import { useState, useEffect } from "react"; +import useAxiosPrivate from "../hooks/useAxiosPrivate"; +import { useNavigate, useLocation } from "react-router-dom"; + +const Users = () => { + const [users, setUsers] = useState(); + const axiosPrivate = useAxiosPrivate(); + const navigate = useNavigate(); + const location = useLocation(); + + useEffect(() => { + let isMounted = true; + const controller = new AbortController(); + + const getUsers = async () => { + try { + const response = await axiosPrivate.get('/users', { + signal: controller.signal + }); + console.log(response.data); + isMounted && setUsers(response.data); + } catch (err) { + console.error(err); + navigate('/login', { state: { from: location }, replace: true }); + } + } + + getUsers(); + + return () => { + isMounted = false; + controller.abort(); + } + }, []) + + return ( +
+

Users List

+ {users?.length + ? ( +
    + {users.map((user, i) =>
  • {user?.username}
  • )} +
+ ) :

No users to display

+ } +
+ ); +}; + +export default Users; diff --git a/src/api/axios.js b/src/api/axios.js new file mode 100644 index 0000000..8312442 --- /dev/null +++ b/src/api/axios.js @@ -0,0 +1,12 @@ +import axios from './axios'; +const BASE_URL = 'http://localhost:3500'; + +export default axios.create({ + baseURL: BASE_URL +}); + +export const axiosPrivate = axios.create({ + baseURL: BASE_URL, + headers: { 'Content-Type': 'application/json' }, + withCredentials: true +}); \ No newline at end of file diff --git a/src/context/AuthProvider.js b/src/context/AuthProvider.js new file mode 100644 index 0000000..934dcd7 --- /dev/null +++ b/src/context/AuthProvider.js @@ -0,0 +1,15 @@ +import { createContext, useState } from "react"; + +const AuthContext = createContext({}); + +export const AuthProvider = ({ children }) => { + const [auth, setAuth] = useState({}); + + return ( + + {children} + + ) +} + +export default AuthContext; \ No newline at end of file diff --git a/src/hooks/useAuth.js b/src/hooks/useAuth.js new file mode 100644 index 0000000..00baafe --- /dev/null +++ b/src/hooks/useAuth.js @@ -0,0 +1,10 @@ +import { useContext, useDebugValue } from "react"; +import AuthContext from "../context/AuthProvider"; + +const useAuth = () => { + const { auth } = useContext(AuthContext); + useDebugValue(auth, auth => auth?.user ? "Logged In" : "Logged Out") + return useContext(AuthContext); +} + +export default useAuth; \ No newline at end of file diff --git a/src/hooks/useAxiosPrivate.js b/src/hooks/useAxiosPrivate.js new file mode 100644 index 0000000..a0c0959 --- /dev/null +++ b/src/hooks/useAxiosPrivate.js @@ -0,0 +1,44 @@ +import { axiosPrivate } from "../api/axios"; +import { useEffect } from "react"; +import useRefreshToken from "./useRefreshToken"; +import useAuth from "./useAuth"; + +const useAxiosPrivate = () => { + const refresh = useRefreshToken(); + const { auth } = useAuth(); + + useEffect(() => { + + const requestIntercept = axiosPrivate.interceptors.request.use( + config => { + if (!config.headers['Authorization']) { + config.headers['Authorization'] = `Bearer ${auth?.accessToken}`; + } + return config; + }, (error) => Promise.reject(error) + ); + + const responseIntercept = axiosPrivate.interceptors.response.use( + response => response, + async (error) => { + const prevRequest = error?.config; + if (error?.response?.status === 403 && !prevRequest?.sent) { + prevRequest.sent = true; + const newAccessToken = await refresh(); + prevRequest.headers['Authorization'] = `Bearer ${newAccessToken}`; + return axiosPrivate(prevRequest); + } + return Promise.reject(error); + } + ); + + return () => { + axiosPrivate.interceptors.request.eject(requestIntercept); + axiosPrivate.interceptors.response.eject(responseIntercept); + } + }, [auth, refresh]) + + return axiosPrivate; +} + +export default useAxiosPrivate; \ No newline at end of file diff --git a/src/hooks/useRefreshToken.js b/src/hooks/useRefreshToken.js new file mode 100644 index 0000000..52d5cfc --- /dev/null +++ b/src/hooks/useRefreshToken.js @@ -0,0 +1,21 @@ +import axios from '../api/axios'; +import useAuth from './useAuth'; + +const useRefreshToken = () => { + const { setAuth } = useAuth(); + + const refresh = async () => { + const response = await axios.get('/refresh', { + withCredentials: true + }); + setAuth(prev => { + console.log(JSON.stringify(prev)); + console.log(response.data.accessToken); + return { ...prev, accessToken: response.data.accessToken } + }); + return response.data.accessToken; + } + return refresh; +}; + +export default useRefreshToken; diff --git a/src/index.js b/src/index.js index 97b50ee..824396d 100644 --- a/src/index.js +++ b/src/index.js @@ -1,17 +1,27 @@ import React from 'react'; import ReactDOM from 'react-dom/client'; import './index.css'; +import './Login.css'; + import App from './App'; import reportWebVitals from './reportWebVitals'; +import { AuthProvider } from './context/AuthProvider'; +import { BrowserRouter, Routes, Route } from 'react-router-dom'; import "@fontsource/poppins"; // Defaults to weight 400 const root = ReactDOM.createRoot(document.getElementById('root')); root.render( - - + + + + } /> + + + + , + document.getElementById('root') ); - // If you want to start measuring performance in your app, pass a function // to log results (for example: reportWebVitals(console.log)) // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals From 290f7b5b6760637f9cb9858b2b669fa12e27c5a4 Mon Sep 17 00:00:00 2001 From: MonilMehta Date: Sun, 7 Apr 2024 15:01:24 +0530 Subject: [PATCH 12/82] Revert "ansh shah@DESKTOP-5GQJ8J9 MINGW64 /d/React/React-Login-App (frontend)" This reverts commit b07422c8966e20c0dd6adf2426b5a16008c7758a. --- package-lock.json | 58 ----------- package.json | 3 - src/App.js | 36 ++----- src/Login.css | 125 ---------------------- src/LoginPage/Layout.jsx | 11 -- src/LoginPage/LinkPage.jsx | 20 ---- src/LoginPage/Login.jsx | 101 ------------------ src/LoginPage/Register.jsx | 183 --------------------------------- src/LoginPage/RequireAuth.jsx | 17 --- src/LoginPage/Unauthorized.jsx | 20 ---- src/LoginPage/Users.jsx | 50 --------- src/api/axios.js | 12 --- src/context/AuthProvider.js | 15 --- src/hooks/useAuth.js | 10 -- src/hooks/useAxiosPrivate.js | 44 -------- src/hooks/useRefreshToken.js | 21 ---- src/index.js | 16 +-- 17 files changed, 9 insertions(+), 733 deletions(-) delete mode 100644 src/Login.css delete mode 100644 src/LoginPage/Layout.jsx delete mode 100644 src/LoginPage/LinkPage.jsx delete mode 100644 src/LoginPage/Login.jsx delete mode 100644 src/LoginPage/Register.jsx delete mode 100644 src/LoginPage/RequireAuth.jsx delete mode 100644 src/LoginPage/Unauthorized.jsx delete mode 100644 src/LoginPage/Users.jsx delete mode 100644 src/api/axios.js delete mode 100644 src/context/AuthProvider.js delete mode 100644 src/hooks/useAuth.js delete mode 100644 src/hooks/useAxiosPrivate.js delete mode 100644 src/hooks/useRefreshToken.js diff --git a/package-lock.json b/package-lock.json index 4fd07cd..96b0b01 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,9 +11,6 @@ "@emotion/react": "^11.11.4", "@emotion/styled": "^11.11.5", "@fontsource/poppins": "^5.0.13", - "@fortawesome/fontawesome-free": "^6.5.2", - "@fortawesome/free-solid-svg-icons": "^6.5.2", - "@fortawesome/react-fontawesome": "^0.2.0", "@mui/icons-material": "^5.15.14", "@mui/material": "^5.15.14", "@testing-library/jest-dom": "^5.17.0", @@ -2585,61 +2582,6 @@ "resolved": "https://registry.npmjs.org/@fontsource/poppins/-/poppins-5.0.13.tgz", "integrity": "sha512-8G9odFoxH43oZpvq43fpGucm8iHm6iatu0M1LIshb+tx3/y6YBXenVED7CI4resvPz6hyDu8a2vHSh9vrpe+wQ==" }, - "node_modules/@fortawesome/fontawesome-common-types": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.2.tgz", - "integrity": "sha512-gBxPg3aVO6J0kpfHNILc+NMhXnqHumFxOmjYCFfOiLZfwhnnfhtsdA2hfJlDnj+8PjAs6kKQPenOTKj3Rf7zHw==", - "hasInstallScript": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/fontawesome-free": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.5.2.tgz", - "integrity": "sha512-hRILoInAx8GNT5IMkrtIt9blOdrqHOnPBH+k70aWUAqPZPgopb9G5EQJFpaBx/S8zp2fC+mPW349Bziuk1o28Q==", - "hasInstallScript": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/fontawesome-svg-core": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.5.2.tgz", - "integrity": "sha512-5CdaCBGl8Rh9ohNdxeeTMxIj8oc3KNBgIeLMvJosBMdslK/UnEB8rzyDRrbKdL1kDweqBPo4GT9wvnakHWucZw==", - "hasInstallScript": true, - "peer": true, - "dependencies": { - "@fortawesome/fontawesome-common-types": "6.5.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/free-solid-svg-icons": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.5.2.tgz", - "integrity": "sha512-QWFZYXFE7O1Gr1dTIp+D6UcFUF0qElOnZptpi7PBUMylJh+vFmIedVe1Ir6RM1t2tEQLLSV1k7bR4o92M+uqlw==", - "hasInstallScript": true, - "dependencies": { - "@fortawesome/fontawesome-common-types": "6.5.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/react-fontawesome": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz", - "integrity": "sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw==", - "dependencies": { - "prop-types": "^15.8.1" - }, - "peerDependencies": { - "@fortawesome/fontawesome-svg-core": "~1 || ~6", - "react": ">=16.3" - } - }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", diff --git a/package.json b/package.json index dc68758..63ede19 100644 --- a/package.json +++ b/package.json @@ -6,9 +6,6 @@ "@emotion/react": "^11.11.4", "@emotion/styled": "^11.11.5", "@fontsource/poppins": "^5.0.13", - "@fortawesome/fontawesome-free": "^6.5.2", - "@fortawesome/free-solid-svg-icons": "^6.5.2", - "@fortawesome/react-fontawesome": "^0.2.0", "@mui/icons-material": "^5.15.14", "@mui/material": "^5.15.14", "@testing-library/jest-dom": "^5.17.0", diff --git a/src/App.js b/src/App.js index 4110534..13d4801 100644 --- a/src/App.js +++ b/src/App.js @@ -1,41 +1,17 @@ import './App.css' import Home from './Pages/Home' -import { BrowserRouter, Route, Routes } from 'react-router-dom' +import {BrowserRouter,Route,Routes} from 'react-router-dom' import PostJob from './Pages/PostJob'; import ViewJob from './Pages/ViewJob'; - -import Register from './LoginPage/Register'; -import Login from './LoginPage/Login'; -import Layout from './LoginPage/Layout'; -import Unauthorized from './LoginPage/Unauthorized'; -import LinkPage from './LoginPage/LinkPage'; -import RequireAuth from './LoginPage/RequireAuth'; - -const ROLES = { - 'User': 2001 -} - function App() { return ( - + - }> - {/* public routes */} - } /> - } /> - } /> - } /> - - {/* we want to protect these routes */} - }> - } /> - } /> - } /> - - - + }/> + }/> + }/> - + ); } diff --git a/src/Login.css b/src/Login.css deleted file mode 100644 index ad4aa42..0000000 --- a/src/Login.css +++ /dev/null @@ -1,125 +0,0 @@ -@import url('https://fonts.googleapis.com/css2?family=Nunito&display=swap'); - -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -html { - font-family: 'Nunito', sans-serif; - font-size: 22px; - color: #fff; -} - -body { - min-height: 100vh; - background-color: dodgerblue; -} - -.App { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - min-height: 100vh; - padding: 1rem 0.5rem; -} - -section { - width: 100%; - max-width: 420px; - min-height: 400px; - display: flex; - flex-direction: column; - justify-content: flex-start; - padding: 1rem; - background-color: rgba(0,0,0,0.4); -} - -form { - display: flex; - flex-direction: column; - justify-content: space-evenly; - flex-grow: 1; - padding-bottom: 1rem; -} - -a, a:visited { - color: #fff; -} - -input[type="text"], -input[type="password"], -button, -textarea { - font-family: 'Nunito', sans-serif; - font-size: 22px; - padding: 0.25rem; - border-radius: 0.5rem; -} - -label, -button { - margin-top: 1rem; -} - -button { - padding: 0.5rem; -} - -li { - list-style-type: none; -} - -.instructions { - font-size: 0.75rem; - border-radius: 0.5rem; - background: #000; - color: #fff; - padding: 0.25rem; - position: relative; - bottom: -10px; -} - -.instructions > svg { - margin-right: 0.25rem; -} - -.offscreen { - position: absolute; - left: -9999px; -} - -.hide { - display: none; -} - -.valid { - color: limegreen; - margin-left: 0.25rem; -} - -.invalid { - color: red; - margin-left: 0.25rem; -} - -.errmsg { - background-color: lightpink; - color: firebrick; - font-weight: bold; - padding: 0.5rem; - margin-bottom: 0.5rem; -} - -.line { - display: inline-block; -} - -.flexGrow { - flex-grow: 1; - display: flex; - justify-content: flex-start; - align-items: flex-end; -} diff --git a/src/LoginPage/Layout.jsx b/src/LoginPage/Layout.jsx deleted file mode 100644 index 7d5a015..0000000 --- a/src/LoginPage/Layout.jsx +++ /dev/null @@ -1,11 +0,0 @@ -import { Outlet } from "react-router-dom" - -const Layout = () => { - return ( -
- -
- ) -} - -export default Layout diff --git a/src/LoginPage/LinkPage.jsx b/src/LoginPage/LinkPage.jsx deleted file mode 100644 index 3400f61..0000000 --- a/src/LoginPage/LinkPage.jsx +++ /dev/null @@ -1,20 +0,0 @@ -import { Link } from "react-router-dom" - -const LinkPage = () => { - return ( -
-

Links

-
-

Public

- Login - Register -
-

Private

- Home - Editors Page - Admin Page -
- ) -} - -export default LinkPage diff --git a/src/LoginPage/Login.jsx b/src/LoginPage/Login.jsx deleted file mode 100644 index 3cb7df1..0000000 --- a/src/LoginPage/Login.jsx +++ /dev/null @@ -1,101 +0,0 @@ -import { useRef, useState, useEffect } from 'react'; -import useAuth from '../hooks/useAuth'; -import { Link, useNavigate, useLocation } from 'react-router-dom'; - -import axios from '../api/axios'; -const LOGIN_URL = '/auth'; - -const Login = () => { - const { setAuth } = useAuth(); - - const navigate = useNavigate(); - const location = useLocation(); - const from = location.state?.from?.pathname || "/"; - - const userRef = useRef(); - const errRef = useRef(); - - const [user, setUser] = useState(''); - const [pwd, setPwd] = useState(''); - const [errMsg, setErrMsg] = useState(''); - - useEffect(() => { - userRef.current.focus(); - }, []) - - useEffect(() => { - setErrMsg(''); - }, [user, pwd]) - - const handleSubmit = async (e) => { - e.preventDefault(); - - try { - const response = await axios.post(LOGIN_URL, - JSON.stringify({ user, pwd }), - { - headers: { 'Content-Type': 'application/json' }, - withCredentials: true - } - ); - console.log(JSON.stringify(response?.data)); - //console.log(JSON.stringify(response)); - const accessToken = response?.data?.accessToken; - const roles = response?.data?.roles; - setAuth({ user, pwd, roles, accessToken }); - setUser(''); - setPwd(''); - navigate(from, { replace: true }); - } catch (err) { - if (!err?.response) { - setErrMsg('No Server Response'); - } else if (err.response?.status === 400) { - setErrMsg('Missing Username or Password'); - } else if (err.response?.status === 401) { - setErrMsg('Unauthorized'); - } else { - setErrMsg('Login Failed'); - } - errRef.current.focus(); - } - } - - return ( - -
-

{errMsg}

-

Sign In

-
- - setUser(e.target.value)} - value={user} - required - /> - - - setPwd(e.target.value)} - value={pwd} - required - /> - -
-

- Need an Account?
- - Sign Up - -

-
- - ) -} - -export default Login diff --git a/src/LoginPage/Register.jsx b/src/LoginPage/Register.jsx deleted file mode 100644 index 5c790cf..0000000 --- a/src/LoginPage/Register.jsx +++ /dev/null @@ -1,183 +0,0 @@ -import { useRef, useState, useEffect } from "react"; -import { faCheck, faTimes, faInfoCircle } from "@fortawesome/free-solid-svg-icons"; -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import axios from '../api/axios'; -import { Link } from "react-router-dom"; - -const USER_REGEX = /^[A-z][A-z0-9-_]{3,23}$/; -const PWD_REGEX = /^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#$%]).{8,24}$/; -const REGISTER_URL = '/register'; - -const Register = () => { - const userRef = useRef(); - const errRef = useRef(); - - const [user, setUser] = useState(''); - const [validName, setValidName] = useState(false); - const [userFocus, setUserFocus] = useState(false); - - const [pwd, setPwd] = useState(''); - const [validPwd, setValidPwd] = useState(false); - const [pwdFocus, setPwdFocus] = useState(false); - - const [matchPwd, setMatchPwd] = useState(''); - const [validMatch, setValidMatch] = useState(false); - const [matchFocus, setMatchFocus] = useState(false); - - const [errMsg, setErrMsg] = useState(''); - const [success, setSuccess] = useState(false); - - useEffect(() => { - userRef.current.focus(); - }, []) - - useEffect(() => { - setValidName(USER_REGEX.test(user)); - }, [user]) - - useEffect(() => { - setValidPwd(PWD_REGEX.test(pwd)); - setValidMatch(pwd === matchPwd); - }, [pwd, matchPwd]) - - useEffect(() => { - setErrMsg(''); - }, [user, pwd, matchPwd]) - - const handleSubmit = async (e) => { - e.preventDefault(); - // if button enabled with JS hack - const v1 = USER_REGEX.test(user); - const v2 = PWD_REGEX.test(pwd); - if (!v1 || !v2) { - setErrMsg("Invalid Entry"); - return; - } - try { - const response = await axios.post(REGISTER_URL, - JSON.stringify({ user, pwd }), - { - headers: { 'Content-Type': 'application/json' }, - withCredentials: true - } - ); - // TODO: remove console.logs before deployment - console.log(JSON.stringify(response?.data)); - //console.log(JSON.stringify(response)) - setSuccess(true); - //clear state and controlled inputs - setUser(''); - setPwd(''); - setMatchPwd(''); - } catch (err) { - if (!err?.response) { - setErrMsg('No Server Response'); - } else if (err.response?.status === 409) { - setErrMsg('Username Taken'); - } else { - setErrMsg('Registration Failed') - } - errRef.current.focus(); - } - } - - return ( - <> - {success ? ( -
-

Success!

-

- Sign In -

-
- ) : ( -
-

{errMsg}

-

Register

-
- - setUser(e.target.value)} - value={user} - required - aria-invalid={validName ? "false" : "true"} - aria-describedby="uidnote" - onFocus={() => setUserFocus(true)} - onBlur={() => setUserFocus(false)} - /> -

- - 4 to 24 characters.
- Must begin with a letter.
- Letters, numbers, underscores, hyphens allowed. -

- - - - setPwd(e.target.value)} - value={pwd} - required - aria-invalid={validPwd ? "false" : "true"} - aria-describedby="pwdnote" - onFocus={() => setPwdFocus(true)} - onBlur={() => setPwdFocus(false)} - /> -

- - 8 to 24 characters.
- Must include uppercase and lowercase letters, a number and a special character.
- Allowed special characters: ! @ # $ % -

- - - - setMatchPwd(e.target.value)} - value={matchPwd} - required - aria-invalid={validMatch ? "false" : "true"} - aria-describedby="confirmnote" - onFocus={() => setMatchFocus(true)} - onBlur={() => setMatchFocus(false)} - /> -

- - Must match the first password input field. -

- - -
-

- Already registered?
- - Sign In - -

-
- )} - - ) -} - -export default Register diff --git a/src/LoginPage/RequireAuth.jsx b/src/LoginPage/RequireAuth.jsx deleted file mode 100644 index 7d450fc..0000000 --- a/src/LoginPage/RequireAuth.jsx +++ /dev/null @@ -1,17 +0,0 @@ -import { useLocation, Navigate, Outlet } from "react-router-dom"; -import useAuth from "../hooks/useAuth"; - -const RequireAuth = ({ allowedRoles }) => { - const { auth } = useAuth(); - const location = useLocation(); - - return ( - auth?.roles?.find(role => allowedRoles?.includes(role)) - ? - : auth?.user - ? - : - ); -} - -export default RequireAuth; \ No newline at end of file diff --git a/src/LoginPage/Unauthorized.jsx b/src/LoginPage/Unauthorized.jsx deleted file mode 100644 index 22bbdcf..0000000 --- a/src/LoginPage/Unauthorized.jsx +++ /dev/null @@ -1,20 +0,0 @@ -import { useNavigate } from "react-router-dom" - -const Unauthorized = () => { - const navigate = useNavigate(); - - const goBack = () => navigate(-1); - - return ( -
-

Unauthorized

-
-

You do not have access to the requested page.

-
- -
-
- ) -} - -export default Unauthorized diff --git a/src/LoginPage/Users.jsx b/src/LoginPage/Users.jsx deleted file mode 100644 index 4233224..0000000 --- a/src/LoginPage/Users.jsx +++ /dev/null @@ -1,50 +0,0 @@ -import { useState, useEffect } from "react"; -import useAxiosPrivate from "../hooks/useAxiosPrivate"; -import { useNavigate, useLocation } from "react-router-dom"; - -const Users = () => { - const [users, setUsers] = useState(); - const axiosPrivate = useAxiosPrivate(); - const navigate = useNavigate(); - const location = useLocation(); - - useEffect(() => { - let isMounted = true; - const controller = new AbortController(); - - const getUsers = async () => { - try { - const response = await axiosPrivate.get('/users', { - signal: controller.signal - }); - console.log(response.data); - isMounted && setUsers(response.data); - } catch (err) { - console.error(err); - navigate('/login', { state: { from: location }, replace: true }); - } - } - - getUsers(); - - return () => { - isMounted = false; - controller.abort(); - } - }, []) - - return ( -
-

Users List

- {users?.length - ? ( -
    - {users.map((user, i) =>
  • {user?.username}
  • )} -
- ) :

No users to display

- } -
- ); -}; - -export default Users; diff --git a/src/api/axios.js b/src/api/axios.js deleted file mode 100644 index 8312442..0000000 --- a/src/api/axios.js +++ /dev/null @@ -1,12 +0,0 @@ -import axios from './axios'; -const BASE_URL = 'http://localhost:3500'; - -export default axios.create({ - baseURL: BASE_URL -}); - -export const axiosPrivate = axios.create({ - baseURL: BASE_URL, - headers: { 'Content-Type': 'application/json' }, - withCredentials: true -}); \ No newline at end of file diff --git a/src/context/AuthProvider.js b/src/context/AuthProvider.js deleted file mode 100644 index 934dcd7..0000000 --- a/src/context/AuthProvider.js +++ /dev/null @@ -1,15 +0,0 @@ -import { createContext, useState } from "react"; - -const AuthContext = createContext({}); - -export const AuthProvider = ({ children }) => { - const [auth, setAuth] = useState({}); - - return ( - - {children} - - ) -} - -export default AuthContext; \ No newline at end of file diff --git a/src/hooks/useAuth.js b/src/hooks/useAuth.js deleted file mode 100644 index 00baafe..0000000 --- a/src/hooks/useAuth.js +++ /dev/null @@ -1,10 +0,0 @@ -import { useContext, useDebugValue } from "react"; -import AuthContext from "../context/AuthProvider"; - -const useAuth = () => { - const { auth } = useContext(AuthContext); - useDebugValue(auth, auth => auth?.user ? "Logged In" : "Logged Out") - return useContext(AuthContext); -} - -export default useAuth; \ No newline at end of file diff --git a/src/hooks/useAxiosPrivate.js b/src/hooks/useAxiosPrivate.js deleted file mode 100644 index a0c0959..0000000 --- a/src/hooks/useAxiosPrivate.js +++ /dev/null @@ -1,44 +0,0 @@ -import { axiosPrivate } from "../api/axios"; -import { useEffect } from "react"; -import useRefreshToken from "./useRefreshToken"; -import useAuth from "./useAuth"; - -const useAxiosPrivate = () => { - const refresh = useRefreshToken(); - const { auth } = useAuth(); - - useEffect(() => { - - const requestIntercept = axiosPrivate.interceptors.request.use( - config => { - if (!config.headers['Authorization']) { - config.headers['Authorization'] = `Bearer ${auth?.accessToken}`; - } - return config; - }, (error) => Promise.reject(error) - ); - - const responseIntercept = axiosPrivate.interceptors.response.use( - response => response, - async (error) => { - const prevRequest = error?.config; - if (error?.response?.status === 403 && !prevRequest?.sent) { - prevRequest.sent = true; - const newAccessToken = await refresh(); - prevRequest.headers['Authorization'] = `Bearer ${newAccessToken}`; - return axiosPrivate(prevRequest); - } - return Promise.reject(error); - } - ); - - return () => { - axiosPrivate.interceptors.request.eject(requestIntercept); - axiosPrivate.interceptors.response.eject(responseIntercept); - } - }, [auth, refresh]) - - return axiosPrivate; -} - -export default useAxiosPrivate; \ No newline at end of file diff --git a/src/hooks/useRefreshToken.js b/src/hooks/useRefreshToken.js deleted file mode 100644 index 52d5cfc..0000000 --- a/src/hooks/useRefreshToken.js +++ /dev/null @@ -1,21 +0,0 @@ -import axios from '../api/axios'; -import useAuth from './useAuth'; - -const useRefreshToken = () => { - const { setAuth } = useAuth(); - - const refresh = async () => { - const response = await axios.get('/refresh', { - withCredentials: true - }); - setAuth(prev => { - console.log(JSON.stringify(prev)); - console.log(response.data.accessToken); - return { ...prev, accessToken: response.data.accessToken } - }); - return response.data.accessToken; - } - return refresh; -}; - -export default useRefreshToken; diff --git a/src/index.js b/src/index.js index 824396d..97b50ee 100644 --- a/src/index.js +++ b/src/index.js @@ -1,27 +1,17 @@ import React from 'react'; import ReactDOM from 'react-dom/client'; import './index.css'; -import './Login.css'; - import App from './App'; import reportWebVitals from './reportWebVitals'; -import { AuthProvider } from './context/AuthProvider'; -import { BrowserRouter, Routes, Route } from 'react-router-dom'; import "@fontsource/poppins"; // Defaults to weight 400 const root = ReactDOM.createRoot(document.getElementById('root')); root.render( - - - - } /> - - - - , - document.getElementById('root') + + ); + // If you want to start measuring performance in your app, pass a function // to log results (for example: reportWebVitals(console.log)) // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals From a77251055806b3bd161c6d3fc989c842a463c129 Mon Sep 17 00:00:00 2001 From: Divya Gandhi Date: Sun, 7 Apr 2024 16:33:16 +0530 Subject: [PATCH 13/82] NewPost UploadPost --- src/App.js | 28 +--- src/Components/Home/Sidebar.jsx | 6 +- src/Components/NewPost/NewPost.jsx | 33 +++++ src/Components/Upload/UploadNotes.jsx | 44 +++++++ src/Login.css | 125 ------------------ src/LoginPage/Layout.jsx | 11 -- src/LoginPage/LinkPage.jsx | 20 --- src/LoginPage/Login.jsx | 101 -------------- src/LoginPage/Register.jsx | 183 -------------------------- src/LoginPage/RequireAuth.jsx | 17 --- src/LoginPage/Unauthorized.jsx | 20 --- src/LoginPage/Users.jsx | 50 ------- src/Pages/Home.jsx | 6 +- src/Pages/NewPostPage.jsx | 17 +++ src/Pages/UploadNewPosts.jsx | 16 +++ src/api/axios.js | 12 -- src/context/AuthProvider.js | 15 --- src/hooks/useAuth.js | 10 -- src/hooks/useAxiosPrivate.js | 44 ------- src/hooks/useRefreshToken.js | 21 --- src/index.js | 18 +-- 21 files changed, 125 insertions(+), 672 deletions(-) create mode 100644 src/Components/NewPost/NewPost.jsx create mode 100644 src/Components/Upload/UploadNotes.jsx delete mode 100644 src/Login.css delete mode 100644 src/LoginPage/Layout.jsx delete mode 100644 src/LoginPage/LinkPage.jsx delete mode 100644 src/LoginPage/Login.jsx delete mode 100644 src/LoginPage/Register.jsx delete mode 100644 src/LoginPage/RequireAuth.jsx delete mode 100644 src/LoginPage/Unauthorized.jsx delete mode 100644 src/LoginPage/Users.jsx create mode 100644 src/Pages/NewPostPage.jsx create mode 100644 src/Pages/UploadNewPosts.jsx delete mode 100644 src/api/axios.js delete mode 100644 src/context/AuthProvider.js delete mode 100644 src/hooks/useAuth.js delete mode 100644 src/hooks/useAxiosPrivate.js delete mode 100644 src/hooks/useRefreshToken.js diff --git a/src/App.js b/src/App.js index 4110534..456fe8c 100644 --- a/src/App.js +++ b/src/App.js @@ -3,37 +3,19 @@ import Home from './Pages/Home' import { BrowserRouter, Route, Routes } from 'react-router-dom' import PostJob from './Pages/PostJob'; import ViewJob from './Pages/ViewJob'; - -import Register from './LoginPage/Register'; -import Login from './LoginPage/Login'; -import Layout from './LoginPage/Layout'; -import Unauthorized from './LoginPage/Unauthorized'; -import LinkPage from './LoginPage/LinkPage'; -import RequireAuth from './LoginPage/RequireAuth'; - -const ROLES = { - 'User': 2001 -} +import NewPost from './Pages/NewPostPage'; +import UploadNewPosts from './Pages/UploadNewPosts'; function App() { return ( - }> - {/* public routes */} - } /> - } /> - } /> - } /> - - {/* we want to protect these routes */} - }> + } /> + }/> } /> } /> - - - + }/> ); diff --git a/src/Components/Home/Sidebar.jsx b/src/Components/Home/Sidebar.jsx index 56d5794..ae679d2 100644 --- a/src/Components/Home/Sidebar.jsx +++ b/src/Components/Home/Sidebar.jsx @@ -25,14 +25,14 @@ const Sidebar = () => { } return ( -
+
{!isOpen && (
)} -
-
+
+
diff --git a/src/Components/NewPost/NewPost.jsx b/src/Components/NewPost/NewPost.jsx new file mode 100644 index 0000000..26fae94 --- /dev/null +++ b/src/Components/NewPost/NewPost.jsx @@ -0,0 +1,33 @@ +import React from 'react' +import CloudUploadOutlinedIcon from '@mui/icons-material/CloudUploadOutlined'; +function NewPost() { + return ( +
+

+ Create New Post +

+
+

Post title

+ +

Post Category

+ +

Post Description

+ +

Upload Images

+
+ +
+ + +
+
+
+ +
+
+
+
+ ) +} + +export default NewPost \ No newline at end of file diff --git a/src/Components/Upload/UploadNotes.jsx b/src/Components/Upload/UploadNotes.jsx new file mode 100644 index 0000000..3a07108 --- /dev/null +++ b/src/Components/Upload/UploadNotes.jsx @@ -0,0 +1,44 @@ +import React from 'react' +import CloudUploadOutlinedIcon from '@mui/icons-material/CloudUploadOutlined'; +function UploadNotes() { + return ( +
+

+ Upload Notes +

+
+

Notes title

+ +
+
+

Subject

+ + +
+
+

Department

+ + +
+
+ +

Notes Description

+ +

Upload Images

+
+ +
+ + +
+
+
+ +
+
+
+
+ ) +} + +export default UploadNotes \ No newline at end of file diff --git a/src/Login.css b/src/Login.css deleted file mode 100644 index ad4aa42..0000000 --- a/src/Login.css +++ /dev/null @@ -1,125 +0,0 @@ -@import url('https://fonts.googleapis.com/css2?family=Nunito&display=swap'); - -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -html { - font-family: 'Nunito', sans-serif; - font-size: 22px; - color: #fff; -} - -body { - min-height: 100vh; - background-color: dodgerblue; -} - -.App { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - min-height: 100vh; - padding: 1rem 0.5rem; -} - -section { - width: 100%; - max-width: 420px; - min-height: 400px; - display: flex; - flex-direction: column; - justify-content: flex-start; - padding: 1rem; - background-color: rgba(0,0,0,0.4); -} - -form { - display: flex; - flex-direction: column; - justify-content: space-evenly; - flex-grow: 1; - padding-bottom: 1rem; -} - -a, a:visited { - color: #fff; -} - -input[type="text"], -input[type="password"], -button, -textarea { - font-family: 'Nunito', sans-serif; - font-size: 22px; - padding: 0.25rem; - border-radius: 0.5rem; -} - -label, -button { - margin-top: 1rem; -} - -button { - padding: 0.5rem; -} - -li { - list-style-type: none; -} - -.instructions { - font-size: 0.75rem; - border-radius: 0.5rem; - background: #000; - color: #fff; - padding: 0.25rem; - position: relative; - bottom: -10px; -} - -.instructions > svg { - margin-right: 0.25rem; -} - -.offscreen { - position: absolute; - left: -9999px; -} - -.hide { - display: none; -} - -.valid { - color: limegreen; - margin-left: 0.25rem; -} - -.invalid { - color: red; - margin-left: 0.25rem; -} - -.errmsg { - background-color: lightpink; - color: firebrick; - font-weight: bold; - padding: 0.5rem; - margin-bottom: 0.5rem; -} - -.line { - display: inline-block; -} - -.flexGrow { - flex-grow: 1; - display: flex; - justify-content: flex-start; - align-items: flex-end; -} diff --git a/src/LoginPage/Layout.jsx b/src/LoginPage/Layout.jsx deleted file mode 100644 index 7d5a015..0000000 --- a/src/LoginPage/Layout.jsx +++ /dev/null @@ -1,11 +0,0 @@ -import { Outlet } from "react-router-dom" - -const Layout = () => { - return ( -
- -
- ) -} - -export default Layout diff --git a/src/LoginPage/LinkPage.jsx b/src/LoginPage/LinkPage.jsx deleted file mode 100644 index 3400f61..0000000 --- a/src/LoginPage/LinkPage.jsx +++ /dev/null @@ -1,20 +0,0 @@ -import { Link } from "react-router-dom" - -const LinkPage = () => { - return ( -
-

Links

-
-

Public

- Login - Register -
-

Private

- Home - Editors Page - Admin Page -
- ) -} - -export default LinkPage diff --git a/src/LoginPage/Login.jsx b/src/LoginPage/Login.jsx deleted file mode 100644 index 3cb7df1..0000000 --- a/src/LoginPage/Login.jsx +++ /dev/null @@ -1,101 +0,0 @@ -import { useRef, useState, useEffect } from 'react'; -import useAuth from '../hooks/useAuth'; -import { Link, useNavigate, useLocation } from 'react-router-dom'; - -import axios from '../api/axios'; -const LOGIN_URL = '/auth'; - -const Login = () => { - const { setAuth } = useAuth(); - - const navigate = useNavigate(); - const location = useLocation(); - const from = location.state?.from?.pathname || "/"; - - const userRef = useRef(); - const errRef = useRef(); - - const [user, setUser] = useState(''); - const [pwd, setPwd] = useState(''); - const [errMsg, setErrMsg] = useState(''); - - useEffect(() => { - userRef.current.focus(); - }, []) - - useEffect(() => { - setErrMsg(''); - }, [user, pwd]) - - const handleSubmit = async (e) => { - e.preventDefault(); - - try { - const response = await axios.post(LOGIN_URL, - JSON.stringify({ user, pwd }), - { - headers: { 'Content-Type': 'application/json' }, - withCredentials: true - } - ); - console.log(JSON.stringify(response?.data)); - //console.log(JSON.stringify(response)); - const accessToken = response?.data?.accessToken; - const roles = response?.data?.roles; - setAuth({ user, pwd, roles, accessToken }); - setUser(''); - setPwd(''); - navigate(from, { replace: true }); - } catch (err) { - if (!err?.response) { - setErrMsg('No Server Response'); - } else if (err.response?.status === 400) { - setErrMsg('Missing Username or Password'); - } else if (err.response?.status === 401) { - setErrMsg('Unauthorized'); - } else { - setErrMsg('Login Failed'); - } - errRef.current.focus(); - } - } - - return ( - -
-

{errMsg}

-

Sign In

-
- - setUser(e.target.value)} - value={user} - required - /> - - - setPwd(e.target.value)} - value={pwd} - required - /> - -
-

- Need an Account?
- - Sign Up - -

-
- - ) -} - -export default Login diff --git a/src/LoginPage/Register.jsx b/src/LoginPage/Register.jsx deleted file mode 100644 index 5c790cf..0000000 --- a/src/LoginPage/Register.jsx +++ /dev/null @@ -1,183 +0,0 @@ -import { useRef, useState, useEffect } from "react"; -import { faCheck, faTimes, faInfoCircle } from "@fortawesome/free-solid-svg-icons"; -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import axios from '../api/axios'; -import { Link } from "react-router-dom"; - -const USER_REGEX = /^[A-z][A-z0-9-_]{3,23}$/; -const PWD_REGEX = /^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#$%]).{8,24}$/; -const REGISTER_URL = '/register'; - -const Register = () => { - const userRef = useRef(); - const errRef = useRef(); - - const [user, setUser] = useState(''); - const [validName, setValidName] = useState(false); - const [userFocus, setUserFocus] = useState(false); - - const [pwd, setPwd] = useState(''); - const [validPwd, setValidPwd] = useState(false); - const [pwdFocus, setPwdFocus] = useState(false); - - const [matchPwd, setMatchPwd] = useState(''); - const [validMatch, setValidMatch] = useState(false); - const [matchFocus, setMatchFocus] = useState(false); - - const [errMsg, setErrMsg] = useState(''); - const [success, setSuccess] = useState(false); - - useEffect(() => { - userRef.current.focus(); - }, []) - - useEffect(() => { - setValidName(USER_REGEX.test(user)); - }, [user]) - - useEffect(() => { - setValidPwd(PWD_REGEX.test(pwd)); - setValidMatch(pwd === matchPwd); - }, [pwd, matchPwd]) - - useEffect(() => { - setErrMsg(''); - }, [user, pwd, matchPwd]) - - const handleSubmit = async (e) => { - e.preventDefault(); - // if button enabled with JS hack - const v1 = USER_REGEX.test(user); - const v2 = PWD_REGEX.test(pwd); - if (!v1 || !v2) { - setErrMsg("Invalid Entry"); - return; - } - try { - const response = await axios.post(REGISTER_URL, - JSON.stringify({ user, pwd }), - { - headers: { 'Content-Type': 'application/json' }, - withCredentials: true - } - ); - // TODO: remove console.logs before deployment - console.log(JSON.stringify(response?.data)); - //console.log(JSON.stringify(response)) - setSuccess(true); - //clear state and controlled inputs - setUser(''); - setPwd(''); - setMatchPwd(''); - } catch (err) { - if (!err?.response) { - setErrMsg('No Server Response'); - } else if (err.response?.status === 409) { - setErrMsg('Username Taken'); - } else { - setErrMsg('Registration Failed') - } - errRef.current.focus(); - } - } - - return ( - <> - {success ? ( -
-

Success!

-

- Sign In -

-
- ) : ( -
-

{errMsg}

-

Register

-
- - setUser(e.target.value)} - value={user} - required - aria-invalid={validName ? "false" : "true"} - aria-describedby="uidnote" - onFocus={() => setUserFocus(true)} - onBlur={() => setUserFocus(false)} - /> -

- - 4 to 24 characters.
- Must begin with a letter.
- Letters, numbers, underscores, hyphens allowed. -

- - - - setPwd(e.target.value)} - value={pwd} - required - aria-invalid={validPwd ? "false" : "true"} - aria-describedby="pwdnote" - onFocus={() => setPwdFocus(true)} - onBlur={() => setPwdFocus(false)} - /> -

- - 8 to 24 characters.
- Must include uppercase and lowercase letters, a number and a special character.
- Allowed special characters: ! @ # $ % -

- - - - setMatchPwd(e.target.value)} - value={matchPwd} - required - aria-invalid={validMatch ? "false" : "true"} - aria-describedby="confirmnote" - onFocus={() => setMatchFocus(true)} - onBlur={() => setMatchFocus(false)} - /> -

- - Must match the first password input field. -

- - -
-

- Already registered?
- - Sign In - -

-
- )} - - ) -} - -export default Register diff --git a/src/LoginPage/RequireAuth.jsx b/src/LoginPage/RequireAuth.jsx deleted file mode 100644 index 7d450fc..0000000 --- a/src/LoginPage/RequireAuth.jsx +++ /dev/null @@ -1,17 +0,0 @@ -import { useLocation, Navigate, Outlet } from "react-router-dom"; -import useAuth from "../hooks/useAuth"; - -const RequireAuth = ({ allowedRoles }) => { - const { auth } = useAuth(); - const location = useLocation(); - - return ( - auth?.roles?.find(role => allowedRoles?.includes(role)) - ? - : auth?.user - ? - : - ); -} - -export default RequireAuth; \ No newline at end of file diff --git a/src/LoginPage/Unauthorized.jsx b/src/LoginPage/Unauthorized.jsx deleted file mode 100644 index 22bbdcf..0000000 --- a/src/LoginPage/Unauthorized.jsx +++ /dev/null @@ -1,20 +0,0 @@ -import { useNavigate } from "react-router-dom" - -const Unauthorized = () => { - const navigate = useNavigate(); - - const goBack = () => navigate(-1); - - return ( -
-

Unauthorized

-
-

You do not have access to the requested page.

-
- -
-
- ) -} - -export default Unauthorized diff --git a/src/LoginPage/Users.jsx b/src/LoginPage/Users.jsx deleted file mode 100644 index 4233224..0000000 --- a/src/LoginPage/Users.jsx +++ /dev/null @@ -1,50 +0,0 @@ -import { useState, useEffect } from "react"; -import useAxiosPrivate from "../hooks/useAxiosPrivate"; -import { useNavigate, useLocation } from "react-router-dom"; - -const Users = () => { - const [users, setUsers] = useState(); - const axiosPrivate = useAxiosPrivate(); - const navigate = useNavigate(); - const location = useLocation(); - - useEffect(() => { - let isMounted = true; - const controller = new AbortController(); - - const getUsers = async () => { - try { - const response = await axiosPrivate.get('/users', { - signal: controller.signal - }); - console.log(response.data); - isMounted && setUsers(response.data); - } catch (err) { - console.error(err); - navigate('/login', { state: { from: location }, replace: true }); - } - } - - getUsers(); - - return () => { - isMounted = false; - controller.abort(); - } - }, []) - - return ( -
-

Users List

- {users?.length - ? ( -
    - {users.map((user, i) =>
  • {user?.username}
  • )} -
- ) :

No users to display

- } -
- ); -}; - -export default Users; diff --git a/src/Pages/Home.jsx b/src/Pages/Home.jsx index a54faef..00094da 100644 --- a/src/Pages/Home.jsx +++ b/src/Pages/Home.jsx @@ -4,13 +4,13 @@ import JobOpportunity from '../Components/Home/JobOpportunity' import LatestPosts from '../Components/Home/LatestPosts' import ShareNotes from '../Components/Home/ShareNotes' import SharedResources from '../Components/Home/SharedResources' -import Sidebarresponsive from '../Components/Home/Sidebarresponsive' + function Home() { return ( -
+
-
+
diff --git a/src/Pages/NewPostPage.jsx b/src/Pages/NewPostPage.jsx new file mode 100644 index 0000000..0bdbca2 --- /dev/null +++ b/src/Pages/NewPostPage.jsx @@ -0,0 +1,17 @@ +import React from 'react' +import NewPost from '../Components/NewPost/NewPost' +import Sidebar from '../Components/Home/Sidebar' +function NewPostPage() { + return ( + +
+ +
+ +
+
+ + ) +} + +export default NewPostPage \ No newline at end of file diff --git a/src/Pages/UploadNewPosts.jsx b/src/Pages/UploadNewPosts.jsx new file mode 100644 index 0000000..a6eeea9 --- /dev/null +++ b/src/Pages/UploadNewPosts.jsx @@ -0,0 +1,16 @@ +import React from 'react' +import Sidebar from '../Components/Home/Sidebar' +import UploadNotes from '../Components/Upload/UploadNotes' + +function UploadNewPosts() { + return ( +
+ +
+ +
+
+ ) +} + +export default UploadNewPosts \ No newline at end of file diff --git a/src/api/axios.js b/src/api/axios.js deleted file mode 100644 index 8312442..0000000 --- a/src/api/axios.js +++ /dev/null @@ -1,12 +0,0 @@ -import axios from './axios'; -const BASE_URL = 'http://localhost:3500'; - -export default axios.create({ - baseURL: BASE_URL -}); - -export const axiosPrivate = axios.create({ - baseURL: BASE_URL, - headers: { 'Content-Type': 'application/json' }, - withCredentials: true -}); \ No newline at end of file diff --git a/src/context/AuthProvider.js b/src/context/AuthProvider.js deleted file mode 100644 index 934dcd7..0000000 --- a/src/context/AuthProvider.js +++ /dev/null @@ -1,15 +0,0 @@ -import { createContext, useState } from "react"; - -const AuthContext = createContext({}); - -export const AuthProvider = ({ children }) => { - const [auth, setAuth] = useState({}); - - return ( - - {children} - - ) -} - -export default AuthContext; \ No newline at end of file diff --git a/src/hooks/useAuth.js b/src/hooks/useAuth.js deleted file mode 100644 index 00baafe..0000000 --- a/src/hooks/useAuth.js +++ /dev/null @@ -1,10 +0,0 @@ -import { useContext, useDebugValue } from "react"; -import AuthContext from "../context/AuthProvider"; - -const useAuth = () => { - const { auth } = useContext(AuthContext); - useDebugValue(auth, auth => auth?.user ? "Logged In" : "Logged Out") - return useContext(AuthContext); -} - -export default useAuth; \ No newline at end of file diff --git a/src/hooks/useAxiosPrivate.js b/src/hooks/useAxiosPrivate.js deleted file mode 100644 index a0c0959..0000000 --- a/src/hooks/useAxiosPrivate.js +++ /dev/null @@ -1,44 +0,0 @@ -import { axiosPrivate } from "../api/axios"; -import { useEffect } from "react"; -import useRefreshToken from "./useRefreshToken"; -import useAuth from "./useAuth"; - -const useAxiosPrivate = () => { - const refresh = useRefreshToken(); - const { auth } = useAuth(); - - useEffect(() => { - - const requestIntercept = axiosPrivate.interceptors.request.use( - config => { - if (!config.headers['Authorization']) { - config.headers['Authorization'] = `Bearer ${auth?.accessToken}`; - } - return config; - }, (error) => Promise.reject(error) - ); - - const responseIntercept = axiosPrivate.interceptors.response.use( - response => response, - async (error) => { - const prevRequest = error?.config; - if (error?.response?.status === 403 && !prevRequest?.sent) { - prevRequest.sent = true; - const newAccessToken = await refresh(); - prevRequest.headers['Authorization'] = `Bearer ${newAccessToken}`; - return axiosPrivate(prevRequest); - } - return Promise.reject(error); - } - ); - - return () => { - axiosPrivate.interceptors.request.eject(requestIntercept); - axiosPrivate.interceptors.response.eject(responseIntercept); - } - }, [auth, refresh]) - - return axiosPrivate; -} - -export default useAxiosPrivate; \ No newline at end of file diff --git a/src/hooks/useRefreshToken.js b/src/hooks/useRefreshToken.js deleted file mode 100644 index 52d5cfc..0000000 --- a/src/hooks/useRefreshToken.js +++ /dev/null @@ -1,21 +0,0 @@ -import axios from '../api/axios'; -import useAuth from './useAuth'; - -const useRefreshToken = () => { - const { setAuth } = useAuth(); - - const refresh = async () => { - const response = await axios.get('/refresh', { - withCredentials: true - }); - setAuth(prev => { - console.log(JSON.stringify(prev)); - console.log(response.data.accessToken); - return { ...prev, accessToken: response.data.accessToken } - }); - return response.data.accessToken; - } - return refresh; -}; - -export default useRefreshToken; diff --git a/src/index.js b/src/index.js index 824396d..35a930a 100644 --- a/src/index.js +++ b/src/index.js @@ -1,28 +1,18 @@ import React from 'react'; import ReactDOM from 'react-dom/client'; import './index.css'; -import './Login.css'; - import App from './App'; import reportWebVitals from './reportWebVitals'; -import { AuthProvider } from './context/AuthProvider'; -import { BrowserRouter, Routes, Route } from 'react-router-dom'; -import "@fontsource/poppins"; // Defaults to weight 400 const root = ReactDOM.createRoot(document.getElementById('root')); root.render( - - - - } /> - - - - , - document.getElementById('root') + + ); + // If you want to start measuring performance in your app, pass a function // to log results (for example: reportWebVitals(console.log)) // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals reportWebVitals(); + From a355dc9da8780f80138e43e012d4e047917ac15d Mon Sep 17 00:00:00 2001 From: Divya Gandhi Date: Sun, 7 Apr 2024 16:40:26 +0530 Subject: [PATCH 14/82] Changes --- src/App.js | 26 ++++++++------------------ src/index.js | 6 +----- 2 files changed, 9 insertions(+), 23 deletions(-) diff --git a/src/App.js b/src/App.js index 1329519..fcbcd41 100644 --- a/src/App.js +++ b/src/App.js @@ -1,32 +1,22 @@ import './App.css' import Home from './Pages/Home' -import {BrowserRouter,Route,Routes} from 'react-router-dom' +import { BrowserRouter, Route, Routes } from 'react-router-dom' import PostJob from './Pages/PostJob'; import ViewJob from './Pages/ViewJob'; -<<<<<<< HEAD import NewPost from './Pages/NewPostPage'; import UploadNewPosts from './Pages/UploadNewPosts'; -======= ->>>>>>> 290f7b5b6760637f9cb9858b2b669fa12e27c5a4 function App() { return ( - + -<<<<<<< HEAD - - } /> - }/> - } /> - } /> - }/> -======= - }/> - }/> - }/> ->>>>>>> 290f7b5b6760637f9cb9858b2b669fa12e27c5a4 + } /> + } /> + } /> + } /> + } /> - + ); } diff --git a/src/index.js b/src/index.js index 557263a..03466f8 100644 --- a/src/index.js +++ b/src/index.js @@ -1,12 +1,9 @@ import React from 'react'; -import ReactDOM from 'react-dom/client'; +import ReactDOM from 'react-dom'; import './index.css'; import App from './App'; import reportWebVitals from './reportWebVitals'; -<<<<<<< HEAD -======= import "@fontsource/poppins"; // Defaults to weight 400 ->>>>>>> 290f7b5b6760637f9cb9858b2b669fa12e27c5a4 const root = ReactDOM.createRoot(document.getElementById('root')); root.render( @@ -19,4 +16,3 @@ root.render( // to log results (for example: reportWebVitals(console.log)) // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals reportWebVitals(); - From c2c50cb93792cb629037be6e13262a566e04d599 Mon Sep 17 00:00:00 2001 From: anshshah23 Date: Tue, 9 Apr 2024 16:08:59 +0530 Subject: [PATCH 15/82] Login and Signup pages added --- package-lock.json | 19 ++++++++++ package.json | 1 + src/App.js | 27 ++++++++++++++- src/Pages/Login.jsx | 49 ++++++++++++++++++++++++++ src/Pages/Signup.jsx | 52 ++++++++++++++++++++++++++++ src/index.css | 82 +++++++++++++++++++++++++++++++++++++++++--- 6 files changed, 225 insertions(+), 5 deletions(-) create mode 100644 src/Pages/Login.jsx create mode 100644 src/Pages/Signup.jsx diff --git a/package-lock.json b/package-lock.json index 96b0b01..4847408 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,7 @@ "@testing-library/jest-dom": "^5.17.0", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", + "bootstrap": "^5.3.3", "react": "^18.2.0", "react-dom": "^18.2.0", "react-icons": "^5.0.1", @@ -6332,6 +6333,24 @@ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, + "node_modules/bootstrap": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.3.tgz", + "integrity": "sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "peerDependencies": { + "@popperjs/core": "^2.11.8" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", diff --git a/package.json b/package.json index 63ede19..6feeceb 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "@testing-library/jest-dom": "^5.17.0", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", + "bootstrap": "^5.3.3", "react": "^18.2.0", "react-dom": "^18.2.0", "react-icons": "^5.0.1", diff --git a/src/App.js b/src/App.js index fcbcd41..7915720 100644 --- a/src/App.js +++ b/src/App.js @@ -1,6 +1,9 @@ import './App.css' import Home from './Pages/Home' -import { BrowserRouter, Route, Routes } from 'react-router-dom' +import { BrowserRouter, Route, Routes, Link } from 'react-router-dom' +import 'bootstrap/dist/css/bootstrap.min.css'; +import Login from './Pages/Login'; +import SignUp from './Pages/Signup'; import PostJob from './Pages/PostJob'; import ViewJob from './Pages/ViewJob'; import NewPost from './Pages/NewPostPage'; @@ -9,6 +12,28 @@ import UploadNewPosts from './Pages/UploadNewPosts'; function App() { return ( +
+ +
+
+ + } /> + } /> + } /> + +
+
+
} /> } /> diff --git a/src/Pages/Login.jsx b/src/Pages/Login.jsx new file mode 100644 index 0000000..26000a3 --- /dev/null +++ b/src/Pages/Login.jsx @@ -0,0 +1,49 @@ +/* eslint-disable jsx-a11y/anchor-is-valid */ +import React, { Component } from "react"; +import { Link } from "react-router-dom"; +class Login extends Component { + render() { + return ( +
+

Sign In

+ +
+ + +
+
+ + +
+
+
+ + +
+
+
+ + + +
+

+ Forgot password? +

+
+ ); + } +} + +export default Login; \ No newline at end of file diff --git a/src/Pages/Signup.jsx b/src/Pages/Signup.jsx new file mode 100644 index 0000000..b363d5e --- /dev/null +++ b/src/Pages/Signup.jsx @@ -0,0 +1,52 @@ +import React, { Component } from 'react' +import { Link } from 'react-router-dom' +class SignUp extends Component { + render() { + return ( +
+

Sign Up

+ +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + + +
+

+ Already registered sign in? +

+
+ ) + } +} + +export default SignUp; \ No newline at end of file diff --git a/src/index.css b/src/index.css index 69bd004..a8c0777 100644 --- a/src/index.css +++ b/src/index.css @@ -1,9 +1,83 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; +@import url("https://fonts.googleapis.com/css2?family=Roboto&display=swap"); body { margin: 0; - + box-sizing: border-box; + background: #408cff !important; + min-height: 100vh; + display: flex; + font-weight: 400; + font-family: "Fira Sans", sans-serif; } +h1, +h2, +h3, +h4, +h5, +h6, +label, +span { + font-weight: 500; + font-family: "Fira Sans", sans-serif; +} + +body, +html, +.App, +#root, +.auth-wrapper { + width: 100%; + height: 100%; +} + +.navbar-light { + background-color: #ffffff; + box-shadow: 0px 14px 80px rgba(34, 35, 58, 0.2); +} + +.auth-wrapper { + display: flex; + justify-content: center; + flex-direction: column; + text-align: left; +} + +.auth-inner { + width: 450px; + margin: auto; + background: #ffffff; + box-shadow: 0px 14px 80px rgba(0, 1, 13, 0.2); + padding: 40px 55px 45px 55px; + border-radius: 15px; + transition: all 0.3s; +} + +.auth-wrapper .form-control:focus { + border-color: #00214c; + box-shadow: none; +} + +.auth-wrapper h3 { + text-align: center; + margin: 0; + line-height: 1; + padding-bottom: 20px; +} + +.custom-control-label { + font-weight: 400; +} + +.forgot-password, +.forgot-password a { + text-align: right; + font-size: 13px; + padding-top: 10px; + color: #0b0b0b; + margin: 0; +} + +.forgot-password a { + color: #0a0478; +} From 61669f73f0468f51e7b207d2ad82be4265d5e8a7 Mon Sep 17 00:00:00 2001 From: anshshah23 Date: Tue, 9 Apr 2024 16:33:43 +0530 Subject: [PATCH 16/82] Reverting previous changes{Link to Home incorrect} --- src/App.js | 27 +------------- src/Pages/Login.jsx | 49 ------------------------- src/Pages/Signup.jsx | 52 -------------------------- src/index.css | 87 ++++---------------------------------------- 4 files changed, 8 insertions(+), 207 deletions(-) delete mode 100644 src/Pages/Login.jsx delete mode 100644 src/Pages/Signup.jsx diff --git a/src/App.js b/src/App.js index 7915720..decbfd8 100644 --- a/src/App.js +++ b/src/App.js @@ -1,9 +1,6 @@ import './App.css' import Home from './Pages/Home' -import { BrowserRouter, Route, Routes, Link } from 'react-router-dom' -import 'bootstrap/dist/css/bootstrap.min.css'; -import Login from './Pages/Login'; -import SignUp from './Pages/Signup'; +import { BrowserRouter, Route, Routes} from 'react-router-dom' import PostJob from './Pages/PostJob'; import ViewJob from './Pages/ViewJob'; import NewPost from './Pages/NewPostPage'; @@ -12,28 +9,6 @@ import UploadNewPosts from './Pages/UploadNewPosts'; function App() { return ( -
- -
-
- - } /> - } /> - } /> - -
-
-
} /> } /> diff --git a/src/Pages/Login.jsx b/src/Pages/Login.jsx deleted file mode 100644 index 26000a3..0000000 --- a/src/Pages/Login.jsx +++ /dev/null @@ -1,49 +0,0 @@ -/* eslint-disable jsx-a11y/anchor-is-valid */ -import React, { Component } from "react"; -import { Link } from "react-router-dom"; -class Login extends Component { - render() { - return ( -
-

Sign In

- -
- - -
-
- - -
-
-
- - -
-
-
- - - -
-

- Forgot password? -

-
- ); - } -} - -export default Login; \ No newline at end of file diff --git a/src/Pages/Signup.jsx b/src/Pages/Signup.jsx deleted file mode 100644 index b363d5e..0000000 --- a/src/Pages/Signup.jsx +++ /dev/null @@ -1,52 +0,0 @@ -import React, { Component } from 'react' -import { Link } from 'react-router-dom' -class SignUp extends Component { - render() { - return ( -
-

Sign Up

- -
- - -
-
- - -
-
- - -
-
- - -
-
- - - -
-

- Already registered sign in? -

-
- ) - } -} - -export default SignUp; \ No newline at end of file diff --git a/src/index.css b/src/index.css index a8c0777..c3b88c9 100644 --- a/src/index.css +++ b/src/index.css @@ -1,83 +1,10 @@ -@import url("https://fonts.googleapis.com/css2?family=Roboto&display=swap"); - -body { +@tailwind base; +@tailwind components; +@tailwind utilities; +*{ margin: 0; - box-sizing: border-box; - background: #408cff !important; - min-height: 100vh; - display: flex; - font-weight: 400; - font-family: "Fira Sans", sans-serif; -} - -h1, -h2, -h3, -h4, -h5, -h6, -label, -span { - font-weight: 500; - font-family: "Fira Sans", sans-serif; -} - -body, -html, -.App, -#root, -.auth-wrapper { - width: 100%; - height: 100%; -} - -.navbar-light { - background-color: #ffffff; - box-shadow: 0px 14px 80px rgba(34, 35, 58, 0.2); -} - -.auth-wrapper { - display: flex; - justify-content: center; - flex-direction: column; - text-align: left; -} - -.auth-inner { - width: 450px; - margin: auto; - background: #ffffff; - box-shadow: 0px 14px 80px rgba(0, 1, 13, 0.2); - padding: 40px 55px 45px 55px; - border-radius: 15px; - transition: all 0.3s; -} - -.auth-wrapper .form-control:focus { - border-color: #00214c; - box-shadow: none; } - -.auth-wrapper h3 { - text-align: center; - margin: 0; - line-height: 1; - padding-bottom: 20px; -} - -.custom-control-label { - font-weight: 400; -} - -.forgot-password, -.forgot-password a { - text-align: right; - font-size: 13px; - padding-top: 10px; - color: #0b0b0b; - margin: 0; -} - -.forgot-password a { - color: #0a0478; +body { + box-sizing: border-box; + } From abfd7a3c9d41da9cee1b7acb5c8ece651cd0ad43 Mon Sep 17 00:00:00 2001 From: asmisavla Date: Thu, 11 Apr 2024 13:11:06 +0530 Subject: [PATCH 17/82] profile page --- package-lock.json | 2 +- package.json | 2 +- src/App.js | 2 + src/Components/Home/DescriptionProfile.jsx | 67 +++++++++++++++ src/Components/Home/MyCard.jsx | 61 ++++++++++++++ src/Components/Home/MyJobs.jsx | 90 ++++++++++++++++++++ src/Components/Home/MyNotes.jsx | 98 ++++++++++++++++++++++ src/Components/Home/MyPosts.jsx | 72 ++++++++++++++++ src/Components/Home/MyResources.jsx | 14 ++++ src/Components/Home/ShareNotes.jsx | 2 +- src/Pages/profile.jsx | 53 ++++++++++++ src/styles/profile.css | 0 12 files changed, 460 insertions(+), 3 deletions(-) create mode 100644 src/Components/Home/DescriptionProfile.jsx create mode 100644 src/Components/Home/MyCard.jsx create mode 100644 src/Components/Home/MyJobs.jsx create mode 100644 src/Components/Home/MyNotes.jsx create mode 100644 src/Components/Home/MyPosts.jsx create mode 100644 src/Components/Home/MyResources.jsx create mode 100644 src/Pages/profile.jsx create mode 100644 src/styles/profile.css diff --git a/package-lock.json b/package-lock.json index 4847408..37b84a7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "react-dom": "^18.2.0", "react-icons": "^5.0.1", "react-router-dom": "^6.22.3", - "react-scripts": "5.0.1", + "react-scripts": "^5.0.1", "web-vitals": "^2.1.4" }, "devDependencies": { diff --git a/package.json b/package.json index 6feeceb..21431d5 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "react-dom": "^18.2.0", "react-icons": "^5.0.1", "react-router-dom": "^6.22.3", - "react-scripts": "5.0.1", + "react-scripts": "^5.0.1", "web-vitals": "^2.1.4" }, "scripts": { diff --git a/src/App.js b/src/App.js index decbfd8..8c8c9ae 100644 --- a/src/App.js +++ b/src/App.js @@ -5,6 +5,7 @@ import PostJob from './Pages/PostJob'; import ViewJob from './Pages/ViewJob'; import NewPost from './Pages/NewPostPage'; import UploadNewPosts from './Pages/UploadNewPosts'; +import Profile from './Pages/profile'; function App() { return ( @@ -15,6 +16,7 @@ function App() { } /> } /> } /> + } />
); diff --git a/src/Components/Home/DescriptionProfile.jsx b/src/Components/Home/DescriptionProfile.jsx new file mode 100644 index 0000000..b87be6c --- /dev/null +++ b/src/Components/Home/DescriptionProfile.jsx @@ -0,0 +1,67 @@ +import React from 'react'; +import WorkOutlineOutlinedIcon from '@mui/icons-material/WorkOutlineOutlined'; +import PhotoSizeSelectActualOutlinedIcon from '@mui/icons-material/PhotoSizeSelectActualOutlined'; +import DescriptionOutlinedIcon from '@mui/icons-material/DescriptionOutlined'; +import VideocamOutlinedIcon from '@mui/icons-material/VideocamOutlined'; + +function DescriptionProfile(){ + return( +
+
+
+
+
+
+ + + +
+
12
+
Jobs Posted
+
+
+
+
+ + + +
+
09
+
Posts Created
+
+
+
+
+ + + +
+
34
+
Notes Shared
+
+
+
+
+ + + +
+
23
+
Videos shared
+
+
+ +
+
+
+ + +
+
+
+
+ + ); +} + +export default DescriptionProfile; diff --git a/src/Components/Home/MyCard.jsx b/src/Components/Home/MyCard.jsx new file mode 100644 index 0000000..b2f60f7 --- /dev/null +++ b/src/Components/Home/MyCard.jsx @@ -0,0 +1,61 @@ +import React from 'react'; +import EmailOutlinedIcon from '@mui/icons-material/EmailOutlined'; +import PhoneIcon from '@mui/icons-material/Phone'; +import SchoolOutlinedIcon from '@mui/icons-material/SchoolOutlined'; + + +const cardData = [ + { + "heading1": 'Meet Chavan', + + + "icon": , + "email": "meetchavan24@gmail.com", + "phoneicon": , + 'phone': '8369620196', + "mode": "Computer Engineering-2026", + "education": , + + }, + ] + + function MyCard() { + return ( +
+ +
+
+ {cardData.map((data, i) => { + return ( +
+
+
+

Student

+
+

{data.heading1}

+ +

{data.body}

+
+
+ {data.icon} +

{data.email}

+
+
+ {data.phoneicon} +

{data.phone}

+
+
+ {data.education} +

{data.mode}

+
+ +
+
+
+ ); + })} +
+
+ ); + } +export default MyCard; \ No newline at end of file diff --git a/src/Components/Home/MyJobs.jsx b/src/Components/Home/MyJobs.jsx new file mode 100644 index 0000000..b02b828 --- /dev/null +++ b/src/Components/Home/MyJobs.jsx @@ -0,0 +1,90 @@ +import React from 'react'; +import CalendarTodayIcon from '@mui/icons-material/CalendarToday'; +import AccessTimeOutlinedIcon from '@mui/icons-material/AccessTimeOutlined'; +import SmartphoneOutlinedIcon from '@mui/icons-material/SmartphoneOutlined'; +import DeleteIcon from '@mui/icons-material/Delete'; + +const cardData = [ +{ + "heading1": 'Internship', + "heading2": 'Company Name', + "body": "We are seeking highly motivated and enthusiastic technology intern to join us", + "icon": , + "time": "3 Months", + "timeicon": , + 'timelimit': 'Part-time', + "mode": "Online", + "mobile": , + "date": "24th March,2024" +}, +{ + "heading1": 'Internship', + "heading2": 'Company Name', + "body": "We are seeking highly motivated and enthusiastic technology intern to join us", + "icon": , + "time": "3 Months", + "timeicon": , + 'timelimit': 'Part-time', + "mode": "Online", + "mobile": , + "date": "24th March,2024", +}, +{ + "heading1": 'Internship', + "heading2": 'Company Name', + "body": "We are seeking highly motivated and enthusiastic technology intern to join us", + "icon": , + "time": "3 Months", + "timeicon": , + 'timelimit': 'Part-time', + "mode": "Online", + "mobile": , + "date": "24th March,2024", +}, +] + +function MyJobs() { + return ( +
+

+ My Posted Job Opportunities +

+
+
+ {cardData.map((data, i) => { + return ( +
+
+
+ +
+

{data.heading1}

+

{data.heading2}

+

{data.body}

+
+
+ {data.icon} +

{data.time}

+
+
+ {data.timeicon} +

{data.timelimit}

+
+
+ {data.mobile} +

{data.mode}

+
+
+

{data.date}

+
+
+
+
+ ); + })} +
+
+ ); +} + +export default MyJobs; diff --git a/src/Components/Home/MyNotes.jsx b/src/Components/Home/MyNotes.jsx new file mode 100644 index 0000000..c75485f --- /dev/null +++ b/src/Components/Home/MyNotes.jsx @@ -0,0 +1,98 @@ +import React from 'react' + +import StarIcon from '@mui/icons-material/Star'; +import PictureAsPdfOutlinedIcon from '@mui/icons-material/PictureAsPdfOutlined'; +import DeleteIcon from '@mui/icons-material/Delete'; + + +const cardData = [ + { + "heading1": 'Notes Title', + + "body": "Check out these Study Buddy Notes crafted by students who have been through coding sub.. ", + "icon": , + "department":" Department", + + 'timelimit': '100 + Likes', + 'pdf': + + }, + { + "heading1": 'Notes Title', + + "body": "Check out these Study Buddy Notes crafted by students who have been through coding sub..", + "icon": , + "department":" Department", + 'timelimit': '100 + Likes', + 'pdf': + + }, + { + "heading1": 'Notes Title', + "body": "Check out these Study Buddy Notes crafted by students who have been through coding sub..", + "icon": , + "department":" Department", + 'pdf':, + 'timelimit': '100 + Likes', + + }, + { + "heading1": 'Notes Title', + "body": "Check out these Study Buddy Notes crafted by students who have been through coding sub..", + "icon": , + "department":" Department", + 'pdf': + + + }, + { + "heading1": 'Notes Title', + "body": "Check out these Study Buddy Notes crafted by students who have been through coding sub..", + "icon": , + "department":" Department", + 'pdf': + + }, + ] +function ShareNotes() { +return ( +
+

+ My Shared Notes +

+
+
+ {cardData.map((data, i) => { + return ( +
+
+
+ +
+
+
+

{data.heading1}

+
+ {data.icon} +

4.6

+
+
+
+

{data.body}

+
+
+

{data.department}

+ {data.pdf} +
+
+
+
+ ); + })} +
+ +
+ ); +} + +export default ShareNotes \ No newline at end of file diff --git a/src/Components/Home/MyPosts.jsx b/src/Components/Home/MyPosts.jsx new file mode 100644 index 0000000..bae89d9 --- /dev/null +++ b/src/Components/Home/MyPosts.jsx @@ -0,0 +1,72 @@ +import React from 'react' + +import FavoriteBorderOutlinedIcon from '@mui/icons-material/FavoriteBorderOutlined'; +import DeleteIcon from '@mui/icons-material/Delete'; + + +const cardData = [ +{ + "heading1": 'Post Title', + + "body": "Hello tech enthusiastics and innovators! Are you ready to show case your skills,collabrate with like-minded individuals,and create ground-breaking solutions for real-world challenges? ", + "icon": , + + + 'timelimit': '100 + Likes', + +}, +{ + "heading1": 'Post Title', + + "body": "Hello tech enthusiastics and innovators! Are you ready to show case your skills,collabrate with like-minded individuals,and create ground-breaking solutions for real-world challenges?", + "icon": , + + 'timelimit': '100 + Likes', + +}, +{ + "heading1": 'Post Title', + + "body": "Hello tech enthusiastics and innovators! Are you ready to show case your skills,collabrate with like-minded individuals,and create ground-breaking solutions for real-world challenges?", + "icon": , + + + 'timelimit': '100 + Likes', + +}, +] +function MyPosts() { +return ( +
+

+ My Created Posts +

+
+
+ {cardData.map((data, i) => { + return ( +
+
+
+ +
+

{data.heading1}

+

{data.body}

+
+
+ {data.icon} +

{data.timelimit}

+
+

Categories

+
+
+
+ ); + })} +
+ +
+); +} + +export default MyPosts \ No newline at end of file diff --git a/src/Components/Home/MyResources.jsx b/src/Components/Home/MyResources.jsx new file mode 100644 index 0000000..12b82ca --- /dev/null +++ b/src/Components/Home/MyResources.jsx @@ -0,0 +1,14 @@ +import React from 'react' + +function MyResources() { + return ( +
+

+ My Shared Videos +

+
+
+ ) +} + +export default MyResources \ No newline at end of file diff --git a/src/Components/Home/ShareNotes.jsx b/src/Components/Home/ShareNotes.jsx index 91ad71e..edd4163 100644 --- a/src/Components/Home/ShareNotes.jsx +++ b/src/Components/Home/ShareNotes.jsx @@ -90,4 +90,4 @@ function ShareNotes() { ) } -export default ShareNotes \ No newline at end of file +export default ShareNotes \ No newline at end of file diff --git a/src/Pages/profile.jsx b/src/Pages/profile.jsx new file mode 100644 index 0000000..a1d7733 --- /dev/null +++ b/src/Pages/profile.jsx @@ -0,0 +1,53 @@ +import React from 'react'; +import { useNavigate } from 'react-router-dom'; +import Sidebar from '../Components/Home/Sidebar'; // Adjust the path according to your project structure +import { Button } from '@mui/material'; +import BackButton from '../assets/BackButton.png'; +import '../styles/profile.css'; +import MyJobs from '../Components/Home/MyJobs'; +import MyPosts from '../Components/Home/MyPosts'; +import MyNotes from '../Components/Home/MyNotes'; +import MyResources from '../Components/Home/MyResources'; +import MyCard from '../Components/Home/MyCard'; +import DescriptionProfile from '../Components/Home/DescriptionProfile'; + +const Profile=() => { + const navigate = useNavigate(); + + const handleGoBack = (event) => { + event.preventDefault(); + navigate.goBack(); + }; + + + return ( +
+ + <> +
+
+ +

+ My Profile +

+
+
+ + +
+ + + + + + +
+
+ +
+); +} + +export default Profile; diff --git a/src/styles/profile.css b/src/styles/profile.css new file mode 100644 index 0000000..e69de29 From f4cae4719c7c8ffacb28e4b74f123dfb4a1ec528 Mon Sep 17 00:00:00 2001 From: anshshah23 Date: Thu, 2 May 2024 21:40:43 +0530 Subject: [PATCH 18/82] Added Signup page with link from the sidebar --- src/App.js | 3 ++- src/Components/Home/Sidebar.jsx | 9 ++++--- src/Pages/Home.jsx | 1 - src/Pages/LoginPage.jsx | 47 +++++++++++++++++++++++++++++++++ 4 files changed, 55 insertions(+), 5 deletions(-) create mode 100644 src/Pages/LoginPage.jsx diff --git a/src/App.js b/src/App.js index decbfd8..352576e 100644 --- a/src/App.js +++ b/src/App.js @@ -5,12 +5,13 @@ import PostJob from './Pages/PostJob'; import ViewJob from './Pages/ViewJob'; import NewPost from './Pages/NewPostPage'; import UploadNewPosts from './Pages/UploadNewPosts'; - +import LoginPage from './Pages/LoginPage'; function App() { return ( } /> + } /> } /> } /> } /> diff --git a/src/Components/Home/Sidebar.jsx b/src/Components/Home/Sidebar.jsx index ae679d2..fbdf372 100644 --- a/src/Components/Home/Sidebar.jsx +++ b/src/Components/Home/Sidebar.jsx @@ -6,7 +6,7 @@ import AddIcon from '@mui/icons-material/Add'; import { useNavigate } from 'react-router-dom'; import Sidebarresponsive from './Sidebarresponsive'; import CloseIcon from '@mui/icons-material/Close'; - +import LoginPage from '../../Pages/LoginPage'; const Sidebar = () => { const navigate = useNavigate(); const [isOpen, setIsOpen] = useState(false); @@ -19,6 +19,9 @@ const Sidebar = () => { navigate('/createjob'); } + function loginNavigate() { + navigate('/LoginPage'); + } function toggleSidebar() { setIsOpen(!isOpen); document.body.style.overflowY = isOpen ? 'auto' : 'hidden'; @@ -34,7 +37,7 @@ const Sidebar = () => {
-
+
@@ -45,7 +48,7 @@ const Sidebar = () => {
- +
diff --git a/src/Pages/Home.jsx b/src/Pages/Home.jsx index 00094da..9c0d9da 100644 --- a/src/Pages/Home.jsx +++ b/src/Pages/Home.jsx @@ -9,7 +9,6 @@ function Home() { return (
-
diff --git a/src/Pages/LoginPage.jsx b/src/Pages/LoginPage.jsx new file mode 100644 index 0000000..5b64f1f --- /dev/null +++ b/src/Pages/LoginPage.jsx @@ -0,0 +1,47 @@ +import React from 'react'; +import { useNavigate } from 'react-router-dom'; + +const LoginPage = () => { + + const navigate = useNavigate(); + + function loginClick() { + navigate('/'); + } + + return ( +
+
+

NOTENG

+ Login +
+
+
+

Login

+
+
+ + +
+
+ + +
+
+ + +
+ +
+
+
+
+ ); +}; + +export default LoginPage; \ No newline at end of file From 5f0c2f2dddd23fa7c8d3f32dba6f79ad766f8fde Mon Sep 17 00:00:00 2001 From: anshshah23 Date: Thu, 2 May 2024 21:43:20 +0530 Subject: [PATCH 19/82] Added LoginPage.jsx --- src/Pages/LoginPage.jsx | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/Pages/LoginPage.jsx b/src/Pages/LoginPage.jsx index 5b64f1f..eb08ebc 100644 --- a/src/Pages/LoginPage.jsx +++ b/src/Pages/LoginPage.jsx @@ -11,14 +11,13 @@ const LoginPage = () => { return (
-
-

NOTENG

+
+

NOTENG

Login
-
-

Login

-
+
+
@@ -36,8 +35,8 @@ const LoginPage = () => {
- +
From b177584051e097d7de5c2bce20b90e50804cd102 Mon Sep 17 00:00:00 2001 From: MonilMehta Date: Fri, 3 May 2024 13:09:00 +0530 Subject: [PATCH 20/82] Created Notes View Page --- src/App.js | 6 +- src/Components/Home/Sidebar.jsx | 14 ++- src/Components/Notes/NewNotes.jsx | 17 ++++ .../{Upload => Notes}/UploadNotes.jsx | 0 src/Components/Notes/ViewNote.jsx | 85 ++++++++++++++++++ src/Components/Notes/viewnote.css | 38 ++++++++ src/Pages/UploadNewPosts.jsx | 2 +- src/assets/noteimg.png | Bin 0 -> 194662 bytes 8 files changed, 156 insertions(+), 6 deletions(-) create mode 100644 src/Components/Notes/NewNotes.jsx rename src/Components/{Upload => Notes}/UploadNotes.jsx (100%) create mode 100644 src/Components/Notes/ViewNote.jsx create mode 100644 src/Components/Notes/viewnote.css create mode 100644 src/assets/noteimg.png diff --git a/src/App.js b/src/App.js index 8c8c9ae..88c71e3 100644 --- a/src/App.js +++ b/src/App.js @@ -6,17 +6,21 @@ import ViewJob from './Pages/ViewJob'; import NewPost from './Pages/NewPostPage'; import UploadNewPosts from './Pages/UploadNewPosts'; import Profile from './Pages/profile'; +import NewNotes from './Components/Notes/NewNotes'; +import ViewNote from './Components/Notes/ViewNote'; function App() { return ( } /> - } /> + } /> } /> } /> + } /> } /> } /> + } /> ); diff --git a/src/Components/Home/Sidebar.jsx b/src/Components/Home/Sidebar.jsx index ae679d2..d7efc2a 100644 --- a/src/Components/Home/Sidebar.jsx +++ b/src/Components/Home/Sidebar.jsx @@ -18,6 +18,12 @@ const Sidebar = () => { function createJob() { navigate('/createjob'); } + function createPost() { + navigate('/createpost'); + } + function createNote() { + navigate('/createnote'); + } function toggleSidebar() { setIsOpen(!isOpen); @@ -31,8 +37,8 @@ const Sidebar = () => {
)} -
-
+
+
@@ -76,13 +82,13 @@ const Sidebar = () => {

Add Job Opportunity

-
+

Create New Post

-
+

Upload Notes

diff --git a/src/Components/Notes/NewNotes.jsx b/src/Components/Notes/NewNotes.jsx new file mode 100644 index 0000000..6e1f1d3 --- /dev/null +++ b/src/Components/Notes/NewNotes.jsx @@ -0,0 +1,17 @@ +import React from 'react' +import Sidebar from '../Home/Sidebar' +import UploadNotes from './UploadNotes' +function NewPostPage() { + return ( + +
+ +
+ +
+
+ + ) +} + +export default NewPostPage \ No newline at end of file diff --git a/src/Components/Upload/UploadNotes.jsx b/src/Components/Notes/UploadNotes.jsx similarity index 100% rename from src/Components/Upload/UploadNotes.jsx rename to src/Components/Notes/UploadNotes.jsx diff --git a/src/Components/Notes/ViewNote.jsx b/src/Components/Notes/ViewNote.jsx new file mode 100644 index 0000000..e928436 --- /dev/null +++ b/src/Components/Notes/ViewNote.jsx @@ -0,0 +1,85 @@ +import React from 'react' +import Sidebar from '../Home/Sidebar'; +import BackButton from '../../assets/BackButton.png'; +import { useNavigate } from 'react-router-dom'; +import { Button } from '@mui/material'; +import img from '../../assets/noteimg.png'; +import './viewnote.css' + +const ViewNote = () => { + const navigate = useNavigate(); + + const handleGoBack = (event) => { + event.preventDefault(); + navigate.goBack(); + }; + + return ( +
+ + <> +
+
+ +

+ Notes +

+
+
+
+

Notes Title

+
+
+

Subject:

+

Department:

+
+
+

Notes Description

+

+ Access your study materials anytime, anywhere with our new Notes Upload feature! Simply upload your notes directly from your device and have them at your fingertips whenever you need them. Whether it's lecture slides, study guides, or handwritten notes, our platform makes it easy to keep everything organized and accessible. Say goodbye to the hassle of carrying around bulky notebooks and hello to seamless studying on the go +

+
+ Note +
+
+ +
+
+
+
+

Uploaded By:

+

Monil Mehta

+
+
+

24th March 2024

+

15:18

+
+
{/* Use ml-auto to push to the right */} +
+

Rate :

+
+
{/* Add ml-2 for spacing */} + {/* Simulated star rating */} + ⭐️ + ⭐️ + ⭐️ + ⭐️ + ⭐️ +
+
+ +
+ +
+ +
+ ) +} + +export default ViewNote diff --git a/src/Components/Notes/viewnote.css b/src/Components/Notes/viewnote.css new file mode 100644 index 0000000..18122e9 --- /dev/null +++ b/src/Components/Notes/viewnote.css @@ -0,0 +1,38 @@ +.subtitle{ + font-size: 1.9rem; + font-weight: 600; + color: #20222E; + margin-top: 32px; + margin-bottom: 1rem; + display: flex; + justify-content: center; +} + +.head3{ + font-size: 32px; + color: #8391A1; + display: flex; + justify-content: center; + margin-top: 20px; +} +.notes-description{ + margin-top: 20px; + margin-left: 40px; + font-size: 24px; +} +.noteimg{ + width: 1058px; + height: 302px; + margin-top: 40px; + margin-left: 67px; + border: 2px solid black; + border-radius: 10px; + margin-bottom: 24px; +} +.badges{ + width: 200px; +} +.badges1{ + margin-top: 30px; + width: 200px; +} \ No newline at end of file diff --git a/src/Pages/UploadNewPosts.jsx b/src/Pages/UploadNewPosts.jsx index a6eeea9..a5256ee 100644 --- a/src/Pages/UploadNewPosts.jsx +++ b/src/Pages/UploadNewPosts.jsx @@ -1,6 +1,6 @@ import React from 'react' import Sidebar from '../Components/Home/Sidebar' -import UploadNotes from '../Components/Upload/UploadNotes' +import UploadNotes from '../Components/Notes/UploadNotes' function UploadNewPosts() { return ( diff --git a/src/assets/noteimg.png b/src/assets/noteimg.png new file mode 100644 index 0000000000000000000000000000000000000000..fdb5f97474bd7bcaee43d1e618a84ec5ef7f4a48 GIT binary patch literal 194662 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%0AMs_BPNm7P%+2e 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 JPDHLkV1jJ* Date: Fri, 3 May 2024 14:07:59 +0530 Subject: [PATCH 21/82] Added Upload Video Page --- src/App.js | 2 + src/Components/Home/Sidebar.jsx | 2 +- src/Pages/UploadVideo.jsx | 80 +++++++++++++++++++++++++++++ src/styles/UploadVideo.css | 89 +++++++++++++++++++++++++++++++++ 4 files changed, 172 insertions(+), 1 deletion(-) create mode 100644 src/Pages/UploadVideo.jsx create mode 100644 src/styles/UploadVideo.css diff --git a/src/App.js b/src/App.js index 20b1976..1691f2a 100644 --- a/src/App.js +++ b/src/App.js @@ -9,6 +9,7 @@ import LoginPage from './Pages/LoginPage'; import Profile from './Pages/profile'; import NewNotes from './Components/Notes/NewNotes'; import ViewNote from './Components/Notes/ViewNote'; +import UploadVideo from './Pages/UploadVideo'; function App() { return ( @@ -23,6 +24,7 @@ function App() { } /> } /> } /> + } /> ); diff --git a/src/Components/Home/Sidebar.jsx b/src/Components/Home/Sidebar.jsx index d3c308a..e1c737c 100644 --- a/src/Components/Home/Sidebar.jsx +++ b/src/Components/Home/Sidebar.jsx @@ -6,7 +6,7 @@ import AddIcon from '@mui/icons-material/Add'; import { useNavigate } from 'react-router-dom'; import Sidebarresponsive from './Sidebarresponsive'; import CloseIcon from '@mui/icons-material/Close'; -import LoginPage from '../../Pages/LoginPage'; +// import LoginPage from '../../Pages/LoginPage'; const Sidebar = () => { const navigate = useNavigate(); const [isOpen, setIsOpen] = useState(false); diff --git a/src/Pages/UploadVideo.jsx b/src/Pages/UploadVideo.jsx new file mode 100644 index 0000000..1ae959a --- /dev/null +++ b/src/Pages/UploadVideo.jsx @@ -0,0 +1,80 @@ +import React, { useState } from 'react'; +import Sidebar from '../Components/Home/Sidebar'; +import BackButton from '../assets/BackButton.png'; +import { useNavigate } from 'react-router-dom'; +import { Button } from '@mui/material'; +import '../styles/UploadVideo.css'; + +const ViewNote = () => { + const navigate = useNavigate(); + + const [formData, setFormData] = useState({ + videoName: '', + videoLink: '' + }); + + + const handleInputChange = (event) => { + const { id, value } = event.target; + setFormData({ ...formData, [id]: value }); + }; + + // Handler for form submission (if needed) + const handleSubmit = (event) => { + event.preventDefault(); + + }; + + const handleGoBack = (event) => { + event.preventDefault(); + navigate.goBack(); + }; + + return ( +
+ +
+
+ +

+ Share Video Resource +

+
+
+
+
+
+ + +
+
+ + +
+ +
+
+
+
+ ); +}; + +export default ViewNote; diff --git a/src/styles/UploadVideo.css b/src/styles/UploadVideo.css new file mode 100644 index 0000000..4d5b3a2 --- /dev/null +++ b/src/styles/UploadVideo.css @@ -0,0 +1,89 @@ +.view-note-container { + display: flex; + flex-direction: column; /* By default, use flex-col for smaller screens */ +} + +@media (min-width: 768px) { + .view-note-container { + flex-direction: row; /* Switch to flex-row for screens 768px and larger */ + } +} + + +.custom-heading { + font-family: Poppins; + font-size: 40px; + } + + .maincontent { + width: 100%; + font-family: Poppins; + color: #20222E; + } + + .maincontent label { + font-size: 20px; + } + + .maincontent input { + font-size: 15px; + } + + .inputarea { + background-color: #F7F8F9; + border: 1px solid #ccc; + } + .job-button-container { + display: flex; + margin-bottom: 20px; + } + + .job-button-container button { + width: 270px; + padding: 10px; + font-size: 14px; + font-weight: 500; + color: #333; + background-color: #fff; + border: 1px solid #ccc; + border-radius: 4px; + cursor: pointer; + } + + .job-button-container button:hover { + background-color: #eef2f8; + } + + .job-button-container button.selected { + background-color: #394dfd; + color: #fff; + } + + @media only screen and (max-width: 768px) { + .job-button-container { + flex-direction: column; + } + + .job-button-container button { + width: 100%; /* Make buttons full width */ + margin-bottom: 10px; /* Add some space between buttons */ + } + } + + .submit-button { + width: 60vw; + height: 65px; + font-family: Poppins; + font-size: 20px; + color: white; + background-color: #394dfd; + border: none; + border-radius: 8px; + cursor: pointer; + } + + +.submit-btn{ + display: flex; + justify-content: center; +} \ No newline at end of file From fa4b34b948b3866cfb4cb977e5467e6b78915dfa Mon Sep 17 00:00:00 2001 From: MonilMehta Date: Fri, 3 May 2024 14:21:24 +0530 Subject: [PATCH 22/82] Changed profile structure --- .../{Home => Profile}/DescriptionProfile.jsx | 0 src/Components/{Home => Profile}/MyCard.jsx | 8 ++++---- src/Components/{Home => Profile}/MyJobs.jsx | 0 src/Components/{Home => Profile}/MyNotes.jsx | 0 src/Components/{Home => Profile}/MyPosts.jsx | 0 src/Components/{Home => Profile}/MyResources.jsx | 0 src/Pages/profile.jsx | 12 ++++++------ src/styles/profile.css | 4 ++++ 8 files changed, 14 insertions(+), 10 deletions(-) rename src/Components/{Home => Profile}/DescriptionProfile.jsx (100%) rename src/Components/{Home => Profile}/MyCard.jsx (90%) rename src/Components/{Home => Profile}/MyJobs.jsx (100%) rename src/Components/{Home => Profile}/MyNotes.jsx (100%) rename src/Components/{Home => Profile}/MyPosts.jsx (100%) rename src/Components/{Home => Profile}/MyResources.jsx (100%) diff --git a/src/Components/Home/DescriptionProfile.jsx b/src/Components/Profile/DescriptionProfile.jsx similarity index 100% rename from src/Components/Home/DescriptionProfile.jsx rename to src/Components/Profile/DescriptionProfile.jsx diff --git a/src/Components/Home/MyCard.jsx b/src/Components/Profile/MyCard.jsx similarity index 90% rename from src/Components/Home/MyCard.jsx rename to src/Components/Profile/MyCard.jsx index b2f60f7..90d0d01 100644 --- a/src/Components/Home/MyCard.jsx +++ b/src/Components/Profile/MyCard.jsx @@ -2,7 +2,7 @@ import React from 'react'; import EmailOutlinedIcon from '@mui/icons-material/EmailOutlined'; import PhoneIcon from '@mui/icons-material/Phone'; import SchoolOutlinedIcon from '@mui/icons-material/SchoolOutlined'; - +import '../../styles/profile.css'; const cardData = [ { @@ -23,12 +23,12 @@ const cardData = [ return (
-
+
{cardData.map((data, i) => { return ( -
-
+
+

Student

diff --git a/src/Components/Home/MyJobs.jsx b/src/Components/Profile/MyJobs.jsx similarity index 100% rename from src/Components/Home/MyJobs.jsx rename to src/Components/Profile/MyJobs.jsx diff --git a/src/Components/Home/MyNotes.jsx b/src/Components/Profile/MyNotes.jsx similarity index 100% rename from src/Components/Home/MyNotes.jsx rename to src/Components/Profile/MyNotes.jsx diff --git a/src/Components/Home/MyPosts.jsx b/src/Components/Profile/MyPosts.jsx similarity index 100% rename from src/Components/Home/MyPosts.jsx rename to src/Components/Profile/MyPosts.jsx diff --git a/src/Components/Home/MyResources.jsx b/src/Components/Profile/MyResources.jsx similarity index 100% rename from src/Components/Home/MyResources.jsx rename to src/Components/Profile/MyResources.jsx diff --git a/src/Pages/profile.jsx b/src/Pages/profile.jsx index a1d7733..c30caa2 100644 --- a/src/Pages/profile.jsx +++ b/src/Pages/profile.jsx @@ -4,12 +4,12 @@ import Sidebar from '../Components/Home/Sidebar'; // Adjust the path according t import { Button } from '@mui/material'; import BackButton from '../assets/BackButton.png'; import '../styles/profile.css'; -import MyJobs from '../Components/Home/MyJobs'; -import MyPosts from '../Components/Home/MyPosts'; -import MyNotes from '../Components/Home/MyNotes'; -import MyResources from '../Components/Home/MyResources'; -import MyCard from '../Components/Home/MyCard'; -import DescriptionProfile from '../Components/Home/DescriptionProfile'; +import MyJobs from '../Components/Profile/MyJobs'; +import MyPosts from '../Components/Profile/MyPosts'; +import MyNotes from '../Components/Profile/MyNotes'; +import MyResources from '../Components/Profile/MyResources'; +import MyCard from '../Components/Profile/MyCard'; +import DescriptionProfile from '../Components/Profile/DescriptionProfile'; const Profile=() => { const navigate = useNavigate(); diff --git a/src/styles/profile.css b/src/styles/profile.css index e69de29..d756a04 100644 --- a/src/styles/profile.css +++ b/src/styles/profile.css @@ -0,0 +1,4 @@ +.profilecard{ + + margin-right: auto; +} \ No newline at end of file From afaaefd385985bafe4f9438c730473e5ed986c08 Mon Sep 17 00:00:00 2001 From: Divya Gandhi Date: Sun, 5 May 2024 01:08:29 +0530 Subject: [PATCH 23/82] Changes --- package-lock.json | 19 ---------- package.json | 1 - src/App.js | 27 +-------------- src/Pages/Login.jsx | 49 -------------------------- src/Pages/Signup.jsx | 52 ---------------------------- src/index.css | 82 +++----------------------------------------- 6 files changed, 5 insertions(+), 225 deletions(-) delete mode 100644 src/Pages/Login.jsx delete mode 100644 src/Pages/Signup.jsx diff --git a/package-lock.json b/package-lock.json index 4847408..96b0b01 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,6 @@ "@testing-library/jest-dom": "^5.17.0", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", - "bootstrap": "^5.3.3", "react": "^18.2.0", "react-dom": "^18.2.0", "react-icons": "^5.0.1", @@ -6333,24 +6332,6 @@ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, - "node_modules/bootstrap": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.3.tgz", - "integrity": "sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/twbs" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/bootstrap" - } - ], - "peerDependencies": { - "@popperjs/core": "^2.11.8" - } - }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", diff --git a/package.json b/package.json index 6feeceb..63ede19 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,6 @@ "@testing-library/jest-dom": "^5.17.0", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", - "bootstrap": "^5.3.3", "react": "^18.2.0", "react-dom": "^18.2.0", "react-icons": "^5.0.1", diff --git a/src/App.js b/src/App.js index 7915720..fcbcd41 100644 --- a/src/App.js +++ b/src/App.js @@ -1,9 +1,6 @@ import './App.css' import Home from './Pages/Home' -import { BrowserRouter, Route, Routes, Link } from 'react-router-dom' -import 'bootstrap/dist/css/bootstrap.min.css'; -import Login from './Pages/Login'; -import SignUp from './Pages/Signup'; +import { BrowserRouter, Route, Routes } from 'react-router-dom' import PostJob from './Pages/PostJob'; import ViewJob from './Pages/ViewJob'; import NewPost from './Pages/NewPostPage'; @@ -12,28 +9,6 @@ import UploadNewPosts from './Pages/UploadNewPosts'; function App() { return ( -
- -
-
- - } /> - } /> - } /> - -
-
-
} /> } /> diff --git a/src/Pages/Login.jsx b/src/Pages/Login.jsx deleted file mode 100644 index 26000a3..0000000 --- a/src/Pages/Login.jsx +++ /dev/null @@ -1,49 +0,0 @@ -/* eslint-disable jsx-a11y/anchor-is-valid */ -import React, { Component } from "react"; -import { Link } from "react-router-dom"; -class Login extends Component { - render() { - return ( -
-

Sign In

- -
- - -
-
- - -
-
-
- - -
-
-
- - - -
-

- Forgot password? -

-
- ); - } -} - -export default Login; \ No newline at end of file diff --git a/src/Pages/Signup.jsx b/src/Pages/Signup.jsx deleted file mode 100644 index b363d5e..0000000 --- a/src/Pages/Signup.jsx +++ /dev/null @@ -1,52 +0,0 @@ -import React, { Component } from 'react' -import { Link } from 'react-router-dom' -class SignUp extends Component { - render() { - return ( -
-

Sign Up

- -
- - -
-
- - -
-
- - -
-
- - -
-
- - - -
-

- Already registered sign in? -

-
- ) - } -} - -export default SignUp; \ No newline at end of file diff --git a/src/index.css b/src/index.css index a8c0777..69bd004 100644 --- a/src/index.css +++ b/src/index.css @@ -1,83 +1,9 @@ -@import url("https://fonts.googleapis.com/css2?family=Roboto&display=swap"); +@tailwind base; +@tailwind components; +@tailwind utilities; body { margin: 0; - box-sizing: border-box; - background: #408cff !important; - min-height: 100vh; - display: flex; - font-weight: 400; - font-family: "Fira Sans", sans-serif; + } -h1, -h2, -h3, -h4, -h5, -h6, -label, -span { - font-weight: 500; - font-family: "Fira Sans", sans-serif; -} - -body, -html, -.App, -#root, -.auth-wrapper { - width: 100%; - height: 100%; -} - -.navbar-light { - background-color: #ffffff; - box-shadow: 0px 14px 80px rgba(34, 35, 58, 0.2); -} - -.auth-wrapper { - display: flex; - justify-content: center; - flex-direction: column; - text-align: left; -} - -.auth-inner { - width: 450px; - margin: auto; - background: #ffffff; - box-shadow: 0px 14px 80px rgba(0, 1, 13, 0.2); - padding: 40px 55px 45px 55px; - border-radius: 15px; - transition: all 0.3s; -} - -.auth-wrapper .form-control:focus { - border-color: #00214c; - box-shadow: none; -} - -.auth-wrapper h3 { - text-align: center; - margin: 0; - line-height: 1; - padding-bottom: 20px; -} - -.custom-control-label { - font-weight: 400; -} - -.forgot-password, -.forgot-password a { - text-align: right; - font-size: 13px; - padding-top: 10px; - color: #0b0b0b; - margin: 0; -} - -.forgot-password a { - color: #0a0478; -} From 49b0cc60973f0622f999538c5f394757c4fc69f8 Mon Sep 17 00:00:00 2001 From: Divya Gandhi Date: Sun, 5 May 2024 01:31:46 +0530 Subject: [PATCH 24/82] Changes --- src/App.js | 11 ++++------- src/Components/Home/JobOpportunity.jsx | 4 ++-- src/Components/Home/LatestPosts.jsx | 2 +- src/Components/Home/ShareNotes.jsx | 4 ++-- src/Components/Home/Sidebar.jsx | 20 ++++++++++---------- src/index.css | 12 +++--------- 6 files changed, 22 insertions(+), 31 deletions(-) diff --git a/src/App.js b/src/App.js index e21e211..6d76518 100644 --- a/src/App.js +++ b/src/App.js @@ -1,10 +1,7 @@ -import './App.css' -import Home from './Pages/Home' -<<<<<<< HEAD -import { BrowserRouter, Route, Routes } from 'react-router-dom' -======= -import { BrowserRouter, Route, Routes} from 'react-router-dom' ->>>>>>> fa4b34b948b3866cfb4cb977e5467e6b78915dfa +import './App.css'; +import Home from './Pages/Home'; +import { BrowserRouter, Route, Routes } from 'react-router-dom'; // Choose one of the conflicting import statements + import PostJob from './Pages/PostJob'; import ViewJob from './Pages/ViewJob'; import NewPost from './Pages/NewPostPage'; diff --git a/src/Components/Home/JobOpportunity.jsx b/src/Components/Home/JobOpportunity.jsx index 6341747..29b0c04 100644 --- a/src/Components/Home/JobOpportunity.jsx +++ b/src/Components/Home/JobOpportunity.jsx @@ -55,7 +55,7 @@ function JobOpportunity() {

{data.heading1}

{data.heading2}

-

{data.body}

+

{data.body}

{data.icon } @@ -78,7 +78,7 @@ function JobOpportunity() {
})}
-

See more

+
) } diff --git a/src/Components/Home/LatestPosts.jsx b/src/Components/Home/LatestPosts.jsx index 9149f58..f0d87ff 100644 --- a/src/Components/Home/LatestPosts.jsx +++ b/src/Components/Home/LatestPosts.jsx @@ -60,7 +60,7 @@ function LatestPosts() {
})}
-

See more

+
) } diff --git a/src/Components/Home/ShareNotes.jsx b/src/Components/Home/ShareNotes.jsx index edd4163..edeee43 100644 --- a/src/Components/Home/ShareNotes.jsx +++ b/src/Components/Home/ShareNotes.jsx @@ -56,7 +56,7 @@ const cardData = [ function ShareNotes() { return (
-

+

Share Notes

@@ -85,7 +85,7 @@ function ShareNotes() {
})}
-

See more

+
) } diff --git a/src/Components/Home/Sidebar.jsx b/src/Components/Home/Sidebar.jsx index e1c737c..6dc8a31 100644 --- a/src/Components/Home/Sidebar.jsx +++ b/src/Components/Home/Sidebar.jsx @@ -53,25 +53,25 @@ const Sidebar = () => {
-
+
-
- +
+
-
+

Home

-
-
+
+

Discover

@@ -79,25 +79,25 @@ const Sidebar = () => {
-
+

Add Job Opportunity

-
+

Create New Post

-
+

Upload Notes

-
+

Share Video

diff --git a/src/index.css b/src/index.css index 0c5f667..19bce5f 100644 --- a/src/index.css +++ b/src/index.css @@ -1,19 +1,13 @@ @tailwind base; @tailwind components; @tailwind utilities; -<<<<<<< HEAD -body { +* { margin: 0; - + /* Set margin to 0 for all elements */ } -======= -*{ - margin: 0; -} body { box-sizing: border-box; - + /* Apply box-sizing to all elements in the body */ } ->>>>>>> fa4b34b948b3866cfb4cb977e5467e6b78915dfa From 7cbb7c8fd3118f793fbbee49d1172bd56c608501 Mon Sep 17 00:00:00 2001 From: Divya Gandhi Date: Sun, 5 May 2024 02:39:37 +0530 Subject: [PATCH 25/82] Add discover page --- src/App.js | 2 ++ src/Components/Discover/Discover.jsx | 52 ++++++++++++++++++++++++++++ src/Components/Home/Sidebar.jsx | 5 ++- src/Pages/DiscoverPage.jsx | 17 +++++++++ 4 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 src/Components/Discover/Discover.jsx create mode 100644 src/Pages/DiscoverPage.jsx diff --git a/src/App.js b/src/App.js index 6d76518..1eb7b8d 100644 --- a/src/App.js +++ b/src/App.js @@ -11,6 +11,7 @@ import Profile from './Pages/profile'; import NewNotes from './Components/Notes/NewNotes'; import ViewNote from './Components/Notes/ViewNote'; import UploadVideo from './Pages/UploadVideo'; +import DiscoverPage from './Pages/DiscoverPage'; function App() { return ( @@ -26,6 +27,7 @@ function App() { } /> } /> } /> + }/> ); diff --git a/src/Components/Discover/Discover.jsx b/src/Components/Discover/Discover.jsx new file mode 100644 index 0000000..df34fc1 --- /dev/null +++ b/src/Components/Discover/Discover.jsx @@ -0,0 +1,52 @@ +import React from 'react' + +function Discover() { + return ( +
+ +
+ +
+

Discover

+
+
+

All

+
+
+

Comps

+
+
+

IT

+
+
+

AIML

+
+
+

CSDS

+
+
+

AIML

+
+
+
+
+

Jobs

+
+
+

Posts

+
+
+

Notes

+
+
+

Videos

+
+ +
+
+
+
+ ) +} + +export default Discover \ No newline at end of file diff --git a/src/Components/Home/Sidebar.jsx b/src/Components/Home/Sidebar.jsx index 6dc8a31..097485d 100644 --- a/src/Components/Home/Sidebar.jsx +++ b/src/Components/Home/Sidebar.jsx @@ -32,6 +32,9 @@ const Sidebar = () => { setIsOpen(!isOpen); document.body.style.overflowY = isOpen ? 'auto' : 'hidden'; } + function Discover(){ + navigate('/DiscoverPage'); + } return (
@@ -72,7 +75,7 @@ const Sidebar = () => {
- +

Discover

diff --git a/src/Pages/DiscoverPage.jsx b/src/Pages/DiscoverPage.jsx new file mode 100644 index 0000000..28418b1 --- /dev/null +++ b/src/Pages/DiscoverPage.jsx @@ -0,0 +1,17 @@ +import React from 'react' +import Sidebar from '../Components/Home/Sidebar' +import Discover from '../Components/Discover/Discover' + +function DiscoverPage() { + return ( +
+ +
+ +
+ +
+ ) +} + +export default DiscoverPage \ No newline at end of file From a56bebaae3f047902c3a747aff54dcace2122e69 Mon Sep 17 00:00:00 2001 From: Divya Gandhi Date: Sun, 5 May 2024 11:35:05 +0530 Subject: [PATCH 26/82] Changes in home page --- src/Components/Home/JobOpportunity.jsx | 6 +++--- src/Components/Home/LatestPosts.jsx | 8 ++++---- src/Components/Home/ShareNotes.jsx | 10 +++++----- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/Components/Home/JobOpportunity.jsx b/src/Components/Home/JobOpportunity.jsx index 29b0c04..1efb016 100644 --- a/src/Components/Home/JobOpportunity.jsx +++ b/src/Components/Home/JobOpportunity.jsx @@ -45,11 +45,11 @@ const cardData = [ function JobOpportunity() { return (
-

- Explore Latest Job Opportunities +

+ Explore Latest Job Opportunities

-
+
{cardData.map((data, i) => { return
diff --git a/src/Components/Home/LatestPosts.jsx b/src/Components/Home/LatestPosts.jsx index f0d87ff..4399c7d 100644 --- a/src/Components/Home/LatestPosts.jsx +++ b/src/Components/Home/LatestPosts.jsx @@ -36,12 +36,12 @@ const cardData = [ ] function LatestPosts() { return ( -
+

- Latest Posts + Latest Posts

-
-
+
+
{cardData.map((data, i) => { return
diff --git a/src/Components/Home/ShareNotes.jsx b/src/Components/Home/ShareNotes.jsx index edeee43..93b6865 100644 --- a/src/Components/Home/ShareNotes.jsx +++ b/src/Components/Home/ShareNotes.jsx @@ -55,12 +55,12 @@ const cardData = [ ] function ShareNotes() { return ( -
-

- Share Notes +

+

+ Share Notes

-
-
+
+
{cardData.map((data, i) => { return
From 203329dfbbae09c2900f90da1c39ef799bccc53b Mon Sep 17 00:00:00 2001 From: anshshah23 Date: Sun, 19 May 2024 16:07:44 +0530 Subject: [PATCH 27/82] Added images for LoginPage, SignUp and Splash --- src/App.js | 7 ++- src/Pages/LoginPage.jsx | 56 ++++++++++----------- src/Pages/SignUp.jsx | 46 +++++++++++++++++ src/Pages/Splash.jsx | 39 +++++++++++++++ src/assets/loginimg-bottom.svg | 56 +++++++++++++++++++++ src/assets/loginimg-top.svg | 32 ++++++++++++ src/assets/signupimg.svg | 78 +++++++++++++++++++++++++++++ src/assets/splashimg-bottom.svg | 36 ++++++++++++++ src/assets/splashimg-top.svg | 88 +++++++++++++++++++++++++++++++++ 9 files changed, 408 insertions(+), 30 deletions(-) create mode 100644 src/Pages/SignUp.jsx create mode 100644 src/Pages/Splash.jsx create mode 100644 src/assets/loginimg-bottom.svg create mode 100644 src/assets/loginimg-top.svg create mode 100644 src/assets/signupimg.svg create mode 100644 src/assets/splashimg-bottom.svg create mode 100644 src/assets/splashimg-top.svg diff --git a/src/App.js b/src/App.js index 1eb7b8d..89ee320 100644 --- a/src/App.js +++ b/src/App.js @@ -6,19 +6,22 @@ import PostJob from './Pages/PostJob'; import ViewJob from './Pages/ViewJob'; import NewPost from './Pages/NewPostPage'; import UploadNewPosts from './Pages/UploadNewPosts'; -import LoginPage from './Pages/LoginPage'; +import SignUp from './Pages/SignUp'; import Profile from './Pages/profile'; import NewNotes from './Components/Notes/NewNotes'; import ViewNote from './Components/Notes/ViewNote'; import UploadVideo from './Pages/UploadVideo'; import DiscoverPage from './Pages/DiscoverPage'; - +import Splash from './Pages/Splash'; +import LoginPage from './Pages/LoginPage'; function App() { return ( } /> + } /> } /> + } /> } /> } /> } /> diff --git a/src/Pages/LoginPage.jsx b/src/Pages/LoginPage.jsx index eb08ebc..d02a374 100644 --- a/src/Pages/LoginPage.jsx +++ b/src/Pages/LoginPage.jsx @@ -1,8 +1,9 @@ import React from 'react'; import { useNavigate } from 'react-router-dom'; +import LoginImg1 from '../assets/loginimg-top.svg'; +import LoginImg2 from '../assets/loginimg-bottom.svg'; const LoginPage = () => { - const navigate = useNavigate(); function loginClick() { @@ -10,37 +11,36 @@ const LoginPage = () => { } return ( -
-
-

NOTENG

- Login +
+
+

NOTENG

+
+ Login +
-
-
-
-
- - -
-
- - -
-
- - -
-
- +
+
+
+ + +
+
+ + +
+
+
+
+
+ + Forgot your password? +
+
+ Login
); }; -export default LoginPage; \ No newline at end of file +export default LoginPage; diff --git a/src/Pages/SignUp.jsx b/src/Pages/SignUp.jsx new file mode 100644 index 0000000..c13eaab --- /dev/null +++ b/src/Pages/SignUp.jsx @@ -0,0 +1,46 @@ +import React from 'react'; +import { useNavigate } from 'react-router-dom'; +import SignUpImg from '../assets/signupimg.svg'; +const SignUp = () => { + + const navigate = useNavigate(); + + function signupClick() { + navigate('/'); + } + + return ( +
+
+

NOTENG

+ SignUp +
+
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+
+ ); +}; + +export default SignUp; \ No newline at end of file diff --git a/src/Pages/Splash.jsx b/src/Pages/Splash.jsx new file mode 100644 index 0000000..1fd5413 --- /dev/null +++ b/src/Pages/Splash.jsx @@ -0,0 +1,39 @@ +import React from 'react'; +import { useNavigate } from 'react-router-dom'; +import SplashImg1 from '../assets/splashimg-top.svg'; +import SplashImg2 from '../assets/splashimg-bottom.svg'; +const Splash = () => { + const navigate = useNavigate(); + + function loginClick() { + navigate('/'); + } + + function signupClick() { + navigate('/SignUp'); + } + return ( +
+
+
+ Illustration +
+
+

NOTENG

+
+
+ +
+
+ + +
+
+ Illustration +
+
+
+ ); +}; + +export default Splash; diff --git a/src/assets/loginimg-bottom.svg b/src/assets/loginimg-bottom.svg new file mode 100644 index 0000000..44f8708 --- /dev/null +++ b/src/assets/loginimg-bottom.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/loginimg-top.svg b/src/assets/loginimg-top.svg new file mode 100644 index 0000000..d17946d --- /dev/null +++ b/src/assets/loginimg-top.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/signupimg.svg b/src/assets/signupimg.svg new file mode 100644 index 0000000..89ee183 --- /dev/null +++ b/src/assets/signupimg.svg @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/splashimg-bottom.svg b/src/assets/splashimg-bottom.svg new file mode 100644 index 0000000..1d82c27 --- /dev/null +++ b/src/assets/splashimg-bottom.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/splashimg-top.svg b/src/assets/splashimg-top.svg new file mode 100644 index 0000000..145bbb3 --- /dev/null +++ b/src/assets/splashimg-top.svg @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 791445a2542198973af95f72afea62c94246eba9 Mon Sep 17 00:00:00 2001 From: anshshah23 Date: Sun, 19 May 2024 16:49:44 +0530 Subject: [PATCH 28/82] PostDetails.jsx is added along with its img and css --- src/App.js | 2 + src/Components/NewPost/viewpost.css | 47 ++++++++++++++++++++++ src/Pages/PostDetails.jsx | 61 +++++++++++++++++++++++++++++ src/assets/postdetails.svg | 9 +++++ 4 files changed, 119 insertions(+) create mode 100644 src/Components/NewPost/viewpost.css create mode 100644 src/Pages/PostDetails.jsx create mode 100644 src/assets/postdetails.svg diff --git a/src/App.js b/src/App.js index 89ee320..edd2a00 100644 --- a/src/App.js +++ b/src/App.js @@ -14,6 +14,7 @@ import UploadVideo from './Pages/UploadVideo'; import DiscoverPage from './Pages/DiscoverPage'; import Splash from './Pages/Splash'; import LoginPage from './Pages/LoginPage'; +import PostDetails from './Pages/PostDetails'; function App() { return ( @@ -27,6 +28,7 @@ function App() { } /> } /> } /> + } /> } /> } /> } /> diff --git a/src/Components/NewPost/viewpost.css b/src/Components/NewPost/viewpost.css new file mode 100644 index 0000000..8a3340b --- /dev/null +++ b/src/Components/NewPost/viewpost.css @@ -0,0 +1,47 @@ +.subtitle{ + font-size: 1.9rem; + font-weight: 600; + color: #20222E; + margin-top: 32px; + margin-bottom: 1rem; + display: flex; + justify-content: center; +} + +.head3{ + font-size: 32px; + color: #8391A1; + display: flex; + justify-content: center; + margin-top: 20px; +} +.notes-description{ + margin-top: 20px; + margin-left: 40px; + font-size: 24px; +} +.postimg{ + width: 1058px; + height: 208px; + margin-top: 40px; + margin-left: 67px; + border: 2px solid black; + border-radius: 10px; + margin-bottom: 24px; + overflow: hidden; +} + +.company-description{ + font-size: 24px; + margin:32px 0px 10px 3vw; + font-family: Poppins; + font-weight: 600; +} + +.badges{ + width: 200px; +} +.badges1{ + margin-top: 30px; + width: 200px; +} \ No newline at end of file diff --git a/src/Pages/PostDetails.jsx b/src/Pages/PostDetails.jsx new file mode 100644 index 0000000..e31a9f3 --- /dev/null +++ b/src/Pages/PostDetails.jsx @@ -0,0 +1,61 @@ +import React from 'react'; +import { useNavigate } from 'react-router-dom'; +import Sidebar from '../Components/Home/Sidebar'; +import BackButton from '../assets/BackButton.png'; +import { Button } from '@mui/material'; +import '../styles/ViewJob.css'; +import '../Components/NewPost/viewpost.css'; +import PosDetailsImg from '../assets/postdetails.svg'; +const PostDetails = () => { + const navigate = useNavigate(); + + const handleGoBack = (event) => { + event.preventDefault(); + navigate.goBack(); + }; + + return ( +
+ + <> +
+
+ +

+ Post Details +

+
+
+
+

Post Title

+
+
+

Post Description

+

Hey tech enthusiasts and innovators! Are you ready to showcase your skills, collaborate with like-minded individuals, and create groundbreaking solutions to real-world challenges? your calendars for the Annual Tech Innovators Hackathon, where creativity meets technology..

+
+
+
+
+

Posted By:

+

Ansh Shah

+
+
+

19th May 2024

+

16:22

+
+
+ +
+
+ +
+ +
+ ) +} + +export default PostDetails; \ No newline at end of file diff --git a/src/assets/postdetails.svg b/src/assets/postdetails.svg new file mode 100644 index 0000000..f370547 --- /dev/null +++ b/src/assets/postdetails.svg @@ -0,0 +1,9 @@ + + + + + + + + + From c43353658ab74e287b901d65e1be4e043b9bdaaa Mon Sep 17 00:00:00 2001 From: Divya Gandhi Date: Fri, 7 Jun 2024 17:48:34 +0530 Subject: [PATCH 29/82] Changes in Discover Page --- src/Components/Discover/Cards.jsx | 75 +++++++++++++++++++++++++ src/Components/Discover/CardsCoulmn.jsx | 75 +++++++++++++++++++++++++ src/Pages/DiscoverPage.jsx | 7 ++- 3 files changed, 155 insertions(+), 2 deletions(-) create mode 100644 src/Components/Discover/Cards.jsx create mode 100644 src/Components/Discover/CardsCoulmn.jsx diff --git a/src/Components/Discover/Cards.jsx b/src/Components/Discover/Cards.jsx new file mode 100644 index 0000000..7473a76 --- /dev/null +++ b/src/Components/Discover/Cards.jsx @@ -0,0 +1,75 @@ +import React from 'react' +import CalendarTodayIcon from '@mui/icons-material/CalendarToday'; +import AccessTimeOutlinedIcon from '@mui/icons-material/AccessTimeOutlined'; +import SmartphoneOutlinedIcon from '@mui/icons-material/SmartphoneOutlined'; +import DeleteIcon from '@mui/icons-material/Delete'; +const cardData=[ + { + "heading1": 'Internship', + "heading2": 'Company Name', + "body": "We are seeking highly motivated and enthusiastic technology intern to join us", + "icon": , + "time": "3 Months", + "timeicon": , + 'timelimit': 'Part-time', + "mode": "Online", + "mobile": , + "date": "24th March,2024" + }, + { + "heading1": 'Internship', + "heading2": 'Company Name', + "body": "We are seeking highly motivated and enthusiastic technology intern to join us", + "icon": , + "time": "3 Months", + "timeicon": , + 'timelimit': 'Part-time', + "mode": "Online", + "mobile": , + "date": "24th March,2024" + }, + +] +function Cards() { + return ( +
+ +
+
+ {cardData.map((data, i) => { + return ( +
+
+
+ +
+

{data.heading1}

+

{data.heading2}

+

{data.body}

+
+
+ {data.icon} +

{data.time}

+
+
+ {data.timeicon} +

{data.timelimit}

+
+
+ {data.mobile} +

{data.mode}

+
+
+

{data.date}

+
+
+
+
+ ); + })} +
+
+ ) +} + +export default Cards \ No newline at end of file diff --git a/src/Components/Discover/CardsCoulmn.jsx b/src/Components/Discover/CardsCoulmn.jsx new file mode 100644 index 0000000..fd1cf47 --- /dev/null +++ b/src/Components/Discover/CardsCoulmn.jsx @@ -0,0 +1,75 @@ +import React from 'react' +import CalendarTodayIcon from '@mui/icons-material/CalendarToday'; +import AccessTimeOutlinedIcon from '@mui/icons-material/AccessTimeOutlined'; +import SmartphoneOutlinedIcon from '@mui/icons-material/SmartphoneOutlined'; +import DeleteIcon from '@mui/icons-material/Delete'; +const cardData=[ + { + "heading1": 'Internship', + "heading2": 'Company Name', + "body": "We are seeking highly motivated and enthusiastic technology intern to join us", + "icon": , + "time": "3 Months", + "timeicon": , + 'timelimit': 'Part-time', + "mode": "Online", + "mobile": , + "date": "24th March,2024" + }, + { + "heading1": 'Internship', + "heading2": 'Company Name', + "body": "We are seeking highly motivated and enthusiastic technology intern to join us", + "icon": , + "time": "3 Months", + "timeicon": , + 'timelimit': 'Part-time', + "mode": "Online", + "mobile": , + "date": "24th March,2024" + }, + +] +function CardsCoulmn() { + return ( +
+ +
+
+ {cardData.map((data, i) => { + return ( +
+
+
+ +
+

{data.heading1}

+

{data.heading2}

+

{data.body}

+
+
+ {data.icon} +

{data.time}

+
+
+ {data.timeicon} +

{data.timelimit}

+
+
+ {data.mobile} +

{data.mode}

+
+
+

{data.date}

+
+
+
+
+ ); + })} +
+
+ ) +} + +export default CardsCoulmn \ No newline at end of file diff --git a/src/Pages/DiscoverPage.jsx b/src/Pages/DiscoverPage.jsx index 28418b1..8955feb 100644 --- a/src/Pages/DiscoverPage.jsx +++ b/src/Pages/DiscoverPage.jsx @@ -1,13 +1,16 @@ import React from 'react' import Sidebar from '../Components/Home/Sidebar' import Discover from '../Components/Discover/Discover' - +import Cards from '../Components/Discover/Cards' +import CardsCoulmn from '../Components/Discover/CardsCoulmn' function DiscoverPage() { return (
-
+
+ +
From 2ef93761c3332aa478fce761e3326395b96150cb Mon Sep 17 00:00:00 2001 From: Divya Gandhi Date: Fri, 7 Jun 2024 18:39:35 +0530 Subject: [PATCH 30/82] Changes --- src/Components/Home/Sidebar.jsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Components/Home/Sidebar.jsx b/src/Components/Home/Sidebar.jsx index 097485d..57b918c 100644 --- a/src/Components/Home/Sidebar.jsx +++ b/src/Components/Home/Sidebar.jsx @@ -6,6 +6,7 @@ import AddIcon from '@mui/icons-material/Add'; import { useNavigate } from 'react-router-dom'; import Sidebarresponsive from './Sidebarresponsive'; import CloseIcon from '@mui/icons-material/Close'; +import ExploreIcon from '@mui/icons-material/Explore'; // import LoginPage from '../../Pages/LoginPage'; const Sidebar = () => { const navigate = useNavigate(); @@ -75,7 +76,7 @@ const Sidebar = () => {
- + < ExploreIcon style={{ width: '30px', height: '30px', color: '#394DFD' }} onClick={Discover}/>

Discover

From aabc7831e8df870923f653b80b0ac5d2ffaee0a8 Mon Sep 17 00:00:00 2001 From: MonilMehta Date: Sat, 8 Jun 2024 13:16:23 +0530 Subject: [PATCH 31/82] Integrated Job Posting,Video Posting and Job view pages --- package-lock.json | 4760 +++++++++++++---------------- package.json | 3 + src/App.js | 5 +- src/Components/Home/Sidebar.jsx | 5 +- src/Components/Notes/ViewNote.jsx | 181 +- src/Pages/PostJob.jsx | 145 +- src/Pages/UploadVideo.jsx | 69 +- src/Pages/ViewJob.jsx | 140 +- 8 files changed, 2434 insertions(+), 2874 deletions(-) diff --git a/package-lock.json b/package-lock.json index 41e230d..3262f87 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,9 @@ "@testing-library/jest-dom": "^5.17.0", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", + "axios": "^1.6.8", + "bootstrap": "^5.3.3", + "debug": "^4.3.4", "react": "^18.2.0", "react-dom": "^18.2.0", "react-icons": "^5.0.1", @@ -27,14 +30,6 @@ "tailwindcss": "^3.4.3" } }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@adobe/css-tools": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.3.tgz", @@ -76,28 +71,28 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.1.tgz", - "integrity": "sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", + "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.3.tgz", - "integrity": "sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz", + "integrity": "sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.1", + "@babel/generator": "^7.24.5", "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.1", - "@babel/parser": "^7.24.1", + "@babel/helper-module-transforms": "^7.24.5", + "@babel/helpers": "^7.24.5", + "@babel/parser": "^7.24.5", "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0", + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -112,6 +107,11 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -121,9 +121,9 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.24.1.tgz", - "integrity": "sha512-d5guuzMlPeDfZIbpQ8+g1NaCNuAGBBGNECh0HVqz1sjOeVLh2CEaifuOysCH18URW6R7pqXINvf5PaR/dC6jLQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.24.5.tgz", + "integrity": "sha512-gsUcqS/fPlgAw1kOtpss7uhY6E9SFFANQ6EFX5GTvzUwaV0+sGaZWk6xq22MOdeT9wfxyokW3ceCUvOiRtZciQ==", "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", "eslint-visitor-keys": "^2.1.0", @@ -134,7 +134,7 @@ }, "peerDependencies": { "@babel/core": "^7.11.0", - "eslint": "^7.5.0 || ^8.0.0" + "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" } }, "node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": { @@ -154,11 +154,11 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.1.tgz", - "integrity": "sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz", + "integrity": "sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==", "dependencies": { - "@babel/types": "^7.24.0", + "@babel/types": "^7.24.5", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -213,18 +213,18 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.1.tgz", - "integrity": "sha512-1yJa9dX9g//V6fDebXoEfEsxkZHk3Hcbm+zLhyu6qVgYFLvmTALTeV+jNU9e5RnYtioBrGEOdoI2joMSNQ/+aA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.5.tgz", + "integrity": "sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.24.5", "@babel/helper-optimise-call-expression": "^7.22.5", "@babel/helper-replace-supers": "^7.24.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-split-export-declaration": "^7.24.5", "semver": "^6.3.1" }, "engines": { @@ -267,9 +267,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz", - "integrity": "sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", + "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", "@babel/helper-plugin-utils": "^7.22.5", @@ -313,11 +313,11 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.5.tgz", + "integrity": "sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA==", "dependencies": { - "@babel/types": "^7.23.0" + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -335,15 +335,15 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz", + "integrity": "sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==", "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-imports": "^7.24.3", + "@babel/helper-simple-access": "^7.24.5", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/helper-validator-identifier": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -364,9 +364,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", - "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz", + "integrity": "sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==", "engines": { "node": ">=6.9.0" } @@ -404,11 +404,11 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz", + "integrity": "sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -426,11 +426,11 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", + "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -445,9 +445,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", + "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", "engines": { "node": ">=6.9.0" } @@ -461,37 +461,37 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.5.tgz", + "integrity": "sha512-/xxzuNvgRl4/HLNKvnFwdhdgN3cpLxgLROeLDl83Yx0AJ1SGvq1ak0OszTOjDfiB8Vx03eJbeDWh9r+jCCWttw==", "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" + "@babel/helper-function-name": "^7.23.0", + "@babel/template": "^7.24.0", + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.1.tgz", - "integrity": "sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.5.tgz", + "integrity": "sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==", "dependencies": { "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0" + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", - "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.5.tgz", + "integrity": "sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.24.5", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" @@ -500,10 +500,74 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", - "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", + "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", "bin": { "parser": "bin/babel-parser.js" }, @@ -511,6 +575,21 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.5.tgz", + "integrity": "sha512-LdXRi1wEMTrHVR4Zc9F8OewC3vdm5h4QB6L71zy6StmYeqGi1b3ttIO8UC+BfZKcH9jdr4aI249rBkm+3+YvHw==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.24.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.24.1", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz", @@ -1010,11 +1089,11 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.1.tgz", - "integrity": "sha512-h71T2QQvDgM2SmT29UYU6ozjMlAt7s7CSs5Hvy8f8cf/GM/Z4a2zMfN+fjVGaieeCrXR3EdQl6C4gQG+OgmbKw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.5.tgz", + "integrity": "sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -1039,11 +1118,11 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.1.tgz", - "integrity": "sha512-FUHlKCn6J3ERiu8Dv+4eoz7w8+kFLSyeVG4vDAikwADGjUCoHw/JHokyGtr8OR4UjpwPVivyF+h8Q5iv/JmrtA==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz", + "integrity": "sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-create-class-features-plugin": "^7.24.4", "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, @@ -1055,17 +1134,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz", - "integrity": "sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.5.tgz", + "integrity": "sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-split-export-declaration": "^7.24.5", "globals": "^11.1.0" }, "engines": { @@ -1091,11 +1170,11 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz", - "integrity": "sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.5.tgz", + "integrity": "sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -1405,14 +1484,14 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz", - "integrity": "sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.5.tgz", + "integrity": "sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA==", "dependencies": { "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.1" + "@babel/plugin-transform-parameters": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -1452,11 +1531,11 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz", - "integrity": "sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.5.tgz", + "integrity": "sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, @@ -1468,11 +1547,11 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz", - "integrity": "sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.5.tgz", + "integrity": "sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -1497,13 +1576,13 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz", - "integrity": "sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.5.tgz", + "integrity": "sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-create-class-features-plugin": "^7.24.5", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -1716,11 +1795,11 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz", - "integrity": "sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.5.tgz", + "integrity": "sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -1730,13 +1809,13 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.1.tgz", - "integrity": "sha512-liYSESjX2fZ7JyBFkYG78nfvHlMKE6IpNdTVnxmlYUR+j5ZLsitFbaAE+eJSK2zPPkNWNw4mXL51rQ8WrvdK0w==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.5.tgz", + "integrity": "sha512-E0VWu/hk83BIFUWnsKZ4D81KXjN5L3MobvevOHErASk9IPwKHOkTgvqzvNo1yP/ePJWqqK2SpUR5z+KQbl6NVw==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-create-class-features-plugin": "^7.24.5", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/plugin-syntax-typescript": "^7.24.1" }, "engines": { @@ -1806,14 +1885,15 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.3.tgz", - "integrity": "sha512-fSk430k5c2ff8536JcPvPWK4tZDwehWLGlBp0wrsBUjZVdeQV6lePbwKWZaZfK2vnh/1kQX1PzAJWsnBmVgGJA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.5.tgz", + "integrity": "sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ==", "dependencies": { - "@babel/compat-data": "^7.24.1", + "@babel/compat-data": "^7.24.4", "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.5", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", @@ -1840,12 +1920,12 @@ "@babel/plugin-transform-async-generator-functions": "^7.24.3", "@babel/plugin-transform-async-to-generator": "^7.24.1", "@babel/plugin-transform-block-scoped-functions": "^7.24.1", - "@babel/plugin-transform-block-scoping": "^7.24.1", + "@babel/plugin-transform-block-scoping": "^7.24.5", "@babel/plugin-transform-class-properties": "^7.24.1", - "@babel/plugin-transform-class-static-block": "^7.24.1", - "@babel/plugin-transform-classes": "^7.24.1", + "@babel/plugin-transform-class-static-block": "^7.24.4", + "@babel/plugin-transform-classes": "^7.24.5", "@babel/plugin-transform-computed-properties": "^7.24.1", - "@babel/plugin-transform-destructuring": "^7.24.1", + "@babel/plugin-transform-destructuring": "^7.24.5", "@babel/plugin-transform-dotall-regex": "^7.24.1", "@babel/plugin-transform-duplicate-keys": "^7.24.1", "@babel/plugin-transform-dynamic-import": "^7.24.1", @@ -1865,13 +1945,13 @@ "@babel/plugin-transform-new-target": "^7.24.1", "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", "@babel/plugin-transform-numeric-separator": "^7.24.1", - "@babel/plugin-transform-object-rest-spread": "^7.24.1", + "@babel/plugin-transform-object-rest-spread": "^7.24.5", "@babel/plugin-transform-object-super": "^7.24.1", "@babel/plugin-transform-optional-catch-binding": "^7.24.1", - "@babel/plugin-transform-optional-chaining": "^7.24.1", - "@babel/plugin-transform-parameters": "^7.24.1", + "@babel/plugin-transform-optional-chaining": "^7.24.5", + "@babel/plugin-transform-parameters": "^7.24.5", "@babel/plugin-transform-private-methods": "^7.24.1", - "@babel/plugin-transform-private-property-in-object": "^7.24.1", + "@babel/plugin-transform-private-property-in-object": "^7.24.5", "@babel/plugin-transform-property-literals": "^7.24.1", "@babel/plugin-transform-regenerator": "^7.24.1", "@babel/plugin-transform-reserved-words": "^7.24.1", @@ -1879,7 +1959,7 @@ "@babel/plugin-transform-spread": "^7.24.1", "@babel/plugin-transform-sticky-regex": "^7.24.1", "@babel/plugin-transform-template-literals": "^7.24.1", - "@babel/plugin-transform-typeof-symbol": "^7.24.1", + "@babel/plugin-transform-typeof-symbol": "^7.24.5", "@babel/plugin-transform-unicode-escapes": "^7.24.1", "@babel/plugin-transform-unicode-property-regex": "^7.24.1", "@babel/plugin-transform-unicode-regex": "^7.24.1", @@ -1962,9 +2042,9 @@ "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" }, "node_modules/@babel/runtime": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.1.tgz", - "integrity": "sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz", + "integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -1986,18 +2066,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", - "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.5.tgz", + "integrity": "sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==", "dependencies": { - "@babel/code-frame": "^7.24.1", - "@babel/generator": "^7.24.1", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.5", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.1", - "@babel/types": "^7.24.0", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/parser": "^7.24.5", + "@babel/types": "^7.24.5", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2006,12 +2086,12 @@ } }, "node_modules/@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", + "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.1", + "@babel/helper-validator-identifier": "^7.24.5", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2311,30 +2391,6 @@ "stylis": "4.2.0" } }, - "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "node_modules/@emotion/babel-plugin/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@emotion/babel-plugin/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@emotion/cache": { "version": "11.11.0", "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", @@ -2544,28 +2600,28 @@ } }, "node_modules/@floating-ui/core": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", - "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.1.tgz", + "integrity": "sha512-42UH54oPZHPdRHdw6BgoBD6cg/eVTmVrFcgeRDM3jbO7uxSoipVcmcIGFcA5jmOHO5apcyvBhkSKES3fQJnu7A==", "dependencies": { - "@floating-ui/utils": "^0.2.1" + "@floating-ui/utils": "^0.2.0" } }, "node_modules/@floating-ui/dom": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz", - "integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==", + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.4.tgz", + "integrity": "sha512-0G8R+zOvQsAG1pg2Q99P21jiqxqGBW1iRe/iXHsBRBxnpXKFI8QwbB4x5KmYLggNO5m34IQgOIu9SCRfR/WWiQ==", "dependencies": { "@floating-ui/core": "^1.0.0", "@floating-ui/utils": "^0.2.0" } }, "node_modules/@floating-ui/react-dom": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.8.tgz", - "integrity": "sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.9.tgz", + "integrity": "sha512-q0umO0+LQK4+p6aGyvzASqKbKOJcAHJ7ycE9CuUvfx3s9zTHWmGJTPOIlM/hmSBfUfg/XfY5YhLBLR/LHwShQQ==", "dependencies": { - "@floating-ui/dom": "^1.6.1" + "@floating-ui/dom": "^1.0.0" }, "peerDependencies": { "react": ">=16.8.0", @@ -2573,14 +2629,14 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", - "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz", + "integrity": "sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==" }, "node_modules/@fontsource/poppins": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/@fontsource/poppins/-/poppins-5.0.13.tgz", - "integrity": "sha512-8G9odFoxH43oZpvq43fpGucm8iHm6iatu0M1LIshb+tx3/y6YBXenVED7CI4resvPz6hyDu8a2vHSh9vrpe+wQ==" + "version": "5.0.14", + "resolved": "https://registry.npmjs.org/@fontsource/poppins/-/poppins-5.0.14.tgz", + "integrity": "sha512-nmM1zpPo3Uh4JcGAVSQuWaZNYh2FbbwWhZ5t6hRaynmJaNTBW85d3nEh9zMmzI0HX7X5xqQVdRHeDatKpOGsnA==" }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", @@ -2608,9 +2664,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==" }, "node_modules/@isaacs/cliui": { "version": "8.0.2", @@ -2719,50 +2775,10 @@ "node": ">=6" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "engines": { "node": ">=8" } @@ -2791,68 +2807,62 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/@jest/console/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@jest/console/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", "dependencies": { - "color-convert": "^2.0.1" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/@jest/console/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@jest/console/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "@types/yargs-parser": "*" } }, - "node_modules/@jest/console/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@jest/console/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", "dependencies": { - "color-name": "~1.1.4" + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" }, "engines": { - "node": ">=7.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/@jest/console/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@jest/console/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@jest/console/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", "dependencies": { - "has-flag": "^4.0.0" + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" }, "engines": { - "node": ">=8" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/core": { @@ -2901,68 +2911,62 @@ } } }, - "node_modules/@jest/core/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@jest/core/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", "dependencies": { - "color-convert": "^2.0.1" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/@jest/core/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@jest/core/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "@types/yargs-parser": "*" } }, - "node_modules/@jest/core/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@jest/core/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", "dependencies": { - "color-name": "~1.1.4" + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" }, "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/core/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@jest/core/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/@jest/core/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@jest/core/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", "dependencies": { - "has-flag": "^4.0.0" + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" }, "engines": { - "node": ">=8" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/environment": { @@ -2979,6 +2983,29 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/@jest/environment/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/environment/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, "node_modules/@jest/expect-utils": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", @@ -2990,14 +3017,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/expect-utils/node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/@jest/fake-timers": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", @@ -3014,143 +3033,276 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/@jest/globals": { + "node_modules/@jest/fake-timers/node_modules/@jest/types": { "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", - "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/types": "^27.5.1", - "expect": "^27.5.1" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/@jest/reporters": { + "node_modules/@jest/fake-timers/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/fake-timers/node_modules/jest-message-util": { "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", - "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", + "@babel/code-frame": "^7.12.13", "@jest/types": "^27.5.1", - "@types/node": "*", + "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-haste-map": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^8.1.0" + "stack-utils": "^2.0.3" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } } }, - "node_modules/@jest/reporters/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@jest/fake-timers/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", "dependencies": { - "color-convert": "^2.0.1" + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/@jest/reporters/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@jest/globals": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", + "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@jest/environment": "^27.5.1", + "@jest/types": "^27.5.1", + "expect": "^27.5.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/@jest/reporters/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@jest/globals/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", "dependencies": { - "color-name": "~1.1.4" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" }, "engines": { - "node": ">=7.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/@jest/reporters/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@jest/reporters/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" + "node_modules/@jest/globals/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "dependencies": { + "@types/yargs-parser": "*" } }, - "node_modules/@jest/reporters/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/@jest/globals/node_modules/diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", "engines": { - "node": ">=0.10.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/@jest/reporters/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@jest/globals/node_modules/expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", "dependencies": { - "has-flag": "^4.0.0" + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" }, "engines": { - "node": ">=8" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals/node_modules/jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals/node_modules/jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", + "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-haste-map": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^8.1.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/reporters/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" } }, "node_modules/@jest/schemas": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", - "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dependencies": { - "@sinclair/typebox": "^0.24.1" + "@sinclair/typebox": "^0.27.8" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/source-map": { @@ -3188,6 +3340,29 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/@jest/test-result/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/test-result/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, "node_modules/@jest/test-sequencer": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", @@ -3227,62 +3402,43 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/@jest/transform/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@jest/transform/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", "dependencies": { - "color-convert": "^2.0.1" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/@jest/transform/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@jest/transform/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "@types/yargs-parser": "*" } }, - "node_modules/@jest/transform/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@jest/transform/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", "dependencies": { - "color-name": "~1.1.4" + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" }, "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/transform/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@jest/transform/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "node_modules/@jest/transform/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/transform/node_modules/source-map": { @@ -3293,94 +3449,20 @@ "node": ">=0.10.0" } }, - "node_modules/@jest/transform/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dependencies": { + "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", - "@types/yargs": "^16.0.0", + "@types/yargs": "^17.0.8", "chalk": "^4.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/types/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/types/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/types/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/types/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@jest/types/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/types/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jridgewell/gen-mapping": { @@ -3472,18 +3554,18 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "5.15.14", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.14.tgz", - "integrity": "sha512-on75VMd0XqZfaQW+9pGjSNiqW+ghc5E2ZSLRBXwcXl/C4YzjfyjrLPhrEpKnR9Uym9KXBvxrhoHfPcczYHweyA==", + "version": "5.15.16", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.16.tgz", + "integrity": "sha512-PTIbMJs5C/vYMfyJNW8ArOezh4eyHkg2pTeA7bBxh2kLP1Uzs0Nm+krXWbWGJPwTWjM8EhnDrr4aCF26+2oleg==", "funding": { "type": "opencollective", "url": "https://opencollective.com/mui-org" } }, "node_modules/@mui/icons-material": { - "version": "5.15.14", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.15.14.tgz", - "integrity": "sha512-vj/51k7MdFmt+XVw94sl30SCvGx6+wJLsNYjZRgxhS6y3UtnWnypMOsm3Kmg8TN+P0dqwsjy4/fX7B1HufJIhw==", + "version": "5.15.16", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.15.16.tgz", + "integrity": "sha512-s8vYbyACzTNZRKv+20fCfVXJwJqNcVotns2EKnu1wmAga6wv2LAo5kB1d5yqQqZlMFtp34EJvRXf7cy8X0tJVA==", "dependencies": { "@babel/runtime": "^7.23.9" }, @@ -3506,14 +3588,14 @@ } }, "node_modules/@mui/material": { - "version": "5.15.14", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.14.tgz", - "integrity": "sha512-kEbRw6fASdQ1SQ7LVdWR5OlWV3y7Y54ZxkLzd6LV5tmz+NpO3MJKZXSfgR0LHMP7meKsPiMm4AuzV0pXDpk/BQ==", + "version": "5.15.16", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.16.tgz", + "integrity": "sha512-ery2hFReewko9gpDBqOr2VmXwQG9ifXofPhGzIx09/b9JqCQC/06kZXZDGGrOTpIddK9HlIf4yrS+G70jPAzUQ==", "dependencies": { "@babel/runtime": "^7.23.9", "@mui/base": "5.0.0-beta.40", - "@mui/core-downloads-tracker": "^5.15.14", - "@mui/system": "^5.15.14", + "@mui/core-downloads-tracker": "^5.15.16", + "@mui/system": "^5.15.15", "@mui/types": "^7.2.14", "@mui/utils": "^5.15.14", "@types/react-transition-group": "^4.4.10", @@ -3549,11 +3631,6 @@ } } }, - "node_modules/@mui/material/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - }, "node_modules/@mui/private-theming": { "version": "5.15.14", "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.14.tgz", @@ -3612,9 +3689,9 @@ } }, "node_modules/@mui/system": { - "version": "5.15.14", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.14.tgz", - "integrity": "sha512-auXLXzUaCSSOLqJXmsAaq7P96VPRXg2Rrz6OHNV7lr+kB8lobUF+/N84Vd9C4G/wvCXYPs5TYuuGBRhcGbiBGg==", + "version": "5.15.15", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.15.tgz", + "integrity": "sha512-aulox6N1dnu5PABsfxVGOZffDVmlxPOVgj56HrUnJE8MCSh8lOvvkd47cebIVQQYAjpwieXQXiDPj5pwM40jTQ==", "dependencies": { "@babel/runtime": "^7.23.9", "@mui/private-theming": "^5.15.14", @@ -3690,11 +3767,6 @@ } } }, - "node_modules/@mui/utils/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - }, "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { "version": "5.1.1-v1", "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", @@ -3765,15 +3837,13 @@ } }, "node_modules/@pmmmwh/react-refresh-webpack-plugin": { - "version": "0.5.11", - "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.11.tgz", - "integrity": "sha512-7j/6vdTym0+qZ6u4XbSAxrWBGYSdCfTzySkj7WAFgDLmSyWlOrWvpyzxlFh5jtw9dn0oL/jtW+06XfFiisN3JQ==", + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.13.tgz", + "integrity": "sha512-odZVYXly+JwzYri9rKqqUAk0cY6zLpv4dxoKinhoJNShV36Gpxf+CyDIILJ4tYsJ1ZxIWs233Y39iVnynvDA/g==", "dependencies": { "ansi-html-community": "^0.0.8", - "common-path-prefix": "^3.0.0", "core-js-pure": "^3.23.3", "error-stack-parser": "^2.0.6", - "find-up": "^5.0.0", "html-entities": "^2.1.0", "loader-utils": "^2.0.4", "schema-utils": "^3.0.0", @@ -3788,7 +3858,7 @@ "sockjs-client": "^1.4.0", "type-fest": ">=0.17.0 <5.0.0", "webpack": ">=4.43.0 <6.0.0", - "webpack-dev-server": "3.x || 4.x", + "webpack-dev-server": "3.x || 4.x || 5.x", "webpack-hot-middleware": "2.x", "webpack-plugin-serve": "0.x || 1.x" }, @@ -3813,6 +3883,14 @@ } } }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "engines": { + "node": ">= 8" + } + }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -3823,9 +3901,9 @@ } }, "node_modules/@remix-run/router": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.3.tgz", - "integrity": "sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.16.0.tgz", + "integrity": "sha512-Quz1KOffeEf/zwkCBM3kBtH4ZoZ+pT3xIXBG4PPW/XFtDP7EGhtTiC2+gpL9GnR7+Qdet5Oa6cYSvwKYg6kN9Q==", "engines": { "node": ">=14.0.0" } @@ -3905,14 +3983,14 @@ "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" }, "node_modules/@rushstack/eslint-patch": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.1.tgz", - "integrity": "sha512-S3Kq8e7LqxkA9s7HKLqXGTGck1uwis5vAXan3FnU5yw1Ec5hsSGnq4s/UCaSqABPOnOTg7zASLyst7+ohgWexg==" + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.2.tgz", + "integrity": "sha512-hw437iINopmQuxWPSUEvqE56NCPsiU8N4AYtfHmJFckclktzK9YQJieD3XkDCDH4OjL+C7zgPUh73R/nrcHrqw==" }, "node_modules/@sinclair/typebox": { - "version": "0.24.51", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", - "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==" + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" }, "node_modules/@sinonjs/commons": { "version": "1.8.6", @@ -4149,101 +4227,22 @@ } }, "node_modules/@testing-library/dom": { - "version": "9.3.4", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz", - "integrity": "sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.1.0.tgz", + "integrity": "sha512-wdsYKy5zupPyLCW2Je5DLHSxSfbIp6h80WoHOQc+RPtmPGA52O9x5MJEkv92Sjonpq+poOAtUKhh1kBGAXBrNA==", "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", "@types/aria-query": "^5.0.1", - "aria-query": "5.1.3", + "aria-query": "5.3.0", "chalk": "^4.1.0", "dom-accessibility-api": "^0.5.9", "lz-string": "^1.5.0", "pretty-format": "^27.0.2" }, "engines": { - "node": ">=14" - } - }, - "node_modules/@testing-library/dom/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@testing-library/dom/node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", - "peer": true, - "dependencies": { - "deep-equal": "^2.0.5" - } - }, - "node_modules/@testing-library/dom/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@testing-library/dom/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@testing-library/dom/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "peer": true - }, - "node_modules/@testing-library/dom/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/dom/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "node": ">=18" } }, "node_modules/@testing-library/jest-dom": { @@ -4267,20 +4266,6 @@ "yarn": ">=1" } }, - "node_modules/@testing-library/jest-dom/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/@testing-library/jest-dom/node_modules/chalk": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", @@ -4293,41 +4278,6 @@ "node": ">=8" } }, - "node_modules/@testing-library/jest-dom/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@testing-library/jest-dom/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@testing-library/jest-dom/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/jest-dom/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@testing-library/react": { "version": "13.4.0", "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-13.4.0.tgz", @@ -4363,20 +4313,6 @@ "node": ">=12" } }, - "node_modules/@testing-library/react/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/@testing-library/react/node_modules/aria-query": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", @@ -4385,77 +4321,27 @@ "deep-equal": "^2.0.5" } }, - "node_modules/@testing-library/react/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@testing-library/user-event": { + "version": "13.5.0", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-13.5.0.tgz", + "integrity": "sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@babel/runtime": "^7.12.5" }, "engines": { - "node": ">=10" + "node": ">=10", + "npm": ">=6" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" } }, - "node_modules/@testing-library/react/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@testing-library/react/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@testing-library/react/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/react/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/user-event": { - "version": "13.5.0", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-13.5.0.tgz", - "integrity": "sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==", - "dependencies": { - "@babel/runtime": "^7.12.5" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - }, - "peerDependencies": { - "@testing-library/dom": ">=7.21.4" - } - }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "engines": { - "node": ">= 6" + "node": ">= 6" } }, "node_modules/@trysound/sax": { @@ -4543,9 +4429,9 @@ } }, "node_modules/@types/eslint": { - "version": "8.56.6", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.6.tgz", - "integrity": "sha512-ymwc+qb1XkjT/gfoQwxIeHZ6ixH23A+tCT2ADSA/DPVKzAjwYkTXBMCQ/f6fe4wEa85Lhp26VPeUxI7wMhAi7A==", + "version": "8.56.10", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", + "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -4577,9 +4463,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.43", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz", - "integrity": "sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.0.tgz", + "integrity": "sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -4643,191 +4529,15 @@ "pretty-format": "^29.0.0" } }, - "node_modules/@types/jest/node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@types/jest/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@types/jest/node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" - }, - "node_modules/@types/jest/node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, "node_modules/@types/jest/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@types/jest/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@types/jest/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@types/jest/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@types/jest/node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@types/jest/node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "dependencies": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@types/jest/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@types/jest/node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@types/jest/node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@types/jest/node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@types/jest/node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@types/jest/node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/@types/jest/node_modules/pretty-format": { @@ -4843,33 +4553,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@types/jest/node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@types/jest/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - }, - "node_modules/@types/jest/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -4886,9 +4569,9 @@ "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" }, "node_modules/@types/node": { - "version": "20.12.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.2.tgz", - "integrity": "sha512-zQ0NYO87hyN6Xrclcqp7f8ZbXNbRfoGWNcMvHTPQp9UUrwI0mI7XBz+cu7/W6/VClYo2g63B0cjull/srU7LgQ==", + "version": "20.12.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.8.tgz", + "integrity": "sha512-NU0rJLJnshZWdE/097cdCBbyW1h4hEg0xpovcoAQYHl8dnEyp/NAOiE45pvc+Bd1Dt+2r94v2eGFpQJ4R7g+2w==", "dependencies": { "undici-types": "~5.26.4" } @@ -4922,9 +4605,9 @@ "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==" }, "node_modules/@types/qs": { - "version": "6.9.14", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.14.tgz", - "integrity": "sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA==" + "version": "6.9.15", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", + "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==" }, "node_modules/@types/range-parser": { "version": "1.2.7", @@ -4932,18 +4615,18 @@ "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" }, "node_modules/@types/react": { - "version": "18.2.73", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.73.tgz", - "integrity": "sha512-XcGdod0Jjv84HOC7N5ziY3x+qL0AfmubvKOZ9hJjJ2yd5EE+KYjWhdOjt387e9HPheHkdggF9atTifMRtyAaRA==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.1.tgz", + "integrity": "sha512-V0kuGBX3+prX+DQ/7r2qsv1NsdfnCLnTgnRJ1pYnxykBhGMz+qj+box5lq7XsO5mtZsBqpjwwTu/7wszPfMBcw==", "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" } }, "node_modules/@types/react-dom": { - "version": "18.2.23", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.23.tgz", - "integrity": "sha512-ZQ71wgGOTmDYpnav2knkjr3qXdAFu0vsk8Ci5w3pGAIdj7/kKAyn+VsQDhXsmzzzepAiI9leWMmubXz690AI/A==", + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", + "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", "dependencies": { "@types/react": "*" } @@ -4992,13 +4675,13 @@ } }, "node_modules/@types/serve-static": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", - "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", "dependencies": { "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" + "@types/node": "*", + "@types/send": "*" } }, "node_modules/@types/sockjs": { @@ -5036,9 +4719,9 @@ } }, "node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dependencies": { "@types/yargs-parser": "*" } @@ -5548,14 +5231,14 @@ } }, "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -5609,14 +5292,17 @@ } }, "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/any-promise": { @@ -5926,15 +5612,38 @@ "node": ">=4" } }, - "node_modules/axobject-query": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", - "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", + "node_modules/axios": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", "dependencies": { - "dequal": "^2.0.3" + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, - "node_modules/babel-jest": { + "node_modules/axios/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/axobject-query": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", + "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/babel-jest": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", @@ -5955,68 +5664,27 @@ "@babel/core": "^7.8.0" } }, - "node_modules/babel-jest/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/babel-jest/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/babel-jest/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/babel-jest/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", "dependencies": { - "color-name": "~1.1.4" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" }, "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/babel-jest/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/babel-jest/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/babel-jest/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/babel-jest/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "@types/yargs-parser": "*" } }, "node_modules/babel-loader": { @@ -6106,12 +5774,12 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz", - "integrity": "sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==", + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", + "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.1", + "@babel/helper-define-polyfill-provider": "^0.6.2", "semver": "^6.3.1" }, "peerDependencies": { @@ -6139,11 +5807,11 @@ } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz", - "integrity": "sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", + "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.1" + "@babel/helper-define-polyfill-provider": "^0.6.2" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -6332,6 +6000,24 @@ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, + "node_modules/bootstrap": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.3.tgz", + "integrity": "sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "peerDependencies": { + "@popperjs/core": "^2.11.8" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -6486,9 +6172,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001600", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz", - "integrity": "sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==", + "version": "1.0.30001615", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001615.tgz", + "integrity": "sha512-1IpazM5G3r38meiae0bHRnPhz+CBQ3ZLqbQMtrg+AsTPKAXgW38JNsXkyZ+v8waCsDmPq87lmfun5Q2AGysNEQ==", "funding": [ { "type": "opencollective", @@ -6513,16 +6199,18 @@ } }, "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/char-regex": { @@ -6595,9 +6283,9 @@ } }, "node_modules/cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==" + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", + "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==" }, "node_modules/clean-css": { "version": "5.3.3", @@ -6629,9 +6317,9 @@ } }, "node_modules/clsx": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", - "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", "engines": { "node": ">=6" } @@ -6658,12 +6346,31 @@ "node": ">= 4.0" } }, - "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==" + "node_modules/coa/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } }, - "node_modules/color-convert": { + "node_modules/coa/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", @@ -6671,11 +6378,59 @@ "color-name": "1.1.3" } }, - "node_modules/color-name": { + "node_modules/coa/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, + "node_modules/coa/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/coa/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, "node_modules/colord": { "version": "2.9.3", "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", @@ -6705,11 +6460,6 @@ "node": ">= 12" } }, - "node_modules/common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" - }, "node_modules/common-tags": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", @@ -6807,9 +6557,9 @@ } }, "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "node_modules/cookie": { "version": "0.6.0", @@ -6825,9 +6575,9 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "node_modules/core-js": { - "version": "3.36.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.36.1.tgz", - "integrity": "sha512-BTvUrwxVBezj5SZ3f10ImnX2oRByMxql3EimVqMysepbC9EeMUOpLwdy6Eoili2x6E4kf+ZUB5k/+Jv55alPfA==", + "version": "3.37.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.0.tgz", + "integrity": "sha512-fu5vHevQ8ZG4og+LXug8ulUtVxjOcEYvifJr7L5Bfq9GOztVqsKd9/59hUk2ZSbCrS3BqUr3EpaYGIYzq7g3Ug==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -6835,9 +6585,9 @@ } }, "node_modules/core-js-compat": { - "version": "3.36.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz", - "integrity": "sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==", + "version": "3.37.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.0.tgz", + "integrity": "sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==", "dependencies": { "browserslist": "^4.23.0" }, @@ -6847,9 +6597,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.36.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.36.1.tgz", - "integrity": "sha512-NXCvHvSVYSrewP0L5OhltzXeWFJLo2AL2TYnj6iLV3Bw8mM62wAQMNgUCRI6EBu6hVVpbCxmOPlxh1Ikw2PfUA==", + "version": "3.37.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.37.0.tgz", + "integrity": "sha512-d3BrpyFr5eD4KcbRvQ3FTUx/KWmaDesr7+a3+1+P46IUnNoEt+oiLijPINZMEon7w9oGkIINWxrBAU9DEciwFQ==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -6943,15 +6693,15 @@ } }, "node_modules/css-loader": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.10.0.tgz", - "integrity": "sha512-LTSA/jWbwdMlk+rhmElbDR2vbtQoTBPr7fkJE+mxrHj+7ru0hUmHafDRzWIjIHTwpitWVaqY2/UWGRca3yUgRw==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", "dependencies": { "icss-utils": "^5.1.0", "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.4", - "postcss-modules-scope": "^3.1.1", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", "semver": "^7.5.4" @@ -7014,14 +6764,14 @@ } }, "node_modules/css-minimizer-webpack-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -7569,11 +7319,11 @@ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" }, "node_modules/diff-sequences": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", - "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/dir-glob": { @@ -7745,9 +7495,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/ejs": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", - "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dependencies": { "jake": "^10.8.5" }, @@ -7759,9 +7509,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.722", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.722.tgz", - "integrity": "sha512-5nLE0TWFFpZ80Crhtp4pIp8LXCztjYX41yUcV6b+bKR2PqzjskTMOOlBi1VjBHlvHwS+4gar7kNKOrsbsewEZQ==" + "version": "1.4.756", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.756.tgz", + "integrity": "sha512-RJKZ9+vEBMeiPAvKNWyZjuYyUqMndcP1f335oHqn3BEQbs2NFtVrnK5+6Xg5wSM9TknNNpWghGDUCKGYF+xWXw==" }, "node_modules/emittery": { "version": "0.8.1", @@ -7934,13 +7684,13 @@ } }, "node_modules/es-iterator-helpers": { - "version": "1.0.18", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.18.tgz", - "integrity": "sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==", + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", + "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", + "es-abstract": "^1.23.3", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.0.3", "function-bind": "^1.1.2", @@ -7958,9 +7708,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.0.tgz", - "integrity": "sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==" + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.2.tgz", + "integrity": "sha512-l60ETUTmLqbVbVHv1J4/qj+M8nq7AwMzEcg3kmJDt9dCNrTk+yHcYFf/Kw75pMDwd9mPcIGCG5LcS20SxYRzFA==" }, "node_modules/es-object-atoms": { "version": "1.0.0", @@ -8024,11 +7774,14 @@ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "engines": { - "node": ">=0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/escodegen": { @@ -8341,9 +8094,9 @@ } }, "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", "engines": { "node": ">=10" }, @@ -8451,14 +8204,14 @@ } }, "node_modules/eslint-webpack-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -8476,14 +8229,6 @@ "ajv": "^8.8.2" } }, - "node_modules/eslint-webpack-plugin/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, "node_modules/eslint-webpack-plugin/node_modules/jest-worker": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", @@ -8534,60 +8279,58 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dependencies": { - "color-convert": "^2.0.1" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "type-fest": "^0.20.2" }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dependencies": { - "color-name": "~1.1.4" + "argparse": "^2.0.1" }, - "engines": { - "node": ">=7.0.0" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, "engines": { "node": ">=10" }, @@ -8595,48 +8338,32 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dependencies": { - "type-fest": "^0.20.2" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dependencies": { - "has-flag": "^4.0.0" + "p-limit": "^3.0.2" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint/node_modules/type-fest": { @@ -8773,17 +8500,18 @@ } }, "node_modules/expect": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", - "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dependencies": { - "@jest/types": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1" + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/express": { @@ -9036,18 +8764,15 @@ "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" }, "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dependencies": { - "locate-path": "^6.0.0", + "locate-path": "^5.0.0", "path-exists": "^4.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/flat-cache": { @@ -9159,51 +8884,6 @@ } } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", @@ -9233,14 +8913,6 @@ "node": ">=10" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", @@ -9258,17 +8930,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", @@ -9332,9 +8993,9 @@ } }, "node_modules/fs-monkey": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", - "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", + "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==" }, "node_modules/fs.realpath": { "version": "1.0.0", @@ -9540,11 +9201,12 @@ } }, "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dependencies": { - "define-properties": "^1.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -9626,11 +9288,11 @@ } }, "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/has-property-descriptors": { @@ -10027,14 +9689,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "engines": { - "node": ">=4" - } - }, "node_modules/import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", @@ -10102,9 +9756,9 @@ } }, "node_modules/ipaddr.js": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", - "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", "engines": { "node": ">= 10" } @@ -10616,14 +10270,6 @@ "node": ">=10" } }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, "node_modules/istanbul-lib-report/node_modules/make-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", @@ -10638,17 +10284,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", @@ -10712,9 +10347,9 @@ } }, "node_modules/jake": { - "version": "10.8.7", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", - "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.1.tgz", + "integrity": "sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==", "dependencies": { "async": "^3.2.3", "chalk": "^4.0.2", @@ -10728,105 +10363,64 @@ "node": ">=10" } }, - "node_modules/jake/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", + "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", "dependencies": { - "color-convert": "^2.0.1" + "@jest/core": "^27.5.1", + "import-local": "^3.0.2", + "jest-cli": "^27.5.1" + }, + "bin": { + "jest": "bin/jest.js" }, "engines": { - "node": ">=8" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/jake/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/jest-changed-files": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", + "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@jest/types": "^27.5.1", + "execa": "^5.0.0", + "throat": "^6.0.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jake/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jake/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jake/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jake/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest": { + "node_modules/jest-changed-files/node_modules/@jest/types": { "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", - "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", "dependencies": { - "@jest/core": "^27.5.1", - "import-local": "^3.0.2", - "jest-cli": "^27.5.1" - }, - "bin": { - "jest": "bin/jest.js" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } } }, - "node_modules/jest-changed-files": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", - "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", + "node_modules/jest-changed-files/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", "dependencies": { - "@jest/types": "^27.5.1", - "execa": "^5.0.0", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "@types/yargs-parser": "*" } }, "node_modules/jest-circus": { @@ -10858,68 +10452,120 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-circus/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/jest-circus/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", "dependencies": { - "color-convert": "^2.0.1" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-circus/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/jest-circus/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-circus/node_modules/diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", "engines": { - "node": ">=10" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-circus/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/jest-circus/node_modules/jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", "dependencies": { - "color-name": "~1.1.4" + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" }, "engines": { - "node": ">=7.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-circus/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "node_modules/jest-circus/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } }, - "node_modules/jest-circus/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/jest-circus/node_modules/jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, "engines": { - "node": ">=8" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-circus/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/jest-circus/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", "dependencies": { - "has-flag": "^4.0.0" + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" }, "engines": { - "node": ">=8" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-cli": { @@ -10955,68 +10601,43 @@ } } }, - "node_modules/jest-cli/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-cli/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/jest-cli/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-cli/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/jest-cli/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-cli/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-cli/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" + "@types/yargs-parser": "*" } }, - "node_modules/jest-cli/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/jest-cli/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", "dependencies": { - "has-flag": "^4.0.0" + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" }, "engines": { - "node": ">=8" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-config": { @@ -11061,146 +10682,89 @@ } } }, - "node_modules/jest-config/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-config/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/jest-config/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-config/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/jest-config/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-config/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-config/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" + "@types/yargs-parser": "*" } }, - "node_modules/jest-config/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, + "node_modules/jest-config/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", "engines": { - "node": ">=8" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-diff": { + "node_modules/jest-config/node_modules/jest-util": { "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", - "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", "chalk": "^4.0.0", - "diff-sequences": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-diff/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dependencies": { - "color-convert": "^2.0.1" + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-diff/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-diff/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-diff/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-diff/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-diff/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/jest-diff/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dependencies": { - "has-flag": "^4.0.0" + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-docblock": { @@ -11229,68 +10793,51 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-each/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-each/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/jest-each/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-each/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/jest-each/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "@types/yargs-parser": "*" } }, - "node_modules/jest-each/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-each/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/jest-each/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", "engines": { - "node": ">=8" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-each/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/jest-each/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", "dependencies": { - "has-flag": "^4.0.0" + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" }, "engines": { - "node": ">=8" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-environment-jsdom": { @@ -11310,237 +10857,281 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-environment-node": { + "node_modules/jest-environment-jsdom/node_modules/@jest/types": { "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", - "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node_modules/jest-environment-jsdom/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "dependencies": { + "@types/yargs-parser": "*" } }, - "node_modules/jest-haste-map": { + "node_modules/jest-environment-jsdom/node_modules/jest-util": { "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", - "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", "dependencies": { "@jest/types": "^27.5.1", - "@types/graceful-fs": "^4.1.2", "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", - "jest-regex-util": "^27.5.1", - "jest-serializer": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "micromatch": "^4.0.4", - "walker": "^1.0.7" + "picomatch": "^2.2.3" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" } }, - "node_modules/jest-jasmine2": { + "node_modules/jest-environment-node": { "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", - "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", + "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", "dependencies": { "@jest/environment": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", + "@jest/fake-timers": "^27.5.1", "@jest/types": "^27.5.1", "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^27.5.1", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1", - "throat": "^6.0.1" + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-jasmine2/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/jest-environment-node/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", "dependencies": { - "color-convert": "^2.0.1" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-jasmine2/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/jest-environment-node/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "@types/yargs-parser": "*" } }, - "node_modules/jest-jasmine2/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/jest-environment-node/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", "dependencies": { - "color-name": "~1.1.4" + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" }, "engines": { - "node": ">=7.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-jasmine2/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-jasmine2/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-jasmine2/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/jest-haste-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", + "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", "dependencies": { - "has-flag": "^4.0.0" + "@jest/types": "^27.5.1", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "micromatch": "^4.0.4", + "walker": "^1.0.7" }, "engines": { - "node": ">=8" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" } }, - "node_modules/jest-leak-detector": { + "node_modules/jest-haste-map/node_modules/@jest/types": { "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", - "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", "dependencies": { - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-matcher-utils": { + "node_modules/jest-haste-map/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-haste-map/node_modules/jest-util": { "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", - "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", "chalk": "^4.0.0", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-matcher-utils/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/jest-jasmine2": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", + "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", "dependencies": { - "color-convert": "^2.0.1" + "@jest/environment": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "throat": "^6.0.1" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-matcher-utils/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/jest-jasmine2/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-matcher-utils/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/jest-jasmine2/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", "dependencies": { - "color-name": "~1.1.4" + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-jasmine2/node_modules/diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" }, "engines": { - "node": ">=7.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-matcher-utils/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "node_modules/jest-jasmine2/node_modules/jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } }, - "node_modules/jest-matcher-utils/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/jest-jasmine2/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", "engines": { - "node": ">=8" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-matcher-utils/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/jest-jasmine2/node_modules/jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", "dependencies": { - "has-flag": "^4.0.0" + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" }, "engines": { - "node": ">=8" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-message-util": { + "node_modules/jest-jasmine2/node_modules/jest-message-util": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", @@ -11559,68 +11150,121 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-message-util/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/jest-jasmine2/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", "dependencies": { - "color-convert": "^2.0.1" + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" }, "engines": { - "node": ">=8" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-leak-detector": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", + "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", + "dependencies": { + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-message-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/jest-leak-detector/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-message-util/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/jest-matcher-utils/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dependencies": { - "color-name": "~1.1.4" + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" }, "engines": { - "node": ">=7.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-message-util/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } }, - "node_modules/jest-message-util/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-message-util/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/jest-message-util/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dependencies": { - "has-flag": "^4.0.0" + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-mock": { @@ -11635,6 +11279,29 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/jest-mock/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-mock/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, "node_modules/jest-pnp-resolver": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", @@ -11692,68 +11359,66 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-resolve/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/jest-resolve-dependencies/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", "dependencies": { - "color-convert": "^2.0.1" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-resolve/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/jest-resolve-dependencies/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "@types/yargs-parser": "*" } }, - "node_modules/jest-resolve/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/jest-resolve/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", "dependencies": { - "color-name": "~1.1.4" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" }, "engines": { - "node": ">=7.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-resolve/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-resolve/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" + "node_modules/jest-resolve/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "dependencies": { + "@types/yargs-parser": "*" } }, - "node_modules/jest-resolve/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/jest-resolve/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", "dependencies": { - "has-flag": "^4.0.0" + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" }, "engines": { - "node": ">=8" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-runner": { @@ -11787,68 +11452,62 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-runner/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/jest-runner/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", "dependencies": { - "color-convert": "^2.0.1" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-runner/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/jest-runner/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "@types/yargs-parser": "*" } }, - "node_modules/jest-runner/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/jest-runner/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", "dependencies": { - "color-name": "~1.1.4" + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" }, "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-runner/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-runner/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-runner/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/jest-runner/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", "dependencies": { - "has-flag": "^4.0.0" + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" }, "engines": { - "node": ">=8" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-runtime": { @@ -11883,68 +11542,62 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-runtime/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/jest-runtime/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", "dependencies": { - "color-convert": "^2.0.1" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-runtime/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/jest-runtime/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "@types/yargs-parser": "*" } }, - "node_modules/jest-runtime/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/jest-runtime/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", "dependencies": { - "color-name": "~1.1.4" + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" }, "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-runtime/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-runtime/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-runtime/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/jest-runtime/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", "dependencies": { - "has-flag": "^4.0.0" + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" }, "engines": { - "node": ">=8" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-serializer": { @@ -11982,157 +11635,145 @@ "jest-haste-map": "^27.5.1", "jest-matcher-utils": "^27.5.1", "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^27.5.1", - "semver": "^7.3.2" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-snapshot/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "jest-util": "^27.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^27.5.1", + "semver": "^7.3.2" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-snapshot/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/jest-snapshot/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", "dependencies": { - "color-name": "~1.1.4" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" }, "engines": { - "node": ">=7.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-snapshot/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "node_modules/jest-snapshot/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "dependencies": { + "@types/yargs-parser": "*" + } }, - "node_modules/jest-snapshot/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/jest-snapshot/node_modules/diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", "engines": { - "node": ">=8" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-snapshot/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/jest-snapshot/node_modules/expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", "dependencies": { - "has-flag": "^4.0.0" + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" }, "engines": { - "node": ">=8" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-util": { + "node_modules/jest-snapshot/node_modules/jest-diff": { "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-util/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, + "node_modules/jest-snapshot/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/jest-snapshot/node_modules/jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-util/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/jest-snapshot/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", "dependencies": { - "color-name": "~1.1.4" + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" }, "engines": { - "node": ">=7.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-util/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-util/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/jest-snapshot/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, "engines": { - "node": ">=8" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-util/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dependencies": { - "has-flag": "^4.0.0" + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-validate": { @@ -12151,68 +11792,35 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-validate/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-validate/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/jest-validate/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-validate/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/jest-validate/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-validate/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-validate/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" + "@types/yargs-parser": "*" } }, - "node_modules/jest-validate/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, + "node_modules/jest-validate/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", "engines": { - "node": ">=8" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-watch-typeahead": { @@ -12259,6 +11867,17 @@ "node": ">=8" } }, + "node_modules/jest-watch-typeahead/node_modules/@jest/schemas": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", + "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", + "dependencies": { + "@sinclair/typebox": "^0.24.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, "node_modules/jest-watch-typeahead/node_modules/@jest/test-result": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", @@ -12289,59 +11908,22 @@ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "node_modules/jest-watch-typeahead/node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "dependencies": { - "@types/yargs-parser": "*" - } + "node_modules/jest-watch-typeahead/node_modules/@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==" }, "node_modules/jest-watch-typeahead/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-watch-typeahead/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-watch-typeahead/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-watch-typeahead/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/jest-watch-typeahead/node_modules/emittery": { "version": "0.10.2", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", @@ -12353,14 +11935,6 @@ "url": "https://github.com/sindresorhus/emittery?sponsor=1" } }, - "node_modules/jest-watch-typeahead/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, "node_modules/jest-watch-typeahead/node_modules/jest-message-util": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", @@ -12467,22 +12041,6 @@ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "node_modules/jest-watch-typeahead/node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-watch-typeahead/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - }, "node_modules/jest-watch-typeahead/node_modules/slash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", @@ -12542,17 +12100,6 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/jest-watch-typeahead/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/jest-watcher": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", @@ -12570,68 +12117,43 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-watcher/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-watcher/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/jest-watcher/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-watcher/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/jest-watcher/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-watcher/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-watcher/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" + "@types/yargs-parser": "*" } }, - "node_modules/jest-watcher/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/jest-watcher/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", "dependencies": { - "has-flag": "^4.0.0" + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" }, "engines": { - "node": ">=8" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-worker": { @@ -12647,14 +12169,6 @@ "node": ">= 10.13.0" } }, - "node_modules/jest-worker/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, "node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -12953,17 +12467,14 @@ } }, "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dependencies": { - "p-locate": "^5.0.0" + "p-locate": "^4.1.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/lodash": { @@ -13178,9 +12689,9 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.8.1.tgz", - "integrity": "sha512-/1HDlyFRxWIZPI1ZpgqlZ8jMw/1Dp/dl3P0L1jtZ+zVcHqwPhGwaJwKL00WVgfnBy6PWCde9W65or7IIETImuA==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.0.tgz", + "integrity": "sha512-Zs1YsZVfemekSZG+44vBsYTLQORkPMwnlv+aehcxK/NLKC+EGhDB39/YePYYqx/sTk6NnYpuqikhSn7+JIevTA==", "dependencies": { "schema-utils": "^4.0.0", "tapable": "^2.2.1" @@ -13197,14 +12708,14 @@ } }, "node_modules/mini-css-extract-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -13270,9 +12781,9 @@ } }, "node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.0.tgz", + "integrity": "sha512-oGZRv2OT1lO2UF1zUcwdTb3wqUwI0kBGTgt/T7OdSj6M6N5m3o5uPf0AIW6lVxGGoiWUR7e2AwTE+xiwK8WQig==", "engines": { "node": ">=16 || 14 >=14.17" } @@ -13432,9 +12943,9 @@ } }, "node_modules/nwsapi": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", - "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==" + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.9.tgz", + "integrity": "sha512-2f3F0SEEer8bBu0dsNCFF50N0cTThV1nWFYcEYFZttdW0lDAoybv9cQoK7X7/68Z89S7FoRrVjP1LPX4XRf9vg==" }, "node_modules/object-assign": { "version": "4.1.1", @@ -13658,47 +13169,44 @@ } }, "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dependencies": { - "yocto-queue": "^0.1.0" + "p-try": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dependencies": { - "p-limit": "^3.0.2" + "p-limit": "^2.2.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/p-retry": { @@ -13825,9 +13333,9 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", "engines": { "node": "14 || >=16.14" } @@ -13893,54 +13401,6 @@ "node": ">=8" } }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/pkg-up": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", @@ -13975,20 +13435,6 @@ "node": ">=6" } }, - "node_modules/pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/pkg-up/node_modules/p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", @@ -14518,9 +13964,9 @@ } }, "node_modules/postcss-load-config/node_modules/yaml": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz", - "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.2.tgz", + "integrity": "sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==", "bin": { "yaml": "bin.mjs" }, @@ -14664,9 +14110,9 @@ } }, "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", "engines": { "node": "^10 || ^12 || >= 14" }, @@ -14675,9 +14121,9 @@ } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz", - "integrity": "sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", + "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", "dependencies": { "icss-utils": "^5.0.0", "postcss-selector-parser": "^6.0.2", @@ -14691,9 +14137,9 @@ } }, "node_modules/postcss-modules-scope": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz", - "integrity": "sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", + "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", "dependencies": { "postcss-selector-parser": "^6.0.4" }, @@ -15267,6 +14713,11 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -15327,6 +14778,11 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -15445,9 +14901,9 @@ } }, "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "dependencies": { "loose-envify": "^1.1.0" }, @@ -15510,55 +14966,50 @@ "node": ">=14" } }, - "node_modules/react-dev-utils/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/react-dev-utils/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dependencies": { - "color-convert": "^2.0.1" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/react-dev-utils/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/react-dev-utils/node_modules/loader-utils": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/react-dev-utils/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "p-locate": "^5.0.0" }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/react-dev-utils/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/react-dev-utils/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dependencies": { - "color-name": "~1.1.4" + "yocto-queue": "^0.1.0" }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/react-dev-utils/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/react-dev-utils/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "engines": { "node": ">=10" }, @@ -15566,43 +15017,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/react-dev-utils/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/react-dev-utils/node_modules/loader-utils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", - "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", - "engines": { - "node": ">= 12.13.0" - } - }, - "node_modules/react-dev-utils/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/react-dev-utils/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dependencies": { - "has-flag": "^4.0.0" + "p-limit": "^3.0.2" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "dependencies": { "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" + "scheduler": "^0.23.2" }, "peerDependencies": { - "react": "^18.2.0" + "react": "^18.3.1" } }, "node_modules/react-error-overlay": { @@ -15611,17 +15049,17 @@ "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" }, "node_modules/react-icons": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.0.1.tgz", - "integrity": "sha512-WqLZJ4bLzlhmsvme6iFdgO8gfZP17rfjYEJ2m9RsZjZ+cc4k1hTzknEz63YS1MeT50kVzoa1Nz36f4BEx+Wigw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.2.0.tgz", + "integrity": "sha512-n52Y7Eb4MgQZHsSZOhSXv1zs2668/hBYKfSRIvKh42yExjyhZu0d1IK2CLLZ3BZB1oo13lDfwx2vOh2z9FTV6Q==", "peerDependencies": { "react": "*" } }, "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" }, "node_modules/react-refresh": { "version": "0.11.0", @@ -15632,11 +15070,11 @@ } }, "node_modules/react-router": { - "version": "6.22.3", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.22.3.tgz", - "integrity": "sha512-dr2eb3Mj5zK2YISHK++foM9w4eBnO23eKnZEDs7c880P6oKbrjz/Svg9+nxqtHQK+oMW4OtjZca0RqPglXxguQ==", + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.23.0.tgz", + "integrity": "sha512-wPMZ8S2TuPadH0sF5irFGjkNLIcRvOSaEe7v+JER8508dyJumm6XZB1u5kztlX0RVq6AzRVndzqcUh6sFIauzA==", "dependencies": { - "@remix-run/router": "1.15.3" + "@remix-run/router": "1.16.0" }, "engines": { "node": ">=14.0.0" @@ -15646,12 +15084,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.22.3", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.3.tgz", - "integrity": "sha512-7ZILI7HjcE+p31oQvwbokjk6OA/bnFxrhJ19n82Ex9Ph8fNAq+Hm/7KchpMGlTgWhUxRHMMCut+vEtNpWpowKw==", + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.23.0.tgz", + "integrity": "sha512-Q9YaSYvubwgbal2c9DJKfx6hTNoBp3iJDsl+Duva/DwxoJH+OTXkxGpql4iUK2sla/8z4RpjAm6EWx1qUDuopQ==", "dependencies": { - "@remix-run/router": "1.15.3", - "react-router": "6.22.3" + "@remix-run/router": "1.16.0", + "react-router": "6.23.0" }, "engines": { "node": ">=14.0.0" @@ -15977,7 +15415,7 @@ "node": ">=8" } }, - "node_modules/resolve-from": { + "node_modules/resolve-cwd/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", @@ -15985,6 +15423,14 @@ "node": ">=8" } }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, "node_modules/resolve-url-loader": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", @@ -16012,11 +15458,6 @@ } } }, - "node_modules/resolve-url-loader/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, "node_modules/resolve-url-loader/node_modules/picocolors": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", @@ -16114,14 +15555,6 @@ "rollup": "^2.0.0" } }, - "node_modules/rollup-plugin-terser/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, "node_modules/rollup-plugin-terser/node_modules/jest-worker": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", @@ -16143,17 +15576,6 @@ "randombytes": "^2.1.0" } }, - "node_modules/rollup-plugin-terser/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -16292,9 +15714,9 @@ } }, "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", "dependencies": { "loose-envify": "^1.1.0" } @@ -16609,11 +16031,11 @@ "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" }, "node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "engines": { - "node": ">= 8" + "node": ">=0.10.0" } }, "node_modules/source-map-js": { @@ -17165,14 +16587,14 @@ } }, "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/supports-hyperlinks": { @@ -17187,25 +16609,6 @@ "node": ">=8" } }, - "node_modules/supports-hyperlinks/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -17249,6 +16652,43 @@ "node": ">=4.0.0" } }, + "node_modules/svgo/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/svgo/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, "node_modules/svgo/node_modules/css-select": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", @@ -17294,6 +16734,22 @@ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" }, + "node_modules/svgo/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/svgo/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, "node_modules/svgo/node_modules/nth-check": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", @@ -17302,6 +16758,17 @@ "boolbase": "~1.0.0" } }, + "node_modules/svgo/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -17403,9 +16870,9 @@ } }, "node_modules/terser": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.30.0.tgz", - "integrity": "sha512-Y/SblUl5kEyEFzhMAQdsxVHh+utAxd4IuRNJzKywY/4uzSogh3G219jqbDDxYu4MXO9CzY3tSEqmZvW6AoEDJw==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.0.tgz", + "integrity": "sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==", "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -17537,9 +17004,9 @@ } }, "node_modules/tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", @@ -17867,9 +17334,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.15.tgz", + "integrity": "sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA==", "funding": [ { "type": "opencollective", @@ -17885,7 +17352,7 @@ } ], "dependencies": { - "escalade": "^3.1.1", + "escalade": "^3.1.2", "picocolors": "^1.0.0" }, "bin": { @@ -17965,10 +17432,13 @@ "node": ">=10.12.0" } }, - "node_modules/v8-to-istanbul/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + "node_modules/v8-to-istanbul/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "engines": { + "node": ">= 8" + } }, "node_modules/vary": { "version": "1.1.2", @@ -18108,14 +17578,14 @@ } }, "node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -18215,14 +17685,14 @@ } }, "node_modules/webpack-dev-server/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -18264,9 +17734,9 @@ } }, "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz", + "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==", "engines": { "node": ">=10.0.0" }, @@ -18587,14 +18057,14 @@ } }, "node_modules/workbox-build/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -18835,66 +18305,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/package.json b/package.json index c7a0f5b..ccdfb52 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,9 @@ "@testing-library/jest-dom": "^5.17.0", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", + "axios": "^1.6.8", + "bootstrap": "^5.3.3", + "debug": "^4.3.4", "react": "^18.2.0", "react-dom": "^18.2.0", "react-icons": "^5.0.1", diff --git a/src/App.js b/src/App.js index edd2a00..87c9493 100644 --- a/src/App.js +++ b/src/App.js @@ -15,6 +15,7 @@ import DiscoverPage from './Pages/DiscoverPage'; import Splash from './Pages/Splash'; import LoginPage from './Pages/LoginPage'; import PostDetails from './Pages/PostDetails'; + function App() { return ( @@ -25,8 +26,8 @@ function App() { } /> } /> } /> - } /> - } /> + } /> + } /> } /> } /> } /> diff --git a/src/Components/Home/Sidebar.jsx b/src/Components/Home/Sidebar.jsx index 097485d..b328e75 100644 --- a/src/Components/Home/Sidebar.jsx +++ b/src/Components/Home/Sidebar.jsx @@ -24,6 +24,9 @@ const Sidebar = () => { function createNote() { navigate('/createnote'); } + function uploadVideo() { + navigate('/uploadvideo'); + } function loginNavigate() { navigate('/LoginPage'); @@ -100,7 +103,7 @@ const Sidebar = () => {

Upload Notes

-
+

Share Video

diff --git a/src/Components/Notes/ViewNote.jsx b/src/Components/Notes/ViewNote.jsx index e928436..93c2753 100644 --- a/src/Components/Notes/ViewNote.jsx +++ b/src/Components/Notes/ViewNote.jsx @@ -1,85 +1,120 @@ -import React from 'react' +import React, { useState, useEffect } from 'react'; +import { useNavigate, useParams } from 'react-router-dom'; import Sidebar from '../Home/Sidebar'; import BackButton from '../../assets/BackButton.png'; -import { useNavigate } from 'react-router-dom'; import { Button } from '@mui/material'; -import img from '../../assets/noteimg.png'; -import './viewnote.css' +import axios from 'axios'; // Import Axios +import './viewnote.css'; const ViewNote = () => { const navigate = useNavigate(); + const { noteId } = useParams(); + const [noteDetails, setNoteDetails] = useState(null); + + useEffect(() => { + const fetchNoteDetails = async () => { + try { + const response = await axios.get(`https://monilmeh.pythonanywhere.com/api/notes/${noteId}/`, { + headers: { + 'Authorization': 'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE3NzA5NTEwLCJpYXQiOjE3MTc2ODc5MTAsImp0aSI6IjdhZmY0OWY4OGU2ZTQ4NzNhY2ExNDc5MGFmM2VlMzU3IiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.2qEts4v2MSFYoVfC1Ge2Tv5xJyhI8cMB5UoesbsDz-0' + } + }); + console.log(response.data); + setNoteDetails(response.data); + } catch (error) { + console.error('Error fetching note details:', error); + } + }; - const handleGoBack = (event) => { - event.preventDefault(); - navigate.goBack(); - }; + if (noteId) { + fetchNoteDetails(); + } + }, [noteId]); + + const handleGoBack = (event) => { + event.preventDefault(); + navigate.goBack(); + }; - return ( -
- - <> -
-
- -

- Notes -

-
-
-
-

Notes Title

-
-
-

Subject:

-

Department:

-
-
-

Notes Description

-

- Access your study materials anytime, anywhere with our new Notes Upload feature! Simply upload your notes directly from your device and have them at your fingertips whenever you need them. Whether it's lecture slides, study guides, or handwritten notes, our platform makes it easy to keep everything organized and accessible. Say goodbye to the hassle of carrying around bulky notebooks and hello to seamless studying on the go -

-
- Note -
-
- -
-
-
-
-

Uploaded By:

-

Monil Mehta

-
-
-

24th March 2024

-

15:18

-
-
{/* Use ml-auto to push to the right */} -
-

Rate :

-
-
{/* Add ml-2 for spacing */} - {/* Simulated star rating */} - ⭐️ - ⭐️ - ⭐️ - ⭐️ - ⭐️ -
-
- -
+ const downloadNote = async () => { + try { + const response = await axios.get(noteDetails.document, { + responseType: 'blob', // Set response type to blob + }); + const url = window.URL.createObjectURL(new Blob([response.data])); + const link = document.createElement('a'); + link.href = url; + link.setAttribute('download', `${noteDetails.note_title}.pdf`); // Set the file name + document.body.appendChild(link); + link.click(); + } catch (error) { + console.error('Error downloading note:', error); + } + }; + + const renderStars = (rating) => { + const stars = []; + for (let i = 0; i < rating; i++) { + stars.push(⭐️); + } + return stars; + }; + return ( +
+ +
+
+ +

+ Notes +

+
+
+
+

{noteDetails && noteDetails.note_title}

+
+
+

Subject: {noteDetails && noteDetails.subject}

+

Department: {noteDetails && noteDetails.department}

+
+
+

Notes Description

+

+ {noteDetails && noteDetails.note_description} +

+
+ Note Preview +
+
+ +
+
+
+
+

Uploaded By:

+

{noteDetails && noteDetails.user}

+
+
+
+

Rate :

+
+
+ {noteDetails && renderStars(noteDetails.rating)} +
+
+ +
-
- ) -} +); +}; -export default ViewNote +export default ViewNote; diff --git a/src/Pages/PostJob.jsx b/src/Pages/PostJob.jsx index db332db..c7e0cad 100644 --- a/src/Pages/PostJob.jsx +++ b/src/Pages/PostJob.jsx @@ -1,38 +1,55 @@ import React, { useState } from 'react'; import Sidebar from '../Components/Home/Sidebar'; import '../styles/PostJob.css'; +import axios from 'axios'; +import { Navigate, useNavigate } from 'react-router-dom'; const PostJob = () => { - const [jobType, setJobType] = useState(null); - const [jobLocation, setJobLocation] = useState(null); - + const [subtype, setsubtype] = useState(null); + const [mode, setmode] = useState(null); + const [message, setMessage] = useState(''); // Add this line + const navigate = useNavigate(); // Function to handle the selection of job type - const handleJobTypeSelection = (type) => { - setJobType(type); + const handlesubtypeSelection = (type) => { + setsubtype(type); setFormData({ ...formData, - jobType: type + subtype: type }); }; + const JOB_TITLES = [ + 'Software Engineer', + 'Data Analyst', + 'Web Developer', + 'UI/UX Designer', + 'Project Manager', + 'Business Analyst', + 'Backend Developer', + 'Frontend Developer', + 'Fullstack Developer', + 'Machine Learning Engineer', + ]; - // Function to handle the selection of job location - const handleJobLocationSelection = (location) => { - setJobLocation(location); + // Function to handle the selection of job mode + const handleModeSelection = (mode) => { + setmode(mode); setFormData({ ...formData, - jobLocation: location + mode: mode, + user: '60004220207' }); }; const [formData, setFormData] = useState({ - companyName: '', - companyLocation: '', - companyNumber: '', - jobDescription: '', - jobTenure: '', - jobType: null, - jobRequirements: '', - jobLocation: null + company: '', + location: '', + contact_no: '', + description: '', + job_title: '', + subtype: null, + requirements: '', + mode: null, + duration_in_months: 3, }); // Function to handle input change @@ -45,11 +62,29 @@ const PostJob = () => { }; // Function to handle form submission - const handleSubmit = (e) => { - e.preventDefault(); - // Perform POST request with formData - console.log(formData); - }; + + +// Inside the PostJob component +const handleSubmit = (e) => { + e.preventDefault(); + + axios.post('https://monilmeh.pythonanywhere.com/api/jobboard/', formData, { + headers: { + 'Content-Type': 'application/json', + 'Authorization': 'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE3NzA5NTEwLCJpYXQiOjE3MTc2ODc5MTAsImp0aSI6IjdhZmY0OWY4OGU2ZTQ4NzNhY2ExNDc5MGFmM2VlMzU3IiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.2qEts4v2MSFYoVfC1Ge2Tv5xJyhI8cMB5UoesbsDz-0' // Replace with your actual token + } + }) + .then((response) => { + console.log(response.data); + setMessage('Job opportunity posted successfully!'); // Add this line + navigate('/'); // Add this line + // Handle success, e.g., show a success message to the user + }) + .catch((error) => { + console.error('Error posting job opportunity:', error); + // Handle error, e.g., show an error message to the user + }); +}; return (
@@ -60,38 +95,42 @@ const PostJob = () => {


-
+
- +
- +
- +
- +
- - -
+ + +
- - +
- +
@@ -101,15 +140,15 @@ const PostJob = () => {
@@ -119,20 +158,20 @@ const PostJob = () => {
- - + +
@@ -142,7 +181,7 @@ const PostJob = () => {
- + {message &&

{message}

} {/* Add this line */}
diff --git a/src/Pages/UploadVideo.jsx b/src/Pages/UploadVideo.jsx index 1ae959a..c8ec120 100644 --- a/src/Pages/UploadVideo.jsx +++ b/src/Pages/UploadVideo.jsx @@ -3,6 +3,7 @@ import Sidebar from '../Components/Home/Sidebar'; import BackButton from '../assets/BackButton.png'; import { useNavigate } from 'react-router-dom'; import { Button } from '@mui/material'; +import axios from 'axios'; // Import Axios import '../styles/UploadVideo.css'; const ViewNote = () => { @@ -10,19 +11,35 @@ const ViewNote = () => { const [formData, setFormData] = useState({ videoName: '', - videoLink: '' + videoLink: '', + subject: '', + sem: '', + topics: '', + links: '', + user: '60004220207' // Assuming user ID is constant }); - const handleInputChange = (event) => { const { id, value } = event.target; setFormData({ ...formData, [id]: value }); }; - // Handler for form submission (if needed) - const handleSubmit = (event) => { + const handleSubmit = async (event) => { event.preventDefault(); - + try { + const response = await axios.post('https://monilmeh.pythonanywhere.com/api/videolinks/', formData, { + headers: { + 'Content-Type': 'application/json', + 'Authorization': 'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE3NzA5NTEwLCJpYXQiOjE3MTc2ODc5MTAsImp0aSI6IjdhZmY0OWY4OGU2ZTQ4NzNhY2ExNDc5MGFmM2VlMzU3IiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.2qEts4v2MSFYoVfC1Ge2Tv5xJyhI8cMB5UoesbsDz-0' + } + }); + console.log(response.data); + // Handle success, e.g., show a success message to the user + navigate('/'); // Redirect to homepage after successful submission + } catch (error) { + console.error('Error submitting form:', error); + // Handle error, e.g., show an error message to the user + } }; const handleGoBack = (event) => { @@ -57,18 +74,52 @@ const ViewNote = () => { />
- +
+
+ + +
+
+ + +
+
+ + +
+
diff --git a/src/Pages/ViewJob.jsx b/src/Pages/ViewJob.jsx index 78684e1..4109bfd 100644 --- a/src/Pages/ViewJob.jsx +++ b/src/Pages/ViewJob.jsx @@ -1,12 +1,34 @@ -import React from 'react'; -import { useNavigate } from 'react-router-dom'; +import React, { useState, useEffect } from 'react'; +import { useNavigate, useParams } from 'react-router-dom'; import Sidebar from '../Components/Home/Sidebar'; import BackButton from '../assets/BackButton.png'; import { Button } from '@mui/material'; +import axios from 'axios'; // Import Axios import '../styles/ViewJob.css'; const ViewJob = () => { const navigate = useNavigate(); + const { jobId } = useParams(); + const [jobDetails, setJobDetails] = useState(null); + + useEffect(() => { + const fetchJobDetails = async () => { + try { + const response = await axios.get(`https://monilmeh.pythonanywhere.com/api/jobboard/${jobId}/`, { + headers: { + 'Authorization': 'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE3NzA5NTEwLCJpYXQiOjE3MTc2ODc5MTAsImp0aSI6IjdhZmY0OWY4OGU2ZTQ4NzNhY2ExNDc5MGFmM2VlMzU3IiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.2qEts4v2MSFYoVfC1Ge2Tv5xJyhI8cMB5UoesbsDz-0' + } + }); + setJobDetails(response.data); + } catch (error) { + console.error('Error fetching job details:', error); + } + }; + + if (jobId) { + fetchJobDetails(); + } + }, [jobId]); const handleGoBack = (event) => { event.preventDefault(); @@ -17,75 +39,71 @@ const ViewJob = () => {
<> -
-
+
+
-

- Post Job Opportunities -

-
-
-
-

Company Name

-

U, 15, Bhaktivedanta Swami Rd, opp. Cooper Hospital, - Navpada, JVPD Scheme, Vile Parle, Mumbai, - Maharashtra 400056

+

+ Post Job Opportunities +

+
+
+ {jobDetails && (
- - - - +
+
+ )} +
+ {jobDetails && ( +
+

Job Description

+

{jobDetails.description}

+

Job Requirements

+

+

    + {jobDetails.requirements.split(' - ').map((requirement, index) => ( +
  • {requirement}
  • + ))} +
+

+
+
+
+

Posted By:

+

Monil Mehta

+
+
+

{new Date(jobDetails.upload_time).toLocaleDateString()}

+

{new Date(jobDetails.upload_time).toLocaleTimeString()}

+
+
+ +
+
+ )}
-
-

Job Description

-

We are seeking a highly motivated and enthusiastic Technology Intern to join our dynamic team. - As an intern, you will have the opportunity to gain hands-on experience in various aspects of technology, including software development, - data analysis, and IT support. You will work closely with our experienced professionals on real-world projects and contribute to the success of our company.

- -

Job Requirements

-

-

    -
  • Currently enrolled in a Bachelor's or Master's degree program in Computer Science, Information Technology, or related field
  • -
  • Strong understanding of programming languages such as Python, Java, or C++
  • -
  • Knowledge of database management systems and data analysis tools
  • -
  • Excellent problem-solving and analytical skills
  • -
  • Ability to work independently and in a team environment
  • -
  • Excellent communication and interpersonal skills
  • -
  • Must be available to work a minimum of 20 hours per week
  • -
-

-
-
-
-

Posted By:

-

Monil Mehta

-
-
-

24th March 2024

-

15:18

-
-
- -
-
- -
- ) + ); } -export default ViewJob +export default ViewJob; From e9d41842099d408152c3aae42404ca6326877bc3 Mon Sep 17 00:00:00 2001 From: Divya Gandhi Date: Sat, 8 Jun 2024 18:30:10 +0530 Subject: [PATCH 32/82] Changes --- package-lock.json | 29 ++++++++++ package.json | 1 + src/Components/Notes/UploadNotes.jsx | 82 ++++++++++++++++++++++++++-- src/Pages/Home.jsx | 4 +- 4 files changed, 108 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 41e230d..6edf917 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,7 @@ "@testing-library/jest-dom": "^5.17.0", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", + "axios": "^1.7.2", "react": "^18.2.0", "react-dom": "^18.2.0", "react-icons": "^5.0.1", @@ -5926,6 +5927,29 @@ "node": ">=4" } }, + "node_modules/axios": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", + "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axios/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/axobject-query": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", @@ -15327,6 +15351,11 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", diff --git a/package.json b/package.json index c7a0f5b..cfff992 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "@testing-library/jest-dom": "^5.17.0", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", + "axios": "^1.7.2", "react": "^18.2.0", "react-dom": "^18.2.0", "react-icons": "^5.0.1", diff --git a/src/Components/Notes/UploadNotes.jsx b/src/Components/Notes/UploadNotes.jsx index 3a07108..482248f 100644 --- a/src/Components/Notes/UploadNotes.jsx +++ b/src/Components/Notes/UploadNotes.jsx @@ -1,6 +1,53 @@ -import React from 'react' +import React,{useState} from 'react' import CloudUploadOutlinedIcon from '@mui/icons-material/CloudUploadOutlined'; +import axios from 'axios'; +import { createRoot } from 'react-dom/client'; function UploadNotes() { + const [formData, setFormData] = useState({ + notesTitle: '', + subject: '', + department: '', + notesDescription: '', + user: '60004220207' // Assuming user ID is constant, + + }); + const handleChange=(e)=>{ + const{name,value}=e.target; + setFormData({ + ...formData, + [name]:value, + }); + }; + const handleSubmit = async (e) => { + e.preventDefault(); + + const endpoint = 'https://monilmeh.pythonanywhere.com//api/notes/'; + + try { + const response = await axios.post(endpoint, formData, { + headers: { + 'Content-Type': 'application/json', + 'Authorization':'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE0ODQ0Nzc4LCJpYXQiOjE3MTQ4MjMxNzgsImp0aSI6ImZmYTRhOTZlOTNlNTQ4ZGU4NmZmZmQ1M2E1MjMyYTliIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.ihi7jgo0F-dNgtkLAE08OXUkD3kEw5AlXvNmx5QsisM' + }, + }); + + if (response.status === 200) { + alert('Notes uploaded successfully!'); + setFormData({ + notesTitle: '', + subject: '', + department: '', + notesDescription: '', + user: '60004220207' // Assuming user ID is constant + }); + } else { + alert('Failed to upload notes'); + } + } catch (error) { + console.error('Error:', error); + alert('An error occurred. Please try again.'); + } + }; return (

@@ -8,22 +55,45 @@ function UploadNotes() {

Notes title

- +

Subject

- +

Department

- +

Notes Description

- + + +

Upload Images

@@ -33,7 +103,7 @@ function UploadNotes() {
- +
diff --git a/src/Pages/Home.jsx b/src/Pages/Home.jsx index 9c0d9da..58b9302 100644 --- a/src/Pages/Home.jsx +++ b/src/Pages/Home.jsx @@ -3,7 +3,7 @@ import Sidebar from '../Components/Home/Sidebar' import JobOpportunity from '../Components/Home/JobOpportunity' import LatestPosts from '../Components/Home/LatestPosts' import ShareNotes from '../Components/Home/ShareNotes' -import SharedResources from '../Components/Home/SharedResources' +// import SharedResources from '../Components/Home/SharedResources' function Home() { return ( @@ -13,7 +13,7 @@ function Home() { - + {/* */}
) From 5ce9f3d5b264c1720976d26129e6e5869f64bfa3 Mon Sep 17 00:00:00 2001 From: Divya Gandhi Date: Sat, 8 Jun 2024 22:43:31 +0530 Subject: [PATCH 33/82] Upload Notes post --- package.json | 5 +- src/Components/Notes/UploadNotes.jsx | 170 ++++++++++++++++----------- 2 files changed, 102 insertions(+), 73 deletions(-) diff --git a/package.json b/package.json index 724a378..2c5dbb6 100644 --- a/package.json +++ b/package.json @@ -11,13 +11,10 @@ "@testing-library/jest-dom": "^5.17.0", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", -<<<<<<< HEAD "axios": "^1.7.2", -======= - + "axios": "^1.6.8", "bootstrap": "^5.3.3", "debug": "^4.3.4", ->>>>>>> 2af5b9a2593948f4d35128f2fd1a2bac6de2a7e6 "react": "^18.2.0", "react-dom": "^18.2.0", "react-icons": "^5.0.1", diff --git a/src/Components/Notes/UploadNotes.jsx b/src/Components/Notes/UploadNotes.jsx index 482248f..32875ef 100644 --- a/src/Components/Notes/UploadNotes.jsx +++ b/src/Components/Notes/UploadNotes.jsx @@ -1,44 +1,64 @@ -import React,{useState} from 'react' +import React, { useState } from 'react'; import CloudUploadOutlinedIcon from '@mui/icons-material/CloudUploadOutlined'; import axios from 'axios'; -import { createRoot } from 'react-dom/client'; + function UploadNotes() { const [formData, setFormData] = useState({ notesTitle: '', subject: '', department: '', notesDescription: '', - user: '60004220207' // Assuming user ID is constant, - + document: null, + user: '60004220207' // Assuming user ID is constant }); - const handleChange=(e)=>{ - const{name,value}=e.target; + + const handleChange = (e) => { + const { name, value } = e.target; setFormData({ - ...formData, - [name]:value, + ...formData, + [name]: value, }); }; + + const handleFileChange = (e) => { + setFormData({ + ...formData, + document: e.target.files[0] + }); + }; + const handleSubmit = async (e) => { e.preventDefault(); - const endpoint = 'https://monilmeh.pythonanywhere.com//api/notes/'; - + console.log('Form data:', formData); // Log all form data to the console + + const endpoint = 'https://monilmeh.pythonanywhere.com/api/notes/'; + const form = new FormData(); + + form.append('note_title', formData.notesTitle); + form.append('subject', formData.subject); + form.append('department', formData.department); + form.append('note_description', formData.notesDescription); + form.append('document', formData.document); + form.append('user', formData.user); + try { - const response = await axios.post(endpoint, formData, { + const response = await axios.post(endpoint, form, { headers: { - 'Content-Type': 'application/json', - 'Authorization':'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE0ODQ0Nzc4LCJpYXQiOjE3MTQ4MjMxNzgsImp0aSI6ImZmYTRhOTZlOTNlNTQ4ZGU4NmZmZmQ1M2E1MjMyYTliIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.ihi7jgo0F-dNgtkLAE08OXUkD3kEw5AlXvNmx5QsisM' + 'Content-Type': 'multipart/form-data', + 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE3ODg0ODU0LCJpYXQiOjE3MTc4NjMyNTQsImp0aSI6ImZlMzc5NzEwOWMxMTQ1OGQ4Y2I3YjhlMmQ1YzAyYTc1IiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.CD-k1uBlf-nypVNQNORWodh8W0vf0t1D0gNdr9Lf0Ac' }, }); - if (response.status === 200) { + if (response.status === 201) { alert('Notes uploaded successfully!'); setFormData({ notesTitle: '', subject: '', department: '', notesDescription: '', - user: '60004220207' // Assuming user ID is constant + document: null, + user: '60004220207' }); } else { alert('Failed to upload notes'); @@ -48,67 +68,79 @@ function UploadNotes() { alert('An error occurred. Please try again.'); } }; + + const handleButtonClick = () => { + document.getElementById('fileUpload').click(); + }; + return ( -
-

- Upload Notes +

+

+ Upload Notes

Notes title

- -
-
-

Subject

- - -
-
-

Department

- - -
+ +
+
+

Subject

+
- +
+

Department

+ +
+

Notes Description

- - - -

Upload Images

-
- -
- - -
-
-
- -
-
+ +

Upload Document

+
+
+ + + +
+
+
+ +
+
- ) + ); } -export default UploadNotes \ No newline at end of file +export default UploadNotes; From 73eb98a5f9b2b847901eb578230b0a332a8d03e4 Mon Sep 17 00:00:00 2001 From: Divya Gandhi Date: Sat, 8 Jun 2024 23:21:39 +0530 Subject: [PATCH 34/82] NewPost integration --- src/Components/NewPost/NewPost.jsx | 92 ++++++++++++++++++++++++++-- src/Components/Notes/UploadNotes.jsx | 2 +- 2 files changed, 87 insertions(+), 7 deletions(-) diff --git a/src/Components/NewPost/NewPost.jsx b/src/Components/NewPost/NewPost.jsx index 26fae94..3524c92 100644 --- a/src/Components/NewPost/NewPost.jsx +++ b/src/Components/NewPost/NewPost.jsx @@ -1,6 +1,68 @@ -import React from 'react' +import React,{useState} from 'react' import CloudUploadOutlinedIcon from '@mui/icons-material/CloudUploadOutlined'; +import axios from 'axios'; function NewPost() { + const [formData, setFormData] = useState({ + postTitle: '', + postCategory: '', + postDescription: '', + document: null, + }); + + const handleChange = (e) => { + const { name, value } = e.target; + setFormData({ + ...formData, + [name]: value, + }); + }; + + const handleFileChange = (e) => { + setFormData({ + ...formData, + document: e.target.files[0], + }); + }; + + const handleSubmit = async (e) => { + e.preventDefault(); + + const endpoint = 'https://monilmeh.pythonanywhere.com//api/posts'; + const form = new FormData(); + + form.append('post_title', formData.postTitle); + form.append('category', formData.postCategory); + form.append('description', formData.postDescription); + form.append('document', formData.document); + + try { + const response = await axios.post(endpoint, form, { + headers: { + 'Content-Type': 'multipart/form-data', + 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE3ODg0ODU0LCJpYXQiOjE3MTc4NjMyNTQsImp0aSI6ImZlMzc5NzEwOWMxMTQ1OGQ4Y2I3YjhlMmQ1YzAyYTc1IiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.CD-k1uBlf-nypVNQNORWodh8W0vf0t1D0gNdr9Lf0Ac' + }, + }); + + if (response.status === 201) { + alert('Post created successfully!'); + setFormData({ + postTitle: '', + postCategory: '', + postDescription: '', + document: null, + }); + } else { + alert('Failed to create post'); + } + } catch (error) { + console.error('Error:', error); + alert('An error occurred. Please try again.'); + } + }; + + const handleButtonClick = () => { + document.getElementById('fileUpload').click(); + }; return (

@@ -8,21 +70,39 @@ function NewPost() {

Post title

- +

Post Category

- +

Post Description

- +

Upload Images

- + +
- +
diff --git a/src/Components/Notes/UploadNotes.jsx b/src/Components/Notes/UploadNotes.jsx index 32875ef..4f3b001 100644 --- a/src/Components/Notes/UploadNotes.jsx +++ b/src/Components/Notes/UploadNotes.jsx @@ -30,7 +30,7 @@ function UploadNotes() { const handleSubmit = async (e) => { e.preventDefault(); - console.log('Form data:', formData); // Log all form data to the console + console.log('Form data:', formData); const endpoint = 'https://monilmeh.pythonanywhere.com/api/notes/'; const form = new FormData(); From ed42af27c8be882c96ca6491ee6b4402259e155c Mon Sep 17 00:00:00 2001 From: Divya Gandhi Date: Sun, 9 Jun 2024 12:20:01 +0530 Subject: [PATCH 35/82] Integrated upload notes --- src/Components/Home/ShareNotes.jsx | 136 ++++++++++++--------------- src/Components/NewPost/NewPost.jsx | 2 +- src/Components/Notes/UploadNotes.jsx | 7 +- 3 files changed, 63 insertions(+), 82 deletions(-) diff --git a/src/Components/Home/ShareNotes.jsx b/src/Components/Home/ShareNotes.jsx index 93b6865..63a8573 100644 --- a/src/Components/Home/ShareNotes.jsx +++ b/src/Components/Home/ShareNotes.jsx @@ -1,93 +1,73 @@ -import React from 'react' - +import React, { useEffect, useState } from 'react'; import StarIcon from '@mui/icons-material/Star'; import PictureAsPdfOutlinedIcon from '@mui/icons-material/PictureAsPdfOutlined'; +import axios from 'axios'; - -const cardData = [ - { - "heading1": 'Notes Title', - - "body": "Check out these Study Buddy Notes crafted by students who have been through coding sub.. ", - "icon": , - "department":" Department", - - 'timelimit': '100 + Likes', - 'pdf': - - }, - { - "heading1": 'Notes Title', - - "body": "Check out these Study Buddy Notes crafted by students who have been through coding sub..", - "icon": , - "department":" Department", - 'timelimit': '100 + Likes', - 'pdf': - - }, - { - "heading1": 'Notes Title', - "body": "Check out these Study Buddy Notes crafted by students who have been through coding sub..", - "icon": , - "department":" Department", - 'pdf':, - 'timelimit': '100 + Likes', - - }, - { - "heading1": 'Notes Title', - "body": "Check out these Study Buddy Notes crafted by students who have been through coding sub..", - "icon": , - "department":" Department", - 'pdf': - - - }, - { - "heading1": 'Notes Title', - "body": "Check out these Study Buddy Notes crafted by students who have been through coding sub..", - "icon": , - "department":" Department", - 'pdf': - - }, - ] function ShareNotes() { + const [cardData, setCardData] = useState([]); + + useEffect(() => { + const fetchData = async () => { + try { + const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE3OTMyMjc2LCJpYXQiOjE3MTc5MTA2NzYsImp0aSI6IjFkNjI5MWViOGQzYzQwNjc5OTQyN2U4YWFiYjQ2ODIxIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.bK54XJ1-vnJjzGMhLdubn47FpZnxNgG1x4NZwnu1dsE'; // Replace with the actual token + const response = await axios.get('https://monilmeh.pythonanywhere.com/api/notes/', { + headers: { + 'Authorization': `Bearer ${token}` + } + }); + + const data = response.data.map((item) => ({ + heading1: item.note_title, + body: item.note_description, + icon: , + stars: item.average_rating, + department: item.department, + pdf: ( + + + + ), + })); + + setCardData(data); + } catch (error) { + console.error('Error fetching data:', error); + } + }; + + fetchData(); + }, []); + return ( -
-

+

+

Share Notes

-
- {cardData.map((data, i) => { - return
-
-
-

{data.heading1}

-
- {data.icon} -

4.6

-
- -
-
-

{data.body}

-
-
- -

{data.department}

- {data.pdf} +
+ {cardData.map((data, i) => ( +
+
+
+

{data.heading1}

+
+ {data.icon} +

{data.stars}

+
+
+

{data.body}

+
+
+

{data.department}

+ {data.pdf} +
-
- })} + ))}
-
- ) + ); } -export default ShareNotes \ No newline at end of file +export default ShareNotes; diff --git a/src/Components/NewPost/NewPost.jsx b/src/Components/NewPost/NewPost.jsx index 3524c92..6cb0d6a 100644 --- a/src/Components/NewPost/NewPost.jsx +++ b/src/Components/NewPost/NewPost.jsx @@ -39,7 +39,7 @@ function NewPost() { const response = await axios.post(endpoint, form, { headers: { 'Content-Type': 'multipart/form-data', - 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE3ODg0ODU0LCJpYXQiOjE3MTc4NjMyNTQsImp0aSI6ImZlMzc5NzEwOWMxMTQ1OGQ4Y2I3YjhlMmQ1YzAyYTc1IiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.CD-k1uBlf-nypVNQNORWodh8W0vf0t1D0gNdr9Lf0Ac' + 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE3OTMyMjc2LCJpYXQiOjE3MTc5MTA2NzYsImp0aSI6IjFkNjI5MWViOGQzYzQwNjc5OTQyN2U4YWFiYjQ2ODIxIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.bK54XJ1-vnJjzGMhLdubn47FpZnxNgG1x4NZwnu1dsE' }, }); diff --git a/src/Components/Notes/UploadNotes.jsx b/src/Components/Notes/UploadNotes.jsx index 4f3b001..6436d1d 100644 --- a/src/Components/Notes/UploadNotes.jsx +++ b/src/Components/Notes/UploadNotes.jsx @@ -8,6 +8,7 @@ function UploadNotes() { subject: '', department: '', notesDescription: '', + average_rating: 4, document: null, user: '60004220207' // Assuming user ID is constant }); @@ -30,8 +31,6 @@ function UploadNotes() { const handleSubmit = async (e) => { e.preventDefault(); - console.log('Form data:', formData); - const endpoint = 'https://monilmeh.pythonanywhere.com/api/notes/'; const form = new FormData(); @@ -39,6 +38,7 @@ function UploadNotes() { form.append('subject', formData.subject); form.append('department', formData.department); form.append('note_description', formData.notesDescription); + form.append('stars',formData.stars); form.append('document', formData.document); form.append('user', formData.user); @@ -46,7 +46,7 @@ function UploadNotes() { const response = await axios.post(endpoint, form, { headers: { 'Content-Type': 'multipart/form-data', - 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE3ODg0ODU0LCJpYXQiOjE3MTc4NjMyNTQsImp0aSI6ImZlMzc5NzEwOWMxMTQ1OGQ4Y2I3YjhlMmQ1YzAyYTc1IiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.CD-k1uBlf-nypVNQNORWodh8W0vf0t1D0gNdr9Lf0Ac' + 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE3OTMyMjc2LCJpYXQiOjE3MTc5MTA2NzYsImp0aSI6IjFkNjI5MWViOGQzYzQwNjc5OTQyN2U4YWFiYjQ2ODIxIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.bK54XJ1-vnJjzGMhLdubn47FpZnxNgG1x4NZwnu1dsE' }, }); @@ -57,6 +57,7 @@ function UploadNotes() { subject: '', department: '', notesDescription: '', + average_rating:4, document: null, user: '60004220207' }); From 5fd8d6e0dd15b93207b31627650d54bc16183fb0 Mon Sep 17 00:00:00 2001 From: Divya Gandhi Date: Sun, 9 Jun 2024 16:04:10 +0530 Subject: [PATCH 36/82] Integrated job page --- src/Components/Home/JobOpportunity.jsx | 84 +++++++++++++------------- src/Components/Home/LatestPosts.jsx | 2 +- src/Components/Home/ShareNotes.jsx | 12 ++-- src/Components/Notes/UploadNotes.jsx | 6 +- src/Pages/PostJob.jsx | 2 +- 5 files changed, 53 insertions(+), 53 deletions(-) diff --git a/src/Components/Home/JobOpportunity.jsx b/src/Components/Home/JobOpportunity.jsx index 1efb016..6142088 100644 --- a/src/Components/Home/JobOpportunity.jsx +++ b/src/Components/Home/JobOpportunity.jsx @@ -1,61 +1,61 @@ -import React from 'react'; +import React,{useState,useEffect} from 'react'; import CalendarTodayIcon from '@mui/icons-material/CalendarToday'; import AccessTimeOutlinedIcon from '@mui/icons-material/AccessTimeOutlined'; import SmartphoneOutlinedIcon from '@mui/icons-material/SmartphoneOutlined'; +import axios from 'axios'; +function JobOpportunity() { + const[cardData,setCardData]=useState([]); + useEffect(()=>{ + const fetchData=async()=>{ + try{ + + const response=await axios.get('https://monilmeh.pythonanywhere.com//api/jobboard/',{ + headers:{ + 'Authorization':'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE3OTMyMjc2LCJpYXQiOjE3MTc5MTA2NzYsImp0aSI6IjFkNjI5MWViOGQzYzQwNjc5OTQyN2U4YWFiYjQ2ODIxIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.bK54XJ1-vnJjzGMhLdubn47FpZnxNgG1x4NZwnu1dsE' + } + }); + const data=response.data.map((item)=>({ + heading1:item.company, + heading2:item.job_title, + heading3:item.subtype, + body:item.requirements, + body1:item.description, + contact:item.contact_no, + icon:, + time:item.duration_in_months, + timeicon:, + timelimit:item.location, + mobile:, + mode:item.mode, + date:item.upload_time, -const cardData = [ - { - "heading1": 'Internship', - "heading2": 'Company Name', - "body": "We are seeking highly motivated and enthusiastic technology intern to join us", - "icon": , - "time": "3 Months", - "timeicon": , - 'timelimit': 'Part-time', - "mode": "Online", - "mobile": , - "date": "24th March,2024" - }, - { - "heading1": 'Internship', - "heading2": 'Company Name', - "body": "We are seeking highly motivated and enthusiastic technology intern to join us", - "icon": , - "time": "3 Months", - "timeicon": , - 'timelimit': 'Part-time', - "mode": "Online", - "mobile": , - "date": "24th March,2024", - }, - { - "heading1": 'Internship', - "heading2": 'Company Name', - "body": "We are seeking highly motivated and enthusiastic technology intern to join us", - "icon": , - "time": "3 Months", - "timeicon": , - 'timelimit': 'Part-time', - "mode": "Online", - "mobile": , - "date": "24th March,2024", - }, -] -function JobOpportunity() { + })); + setCardData(data); + + + }catch(error){ + console.log('Error in fetching',error); + } + }; + fetchData(); + },[]); return (

Explore Latest Job Opportunities

-
+
{cardData.map((data, i) => { return

{data.heading1}

{data.heading2}

-

{data.body}

+

{data.heading3}

+

{data.body}

+

{data.body1}

+

{data.contact}

{data.icon } diff --git a/src/Components/Home/LatestPosts.jsx b/src/Components/Home/LatestPosts.jsx index 4399c7d..0a3cb6b 100644 --- a/src/Components/Home/LatestPosts.jsx +++ b/src/Components/Home/LatestPosts.jsx @@ -41,7 +41,7 @@ function LatestPosts() { Latest Posts

-
+
{cardData.map((data, i) => { return
diff --git a/src/Components/Home/ShareNotes.jsx b/src/Components/Home/ShareNotes.jsx index 63a8573..1accfc2 100644 --- a/src/Components/Home/ShareNotes.jsx +++ b/src/Components/Home/ShareNotes.jsx @@ -15,7 +15,7 @@ function ShareNotes() { 'Authorization': `Bearer ${token}` } }); - + console.log(response.data); const data = response.data.map((item) => ({ heading1: item.note_title, body: item.note_description, @@ -23,7 +23,7 @@ function ShareNotes() { stars: item.average_rating, department: item.department, pdf: ( - + ), @@ -44,15 +44,15 @@ function ShareNotes() { Share Notes

-
+
{cardData.map((data, i) => ( -
-
+
+

{data.heading1}

{data.icon} -

{data.stars}

+

{data.stars && data.stars.toFixed(1)}

diff --git a/src/Components/Notes/UploadNotes.jsx b/src/Components/Notes/UploadNotes.jsx index 6436d1d..736be40 100644 --- a/src/Components/Notes/UploadNotes.jsx +++ b/src/Components/Notes/UploadNotes.jsx @@ -8,7 +8,7 @@ function UploadNotes() { subject: '', department: '', notesDescription: '', - average_rating: 4, + rating: 4, document: null, user: '60004220207' // Assuming user ID is constant }); @@ -38,7 +38,7 @@ function UploadNotes() { form.append('subject', formData.subject); form.append('department', formData.department); form.append('note_description', formData.notesDescription); - form.append('stars',formData.stars); + // form.append('stars',formData.rating); form.append('document', formData.document); form.append('user', formData.user); @@ -57,7 +57,7 @@ function UploadNotes() { subject: '', department: '', notesDescription: '', - average_rating:4, + rating:4, document: null, user: '60004220207' }); diff --git a/src/Pages/PostJob.jsx b/src/Pages/PostJob.jsx index c7e0cad..7b8a1f1 100644 --- a/src/Pages/PostJob.jsx +++ b/src/Pages/PostJob.jsx @@ -71,7 +71,7 @@ const handleSubmit = (e) => { axios.post('https://monilmeh.pythonanywhere.com/api/jobboard/', formData, { headers: { 'Content-Type': 'application/json', - 'Authorization': 'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE3NzA5NTEwLCJpYXQiOjE3MTc2ODc5MTAsImp0aSI6IjdhZmY0OWY4OGU2ZTQ4NzNhY2ExNDc5MGFmM2VlMzU3IiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.2qEts4v2MSFYoVfC1Ge2Tv5xJyhI8cMB5UoesbsDz-0' // Replace with your actual token + 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE3OTMyMjc2LCJpYXQiOjE3MTc5MTA2NzYsImp0aSI6IjFkNjI5MWViOGQzYzQwNjc5OTQyN2U4YWFiYjQ2ODIxIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.bK54XJ1-vnJjzGMhLdubn47FpZnxNgG1x4NZwnu1dsE' // Replace with your actual token } }) .then((response) => { From f4f35152d474823632cb1542b743529de94e9744 Mon Sep 17 00:00:00 2001 From: Divya Gandhi Date: Sun, 9 Jun 2024 17:57:23 +0530 Subject: [PATCH 37/82] Integrated home page --- src/Components/Home/JobOpportunity.jsx | 2 +- src/Components/Home/LatestPosts.jsx | 68 +++++------ src/Components/Home/ShareNotes.jsx | 2 +- src/Components/NewPost/NewPost.jsx | 163 +++++++++++++++++-------- 4 files changed, 146 insertions(+), 89 deletions(-) diff --git a/src/Components/Home/JobOpportunity.jsx b/src/Components/Home/JobOpportunity.jsx index 6142088..cfa8b9f 100644 --- a/src/Components/Home/JobOpportunity.jsx +++ b/src/Components/Home/JobOpportunity.jsx @@ -11,7 +11,7 @@ function JobOpportunity() { const response=await axios.get('https://monilmeh.pythonanywhere.com//api/jobboard/',{ headers:{ - 'Authorization':'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE3OTMyMjc2LCJpYXQiOjE3MTc5MTA2NzYsImp0aSI6IjFkNjI5MWViOGQzYzQwNjc5OTQyN2U4YWFiYjQ2ODIxIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.bK54XJ1-vnJjzGMhLdubn47FpZnxNgG1x4NZwnu1dsE' + 'Authorization':'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE3OTU1NzY5LCJpYXQiOjE3MTc5MzQxNjksImp0aSI6IjBmMzZhMzkzNGY2ZTQzNWZiY2JlNTEwM2VmYWQ4ZmFjIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0._fHqpLGaofy8ZdgRGkH1cshkWOK5gnMNTkKLWlhb9iY' } }); const data=response.data.map((item)=>({ diff --git a/src/Components/Home/LatestPosts.jsx b/src/Components/Home/LatestPosts.jsx index 0a3cb6b..7f81cfc 100644 --- a/src/Components/Home/LatestPosts.jsx +++ b/src/Components/Home/LatestPosts.jsx @@ -1,40 +1,36 @@ -import React from 'react' +import React,{useState,useEffect}from 'react' import FavoriteBorderOutlinedIcon from '@mui/icons-material/FavoriteBorderOutlined'; +import axios from 'axios'; -const cardData = [ - { - "heading1": 'Post Title', - - "body": "Hello tech enthusiastics and innovators! Are you ready to show case your skills,collabrate with like-minded individuals,and create ground-breaking solutions for real-world challenges? ", - "icon": , - - - 'timelimit': '100 + Likes', - - }, - { - "heading1": 'Post Title', - - "body": "Hello tech enthusiastics and innovators! Are you ready to show case your skills,collabrate with like-minded individuals,and create ground-breaking solutions for real-world challenges?", - "icon": , - - 'timelimit': '100 + Likes', - - }, - { - "heading1": 'Post Title', - - "body": "Hello tech enthusiastics and innovators! Are you ready to show case your skills,collabrate with like-minded individuals,and create ground-breaking solutions for real-world challenges?", - "icon": , - - - 'timelimit': '100 + Likes', - - }, -] function LatestPosts() { + const [cardData,setCardData]=useState([]); + useEffect(()=>{ + const fetchData=async()=>{ + try{ + const response=await axios.get('https://monilmeh.pythonanywhere.com//api/posts ',{ + headers:{ + 'Authorization':'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE3OTU1NzY5LCJpYXQiOjE3MTc5MzQxNjksImp0aSI6IjBmMzZhMzkzNGY2ZTQzNWZiY2JlNTEwM2VmYWQ4ZmFjIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0._fHqpLGaofy8ZdgRGkH1cshkWOK5gnMNTkKLWlhb9iY' + } + }); + const data=response.data.map((item)=>({ + heading1:item.title, + body:item.description, + icon: , + timelimit:item.likes, + category:item.subtype, + url:item.post_url, + deadlines:item.deadline, + + })); + setCardData(data); + }catch(error){ + console.error('Error fetching data:',error); + } + }; + fetchData(); + },[]); return (

@@ -47,13 +43,17 @@ function LatestPosts() {

{data.heading1}

-

{data.body}

+ + +

{data.body}

+

{data.url}

{data.icon }

{data.timelimit}

-

Categories

+

{data.category}

+

{data.deadlines}

diff --git a/src/Components/Home/ShareNotes.jsx b/src/Components/Home/ShareNotes.jsx index 1accfc2..d7a9d12 100644 --- a/src/Components/Home/ShareNotes.jsx +++ b/src/Components/Home/ShareNotes.jsx @@ -9,7 +9,7 @@ function ShareNotes() { useEffect(() => { const fetchData = async () => { try { - const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE3OTMyMjc2LCJpYXQiOjE3MTc5MTA2NzYsImp0aSI6IjFkNjI5MWViOGQzYzQwNjc5OTQyN2U4YWFiYjQ2ODIxIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.bK54XJ1-vnJjzGMhLdubn47FpZnxNgG1x4NZwnu1dsE'; // Replace with the actual token + const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE3OTU1NzY5LCJpYXQiOjE3MTc5MzQxNjksImp0aSI6IjBmMzZhMzkzNGY2ZTQzNWZiY2JlNTEwM2VmYWQ4ZmFjIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0._fHqpLGaofy8ZdgRGkH1cshkWOK5gnMNTkKLWlhb9iY'; // Replace with the actual token const response = await axios.get('https://monilmeh.pythonanywhere.com/api/notes/', { headers: { 'Authorization': `Bearer ${token}` diff --git a/src/Components/NewPost/NewPost.jsx b/src/Components/NewPost/NewPost.jsx index 6cb0d6a..7c7f8b3 100644 --- a/src/Components/NewPost/NewPost.jsx +++ b/src/Components/NewPost/NewPost.jsx @@ -1,12 +1,17 @@ -import React,{useState} from 'react' +import React, { useState } from 'react'; import CloudUploadOutlinedIcon from '@mui/icons-material/CloudUploadOutlined'; import axios from 'axios'; + function NewPost() { const [formData, setFormData] = useState({ - postTitle: '', - postCategory: '', - postDescription: '', + title: '', + subtype: '', + description: '', document: null, + deadline: '', + likes: 100, + post_url: '', + user: '60004220207' // Assuming user ID is static for this example }); const handleChange = (e) => { @@ -27,29 +32,37 @@ function NewPost() { const handleSubmit = async (e) => { e.preventDefault(); - const endpoint = 'https://monilmeh.pythonanywhere.com//api/posts'; + const endpoint = 'https://monilmeh.pythonanywhere.com/api/posts'; const form = new FormData(); - form.append('post_title', formData.postTitle); - form.append('category', formData.postCategory); - form.append('description', formData.postDescription); - form.append('document', formData.document); + form.append('title', formData.title); // Ensure this matches the expected field name + form.append('category', formData.subtype); + form.append('description', formData.description); + form.append('image', formData.document); // Ensure this matches the expected field name + form.append('deadline', formData.deadline); + form.append('likes', formData.likes); + form.append('post_url', formData.post_url); + form.append('user', formData.user); try { const response = await axios.post(endpoint, form, { headers: { 'Content-Type': 'multipart/form-data', - 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE3OTMyMjc2LCJpYXQiOjE3MTc5MTA2NzYsImp0aSI6IjFkNjI5MWViOGQzYzQwNjc5OTQyN2U4YWFiYjQ2ODIxIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.bK54XJ1-vnJjzGMhLdubn47FpZnxNgG1x4NZwnu1dsE' + 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE3OTU1NzY5LCJpYXQiOjE3MTc5MzQxNjksImp0aSI6IjBmMzZhMzkzNGY2ZTQzNWZiY2JlNTEwM2VmYWQ4ZmFjIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0._fHqpLGaofy8ZdgRGkH1cshkWOK5gnMNTkKLWlhb9iY' }, }); if (response.status === 201) { alert('Post created successfully!'); setFormData({ - postTitle: '', - postCategory: '', - postDescription: '', + title: '', + subtype: '', + description: '', document: null, + deadline: '', + likes: 100, + post_url: '', + user: '60004220207' }); } else { alert('Failed to create post'); @@ -63,51 +76,95 @@ function NewPost() { const handleButtonClick = () => { document.getElementById('fileUpload').click(); }; + return ( -
-

- Create New Post +

+

+ Create New Post

-

Post title

- -

Post Category

- +
+
+

Post Title

+ +
+
+

Post Category

+ +
+

Post Description

- -

Upload Images

-
- -
- - - -
-
-
- -
-
+ +
+
+

Deadline

+ +
+
+

Post URL

+ +
+
+

Upload Images

+
+
+ + + +
+
+
+ +
+
- ) + ); } -export default NewPost \ No newline at end of file +export default NewPost; From 0072874815e657641c5b420c73602514fec80729 Mon Sep 17 00:00:00 2001 From: anshshah23 Date: Mon, 10 Jun 2024 17:50:16 +0530 Subject: [PATCH 38/82] Integrated Splash, LoginPage and SignUp pages with the api --- package-lock.json | 26 ++++++ package.json | 1 - src/App.js | 54 ++++++++---- src/Components/Home/Sidebar.jsx | 2 +- src/Pages/LoginPage.jsx | 68 ++++++++++++--- src/Pages/PostJob.jsx | 2 +- src/Pages/SignUp.jsx | 142 +++++++++++++++++++++++++++----- src/Pages/Splash.jsx | 2 +- 8 files changed, 248 insertions(+), 49 deletions(-) diff --git a/package-lock.json b/package-lock.json index dff0580..70727dc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,9 @@ "@testing-library/jest-dom": "^5.17.0", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", + "axios": "^1.7.2", + "bootstrap": "^5.3.3", + "debug": "^4.3.4", "react": "^18.2.0", "react-dom": "^18.2.0", "react-icons": "^5.0.1", @@ -5609,6 +5612,29 @@ "node": ">=4" } }, + "node_modules/axios": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", + "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axios/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/axobject-query": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", diff --git a/package.json b/package.json index 2c5dbb6..28a58bc 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,6 @@ "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", "axios": "^1.7.2", - "axios": "^1.6.8", "bootstrap": "^5.3.3", "debug": "^4.3.4", "react": "^18.2.0", diff --git a/src/App.js b/src/App.js index 87c9493..62d530b 100644 --- a/src/App.js +++ b/src/App.js @@ -1,7 +1,7 @@ +import React, { useState, useEffect } from 'react'; import './App.css'; import Home from './Pages/Home'; -import { BrowserRouter, Route, Routes } from 'react-router-dom'; // Choose one of the conflicting import statements - +import { BrowserRouter as Router, Route, Routes, Navigate } from 'react-router-dom'; import PostJob from './Pages/PostJob'; import ViewJob from './Pages/ViewJob'; import NewPost from './Pages/NewPostPage'; @@ -17,25 +17,47 @@ import LoginPage from './Pages/LoginPage'; import PostDetails from './Pages/PostDetails'; function App() { + const [isLoggedIn, setIsLoggedIn] = useState(false); + + useEffect(() => { + const loggedIn = localStorage.getItem('isLoggedIn') === 'true'; + setIsLoggedIn(loggedIn); + }, []); + + const handleLoginChange = (isLoggedIn) => { + setIsLoggedIn(isLoggedIn); + if (isLoggedIn) { + localStorage.setItem('isLoggedIn', 'true'); + } else { + localStorage.removeItem('isLoggedIn'); + } + }; + + const handleLogout = () => { + setIsLoggedIn(false); + localStorage.removeItem('isLoggedIn'); + }; + return ( - + - } /> } /> - } /> + } /> } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - }/> + : } /> + : } /> + : } /> + : } /> + : } /> + : } /> + : } /> + : } /> + : } /> + : } /> + : } /> + : } /> - + ); } diff --git a/src/Components/Home/Sidebar.jsx b/src/Components/Home/Sidebar.jsx index 8c933b1..ada6a53 100644 --- a/src/Components/Home/Sidebar.jsx +++ b/src/Components/Home/Sidebar.jsx @@ -30,7 +30,7 @@ const Sidebar = () => { } function loginNavigate() { - navigate('/LoginPage'); + navigate('/profile'); } function toggleSidebar() { setIsOpen(!isOpen); diff --git a/src/Pages/LoginPage.jsx b/src/Pages/LoginPage.jsx index d02a374..a6bd35b 100644 --- a/src/Pages/LoginPage.jsx +++ b/src/Pages/LoginPage.jsx @@ -1,14 +1,41 @@ -import React from 'react'; +import React, { useState } from 'react'; import { useNavigate } from 'react-router-dom'; import LoginImg1 from '../assets/loginimg-top.svg'; import LoginImg2 from '../assets/loginimg-bottom.svg'; -const LoginPage = () => { +const LoginPage = ({ onLoginChange }) => { const navigate = useNavigate(); + const [sapid, setSapid] = useState(''); + const [password, setPassword] = useState(''); - function loginClick() { - navigate('/'); - } + const handleSubmit = async (event) => { + event.preventDefault(); + const loginData = { + sapid, + password + }; + + try { + const response = await fetch('https://monilmeh.pythonanywhere.com/auth/token', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(loginData), + }); + + if (response.ok) { + const data = await response.json(); + console.log('Login successful:', data); + onLoginChange(true); // Call the onLoginChange callback with true to indicate user is logged in + navigate('/Home'); // Redirect to homepage after successful login + } else { + console.error('Login failed:', response.statusText); + } + } catch (error) { + console.error('Error:', error); + } + }; return (
@@ -19,20 +46,41 @@ const LoginPage = () => {
-
+
- - + + setSapid(e.target.value)} + />
- + setPassword(e.target.value)} + />
+
- Forgot your password?
diff --git a/src/Pages/PostJob.jsx b/src/Pages/PostJob.jsx index 7b8a1f1..27cabb7 100644 --- a/src/Pages/PostJob.jsx +++ b/src/Pages/PostJob.jsx @@ -2,7 +2,7 @@ import React, { useState } from 'react'; import Sidebar from '../Components/Home/Sidebar'; import '../styles/PostJob.css'; import axios from 'axios'; -import { Navigate, useNavigate } from 'react-router-dom'; +import { useNavigate } from 'react-router-dom'; const PostJob = () => { const [subtype, setsubtype] = useState(null); diff --git a/src/Pages/SignUp.jsx b/src/Pages/SignUp.jsx index c13eaab..6c4518b 100644 --- a/src/Pages/SignUp.jsx +++ b/src/Pages/SignUp.jsx @@ -1,46 +1,150 @@ -import React from 'react'; +import React, { useState } from 'react'; import { useNavigate } from 'react-router-dom'; import SignUpImg from '../assets/signupimg.svg'; -const SignUp = () => { +const SignUp = () => { const navigate = useNavigate(); + const [formData, setFormData] = useState({ + sapid: '', + password: '', + fname: '', + lname: '', + email: '', + contact_number: '', + description: '' + }); + const [errorMessage, setErrorMessage] = useState(''); // State to hold error messages + + const handleChange = (e) => { + setFormData({ + ...formData, + [e.target.name]: e.target.value + }); + }; + + const handleSubmit = async (e) => { + e.preventDefault(); + setErrorMessage(''); // Clear previous error messages - function signupClick() { - navigate('/'); - } + try { + const response = await fetch('https://monilmeh.pythonanywhere.com/auth/register', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + sapid: formData.sapid, + password: formData.password, + fname: formData.fname, + lname: formData.lname, + email: formData.email, + contact_number: formData.contact_number + }) + }); + + if (response.ok) { + navigate('/'); // Navigate to home page after successful sign-up + } else { + const errorData = await response.json(); + setErrorMessage(errorData.message || 'Signup failed'); + } + } catch (error) { + setErrorMessage('An error occurred during sign-up. Please try again.'); + } + }; return (
-

NOTENG

+

NOTENG

SignUp
-
+
- - + +
- + +
+
+ + +
+
+ +
- - + +
+
+ + +
+
- + {errorMessage && ( +
+ {errorMessage} +
+ )}
); }; -export default SignUp; \ No newline at end of file +export default SignUp; diff --git a/src/Pages/Splash.jsx b/src/Pages/Splash.jsx index 1fd5413..fecd878 100644 --- a/src/Pages/Splash.jsx +++ b/src/Pages/Splash.jsx @@ -6,7 +6,7 @@ const Splash = () => { const navigate = useNavigate(); function loginClick() { - navigate('/'); + navigate('/LoginPage'); } function signupClick() { From 326aeb3a823da5090f082c7f8efba8f37042a778 Mon Sep 17 00:00:00 2001 From: anshshah23 Date: Mon, 10 Jun 2024 17:53:12 +0530 Subject: [PATCH 39/82] Profile name uniformity --- src/App.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/App.js b/src/App.js index 62d530b..8a339f9 100644 --- a/src/App.js +++ b/src/App.js @@ -7,7 +7,7 @@ import ViewJob from './Pages/ViewJob'; import NewPost from './Pages/NewPostPage'; import UploadNewPosts from './Pages/UploadNewPosts'; import SignUp from './Pages/SignUp'; -import Profile from './Pages/profile'; +import Profile from './Pages/Profile'; import NewNotes from './Components/Notes/NewNotes'; import ViewNote from './Components/Notes/ViewNote'; import UploadVideo from './Pages/UploadVideo'; @@ -50,7 +50,7 @@ function App() { : } /> : } /> : } /> - : } /> + : } /> : } /> : } /> : } /> From 33a452300bbe7261d20f09e87e0196f7452c66b0 Mon Sep 17 00:00:00 2001 From: anshshah23 Date: Mon, 10 Jun 2024 18:34:45 +0530 Subject: [PATCH 40/82] Some finer changes to the frontend to improve connectivity --- src/App.js | 53 +++++++++++++++++---------------- src/Components/Home/Sidebar.jsx | 20 ++++++------- src/Pages/LoginPage.jsx | 1 + src/Pages/profile.jsx | 2 +- src/styles/profile.css | 1 - 5 files changed, 39 insertions(+), 38 deletions(-) diff --git a/src/App.js b/src/App.js index 8a339f9..b57adac 100644 --- a/src/App.js +++ b/src/App.js @@ -18,45 +18,46 @@ import PostDetails from './Pages/PostDetails'; function App() { const [isLoggedIn, setIsLoggedIn] = useState(false); + const [checkedLogin, setCheckedLogin] = useState(false); useEffect(() => { + // Check local storage for login state const loggedIn = localStorage.getItem('isLoggedIn') === 'true'; setIsLoggedIn(loggedIn); - }, []); + setCheckedLogin(true); + }, []); // Run only once on component mount - const handleLoginChange = (isLoggedIn) => { - setIsLoggedIn(isLoggedIn); - if (isLoggedIn) { - localStorage.setItem('isLoggedIn', 'true'); - } else { - localStorage.removeItem('isLoggedIn'); - } + const handleLogin = () => { + setIsLoggedIn(true); + localStorage.setItem('isLoggedIn', 'true'); // Persist login state }; const handleLogout = () => { setIsLoggedIn(false); - localStorage.removeItem('isLoggedIn'); + localStorage.removeItem('isLoggedIn'); // Clear login state }; return ( - - } /> - } /> - } /> - : } /> - : } /> - : } /> - : } /> - : } /> - : } /> - : } /> - : } /> - : } /> - : } /> - : } /> - : } /> - + {checkedLogin && ( // Render the routes only after checking the login status + + : } /> + } /> + } /> + } /> + : } /> + : } /> + : } /> + : } /> + : } /> + : } /> + : } /> + : } /> + : } /> + : } /> + : } /> + + )} ); } diff --git a/src/Components/Home/Sidebar.jsx b/src/Components/Home/Sidebar.jsx index ada6a53..3777fcd 100644 --- a/src/Components/Home/Sidebar.jsx +++ b/src/Components/Home/Sidebar.jsx @@ -77,34 +77,34 @@ const Sidebar = () => {

Home

-
+
- < ExploreIcon style={{ width: '30px', height: '30px', color: '#394DFD' }} onClick={Discover}/> + < ExploreIcon style={{ width: '30px', height: '30px', color: '#394DFD' }}/>

Discover

-
-
+
+

Add Job Opportunity

-
-
+
+

Create New Post

-
-
+
+

Upload Notes

-
-
+
+

Share Video

diff --git a/src/Pages/LoginPage.jsx b/src/Pages/LoginPage.jsx index a6bd35b..ab1492d 100644 --- a/src/Pages/LoginPage.jsx +++ b/src/Pages/LoginPage.jsx @@ -28,6 +28,7 @@ const LoginPage = ({ onLoginChange }) => { const data = await response.json(); console.log('Login successful:', data); onLoginChange(true); // Call the onLoginChange callback with true to indicate user is logged in + localStorage.setItem('isLoggedIn', 'true'); // Persist login state in local storage navigate('/Home'); // Redirect to homepage after successful login } else { console.error('Login failed:', response.statusText); diff --git a/src/Pages/profile.jsx b/src/Pages/profile.jsx index c30caa2..00cc45f 100644 --- a/src/Pages/profile.jsx +++ b/src/Pages/profile.jsx @@ -16,7 +16,7 @@ const Profile=() => { const handleGoBack = (event) => { event.preventDefault(); - navigate.goBack(); + navigate('/Home'); }; diff --git a/src/styles/profile.css b/src/styles/profile.css index d756a04..c83cdc9 100644 --- a/src/styles/profile.css +++ b/src/styles/profile.css @@ -1,4 +1,3 @@ .profilecard{ - margin-right: auto; } \ No newline at end of file From 14eb04754724c9addd3ad6505ee932d2288642d4 Mon Sep 17 00:00:00 2001 From: MonilMehta Date: Wed, 12 Jun 2024 10:23:41 +0530 Subject: [PATCH 41/82] Integrated Note viewing --- package-lock.json | 473 ++++++++++++++++++++++++++++++ package.json | 1 + src/Components/Notes/ViewNote.jsx | 39 ++- src/Components/Notes/viewnote.css | 45 ++- src/Pages/PostJob.jsx | 2 +- src/Pages/ViewJob.jsx | 2 +- src/styles/ViewJob.css | 4 +- 7 files changed, 538 insertions(+), 28 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3262f87..af6eb7c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,6 +22,7 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-icons": "^5.0.1", + "react-pdf": "^9.0.0", "react-router-dom": "^6.22.3", "react-scripts": "^5.0.1", "web-vitals": "^2.1.4" @@ -3522,6 +3523,26 @@ "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==" }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, "node_modules/@mui/base": { "version": "5.0.0-beta.40", "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.40.tgz", @@ -5101,6 +5122,12 @@ "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", "deprecated": "Use your platform's native atob() and btoa() methods instead" }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "optional": true + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -5322,6 +5349,26 @@ "node": ">= 8" } }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "optional": true + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "deprecated": "This package is no longer supported.", + "optional": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", @@ -6190,6 +6237,21 @@ } ] }, + "node_modules/canvas": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.11.2.tgz", + "integrity": "sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.0", + "nan": "^2.17.0", + "simple-get": "^3.0.3" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/case-sensitive-paths-webpack-plugin": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", @@ -6260,6 +6322,15 @@ "node": ">= 6" } }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "optional": true, + "engines": { + "node": ">=10" + } + }, "node_modules/chrome-trace-event": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", @@ -6431,6 +6502,15 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "optional": true, + "bin": { + "color-support": "bin.js" + } + }, "node_modules/colord": { "version": "2.9.3", "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", @@ -6537,6 +6617,12 @@ "node": ">=0.8" } }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "optional": true + }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -7138,6 +7224,18 @@ "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" }, + "node_modules/decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "optional": true, + "dependencies": { + "mimic-response": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/dedent": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", @@ -7246,6 +7344,12 @@ "node": ">=0.4.0" } }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "optional": true + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -7271,6 +7375,15 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "optional": true, + "engines": { + "node": ">=8" + } + }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -8992,6 +9105,36 @@ "node": ">=12" } }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "optional": true + }, "node_modules/fs-monkey": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", @@ -9048,6 +9191,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "deprecated": "This package is no longer supported.", + "optional": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -9342,6 +9506,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "optional": true + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -12550,6 +12720,14 @@ "sourcemap-codec": "^1.4.8" } }, + "node_modules/make-cancellable-promise": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/make-cancellable-promise/-/make-cancellable-promise-1.3.2.tgz", + "integrity": "sha512-GCXh3bq/WuMbS+Ky4JBPW1hYTOU+znU+Q5m9Pu+pI8EoUqIHk9+tviOKC6/qhHh8C4/As3tzJ69IF32kdz85ww==", + "funding": { + "url": "https://github.com/wojtekmaj/make-cancellable-promise?sponsor=1" + } + }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -12572,6 +12750,14 @@ "semver": "bin/semver.js" } }, + "node_modules/make-event-props": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/make-event-props/-/make-event-props-1.6.2.tgz", + "integrity": "sha512-iDwf7mA03WPiR8QxvcVHmVWEPfMY1RZXerDVNCRYW7dUr2ppH3J58Rwb39/WG39yTZdRSxr3x+2v22tvI0VEvA==", + "funding": { + "url": "https://github.com/wojtekmaj/make-event-props?sponsor=1" + } + }, "node_modules/makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", @@ -12609,6 +12795,22 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" }, + "node_modules/merge-refs": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/merge-refs/-/merge-refs-1.3.0.tgz", + "integrity": "sha512-nqXPXbso+1dcKDpPCXvwZyJILz+vSLqGGOnDrYHQYE+B8n9JTCekVLC65AfCpR4ggVyA/45Y0iR9LDyS2iI+zA==", + "funding": { + "url": "https://github.com/wojtekmaj/merge-refs?sponsor=1" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -12680,6 +12882,18 @@ "node": ">=6" } }, + "node_modules/mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "optional": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", @@ -12788,6 +13002,37 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "optional": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "optional": true + }, "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -12826,6 +13071,12 @@ "thenify-all": "^1.0.0" } }, + "node_modules/nan": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.19.0.tgz", + "integrity": "sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==", + "optional": true + }, "node_modules/nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", @@ -12875,6 +13126,48 @@ "tslib": "^2.0.3" } }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "optional": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "optional": true + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "optional": true + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "optional": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -12893,6 +13186,21 @@ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "optional": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -12931,6 +13239,19 @@ "node": ">=8" } }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "deprecated": "This package is no longer supported.", + "optional": true, + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", @@ -13353,6 +13674,27 @@ "node": ">=8" } }, + "node_modules/path2d": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/path2d/-/path2d-0.2.0.tgz", + "integrity": "sha512-KdPAykQX6kmLSOO6Jpu2KNcCED7CKjmaBNGGNuctOsG0hgYO1OdYQaan6cYXJiG0WmXOwZZPILPBimu5QAIw3A==", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pdfjs-dist": { + "version": "4.3.136", + "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-4.3.136.tgz", + "integrity": "sha512-gzfnt1qc4yA+U46golPGYtU4WM2ssqP2MvFjKga8GEKOrEnzRPrA/9jogLLPYHiA3sGBPJ+p7BdAq+ytmw3jEg==", + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "canvas": "^2.11.2", + "path2d": "^0.2.0" + } + }, "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -15061,6 +15403,34 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" }, + "node_modules/react-pdf": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/react-pdf/-/react-pdf-9.0.0.tgz", + "integrity": "sha512-J+pza8R2p9oNEOJOHIQJI4o5rFK7ji7bBl2IvsHvz1OOyphvuzVDo5tOJwWAFAbxYauCH3Kt8jOvcMJUOpxYZQ==", + "dependencies": { + "clsx": "^2.0.0", + "dequal": "^2.0.3", + "make-cancellable-promise": "^1.3.1", + "make-event-props": "^1.6.0", + "merge-refs": "^1.3.0", + "pdfjs-dist": "4.3.136", + "tiny-invariant": "^1.0.0", + "warning": "^4.0.0" + }, + "funding": { + "url": "https://github.com/wojtekmaj/react-pdf?sponsor=1" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/react-refresh": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", @@ -15918,6 +16288,12 @@ "node": ">= 0.8.0" } }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "optional": true + }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -16002,6 +16378,37 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "optional": true + }, + "node_modules/simple-get": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", + "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", + "optional": true, + "dependencies": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -16818,6 +17225,50 @@ "node": ">=6" } }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "optional": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "optional": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "optional": true + }, "node_modules/temp-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", @@ -16971,6 +17422,11 @@ "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==" + }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -17476,6 +17932,14 @@ "makeerror": "1.0.12" } }, + "node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/watchpack": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", @@ -17968,6 +18432,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "optional": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", diff --git a/package.json b/package.json index ccdfb52..bd4c101 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-icons": "^5.0.1", + "react-pdf": "^9.0.0", "react-router-dom": "^6.22.3", "react-scripts": "^5.0.1", "web-vitals": "^2.1.4" diff --git a/src/Components/Notes/ViewNote.jsx b/src/Components/Notes/ViewNote.jsx index 93c2753..541523f 100644 --- a/src/Components/Notes/ViewNote.jsx +++ b/src/Components/Notes/ViewNote.jsx @@ -10,17 +10,17 @@ const ViewNote = () => { const navigate = useNavigate(); const { noteId } = useParams(); const [noteDetails, setNoteDetails] = useState(null); - + useEffect(() => { const fetchNoteDetails = async () => { try { const response = await axios.get(`https://monilmeh.pythonanywhere.com/api/notes/${noteId}/`, { headers: { - 'Authorization': 'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE3NzA5NTEwLCJpYXQiOjE3MTc2ODc5MTAsImp0aSI6IjdhZmY0OWY4OGU2ZTQ4NzNhY2ExNDc5MGFmM2VlMzU3IiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.2qEts4v2MSFYoVfC1Ge2Tv5xJyhI8cMB5UoesbsDz-0' + 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE3ODQ4NDcyLCJpYXQiOjE3MTc4MjY4NzIsImp0aSI6IjZmNTI5ZGEzM2QwZjQzNDM4NzZhM2UyNzlhMTEyZjdmIiwidXNlcl9pZCI6IjYwMDA0MjIwMTgzIn0.1IRs_bt9_9KFtwpbwlhDd9YG-3bYFcKrU2H1Nw__HcA' } }); - console.log(response.data); setNoteDetails(response.data); + console.log(response.data); } catch (error) { console.error('Error fetching note details:', error); } @@ -30,7 +30,7 @@ const ViewNote = () => { fetchNoteDetails(); } }, [noteId]); - + const handleGoBack = (event) => { event.preventDefault(); navigate.goBack(); @@ -54,14 +54,14 @@ const ViewNote = () => { const renderStars = (rating) => { const stars = []; - for (let i = 0; i < rating; i++) { - stars.push(⭐️); + for (let i = 0; i < 5; i++) { + stars.push({i < rating ? '⭐️' : '☆'}); } return stars; }; return ( -
+
@@ -86,10 +86,18 @@ const ViewNote = () => { {noteDetails && noteDetails.note_description}

- Note Preview + {noteDetails && noteDetails.document && ( + noteDetails.document.endsWith('.pdf') ? ( + +

Alternative text - include a link to the PDF!

+
+ ) : ( + Note Preview + ) + )}
-
@@ -104,17 +112,16 @@ const ViewNote = () => {

Rate :

- {noteDetails && renderStars(noteDetails.rating)} + {noteDetails && renderStars(noteDetails.average_rating)}
- + +
-
-); + ); }; export default ViewNote; diff --git a/src/Components/Notes/viewnote.css b/src/Components/Notes/viewnote.css index 18122e9..462474e 100644 --- a/src/Components/Notes/viewnote.css +++ b/src/Components/Notes/viewnote.css @@ -1,4 +1,7 @@ -.subtitle{ +/* viewnote.css */ + +/* Styles for larger screens */ +.subtitle { font-size: 1.9rem; font-weight: 600; color: #20222E; @@ -8,31 +11,57 @@ justify-content: center; } -.head3{ +.head3 { font-size: 32px; color: #8391A1; display: flex; justify-content: center; margin-top: 20px; } -.notes-description{ + +.notes-description { margin-top: 20px; margin-left: 40px; font-size: 24px; } -.noteimg{ + +.noteimg { width: 1058px; - height: 302px; + min-height: 500px; + height: min-content; margin-top: 40px; margin-left: 67px; border: 2px solid black; border-radius: 10px; margin-bottom: 24px; } -.badges{ + +.badges { width: 200px; } -.badges1{ + +.badges1 { margin-top: 30px; width: 200px; -} \ No newline at end of file +} + +/* Media queries for responsiveness */ +@media only screen and (max-width: 768px) { + /* Adjustments for smaller screens */ + .maincontent { + padding: 0 20px; /* Add padding to the main content */ + } + + .noteimg { + width: 100%; /* Make the image/document responsive */ + margin: 20px 0; /* Adjust margins */ + } + + .head3, + .notes-description, + .badges, + .badges1 { + margin-left: 0; /* Reset left margin */ + text-align: center; /* Center align text */ + } +} diff --git a/src/Pages/PostJob.jsx b/src/Pages/PostJob.jsx index c7e0cad..2ce891a 100644 --- a/src/Pages/PostJob.jsx +++ b/src/Pages/PostJob.jsx @@ -71,7 +71,7 @@ const handleSubmit = (e) => { axios.post('https://monilmeh.pythonanywhere.com/api/jobboard/', formData, { headers: { 'Content-Type': 'application/json', - 'Authorization': 'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE3NzA5NTEwLCJpYXQiOjE3MTc2ODc5MTAsImp0aSI6IjdhZmY0OWY4OGU2ZTQ4NzNhY2ExNDc5MGFmM2VlMzU3IiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.2qEts4v2MSFYoVfC1Ge2Tv5xJyhI8cMB5UoesbsDz-0' // Replace with your actual token + 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE3ODQ4NDcyLCJpYXQiOjE3MTc4MjY4NzIsImp0aSI6IjZmNTI5ZGEzM2QwZjQzNDM4NzZhM2UyNzlhMTEyZjdmIiwidXNlcl9pZCI6IjYwMDA0MjIwMTgzIn0.1IRs_bt9_9KFtwpbwlhDd9YG-3bYFcKrU2H1Nw__HcA' // Replace with your actual token } }) .then((response) => { diff --git a/src/Pages/ViewJob.jsx b/src/Pages/ViewJob.jsx index 4109bfd..a6a368c 100644 --- a/src/Pages/ViewJob.jsx +++ b/src/Pages/ViewJob.jsx @@ -16,7 +16,7 @@ const ViewJob = () => { try { const response = await axios.get(`https://monilmeh.pythonanywhere.com/api/jobboard/${jobId}/`, { headers: { - 'Authorization': 'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE3NzA5NTEwLCJpYXQiOjE3MTc2ODc5MTAsImp0aSI6IjdhZmY0OWY4OGU2ZTQ4NzNhY2ExNDc5MGFmM2VlMzU3IiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.2qEts4v2MSFYoVfC1Ge2Tv5xJyhI8cMB5UoesbsDz-0' + 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE3ODQ4NDcyLCJpYXQiOjE3MTc4MjY4NzIsImp0aSI6IjZmNTI5ZGEzM2QwZjQzNDM4NzZhM2UyNzlhMTEyZjdmIiwidXNlcl9pZCI6IjYwMDA0MjIwMTgzIn0.1IRs_bt9_9KFtwpbwlhDd9YG-3bYFcKrU2H1Nw__HcA' } }); setJobDetails(response.data); diff --git a/src/styles/ViewJob.css b/src/styles/ViewJob.css index 980daca..5b48d33 100644 --- a/src/styles/ViewJob.css +++ b/src/styles/ViewJob.css @@ -32,12 +32,12 @@ margin-top: 8px; height: 36px; } -.job-descrip { +.job-descrip{ font-family: Poppins; max-width: 1060px; color: #8391A1; margin-left: 3vw; - box-shadow: 0px 4px 12px rgba(247, 248, 249, 0.5); + box-shadow: 0px 4px 12px rgba(77, 77, 78, 0.5); background-color: #F7F8F9; border: 1px solid #E8ECF4; padding: 14px 24px 14px 24px; From 1c2ec3aa07895738eea8a3e8cda2229e5df60745 Mon Sep 17 00:00:00 2001 From: anshshah23 Date: Thu, 13 Jun 2024 00:16:18 +0530 Subject: [PATCH 42/82] Updated authentication pages --- src/Pages/LoginPage.jsx | 26 ++++---- src/Pages/SignUp.jsx | 128 +++++++++++----------------------------- src/Pages/Splash.jsx | 18 +++--- src/index.js | 4 +- 4 files changed, 62 insertions(+), 114 deletions(-) diff --git a/src/Pages/LoginPage.jsx b/src/Pages/LoginPage.jsx index ab1492d..b1cae38 100644 --- a/src/Pages/LoginPage.jsx +++ b/src/Pages/LoginPage.jsx @@ -37,17 +37,18 @@ const LoginPage = ({ onLoginChange }) => { console.error('Error:', error); } }; + return ( -
-
-

NOTENG

-
+
+
+

NOTENG

+
Login
-
+
{ onChange={(e) => setPassword(e.target.value)} />
+
+
+
+
+ Forgot your password? - -
-
-
- Forgot your password?
-
+
Login
diff --git a/src/Pages/SignUp.jsx b/src/Pages/SignUp.jsx index 6c4518b..f466dde 100644 --- a/src/Pages/SignUp.jsx +++ b/src/Pages/SignUp.jsx @@ -11,131 +11,75 @@ const SignUp = () => { lname: '', email: '', contact_number: '', - description: '' }); - const [errorMessage, setErrorMessage] = useState(''); // State to hold error messages + const [errorMessage, setErrorMessage] = useState(''); const handleChange = (e) => { setFormData({ ...formData, - [e.target.name]: e.target.value + [e.target.name]: e.target.value, }); }; const handleSubmit = async (e) => { e.preventDefault(); - setErrorMessage(''); // Clear previous error messages + setErrorMessage(''); try { const response = await fetch('https://monilmeh.pythonanywhere.com/auth/register', { method: 'POST', headers: { - 'Content-Type': 'application/json' + 'Content-Type': 'application/json', + 'Authorization': 'API-TOKEN', }, - body: JSON.stringify({ - sapid: formData.sapid, - password: formData.password, - fname: formData.fname, - lname: formData.lname, - email: formData.email, - contact_number: formData.contact_number - }) + body: JSON.stringify(formData), }); if (response.ok) { - navigate('/'); // Navigate to home page after successful sign-up + navigate('/'); } else { const errorData = await response.json(); + console.error('Error response from server:', errorData); setErrorMessage(errorData.message || 'Signup failed'); } } catch (error) { + console.error('Error during fetch:', error); setErrorMessage('An error occurred during sign-up. Please try again.'); } }; return ( -
-
-

NOTENG

+
+
+

NOTENG

SignUp
-
-
+
+
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
- + {['sapid', 'password', 'fname', 'lname', 'email', 'contact_number'].map((field) => ( +
+ + +
+ ))} +
+ {errorMessage && (
{errorMessage} diff --git a/src/Pages/Splash.jsx b/src/Pages/Splash.jsx index fecd878..64a6dfb 100644 --- a/src/Pages/Splash.jsx +++ b/src/Pages/Splash.jsx @@ -2,6 +2,7 @@ import React from 'react'; import { useNavigate } from 'react-router-dom'; import SplashImg1 from '../assets/splashimg-top.svg'; import SplashImg2 from '../assets/splashimg-bottom.svg'; + const Splash = () => { const navigate = useNavigate(); @@ -12,23 +13,24 @@ const Splash = () => { function signupClick() { navigate('/SignUp'); } + return (
-
-
+
+
Illustration
-
+

NOTENG

-
-
- - +
+
+ +
-
+
Illustration
diff --git a/src/index.js b/src/index.js index 03466f8..40a558f 100644 --- a/src/index.js +++ b/src/index.js @@ -1,11 +1,11 @@ import React from 'react'; -import ReactDOM from 'react-dom'; +import { createRoot } from 'react-dom/client'; // Import createRoot from react-dom/client import './index.css'; import App from './App'; import reportWebVitals from './reportWebVitals'; import "@fontsource/poppins"; // Defaults to weight 400 -const root = ReactDOM.createRoot(document.getElementById('root')); +const root = createRoot(document.getElementById('root')); root.render( From ba234180547ac3b17286e035eb8db6cddc70b443 Mon Sep 17 00:00:00 2001 From: MonilMehta Date: Thu, 13 Jun 2024 02:33:59 +0530 Subject: [PATCH 43/82] Integrated Discover Page Added API Integration For jobs and videolinks --- src/App.js | 3 +- src/Components/Discover/Discover.jsx | 105 +++++++++++++---------- src/Components/Discover/JobCard.jsx | 51 +++++++++++ src/Components/Discover/Jobs.jsx | 44 ++++++++++ src/Components/Discover/Notes.jsx | 0 src/Components/Discover/Posts.jsx | 0 src/Components/Discover/VideoCard.jsx | 42 +++++++++ src/Components/Discover/Videos.jsx | 44 ++++++++++ src/Components/Home/Sidebar.jsx | 49 +++++++---- src/Components/Profile/MyCard.jsx | 4 +- src/Pages/DiscoverPage.jsx | 25 +++--- src/Pages/PostJob.jsx | 2 +- src/Pages/ViewJob.jsx | 2 +- src/assets/briefcase-alt_svgrepo.com.png | Bin 0 -> 462 bytes src/assets/briefcase-alt_svgrepo.com.svg | 3 + src/assets/doc_svgrepo.com.svg | 3 + src/assets/post_svgrepo.com.svg | 3 + src/assets/video_svgrepo.com.svg | 3 + 18 files changed, 303 insertions(+), 80 deletions(-) create mode 100644 src/Components/Discover/JobCard.jsx create mode 100644 src/Components/Discover/Jobs.jsx create mode 100644 src/Components/Discover/Notes.jsx create mode 100644 src/Components/Discover/Posts.jsx create mode 100644 src/Components/Discover/VideoCard.jsx create mode 100644 src/Components/Discover/Videos.jsx create mode 100644 src/assets/briefcase-alt_svgrepo.com.png create mode 100644 src/assets/briefcase-alt_svgrepo.com.svg create mode 100644 src/assets/doc_svgrepo.com.svg create mode 100644 src/assets/post_svgrepo.com.svg create mode 100644 src/assets/video_svgrepo.com.svg diff --git a/src/App.js b/src/App.js index b57adac..1b87ad8 100644 --- a/src/App.js +++ b/src/App.js @@ -7,7 +7,7 @@ import ViewJob from './Pages/ViewJob'; import NewPost from './Pages/NewPostPage'; import UploadNewPosts from './Pages/UploadNewPosts'; import SignUp from './Pages/SignUp'; -import Profile from './Pages/Profile'; +import Profile from './Pages/profile'; import NewNotes from './Components/Notes/NewNotes'; import ViewNote from './Components/Notes/ViewNote'; import UploadVideo from './Pages/UploadVideo'; @@ -16,6 +16,7 @@ import Splash from './Pages/Splash'; import LoginPage from './Pages/LoginPage'; import PostDetails from './Pages/PostDetails'; + function App() { const [isLoggedIn, setIsLoggedIn] = useState(false); const [checkedLogin, setCheckedLogin] = useState(false); diff --git a/src/Components/Discover/Discover.jsx b/src/Components/Discover/Discover.jsx index df34fc1..623e62d 100644 --- a/src/Components/Discover/Discover.jsx +++ b/src/Components/Discover/Discover.jsx @@ -1,52 +1,67 @@ -import React from 'react' +import React, { useState } from 'react'; +import Jobs from './Jobs'; +import Notes from './Notes'; +import Videos from './Videos'; +import Posts from './Posts'; + +// Import SVG icons +import { ReactComponent as BriefcaseIcon } from '../../assets/briefcase-alt_svgrepo.com.svg'; +import { ReactComponent as NotesIcon } from '../../assets/doc_svgrepo.com.svg'; +import { ReactComponent as VideosIcon } from '../../assets/video_svgrepo.com.svg'; +import { ReactComponent as PostsIcon } from '../../assets/post_svgrepo.com.svg'; function Discover() { + const [selectedCategory, setSelectedCategory] = useState('Jobs'); + + const handleCategoryClick = (category) => { + setSelectedCategory(category); + }; + return ( -
- -
- -
-

Discover

-
-
-

All

-
-
-

Comps

-
-
-

IT

-
-
-

AIML

-
-
-

CSDS

-
-
-

AIML

-
-
-
-
-

Jobs

-
-
-

Posts

-
-
-

Notes

-
-
-

Videos

-
- -
-
+
+
+

Discover {selectedCategory}

+
+
+ + + +
+
+ +
+ {selectedCategory === 'Jobs' && } + {selectedCategory === 'Notes' && } + {selectedCategory === 'Videos' && } + {selectedCategory === 'Posts' && } +
- ) + ); } -export default Discover \ No newline at end of file +export default Discover; diff --git a/src/Components/Discover/JobCard.jsx b/src/Components/Discover/JobCard.jsx new file mode 100644 index 0000000..8a635e9 --- /dev/null +++ b/src/Components/Discover/JobCard.jsx @@ -0,0 +1,51 @@ +import React from 'react'; +import { useNavigate } from 'react-router-dom'; +import CalendarTodayIcon from '@mui/icons-material/CalendarToday'; +import AccessTimeOutlinedIcon from '@mui/icons-material/AccessTimeOutlined'; +import SmartphoneOutlinedIcon from '@mui/icons-material/SmartphoneOutlined'; +import DeleteIcon from '@mui/icons-material/Delete'; + +function JobCard({ job, onDelete }) { + const navigate = useNavigate(); + + const handleCardClick = () => { + navigate(`/ViewJob/${job.job_id}`); + }; + + const handleDeleteClick = (e) => { + e.stopPropagation(); // Prevent navigation when delete icon is clicked + onDelete(job.job_id); + }; + + return ( +
+
+
+ +
+

{job.company}

+

{job.job_title}

+

{job.description.substring(0, 60)}...

+
+
+ +

{job.duration_in_months} months

+
+
+ +

{job.subtype}

+
+
+ +

{job.mode}

+
+
+

{new Date(job.upload_time).toLocaleDateString()}

+
+
+
+
+ ); +} + +export default JobCard; diff --git a/src/Components/Discover/Jobs.jsx b/src/Components/Discover/Jobs.jsx new file mode 100644 index 0000000..7b72126 --- /dev/null +++ b/src/Components/Discover/Jobs.jsx @@ -0,0 +1,44 @@ +import React, { useEffect, useState } from 'react'; +import JobCard from './JobCard'; + +function Jobs() { + const [jobs, setJobs] = useState([]); + + useEffect(() => { + fetch('https://monilmeh.pythonanywhere.com/api/jobboard/', { + headers: { + 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4MjI5OTc4LCJpYXQiOjE3MTgyMDgzNzgsImp0aSI6IjM2ZTljNTE1MzgyNDRlNjNiMjlhN2IxZDk3NjkyOWM1IiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.taIPP2tzCiUFtYX8I20yWUaNfp8ESZvJa9auROp8-tc' // Replace with your actual access token + } + }) + .then(response => response.json()) + .then(data => setJobs(data)) + .catch(error => console.error('Error fetching jobs:', error)); + }, []); + + const handleDelete = (jobId) => { + fetch(`https://monilmeh.pythonanywhere.com/api/jobboard/${jobId}/`, { + method: 'DELETE', + headers: { + 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4MjI5OTc4LCJpYXQiOjE3MTgyMDgzNzgsImp0aSI6IjM2ZTljNTE1MzgyNDRlNjNiMjlhN2IxZDk3NjkyOWM1IiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.taIPP2tzCiUFtYX8I20yWUaNfp8ESZvJa9auROp8-tc' // Replace with your actual access token + } + }) + .then(response => { + if (response.ok) { + setJobs(jobs.filter(job => job.job_id !== jobId)); + } else { + console.error('Error deleting job'); + } + }) + .catch(error => console.error('Error deleting job:', error)); + }; + + return ( +
+ {jobs.map((job) => ( + + ))} +
+ ); +} + +export default Jobs; diff --git a/src/Components/Discover/Notes.jsx b/src/Components/Discover/Notes.jsx new file mode 100644 index 0000000..e69de29 diff --git a/src/Components/Discover/Posts.jsx b/src/Components/Discover/Posts.jsx new file mode 100644 index 0000000..e69de29 diff --git a/src/Components/Discover/VideoCard.jsx b/src/Components/Discover/VideoCard.jsx new file mode 100644 index 0000000..33c78f0 --- /dev/null +++ b/src/Components/Discover/VideoCard.jsx @@ -0,0 +1,42 @@ +import React from 'react'; +import { useNavigate } from 'react-router-dom'; +import DeleteIcon from '@mui/icons-material/Delete'; + +function VideoCard({ video, onDelete }) { + const navigate = useNavigate(); + + const handleCardClick = () => { + navigate(`/ViewVideo/${video.video_id}`); + }; + + const handleDeleteClick = (e) => { + e.stopPropagation(); // Prevent navigation when delete icon is clicked + onDelete(video.video_id); + }; + + return ( +
+
+
+ +
+

{video.subject}

+

{video.topics} - {video.sem} Semester

+
+ + +
+
+
+ ); +} + +export default VideoCard; diff --git a/src/Components/Discover/Videos.jsx b/src/Components/Discover/Videos.jsx new file mode 100644 index 0000000..a4ad345 --- /dev/null +++ b/src/Components/Discover/Videos.jsx @@ -0,0 +1,44 @@ +import React, { useEffect, useState } from 'react'; +import VideoCard from './VideoCard'; + +function Videos() { + const [videos, setVideos] = useState([]); + + useEffect(() => { + fetch('https://monilmeh.pythonanywhere.com/api/videolinks/', { + headers: { + 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4MjI5OTc4LCJpYXQiOjE3MTgyMDgzNzgsImp0aSI6IjM2ZTljNTE1MzgyNDRlNjNiMjlhN2IxZDk3NjkyOWM1IiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.taIPP2tzCiUFtYX8I20yWUaNfp8ESZvJa9auROp8-tc' // Replace with your actual access token + } + }) + .then(response => response.json()) + .then(data => setVideos(data)) + .catch(error => console.error('Error fetching videos:', error)); + }, []); + + const handleDelete = (videoId) => { + fetch(`https://monilmeh.pythonanywhere.com/api/videos/${videoId}/`, { + method: 'DELETE', + headers: { + 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4MjI5OTc4LCJpYXQiOjE3MTgyMDgzNzgsImp0aSI6IjM2ZTljNTE1MzgyNDRlNjNiMjlhN2IxZDk3NjkyOWM1IiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.taIPP2tzCiUFtYX8I20yWUaNfp8ESZvJa9auROp8-tc' // Replace with your actual access token + } + }) + .then(response => { + if (response.ok) { + setVideos(videos.filter(video => video.video_id !== videoId)); + } else { + console.error('Error deleting video'); + } + }) + .catch(error => console.error('Error deleting video:', error)); + }; + + return ( +
+ {videos.map((video) => ( + + ))} +
+ ); +} + +export default Videos; diff --git a/src/Components/Home/Sidebar.jsx b/src/Components/Home/Sidebar.jsx index 3777fcd..e8f90f0 100644 --- a/src/Components/Home/Sidebar.jsx +++ b/src/Components/Home/Sidebar.jsx @@ -1,16 +1,35 @@ -import React, { useState } from 'react'; +import React, { useState, useEffect } from 'react'; +import { useNavigate } from 'react-router-dom'; import PersonOutlineIcon from '@mui/icons-material/PersonOutline'; import SearchIcon from '@mui/icons-material/Search'; import HomeOutlinedIcon from '@mui/icons-material/HomeOutlined'; import AddIcon from '@mui/icons-material/Add'; -import { useNavigate } from 'react-router-dom'; -import Sidebarresponsive from './Sidebarresponsive'; import CloseIcon from '@mui/icons-material/Close'; import ExploreIcon from '@mui/icons-material/Explore'; -// import LoginPage from '../../Pages/LoginPage'; +import Sidebarresponsive from './Sidebarresponsive'; + const Sidebar = () => { const navigate = useNavigate(); const [isOpen, setIsOpen] = useState(false); + const [userData, setUserData] = useState({ fname: 'John', lname: 'Doe' }); + + useEffect(() => { + const fetchUserData = async () => { + try { + const response = await fetch('https://monilmeh.pythonanywhere.com/auth/user/', { + headers: { + 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4MjQ1NjQ2LCJpYXQiOjE3MTgyMjQwNDYsImp0aSI6IjhmNTI3MmJiNWZiZjRmMzU4MTM3ZWUwY2NmYWUyMjY0IiwidXNlcl9pZCI6IjYwMDA0MjIwMTUwIn0.u1D8H36PpAK6Nq3kEqye1tsRop9yWrqCt66rCijhtYg' // Replace with your actual access token + } + }); + const data = await response.json(); + setUserData({ fname: data.fname, lname: data.lname }); + } catch (error) { + console.error('Error fetching user data:', error); + } + }; + + fetchUserData(); + }, []); function handleHomeClick() { navigate('/'); @@ -36,7 +55,7 @@ const Sidebar = () => { setIsOpen(!isOpen); document.body.style.overflowY = isOpen ? 'auto' : 'hidden'; } - function Discover(){ + function Discover() { navigate('/DiscoverPage'); } @@ -48,27 +67,25 @@ const Sidebar = () => {
)}
-
- +
- +

NOTENG

-

Hey, John Doe

- +

Hey, {userData.fname} {userData.lname}

-
- +
+
- -
- + +
+
@@ -79,7 +96,7 @@ const Sidebar = () => {
- < ExploreIcon style={{ width: '30px', height: '30px', color: '#394DFD' }}/> +

Discover

diff --git a/src/Components/Profile/MyCard.jsx b/src/Components/Profile/MyCard.jsx index 90d0d01..231dc86 100644 --- a/src/Components/Profile/MyCard.jsx +++ b/src/Components/Profile/MyCard.jsx @@ -21,10 +21,10 @@ const cardData = [ function MyCard() { return ( -
+
-
+
{cardData.map((data, i) => { return (
diff --git a/src/Pages/DiscoverPage.jsx b/src/Pages/DiscoverPage.jsx index 8955feb..baf2b66 100644 --- a/src/Pages/DiscoverPage.jsx +++ b/src/Pages/DiscoverPage.jsx @@ -1,20 +1,17 @@ -import React from 'react' -import Sidebar from '../Components/Home/Sidebar' -import Discover from '../Components/Discover/Discover' -import Cards from '../Components/Discover/Cards' -import CardsCoulmn from '../Components/Discover/CardsCoulmn' +import React from 'react'; +import Sidebar from '../Components/Home/Sidebar'; +import CardsCoulmn from '../Components/Discover/CardsCoulmn'; +import Discover from '../Components/Discover/Discover'; + function DiscoverPage() { return (
- -
- - - -
- + +
+ +
- ) + ); } -export default DiscoverPage \ No newline at end of file +export default DiscoverPage; diff --git a/src/Pages/PostJob.jsx b/src/Pages/PostJob.jsx index 27cabb7..98c200a 100644 --- a/src/Pages/PostJob.jsx +++ b/src/Pages/PostJob.jsx @@ -71,7 +71,7 @@ const handleSubmit = (e) => { axios.post('https://monilmeh.pythonanywhere.com/api/jobboard/', formData, { headers: { 'Content-Type': 'application/json', - 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE3OTMyMjc2LCJpYXQiOjE3MTc5MTA2NzYsImp0aSI6IjFkNjI5MWViOGQzYzQwNjc5OTQyN2U4YWFiYjQ2ODIxIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.bK54XJ1-vnJjzGMhLdubn47FpZnxNgG1x4NZwnu1dsE' // Replace with your actual token + 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4MjI5OTc4LCJpYXQiOjE3MTgyMDgzNzgsImp0aSI6IjM2ZTljNTE1MzgyNDRlNjNiMjlhN2IxZDk3NjkyOWM1IiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.taIPP2tzCiUFtYX8I20yWUaNfp8ESZvJa9auROp8-tc' // Replace with your actual token } }) .then((response) => { diff --git a/src/Pages/ViewJob.jsx b/src/Pages/ViewJob.jsx index a6a368c..ffb8a1b 100644 --- a/src/Pages/ViewJob.jsx +++ b/src/Pages/ViewJob.jsx @@ -16,7 +16,7 @@ const ViewJob = () => { try { const response = await axios.get(`https://monilmeh.pythonanywhere.com/api/jobboard/${jobId}/`, { headers: { - 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE3ODQ4NDcyLCJpYXQiOjE3MTc4MjY4NzIsImp0aSI6IjZmNTI5ZGEzM2QwZjQzNDM4NzZhM2UyNzlhMTEyZjdmIiwidXNlcl9pZCI6IjYwMDA0MjIwMTgzIn0.1IRs_bt9_9KFtwpbwlhDd9YG-3bYFcKrU2H1Nw__HcA' + 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4MjI5OTc4LCJpYXQiOjE3MTgyMDgzNzgsImp0aSI6IjM2ZTljNTE1MzgyNDRlNjNiMjlhN2IxZDk3NjkyOWM1IiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.taIPP2tzCiUFtYX8I20yWUaNfp8ESZvJa9auROp8-tc' } }); setJobDetails(response.data); diff --git a/src/assets/briefcase-alt_svgrepo.com.png b/src/assets/briefcase-alt_svgrepo.com.png new file mode 100644 index 0000000000000000000000000000000000000000..1d1a4bc77c7306b957cd60357d772c23bb93bdd6 GIT binary patch literal 462 zcmV;<0WtoGP)0qF)X0c8T%AlZO00o+qAN@`-qN&N$<{iG*F z^7-z3w$B01oH83xDf$`EhbTj2a&>GR<7-VQMMT~L9A=_t1h7OH2F*%*)S@c{aN!wC zR4vz{g~y(IyF#}GmCJC*i9u5)?o*BV7*Qd5^d-<5vWz+6@Sy$@pAlEMMO=6Y4;En` zBqMr9Ty~-xpFycIh(jv+f_0Uaj?CByHkc3haI3*~_TW%Z8s4JoG8v|kp-Fn7em=)0 zFv!YsQ1*fw$2=y;%CMAn_u{;R^7@(sDO9OWrel__%|6jYc%NTI_oDrX&(WYQdvwki zXszE2R$*cj2@Tq(M!;%(gf{%B{EMK$&r{5x72-v9sr literal 0 HcmV?d00001 diff --git a/src/assets/briefcase-alt_svgrepo.com.svg b/src/assets/briefcase-alt_svgrepo.com.svg new file mode 100644 index 0000000..4f0f138 --- /dev/null +++ b/src/assets/briefcase-alt_svgrepo.com.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/doc_svgrepo.com.svg b/src/assets/doc_svgrepo.com.svg new file mode 100644 index 0000000..dd94577 --- /dev/null +++ b/src/assets/doc_svgrepo.com.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/post_svgrepo.com.svg b/src/assets/post_svgrepo.com.svg new file mode 100644 index 0000000..727a7e3 --- /dev/null +++ b/src/assets/post_svgrepo.com.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/video_svgrepo.com.svg b/src/assets/video_svgrepo.com.svg new file mode 100644 index 0000000..cf6a344 --- /dev/null +++ b/src/assets/video_svgrepo.com.svg @@ -0,0 +1,3 @@ + + + From 23ca77859487ea7b9be64375748234dee08541c9 Mon Sep 17 00:00:00 2001 From: Divya Gandhi Date: Thu, 13 Jun 2024 09:51:39 +0530 Subject: [PATCH 44/82] Changes --- src/Components/Discover/Cards.jsx | 144 +++++++++++++----------- src/Components/Discover/CardsCoulmn.jsx | 75 ------------ src/Components/Home/JobOpportunity.jsx | 4 +- src/Components/Home/LatestPosts.jsx | 90 +++++++-------- src/Components/Home/ShareNotes.jsx | 2 +- src/Components/NewPost/NewPost.jsx | 2 +- src/Components/Notes/UploadNotes.jsx | 7 +- src/Pages/DiscoverPage.jsx | 4 +- src/Pages/PostJob.jsx | 2 +- 9 files changed, 137 insertions(+), 193 deletions(-) delete mode 100644 src/Components/Discover/CardsCoulmn.jsx diff --git a/src/Components/Discover/Cards.jsx b/src/Components/Discover/Cards.jsx index 7473a76..7dd37df 100644 --- a/src/Components/Discover/Cards.jsx +++ b/src/Components/Discover/Cards.jsx @@ -1,75 +1,89 @@ -import React from 'react' +import React,{useState,useEffect} from 'react'; import CalendarTodayIcon from '@mui/icons-material/CalendarToday'; import AccessTimeOutlinedIcon from '@mui/icons-material/AccessTimeOutlined'; import SmartphoneOutlinedIcon from '@mui/icons-material/SmartphoneOutlined'; -import DeleteIcon from '@mui/icons-material/Delete'; -const cardData=[ - { - "heading1": 'Internship', - "heading2": 'Company Name', - "body": "We are seeking highly motivated and enthusiastic technology intern to join us", - "icon": , - "time": "3 Months", - "timeicon": , - 'timelimit': 'Part-time', - "mode": "Online", - "mobile": , - "date": "24th March,2024" - }, - { - "heading1": 'Internship', - "heading2": 'Company Name', - "body": "We are seeking highly motivated and enthusiastic technology intern to join us", - "icon": , - "time": "3 Months", - "timeicon": , - 'timelimit': 'Part-time', - "mode": "Online", - "mobile": , - "date": "24th March,2024" - }, - -] +import axios from 'axios'; + + + function Cards() { + const[cardData,setCardData]=useState([]); + useEffect(()=>{ + const fetchData=async()=>{ + try{ + + const response=await axios.get('https://monilmeh.pythonanywhere.com//api/jobboard/',{ + headers:{ + 'Authorization':'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4MjY5MzkxLCJpYXQiOjE3MTgyNDc3OTEsImp0aSI6ImI1NDU5NTYyOThhMDQwNGY4ZTkzN2JkYWM0MjRiNjYyIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.3Tap7Xk9toixMMOwbnkgegqcg4vBZ-3WJvLlyoST97g' + } + }); + const data=response.data.map((item)=>({ + heading1:item.company, + heading2:item.job_title, + heading3:item.subtype, + body:item.requirements, + body1:item.description, + contact:item.contact_no, + icon:, + time:item.duration_in_months, + timeicon:, + timelimit:item.location, + mobile:, + mode:item.mode, + date:item.upload_time, + + + })); + setCardData(data); + + + }catch(error){ + console.log('Error in fetching',error); + } + }; + fetchData(); + },[]); return (
- +

+ Explore Latest Job Opportunities +

-
- {cardData.map((data, i) => { - return ( -
-
-
- -
-

{data.heading1}

-

{data.heading2}

-

{data.body}

-
-
- {data.icon} -

{data.time}

-
-
- {data.timeicon} -

{data.timelimit}

-
-
- {data.mobile} -

{data.mode}

-
-
-

{data.date}

-
-
-
-
- ); - })} +
+ {cardData.map((data, i) => { + return
+
+

{data.heading1}

+

{data.heading2}

+

{data.heading3}

+

{data.body}

+

{data.body1}

+

{data.contact}

+
+
+ {data.icon } +

{data.time}

+
+
+ {data.timeicon} +

{data.timelimit}

+
+
+ {data.mobile} +

{data.mode}

+
+
+

{data.date}

+
+
+
+ +
+ })}
-
- ) + +
+ ); } -export default Cards \ No newline at end of file +export default Cards; diff --git a/src/Components/Discover/CardsCoulmn.jsx b/src/Components/Discover/CardsCoulmn.jsx deleted file mode 100644 index fd1cf47..0000000 --- a/src/Components/Discover/CardsCoulmn.jsx +++ /dev/null @@ -1,75 +0,0 @@ -import React from 'react' -import CalendarTodayIcon from '@mui/icons-material/CalendarToday'; -import AccessTimeOutlinedIcon from '@mui/icons-material/AccessTimeOutlined'; -import SmartphoneOutlinedIcon from '@mui/icons-material/SmartphoneOutlined'; -import DeleteIcon from '@mui/icons-material/Delete'; -const cardData=[ - { - "heading1": 'Internship', - "heading2": 'Company Name', - "body": "We are seeking highly motivated and enthusiastic technology intern to join us", - "icon": , - "time": "3 Months", - "timeicon": , - 'timelimit': 'Part-time', - "mode": "Online", - "mobile": , - "date": "24th March,2024" - }, - { - "heading1": 'Internship', - "heading2": 'Company Name', - "body": "We are seeking highly motivated and enthusiastic technology intern to join us", - "icon": , - "time": "3 Months", - "timeicon": , - 'timelimit': 'Part-time', - "mode": "Online", - "mobile": , - "date": "24th March,2024" - }, - -] -function CardsCoulmn() { - return ( -
- -
-
- {cardData.map((data, i) => { - return ( -
-
-
- -
-

{data.heading1}

-

{data.heading2}

-

{data.body}

-
-
- {data.icon} -

{data.time}

-
-
- {data.timeicon} -

{data.timelimit}

-
-
- {data.mobile} -

{data.mode}

-
-
-

{data.date}

-
-
-
-
- ); - })} -
-
- ) -} - -export default CardsCoulmn \ No newline at end of file diff --git a/src/Components/Home/JobOpportunity.jsx b/src/Components/Home/JobOpportunity.jsx index cfa8b9f..e36cef9 100644 --- a/src/Components/Home/JobOpportunity.jsx +++ b/src/Components/Home/JobOpportunity.jsx @@ -11,10 +11,10 @@ function JobOpportunity() { const response=await axios.get('https://monilmeh.pythonanywhere.com//api/jobboard/',{ headers:{ - 'Authorization':'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE3OTU1NzY5LCJpYXQiOjE3MTc5MzQxNjksImp0aSI6IjBmMzZhMzkzNGY2ZTQzNWZiY2JlNTEwM2VmYWQ4ZmFjIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0._fHqpLGaofy8ZdgRGkH1cshkWOK5gnMNTkKLWlhb9iY' + 'Authorization':'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4MjY5MzkxLCJpYXQiOjE3MTgyNDc3OTEsImp0aSI6ImI1NDU5NTYyOThhMDQwNGY4ZTkzN2JkYWM0MjRiNjYyIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.3Tap7Xk9toixMMOwbnkgegqcg4vBZ-3WJvLlyoST97g' } }); - const data=response.data.map((item)=>({ + const data=response.data.slice(0, 3).map((item)=>({ heading1:item.company, heading2:item.job_title, heading3:item.subtype, diff --git a/src/Components/Home/LatestPosts.jsx b/src/Components/Home/LatestPosts.jsx index 7f81cfc..34d43db 100644 --- a/src/Components/Home/LatestPosts.jsx +++ b/src/Components/Home/LatestPosts.jsx @@ -1,68 +1,70 @@ -import React,{useState,useEffect}from 'react' - +import React, { useState, useEffect } from 'react'; import FavoriteBorderOutlinedIcon from '@mui/icons-material/FavoriteBorderOutlined'; import axios from 'axios'; - function LatestPosts() { - const [cardData,setCardData]=useState([]); - useEffect(()=>{ - const fetchData=async()=>{ - try{ - const response=await axios.get('https://monilmeh.pythonanywhere.com//api/posts ',{ - headers:{ - 'Authorization':'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE3OTU1NzY5LCJpYXQiOjE3MTc5MzQxNjksImp0aSI6IjBmMzZhMzkzNGY2ZTQzNWZiY2JlNTEwM2VmYWQ4ZmFjIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0._fHqpLGaofy8ZdgRGkH1cshkWOK5gnMNTkKLWlhb9iY' + const [cardData, setCardData] = useState([]); + + useEffect(() => { + const fetchData = async () => { + try { + const response = await axios.get('https://monilmeh.pythonanywhere.com//api/posts', { + headers: { + 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4MjY5MzkxLCJpYXQiOjE3MTgyNDc3OTEsImp0aSI6ImI1NDU5NTYyOThhMDQwNGY4ZTkzN2JkYWM0MjRiNjYyIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.3Tap7Xk9toixMMOwbnkgegqcg4vBZ-3WJvLlyoST97g' } }); - const data=response.data.map((item)=>({ - heading1:item.title, - body:item.description, - icon: , - timelimit:item.likes, - category:item.subtype, - url:item.post_url, - deadlines:item.deadline, - + console.log('API Response:', response.data); // Log the API response + const data = response.data.map((item) => ({ + heading1: item.title, + body: item.description, + icon: , + timelimit: item.likes, + category: item.subtype, // Ensure this matches the API response + url: item.post_url, + deadlines: item.deadline, + image: item.image, })); + console.log('Mapped Data:', data); // Log the mapped data setCardData(data); - }catch(error){ - console.error('Error fetching data:',error); + } catch (error) { + console.error('Error fetching data:', error); } }; fetchData(); - },[]); + }, []); + return (
-

- Latest Posts +

+ Latest Posts

-
+
{cardData.map((data, i) => { - return
-
-

{data.heading1}

- - - -

{data.body}

-

{data.url}

-
-
- {data.icon } -

{data.timelimit}

+ return ( +
+
+

{data.heading1}

+
+ {data.heading1} +

{data.body}

+
+

{data.url}

+
+
+ {data.icon} +

{data.timelimit}

+
+

{data.category}

+

{data.deadlines}

-

{data.category}

-

{data.deadlines}

- -
+ ); })}
-
- ) + ); } -export default LatestPosts \ No newline at end of file +export default LatestPosts; diff --git a/src/Components/Home/ShareNotes.jsx b/src/Components/Home/ShareNotes.jsx index d7a9d12..062b867 100644 --- a/src/Components/Home/ShareNotes.jsx +++ b/src/Components/Home/ShareNotes.jsx @@ -9,7 +9,7 @@ function ShareNotes() { useEffect(() => { const fetchData = async () => { try { - const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE3OTU1NzY5LCJpYXQiOjE3MTc5MzQxNjksImp0aSI6IjBmMzZhMzkzNGY2ZTQzNWZiY2JlNTEwM2VmYWQ4ZmFjIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0._fHqpLGaofy8ZdgRGkH1cshkWOK5gnMNTkKLWlhb9iY'; // Replace with the actual token + const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4MjY5MzkxLCJpYXQiOjE3MTgyNDc3OTEsImp0aSI6ImI1NDU5NTYyOThhMDQwNGY4ZTkzN2JkYWM0MjRiNjYyIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.3Tap7Xk9toixMMOwbnkgegqcg4vBZ-3WJvLlyoST97g'; // Replace with the actual token const response = await axios.get('https://monilmeh.pythonanywhere.com/api/notes/', { headers: { 'Authorization': `Bearer ${token}` diff --git a/src/Components/NewPost/NewPost.jsx b/src/Components/NewPost/NewPost.jsx index 7c7f8b3..c089de5 100644 --- a/src/Components/NewPost/NewPost.jsx +++ b/src/Components/NewPost/NewPost.jsx @@ -48,7 +48,7 @@ function NewPost() { const response = await axios.post(endpoint, form, { headers: { 'Content-Type': 'multipart/form-data', - 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE3OTU1NzY5LCJpYXQiOjE3MTc5MzQxNjksImp0aSI6IjBmMzZhMzkzNGY2ZTQzNWZiY2JlNTEwM2VmYWQ4ZmFjIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0._fHqpLGaofy8ZdgRGkH1cshkWOK5gnMNTkKLWlhb9iY' + 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4MjY5MzkxLCJpYXQiOjE3MTgyNDc3OTEsImp0aSI6ImI1NDU5NTYyOThhMDQwNGY4ZTkzN2JkYWM0MjRiNjYyIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.3Tap7Xk9toixMMOwbnkgegqcg4vBZ-3WJvLlyoST97g' }, }); diff --git a/src/Components/Notes/UploadNotes.jsx b/src/Components/Notes/UploadNotes.jsx index 736be40..060c818 100644 --- a/src/Components/Notes/UploadNotes.jsx +++ b/src/Components/Notes/UploadNotes.jsx @@ -10,6 +10,7 @@ function UploadNotes() { notesDescription: '', rating: 4, document: null, + type:' ', user: '60004220207' // Assuming user ID is constant }); @@ -38,7 +39,7 @@ function UploadNotes() { form.append('subject', formData.subject); form.append('department', formData.department); form.append('note_description', formData.notesDescription); - // form.append('stars',formData.rating); + form.append('type',formData.type); form.append('document', formData.document); form.append('user', formData.user); @@ -46,7 +47,7 @@ function UploadNotes() { const response = await axios.post(endpoint, form, { headers: { 'Content-Type': 'multipart/form-data', - 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE3OTMyMjc2LCJpYXQiOjE3MTc5MTA2NzYsImp0aSI6IjFkNjI5MWViOGQzYzQwNjc5OTQyN2U4YWFiYjQ2ODIxIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.bK54XJ1-vnJjzGMhLdubn47FpZnxNgG1x4NZwnu1dsE' + 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4MjY5MzkxLCJpYXQiOjE3MTgyNDc3OTEsImp0aSI6ImI1NDU5NTYyOThhMDQwNGY4ZTkzN2JkYWM0MjRiNjYyIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.3Tap7Xk9toixMMOwbnkgegqcg4vBZ-3WJvLlyoST97g' }, }); @@ -58,7 +59,9 @@ function UploadNotes() { department: '', notesDescription: '', rating:4, + type:' ', document: null, + user: '60004220207' }); } else { diff --git a/src/Pages/DiscoverPage.jsx b/src/Pages/DiscoverPage.jsx index 8955feb..3421974 100644 --- a/src/Pages/DiscoverPage.jsx +++ b/src/Pages/DiscoverPage.jsx @@ -2,7 +2,7 @@ import React from 'react' import Sidebar from '../Components/Home/Sidebar' import Discover from '../Components/Discover/Discover' import Cards from '../Components/Discover/Cards' -import CardsCoulmn from '../Components/Discover/CardsCoulmn' + function DiscoverPage() { return (
@@ -10,7 +10,7 @@ function DiscoverPage() {
- +
diff --git a/src/Pages/PostJob.jsx b/src/Pages/PostJob.jsx index 7b8a1f1..f28a986 100644 --- a/src/Pages/PostJob.jsx +++ b/src/Pages/PostJob.jsx @@ -71,7 +71,7 @@ const handleSubmit = (e) => { axios.post('https://monilmeh.pythonanywhere.com/api/jobboard/', formData, { headers: { 'Content-Type': 'application/json', - 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE3OTMyMjc2LCJpYXQiOjE3MTc5MTA2NzYsImp0aSI6IjFkNjI5MWViOGQzYzQwNjc5OTQyN2U4YWFiYjQ2ODIxIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.bK54XJ1-vnJjzGMhLdubn47FpZnxNgG1x4NZwnu1dsE' // Replace with your actual token + 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4MjY5MzkxLCJpYXQiOjE3MTgyNDc3OTEsImp0aSI6ImI1NDU5NTYyOThhMDQwNGY4ZTkzN2JkYWM0MjRiNjYyIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.3Tap7Xk9toixMMOwbnkgegqcg4vBZ-3WJvLlyoST97g' } }) .then((response) => { From 1af5108e145be4431347a37b66c78b26fb25102d Mon Sep 17 00:00:00 2001 From: Divya Gandhi Date: Thu, 13 Jun 2024 12:22:37 +0530 Subject: [PATCH 45/82] Changes --- package-lock.json | 60 +++++++++++++++++++++ package.json | 2 + src/Components/Discover/Jobs.jsx | 4 +- src/Components/Discover/Notes.jsx | 72 +++++++++++++++++++++++++ src/Components/Discover/Posts.jsx | 67 +++++++++++++++++++++++ src/Components/Discover/Videos.jsx | 4 +- src/Components/Home/JobOpportunity.jsx | 4 +- src/Components/Home/LatestPosts.jsx | 12 ++--- src/Components/Home/ShareNotes.jsx | 6 +-- src/Components/Home/SharedResources.jsx | 37 ++++++++++++- src/Pages/DiscoverPage.jsx | 18 +++---- src/Pages/Home.jsx | 4 +- 12 files changed, 262 insertions(+), 28 deletions(-) diff --git a/package-lock.json b/package-lock.json index 460d007..e13ec8a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,6 +25,8 @@ "react-pdf": "^9.0.0", "react-router-dom": "^6.22.3", "react-scripts": "^5.0.1", + "react-slick": "^0.30.2", + "slick-carousel": "^1.8.1", "web-vitals": "^2.1.4" }, "devDependencies": { @@ -6358,6 +6360,11 @@ "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==" }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" + }, "node_modules/clean-css": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", @@ -7670,6 +7677,11 @@ "node": ">=10.13.0" } }, + "node_modules/enquire.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/enquire.js/-/enquire.js-2.1.6.tgz", + "integrity": "sha512-/KujNpO+PT63F7Hlpu4h3pE3TokKRHN26JYmQpPyjkRD/N57R7bPDNojMXdi7uveAKjYB7yQnartCxZnFWr0Xw==" + }, "node_modules/entities": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", @@ -12361,6 +12373,12 @@ "jiti": "bin/jiti.js" } }, + "node_modules/jquery": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", + "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==", + "peer": true + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -12459,6 +12477,14 @@ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" }, + "node_modules/json2mq": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", + "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", + "dependencies": { + "string-convert": "^0.2.0" + } + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -15541,6 +15567,22 @@ } } }, + "node_modules/react-slick": { + "version": "0.30.2", + "resolved": "https://registry.npmjs.org/react-slick/-/react-slick-0.30.2.tgz", + "integrity": "sha512-XvQJi7mRHuiU3b9irsqS9SGIgftIfdV5/tNcURTb5LdIokRA5kIIx3l4rlq2XYHfxcSntXapoRg/GxaVOM1yfg==", + "dependencies": { + "classnames": "^2.2.5", + "enquire.js": "^2.1.6", + "json2mq": "^0.2.0", + "lodash.debounce": "^4.0.8", + "resize-observer-polyfill": "^1.5.0" + }, + "peerDependencies": { + "react": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/react-transition-group": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", @@ -15758,6 +15800,11 @@ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -16422,6 +16469,14 @@ "node": ">=8" } }, + "node_modules/slick-carousel": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/slick-carousel/-/slick-carousel-1.8.1.tgz", + "integrity": "sha512-XB9Ftrf2EEKfzoQXt3Nitrt/IPbT+f1fgqBdoxO3W/+JYvtEOW6EgxnWfr9GH6nmULv7Y2tPmEX3koxThVmebA==", + "peerDependencies": { + "jquery": ">=1.8.0" + } + }, "node_modules/sockjs": { "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", @@ -16679,6 +16734,11 @@ "safe-buffer": "~5.2.0" } }, + "node_modules/string-convert": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", + "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==" + }, "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", diff --git a/package.json b/package.json index 1c7ac51..6ab64a8 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,8 @@ "react-pdf": "^9.0.0", "react-router-dom": "^6.22.3", "react-scripts": "^5.0.1", + "react-slick": "^0.30.2", + "slick-carousel": "^1.8.1", "web-vitals": "^2.1.4" }, "scripts": { diff --git a/src/Components/Discover/Jobs.jsx b/src/Components/Discover/Jobs.jsx index 7b72126..9a1e084 100644 --- a/src/Components/Discover/Jobs.jsx +++ b/src/Components/Discover/Jobs.jsx @@ -7,7 +7,7 @@ function Jobs() { useEffect(() => { fetch('https://monilmeh.pythonanywhere.com/api/jobboard/', { headers: { - 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4MjI5OTc4LCJpYXQiOjE3MTgyMDgzNzgsImp0aSI6IjM2ZTljNTE1MzgyNDRlNjNiMjlhN2IxZDk3NjkyOWM1IiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.taIPP2tzCiUFtYX8I20yWUaNfp8ESZvJa9auROp8-tc' // Replace with your actual access token + 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4MjY5MzkxLCJpYXQiOjE3MTgyNDc3OTEsImp0aSI6ImI1NDU5NTYyOThhMDQwNGY4ZTkzN2JkYWM0MjRiNjYyIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.3Tap7Xk9toixMMOwbnkgegqcg4vBZ-3WJvLlyoST97g' // Replace with your actual access token } }) .then(response => response.json()) @@ -33,7 +33,7 @@ function Jobs() { }; return ( -
+
{jobs.map((job) => ( ))} diff --git a/src/Components/Discover/Notes.jsx b/src/Components/Discover/Notes.jsx index e69de29..e3a1b97 100644 --- a/src/Components/Discover/Notes.jsx +++ b/src/Components/Discover/Notes.jsx @@ -0,0 +1,72 @@ +import React, { useEffect, useState } from 'react'; +import StarIcon from '@mui/icons-material/Star'; +import PictureAsPdfOutlinedIcon from '@mui/icons-material/PictureAsPdfOutlined'; +import axios from 'axios'; + + +function Notes() { + const [cardData, setCardData] = useState([]); + + useEffect(() => { + const fetchData = async () => { + try { + const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4MjY5MzkxLCJpYXQiOjE3MTgyNDc3OTEsImp0aSI6ImI1NDU5NTYyOThhMDQwNGY4ZTkzN2JkYWM0MjRiNjYyIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.3Tap7Xk9toixMMOwbnkgegqcg4vBZ-3WJvLlyoST97g'; // Replace with the actual token + const response = await axios.get('https://monilmeh.pythonanywhere.com/api/notes/', { + headers: { + 'Authorization': `Bearer ${token}` + } + }); + console.log(response.data); + const data = response.data.map((item) => ({ + heading1: item.note_title, + body: item.note_description, + icon: , + stars: item.average_rating, + department: item.department, + pdf: ( + + + + ), + })); + + setCardData(data); + } catch (error) { + console.error('Error fetching data:', error); + } + }; + + fetchData(); + }, []); + + return ( +
+ + +
+ {cardData.map((data, i) => ( +
+
+
+

{data.heading1}

+
+ {data.icon} +

{data.stars && data.stars.toFixed(1)}

+
+
+
+

{data.body}

+
+
+

{data.department}

+ {data.pdf} +
+
+
+ ))} +
+
+ ) +} + +export default Notes \ No newline at end of file diff --git a/src/Components/Discover/Posts.jsx b/src/Components/Discover/Posts.jsx index e69de29..614c24e 100644 --- a/src/Components/Discover/Posts.jsx +++ b/src/Components/Discover/Posts.jsx @@ -0,0 +1,67 @@ +import React, { useState, useEffect } from 'react'; +import FavoriteBorderOutlinedIcon from '@mui/icons-material/FavoriteBorderOutlined'; +import axios from 'axios'; + +function Posts() { + const [cardData, setCardData] = useState([]); + + useEffect(() => { + const fetchData = async () => { + try { + const response = await axios.get('https://monilmeh.pythonanywhere.com//api/posts', { + headers: { + 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4MjY5MzkxLCJpYXQiOjE3MTgyNDc3OTEsImp0aSI6ImI1NDU5NTYyOThhMDQwNGY4ZTkzN2JkYWM0MjRiNjYyIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.3Tap7Xk9toixMMOwbnkgegqcg4vBZ-3WJvLlyoST97g' + } + }); + console.log('API Response:', response.data); // Log the API response + const data = response.data.map((item) => ({ + heading1: item.title, + body: item.description, + icon: , + timelimit: item.likes, + category: item.subtype, + url: item.post_url, + deadlines: item.deadline, + image: item.image, + })); + console.log('Mapped Data:', data); + setCardData(data); + } catch (error) { + console.error('Error fetching data:', error); + } + }; + fetchData(); + }, []); + return ( +
+ + +
+ {cardData.map((data, i) => { + return ( +
+
+

{data.heading1}

+
+ {data.heading1} +

{data.body}

+
+

{data.url}

+
+
+ {data.icon} +

{data.timelimit}

+
+

{data.category}

+

{data.deadlines}

+
+
+
+ ); + })} +
+
+ ) +} + +export default Posts \ No newline at end of file diff --git a/src/Components/Discover/Videos.jsx b/src/Components/Discover/Videos.jsx index a4ad345..4db69b8 100644 --- a/src/Components/Discover/Videos.jsx +++ b/src/Components/Discover/Videos.jsx @@ -7,7 +7,7 @@ function Videos() { useEffect(() => { fetch('https://monilmeh.pythonanywhere.com/api/videolinks/', { headers: { - 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4MjI5OTc4LCJpYXQiOjE3MTgyMDgzNzgsImp0aSI6IjM2ZTljNTE1MzgyNDRlNjNiMjlhN2IxZDk3NjkyOWM1IiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.taIPP2tzCiUFtYX8I20yWUaNfp8ESZvJa9auROp8-tc' // Replace with your actual access token + 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4MjY5MzkxLCJpYXQiOjE3MTgyNDc3OTEsImp0aSI6ImI1NDU5NTYyOThhMDQwNGY4ZTkzN2JkYWM0MjRiNjYyIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.3Tap7Xk9toixMMOwbnkgegqcg4vBZ-3WJvLlyoST97g' // Replace with your actual access token } }) .then(response => response.json()) @@ -33,7 +33,7 @@ function Videos() { }; return ( -
+
{videos.map((video) => ( ))} diff --git a/src/Components/Home/JobOpportunity.jsx b/src/Components/Home/JobOpportunity.jsx index e36cef9..ea00871 100644 --- a/src/Components/Home/JobOpportunity.jsx +++ b/src/Components/Home/JobOpportunity.jsx @@ -45,10 +45,10 @@ function JobOpportunity() {

Explore Latest Job Opportunities

-
+
{cardData.map((data, i) => { - return
+ return

{data.heading1}

{data.heading2}

diff --git a/src/Components/Home/LatestPosts.jsx b/src/Components/Home/LatestPosts.jsx index 34d43db..46e2742 100644 --- a/src/Components/Home/LatestPosts.jsx +++ b/src/Components/Home/LatestPosts.jsx @@ -13,19 +13,19 @@ function LatestPosts() { 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4MjY5MzkxLCJpYXQiOjE3MTgyNDc3OTEsImp0aSI6ImI1NDU5NTYyOThhMDQwNGY4ZTkzN2JkYWM0MjRiNjYyIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.3Tap7Xk9toixMMOwbnkgegqcg4vBZ-3WJvLlyoST97g' } }); - console.log('API Response:', response.data); // Log the API response + // console.log('API Response:', response.data); const data = response.data.map((item) => ({ heading1: item.title, body: item.description, icon: , timelimit: item.likes, - category: item.subtype, // Ensure this matches the API response + category: item.subtype, url: item.post_url, deadlines: item.deadline, image: item.image, })); - console.log('Mapped Data:', data); // Log the mapped data - setCardData(data); + console.log('Mapped Data:', data); + setCardData(data.slice(0, 3)); } catch (error) { console.error('Error fetching data:', error); } @@ -38,11 +38,11 @@ function LatestPosts() {

Latest Posts

-
+
{cardData.map((data, i) => { return ( -
+

{data.heading1}

diff --git a/src/Components/Home/ShareNotes.jsx b/src/Components/Home/ShareNotes.jsx index 062b867..45db540 100644 --- a/src/Components/Home/ShareNotes.jsx +++ b/src/Components/Home/ShareNotes.jsx @@ -29,7 +29,7 @@ function ShareNotes() { ), })); - setCardData(data); + setCardData(data.slice(0, 5)); } catch (error) { console.error('Error fetching data:', error); } @@ -43,10 +43,10 @@ function ShareNotes() {

Share Notes

-
+
{cardData.map((data, i) => ( -
+

{data.heading1}

diff --git a/src/Components/Home/SharedResources.jsx b/src/Components/Home/SharedResources.jsx index 9f66127..06610e7 100644 --- a/src/Components/Home/SharedResources.jsx +++ b/src/Components/Home/SharedResources.jsx @@ -1,12 +1,45 @@ -import React from 'react' +import React,{useState,useEffect} from 'react' +import axios from 'axios'; function SharedResources() { + const [cardData, setCardData] = useState([]); + + useEffect(() => { + const fetchData = async () => { + try { + const response = await axios.get('https://monilmeh.pythonanywhere.com//api/videolinks/', { + headers: { + 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4MjY5MzkxLCJpYXQiOjE3MTgyNDc3OTEsImp0aSI6ImI1NDU5NTYyOThhMDQwNGY4ZTkzN2JkYWM0MjRiNjYyIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.3Tap7Xk9toixMMOwbnkgegqcg4vBZ-3WJvLlyoST97g' + } + }); + // console.log('API Response:', response.data); + const data = response.data.map((item) => ({ + heading1: item.subject, + heading2:item.topics, + semester:item.sem, + url:item.links, + user:'60004220207' + })); + console.log('Mapped Data:', data); + setCardData(data.slice(0, 3)); + } catch (error) { + console.error('Error fetching data:', error); + } + }; + fetchData(); + }, []); + return (

Explore Shared Video Resources

-
+
+
+
+

+
+
) } diff --git a/src/Pages/DiscoverPage.jsx b/src/Pages/DiscoverPage.jsx index 6ab9902..cbb9747 100644 --- a/src/Pages/DiscoverPage.jsx +++ b/src/Pages/DiscoverPage.jsx @@ -1,20 +1,20 @@ - import React from 'react' import Sidebar from '../Components/Home/Sidebar' import Discover from '../Components/Discover/Discover' -import Cards from '../Components/Discover/Cards' function DiscoverPage() { return (
- -
- - -
+ +
+ + + +
+
- ); + ) } -export default DiscoverPage; +export default DiscoverPage \ No newline at end of file diff --git a/src/Pages/Home.jsx b/src/Pages/Home.jsx index 58b9302..9c0d9da 100644 --- a/src/Pages/Home.jsx +++ b/src/Pages/Home.jsx @@ -3,7 +3,7 @@ import Sidebar from '../Components/Home/Sidebar' import JobOpportunity from '../Components/Home/JobOpportunity' import LatestPosts from '../Components/Home/LatestPosts' import ShareNotes from '../Components/Home/ShareNotes' -// import SharedResources from '../Components/Home/SharedResources' +import SharedResources from '../Components/Home/SharedResources' function Home() { return ( @@ -13,7 +13,7 @@ function Home() { - {/* */} +
) From 3873350adf2c8ce9a8fa109f772d0f96d7588b40 Mon Sep 17 00:00:00 2001 From: Divya Gandhi Date: Thu, 13 Jun 2024 12:27:28 +0530 Subject: [PATCH 46/82] Integrated home page,discover(posts,notes) --- src/Components/Discover/Jobs.jsx | 4 ++-- src/Components/Discover/Videos.jsx | 4 ++-- src/Components/Home/JobOpportunity.jsx | 5 +++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/Components/Discover/Jobs.jsx b/src/Components/Discover/Jobs.jsx index 9a1e084..7b72126 100644 --- a/src/Components/Discover/Jobs.jsx +++ b/src/Components/Discover/Jobs.jsx @@ -7,7 +7,7 @@ function Jobs() { useEffect(() => { fetch('https://monilmeh.pythonanywhere.com/api/jobboard/', { headers: { - 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4MjY5MzkxLCJpYXQiOjE3MTgyNDc3OTEsImp0aSI6ImI1NDU5NTYyOThhMDQwNGY4ZTkzN2JkYWM0MjRiNjYyIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.3Tap7Xk9toixMMOwbnkgegqcg4vBZ-3WJvLlyoST97g' // Replace with your actual access token + 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4MjI5OTc4LCJpYXQiOjE3MTgyMDgzNzgsImp0aSI6IjM2ZTljNTE1MzgyNDRlNjNiMjlhN2IxZDk3NjkyOWM1IiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.taIPP2tzCiUFtYX8I20yWUaNfp8ESZvJa9auROp8-tc' // Replace with your actual access token } }) .then(response => response.json()) @@ -33,7 +33,7 @@ function Jobs() { }; return ( -
+
{jobs.map((job) => ( ))} diff --git a/src/Components/Discover/Videos.jsx b/src/Components/Discover/Videos.jsx index 4db69b8..a4ad345 100644 --- a/src/Components/Discover/Videos.jsx +++ b/src/Components/Discover/Videos.jsx @@ -7,7 +7,7 @@ function Videos() { useEffect(() => { fetch('https://monilmeh.pythonanywhere.com/api/videolinks/', { headers: { - 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4MjY5MzkxLCJpYXQiOjE3MTgyNDc3OTEsImp0aSI6ImI1NDU5NTYyOThhMDQwNGY4ZTkzN2JkYWM0MjRiNjYyIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.3Tap7Xk9toixMMOwbnkgegqcg4vBZ-3WJvLlyoST97g' // Replace with your actual access token + 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4MjI5OTc4LCJpYXQiOjE3MTgyMDgzNzgsImp0aSI6IjM2ZTljNTE1MzgyNDRlNjNiMjlhN2IxZDk3NjkyOWM1IiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.taIPP2tzCiUFtYX8I20yWUaNfp8ESZvJa9auROp8-tc' // Replace with your actual access token } }) .then(response => response.json()) @@ -33,7 +33,7 @@ function Videos() { }; return ( -
+
{videos.map((video) => ( ))} diff --git a/src/Components/Home/JobOpportunity.jsx b/src/Components/Home/JobOpportunity.jsx index ea00871..385be60 100644 --- a/src/Components/Home/JobOpportunity.jsx +++ b/src/Components/Home/JobOpportunity.jsx @@ -53,8 +53,9 @@ function JobOpportunity() {

{data.heading1}

{data.heading2}

{data.heading3}

-

{data.body}

-

{data.body1}

+ {/*

{data.body.substring(0, 100)}

*/} + +

{data.body1.substring(0,60)}

{data.contact}

From dec2661477d7346888cd821a8c6e70556182b2c2 Mon Sep 17 00:00:00 2001 From: Divya Gandhi Date: Thu, 13 Jun 2024 13:51:39 +0530 Subject: [PATCH 47/82] Integrated videos --- src/Components/Discover/Jobs.jsx | 2 +- src/Components/Discover/Videos.jsx | 2 +- src/Components/Home/JobOpportunity.jsx | 6 +++-- src/Components/Home/LatestPosts.jsx | 3 +++ src/Components/Home/ShareNotes.jsx | 9 ++++++- src/Components/Home/SharedResources.jsx | 32 +++++++++++++++++++------ src/Pages/DiscoverPage.jsx | 2 +- src/Pages/UploadVideo.jsx | 2 +- 8 files changed, 44 insertions(+), 14 deletions(-) diff --git a/src/Components/Discover/Jobs.jsx b/src/Components/Discover/Jobs.jsx index 7b72126..3e5c3d7 100644 --- a/src/Components/Discover/Jobs.jsx +++ b/src/Components/Discover/Jobs.jsx @@ -7,7 +7,7 @@ function Jobs() { useEffect(() => { fetch('https://monilmeh.pythonanywhere.com/api/jobboard/', { headers: { - 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4MjI5OTc4LCJpYXQiOjE3MTgyMDgzNzgsImp0aSI6IjM2ZTljNTE1MzgyNDRlNjNiMjlhN2IxZDk3NjkyOWM1IiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.taIPP2tzCiUFtYX8I20yWUaNfp8ESZvJa9auROp8-tc' // Replace with your actual access token + 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4MjY5MzkxLCJpYXQiOjE3MTgyNDc3OTEsImp0aSI6ImI1NDU5NTYyOThhMDQwNGY4ZTkzN2JkYWM0MjRiNjYyIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.3Tap7Xk9toixMMOwbnkgegqcg4vBZ-3WJvLlyoST97g' } }) .then(response => response.json()) diff --git a/src/Components/Discover/Videos.jsx b/src/Components/Discover/Videos.jsx index a4ad345..67af848 100644 --- a/src/Components/Discover/Videos.jsx +++ b/src/Components/Discover/Videos.jsx @@ -7,7 +7,7 @@ function Videos() { useEffect(() => { fetch('https://monilmeh.pythonanywhere.com/api/videolinks/', { headers: { - 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4MjI5OTc4LCJpYXQiOjE3MTgyMDgzNzgsImp0aSI6IjM2ZTljNTE1MzgyNDRlNjNiMjlhN2IxZDk3NjkyOWM1IiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.taIPP2tzCiUFtYX8I20yWUaNfp8ESZvJa9auROp8-tc' // Replace with your actual access token + 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4MjY5MzkxLCJpYXQiOjE3MTgyNDc3OTEsImp0aSI6ImI1NDU5NTYyOThhMDQwNGY4ZTkzN2JkYWM0MjRiNjYyIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.3Tap7Xk9toixMMOwbnkgegqcg4vBZ-3WJvLlyoST97g' } }) .then(response => response.json()) diff --git a/src/Components/Home/JobOpportunity.jsx b/src/Components/Home/JobOpportunity.jsx index 385be60..8d1ed22 100644 --- a/src/Components/Home/JobOpportunity.jsx +++ b/src/Components/Home/JobOpportunity.jsx @@ -46,7 +46,7 @@ function JobOpportunity() { Explore Latest Job Opportunities

-
+
{cardData.map((data, i) => { return
@@ -79,7 +79,9 @@ function JobOpportunity() {
})}
- +
+ See More +
) } diff --git a/src/Components/Home/LatestPosts.jsx b/src/Components/Home/LatestPosts.jsx index 46e2742..7a0ce8e 100644 --- a/src/Components/Home/LatestPosts.jsx +++ b/src/Components/Home/LatestPosts.jsx @@ -63,6 +63,9 @@ function LatestPosts() { ); })}
+
+ See More +
); } diff --git a/src/Components/Home/ShareNotes.jsx b/src/Components/Home/ShareNotes.jsx index 45db540..cd7d579 100644 --- a/src/Components/Home/ShareNotes.jsx +++ b/src/Components/Home/ShareNotes.jsx @@ -44,7 +44,7 @@ function ShareNotes() { Share Notes

-
+
{cardData.map((data, i) => (
@@ -62,9 +62,16 @@ function ShareNotes() {

{data.department}

{data.pdf}
+
+
+ ))} + +
+
); diff --git a/src/Components/Home/SharedResources.jsx b/src/Components/Home/SharedResources.jsx index 06610e7..62b281a 100644 --- a/src/Components/Home/SharedResources.jsx +++ b/src/Components/Home/SharedResources.jsx @@ -12,7 +12,7 @@ function SharedResources() { 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4MjY5MzkxLCJpYXQiOjE3MTgyNDc3OTEsImp0aSI6ImI1NDU5NTYyOThhMDQwNGY4ZTkzN2JkYWM0MjRiNjYyIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.3Tap7Xk9toixMMOwbnkgegqcg4vBZ-3WJvLlyoST97g' } }); - // console.log('API Response:', response.data); + console.log('API Response:', response.data); const data = response.data.map((item) => ({ heading1: item.subject, heading2:item.topics, @@ -31,14 +31,32 @@ function SharedResources() { return (
-

- Explore Shared Video Resources +

+ Explore Latest Job Opportunities

-
-
-

-
+
+ {cardData.map((data, i) => { + return
+
+

{data.heading1}

+
+

{data.heading2}

+

Semester:{data.semester}

+
+
+
+ + + +
+ +
+ })} +
+
) diff --git a/src/Pages/DiscoverPage.jsx b/src/Pages/DiscoverPage.jsx index cbb9747..37f2831 100644 --- a/src/Pages/DiscoverPage.jsx +++ b/src/Pages/DiscoverPage.jsx @@ -7,7 +7,7 @@ function DiscoverPage() { return (
-
+
diff --git a/src/Pages/UploadVideo.jsx b/src/Pages/UploadVideo.jsx index c8ec120..949adec 100644 --- a/src/Pages/UploadVideo.jsx +++ b/src/Pages/UploadVideo.jsx @@ -30,7 +30,7 @@ const ViewNote = () => { const response = await axios.post('https://monilmeh.pythonanywhere.com/api/videolinks/', formData, { headers: { 'Content-Type': 'application/json', - 'Authorization': 'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE3NzA5NTEwLCJpYXQiOjE3MTc2ODc5MTAsImp0aSI6IjdhZmY0OWY4OGU2ZTQ4NzNhY2ExNDc5MGFmM2VlMzU3IiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.2qEts4v2MSFYoVfC1Ge2Tv5xJyhI8cMB5UoesbsDz-0' + 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4MjY5MzkxLCJpYXQiOjE3MTgyNDc3OTEsImp0aSI6ImI1NDU5NTYyOThhMDQwNGY4ZTkzN2JkYWM0MjRiNjYyIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.3Tap7Xk9toixMMOwbnkgegqcg4vBZ-3WJvLlyoST97g' } }); console.log(response.data); From 24b55b5e11785ee244c8c0239a0e29acf4cea551 Mon Sep 17 00:00:00 2001 From: MonilMehta Date: Thu, 13 Jun 2024 14:06:51 +0530 Subject: [PATCH 48/82] Integrated discover page and profile page Added logout option to the sidebar and integrated profile page --- src/Components/Discover/Jobs.jsx | 10 +- src/Components/Discover/Videos.jsx | 7 +- src/Components/Home/JobOpportunity.jsx | 7 +- src/Components/Home/LatestPosts.jsx | 6 +- src/Components/Home/ShareNotes.jsx | 5 +- src/Components/Home/Sidebar.jsx | 38 +++- src/Components/NewPost/NewPost.jsx | 4 +- src/Components/Notes/UploadNotes.jsx | 4 +- src/Components/Notes/ViewNote.jsx | 5 +- src/Components/Profile/DescriptionProfile.jsx | 210 +++++++++++++----- src/Components/Profile/JobCard.jsx | 51 +++++ src/Components/Profile/MyCard.jsx | 90 +++----- src/Components/Profile/MyJobs.jsx | 100 ++------- src/Components/Profile/jobs.css | 40 ++++ src/Pages/LoginPage.jsx | 6 +- src/Pages/PostJob.jsx | 3 +- src/Pages/UploadVideo.jsx | 5 +- src/Pages/ViewJob.jsx | 10 +- src/Pages/profile.jsx | 105 ++++++--- 19 files changed, 453 insertions(+), 253 deletions(-) create mode 100644 src/Components/Profile/JobCard.jsx create mode 100644 src/Components/Profile/jobs.css diff --git a/src/Components/Discover/Jobs.jsx b/src/Components/Discover/Jobs.jsx index 3e5c3d7..d187abd 100644 --- a/src/Components/Discover/Jobs.jsx +++ b/src/Components/Discover/Jobs.jsx @@ -3,23 +3,24 @@ import JobCard from './JobCard'; function Jobs() { const [jobs, setJobs] = useState([]); - + const token = localStorage.getItem('token'); + console.log(token); useEffect(() => { fetch('https://monilmeh.pythonanywhere.com/api/jobboard/', { headers: { - 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4MjY5MzkxLCJpYXQiOjE3MTgyNDc3OTEsImp0aSI6ImI1NDU5NTYyOThhMDQwNGY4ZTkzN2JkYWM0MjRiNjYyIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.3Tap7Xk9toixMMOwbnkgegqcg4vBZ-3WJvLlyoST97g' + 'Authorization': `Bearer ${token}` // Replace with your actual access token } }) .then(response => response.json()) .then(data => setJobs(data)) .catch(error => console.error('Error fetching jobs:', error)); - }, []); + }, [token]); const handleDelete = (jobId) => { fetch(`https://monilmeh.pythonanywhere.com/api/jobboard/${jobId}/`, { method: 'DELETE', headers: { - 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4MjI5OTc4LCJpYXQiOjE3MTgyMDgzNzgsImp0aSI6IjM2ZTljNTE1MzgyNDRlNjNiMjlhN2IxZDk3NjkyOWM1IiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.taIPP2tzCiUFtYX8I20yWUaNfp8ESZvJa9auROp8-tc' // Replace with your actual access token + 'Authorization': `Bearer ${token}` // Replace with your actual access token } }) .then(response => { @@ -31,6 +32,7 @@ function Jobs() { }) .catch(error => console.error('Error deleting job:', error)); }; + console.log(jobs); return (
diff --git a/src/Components/Discover/Videos.jsx b/src/Components/Discover/Videos.jsx index 67af848..1a2fb19 100644 --- a/src/Components/Discover/Videos.jsx +++ b/src/Components/Discover/Videos.jsx @@ -3,23 +3,24 @@ import VideoCard from './VideoCard'; function Videos() { const [videos, setVideos] = useState([]); + const token = localStorage.getItem('token'); useEffect(() => { fetch('https://monilmeh.pythonanywhere.com/api/videolinks/', { headers: { - 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4MjY5MzkxLCJpYXQiOjE3MTgyNDc3OTEsImp0aSI6ImI1NDU5NTYyOThhMDQwNGY4ZTkzN2JkYWM0MjRiNjYyIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.3Tap7Xk9toixMMOwbnkgegqcg4vBZ-3WJvLlyoST97g' + 'Authorization': `Bearer ${token}` } }) .then(response => response.json()) .then(data => setVideos(data)) .catch(error => console.error('Error fetching videos:', error)); - }, []); + }, [token]); const handleDelete = (videoId) => { fetch(`https://monilmeh.pythonanywhere.com/api/videos/${videoId}/`, { method: 'DELETE', headers: { - 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4MjI5OTc4LCJpYXQiOjE3MTgyMDgzNzgsImp0aSI6IjM2ZTljNTE1MzgyNDRlNjNiMjlhN2IxZDk3NjkyOWM1IiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.taIPP2tzCiUFtYX8I20yWUaNfp8ESZvJa9auROp8-tc' // Replace with your actual access token + 'Authorization': `Bearer ${token}` } }) .then(response => { diff --git a/src/Components/Home/JobOpportunity.jsx b/src/Components/Home/JobOpportunity.jsx index 8d1ed22..1fcbe2b 100644 --- a/src/Components/Home/JobOpportunity.jsx +++ b/src/Components/Home/JobOpportunity.jsx @@ -5,13 +5,14 @@ import SmartphoneOutlinedIcon from '@mui/icons-material/SmartphoneOutlined'; import axios from 'axios'; function JobOpportunity() { const[cardData,setCardData]=useState([]); + const token=localStorage.getItem('token'); useEffect(()=>{ const fetchData=async()=>{ try{ const response=await axios.get('https://monilmeh.pythonanywhere.com//api/jobboard/',{ headers:{ - 'Authorization':'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4MjY5MzkxLCJpYXQiOjE3MTgyNDc3OTEsImp0aSI6ImI1NDU5NTYyOThhMDQwNGY4ZTkzN2JkYWM0MjRiNjYyIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.3Tap7Xk9toixMMOwbnkgegqcg4vBZ-3WJvLlyoST97g' + 'Authorization':`Bearer ${token}` } }); const data=response.data.slice(0, 3).map((item)=>({ @@ -39,7 +40,7 @@ function JobOpportunity() { } }; fetchData(); - },[]); + },[token]); return (

@@ -48,7 +49,7 @@ function JobOpportunity() {

{cardData.map((data, i) => { - return
+ return

{data.heading1}

{data.heading2}

diff --git a/src/Components/Home/LatestPosts.jsx b/src/Components/Home/LatestPosts.jsx index 7a0ce8e..1e674aa 100644 --- a/src/Components/Home/LatestPosts.jsx +++ b/src/Components/Home/LatestPosts.jsx @@ -4,13 +4,13 @@ import axios from 'axios'; function LatestPosts() { const [cardData, setCardData] = useState([]); - + const token = localStorage.getItem('token'); useEffect(() => { const fetchData = async () => { try { const response = await axios.get('https://monilmeh.pythonanywhere.com//api/posts', { headers: { - 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4MjY5MzkxLCJpYXQiOjE3MTgyNDc3OTEsImp0aSI6ImI1NDU5NTYyOThhMDQwNGY4ZTkzN2JkYWM0MjRiNjYyIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.3Tap7Xk9toixMMOwbnkgegqcg4vBZ-3WJvLlyoST97g' + 'Authorization': `Bearer ${token}` } }); // console.log('API Response:', response.data); @@ -31,7 +31,7 @@ function LatestPosts() { } }; fetchData(); - }, []); + }, [token]); return (
diff --git a/src/Components/Home/ShareNotes.jsx b/src/Components/Home/ShareNotes.jsx index cd7d579..99543d0 100644 --- a/src/Components/Home/ShareNotes.jsx +++ b/src/Components/Home/ShareNotes.jsx @@ -5,11 +5,10 @@ import axios from 'axios'; function ShareNotes() { const [cardData, setCardData] = useState([]); - + const token = localStorage.getItem('token'); useEffect(() => { const fetchData = async () => { try { - const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4MjY5MzkxLCJpYXQiOjE3MTgyNDc3OTEsImp0aSI6ImI1NDU5NTYyOThhMDQwNGY4ZTkzN2JkYWM0MjRiNjYyIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.3Tap7Xk9toixMMOwbnkgegqcg4vBZ-3WJvLlyoST97g'; // Replace with the actual token const response = await axios.get('https://monilmeh.pythonanywhere.com/api/notes/', { headers: { 'Authorization': `Bearer ${token}` @@ -36,7 +35,7 @@ function ShareNotes() { }; fetchData(); - }, []); + }, [token]); return (
diff --git a/src/Components/Home/Sidebar.jsx b/src/Components/Home/Sidebar.jsx index e8f90f0..8e99c53 100644 --- a/src/Components/Home/Sidebar.jsx +++ b/src/Components/Home/Sidebar.jsx @@ -7,18 +7,21 @@ import AddIcon from '@mui/icons-material/Add'; import CloseIcon from '@mui/icons-material/Close'; import ExploreIcon from '@mui/icons-material/Explore'; import Sidebarresponsive from './Sidebarresponsive'; +import LogoutIcon from '@mui/icons-material/Logout'; + const Sidebar = () => { const navigate = useNavigate(); const [isOpen, setIsOpen] = useState(false); const [userData, setUserData] = useState({ fname: 'John', lname: 'Doe' }); + const token = localStorage.getItem('token'); useEffect(() => { const fetchUserData = async () => { try { const response = await fetch('https://monilmeh.pythonanywhere.com/auth/user/', { headers: { - 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4MjQ1NjQ2LCJpYXQiOjE3MTgyMjQwNDYsImp0aSI6IjhmNTI3MmJiNWZiZjRmMzU4MTM3ZWUwY2NmYWUyMjY0IiwidXNlcl9pZCI6IjYwMDA0MjIwMTUwIn0.u1D8H36PpAK6Nq3kEqye1tsRop9yWrqCt66rCijhtYg' // Replace with your actual access token + 'Authorization': `Bearer ${token}` } }); const data = await response.json(); @@ -29,7 +32,7 @@ const Sidebar = () => { }; fetchUserData(); - }, []); + }, [token]); function handleHomeClick() { navigate('/'); @@ -38,12 +41,15 @@ const Sidebar = () => { function createJob() { navigate('/createjob'); } + function createPost() { navigate('/createpost'); } + function createNote() { navigate('/createnote'); } + function uploadVideo() { navigate('/uploadvideo'); } @@ -51,22 +57,30 @@ const Sidebar = () => { function loginNavigate() { navigate('/profile'); } + function toggleSidebar() { setIsOpen(!isOpen); document.body.style.overflowY = isOpen ? 'auto' : 'hidden'; } + function Discover() { navigate('/DiscoverPage'); } + function handleLogout() { + localStorage.removeItem('token'); + localStorage.setItem('isLoggedIn', 'false'); + navigate('/splash'); + } + return ( -
+
{!isOpen && ( -
+
)} -
+
@@ -82,9 +96,9 @@ const Sidebar = () => {
-
+
-
+
@@ -126,8 +140,18 @@ const Sidebar = () => {

Share Video

+
+ + +
+ +
+
+
diff --git a/src/Components/NewPost/NewPost.jsx b/src/Components/NewPost/NewPost.jsx index c089de5..421b056 100644 --- a/src/Components/NewPost/NewPost.jsx +++ b/src/Components/NewPost/NewPost.jsx @@ -14,6 +14,8 @@ function NewPost() { user: '60004220207' // Assuming user ID is static for this example }); + const token = localStorage.getItem('token'); + const handleChange = (e) => { const { name, value } = e.target; setFormData({ @@ -48,7 +50,7 @@ function NewPost() { const response = await axios.post(endpoint, form, { headers: { 'Content-Type': 'multipart/form-data', - 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4MjY5MzkxLCJpYXQiOjE3MTgyNDc3OTEsImp0aSI6ImI1NDU5NTYyOThhMDQwNGY4ZTkzN2JkYWM0MjRiNjYyIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.3Tap7Xk9toixMMOwbnkgegqcg4vBZ-3WJvLlyoST97g' + 'Authorization': `Bearer ${token}` }, }); diff --git a/src/Components/Notes/UploadNotes.jsx b/src/Components/Notes/UploadNotes.jsx index 060c818..41362c7 100644 --- a/src/Components/Notes/UploadNotes.jsx +++ b/src/Components/Notes/UploadNotes.jsx @@ -14,6 +14,8 @@ function UploadNotes() { user: '60004220207' // Assuming user ID is constant }); + const token = localStorage.getItem('token'); + const handleChange = (e) => { const { name, value } = e.target; setFormData({ @@ -47,7 +49,7 @@ function UploadNotes() { const response = await axios.post(endpoint, form, { headers: { 'Content-Type': 'multipart/form-data', - 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4MjY5MzkxLCJpYXQiOjE3MTgyNDc3OTEsImp0aSI6ImI1NDU5NTYyOThhMDQwNGY4ZTkzN2JkYWM0MjRiNjYyIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.3Tap7Xk9toixMMOwbnkgegqcg4vBZ-3WJvLlyoST97g' + 'Authorization': `Bearer ${token}` }, }); diff --git a/src/Components/Notes/ViewNote.jsx b/src/Components/Notes/ViewNote.jsx index 541523f..679a47d 100644 --- a/src/Components/Notes/ViewNote.jsx +++ b/src/Components/Notes/ViewNote.jsx @@ -10,13 +10,14 @@ const ViewNote = () => { const navigate = useNavigate(); const { noteId } = useParams(); const [noteDetails, setNoteDetails] = useState(null); + const token = localStorage.getItem('token'); useEffect(() => { const fetchNoteDetails = async () => { try { const response = await axios.get(`https://monilmeh.pythonanywhere.com/api/notes/${noteId}/`, { headers: { - 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE3ODQ4NDcyLCJpYXQiOjE3MTc4MjY4NzIsImp0aSI6IjZmNTI5ZGEzM2QwZjQzNDM4NzZhM2UyNzlhMTEyZjdmIiwidXNlcl9pZCI6IjYwMDA0MjIwMTgzIn0.1IRs_bt9_9KFtwpbwlhDd9YG-3bYFcKrU2H1Nw__HcA' + 'Authorization': `Bearer ${token}` } }); setNoteDetails(response.data); @@ -29,7 +30,7 @@ const ViewNote = () => { if (noteId) { fetchNoteDetails(); } - }, [noteId]); + }, [noteId,token]); const handleGoBack = (event) => { event.preventDefault(); diff --git a/src/Components/Profile/DescriptionProfile.jsx b/src/Components/Profile/DescriptionProfile.jsx index b87be6c..cdea1b9 100644 --- a/src/Components/Profile/DescriptionProfile.jsx +++ b/src/Components/Profile/DescriptionProfile.jsx @@ -1,67 +1,177 @@ -import React from 'react'; +import React, { useState } from 'react'; +import { useNavigate } from 'react-router-dom'; import WorkOutlineOutlinedIcon from '@mui/icons-material/WorkOutlineOutlined'; import PhotoSizeSelectActualOutlinedIcon from '@mui/icons-material/PhotoSizeSelectActualOutlined'; import DescriptionOutlinedIcon from '@mui/icons-material/DescriptionOutlined'; import VideocamOutlinedIcon from '@mui/icons-material/VideocamOutlined'; +import '../../styles/profile.css'; -function DescriptionProfile(){ - return( -
-
-
+function DescriptionProfile({ jobCount, postCount, noteCount, videoCount, userData, updateUser }) { + const navigate = useNavigate(); + const [isModalOpen, setIsModalOpen] = useState(false); + const [formData, setFormData] = useState({ + fname: userData.fname, + lname: userData.lname, + email: userData.email, + phone: userData.phone + }); + + const handleInputChange = (e) => { + const { name, value } = e.target; + setFormData((prevData) => ({ ...prevData, [name]: value })); + }; + + const handleEditProfile = async (e) => { + e.preventDefault(); + try { + const response = await fetch('https://monilmeh.pythonanywhere.com/auth/user/', { + method: 'PATCH', + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${localStorage.getItem('token')}` + }, + body: JSON.stringify(formData) + }); + const data = await response.json(); + updateUser(data); + setIsModalOpen(false); + } catch (error) { + console.error('Error updating profile:', error); + } + }; + + return ( + <> +
+
+
-
-
- - - -
-
12
-
Jobs Posted
-
+
+
+ + +
-
-
- - - -
-
09
-
Posts Created
-
+
{jobCount}
+
Jobs Posted
+
+
+
+
+ + +
-
-
- - - -
-
34
-
Notes Shared
-
+
{postCount}
+
Posts Created
+
+
+
+
+ + +
-
-
- - - -
-
23
-
Videos shared
+
{noteCount}
+
Notes Shared
+
+
+
+
+ + +
+
{videoCount}
+
Videos shared
+
- -
-
-
- - -
+
+
+
+ +
+
+
+ + {isModalOpen && ( +
+
+

Edit Profile

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
- - ); + )} + + ); } export default DescriptionProfile; diff --git a/src/Components/Profile/JobCard.jsx b/src/Components/Profile/JobCard.jsx new file mode 100644 index 0000000..b1ee148 --- /dev/null +++ b/src/Components/Profile/JobCard.jsx @@ -0,0 +1,51 @@ +import React from 'react'; +import { useNavigate } from 'react-router-dom'; +import CalendarTodayIcon from '@mui/icons-material/CalendarToday'; +import AccessTimeOutlinedIcon from '@mui/icons-material/AccessTimeOutlined'; +import SmartphoneOutlinedIcon from '@mui/icons-material/SmartphoneOutlined'; +import DeleteIcon from '@mui/icons-material/Delete'; + +function JobCard({ job, onDelete }) { + const navigate = useNavigate(); + + const handleCardClick = () => { + navigate(`/ViewJob/${job.job_id}`); + }; + + const handleDeleteClick = (e) => { + e.stopPropagation(); // Prevent navigation when delete icon is clicked + onDelete(job.job_id); + }; + + return ( +
+
+
+ +
+

{job.company}

+

{job.job_title}

+

{job.description.substring(0, 60)}...

+
+
+ +

{job.duration_in_months} months

+
+
+ +

{job.subtype}

+
+
+ +

{job.mode}

+
+
+

{new Date(job.upload_time).toLocaleDateString()}

+
+
+
+
+ ); +} + +export default JobCard; diff --git a/src/Components/Profile/MyCard.jsx b/src/Components/Profile/MyCard.jsx index 231dc86..86e26f2 100644 --- a/src/Components/Profile/MyCard.jsx +++ b/src/Components/Profile/MyCard.jsx @@ -1,61 +1,41 @@ import React from 'react'; import EmailOutlinedIcon from '@mui/icons-material/EmailOutlined'; import PhoneIcon from '@mui/icons-material/Phone'; -import SchoolOutlinedIcon from '@mui/icons-material/SchoolOutlined'; +import AccountBalanceOutlinedIcon from '@mui/icons-material/AccountBalanceOutlined'; // Use this for SAP ID import '../../styles/profile.css'; -const cardData = [ - { - "heading1": 'Meet Chavan', - - - "icon": , - "email": "meetchavan24@gmail.com", - "phoneicon": , - 'phone': '8369620196', - "mode": "Computer Engineering-2026", - "education": , - - }, - ] - - function MyCard() { - return ( -
- -
-
- {cardData.map((data, i) => { - return ( -
-
-
-

Student

-
-

{data.heading1}

- -

{data.body}

-
-
- {data.icon} -

{data.email}

-
-
- {data.phoneicon} -

{data.phone}

-
-
- {data.education} -

{data.mode}

-
- -
-
-
- ); - })} -
+const MyCard = ({ userData }) => { + return ( +
+
+
+
+
+
+

Student

- ); - } -export default MyCard; \ No newline at end of file +

+ {userData.fname} {userData.lname} +

+
+
+ +

{userData.email}

+
+
+ +

{userData.contact_number}

+
+
+ +

{userData.sapid}

+
+
+
+
+
+
+ ); +} + +export default MyCard; diff --git a/src/Components/Profile/MyJobs.jsx b/src/Components/Profile/MyJobs.jsx index b02b828..f83c242 100644 --- a/src/Components/Profile/MyJobs.jsx +++ b/src/Components/Profile/MyJobs.jsx @@ -1,90 +1,20 @@ import React from 'react'; -import CalendarTodayIcon from '@mui/icons-material/CalendarToday'; -import AccessTimeOutlinedIcon from '@mui/icons-material/AccessTimeOutlined'; -import SmartphoneOutlinedIcon from '@mui/icons-material/SmartphoneOutlined'; -import DeleteIcon from '@mui/icons-material/Delete'; +import JobCard from './JobCard'; -const cardData = [ -{ - "heading1": 'Internship', - "heading2": 'Company Name', - "body": "We are seeking highly motivated and enthusiastic technology intern to join us", - "icon": , - "time": "3 Months", - "timeicon": , - 'timelimit': 'Part-time', - "mode": "Online", - "mobile": , - "date": "24th March,2024" -}, -{ - "heading1": 'Internship', - "heading2": 'Company Name', - "body": "We are seeking highly motivated and enthusiastic technology intern to join us", - "icon": , - "time": "3 Months", - "timeicon": , - 'timelimit': 'Part-time', - "mode": "Online", - "mobile": , - "date": "24th March,2024", -}, -{ - "heading1": 'Internship', - "heading2": 'Company Name', - "body": "We are seeking highly motivated and enthusiastic technology intern to join us", - "icon": , - "time": "3 Months", - "timeicon": , - 'timelimit': 'Part-time', - "mode": "Online", - "mobile": , - "date": "24th March,2024", -}, -] - -function MyJobs() { - return ( -
-

- My Posted Job Opportunities -

-
-
- {cardData.map((data, i) => { - return ( -
-
-
- -
-

{data.heading1}

-

{data.heading2}

-

{data.body}

-
-
- {data.icon} -

{data.time}

-
-
- {data.timeicon} -

{data.timelimit}

-
-
- {data.mobile} -

{data.mode}

-
-
-

{data.date}

-
-
-
-
- ); - })} -
-
- ); +function MyJobs({ jobs, onDelete }) { + return ( +
+

+ My Posted Job Opportunities +

+
+
+ {jobs.map((job, i) => ( + + ))} +
+
+ ); } export default MyJobs; diff --git a/src/Components/Profile/jobs.css b/src/Components/Profile/jobs.css new file mode 100644 index 0000000..211cf66 --- /dev/null +++ b/src/Components/Profile/jobs.css @@ -0,0 +1,40 @@ +.flex { + display: flex; + } + + .overflow-x-scroll { + overflow-x: auto; + } + + .space-x-4 > * + * { + margin-left: 1rem; /* Adjust spacing between cards as needed */ + } + + .border { + border: 1px solid #ccc; + } + + .rounded-lg { + border-radius: 0.5rem; + } + + .shadow { + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); + } + + .bg-gray-300 { + background-color: #e2e8f0; + } + + .md\:w-full { + width: 100%; + } + + .cursor-pointer { + cursor: pointer; + } + + .text-custom-blue { + color: #394dfd; + } + \ No newline at end of file diff --git a/src/Pages/LoginPage.jsx b/src/Pages/LoginPage.jsx index b1cae38..fae6035 100644 --- a/src/Pages/LoginPage.jsx +++ b/src/Pages/LoginPage.jsx @@ -29,6 +29,8 @@ const LoginPage = ({ onLoginChange }) => { console.log('Login successful:', data); onLoginChange(true); // Call the onLoginChange callback with true to indicate user is logged in localStorage.setItem('isLoggedIn', 'true'); // Persist login state in local storage + localStorage.setItem('token', data.access); // Persist token in local storage + localStorage.setItem('sapid', sapid); // Persist SAP ID in local storage navigate('/Home'); // Redirect to homepage after successful login } else { console.error('Login failed:', response.statusText); @@ -77,10 +79,10 @@ const LoginPage = ({ onLoginChange }) => {
- Forgot your password? + Forgot your password?

- Post Job Opportunities + View Job Opportunities


diff --git a/src/Pages/profile.jsx b/src/Pages/profile.jsx index 00cc45f..b59c03b 100644 --- a/src/Pages/profile.jsx +++ b/src/Pages/profile.jsx @@ -1,6 +1,6 @@ -import React from 'react'; +import React, { useEffect, useState } from 'react'; import { useNavigate } from 'react-router-dom'; -import Sidebar from '../Components/Home/Sidebar'; // Adjust the path according to your project structure +import Sidebar from '../Components/Home/Sidebar'; import { Button } from '@mui/material'; import BackButton from '../assets/BackButton.png'; import '../styles/profile.css'; @@ -10,44 +10,95 @@ import MyNotes from '../Components/Profile/MyNotes'; import MyResources from '../Components/Profile/MyResources'; import MyCard from '../Components/Profile/MyCard'; import DescriptionProfile from '../Components/Profile/DescriptionProfile'; +import axios from 'axios'; -const Profile=() => { - const navigate = useNavigate(); +const Profile = () => { + const navigate = useNavigate(); + const [userData, setUserData] = useState({}); + const [userNotes, setUserNotes] = useState([]); + const [userPosts, setUserPosts] = useState([]); + const [userJobs, setUserJobs] = useState([]); + const [userVideos, setUserVideos] = useState([]); + + const token = localStorage.getItem('token'); + const sapid = localStorage.getItem('sapid'); + + // Axios instance + const axiosInstance = axios.create({ + baseURL: 'https://monilmeh.pythonanywhere.com', + headers: { + 'Authorization': `Bearer ${token}` + } + }); + + useEffect(() => { + const fetchData = async () => { + try { + // Fetch user data + const userResponse = await axiosInstance.get('/auth/user/'); + setUserData(userResponse.data); + + // Fetch all data and filter by sapid + const [notesResponse, postsResponse, jobsResponse, videosResponse] = await Promise.all([ + axiosInstance.get('/api/notes/'), + axiosInstance.get('/api/posts'), + axiosInstance.get('/api/jobboard/'), + axiosInstance.get('/api/videolinks/') + ]); + + setUserNotes(notesResponse.data.filter(note => note.user === sapid)); + setUserPosts(postsResponse.data.filter(post => post.user === sapid)); + setUserJobs(jobsResponse.data.filter(job => job.user === sapid)); + setUserVideos(videosResponse.data.filter(video => video.user === sapid)); + console.log(userData); + console.log(userNotes); + console.log(userPosts); + console.log(userJobs); + console.log(userVideos); + } catch (error) { + console.error('Error fetching data:', error); + } + }; + + fetchData(); + }, []); const handleGoBack = (event) => { event.preventDefault(); - navigate('/Home'); + navigate(-1); }; - return (
- - <> -
+ +
- -

- My Profile -

+ +

+ My Profile +

-
- - +
- - - - - - -
+ + + + + +
- +
-); + ); } export default Profile; From 6c8416f985586611e285af1da3b92622fbfef304 Mon Sep 17 00:00:00 2001 From: Divya Gandhi Date: Thu, 13 Jun 2024 14:16:35 +0530 Subject: [PATCH 49/82] Integrated Videos on home page --- src/Components/Home/JobOpportunity.jsx | 11 ++++++++--- src/Components/Home/LatestPosts.jsx | 12 ++++++++---- src/Components/Home/ShareNotes.jsx | 14 +++++++++----- src/Components/Home/SharedResources.jsx | 13 ++++++++----- 4 files changed, 33 insertions(+), 17 deletions(-) diff --git a/src/Components/Home/JobOpportunity.jsx b/src/Components/Home/JobOpportunity.jsx index 8d1ed22..41cec1f 100644 --- a/src/Components/Home/JobOpportunity.jsx +++ b/src/Components/Home/JobOpportunity.jsx @@ -3,8 +3,13 @@ import CalendarTodayIcon from '@mui/icons-material/CalendarToday'; import AccessTimeOutlinedIcon from '@mui/icons-material/AccessTimeOutlined'; import SmartphoneOutlinedIcon from '@mui/icons-material/SmartphoneOutlined'; import axios from 'axios'; +import { useNavigate } from 'react-router-dom'; function JobOpportunity() { const[cardData,setCardData]=useState([]); + const navigate = useNavigate(); + function Discover() { + navigate('/DiscoverPage'); + } useEffect(()=>{ const fetchData=async()=>{ try{ @@ -46,7 +51,7 @@ function JobOpportunity() { Explore Latest Job Opportunities

-
+
{cardData.map((data, i) => { return
@@ -79,8 +84,8 @@ function JobOpportunity() {
})}
-
- See More +
+

See More

) diff --git a/src/Components/Home/LatestPosts.jsx b/src/Components/Home/LatestPosts.jsx index 7a0ce8e..c63c1d4 100644 --- a/src/Components/Home/LatestPosts.jsx +++ b/src/Components/Home/LatestPosts.jsx @@ -1,10 +1,14 @@ import React, { useState, useEffect } from 'react'; import FavoriteBorderOutlinedIcon from '@mui/icons-material/FavoriteBorderOutlined'; import axios from 'axios'; +import { useNavigate } from 'react-router-dom'; function LatestPosts() { const [cardData, setCardData] = useState([]); - + const navigate = useNavigate(); + function Discover() { + navigate('/DiscoverPage'); + } useEffect(() => { const fetchData = async () => { try { @@ -39,7 +43,7 @@ function LatestPosts() { Latest Posts

-
+
{cardData.map((data, i) => { return (
@@ -63,8 +67,8 @@ function LatestPosts() { ); })}
-
- See More +
+

See More

); diff --git a/src/Components/Home/ShareNotes.jsx b/src/Components/Home/ShareNotes.jsx index cd7d579..a213b29 100644 --- a/src/Components/Home/ShareNotes.jsx +++ b/src/Components/Home/ShareNotes.jsx @@ -2,10 +2,14 @@ import React, { useEffect, useState } from 'react'; import StarIcon from '@mui/icons-material/Star'; import PictureAsPdfOutlinedIcon from '@mui/icons-material/PictureAsPdfOutlined'; import axios from 'axios'; - +import { useNavigate } from 'react-router-dom'; function ShareNotes() { - const [cardData, setCardData] = useState([]); + const [cardData, setCardData] = useState([]); + const navigate = useNavigate(); +function Discover() { + navigate('/DiscoverPage'); + } useEffect(() => { const fetchData = async () => { try { @@ -44,7 +48,7 @@ function ShareNotes() { Share Notes

-
+
{cardData.map((data, i) => (
@@ -70,8 +74,8 @@ function ShareNotes() { ))}
-
- See More +
+

See More

); diff --git a/src/Components/Home/SharedResources.jsx b/src/Components/Home/SharedResources.jsx index 62b281a..c060176 100644 --- a/src/Components/Home/SharedResources.jsx +++ b/src/Components/Home/SharedResources.jsx @@ -1,9 +1,12 @@ import React,{useState,useEffect} from 'react' import axios from 'axios'; - +import { useNavigate } from 'react-router-dom'; function SharedResources() { const [cardData, setCardData] = useState([]); - + const navigate = useNavigate(); + function Discover() { + navigate('/DiscoverPage'); + } useEffect(() => { const fetchData = async () => { try { @@ -35,7 +38,7 @@ function SharedResources() { Explore Latest Job Opportunities

-
+
{cardData.map((data, i) => { return
@@ -55,8 +58,8 @@ function SharedResources() {
})}
-
- See More +
+

See More

) From dbf3bd5f6f5f583c564ac97cc9d750c18000f7a8 Mon Sep 17 00:00:00 2001 From: Divya Gandhi Date: Thu, 13 Jun 2024 15:15:13 +0530 Subject: [PATCH 50/82] Changes --- src/Components/Home/JobOpportunity.jsx | 6 +++--- src/Components/Home/LatestPosts.jsx | 6 +++--- src/Components/Home/ShareNotes.jsx | 4 ++-- src/Components/Home/SharedResources.jsx | 6 ++++-- 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/Components/Home/JobOpportunity.jsx b/src/Components/Home/JobOpportunity.jsx index 8b84de2..aec99b5 100644 --- a/src/Components/Home/JobOpportunity.jsx +++ b/src/Components/Home/JobOpportunity.jsx @@ -6,14 +6,14 @@ import axios from 'axios'; import { useNavigate } from 'react-router-dom'; function JobOpportunity() { const[cardData,setCardData]=useState([]); -<<<<<<< HEAD + const navigate = useNavigate(); function Discover() { navigate('/DiscoverPage'); } -======= + const token=localStorage.getItem('token'); ->>>>>>> 24b55b5e11785ee244c8c0239a0e29acf4cea551 + useEffect(()=>{ const fetchData=async()=>{ try{ diff --git a/src/Components/Home/LatestPosts.jsx b/src/Components/Home/LatestPosts.jsx index 4b96956..fef5063 100644 --- a/src/Components/Home/LatestPosts.jsx +++ b/src/Components/Home/LatestPosts.jsx @@ -5,14 +5,14 @@ import { useNavigate } from 'react-router-dom'; function LatestPosts() { const [cardData, setCardData] = useState([]); -<<<<<<< HEAD + const navigate = useNavigate(); function Discover() { navigate('/DiscoverPage'); } -======= + const token = localStorage.getItem('token'); ->>>>>>> 24b55b5e11785ee244c8c0239a0e29acf4cea551 + useEffect(() => { const fetchData = async () => { try { diff --git a/src/Components/Home/ShareNotes.jsx b/src/Components/Home/ShareNotes.jsx index 56618b7..4202755 100644 --- a/src/Components/Home/ShareNotes.jsx +++ b/src/Components/Home/ShareNotes.jsx @@ -7,8 +7,8 @@ import { useNavigate } from 'react-router-dom'; function ShareNotes() { const [cardData, setCardData] = useState([]); const navigate = useNavigate(); - const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4MjY5MzkxLCJpYXQiOjE3MTgyNDc3OTEsImp0aSI6ImI1NDU5NTYyOThhMDQwNGY4ZTkzN2JkYWM0MjRiNjYyIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.3Tap7Xk9toixMMOwbnkgegqcg4vBZ-3WJvLlyoST97g'; // Replace with the actual token - + + const token = localStorage.getItem('token'); useEffect(() => { const fetchData = async () => { try { diff --git a/src/Components/Home/SharedResources.jsx b/src/Components/Home/SharedResources.jsx index c060176..0afcfab 100644 --- a/src/Components/Home/SharedResources.jsx +++ b/src/Components/Home/SharedResources.jsx @@ -7,12 +7,14 @@ function SharedResources() { function Discover() { navigate('/DiscoverPage'); } + + const token = localStorage.getItem('token'); useEffect(() => { const fetchData = async () => { try { const response = await axios.get('https://monilmeh.pythonanywhere.com//api/videolinks/', { headers: { - 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4MjY5MzkxLCJpYXQiOjE3MTgyNDc3OTEsImp0aSI6ImI1NDU5NTYyOThhMDQwNGY4ZTkzN2JkYWM0MjRiNjYyIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.3Tap7Xk9toixMMOwbnkgegqcg4vBZ-3WJvLlyoST97g' + 'Authorization': `Bearer ${token}`, } }); console.log('API Response:', response.data); @@ -30,7 +32,7 @@ function SharedResources() { } }; fetchData(); - }, []); + }, [token]); return (
From 992305f34a650fc3333f905b4c8adec6baba1623 Mon Sep 17 00:00:00 2001 From: Divya Gandhi Date: Thu, 13 Jun 2024 16:08:11 +0530 Subject: [PATCH 51/82] Delete functionality --- src/Components/Discover/Notes.jsx | 6 +++--- src/Components/Discover/Posts.jsx | 6 +++--- src/Components/Home/JobOpportunity.jsx | 18 ++++++++++++++++++ src/Components/Home/LatestPosts.jsx | 19 +++++++++++++++++++ src/Components/Home/SharedResources.jsx | 4 ++++ 5 files changed, 47 insertions(+), 6 deletions(-) diff --git a/src/Components/Discover/Notes.jsx b/src/Components/Discover/Notes.jsx index e3a1b97..7f1b49d 100644 --- a/src/Components/Discover/Notes.jsx +++ b/src/Components/Discover/Notes.jsx @@ -6,11 +6,11 @@ import axios from 'axios'; function Notes() { const [cardData, setCardData] = useState([]); - + const token=localStorage.getItem('token'); useEffect(() => { const fetchData = async () => { try { - const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4MjY5MzkxLCJpYXQiOjE3MTgyNDc3OTEsImp0aSI6ImI1NDU5NTYyOThhMDQwNGY4ZTkzN2JkYWM0MjRiNjYyIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.3Tap7Xk9toixMMOwbnkgegqcg4vBZ-3WJvLlyoST97g'; // Replace with the actual token + const response = await axios.get('https://monilmeh.pythonanywhere.com/api/notes/', { headers: { 'Authorization': `Bearer ${token}` @@ -37,7 +37,7 @@ function Notes() { }; fetchData(); - }, []); + }, [token]); return (
diff --git a/src/Components/Discover/Posts.jsx b/src/Components/Discover/Posts.jsx index 614c24e..0d731c7 100644 --- a/src/Components/Discover/Posts.jsx +++ b/src/Components/Discover/Posts.jsx @@ -4,13 +4,13 @@ import axios from 'axios'; function Posts() { const [cardData, setCardData] = useState([]); - + const token=localStorage.getItem('token'); useEffect(() => { const fetchData = async () => { try { const response = await axios.get('https://monilmeh.pythonanywhere.com//api/posts', { headers: { - 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4MjY5MzkxLCJpYXQiOjE3MTgyNDc3OTEsImp0aSI6ImI1NDU5NTYyOThhMDQwNGY4ZTkzN2JkYWM0MjRiNjYyIiwidXNlcl9pZCI6IjYwMDA0MjIwMjA3In0.3Tap7Xk9toixMMOwbnkgegqcg4vBZ-3WJvLlyoST97g' + 'Authorization': `Bearer ${token}`, } }); console.log('API Response:', response.data); // Log the API response @@ -31,7 +31,7 @@ function Posts() { } }; fetchData(); - }, []); + }, [token]); return (
diff --git a/src/Components/Home/JobOpportunity.jsx b/src/Components/Home/JobOpportunity.jsx index aec99b5..9fbd755 100644 --- a/src/Components/Home/JobOpportunity.jsx +++ b/src/Components/Home/JobOpportunity.jsx @@ -3,6 +3,7 @@ import CalendarTodayIcon from '@mui/icons-material/CalendarToday'; import AccessTimeOutlinedIcon from '@mui/icons-material/AccessTimeOutlined'; import SmartphoneOutlinedIcon from '@mui/icons-material/SmartphoneOutlined'; import axios from 'axios'; +import DeleteIcon from '@mui/icons-material/Delete'; import { useNavigate } from 'react-router-dom'; function JobOpportunity() { const[cardData,setCardData]=useState([]); @@ -24,6 +25,7 @@ function JobOpportunity() { } }); const data=response.data.slice(0, 3).map((item)=>({ + id:item.job_id, heading1:item.company, heading2:item.job_title, heading3:item.subtype, @@ -49,6 +51,19 @@ function JobOpportunity() { }; fetchData(); },[token]); + const handleDelete = async (id) => { + try { + await axios.delete(`https://monilmeh.pythonanywhere.com/api/jobboard/${id}/`, { + headers: { + 'Authorization': `Bearer ${token}` + } + }); + // Remove the deleted job from the state + setCardData((prevData) => prevData.filter((job) => job.id !== id)); + } catch (error) { + console.error('Error deleting job', error); + } + }; return (

@@ -59,7 +74,10 @@ function JobOpportunity() { {cardData.map((data, i) => { return

+

{data.heading1}

+ handleDelete(data.id)} /> +

{data.heading2}

{data.heading3}

{/*

{data.body.substring(0, 100)}

*/} diff --git a/src/Components/Home/LatestPosts.jsx b/src/Components/Home/LatestPosts.jsx index fef5063..8bb3492 100644 --- a/src/Components/Home/LatestPosts.jsx +++ b/src/Components/Home/LatestPosts.jsx @@ -1,6 +1,7 @@ import React, { useState, useEffect } from 'react'; import FavoriteBorderOutlinedIcon from '@mui/icons-material/FavoriteBorderOutlined'; import axios from 'axios'; +import DeleteIcon from '@mui/icons-material/Delete'; import { useNavigate } from 'react-router-dom'; function LatestPosts() { @@ -23,6 +24,7 @@ function LatestPosts() { }); // console.log('API Response:', response.data); const data = response.data.map((item) => ({ + id:item.post_id, heading1: item.title, body: item.description, icon: , @@ -40,6 +42,19 @@ function LatestPosts() { }; fetchData(); }, [token]); + const handleDelete = async (id) => { + try { + await axios.delete(`https://monilmeh.pythonanywhere.com//api/posts/${id}`, { + headers: { + 'Authorization': `Bearer ${token}` + } + }); + // Remove the deleted job from the state + setCardData((prevData) => prevData.filter((job) => job.id !== id)); + } catch (error) { + console.error('Error deleting job', error); + } + }; return (
@@ -52,7 +67,11 @@ function LatestPosts() { return (
+ +

{data.heading1}

+ handleDelete(data.id)} /> +
{data.heading1}

{data.body}

diff --git a/src/Components/Home/SharedResources.jsx b/src/Components/Home/SharedResources.jsx index 0afcfab..9d02611 100644 --- a/src/Components/Home/SharedResources.jsx +++ b/src/Components/Home/SharedResources.jsx @@ -1,6 +1,7 @@ import React,{useState,useEffect} from 'react' import axios from 'axios'; import { useNavigate } from 'react-router-dom'; +import DeleteIcon from '@mui/icons-material/Delete'; function SharedResources() { const [cardData, setCardData] = useState([]); const navigate = useNavigate(); @@ -44,7 +45,10 @@ function SharedResources() { {cardData.map((data, i) => { return
+

{data.heading1}

+ +

{data.heading2}

Semester:{data.semester}

From 820d39aa342ebad4d5edc4bb3a324946b3ec1fc8 Mon Sep 17 00:00:00 2001 From: Divya Gandhi Date: Thu, 13 Jun 2024 17:25:12 +0530 Subject: [PATCH 52/82] Added delete functionality --- src/Components/Discover/Notes.jsx | 17 +++++++++++++++++ src/Components/Discover/Posts.jsx | 23 ++++++++++++++++++++--- src/Components/Home/JobOpportunity.jsx | 2 +- src/Components/Home/LatestPosts.jsx | 6 +++--- src/Components/Home/ShareNotes.jsx | 22 +++++++++++++++++++--- src/Components/Home/SharedResources.jsx | 22 +++++++++++++++++++--- src/Components/NewPost/NewPost.jsx | 10 ++++++---- src/Components/Notes/UploadNotes.jsx | 6 ++++-- 8 files changed, 89 insertions(+), 19 deletions(-) diff --git a/src/Components/Discover/Notes.jsx b/src/Components/Discover/Notes.jsx index 7f1b49d..1152622 100644 --- a/src/Components/Discover/Notes.jsx +++ b/src/Components/Discover/Notes.jsx @@ -2,6 +2,7 @@ import React, { useEffect, useState } from 'react'; import StarIcon from '@mui/icons-material/Star'; import PictureAsPdfOutlinedIcon from '@mui/icons-material/PictureAsPdfOutlined'; import axios from 'axios'; +import DeleteIcon from '@mui/icons-material/Delete'; function Notes() { @@ -18,6 +19,7 @@ function Notes() { }); console.log(response.data); const data = response.data.map((item) => ({ + id:item.note_id, heading1: item.note_title, body: item.note_description, icon: , @@ -38,6 +40,20 @@ function Notes() { fetchData(); }, [token]); + const handleDelete = async (id) => { + try { + await axios.delete(`https://monilmeh.pythonanywhere.com//api/notes/${id}`, { + headers: { + 'Authorization': `Bearer ${token}` + } + }); + + setCardData((prevData) => prevData.filter((job) => job.id !== id)); + } catch (error) { + console.error('Error deleting job', error); + } + }; + return (
@@ -52,6 +68,7 @@ function Notes() {
{data.icon}

{data.stars && data.stars.toFixed(1)}

+ < DeleteIcon className='text-[#394dfd] cursor-pointer hover:text-red-500' onClick={()=>handleDelete(data.id)} />
diff --git a/src/Components/Discover/Posts.jsx b/src/Components/Discover/Posts.jsx index 0d731c7..c3d58fc 100644 --- a/src/Components/Discover/Posts.jsx +++ b/src/Components/Discover/Posts.jsx @@ -1,7 +1,7 @@ import React, { useState, useEffect } from 'react'; import FavoriteBorderOutlinedIcon from '@mui/icons-material/FavoriteBorderOutlined'; import axios from 'axios'; - +import DeleteIcon from '@mui/icons-material/Delete'; function Posts() { const [cardData, setCardData] = useState([]); const token=localStorage.getItem('token'); @@ -13,9 +13,10 @@ function Posts() { 'Authorization': `Bearer ${token}`, } }); - console.log('API Response:', response.data); // Log the API response + console.log('API Response:', response.data); const data = response.data.map((item) => ({ heading1: item.title, + id:item.post_id, body: item.description, icon: , timelimit: item.likes, @@ -32,6 +33,19 @@ function Posts() { }; fetchData(); }, [token]); + const handleDelete = async (id) => { + try { + await axios.delete(`https://monilmeh.pythonanywhere.com//api/posts/${id}`, { + headers: { + 'Authorization': `Bearer ${token}` + } + }); + + setCardData((prevData) => prevData.filter((job) => job.id !== id)); + } catch (error) { + console.error('Error deleting job', error); + } + }; return (
@@ -41,7 +55,10 @@ function Posts() { return (
-

{data.heading1}

+
+

{data.heading1}

+ handleDelete(data.id)} /> +
{data.heading1}

{data.body}

diff --git a/src/Components/Home/JobOpportunity.jsx b/src/Components/Home/JobOpportunity.jsx index 9fbd755..7fe6987 100644 --- a/src/Components/Home/JobOpportunity.jsx +++ b/src/Components/Home/JobOpportunity.jsx @@ -69,7 +69,7 @@ function JobOpportunity() {

Explore Latest Job Opportunities

-
+
{cardData.map((data, i) => { return
diff --git a/src/Components/Home/LatestPosts.jsx b/src/Components/Home/LatestPosts.jsx index 8bb3492..9d75e1f 100644 --- a/src/Components/Home/LatestPosts.jsx +++ b/src/Components/Home/LatestPosts.jsx @@ -49,7 +49,7 @@ function LatestPosts() { 'Authorization': `Bearer ${token}` } }); - // Remove the deleted job from the state + setCardData((prevData) => prevData.filter((job) => job.id !== id)); } catch (error) { console.error('Error deleting job', error); @@ -57,11 +57,11 @@ function LatestPosts() { }; return ( -
+

Latest Posts

-
+
{cardData.map((data, i) => { return ( diff --git a/src/Components/Home/ShareNotes.jsx b/src/Components/Home/ShareNotes.jsx index 4202755..8db21c4 100644 --- a/src/Components/Home/ShareNotes.jsx +++ b/src/Components/Home/ShareNotes.jsx @@ -3,6 +3,7 @@ import StarIcon from '@mui/icons-material/Star'; import PictureAsPdfOutlinedIcon from '@mui/icons-material/PictureAsPdfOutlined'; import axios from 'axios'; import { useNavigate } from 'react-router-dom'; +import DeleteIcon from '@mui/icons-material/Delete'; function ShareNotes() { const [cardData, setCardData] = useState([]); @@ -19,6 +20,7 @@ function ShareNotes() { }); console.log(response.data); const data = response.data.map((item) => ({ + id:item.note_id, heading1: item.note_title, body: item.note_description, icon: , @@ -39,26 +41,40 @@ function ShareNotes() { fetchData(); }, [token]); + const handleDelete = async (id) => { + try { + await axios.delete(`https://monilmeh.pythonanywhere.com//api/notes/${id}`, { + headers: { + 'Authorization': `Bearer ${token}` + } + }); + + setCardData((prevData) => prevData.filter((job) => job.id !== id)); + } catch (error) { + console.error('Error deleting job', error); + } + }; const handleSeeMore = () => { navigate('/discover'); // Adjust the route as per your requirement }; return ( -
+

Share Notes

-
+
{cardData.map((data, i) => (

{data.heading1}

-
+
{data.icon}

{data.stars && data.stars.toFixed(1)}

+ < DeleteIcon className='text-[#394dfd] cursor-pointer hover:text-red-500' onClick={()=>handleDelete(data.id)} />
diff --git a/src/Components/Home/SharedResources.jsx b/src/Components/Home/SharedResources.jsx index 9d02611..4a7dc0f 100644 --- a/src/Components/Home/SharedResources.jsx +++ b/src/Components/Home/SharedResources.jsx @@ -20,6 +20,7 @@ function SharedResources() { }); console.log('API Response:', response.data); const data = response.data.map((item) => ({ + id:item.video_id, heading1: item.subject, heading2:item.topics, semester:item.sem, @@ -35,26 +36,41 @@ function SharedResources() { fetchData(); }, [token]); + const handleDelete = async (id) => { + try { + await axios.delete(`https://monilmeh.pythonanywhere.com//api/posts/${id}`, { + headers: { + 'Authorization': `Bearer ${token}` + } + }); + + setCardData((prevData) => prevData.filter((job) => job.id !== id)); + } catch (error) { + console.error('Error deleting job', error); + } + }; + + return (

Explore Latest Job Opportunities

-
+
{cardData.map((data, i) => { return

{data.heading1}

- + {handleDelete(data.id)}} />

{data.heading2}

Semester:{data.semester}

-
diff --git a/src/Components/NewPost/NewPost.jsx b/src/Components/NewPost/NewPost.jsx index 421b056..7494d2a 100644 --- a/src/Components/NewPost/NewPost.jsx +++ b/src/Components/NewPost/NewPost.jsx @@ -1,8 +1,9 @@ import React, { useState } from 'react'; import CloudUploadOutlinedIcon from '@mui/icons-material/CloudUploadOutlined'; import axios from 'axios'; - +import { useNavigate } from 'react-router-dom'; function NewPost() { + const navigate = useNavigate(); const [formData, setFormData] = useState({ title: '', subtype: '', @@ -11,7 +12,7 @@ function NewPost() { deadline: '', likes: 100, post_url: '', - user: '60004220207' // Assuming user ID is static for this example + user: '60004220207' }); const token = localStorage.getItem('token'); @@ -37,10 +38,10 @@ function NewPost() { const endpoint = 'https://monilmeh.pythonanywhere.com/api/posts'; const form = new FormData(); - form.append('title', formData.title); // Ensure this matches the expected field name + form.append('title', formData.title); form.append('category', formData.subtype); form.append('description', formData.description); - form.append('image', formData.document); // Ensure this matches the expected field name + form.append('image', formData.document); form.append('deadline', formData.deadline); form.append('likes', formData.likes); form.append('post_url', formData.post_url); @@ -56,6 +57,7 @@ function NewPost() { if (response.status === 201) { alert('Post created successfully!'); + navigate('/'); setFormData({ title: '', subtype: '', diff --git a/src/Components/Notes/UploadNotes.jsx b/src/Components/Notes/UploadNotes.jsx index 41362c7..ca94c81 100644 --- a/src/Components/Notes/UploadNotes.jsx +++ b/src/Components/Notes/UploadNotes.jsx @@ -1,8 +1,9 @@ import React, { useState } from 'react'; import CloudUploadOutlinedIcon from '@mui/icons-material/CloudUploadOutlined'; import axios from 'axios'; - +import { useNavigate } from 'react-router-dom'; function UploadNotes() { + const navigate = useNavigate(); const [formData, setFormData] = useState({ notesTitle: '', subject: '', @@ -55,6 +56,7 @@ function UploadNotes() { if (response.status === 201) { alert('Notes uploaded successfully!'); + navigate('/'); setFormData({ notesTitle: '', subject: '', @@ -141,7 +143,7 @@ function UploadNotes() {
- +
From 21d62ab5210973d25d6279fd529f356d6da88811 Mon Sep 17 00:00:00 2001 From: Divya Gandhi Date: Thu, 13 Jun 2024 17:53:24 +0530 Subject: [PATCH 53/82] Completed --- src/Components/Discover/JobCard.jsx | 2 +- src/Components/Discover/Jobs.jsx | 2 +- src/Components/NewPost/NewPost.jsx | 1 + src/Components/Notes/UploadNotes.jsx | 2 +- src/Pages/DiscoverPage.jsx | 2 +- 5 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/Components/Discover/JobCard.jsx b/src/Components/Discover/JobCard.jsx index 8a635e9..52be3cf 100644 --- a/src/Components/Discover/JobCard.jsx +++ b/src/Components/Discover/JobCard.jsx @@ -18,7 +18,7 @@ function JobCard({ job, onDelete }) { }; return ( -
+
diff --git a/src/Components/Discover/Jobs.jsx b/src/Components/Discover/Jobs.jsx index d187abd..bc0e611 100644 --- a/src/Components/Discover/Jobs.jsx +++ b/src/Components/Discover/Jobs.jsx @@ -20,7 +20,7 @@ function Jobs() { fetch(`https://monilmeh.pythonanywhere.com/api/jobboard/${jobId}/`, { method: 'DELETE', headers: { - 'Authorization': `Bearer ${token}` // Replace with your actual access token + 'Authorization': `Bearer ${token}` } }) .then(response => { diff --git a/src/Components/NewPost/NewPost.jsx b/src/Components/NewPost/NewPost.jsx index 7494d2a..6e918e8 100644 --- a/src/Components/NewPost/NewPost.jsx +++ b/src/Components/NewPost/NewPost.jsx @@ -68,6 +68,7 @@ function NewPost() { post_url: '', user: '60004220207' }); + console.log(formData); } else { alert('Failed to create post'); } diff --git a/src/Components/Notes/UploadNotes.jsx b/src/Components/Notes/UploadNotes.jsx index ca94c81..1351fa7 100644 --- a/src/Components/Notes/UploadNotes.jsx +++ b/src/Components/Notes/UploadNotes.jsx @@ -143,7 +143,7 @@ function UploadNotes() {
- +
diff --git a/src/Pages/DiscoverPage.jsx b/src/Pages/DiscoverPage.jsx index 37f2831..1f84a9d 100644 --- a/src/Pages/DiscoverPage.jsx +++ b/src/Pages/DiscoverPage.jsx @@ -7,7 +7,7 @@ function DiscoverPage() { return (
-
+
From f496d65409a4c5998437e75b5712bece5718bf9d Mon Sep 17 00:00:00 2001 From: MonilMehta Date: Thu, 13 Jun 2024 18:13:41 +0530 Subject: [PATCH 54/82] Completed Profile Page and Logout Functionality --- src/Components/Notes/ViewNote.jsx | 2 +- src/Components/Profile/DescriptionProfile.jsx | 12 +- src/Components/Profile/JobCard.jsx | 2 +- src/Components/Profile/MyCard.jsx | 4 +- src/Components/Profile/MyJobs.jsx | 4 +- src/Components/Profile/MyNotes.jsx | 159 ++++++++---------- src/Components/Profile/MyPosts.jsx | 87 +++------- src/Components/Profile/MyVideos.jsx | 56 ++++++ src/Components/Profile/PostCard.jsx | 42 +++++ src/Components/Profile/notes.css | 35 ++++ src/Components/Profile/videos.css | 34 ++++ src/Pages/DiscoverPage.jsx | 2 - src/Pages/profile.jsx | 55 +++++- src/styles/profile.css | 3 + 14 files changed, 317 insertions(+), 180 deletions(-) create mode 100644 src/Components/Profile/MyVideos.jsx create mode 100644 src/Components/Profile/PostCard.jsx create mode 100644 src/Components/Profile/notes.css create mode 100644 src/Components/Profile/videos.css diff --git a/src/Components/Notes/ViewNote.jsx b/src/Components/Notes/ViewNote.jsx index 679a47d..845d4ed 100644 --- a/src/Components/Notes/ViewNote.jsx +++ b/src/Components/Notes/ViewNote.jsx @@ -34,7 +34,7 @@ const ViewNote = () => { const handleGoBack = (event) => { event.preventDefault(); - navigate.goBack(); + navigate(-1); }; const downloadNote = async () => { diff --git a/src/Components/Profile/DescriptionProfile.jsx b/src/Components/Profile/DescriptionProfile.jsx index cdea1b9..ff2a219 100644 --- a/src/Components/Profile/DescriptionProfile.jsx +++ b/src/Components/Profile/DescriptionProfile.jsx @@ -42,9 +42,9 @@ function DescriptionProfile({ jobCount, postCount, noteCount, videoCount, userDa return ( <> -
-
-
+
+
+
@@ -96,7 +96,7 @@ function DescriptionProfile({ jobCount, postCount, noteCount, videoCount, userDa Add New Post
{isModalOpen && ( -
-
+
+

Edit Profile

diff --git a/src/Components/Profile/JobCard.jsx b/src/Components/Profile/JobCard.jsx index b1ee148..98a3ec8 100644 --- a/src/Components/Profile/JobCard.jsx +++ b/src/Components/Profile/JobCard.jsx @@ -18,7 +18,7 @@ function JobCard({ job, onDelete }) { }; return ( -
+
diff --git a/src/Components/Profile/MyCard.jsx b/src/Components/Profile/MyCard.jsx index 86e26f2..75f08be 100644 --- a/src/Components/Profile/MyCard.jsx +++ b/src/Components/Profile/MyCard.jsx @@ -6,9 +6,9 @@ import '../../styles/profile.css'; const MyCard = ({ userData }) => { return ( -
+
-
+
diff --git a/src/Components/Profile/MyJobs.jsx b/src/Components/Profile/MyJobs.jsx index f83c242..e37de69 100644 --- a/src/Components/Profile/MyJobs.jsx +++ b/src/Components/Profile/MyJobs.jsx @@ -8,7 +8,9 @@ function MyJobs({ jobs, onDelete }) { My Posted Job Opportunities

-
+ + {/* Added container for slider behavior */} +
{jobs.map((job, i) => ( ))} diff --git a/src/Components/Profile/MyNotes.jsx b/src/Components/Profile/MyNotes.jsx index c75485f..97bd012 100644 --- a/src/Components/Profile/MyNotes.jsx +++ b/src/Components/Profile/MyNotes.jsx @@ -1,98 +1,71 @@ -import React from 'react' +import React, { useState } from 'react'; +import { useNavigate } from 'react-router-dom'; +import './notes.css'; // Adjust the path according to your project structure -import StarIcon from '@mui/icons-material/Star'; -import PictureAsPdfOutlinedIcon from '@mui/icons-material/PictureAsPdfOutlined'; -import DeleteIcon from '@mui/icons-material/Delete'; +const MyNotes = ({ notes }) => { + const [currentSlide, setCurrentSlide] = useState(0); + const navigate = useNavigate(); + const handleNoteClick = (noteId) => { + navigate(`/viewnote/${noteId}`); + }; -const cardData = [ - { - "heading1": 'Notes Title', - - "body": "Check out these Study Buddy Notes crafted by students who have been through coding sub.. ", - "icon": , - "department":" Department", - - 'timelimit': '100 + Likes', - 'pdf': - - }, - { - "heading1": 'Notes Title', - - "body": "Check out these Study Buddy Notes crafted by students who have been through coding sub..", - "icon": , - "department":" Department", - 'timelimit': '100 + Likes', - 'pdf': - - }, - { - "heading1": 'Notes Title', - "body": "Check out these Study Buddy Notes crafted by students who have been through coding sub..", - "icon": , - "department":" Department", - 'pdf':, - 'timelimit': '100 + Likes', - - }, - { - "heading1": 'Notes Title', - "body": "Check out these Study Buddy Notes crafted by students who have been through coding sub..", - "icon": , - "department":" Department", - 'pdf': - - - }, - { - "heading1": 'Notes Title', - "body": "Check out these Study Buddy Notes crafted by students who have been through coding sub..", - "icon": , - "department":" Department", - 'pdf': - - }, - ] -function ShareNotes() { -return ( -
-

- My Shared Notes -

-
-
- {cardData.map((data, i) => { - return ( -
-
-
- -
-
-
-

{data.heading1}

-
- {data.icon} -

4.6

-
-
-
-

{data.body}

-
-
-

{data.department}

- {data.pdf} -
-
-
-
- ); - })} -
- + const nextSlide = () => { + setCurrentSlide((prev) => (prev === notes.length - 1 ? 0 : prev + 1)); + }; + + const prevSlide = () => { + setCurrentSlide((prev) => (prev === 0 ? notes.length - 1 : prev - 1)); + }; + + return ( +
+

+ My Notes +

+
+ {notes.length > 0 ? ( +
+
+ {notes.map((note, index) => ( +
handleNoteClick(note.note_id)} + > +
+

{note.note_title}

+

{note.note_description.substring(0, 100)}...

+
+

{note.department}

+
+ Rating: +

{note.average_rating}

+
+
+ {note.document.endsWith('.pdf') ? ( +
+ +

Alternative text - include a link to the PDF!

+
- ); -} + ) : ( + {note.note_title} + )} +
+
+ ))} +
+
+ + +
+
+ ) : ( +

No notes found.

+ )} +
+ ); +}; -export default ShareNotes \ No newline at end of file +export default MyNotes; diff --git a/src/Components/Profile/MyPosts.jsx b/src/Components/Profile/MyPosts.jsx index bae89d9..81fcd97 100644 --- a/src/Components/Profile/MyPosts.jsx +++ b/src/Components/Profile/MyPosts.jsx @@ -1,72 +1,27 @@ -import React from 'react' +import React from 'react'; +import PostCard from './PostCard'; -import FavoriteBorderOutlinedIcon from '@mui/icons-material/FavoriteBorderOutlined'; -import DeleteIcon from '@mui/icons-material/Delete'; +function MyPosts({ posts,onDelete }) { + const handleDeletePost = (postId) => { + // Implement delete logic here (similar to MyJobs component) + console.log(`Deleting post with ID ${postId}`); + }; - -const cardData = [ -{ - "heading1": 'Post Title', - - "body": "Hello tech enthusiastics and innovators! Are you ready to show case your skills,collabrate with like-minded individuals,and create ground-breaking solutions for real-world challenges? ", - "icon": , - - - 'timelimit': '100 + Likes', - -}, -{ - "heading1": 'Post Title', - - "body": "Hello tech enthusiastics and innovators! Are you ready to show case your skills,collabrate with like-minded individuals,and create ground-breaking solutions for real-world challenges?", - "icon": , - - 'timelimit': '100 + Likes', - -}, -{ - "heading1": 'Post Title', - - "body": "Hello tech enthusiastics and innovators! Are you ready to show case your skills,collabrate with like-minded individuals,and create ground-breaking solutions for real-world challenges?", - "icon": , - - - 'timelimit': '100 + Likes', - -}, -] -function MyPosts() { -return ( + return (
-

- My Created Posts -

-
-
- {cardData.map((data, i) => { - return ( -
-
-
- -
-

{data.heading1}

-

{data.body}

-
-
- {data.icon} -

{data.timelimit}

-
-

Categories

-
-
-
- ); - })} +

+ My Created Posts +

+
+
+ {posts.map((post, i) => ( +
+ +
+ ))} +
- -
-); + ); } -export default MyPosts \ No newline at end of file +export default MyPosts; \ No newline at end of file diff --git a/src/Components/Profile/MyVideos.jsx b/src/Components/Profile/MyVideos.jsx new file mode 100644 index 0000000..f388250 --- /dev/null +++ b/src/Components/Profile/MyVideos.jsx @@ -0,0 +1,56 @@ +import React, { useState } from 'react'; +import './videos.css'; // Adjust the path according to your project structure + +const MyVideos = ({ videos }) => { + const [currentSlide, setCurrentSlide] = useState(0); + + const nextSlide = () => { + setCurrentSlide((prev) => (prev === videos.length - 1 ? 0 : prev + 1)); + }; + + const prevSlide = () => { + setCurrentSlide((prev) => (prev === 0 ? videos.length - 1 : prev - 1)); + }; + + return ( +
+

+ My Videos +

+
+ {videos.length > 0 ? ( +
+
+ {videos.map((video, index) => ( +
+
+

{video.title}

+

{video.description.substring(0, 100)}...

+
+ +
+
+
+ ))} +
+
+ + +
+
+ ) : ( +

No videos found. Are you an Admin ??

+ )} +
+ ); +}; + +export default MyVideos; diff --git a/src/Components/Profile/PostCard.jsx b/src/Components/Profile/PostCard.jsx new file mode 100644 index 0000000..fff3264 --- /dev/null +++ b/src/Components/Profile/PostCard.jsx @@ -0,0 +1,42 @@ + +import React from 'react'; +import { useNavigate } from 'react-router-dom'; +import FavoriteBorderOutlinedIcon from '@mui/icons-material/FavoriteBorderOutlined'; +import DeleteIcon from '@mui/icons-material/Delete'; + +function PostCard({ post, onDelete }) { + const navigate = useNavigate(); + + const handleCardClick = () => { + navigate(`/postdetails/${post.post_id}`); + }; + + const handleDeleteClick = (e) => { + e.stopPropagation(); // Prevent navigation when delete icon is clicked + onDelete(post.post_id); + }; + + return ( +
+
+
+ +
+ {post.title} {/* Added image display */} +

{post.title}

+

{post.description.substring(0, 60)}...

+
+
+ +

{post.likes} Likes

+
+
+

Categories

+
+
+
+
+ ); +} + +export default PostCard; \ No newline at end of file diff --git a/src/Components/Profile/notes.css b/src/Components/Profile/notes.css new file mode 100644 index 0000000..057746d --- /dev/null +++ b/src/Components/Profile/notes.css @@ -0,0 +1,35 @@ +/* Add this CSS to your styles */ +.slider-container { + position: relative; + max-width: 80%; + overflow: hidden; + margin-left: 10%; + } + + .slider { + display: flex; + transition: transform 0.5s ease-in-out; + } + + .slider .slide { + min-width: 100%; + box-sizing: border-box; + } + + .slider-controls { + position: absolute; + top: 50%; + width: 100%; + display: flex; + justify-content: space-between; + transform: translateY(-50%); + } + + .slider-button { + background-color: rgba(0, 0, 0, 0.5); + color: white; + border: none; + padding: 10px; + cursor: pointer; + } + \ No newline at end of file diff --git a/src/Components/Profile/videos.css b/src/Components/Profile/videos.css new file mode 100644 index 0000000..f2acf03 --- /dev/null +++ b/src/Components/Profile/videos.css @@ -0,0 +1,34 @@ +/* Add this CSS to your styles */ +.slider-container { + position: relative; + width: 100%; + overflow: hidden; + } + + .slider { + display: flex; + transition: transform 0.5s ease-in-out; + } + + .slider .slide { + min-width: 100%; + box-sizing: border-box; + } + + .slider-controls { + position: absolute; + top: 50%; + width: 100%; + display: flex; + justify-content: space-between; + transform: translateY(-50%); + } + + .slider-button { + background-color: rgba(0, 0, 0, 0.5); + color: white; + border: none; + padding: 10px; + cursor: pointer; + } + \ No newline at end of file diff --git a/src/Pages/DiscoverPage.jsx b/src/Pages/DiscoverPage.jsx index 1f84a9d..27f9c7d 100644 --- a/src/Pages/DiscoverPage.jsx +++ b/src/Pages/DiscoverPage.jsx @@ -9,8 +9,6 @@ function DiscoverPage() {
- -
diff --git a/src/Pages/profile.jsx b/src/Pages/profile.jsx index b59c03b..efa915a 100644 --- a/src/Pages/profile.jsx +++ b/src/Pages/profile.jsx @@ -11,6 +11,7 @@ import MyResources from '../Components/Profile/MyResources'; import MyCard from '../Components/Profile/MyCard'; import DescriptionProfile from '../Components/Profile/DescriptionProfile'; import axios from 'axios'; +import MyVideos from '../Components/Profile/MyVideos'; // Import MyVideos component const Profile = () => { const navigate = useNavigate(); @@ -19,6 +20,7 @@ const Profile = () => { const [userPosts, setUserPosts] = useState([]); const [userJobs, setUserJobs] = useState([]); const [userVideos, setUserVideos] = useState([]); + const [isAdmin, setIsAdmin] = useState(false); // State to check if user is admin const token = localStorage.getItem('token'); const sapid = localStorage.getItem('sapid'); @@ -31,6 +33,41 @@ const Profile = () => { } }); + const handleJobDelete = (jobId) => { + fetch(`https://monilmeh.pythonanywhere.com/api/jobboard/${jobId}/`, { + method: 'DELETE', + headers: { + 'Authorization': `Bearer ${token}` // Replace with your actual access token + } + }) + .then(response => { + if (response.ok) { + setUserJobs(userJobs.filter(job => job.job_id !== jobId)); + } else { + console.error('Error deleting job'); + } + }) + .catch(error => console.error('Error deleting job:', error)); + }; + const handlePostDelete = (postId) => { + const token = localStorage.getItem('token'); // Ensure the token is fetched correctly + + fetch(`https://monilmeh.pythonanywhere.com/api/posts/${postId}`, { + method: 'DELETE', + headers: { + 'Authorization': `Bearer ${token}` // Use the actual access token + } + }) + .then(response => { + if (response.ok) { + setUserPosts(prevPosts => prevPosts.filter(post => post.post_id !== postId)); + } else { + console.error('Error deleting post'); + } + }) + .catch(error => console.error('Error deleting post:', error)); + }; + useEffect(() => { const fetchData = async () => { try { @@ -38,6 +75,10 @@ const Profile = () => { const userResponse = await axiosInstance.get('/auth/user/'); setUserData(userResponse.data); + // Check if user is admin + const adminResponse = await axiosInstance.get('/api/isAdmin/'); + setIsAdmin(adminResponse.data); + // Fetch all data and filter by sapid const [notesResponse, postsResponse, jobsResponse, videosResponse] = await Promise.all([ axiosInstance.get('/api/notes/'), @@ -49,12 +90,10 @@ const Profile = () => { setUserNotes(notesResponse.data.filter(note => note.user === sapid)); setUserPosts(postsResponse.data.filter(post => post.user === sapid)); setUserJobs(jobsResponse.data.filter(job => job.user === sapid)); - setUserVideos(videosResponse.data.filter(video => video.user === sapid)); - console.log(userData); - console.log(userNotes); + if (adminResponse.data) { + setUserVideos(videosResponse.data.filter(video => video.user === sapid)); + } console.log(userPosts); - console.log(userJobs); - console.log(userVideos); } catch (error) { console.error('Error fetching data:', error); } @@ -91,10 +130,10 @@ const Profile = () => { userData={userData} updateUser={setUserData} /> - - + + - + {isAdmin && } {/* Show MyVideos only if user is admin */}
diff --git a/src/styles/profile.css b/src/styles/profile.css index c83cdc9..c1cb9e0 100644 --- a/src/styles/profile.css +++ b/src/styles/profile.css @@ -1,3 +1,6 @@ .profilecard{ margin-right: auto; +} +.fullcont{ + max-width: 100vw; } \ No newline at end of file From 43142bc1c941591c88ec9d097fe0be6459d78266 Mon Sep 17 00:00:00 2001 From: MonilMehta Date: Thu, 13 Jun 2024 18:35:03 +0530 Subject: [PATCH 55/82] Corrected Signup routing, and video Upload --- src/Components/Profile/MyVideos.jsx | 10 +++++----- src/Pages/SignUp.jsx | 2 +- src/Pages/UploadVideo.jsx | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Components/Profile/MyVideos.jsx b/src/Components/Profile/MyVideos.jsx index f388250..c430b04 100644 --- a/src/Components/Profile/MyVideos.jsx +++ b/src/Components/Profile/MyVideos.jsx @@ -17,21 +17,21 @@ const MyVideos = ({ videos }) => {

My Videos

-
+
{videos.length > 0 ? (
{videos.map((video, index) => (
-

{video.title}

-

{video.description.substring(0, 100)}...

+

{video.subject}

+

{video.topics}...