From 9b9e119adcac9b5b9c0f70ebbc1e190689adfef5 Mon Sep 17 00:00:00 2001 From: Charles Tang Date: Sat, 13 Jan 2024 12:23:55 -0500 Subject: [PATCH 1/8] cards! --- package-lock.json | 8 +-- src/DataParse/ClassCard.css | 3 + src/DataParse/ClassCard.js | 79 +++++++++++++++++++++++++ src/DataParse/DataParse.js | 95 ++++++------------------------ src/DataParse/ProfessorRating.json | 22 +++++++ 5 files changed, 126 insertions(+), 81 deletions(-) create mode 100644 src/DataParse/ClassCard.css create mode 100644 src/DataParse/ClassCard.js create mode 100644 src/DataParse/ProfessorRating.json diff --git a/package-lock.json b/package-lock.json index 4092794..5108097 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17602,16 +17602,16 @@ } }, "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "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": ">=14.17" + "node": ">=4.2.0" } }, "node_modules/unbox-primitive": { diff --git a/src/DataParse/ClassCard.css b/src/DataParse/ClassCard.css new file mode 100644 index 0000000..74a53c5 --- /dev/null +++ b/src/DataParse/ClassCard.css @@ -0,0 +1,3 @@ +.less-margin { + margin: 0 0 0 0; +} \ No newline at end of file diff --git a/src/DataParse/ClassCard.js b/src/DataParse/ClassCard.js new file mode 100644 index 0000000..c1bcb46 --- /dev/null +++ b/src/DataParse/ClassCard.js @@ -0,0 +1,79 @@ +import { useState, useEffect } from "react"; +import { useNavigate } from "react-router"; +import { Card, Progress } from 'antd'; +import { CodeOutlined, PlusSquareOutlined, InfoCircleOutlined } from '@ant-design/icons'; + +import data from './prod-data.json'; +import './ClassCard.css'; + +const ClassCard = ({index}) => { + + + + const [OSCARatings, setOscarRatings] = useState([0, 0, 0]); + //console.log(data["Report_Entry"][index]); + + const getCourseDescription = (inputString) => { + const endIndex = inputString.toLowerCase().indexOf("recommended background"); + const firstString = inputString.slice(0, endIndex); + const lastString = inputString.slice(endIndex,) + return [firstString, lastString]; + } + + const getOSCARRatings = () => { + const temp = [Math.round(Math.random() * 100), Math.round(Math.random() * 100), 0]; + temp[2] = 0.6 * temp[0] + 0.4 * temp[1]; + return temp; + } + + useEffect(() => { + // Call the function once on component mount + setOscarRatings(getOSCARRatings()); + }, []); + + + return ( + <> + + } + actions={[{}, {}]} + bodyStyle={{ + padding: 5, + lineHeight: 1, + margin: 0, + }} + headStyle={{ + fontSize: 15, + color: "white", + background: + "#716868", + }} + style={{ + width: 300, + }} + > +

Professor: {data["Report_Entry"][index]["Instructors"] ? data["Report_Entry"][index]["Instructors"] : "None Assigned"}

+

{data["Report_Entry"][index]["Offering_Period"]}

+ {/*

{getCourseDescription(data["Report_Entry"][index]["Course_Description"].replace(/<\/?[^>]+(>|$)/g, " "))[0]}

*/} + {/*

{getCourseDescription(data["Report_Entry"][index]["Course_Description"].replace(/<\/?[^>]+(>|$)/g, " "))[1]}

*/} + + {data["Report_Entry"][index]["Instructors"] !== "" && ( +
+

Professor Difficulty

+ (Math.round(percent / 2) / 10) + "/5"} status="active" strokeColor="#716868" /> +

Class Difficulty

+ (Math.round(percent / 2) / 10) + "/5"} status="active" strokeColor="#716868" /> +

Projected Difficulty

+ (Math.round(percent / 2) / 10) + "/5"} status="active" strokeColor="#716868" /> +
)} +
+ + ); + +} + +export default ClassCard; \ No newline at end of file diff --git a/src/DataParse/DataParse.js b/src/DataParse/DataParse.js index be59933..422dc6f 100644 --- a/src/DataParse/DataParse.js +++ b/src/DataParse/DataParse.js @@ -1,94 +1,35 @@ import { useState, useEffect } from "react"; import { useNavigate } from "react-router"; -import { Card, Progress } from 'antd'; -import { CodeOutlined, PlusSquareOutlined } from '@ant-design/icons'; +import ClassCard from "./ClassCard"; +import { Pagination } from 'antd'; import data from './prod-data.json'; +function DataParse({ course_code }) { -const SingleClassCard = ({ index }) => { + const [currentSlide, setCurrentSlide] = useState(0); - const [OSCARatings, setOscarRatings] = useState([0, 0, 0]); - //console.log(data["Report_Entry"][index]); - - const getCourseDescription = (inputString) => { - const endIndex = inputString.toLowerCase().indexOf("recommended background"); - const firstString = inputString.slice(0, endIndex); - const lastString = inputString.slice(endIndex,) - return [firstString, lastString]; - } - - const getOSCARRatings = () => { - const temp = [Math.round(Math.random() * 100), Math.round(Math.random() * 100), 0]; - temp[2] = 0.6 * temp[0] + 0.4 * temp[1]; - return temp; - } + let classComponents = []; + let [arraything, setArrayThing] = useState([]);// [450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460 useEffect(() => { // Call the function once on component mount - setOscarRatings(getOSCARRatings()); - }, []); - - - return ( - <> - - } - actions={[{}]} - bodyStyle={{ - padding: 5, - lineHeight: 1, - margin: 0, - }} - headStyle={{ - fontSize: 15, - color: "white", - background: - "#716868", - }} - style={{ - width: 300, - }} - > -

Professor: {data["Report_Entry"][index]["Instructors"] ? data["Report_Entry"][index]["Instructors"] : "None Assigned"}

- {/*

{getCourseDescription(data["Report_Entry"][index]["Course_Description"].replace(/<\/?[^>]+(>|$)/g, " "))[0]}

*/} - {/*

{getCourseDescription(data["Report_Entry"][index]["Course_Description"].replace(/<\/?[^>]+(>|$)/g, " "))[1]}

*/} - - {data["Report_Entry"][index]["Instructors"] !== "" && ( -
-

Professor Difficulty

- (Math.round(percent / 2) / 10) + "/5"} status="active" strokeColor="#716868" /> -

Class Difficulty

- (Math.round(percent / 2) / 10) + "/5"} status="active" strokeColor="#716868" /> -

Projected Difficulty

- (Math.round(percent / 2) / 10) + "/5"} status="active" strokeColor="#716868" /> -
)} - -
-

When: {data["Report_Entry"][index]["Offering_Period"]}

- - ); - -} -function DataParse({ index }) { - - const classComponents = []; - - // Loop through indices 450 to 500 - for (let i = 450; i <= 500; i++) { - if (data["Report_Entry"][i]["Instructional_Format"] === "Laboratory") { - continue; + for (let i = 0; i < data["Report_Entry"].length; i++) { + // console.log(data["Report_Entry"][i]["Course_Title"].slice(0, data["Report_Entry"][i]["Course_Title"].indexOf(" - ")).trim()); + if (data["Report_Entry"][i] && data["Report_Entry"][i]["Course_Title"].slice(0, data["Report_Entry"][i]["Course_Title"].indexOf(" - ")).trim() === course_code) { + classComponents.push(); + } } - classComponents.push(); - } + setArrayThing(classComponents); + }, [course_code, data]); return ( <> - {classComponents} + {arraything[currentSlide]} + {/* {classComponents.map((value) => ( + + ))} */} + {arraything.length > 0 && setCurrentSlide(page)} />} ); } diff --git a/src/DataParse/ProfessorRating.json b/src/DataParse/ProfessorRating.json new file mode 100644 index 0000000..0743c67 --- /dev/null +++ b/src/DataParse/ProfessorRating.json @@ -0,0 +1,22 @@ +{ + "Gillian Smith" : 92, + "Matthew Ahrens":88, + "Taylor Andrews":84, + "Herman Servatius":10, + "Shubbhi Taneja":75, + "Michael Engling":89, + "Yu-Shan Sun":68, + "Jennifer Mortensen":83, + "Mark Sheahan":0, + "Erin Solovey":84, + "Lane Harrison":0, + "Paul Delvy":83, + "Micha Hofri":20, + "Keith Pray":73, + "Joshua Cuneo":75, + "Rose Bohrer":78, + "Rodica Neamtu":84, + "Sakire Arslan Ay":0, + "Xiaoyan Sun":0, + "Wilson Wong":0 +} \ No newline at end of file From a651ea8775e6e10d8463e5abe3989189b58c3e7e Mon Sep 17 00:00:00 2001 From: Charles Tang Date: Sat, 13 Jan 2024 13:48:56 -0500 Subject: [PATCH 2/8] updated card w real content --- src/DataParse/ClassCard.js | 26 +- src/DataParse/CourseRatings.json | 769 +++++++++++++++++++++++++++++ src/DataParse/DataParse.js | 7 +- src/DataParse/ProfessorRating.json | 548 +++++++++++++++++++- 4 files changed, 1316 insertions(+), 34 deletions(-) create mode 100644 src/DataParse/CourseRatings.json diff --git a/src/DataParse/ClassCard.js b/src/DataParse/ClassCard.js index c1bcb46..3524cfa 100644 --- a/src/DataParse/ClassCard.js +++ b/src/DataParse/ClassCard.js @@ -4,12 +4,14 @@ import { Card, Progress } from 'antd'; import { CodeOutlined, PlusSquareOutlined, InfoCircleOutlined } from '@ant-design/icons'; import data from './prod-data.json'; +import profRatings from './ProfessorRating.json'; +import classRatings from './CourseRatings.json'; import './ClassCard.css'; -const ClassCard = ({index}) => { - - +const ClassCard = ({ index }) => { + const courseCode = data["Report_Entry"][index]["Course_Title"].slice(0, data["Report_Entry"][index]["Course_Title"].indexOf(" - ")).trim(); + const professor = data["Report_Entry"][index]["Instructors"] ? data["Report_Entry"][index]["Instructors"] : ""; const [OSCARatings, setOscarRatings] = useState([0, 0, 0]); //console.log(data["Report_Entry"][index]); @@ -21,13 +23,17 @@ const ClassCard = ({index}) => { } const getOSCARRatings = () => { - const temp = [Math.round(Math.random() * 100), Math.round(Math.random() * 100), 0]; - temp[2] = 0.6 * temp[0] + 0.4 * temp[1]; - return temp; + // const temp = [Math.round(Math.random() * 100), Math.round(Math.random() * 100), 0]; + // temp[2] = 0.6 * temp[0] + 0.4 * temp[1]; + // return temp; + const courseRating = classRatings[courseCode] ? classRatings[courseCode] : Math.round(Math.random() * 100); + const profRating = profRatings[professor] ? profRatings[professor] : Math.round(Math.random() * 100); + const projRating = 0.6 * profRating + 0.4 * courseRating; + + return [profRating, courseRating, projRating] } useEffect(() => { - // Call the function once on component mount setOscarRatings(getOSCARRatings()); }, []); @@ -63,11 +69,11 @@ const ClassCard = ({index}) => { {data["Report_Entry"][index]["Instructors"] !== "" && (
-

Professor Difficulty

+

Professor Rating

(Math.round(percent / 2) / 10) + "/5"} status="active" strokeColor="#716868" /> -

Class Difficulty

+

Class Rating

(Math.round(percent / 2) / 10) + "/5"} status="active" strokeColor="#716868" /> -

Projected Difficulty

+

Projected Rating

(Math.round(percent / 2) / 10) + "/5"} status="active" strokeColor="#716868" />
)} diff --git a/src/DataParse/CourseRatings.json b/src/DataParse/CourseRatings.json new file mode 100644 index 0000000..b47090a --- /dev/null +++ b/src/DataParse/CourseRatings.json @@ -0,0 +1,769 @@ +{ + "AB 1533": 54, + "AB 2533": 75, + "ACC 2060": 78, + "AE 2310": 22, + "AE 2320": 59, + "AE 2550": 35, + "AE 3430": 47, + "AE 4310": 50, + "AE 4320": 63, + "AE 4410": 26, + "AE 5032": 48, + "AE 5131": 40, + "AE 5132": 92, + "AE 5231": 57, + "AE 5232": 93, + "AE 5331": 81, + "AE 5332": 52, + "AE 5431": 44, + "AE 6093": 49, + "AR 1100": 52, + "AR 1101": 45, + "AR 140X": 39, + "AR 2048": 70, + "AR 2101": 26, + "AR 2111": 24, + "AR 2115": 63, + "AR 2202": 55, + "AR 2222": 98, + "AR 2301": 34, + "AR 2333": 42, + "AR 2401": 29, + "AR 2750": 30, + "AR 3112": 90, + "AR 3222": 44, + "AR 3333": 61, + "AR 3700": 27, + "AREN 2023": 60, + "AREN 2025": 74, + "AREN 3002": 63, + "AREN 3003": 95, + "AREN 3022": 65, + "AREN 3024": 33, + "AS 1003": 61, + "AS 1004": 62, + "AS 2003": 94, + "AS 2004": 86, + "AS 3003": 100, + "AS 3004": 25, + "AS 4003": 80, + "AS 4004": 75, + "BB 1001": 33, + "BB 1002": 53, + "BB 1025": 95, + "BB 1035": 52, + "BB 1045": 24, + "BB 2003": 56, + "BB 2030": 77, + "BB 2040": 25, + "BB 2550": 60, + "BB 2903": 31, + "BB 2904": 22, + "BB 2920": 38, + "BB 292X": 45, + "BB 2950": 27, + "BB 3010": 54, + "BB 3102": 94, + "BB 3120": 92, + "BB 3140": 80, + "BB 3513": 94, + "BB 3515": 36, + "BB 3517": 76, + "BB 3526": 79, + "BB 3570": 87, + "BB 3920": 85, + "BB 4170": 60, + "BB 4190": 67, + "BB 4900": 86, + "BB 501": 60, + "BB 505": 76, + "BB 508": 86, + "BB 509": 61, + "BB 554": 84, + "BB 561": 34, + "BB 570": 47, + "BB 581": 69, + "BB 590": 39, + "BCB 3010": 57, + "BCB 501": 87, + "BCB 510": 52, + "BCB 590": 94, + "BME 1004": 71, + "BME 2001": 25, + "BME 2210": 78, + "BME 2211": 43, + "BME 2502": 25, + "BME 3012": 53, + "BME 3013": 60, + "BME 301X": 97, + "BME 3111": 56, + "BME 3300": 59, + "BME 3503": 47, + "BME 3505": 99, + "BME 3506": 41, + "BME 3605": 22, + "BME 360X": 60, + "BME 3610": 35, + "BME 3811": 96, + "BME 3813": 23, + "BME 4201": 93, + "BME 4504": 27, + "BME 4606": 70, + "BME 4701": 22, + "BME 481X": 87, + "BME 4828": 78, + "BME 4831": 36, + "BME 531": 29, + "BME 532": 62, + "BME 533": 84, + "BME 550": 75, + "BME 552": 87, + "BME 560": 30, + "BME 580": 23, + "BME 583": 40, + "BME 591": 74, + "BUS 1020": 44, + "BUS 2001": 65, + "BUS 2020": 26, + "BUS 2080": 99, + "BUS 500": 87, + "BUS 596": 37, + "BUS 632": 22, + "BUS 691": 74, + "CE 2002": 40, + "CE 3006": 21, + "CE 3010": 48, + "CE 3022": 34, + "CE 3026": 28, + "CE 3030": 26, + "CE 3044": 82, + "CE 3050": 34, + "CE 3061": 71, + "CE 3062": 95, + "CE 4007": 36, + "CE 4060": 85, + "CE 4063": 23, + "CE 4071": 87, + "CE 4600": 34, + "CE 501": 74, + "CE 5303": 61, + "CE 534": 37, + "CE 542": 67, + "CE 583": 67, + "CE 584": 93, + "CE 587": 20, + "CE 590": 26, + "CH 1010": 31, + "CH 1020": 78, + "CH 1030": 30, + "CH 1040": 92, + "CH 2320": 64, + "CH 2330": 90, + "CH 2360": 59, + "CH 2660": 26, + "CH 2670": 76, + "CH 3530": 76, + "CH 4120": 82, + "CH 4140": 63, + "CH 4150": 40, + "CH 4170": 64, + "CH 4190": 58, + "CH 4420": 81, + "CH 4520": 45, + "CH 516": 53, + "CH 520": 41, + "CH 536": 24, + "CH 540": 98, + "CH 555": 53, + "CH 571": 59, + "CHE 2013": 89, + "CHE 2014": 25, + "CHE 3201": 26, + "CHE 3301": 35, + "CHE 3501": 61, + "CHE 3722": 72, + "CHE 4063": 29, + "CHE 4405": 36, + "CHE 502": 73, + "CHE 503": 48, + "CHE 504": 96, + "CHE 521": 52, + "CHE 565": 27, + "CHE 571": 27, + "CHE 580": 54, + "CN 1543": 47, + "CN 2541": 82, + "CN 2544": 20, + "CN 3541": 100, + "CN 357X": 59, + "CP 1000": 27, + "CS 1004": 92, + "CS 1101": 87, + "CS 2011": 28, + "CS 2022": 27, + "CS 2102": 93, + "CS 2119": 70, + "CS 2223": 81, + "CS 2301": 67, + "CS 2303": 82, + "CS 3013": 22, + "CS 3041": 36, + "CS 3043": 57, + "CS 3133": 81, + "CS 3431": 94, + "CS 3516": 71, + "CS 3733": 96, + "CS 4032": 91, + "CS 4123": 59, + "CS 4233": 23, + "CS 4241": 34, + "CS 4341": 67, + "CS 4342": 98, + "CS 4401": 74, + "CS 4432": 47, + "CS 4433": 33, + "CS 4513": 36, + "CS 4516": 85, + "CS 4731": 65, + "CS 4801": 80, + "CS 4804": 48, + "CS 5003": 95, + "CS 5007": 25, + "CS 502": 44, + "CS 503": 48, + "CS 5084": 99, + "CS 509": 52, + "CS 525": 34, + "CS 534": 80, + "CS 539": 21, + "CS 541": 89, + "CS 542": 46, + "CS 545": 95, + "CS 546": 22, + "CS 548": 56, + "CS 549": 35, + "CS 558": 85, + "CS 571": 38, + "CS 573": 86, + "CS 585": 45, + "CS 586": 50, + "CS 587": 57, + "CS 588": 82, + "CS 673": 93, + "DEV 2200": 36, + "DEV 520": 24, + "DEV 530": 50, + "DEV 540": 27, + "DS 1010": 48, + "DS 2010": 49, + "DS 3010": 64, + "DS 4433": 21, + "DS 4635": 49, + "DS 501": 94, + "DS 502": 48, + "DS 503": 48, + "DS 504": 91, + "DS 541": 58, + "DS 577": 36, + "DS 595": 32, + "DS 598": 87, + "ECE 2010": 52, + "ECE 2019": 48, + "ECE 2029": 94, + "ECE 2049": 20, + "ECE 2112": 88, + "ECE 2201": 53, + "ECE 2305": 21, + "ECE 2311": 76, + "ECE 2312": 50, + "ECE 2799": 59, + "ECE 3012": 71, + "ECE 3204": 27, + "ECE 3829": 57, + "ECE 3849": 100, + "ECE 4305": 33, + "ECE 4503": 58, + "ECE 4801": 94, + "ECE 4802": 86, + "ECE 503": 26, + "ECE 5105": 34, + "ECE 5204": 70, + "ECE 524": 54, + "ECE 5312": 62, + "ECE 545": 78, + "ECE 5500": 43, + "ECE 5511": 97, + "ECE 5520": 95, + "ECE 5522": 87, + "ECE 5530": 48, + "ECE 5532": 81, + "ECE 5540": 25, + "ECE 5723": 50, + "ECE 5724": 71, + "ECE 577": 74, + "ECE 579": 43, + "ECE 588": 85, + "ECE 596": 54, + "ECE 673": 26, + "ECON 1110": 53, + "ECON 2120": 77, + "ECON 2126": 34, + "ECON 2130": 39, + "ECON 2155": 56, + "ECON 3100": 38, + "EDU 220X": 46, + "EDU 230X": 97, + "EN 1219": 100, + "EN 1251": 73, + "EN 2219": 26, + "EN 2271": 27, + "EN 241X": 27, + "EN 3219": 58, + "EN 3257": 23, + "EN 3271": 44, + "ENV 2201": 57, + "ENV 2319": 70, + "ENV 2700": 31, + "ENV 2900": 45, + "ES 1310": 82, + "ES 1500": 47, + "ES 2001": 71, + "ES 202X": 72, + "ES 2501": 58, + "ES 2502": 81, + "ES 2503": 25, + "ES 3001": 58, + "ES 3002": 100, + "ES 3003": 87, + "ES 3004": 61, + "ES 3011": 79, + "ES 3323": 38, + "ESL 500": 68, + "ETR 1100": 27, + "ETR 2900": 95, + "ETR 491X": 87, + "ETR 4930": 66, + "ETR 593": 26, + "FIN 1250": 91, + "FIN 2070": 68, + "FIN 500": 27, + "FP 3070": 41, + "FP 4001": 33, + "FP 553": 54, + "FP 555": 54, + "FP 571": 90, + "FP 575": 38, + "FP 580": 51, + "FY 1101": 54, + "FY 1800": 85, + "GE 2341": 52, + "GN 2511": 91, + "GN 2512": 54, + "GN 3514": 90, + "GOV 1301": 91, + "GOV 1320": 78, + "GOV 2314": 77, + "GOV 2319": 54, + "HI 1314": 25, + "HI 2310": 95, + "HI 2314": 76, + "HI 2315": 23, + "HI 2320": 70, + "HI 2329": 26, + "HI 2335": 35, + "HI 2350": 44, + "HI 2900": 49, + "HI 2913": 35, + "HI 2930": 60, + "HI 3312": 37, + "HI 3314": 42, + "HI 331X": 82, + "HI 3335": 98, + "HI 3343": 23, + "HU 1500": 40, + "HU 2222": 77, + "HU 2258": 75, + "HU 2501": 37, + "HU 250X": 94, + "HU 2901": 58, + "HU 3900": 87, + "HU 3910": 42, + "ID 2050": 57, + "ID 2314": 70, + "ID 3527": 40, + "ID 3529": 64, + "ID 4000": 84, + "ID 500": 93, + "IMGD 1000": 76, + "IMGD 1001": 48, + "IMGD 1002": 72, + "IMGD 2000": 96, + "IMGD 2030": 71, + "IMGD 2048": 36, + "IMGD 2101": 63, + "IMGD 2222": 53, + "IMGD 2333": 80, + "IMGD 2450": 88, + "IMGD 2900": 91, + "IMGD 2905": 57, + "IMGD 3000": 88, + "IMGD 3030": 24, + "IMGD 3222": 53, + "IMGD 3333": 75, + "IMGD 3700": 84, + "IMGD 4000": 24, + "IMGD 4099": 98, + "IMGD 4200": 88, + "IMGD 4500": 42, + "IMGD 4600": 62, + "IMGD 4700": 74, + "IMGD 5000": 55, + "IMGD 5200": 23, + "IMGD 5500": 22, + "IMGD 5600": 24, + "IMGD 6001": 26, + "INTL 1100": 40, + "INTL 2100": 44, + "INTL 2210": 88, + "INTL 2910": 93, + "INTL 3050": 61, + "INTL 4100": 49, + "ISE 1801": 91, + "ISE 1803": 45, + "ISE 2810": 86, + "JP 120X": 28, + "JP 200X": 58, + "MA 1021": 24, + "MA 1022": 45, + "MA 1023": 49, + "MA 1024": 66, + "MA 1120": 73, + "MA 1801": 72, + "MA 1971": 45, + "MA 2051": 34, + "MA 2071": 58, + "MA 2072": 71, + "MA 2073": 72, + "MA 2201": 84, + "MA 2210": 66, + "MA 2251": 68, + "MA 2273": 70, + "MA 2611": 30, + "MA 2612": 99, + "MA 2621": 59, + "MA 2631": 63, + "MA 3212": 50, + "MA 322X": 66, + "MA 3257": 88, + "MA 3471": 92, + "MA 3627": 49, + "MA 3825": 43, + "MA 3831": 77, + "MA 3832": 31, + "MA 4216": 87, + "MA 4235": 31, + "MA 4291": 52, + "MA 4632": 91, + "MA 4635": 90, + "MA 464X": 65, + "MA 4891": 90, + "MA 501": 63, + "MA 511": 36, + "MA 514": 21, + "MA 529": 40, + "MA 541": 70, + "MA 542": 49, + "MA 543": 75, + "MA 556": 28, + "MA 557": 98, + "MA 559": 56, + "MA 590": 44, + "ME 1800": 75, + "ME 2300": 35, + "ME 2820": 37, + "ME 3310": 52, + "ME 3311": 98, + "ME 3320": 68, + "ME 3506": 81, + "ME 3901": 45, + "ME 4320": 22, + "ME 4322": 92, + "ME 4323": 76, + "ME 4324": 25, + "ME 4429": 86, + "ME 4504": 30, + "ME 4506": 29, + "ME 4606": 73, + "ME 4840": 88, + "ME 4875": 73, + "ME 501": 43, + "ME 5108": 78, + "ME 516": 85, + "ME 5200": 52, + "ME 5205": 38, + "ME 521": 91, + "ME 530": 93, + "ME 5303": 99, + "ME 5304": 37, + "ME 5358": 93, + "ME 5361": 64, + "ME 5370": 30, + "ME 5385": 25, + "ME 5420": 98, + "ME 5441": 51, + "ME 550": 90, + "ME 5503": 33, + "ME 552": 83, + "ME 591": 72, + "MFE 500": 51, + "MFE 5385": 40, + "MFE 541": 25, + "MFE 5420": 35, + "MFE 5841": 36, + "MIS 2300": 45, + "MIS 3010": 83, + "MIS 3720": 77, + "MIS 4084": 35, + "MIS 4720": 67, + "MIS 500": 35, + "MIS 502": 25, + "MIS 510": 78, + "MIS 571": 86, + "MIS 573": 73, + "MIS 576": 26, + "MIS 581": 73, + "MIS 583": 76, + "MIS 584": 20, + "MKT 3640": 97, + "MKT 4030": 81, + "MKT 500": 39, + "MKT 565": 45, + "MKT 568": 74, + "MKT 569": 64, + "ML 1021": 77, + "ML 1022": 98, + "ML 2021": 61, + "ML 2022": 28, + "ML 3021": 82, + "ML 3022": 57, + "ML 4023": 78, + "ML 4024": 31, + "MME 518": 22, + "MME 525": 65, + "MME 528": 69, + "MME 531": 23, + "MTE 5385": 50, + "MTE 540": 51, + "MTE 5420": 52, + "MTE 550": 68, + "MTE 558": 98, + "MTE 561": 83, + "MTE 575": 55, + "MTE 580": 34, + "MTE 5841": 90, + "MTE 5844": 60, + "MTE 594": 31, + "MU 1511": 87, + "MU 1611": 64, + "MU 2300": 23, + "MU 2611": 92, + "MU 2631": 73, + "MU 2632": 54, + "MU 2633": 57, + "MU 2636": 91, + "MU 2637": 43, + "MU 2638": 35, + "MU 2639": 94, + "MU 2640": 80, + "MU 2641": 26, + "MU 2642": 91, + "MU 2643": 41, + "MU 2644": 45, + "MU 2722": 24, + "MU 2723": 53, + "MU 3001": 48, + "MU 3615": 44, + "MU 3616": 52, + "NEU 502": 48, + "NEU 505": 40, + "NEU 590": 54, + "NSE 515": 56, + "NSE 560": 31, + "OBC 1010": 21, + "OBC 4367": 30, + "OBC 505": 42, + "OBC 506": 84, + "OBC 533": 56, + "OIE 2081": 73, + "OIE 2850": 21, + "OIE 3020": 26, + "OIE 3405": 21, + "OIE 3410": 94, + "OIE 3420": 27, + "OIE 3510": 49, + "OIE 4410": 21, + "OIE 4460": 83, + "OIE 501": 51, + "OIE 542": 57, + "OIE 548": 63, + "OIE 549": 88, + "OIE 553": 87, + "OIE 558": 37, + "OIE 597": 63, + "PH 1110": 22, + "PH 1111": 91, + "PH 1120": 25, + "PH 1121": 23, + "PH 1130": 95, + "PH 1140": 84, + "PH 1150": 26, + "PH 2101": 74, + "PH 2201": 36, + "PH 2510": 52, + "PH 2520": 72, + "PH 2550": 89, + "PH 2651": 98, + "PH 3206": 52, + "PH 3401": 24, + "PH 3402": 52, + "PH 3503": 34, + "PH 3504": 24, + "PH 515": 62, + "PH 544": 57, + "PH 563": 43, + "PH 571": 75, + "PH 580": 30, + "PH 597": 76, + "PSY 1400": 78, + "PSY 1401": 55, + "PSY 1402": 61, + "PSY 1412": 30, + "PSY 1504": 97, + "PSY 1800": 70, + "PSY 2408": 95, + "PSY 2800": 63, + "PSY 4800": 44, + "PSY 504": 91, + "PSY 590": 34, + "PY 1731": 40, + "PY 2712": 64, + "PY 2713": 86, + "PY 2716": 42, + "PY 2717": 49, + "PY 2718": 87, + "PY 3711": 33, + "PY 3721": 28, + "RBE 1001": 55, + "RBE 2001": 87, + "RBE 2002": 73, + "RBE 3001": 62, + "RBE 3002": 49, + "RBE 3100": 57, + "RBE 4322": 54, + "RBE 470X": 23, + "RBE 4815": 67, + "RBE 500": 94, + "RBE 501": 68, + "RBE 502": 34, + "RBE 521": 41, + "RBE 530": 87, + "RBE 549": 78, + "RBE 550": 51, + "RBE 580": 55, + "RBE 594": 32, + "RBE 595": 68, + "RE 1731": 64, + "RE 2716": 67, + "RE 2721": 58, + "RE 3711": 69, + "RE 3721": 85, + "SD 550": 50, + "SEME 504": 60, + "SEME 525": 73, + "SP 1523": 71, + "SP 1524": 72, + "SP 3521": 22, + "SP 3522": 86, + "SP 3527": 67, + "SP 3529": 87, + "SS 1505": 51, + "STS 1200": 99, + "STS 4000": 31, + "SYS 501": 24, + "SYS 502": 79, + "SYS 510": 29, + "SYS 511": 86, + "SYS 512": 68, + "SYS 520": 33, + "SYS 521": 86, + "SYS 540": 35, + "SYS 585": 65, + "TH 2100": 55, + "TH 2500": 60, + "TH 310X": 91, + "TH 3300": 93, + "TH 360X": 24, + "WPE 1003": 98, + "WPE 1008": 62, + "WPE 1009": 76, + "WPE 1011": 42, + "WPE 1012": 64, + "WPE 1013": 95, + "WPE 1018": 79, + "WPE 1019": 74, + "WPE 1054": 65, + "WPE 1055": 89, + "WPE 1059": 67, + "WPE 1070": 72, + "WPE 1077": 61, + "WPE 1080": 84, + "WPE 1099": 97, + "WPE 1200": 63, + "WPE 1201": 67, + "WPE 1203": 41, + "WPE 1204": 43, + "WPE 1206": 39, + "WPE 1207": 35, + "WPE 1209": 79, + "WPE 1210": 97, + "WPE 1211": 82, + "WPE 1212": 39, + "WPE 1213": 88, + "WPE 1214": 78, + "WPE 1216": 61, + "WPE 1221": 96, + "WPE 1224": 75, + "WPE 1225": 51, + "WPE 1230": 48, + "WPE 1232": 66, + "WPE 1233": 52, + "WPE 1234": 28, + "WPE 1235": 72, + "WPE 1236": 37, + "WPE 1611": 80, + "WPE 1612": 84, + "WPE 1699": 79, + "WPE 2007": 67, + "WPE 2008": 87, + "WPE 2009": 29, + "WPE 2010": 50, + "WPE 2011": 82, + "WPE 2012": 82, + "WPE 2013": 53, + "WPE 2014": 23, + "WPE 2015": 87, + "WPE 2016": 33, + "WR 1010": 42, + "WR 1011": 94, + "WR 2010": 65, + "WR 2210": 44, + "WR 241X": 53, + "WR 2450": 40, + "WR 253X": 87, + "WR 3210": 80, + "WR 3214": 27, + "WR 3300": 92, + "WR 4210": 94, + "WR 513": 25 +} \ No newline at end of file diff --git a/src/DataParse/DataParse.js b/src/DataParse/DataParse.js index 422dc6f..2638fc3 100644 --- a/src/DataParse/DataParse.js +++ b/src/DataParse/DataParse.js @@ -9,14 +9,15 @@ function DataParse({ course_code }) { const [currentSlide, setCurrentSlide] = useState(0); - let classComponents = []; + let classComponents = []; let [arraything, setArrayThing] = useState([]);// [450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460 useEffect(() => { // Call the function once on component mount for (let i = 0; i < data["Report_Entry"].length; i++) { // console.log(data["Report_Entry"][i]["Course_Title"].slice(0, data["Report_Entry"][i]["Course_Title"].indexOf(" - ")).trim()); - if (data["Report_Entry"][i] && data["Report_Entry"][i]["Course_Title"].slice(0, data["Report_Entry"][i]["Course_Title"].indexOf(" - ")).trim() === course_code) { + if (data["Report_Entry"][i] && data["Report_Entry"][i]["Course_Title"].slice(0, data["Report_Entry"][i]["Course_Title"].indexOf(" - ")).trim() === course_code + && data["Report_Entry"][i]["Instructor"] !== "") { classComponents.push(); } } @@ -25,7 +26,7 @@ function DataParse({ course_code }) { return ( <> - {arraything[currentSlide]} + {arraything[currentSlide]} {/* {classComponents.map((value) => ( ))} */} diff --git a/src/DataParse/ProfessorRating.json b/src/DataParse/ProfessorRating.json index 0743c67..0ffa757 100644 --- a/src/DataParse/ProfessorRating.json +++ b/src/DataParse/ProfessorRating.json @@ -1,22 +1,528 @@ { - "Gillian Smith" : 92, - "Matthew Ahrens":88, - "Taylor Andrews":84, - "Herman Servatius":10, - "Shubbhi Taneja":75, - "Michael Engling":89, - "Yu-Shan Sun":68, - "Jennifer Mortensen":83, - "Mark Sheahan":0, - "Erin Solovey":84, - "Lane Harrison":0, - "Paul Delvy":83, - "Micha Hofri":20, - "Keith Pray":73, - "Joshua Cuneo":75, - "Rose Bohrer":78, - "Rodica Neamtu":84, - "Sakire Arslan Ay":0, - "Xiaoyan Sun":0, - "Wilson Wong":0 -} \ No newline at end of file + "Mohammed El Hamzaoui": 51, + "Nii Ollenu": 66, + "Raghvendra Cowlagi": 83, + "Ye Lu": 41, + "Hektor Kashuri": 90, + "Nikhil Karanjgaokar": 41, + "Zhangxian Yuan": 32, + "Michael Demetriou": 96, + "Jagannath Jayachandran": 53, + "Nikolaos Gatsonis": 87, + "Zachary Taillefer": 89, + "John Blandino": 30, + "Mark Richman": 63, + "Marie Keller": 68, + "Robyn Thomas": 45, + "Susan Hong-Sammons": 56, + "Nick Carter": 90, + "Matthew Steinke": 37, + "Roshanak Bigonah": 90, + "Farley Chery": 62, + "Michelle Borowski": 46, + "David Samson": 72, + "Ralph Sutter": 32, + "Adryen Gonzalez": 30, + "Joshua Rosenstock": 42, + "Edward Gutierrez": 48, + "Steven Van Dessel": 39, + "Soroush Farzin": 63, + "Nan Ma": 63, + "Shichao Liu": 93, + "Adam Messer": 99, + "Matthew Anderson": 37, + "Ashley Olson": 36, + "Chris Collins": 71, + "Michael Buckholt": 51, + "Louis Roberts": 89, + "Marja Bakermans": 75, + "Scarlet Shell": 94, + "Pamela Weathers": 97, + "Lauren Mathews": 39, + "Jill Rulfs": 47, + "Shane McInally": 31, + "Inna Nechipurenko": 72, + "Joseph Cullon": 74, + "Natalie Farny": 58, + "Elizabeth Ryder": 64, + "Tanja Dominko": 91, + "Luis Vidali": 66, + "Carl Moxey": 87, + "Floyd Brownewell": 63, + "JoAnn Whitefleet-Smith": 33, + "Destin Heilman": 73, + "Jean-Francois Hamel": 44, + "Joseph Duffy": 36, + "Masha Fridkis-Hareli": 71, + "Mia Bosinger": 72, + "Sam Walcott": 76, + "Dmitry Korkin": 65, + "Taimoor Afzal": 36, + "Yonghui Ding": 57, + "Dirk Albrecht": 71, + "Adam Lammert": 59, + "John Obayemi": 83, + "Sakthikumar Ambady": 86, + "Brenton Faber": 58, + "Zoe Reidinger": 64, + "Karen Troy": 34, + "Raymond Page": 30, + "Diana Alatalo": 47, + "Zhenglun Alan Wei": 90, + "Brian Savilonis": 48, + "Catherine Whittington": 86, + "George Pins": 42, + "Kevin Cornwell": 99, + "Doug Ferguson": 46, + "Yihao Zheng": 36, + "Adriana Hera": 48, + "Mohammed Salman Shazeeb": 77, + "Christopher Nycz": 39, + "Edward Gonsalves": 93, + "Sandhya Balasubramanian": 44, + "Robert Lombardi": 75, + "Marco Bonilla": 54, + "Michael Ahern": 84, + "James McKenna": 75, + "Kenny Ching": 85, + "Purvi Shah": 40, + "Joe Zhu": 98, + "Tahar El-Korchi": 96, + "Leonard Albano": 68, + "Ajmal Paktiawal": 78, + "Jessica Rosewitz": 43, + "Mingjiang Tao": 87, + "Suzanne LePage": 31, + "John Bergendahl": 34, + "Laila Abu-Lail": 67, + "Nima Rahbar": 89, + "Jeanine Dudle": 83, + "Stephen Kmiotek": 45, + "John Sullivan": 75, + "Paul Mathisen": 70, + "Brian O'Rourke": 80, + "Richard Gram": 39, + "Michael Christiansen": 76, + "Luciana Burdi": 41, + "Harold Walker": 58, + "Alissa Richard": 38, + "Uma Kumar": 42, + "Raul Orduna Picon": 59, + "Ronald Grimm": 35, + "Roy Kennedy": 61, + "Elizabeth Bafaro": 65, + "Anitha Alanthadka": 79, + "Ivan Mardilovich": 55, + "George Kaminski": 50, + "Drew Brodeur": 66, + "Christopher Lambert": 67, + "John MacDonald": 60, + "Patricia Musacchio": 63, + "Jose Arguello": 63, + "Carissa Olsen": 55, + "Bruce Bursten": 100, + "Suzanne Scarlata": 58, + "James Dittami": 58, + "Alex Maag": 55, + "Susan Zhou": 64, + "Christina Bailey-Hytholt": 64, + "Eric Young": 62, + "Susan Roberts": 55, + "Anthony Dixon": 44, + "Michael Timko": 94, + "Nikolaos Kazantzis": 75, + "N. Aaron Deskins": 99, + "Walter Zurawsky": 83, + "Huili Zheng": 97, + "Hsinhan Hung": 52, + "Wen-Hua Du": 48, + "Sakire Arslan Ay": 57, + "Xiaoyan Sun": 64, + "Wilson Wong": 35, + "Zhongqiang Zhang": 44, + "Andrea Arnold": 75, + "Hanmeng Zhan": 58, + "Gary Pollice": 33, + "Xiaozhong Liu": 69, + "Xiangnan Kong": 69, + "Jun Dai": 73, + "Fabricio Murai": 98, + "Elke Rundensteiner": 69, + "Craig Wills": 78, + "Koksal Mus": 58, + "Thierry Petit": 91, + "Joseph Johnson": 63, + "Larz White": 62, + "Carlo Pinciroli": 66, + "Chun-Kit Ngan": 62, + "Kyumin Lee": 94, + "Ricky Sethi": 57, + "Mohammed A": 58, + "Ziming Zhang": 31, + "Jorge Toro": 98, + "Nitin Sanket": 64, + "Elizabeth Wilson": 84, + "Curran Kelleher": 85, + "Mohamed Eltabakh": 52, + "Yanhua Li": 85, + "George Heineman": 82, + "Berk Sunar": 47, + "Tom Hollywood": 72, + "Navneet Anand": 97, + "Mahamadou Sagna": 90, + "Achirri Ismael": 43, + "Torumoy Ghoshal": 56, + "Fatemeh Emdad": 39, + "Oren Mangoubi": 88, + "Randy Paffenroth": 76, + "Narahara Chari Dingari": 42, + "Ali Gholipour": 76, + "Sergey Makaroff": 91, + "Mostafa Asheghan": 54, + "Gregory Noetscher": 82, + "Yarkin Doroz": 59, + "Shahin Tajik": 57, + "Reinhold Ludwig": 35, + "Suat Ay": 98, + "Fatemeh Ganji": 83, + "Ted Clancy": 90, + "Bashima Islam": 30, + "Jennifer Stander": 96, + "Bo Tang": 98, + "Stephen Bitar": 32, + "Patrick Schaumont": 78, + "Alexander Wyglinski": 54, + "Vishwanath Iyer": 74, + "Fred Floru": 55, + "Ulkuhan Guler": 60, + "Gregary Prince": 96, + "Mahmood Mirheydar": 61, + "Edvina Uzunovic": 42, + "Dean Sorensen": 74, + "Fei Ding": 45, + "Zainalabedin Navabi": 65, + "Gbetonmasse Somasse": 64, + "Michael Radzicki": 81, + "Alexander Smith": 33, + "Hermine Vedogbeton": 62, + "Noemi Robertson": 99, + "Kathy Chen": 39, + "Jillian DiBonaventura": 32, + "Kate McIntyre": 34, + "Michelle Ephraim": 38, + "Joseph Aguilar": 66, + "Lance Schachterle": 73, + "Kevin Lewis": 60, + "Jim Cocola": 40, + "Trent Masiki": 42, + "Derren Rosbach": 75, + "Grant Burrier": 49, + "Robert Krueger": 93, + "Mehul Bhatia": 99, + "Alireza Ebadi": 61, + "Sarah Jane Wodin-Schwartz": 97, + "Jamie Monat": 94, + "Fiona Levey": 49, + "Jianyu Liang": 64, + "Danielle Cote": 91, + "Diana Lados": 100, + "Makhlouf Makhlouf": 52, + "Mitra Anand": 42, + "Zhikun Hou": 64, + "Lee Moradi": 57, + "Zhu Mao": 100, + "Joe Stabile": 74, + "Jiawei Yang": 81, + "Mustapha Fofana": 64, + "Cosme Furlong-Vazquez": 77, + "Selcuk Guceri": 37, + "Ananthalakshmy Krishna Moorthy": 44, + "Aswin Gnanaskandan": 97, + "Lin Cheng": 68, + "Aidin Panahi": 35, + "James Urban": 49, + "Nicholas Dembsey": 32, + "Mehdi Mortazavi": 96, + "Cagdas Onal": 46, + "Erica Stults": 55, + "Barbara Finer": 73, + "Martin Burt": 49, + "Micah Chase": 38, + "Rosanna Garcia": 70, + "Robert Sarnie": 59, + "Xin Gao": 50, + "Kwamie Dunbar": 72, + "Kathy Notarianni": 100, + "Milosh Puchovsky": 79, + "Ali Rangwala": 53, + "David Medich": 63, + "Kristin Boudreau": 44, + "David DiBiasio": 56, + "Stefano DeAngelis": 74, + "Brittany Taylor": 52, + "Malvina Piziak": 78, + "Carrick Eggleston": 55, + "Gizem Arslan": 36, + "Daniel DiMassa": 95, + "Crystal Brown": 79, + "Marie Natoli": 60, + "Steven Bullock": 61, + "Megan Sethi": 46, + "Christopher Fobare": 98, + "Alexander Herbert": 47, + "Peter Hansen": 69, + "Constance Clark": 71, + "David Spanagel": 81, + "Emily Gioielli": 66, + "Jeanne Essame": 78, + "Holger Droessler": 33, + "John Galante": 64, + "Lindsay Davis": 49, + "Chieko Nakajima": 61, + "Elizabeth Victor": 39, + "Shana Lessing": 46, + "Yunus Telliel": 76, + "James Hanlan": 32, + "Jennifer Rudolph": 40, + "Adrien Stoloff": 39, + "Rebecca Moody": 39, + "Althea Danielski": 49, + "Roger Gottlieb": 59, + "Douglas Olsen": 95, + "Lucy Caplan": 35, + "James Welu": 32, + "Sarah Lucie": 34, + "John Sanbonmatsu": 42, + "R. Maxwell Racine": 89, + "Matthew Scinto": 38, + "Scott Burton": 61, + "Dan Schimmel": 43, + "Frederick Bianchi": 61, + "V Manzo": 81, + "Joshua Rohde": 96, + "David Ibbett": 65, + "Scott Barton": 32, + "Mitchell Lutch": 71, + "Patrick Crowe": 93, + "Alejandro Manga Tinoco": 69, + "Katherine Foo": 45, + "Lorraine Higgins": 90, + "Ingrid Shockey": 95, + "William San Mart\u00edn": 82, + "Courtney Kurlanska": 95, + "Dominic Golding": 66, + "Jefferson Sphar": 47, + "Michael Miller": 72, + "Robert Hersh": 42, + "Amanda Wittman": 57, + "Melissa Butler": 84, + "Tsitsi Masvawure": 64, + "Rosemary Taylor": 81, + "Laura Bond": 91, + "Liza Boritz": 67, + "Rick Vaz": 60, + "Laura Roberts": 61, + "Nelson Torres Mesa": 62, + "Angel Rivera": 66, + "Rory Flinn": 82, + "Melissa Kagen": 38, + "Walt Yarbrough": 90, + "Karen Stewart": 92, + "Rodney DuPlessis": 51, + "Elizabeth Hambleton": 66, + "Ben Schneider": 45, + "Lena Dias": 78, + "Mark Claypool": 76, + "Monty Sharma": 95, + "Geoffrey Pfeifer": 99, + "Esther Boucher-Yip": 74, + "Emiko Rafique": 38, + "Jon Abraham": 97, + "Yonatan Ashenafi": 71, + "Michael Johnson": 61, + "Nicole Buczkowski": 42, + "Ralihe Raul Villagran Olivas": 49, + "Qiao Zhuang": 46, + "Marcel Blais": 80, + "Michael Smith": 46, + "William Sanguinet": 66, + "John Goulet": 66, + "Dana Ferranti": 56, + "Joseph Fehribach": 70, + "Dalin Tang": 73, + "Vadim Yakovlev": 99, + "Binan Gu": 85, + "Tatiana Doytchinova": 89, + "Wagner Zsolt Adam": 80, + "Mayer Humi": 43, + "Nathan Uricchio": 44, + "Burt Tilley": 83, + "Francesca Bernardi": 38, + "Dina Rassias": 87, + "Andre Nachbin": 38, + "Samuel Tripp": 62, + "William Martin": 95, + "Qingshuo Song": 53, + "Guanying Peng": 46, + "Brigitte Servatius": 75, + "Tharindu De Alwis": 82, + "Adam Sales": 48, + "Carly Thorp": 46, + "Zheyang Wu": 84, + "Fangfang Wang": 43, + "Buddika Peiris": 46, + "Nadeesha Jayaweera": 55, + "Stephan Sturm": 68, + "Gu Wang": 49, + "Barry Posterro": 40, + "Christopher Larsen": 62, + "Jeffrey Barden": 52, + "Marcus Sarkis-Martins": 86, + "Balgobin Nandram": 36, + "Adam Powell": 86, + "Ahmet Sabuncu": 50, + "Pradeep Radhakrishnan": 47, + "Vladimir Vantsevich": 53, + "Eben Cobb": 46, + "Pratap Rao": 72, + "Loris Fichera": 76, + "Jamal Yagoobi": 95, + "Mohammad Mahdi Agheli Hajiabadi": 55, + "Michael Fritschy": 38, + "Christopher Brown": 62, + "Paul Cotnoir": 75, + "Daniel Treku": 49, + "Jim Ryan": 85, + "Nima Kordzadeh": 84, + "Vance Wilson": 42, + "Bengisu Tulu": 98, + "Soussan Djamasbi": 88, + "Adrienne Hall-Phillips": 69, + "Farnoush Reshadi": 32, + "Charles Dougherty": 47, + "Donald Vota": 69, + "Patrick Crews": 71, + "Daniel Challas-Gimm": 93, + "James Conley": 57, + "Joseph Mazzocchi": 31, + "Kyle Tsaknopoulos": 61, + "Brajendra Mishra": 47, + "Thomas Christiansen": 96, + "Jonathan Blumhofer": 64, + "Monica Hatch Moysey": 63, + "Emmanuel Attah Poku": 65, + "Pieter Struyk": 37, + "Alan Vaudreuil": 84, + "Jason Davis": 68, + "Richard Lopez": 85, + "Snehalata Kadam": 87, + "John Lindholm": 67, + "Michael Elmes": 98, + "Brent French": 44, + "Steve Taylor": 35, + "Joseph Sarkis": 34, + "Walter Towner": 65, + "Sharon Johnson": 81, + "Sara Saberi": 34, + "Renata Konrad": 100, + "Izabela Stroe": 94, + "Nancy Burnham": 87, + "Kateryna Friedman": 90, + "Richard Quimby": 77, + "Thomas Noviello": 50, + "Kun-Ta Wu": 40, + "Qi Wen": 40, + "Rudra Kafle": 32, + "Ben Pollard": 97, + "Lyubov Titova": 41, + "Alex Zozulya": 89, + "William McCarthy": 64, + "Raisa Trubko": 92, + "Padmanabhan Aravind": 84, + "Richard Marchetti": 91, + "Jim Doyle": 90, + "Gia Davis": 60, + "Kaitlyn Schneider": 91, + "Angela Incollingo Rodriguez": 79, + "Stacy Shaw": 44, + "Erin Ottmar": 85, + "Shamim Hunt": 40, + "Greg Lewin": 97, + "Vincent Aloi": 78, + "Andre Rosendo": 86, + "Alexandros Lioulemes": 30, + "Akin Tatoglu": 76, + "Siamak Ghorbani Faal": 79, + "Daniel Montrallo Flickinger": 75, + "Jane Li": 97, + "John Nafziger": 30, + "Markus Nemitz": 36, + "Haichong Zhang": 86, + "Kevin Leahy": 84, + "James Brodovsky": 44, + "Navid Dadkhah Tehrani": 67, + "Lina Munoz-Marquez": 71, + "Aarti Madan": 43, + "Ingrid Matos-Nin": 31, + "Khalid Saeed": 87, + "Shelly Yarnie": 63, + "Robert Tranchina": 90, + "Christopher Piccirillo": 89, + "Robert Wheeler": 67, + "Bobbi Young": 60, + "Fred Robinson": 39, + "Mark Flanders": 56, + "Olivia Scanlon": 46, + "Laura Eckelman": 78, + "Matthew Kelly": 83, + "Jason Steele": 36, + "Dylan Foran": 41, + "Brenden Casey": 87, + "Matt Oney": 80, + "Lawrence Noble": 62, + "Kimberly Cosenza": 55, + "Christopher Robertson": 47, + "Courtney Chase": 41, + "Riley Naclerio": 76, + "Christopher Bartley": 31, + "Heather Ross": 33, + "Cailyn Straubel": 67, + "Cherise Galasso": 95, + "Brian Kelley": 56, + "Stephanie Riley-Schafer": 46, + "Brian Chabot": 41, + "Emily Mauro": 54, + "Adriana Owen": 42, + "Galen Holmes": 68, + "Paul Bennett": 45, + "Linda Bullock": 47, + "Christopher Gilmore": 92, + "Chad Gaylord": 98, + "Ann McCarron": 68, + "Paula Fitzpatrick": 39, + "Robin Benoit": 80, + "Diana Fiorentino": 51, + "Kathryn Moncrief": 64, + "Meng Le": 71, + "Shavaun Cloran": 51, + "Sandra Duguay": 49, + "Ryan Madan": 78, + "Sarah Riddick": 88, + "Gillian Smith": 92, + "Matthew Ahrens": 88, + "Taylor Andrews": 84, + "Herman Servatius": 10, + "Shubbhi Taneja": 75, + "Michael Engling": 89, + "Yu-Shan Sun": 68, + "Jennifer Mortensen": 83, + "Mark Sheahan": 0, + "Erin Solovey": 84, + "Lane Harrison": 0, + "Paul Delvy": 83, + "Micha Hofri": 20, + "Keith Pray": 73, + "Joshua Cuneo": 75, + "Rose Bohrer": 78, + "Rodica Neamtu": 84 +} From cbf92a71e4f397af6e71411a1dad3633522bc6c5 Mon Sep 17 00:00:00 2001 From: Charles Tang Date: Sat, 13 Jan 2024 14:10:59 -0500 Subject: [PATCH 3/8] readme --- README.md | 92 ++++++++++++++++++++++++++++------------------------ Roadmap.png | Bin 0 -> 57627 bytes 2 files changed, 49 insertions(+), 43 deletions(-) create mode 100644 Roadmap.png diff --git a/README.md b/README.md index 58beeac..04fc5fc 100644 --- a/README.md +++ b/README.md @@ -1,70 +1,76 @@ -# Getting Started with Create React App +

+ + Roadmap-WPI + +

Roadmap-WPI

-This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). +

+ A universal solution to introduce you to WPI's major requirement system
Developed by WPI students for WPI students (GoatHack 2024). +
+

+

-## Available Scripts +### About -In the project directory, you can run: +Roadmap-WPI provides a clean, aesthetic visual solution to help incoming WPI students understand the major requirements system. The website is designed to be easy to use and understand, and is a great resource for students to use when planning their academic career by keeping track of their major requirements and progress as well as visualizing prerequisites and course offerings. This project was developed by Randy Huang, Tarun Eswar, Ajay Bhagavatula, Erica Dong, and Charles Tang for the GoatHacks 2024 hackathon at WPI. -### `npm start` +### Technical +#### Technology Used +
+

express bootstrap css3 firebase html5 javascript mongodb nodejs react

-Runs the app in the development mode.\ -Open [http://localhost:3000](http://localhost:3000) to view it in your browser. +
-The page will reload when you make changes.\ -You may also see any lint errors in the console. +#### Local Hosting -### `npm test` +To run the project locally, you may clone this respository. You must have Node version 18+ installed on your machine. -Launches the test runner in the interactive watch mode.\ -See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. +```bash +git clone https://github.com/WPI-Roadmap/client-side.git +``` -### `npm run build` +Then, install the dependencies. -Builds the app for production to the `build` folder.\ -It correctly bundles React in production mode and optimizes the build for the best performance. +```bash +cd client-side +npm install +``` -The build is minified and the filenames include the hashes.\ -Your app is ready to be deployed! +Finally, run the project. -See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. +```bash +npm start +``` -### `npm run eject` +Go to `localhost:3000` to view the project. -**Note: this is a one-way operation. Once you `eject`, you can't go back!** +### Feature List -If you aren't satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. +- [x] Roadmap visualization for all majors (hierarchal diagram) +- [x] Sync with OSCAR.wpi.edu and COURSELISTINGS.wpi.edu for up-to-date course offerings and professor/course ratings +- [x] Tracking sheet digitization for helping you satisfy major requirements +- [ ] LLM-based course recommendations based on your major, interests, and satisfaction with past courses +- [ ] Profile syncing and WPI SSO -Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you're on your own. +### Contributing -You don't have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn't feel obligated to use this feature. However we understand that this tool wouldn't be useful if you couldn't customize it when you are ready for it. +We'd love to have your help in making Roadmap-WPI better. The project still has work to do before full production launch, but if there's an issue you'd like to see addressed sooner rather than later, let us know. -## Learn More +For any concerns, please open an [issue](https://github.com/WPI-Roadmap/client-side/issues), or feel free to, [fork the project and send a pull request](https://github.com/WPI-Roadmap/client-side/pulls). -You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). +
-To learn React, check out the [React documentation](https://reactjs.org/). -### Code Splitting -This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting) +### Versions +* Version 1.0 (01/14/2024) + * Initial Release + * See [Commits history] -### Analyzing the Bundle Size +### License -This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size) -### Making a Progressive Web App +[![Open Source Love](https://badges.frapsoft.com/os/v2/open-source-200x33.png?v=103)](#) -This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app) -### Advanced Configuration - -This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration) - -### Deployment - -This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment) - -### `npm run build` fails to minify - -This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify) +[![license](https://img.shields.io/github/license/mashape/apistatus.svg?style=for-the-badge)](https://github.com/tamzi/ReadMe-MasterTemplates/blob/master/LICENSE) diff --git a/Roadmap.png b/Roadmap.png new file mode 100644 index 0000000000000000000000000000000000000000..bc3cd8e72cb244613f7b8825ca93927463469d03 GIT binary patch literal 57627 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 Date: Sat, 13 Jan 2024 14:27:03 -0500 Subject: [PATCH 4/8] cards2 --- public/404.html | 33 ++++++++++++++ public/index.html | 112 ++++++++++++++++++++++++++++++++-------------- 2 files changed, 112 insertions(+), 33 deletions(-) create mode 100644 public/404.html diff --git a/public/404.html b/public/404.html new file mode 100644 index 0000000..829eda8 --- /dev/null +++ b/public/404.html @@ -0,0 +1,33 @@ + + + + + + Page Not Found + + + + +
+

404

+

Page Not Found

+

The specified file was not found on this website. Please check the URL for mistakes and try again.

+

Why am I seeing this?

+

This page was generated by the Firebase Command-Line Interface. To modify it, edit the 404.html file in your project's configured public directory.

+
+ + diff --git a/public/index.html b/public/index.html index aa069f2..e368b45 100644 --- a/public/index.html +++ b/public/index.html @@ -1,43 +1,89 @@ - + - - - - - - - - - + + + + + + + + + + + + - React App + + + - -
- + try { + let app = firebase.app(); + let features = [ + 'auth', + 'database', + 'firestore', + 'functions', + 'messaging', + 'storage', + 'analytics', + 'remoteConfig', + 'performance', + ].filter(feature => typeof app[feature] === 'function'); + loadEl.textContent = `Firebase SDK loaded with ${features.join(', ')}`; + } catch (e) { + console.error(e); + loadEl.textContent = 'Error loading the Firebase SDK, check the console.'; + } + }); + From 78508f9c70023445af966c98f3048075fc63661b Mon Sep 17 00:00:00 2001 From: Erica Dong Date: Sat, 13 Jan 2024 14:31:00 -0500 Subject: [PATCH 5/8] Make flow layout look better; --- src/Dashboard/Dashboard.js | 15 ++++++++++++++- src/Dashboard/Flow.js | 20 +++++++++----------- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/Dashboard/Dashboard.js b/src/Dashboard/Dashboard.js index 9222467..9805fdc 100644 --- a/src/Dashboard/Dashboard.js +++ b/src/Dashboard/Dashboard.js @@ -48,11 +48,14 @@ function Dashboard() { // console.log(data.Report_Entry[i]["Course_Section_Owner"]) if(data.Report_Entry[i]["Course_Section_Owner"] == department && !courseTracking.includes(data.Report_Entry[i]["Course_Title"])) { courseTracking.push(data.Report_Entry[i]["Course_Title"]) + let courseCode = data.Report_Entry[i]["Course_Title"].match(/\d+/)[0]; tempCourses.push({ id: id.toString(), position: { x: x, y: y }, data: { label: data.Report_Entry[i]["Course_Title"] }, - desc: data.Report_Entry[i]["Course_Description"] + desc: data.Report_Entry[i]["Course_Description"], + parentNode: courseCode.length == 3 ? 6 + data.Report_Entry.length : Number(courseCode.substring(0, 1)) - 1 + data.Report_Entry.length, + courseType: courseCode.length == 3 ? 7 : courseCode.substring(0, 1), }); if(id % 2 == 0) { x+=100; @@ -103,6 +106,16 @@ function Dashboard() { } } id++; + + for (let i = 1; i <= 7; i++) { + tempCourses.push({ + id: i-1 + data.Report_Entry.length, + data: { label: (i == 7 ? 'Grad' : i + '000') + 'Courses' }, + style: { display: 'none', }, + type: 'group', + courseType: i, + },) + } setEdges(tempEdges); setNodes(tempCourses); diff --git a/src/Dashboard/Flow.js b/src/Dashboard/Flow.js index e8b3fbc..deb9667 100644 --- a/src/Dashboard/Flow.js +++ b/src/Dashboard/Flow.js @@ -18,9 +18,10 @@ const elkOptions = { // separateConnectedComponents: false, // "elk.layered.mergeEdges": false, "elk.layered.nodePlacement.bk.fixedAlignment": "BALANCED", - "elk.direction": "DOWN", - "spacing.nodeNode": 100, - "spacing.nodeNodeBetweenLayers": 100 + "elk.direction": "UP", + "spacing.nodeNode": 50, + "spacing.nodeNodeBetweenLayers": 50, + 'elk.partitioning.activate': 'true', }; const getLayoutedElements = (nodes, edges, options = {}) => { @@ -32,8 +33,11 @@ const getLayoutedElements = (nodes, edges, options = {}) => { ...node, // Adjust the target and source handle positions based on the layout // direction. - targetPosition: isHorizontal ? 'left' : 'top', - sourcePosition: isHorizontal ? 'right' : 'bottom', + targetPosition: 'bottom', + sourcePosition: 'top', + layoutOptions: { + 'partitioning.partition': 7 - node.courseType, + }, // Hardcode a width and height for elk to use when layouting. width: 150, @@ -51,7 +55,6 @@ const getLayoutedElements = (nodes, edges, options = {}) => { // and `y` fields. position: { x: node.x, y: node.y }, })), - edges: layoutedGraph.edges, })) .catch(console.error); @@ -93,11 +96,6 @@ function FlowWithoutProvider({initialNodes, initialEdges}) { onEdgesChange={onEdgesChange} fitView > - - - - - ); } From 5e70603469d8aff765eda9b91f2d60780cdaace5 Mon Sep 17 00:00:00 2001 From: Randy Huang Date: Sat, 13 Jan 2024 14:31:19 -0500 Subject: [PATCH 6/8] remove duplicate --- src/components/Dashboard/Dashboard.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/Dashboard/Dashboard.js b/src/components/Dashboard/Dashboard.js index 58365ff..0758144 100644 --- a/src/components/Dashboard/Dashboard.js +++ b/src/components/Dashboard/Dashboard.js @@ -10,10 +10,9 @@ import RequirementsSidebar from './Requirements/Requirements.js'; import 'reactflow/dist/style.css'; -var data = require('./Courses.json'); +var data = require('./courses.json'); const { Header, Sider, Content } = Layout; -var data = require('./Courses.json'); function Dashboard() { From cf3dc257769a64658e008736300401999d40f4e2 Mon Sep 17 00:00:00 2001 From: Charles Tang Date: Sat, 13 Jan 2024 15:26:41 -0500 Subject: [PATCH 7/8] hi --- .firebase/hosting.YnVpbGQ.cache | 17 + .firebase/hosting.cHVibGlj.cache | 7 + .firebaserc | 5 + .github/workflows/firebase-hosting-merge.yml | 20 + .../firebase-hosting-pull-request.yml | 17 + firebase.json | 10 + package-lock.json | 770 ++++++++++++++++++ package.json | 1 + public/index.html | 114 +-- src/Firebase.js | 95 +++ src/components/Authorization/Login.js | 26 +- .../Authorization/LoginView/Login.jsx | 15 +- src/components/Dashboard/Dashboard.js | 2 +- 13 files changed, 986 insertions(+), 113 deletions(-) create mode 100644 .firebase/hosting.YnVpbGQ.cache create mode 100644 .firebase/hosting.cHVibGlj.cache create mode 100644 .firebaserc create mode 100644 .github/workflows/firebase-hosting-merge.yml create mode 100644 .github/workflows/firebase-hosting-pull-request.yml create mode 100644 firebase.json create mode 100644 src/Firebase.js diff --git a/.firebase/hosting.YnVpbGQ.cache b/.firebase/hosting.YnVpbGQ.cache new file mode 100644 index 0000000..3876dc4 --- /dev/null +++ b/.firebase/hosting.YnVpbGQ.cache @@ -0,0 +1,17 @@ +404.html,1705174543934,762bf484ba67404bd1a3b181546ea28d60dfddf18e9dd4795d8d25bcf3c1a890 +favicon.ico,1705164758605,27edce7be5922cf0bef7d4136f69b5bfbdd5bf8c13c7b026f71187d41a00aa7d +logo192.png,1705164758606,79e2b749561016bc8af300ea19f48347ceed3cb1a54f48ae456172eca45e08f0 +logo512.png,1705164758607,212b102aa09e51b3b3e06647e81f7801a61333e171f6582e8124379aabccb41d +manifest.json,1705164758608,ee04fb47e525c67d8424ffe9b4d8a8a24e434504478afca4e0ca602146836d4c +robots.txt,1705164758609,bfe106a3fb878dc83461c86818bf74fc1bdc7f28538ba613cd3e775516ce8b49 +asset-manifest.json,1705177242329,9a0e33bf23968c815f9c6ef95ff29eda34e3d0fc85a69ddb43b8cf5d62561944 +index.html,1705177242328,7ad10da0ec25df620657b11797cbf35a96adf4ed5a52935fb3c87583303ea9fc +static/css/main.f2e09b25.css,1705177242420,6a7377e6b21ba8c31991b11735119b9a7792b812bcb4b15dc574bbbd4984bb84 +static/css/main.f2e09b25.css.map,1705177242421,14d34018e7debe991f46de4fca5f6253dd434c39443e9254e25b5e5af84f8d75 +static/js/787.02f037f9.chunk.js,1705177242421,76fa99f0d2322a59d1f03be7afcf203d1c2846e07dcd7130055a03f8134ea863 +static/js/787.02f037f9.chunk.js.map,1705177242424,4895f71c1084ab7e88a0c4a61a0b1a79c1db3c97807d33ca14699ec318fd8ca4 +static/js/main.185a1fc9.js.LICENSE.txt,1705177242421,963c34d2e87f55eb8993727802418c31449a9493369df8a8f048617cdf6a2a28 +static/media/public.fafa67c655ced9a33e21.png,1705177242421,5a28ab84fadf70c2574d1fcdd8a4b4707f615a101cb72bf0222200818d3c162f +static/media/cover-image.0d2b4cb81de09e34d255.jpeg,1705177242421,9f67c37a773b9b9ef5d683969347fc809ed45947518d5a511d79d0ace106ca52 +static/js/main.185a1fc9.js,1705177242427,7306a6c7e2b7668ecf64fb639d96e2001032fb86c563957d337472603bf9d9a4 +static/js/main.185a1fc9.js.map,1705177242428,c4cb594e364bc23f5ced25e461239a398e9f5697f7fac0994bcaee0efbe4f7b5 diff --git a/.firebase/hosting.cHVibGlj.cache b/.firebase/hosting.cHVibGlj.cache new file mode 100644 index 0000000..3cfa8c2 --- /dev/null +++ b/.firebase/hosting.cHVibGlj.cache @@ -0,0 +1,7 @@ +404.html,1705174543934,762bf484ba67404bd1a3b181546ea28d60dfddf18e9dd4795d8d25bcf3c1a890 +index.html,1705174544593,8256f16ae205197ba3e568302316c9b05ee5222a69840214931a830c118af12c +manifest.json,1705164758608,ee04fb47e525c67d8424ffe9b4d8a8a24e434504478afca4e0ca602146836d4c +logo192.png,1705164758606,79e2b749561016bc8af300ea19f48347ceed3cb1a54f48ae456172eca45e08f0 +favicon.ico,1705164758605,27edce7be5922cf0bef7d4136f69b5bfbdd5bf8c13c7b026f71187d41a00aa7d +robots.txt,1705164758609,bfe106a3fb878dc83461c86818bf74fc1bdc7f28538ba613cd3e775516ce8b49 +logo512.png,1705164758607,212b102aa09e51b3b3e06647e81f7801a61333e171f6582e8124379aabccb41d diff --git a/.firebaserc b/.firebaserc new file mode 100644 index 0000000..26f8571 --- /dev/null +++ b/.firebaserc @@ -0,0 +1,5 @@ +{ + "projects": { + "default": "roadmap-wpi" + } +} diff --git a/.github/workflows/firebase-hosting-merge.yml b/.github/workflows/firebase-hosting-merge.yml new file mode 100644 index 0000000..c64f7bb --- /dev/null +++ b/.github/workflows/firebase-hosting-merge.yml @@ -0,0 +1,20 @@ +# This file was auto-generated by the Firebase CLI +# https://github.com/firebase/firebase-tools + +name: Deploy to Firebase Hosting on merge +'on': + push: + branches: + - main +jobs: + build_and_deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - run: npm ci && npm run build + - uses: FirebaseExtended/action-hosting-deploy@v0 + with: + repoToken: '${{ secrets.GITHUB_TOKEN }}' + firebaseServiceAccount: '${{ secrets.FIREBASE_SERVICE_ACCOUNT_ROADMAP_WPI }}' + channelId: live + projectId: roadmap-wpi diff --git a/.github/workflows/firebase-hosting-pull-request.yml b/.github/workflows/firebase-hosting-pull-request.yml new file mode 100644 index 0000000..bafdee6 --- /dev/null +++ b/.github/workflows/firebase-hosting-pull-request.yml @@ -0,0 +1,17 @@ +# This file was auto-generated by the Firebase CLI +# https://github.com/firebase/firebase-tools + +name: Deploy to Firebase Hosting on PR +'on': pull_request +jobs: + build_and_preview: + if: '${{ github.event.pull_request.head.repo.full_name == github.repository }}' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - run: npm ci && npm run build + - uses: FirebaseExtended/action-hosting-deploy@v0 + with: + repoToken: '${{ secrets.GITHUB_TOKEN }}' + firebaseServiceAccount: '${{ secrets.FIREBASE_SERVICE_ACCOUNT_ROADMAP_WPI }}' + projectId: roadmap-wpi diff --git a/firebase.json b/firebase.json new file mode 100644 index 0000000..f475554 --- /dev/null +++ b/firebase.json @@ -0,0 +1,10 @@ +{ + "hosting": { + "public": "build", + "ignore": [ + "firebase.json", + "**/.*", + "**/node_modules/**" + ] + } +} diff --git a/package-lock.json b/package-lock.json index af99aa5..fa4c66c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,7 @@ "elkjs": "^0.9.1", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-firebase-hooks": "^5.1.1", "react-router": "^6.21.2", "react-router-dom": "^6.21.2", "react-scripts": "5.0.1", @@ -2602,6 +2603,620 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@fastify/busboy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", + "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==", + "peer": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@firebase/analytics": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.0.tgz", + "integrity": "sha512-Locv8gAqx0e+GX/0SI3dzmBY5e9kjVDtD+3zCFLJ0tH2hJwuCAiL+5WkHuxKj92rqQj/rvkBUCfA1ewlX2hehg==", + "peer": true, + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/installations": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/analytics-compat": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.6.tgz", + "integrity": "sha512-4MqpVLFkGK7NJf/5wPEEP7ePBJatwYpyjgJ+wQHQGHfzaCDgntOnl9rL2vbVGGKCnRqWtZDIWhctB86UWXaX2Q==", + "peer": true, + "dependencies": { + "@firebase/analytics": "0.10.0", + "@firebase/analytics-types": "0.8.0", + "@firebase/component": "0.6.4", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/analytics-types": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.8.0.tgz", + "integrity": "sha512-iRP+QKI2+oz3UAh4nPEq14CsEjrjD6a5+fuypjScisAh9kXKFvdJOZJDwk7kikLvWVLGEs9+kIUS4LPQV7VZVw==", + "peer": true + }, + "node_modules/@firebase/app": { + "version": "0.9.25", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.9.25.tgz", + "integrity": "sha512-fX22gL5USXhOK21Hlh3oTeOzQZ6th6S2JrjXNEpBARmwzuUkqmVGVdsOCIFYIsLpK0dQE3o8xZnLrRg5wnzZ/g==", + "peer": true, + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "idb": "7.1.1", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/app-check": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.8.1.tgz", + "integrity": "sha512-zi3vbM5tb/eGRWyiqf+1DXbxFu9Q07dnm46rweodgUpH9B8svxYkHfNwYWx7F5mjHU70SQDuaojH1We5ws9OKA==", + "peer": true, + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/app-check-compat": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.3.8.tgz", + "integrity": "sha512-EaETtChR4UgMokJFw+r6jfcIyCTUZSe0a6ivF37D9MxlG9G3wzK1COyXgxoX96GzXmDPc2aubX4PxCrdVHhrnA==", + "peer": true, + "dependencies": { + "@firebase/app-check": "0.8.1", + "@firebase/app-check-types": "0.5.0", + "@firebase/component": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/app-check-interop-types": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.0.tgz", + "integrity": "sha512-xAxHPZPIgFXnI+vb4sbBjZcde7ZluzPPaSK7Lx3/nmuVk4TjZvnL8ONnkd4ERQKL8WePQySU+pRcWkh8rDf5Sg==", + "peer": true + }, + "node_modules/@firebase/app-check-types": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.5.0.tgz", + "integrity": "sha512-uwSUj32Mlubybw7tedRzR24RP8M8JUVR3NPiMk3/Z4bCmgEKTlQBwMXrehDAZ2wF+TsBq0SN1c6ema71U/JPyQ==", + "peer": true + }, + "node_modules/@firebase/app-compat": { + "version": "0.2.25", + "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.25.tgz", + "integrity": "sha512-B/JtCp1FsTuzlh1tIGQpYM2AXps21/zlzpFsk5LRsROOTRhBcR2N45AyaONPFD06C0yS0Tw19foxADzHyOSC3A==", + "peer": true, + "dependencies": { + "@firebase/app": "0.9.25", + "@firebase/component": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/app-types": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.0.tgz", + "integrity": "sha512-AeweANOIo0Mb8GiYm3xhTEBVCmPwTYAu9Hcd2qSkLuga/6+j9b1Jskl5bpiSQWy9eJ/j5pavxj6eYogmnuzm+Q==", + "peer": true + }, + "node_modules/@firebase/auth": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.5.1.tgz", + "integrity": "sha512-sVi7rq2YneLGJFqHa5S6nDfCHix9yuVV3RLhj/pWPlB4a36ofXal4E6PJwpeMc8uLjWEr1aovYN1jkXWNB6Avw==", + "peer": true, + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0", + "undici": "5.26.5" + }, + "peerDependencies": { + "@firebase/app": "0.x", + "@react-native-async-storage/async-storage": "^1.18.1" + }, + "peerDependenciesMeta": { + "@react-native-async-storage/async-storage": { + "optional": true + } + } + }, + "node_modules/@firebase/auth-compat": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.5.1.tgz", + "integrity": "sha512-rgDZnrDoekRvtzXVji8Z61wxxkof6pTkjYEkybILrjM8tGP9tx4xa9qGpF4ax3AzF+rKr7mIa9NnoXEK4UNqmQ==", + "peer": true, + "dependencies": { + "@firebase/auth": "1.5.1", + "@firebase/auth-types": "0.12.0", + "@firebase/component": "0.6.4", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0", + "undici": "5.26.5" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/auth-interop-types": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.1.tgz", + "integrity": "sha512-VOaGzKp65MY6P5FI84TfYKBXEPi6LmOCSMMzys6o2BN2LOsqy7pCuZCup7NYnfbk5OkkQKzvIfHOzTm0UDpkyg==", + "peer": true + }, + "node_modules/@firebase/auth-types": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.12.0.tgz", + "integrity": "sha512-pPwaZt+SPOshK8xNoiQlK5XIrS97kFYc3Rc7xmy373QsOJ9MmqXxLaYssP5Kcds4wd2qK//amx/c+A8O2fVeZA==", + "peer": true, + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/component": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.4.tgz", + "integrity": "sha512-rLMyrXuO9jcAUCaQXCMjCMUsWrba5fzHlNK24xz5j2W6A/SRmK8mZJ/hn7V0fViLbxC0lPMtrK1eYzk6Fg03jA==", + "peer": true, + "dependencies": { + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/database": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.2.tgz", + "integrity": "sha512-8X6NBJgUQzDz0xQVaCISoOLINKat594N2eBbMR3Mu/MH/ei4WM+aAMlsNzngF22eljXu1SILP5G3evkyvsG3Ng==", + "peer": true, + "dependencies": { + "@firebase/app-check-interop-types": "0.3.0", + "@firebase/auth-interop-types": "0.2.1", + "@firebase/component": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "faye-websocket": "0.11.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/database-compat": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-1.0.2.tgz", + "integrity": "sha512-09ryJnXDvuycsxn8aXBzLhBTuCos3HEnCOBWY6hosxfYlNCGnLvG8YMlbSAt5eNhf7/00B095AEfDsdrrLjxqA==", + "peer": true, + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/database": "1.0.2", + "@firebase/database-types": "1.0.0", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/database-types": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.0.tgz", + "integrity": "sha512-SjnXStoE0Q56HcFgNQ+9SsmJc0c8TqGARdI/T44KXy+Ets3r6x/ivhQozT66bMnCEjJRywYoxNurRTMlZF8VNg==", + "peer": true, + "dependencies": { + "@firebase/app-types": "0.9.0", + "@firebase/util": "1.9.3" + } + }, + "node_modules/@firebase/firestore": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.4.0.tgz", + "integrity": "sha512-VeDXD9PUjvcWY1tInBOMTIu2pijR3YYy+QAe5cxCo1Q1vW+aA/mpQHhebPM1J6b4Zd1MuUh8xpBRvH9ujKR56A==", + "peer": true, + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "@firebase/webchannel-wrapper": "0.10.5", + "@grpc/grpc-js": "~1.9.0", + "@grpc/proto-loader": "^0.7.8", + "tslib": "^2.1.0", + "undici": "5.26.5" + }, + "engines": { + "node": ">=10.10.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/firestore-compat": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.23.tgz", + "integrity": "sha512-uUTBiP0GLVBETaOCfB11d33OWB8x1r2G1Xrl0sRK3Va0N5LJ/GRvKVSGfM7VScj+ypeHe8RpdwKoCqLpN1e+uA==", + "peer": true, + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/firestore": "4.4.0", + "@firebase/firestore-types": "3.0.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/firestore-types": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-3.0.0.tgz", + "integrity": "sha512-Meg4cIezHo9zLamw0ymFYBD4SMjLb+ZXIbuN7T7ddXN6MGoICmOTq3/ltdCGoDCS2u+H1XJs2u/cYp75jsX9Qw==", + "peer": true, + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/functions": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.11.0.tgz", + "integrity": "sha512-n1PZxKnJ++k73Q8khTPwihlbeKo6emnGzE0hX6QVQJsMq82y/XKmNpw2t/q30VJgwaia3ZXU1fd1C5wHncL+Zg==", + "peer": true, + "dependencies": { + "@firebase/app-check-interop-types": "0.3.0", + "@firebase/auth-interop-types": "0.2.1", + "@firebase/component": "0.6.4", + "@firebase/messaging-interop-types": "0.2.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0", + "undici": "5.26.5" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/functions-compat": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.6.tgz", + "integrity": "sha512-RQpO3yuHtnkqLqExuAT2d0u3zh8SDbeBYK5EwSCBKI9mjrFeJRXBnd3pEG+x5SxGJLy56/5pQf73mwt0OuH5yg==", + "peer": true, + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/functions": "0.11.0", + "@firebase/functions-types": "0.6.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/functions-types": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.6.0.tgz", + "integrity": "sha512-hfEw5VJtgWXIRf92ImLkgENqpL6IWpYaXVYiRkFY1jJ9+6tIhWM7IzzwbevwIIud/jaxKVdRzD7QBWfPmkwCYw==", + "peer": true + }, + "node_modules/@firebase/installations": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.4.tgz", + "integrity": "sha512-u5y88rtsp7NYkCHC3ElbFBrPtieUybZluXyzl7+4BsIz4sqb4vSAuwHEUgCgCeaQhvsnxDEU6icly8U9zsJigA==", + "peer": true, + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/util": "1.9.3", + "idb": "7.0.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/installations-compat": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.4.tgz", + "integrity": "sha512-LI9dYjp0aT9Njkn9U4JRrDqQ6KXeAmFbRC0E7jI7+hxl5YmRWysq5qgQl22hcWpTk+cm3es66d/apoDU/A9n6Q==", + "peer": true, + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/installations": "0.6.4", + "@firebase/installations-types": "0.5.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/installations-types": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.5.0.tgz", + "integrity": "sha512-9DP+RGfzoI2jH7gY4SlzqvZ+hr7gYzPODrbzVD82Y12kScZ6ZpRg/i3j6rleto8vTFC8n6Len4560FnV1w2IRg==", + "peer": true, + "peerDependencies": { + "@firebase/app-types": "0.x" + } + }, + "node_modules/@firebase/installations/node_modules/idb": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.0.1.tgz", + "integrity": "sha512-UUxlE7vGWK5RfB/fDwEGgRf84DY/ieqNha6msMV99UsEMQhJ1RwbCd8AYBj3QMgnE3VZnfQvm4oKVCJTYlqIgg==", + "peer": true + }, + "node_modules/@firebase/logger": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.0.tgz", + "integrity": "sha512-eRKSeykumZ5+cJPdxxJRgAC3G5NknY2GwEbKfymdnXtnT0Ucm4pspfR6GT4MUQEDuJwRVbVcSx85kgJulMoFFA==", + "peer": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/messaging": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.5.tgz", + "integrity": "sha512-i/rrEI2k9ueFhdIr8KQsptWGskrsnkC5TkohCTrJKz9P0C/PbNv14IAMkwhMJTqIur5VwuOnrUkc9Kdz7awekw==", + "peer": true, + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/installations": "0.6.4", + "@firebase/messaging-interop-types": "0.2.0", + "@firebase/util": "1.9.3", + "idb": "7.1.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/messaging-compat": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.5.tgz", + "integrity": "sha512-qHQZxm4hEG8/HFU/ls5/bU+rpnlPDoZoqi3ATMeb6s4hovYV9+PfV5I7ZrKV5eFFv47Hx1PWLe5uPnS4e7gMwQ==", + "peer": true, + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/messaging": "0.12.5", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/messaging-interop-types": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.0.tgz", + "integrity": "sha512-ujA8dcRuVeBixGR9CtegfpU4YmZf3Lt7QYkcj693FFannwNuZgfAYaTmbJ40dtjB81SAu6tbFPL9YLNT15KmOQ==", + "peer": true + }, + "node_modules/@firebase/performance": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.6.4.tgz", + "integrity": "sha512-HfTn/bd8mfy/61vEqaBelNiNnvAbUtME2S25A67Nb34zVuCSCRIX4SseXY6zBnOFj3oLisaEqhVcJmVPAej67g==", + "peer": true, + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/installations": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/performance-compat": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.4.tgz", + "integrity": "sha512-nnHUb8uP9G8islzcld/k6Bg5RhX62VpbAb/Anj7IXs/hp32Eb2LqFPZK4sy3pKkBUO5wcrlRWQa6wKOxqlUqsg==", + "peer": true, + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/performance": "0.6.4", + "@firebase/performance-types": "0.2.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/performance-types": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.2.0.tgz", + "integrity": "sha512-kYrbr8e/CYr1KLrLYZZt2noNnf+pRwDq2KK9Au9jHrBMnb0/C9X9yWSXmZkFt4UIdsQknBq8uBB7fsybZdOBTA==", + "peer": true + }, + "node_modules/@firebase/remote-config": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.4.4.tgz", + "integrity": "sha512-x1ioTHGX8ZwDSTOVp8PBLv2/wfwKzb4pxi0gFezS5GCJwbLlloUH4YYZHHS83IPxnua8b6l0IXUaWd0RgbWwzQ==", + "peer": true, + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/installations": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/remote-config-compat": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.4.tgz", + "integrity": "sha512-FKiki53jZirrDFkBHglB3C07j5wBpitAaj8kLME6g8Mx+aq7u9P7qfmuSRytiOItADhWUj7O1JIv7n9q87SuwA==", + "peer": true, + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/remote-config": "0.4.4", + "@firebase/remote-config-types": "0.3.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/remote-config-types": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.3.0.tgz", + "integrity": "sha512-RtEH4vdcbXZuZWRZbIRmQVBNsE7VDQpet2qFvq6vwKLBIQRQR5Kh58M4ok3A3US8Sr3rubYnaGqZSurCwI8uMA==", + "peer": true + }, + "node_modules/@firebase/storage": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.12.0.tgz", + "integrity": "sha512-SGs02Y/mmWBRsqZiYLpv4Sf7uZYZzMWVNN+aKiDqPsFBCzD6hLvGkXz+u98KAl8FqcjgB8BtSu01wm4pm76KHA==", + "peer": true, + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0", + "undici": "5.26.5" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/storage-compat": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.3.tgz", + "integrity": "sha512-WNtjYPhpOA1nKcRu5lIodX0wZtP8pI0VxDJnk6lr+av7QZNS1s6zvr+ERDTve+Qu4Hq/ZnNaf3kBEQR2ccXn6A==", + "peer": true, + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/storage": "0.12.0", + "@firebase/storage-types": "0.8.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/storage-types": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.8.0.tgz", + "integrity": "sha512-isRHcGrTs9kITJC0AVehHfpraWFui39MPaU7Eo8QfWlqW7YPymBmRgjDrlOgFdURh6Cdeg07zmkLP5tzTKRSpg==", + "peer": true, + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/util": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.9.3.tgz", + "integrity": "sha512-DY02CRhOZwpzO36fHpuVysz6JZrscPiBXD0fXp6qSrL9oNOx5KWICKdR95C0lSITzxp0TZosVyHqzatE8JbcjA==", + "peer": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/webchannel-wrapper": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.10.5.tgz", + "integrity": "sha512-eSkJsnhBWv5kCTSU1tSUVl9mpFu+5NXXunZc83le8GMjMlsWwQArSc7cJJ4yl+aDFY0NGLi0AjZWMn1axOrkRg==", + "peer": true + }, + "node_modules/@grpc/grpc-js": { + "version": "1.9.13", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.13.tgz", + "integrity": "sha512-OEZZu9v9AA+7/tghMDE8o5DAMD5THVnwSqDWuh7PPYO5287rTyqy0xEHT6/e4pbqSrhyLPdQFsam4TwFQVVIIw==", + "peer": true, + "dependencies": { + "@grpc/proto-loader": "^0.7.8", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.10.tgz", + "integrity": "sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==", + "peer": true, + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.4", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@grpc/proto-loader/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "peer": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@grpc/proto-loader/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "peer": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@grpc/proto-loader/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "peer": true, + "engines": { + "node": ">=12" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", @@ -3559,6 +4174,70 @@ } } }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "peer": true + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "peer": true + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "peer": true + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "peer": true + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "peer": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "peer": true + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "peer": true + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "peer": true + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "peer": true + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "peer": true + }, "node_modules/@rc-component/color-picker": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/@rc-component/color-picker/-/color-picker-1.5.1.tgz", @@ -8674,6 +9353,40 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/firebase": { + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/firebase/-/firebase-10.7.1.tgz", + "integrity": "sha512-Mlt7y7zQ43FtKp4SCyYie3tnrOL3UMF2XXiV4ZXMrC0d0wtcOYmABuybhkJpJCKILpdekxr39wjnaai0DZlWFg==", + "peer": true, + "dependencies": { + "@firebase/analytics": "0.10.0", + "@firebase/analytics-compat": "0.2.6", + "@firebase/app": "0.9.25", + "@firebase/app-check": "0.8.1", + "@firebase/app-check-compat": "0.3.8", + "@firebase/app-compat": "0.2.25", + "@firebase/app-types": "0.9.0", + "@firebase/auth": "1.5.1", + "@firebase/auth-compat": "0.5.1", + "@firebase/database": "1.0.2", + "@firebase/database-compat": "1.0.2", + "@firebase/firestore": "4.4.0", + "@firebase/firestore-compat": "0.3.23", + "@firebase/functions": "0.11.0", + "@firebase/functions-compat": "0.3.6", + "@firebase/installations": "0.6.4", + "@firebase/installations-compat": "0.2.4", + "@firebase/messaging": "0.12.5", + "@firebase/messaging-compat": "0.2.5", + "@firebase/performance": "0.6.4", + "@firebase/performance-compat": "0.2.4", + "@firebase/remote-config": "0.4.4", + "@firebase/remote-config-compat": "0.2.4", + "@firebase/storage": "0.12.0", + "@firebase/storage-compat": "0.3.3", + "@firebase/util": "1.9.3" + } + }, "node_modules/flat-cache": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", @@ -12544,6 +13257,12 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "peer": true + }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -12569,6 +13288,12 @@ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==", + "peer": true + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -14830,6 +15555,30 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, + "node_modules/protobufjs": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.5.tgz", + "integrity": "sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==", + "hasInstallScript": true, + "peer": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -15716,6 +16465,15 @@ "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" }, + "node_modules/react-firebase-hooks": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/react-firebase-hooks/-/react-firebase-hooks-5.1.1.tgz", + "integrity": "sha512-y2UpWs82xs+39q5Rc/wq316ca52QsC0n8m801V+yM4IC4hbfOL4yQPVSh7w+ydstdvjN9F+lvs1WrO2VYxpmdA==", + "peerDependencies": { + "firebase": ">= 9.0.0", + "react": ">= 16.8.0" + } + }, "node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", @@ -17882,6 +18640,18 @@ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" }, + "node_modules/undici": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.26.5.tgz", + "integrity": "sha512-cSb4bPFd5qgR7qr2jYAi0hlX9n5YKK2ONKkLFkxl+v/9BvC0sOpZjBHDBSXc5lWAf5ty9oZdRXytBIHzgUcerw==", + "peer": true, + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", diff --git a/package.json b/package.json index f85e40e..fd241ce 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "elkjs": "^0.9.1", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-firebase-hooks": "^5.1.1", "react-router": "^6.21.2", "react-router-dom": "^6.21.2", "react-scripts": "5.0.1", diff --git a/public/index.html b/public/index.html index e368b45..05dc5ce 100644 --- a/public/index.html +++ b/public/index.html @@ -1,89 +1,43 @@ - + - - - Welcome to Firebase Hosting - - - - - - - - - - - - - - - + + + React App -
-

Welcome

-

Firebase Hosting Setup Complete

-

You're seeing this because you've successfully setup Firebase Hosting. Now it's time to go build something extraordinary!

- Open Hosting Documentation -
-

Firebase SDK Loading…

+ +
+ - + \ No newline at end of file diff --git a/src/Firebase.js b/src/Firebase.js new file mode 100644 index 0000000..5e7bc7d --- /dev/null +++ b/src/Firebase.js @@ -0,0 +1,95 @@ +// AUTHENTICATION IMPORTS +import { initializeApp } from "firebase/app"; +import { + getAuth, + signInWithPopup, + signInWithEmailAndPassword, + createUserWithEmailAndPassword, + signOut, + setPersistence, + browserLocalPersistence, +} from "firebase/auth"; +import { OAuthProvider } from "firebase/auth"; +import { useNavigate } from "react-router"; + + +// FIREBASE CONFIG +const firebaseConfig = { + apiKey: "AIzaSyCaGXV8uK00pSjswXam4G8z4es_WkCx6B4", + authDomain: "roadmap-wpi.firebaseapp.com", + projectId: "roadmap-wpi", + storageBucket: "roadmap-wpi.appspot.com", + messagingSenderId: "619098314080", + appId: "1:619098314080:web:d4d7acca43c684c83aba05" +}; + +const app = initializeApp(firebaseConfig); + +const auth = getAuth(app); + +const provider = new OAuthProvider('microsoft.com'); +provider.setCustomParameters({ + tenant: "wpi.edu" +}); + +// AUTHENTICATION WITH EMAIL AND PASSWORD +const logInWithEmailAndPassword = async (email, password) => { + try { + await signInWithEmailAndPassword(auth, email, password); + } catch (err) { + return "Invalid password or email"; + } +}; + +// AUTHENTICATION WITH EMAIL AND PASSWORD +const registerWithEmailAndPassword = async (email, password) => { + try { + const res = await createUserWithEmailAndPassword(auth, email, password); + } catch (err) { + console.error(err); + alert(err.message); + } +}; + +function loginWithMicrosoft() { + + setPersistence(auth, browserLocalPersistence).then(() => { + signInWithPopup(auth, provider) + .then((result) => { + // User is signed in. + // IdP data available in result.additionalUserInfo.profile. + + // Get the OAuth access token and ID Token + const credential = OAuthProvider.credentialFromResult(result); + const accessToken = credential.accessToken; + const idToken = credential.idToken; + + + }) + .catch((error) => { + // Handle error. + }); + + + + }) + + + + +}; + +// LOGOUT +const logout = () => { + signOut(auth); +}; + +// EXPORTS +export { + auth, + app, + logInWithEmailAndPassword, + loginWithMicrosoft, + registerWithEmailAndPassword, + logout, +}; \ No newline at end of file diff --git a/src/components/Authorization/Login.js b/src/components/Authorization/Login.js index 12bd17b..281279f 100644 --- a/src/components/Authorization/Login.js +++ b/src/components/Authorization/Login.js @@ -1,8 +1,5 @@ // IMPORTS -import { useEffect, useContext, useState } from "react"; - -import dayjs from "dayjs"; - +import { useEffect, useState } from "react"; // STYLESHEETS import "./Login.css"; @@ -16,32 +13,11 @@ import { useNavigate } from "react-router"; function Login() { // CONSTANTS AND USESTATE HOOKS - const navigate = useNavigate(); let [tab, setTab] = useState(0); let user = null; - - /** - * Initializes the starting state - * @param {*} user - userImpl object from Firebase - * @redux - sets the starting state - * @returns the calendar page if user - */ - function initializeStates(user) { - navigate("/calendar/" + dayjs().unix()); - } - - // USEEFFECT HOOKS - useEffect(() => { - - if (user) { - initializeStates(user); - } else { - navigate("/"); - } - }, [user]); // DISPLAY LOGIN PAGE(S) return ( diff --git a/src/components/Authorization/LoginView/Login.jsx b/src/components/Authorization/LoginView/Login.jsx index 61ab51e..3f7516a 100644 --- a/src/components/Authorization/LoginView/Login.jsx +++ b/src/components/Authorization/LoginView/Login.jsx @@ -1,6 +1,6 @@ // IMPORTS import { Button, Form } from "antd"; - +import { loginWithMicrosoft } from "../../../Firebase" // IMAGES import publicLogo from "../../../assets/images/public.png"; import microsoft from "../../../assets/images/Microsoft_icon.svg.png"; @@ -29,11 +29,10 @@ function LoginView(props) { size="large" >

- Welcome + Welcome to Roadmap-WPI

- The new way to plan your WPI courses! Login to get started. Note, this - is an WPI-student only tool. + A universal solution to introduce you to WPI's major requirement system Developed by WPI students for WPI students (GoatHack 2024).

{navigate("/dashboard")}} + onClick={() => { + loginWithMicrosoft(); + navigate("/dashboard"); + }} > {/* */} - Login with Microsoft - + Continue To App diff --git a/src/components/Dashboard/Dashboard.js b/src/components/Dashboard/Dashboard.js index 18fb385..e6d61d1 100644 --- a/src/components/Dashboard/Dashboard.js +++ b/src/components/Dashboard/Dashboard.js @@ -11,7 +11,7 @@ import Table from "../Table/Table.jsx" import 'reactflow/dist/style.css'; -var data = require('./courses.json'); +var data = require('./Courses.json'); const { Header, Sider, Content } = Layout; From 2a2c51cdc4798898375c52094cf165241bae3d37 Mon Sep 17 00:00:00 2001 From: Charles Tang Date: Sat, 13 Jan 2024 15:26:58 -0500 Subject: [PATCH 8/8] hi --- src/components/Authorization/LoginView/Login.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Authorization/LoginView/Login.jsx b/src/components/Authorization/LoginView/Login.jsx index 3f7516a..2860a20 100644 --- a/src/components/Authorization/LoginView/Login.jsx +++ b/src/components/Authorization/LoginView/Login.jsx @@ -43,7 +43,7 @@ function LoginView(props) { type="primary" className="microsoft" onClick={() => { - loginWithMicrosoft(); + // loginWithMicrosoft(); navigate("/dashboard"); }} >