From 3e1ba2f2c75258c514914d5224aaa5d565602391 Mon Sep 17 00:00:00 2001 From: Kiersten Brennan Date: Sun, 27 Oct 2024 16:53:08 -0500 Subject: [PATCH 01/31] Task Complete --- app/src/pages/CreateWorkshop.tsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/src/pages/CreateWorkshop.tsx b/app/src/pages/CreateWorkshop.tsx index 04c565c..bda1299 100644 --- a/app/src/pages/CreateWorkshop.tsx +++ b/app/src/pages/CreateWorkshop.tsx @@ -34,6 +34,9 @@ const CreateWorkshop = () => { placeholder="Name" className="Form-input-box" /> + {errors.name && touched.name && ( +
{errors.name}
+ )}
@@ -43,6 +46,9 @@ const CreateWorkshop = () => { placeholder="Description" className="Form-input-box" /> + {errors.description && touched.description && ( +
{errors.description}
+ )}
+ ); +}; diff --git a/app/src/components/mock-logout-button.tsx b/app/src/components/mock-logout-button.tsx new file mode 100644 index 0000000..37a5400 --- /dev/null +++ b/app/src/components/mock-logout-button.tsx @@ -0,0 +1,34 @@ +import { useAuth0 } from "@auth0/auth0-react"; +import React from "react"; + +export const LogoutButton = () => { + const { logout } = useAuth0(); + + const handleLogout = () => { + logout({ + logoutParams: { + returnTo: window.location.origin, + }, + }); + }; + + return ( + + ); +}; diff --git a/app/src/components/mock-sign-up.tsx b/app/src/components/mock-sign-up.tsx new file mode 100644 index 0000000..59e4560 --- /dev/null +++ b/app/src/components/mock-sign-up.tsx @@ -0,0 +1,37 @@ +import { useAuth0 } from "@auth0/auth0-react"; +import React from "react"; + +export const SignupButton = () => { + const { loginWithRedirect } = useAuth0(); + + const handleSignUp = async () => { + await loginWithRedirect({ + appState: { + returnTo: "/profile", + }, + authorizationParams: { + screen_hint: "signup", + }, + }); + }; + + return ( + + ); +}; diff --git a/app/src/pages/auth-callback.tsx b/app/src/pages/auth-callback.tsx new file mode 100644 index 0000000..d3a4b6f --- /dev/null +++ b/app/src/pages/auth-callback.tsx @@ -0,0 +1,8 @@ +import React from "react"; +import Navbar from "../components/Navbar"; + +const AuthCallback = () => { + return ; +}; + +export default AuthCallback; From 5378afa827bd99aeb11cce2cb4d724ac8f116489 Mon Sep 17 00:00:00 2001 From: Lyton Date: Sat, 9 Nov 2024 17:30:39 -0600 Subject: [PATCH 10/31] lint: configure pretttier for frontend --- api/src/server.ts | 2 +- app/package-lock.json | 24 ++++++++++++++++++++++++ app/package.json | 7 ++++++- app/src/App.tsx | 14 +++++++------- 4 files changed, 38 insertions(+), 9 deletions(-) diff --git a/api/src/server.ts b/api/src/server.ts index a9c5d8d..b5b7054 100644 --- a/api/src/server.ts +++ b/api/src/server.ts @@ -21,5 +21,5 @@ app.use("/workshop", routes.workshop); connectDB(); app.listen(process.env.PORT || 8000, () => - console.log(`Server running on port ${process.env.PORT || 8000}`) + console.log(`Server running on port ${process.env.PORT || 8000}`), ); diff --git a/app/package-lock.json b/app/package-lock.json index 0eb6ef8..57f4d2c 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -28,6 +28,9 @@ "typescript": "^4.9.5", "web-vitals": "^2.1.4", "yup": "^1.4.0" + }, + "devDependencies": { + "prettier": "^3.3.3" } }, "node_modules/@adobe/css-tools": { @@ -14485,6 +14488,21 @@ "node": ">= 0.8.0" } }, + "node_modules/prettier": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/pretty-bytes": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", @@ -28443,6 +28461,12 @@ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" }, + "prettier": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "dev": true + }, "pretty-bytes": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", diff --git a/app/package.json b/app/package.json index 5a89bbd..73ea78c 100644 --- a/app/package.json +++ b/app/package.json @@ -28,7 +28,9 @@ "start": "react-scripts start", "build": "react-scripts build", "test": "react-scripts test", - "eject": "react-scripts eject" + "eject": "react-scripts eject", + "format": "npx prettier --write \"src/**/*.{js,jsx,ts,tsx}\"", + "format-check": "npx prettier --check \"src/**/*.{js,jsx,ts,tsx}\"" }, "eslintConfig": { "extends": [ @@ -47,5 +49,8 @@ "last 1 firefox version", "last 1 safari version" ] + }, + "devDependencies": { + "prettier": "^3.3.3" } } diff --git a/app/src/App.tsx b/app/src/App.tsx index a44b132..4321c72 100644 --- a/app/src/App.tsx +++ b/app/src/App.tsx @@ -9,13 +9,13 @@ import AuthCallback from "./pages/auth-callback"; function App(): ReactElement { return (
- - } /> - } /> - } /> - } /> - } /> - } /> + + } /> + } /> + } /> + } /> + } /> + } />
); From 7378a50049a58f5e1a6951044a4130cb767b6d08 Mon Sep 17 00:00:00 2001 From: Lyton Date: Sat, 9 Nov 2024 17:46:45 -0600 Subject: [PATCH 11/31] vcs: ignore all .env --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index e35094d..232fd4d 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,5 @@ npm-debug.log* yarn-debug.log* yarn-error.log* + +**/**/.env From d0897040f4c08edf29f4c9f4a9eb61af93e7a2cc Mon Sep 17 00:00:00 2001 From: Lyton Date: Sat, 9 Nov 2024 18:37:13 -0600 Subject: [PATCH 12/31] vcs: add example env file --- api/.env.example | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 api/.env.example diff --git a/api/.env.example b/api/.env.example new file mode 100644 index 0000000..295e10f --- /dev/null +++ b/api/.env.example @@ -0,0 +1,16 @@ +## copy this file and rename it to .env. Fill in the values from Notion + +# server +PORT=8000 + +# email service +SEND_GRID_API_KEY=##check notion## +SEND_GRID_TEST_EMAIL=##check notion## + +# database +MONGO_URI=##check notion## + +# backend auth +CLIENT_ORIGIN_URL=http://localhost:4040 +AUTH0_AUDIENCE=##check notion## +AUTH0_DOMAIN=##check notion## \ No newline at end of file From 7bd479ced631e85423b2ed0a52bf16e5444fc679 Mon Sep 17 00:00:00 2001 From: Lyton Date: Sat, 9 Nov 2024 19:47:51 -0600 Subject: [PATCH 13/31] feat: protect all api endpoints --- api/src/config/db.ts | 2 ++ api/src/controllers/auth0-errors.ts | 35 +++++++++++++++++++++++++ api/src/controllers/auth0-middleware.ts | 21 +++++++++++++++ api/src/controllers/auth0-notFound.ts | 11 ++++++++ api/src/routes/user.ts | 3 +++ api/src/routes/workshop.ts | 11 +++++++- api/src/server.ts | 13 ++++++--- 7 files changed, 91 insertions(+), 5 deletions(-) create mode 100644 api/src/controllers/auth0-errors.ts create mode 100644 api/src/controllers/auth0-middleware.ts create mode 100644 api/src/controllers/auth0-notFound.ts diff --git a/api/src/config/db.ts b/api/src/config/db.ts index 24fa884..553460f 100644 --- a/api/src/config/db.ts +++ b/api/src/config/db.ts @@ -2,6 +2,8 @@ import mongoose from "mongoose"; import dotenv from "dotenv"; import path from "path"; +dotenv.config({ path: path.resolve(__dirname, "../../.env") }); + // Connect to MongoDB const dbConnect = async () => { try { diff --git a/api/src/controllers/auth0-errors.ts b/api/src/controllers/auth0-errors.ts new file mode 100644 index 0000000..eaa874a --- /dev/null +++ b/api/src/controllers/auth0-errors.ts @@ -0,0 +1,35 @@ +import { Request, Response, NextFunction } from "express"; +import { + InvalidTokenError, + UnauthorizedError, +} from "express-oauth2-jwt-bearer"; + +export const errorHandler = ( + error: any, + request: Request, + response: Response, + next: NextFunction +) => { + console.log("Auth Error"); + + if (error instanceof InvalidTokenError) { + const message = "Bad credentials"; + + response.status(error.status).json({ message }); + + return; + } + + if (error instanceof UnauthorizedError) { + const message = "Requires authentication"; + + response.status(error.status).json({ message }); + + return; + } + + const status = 500; + const message = "Internal Server Error"; + + response.status(status).json({ message }); +}; diff --git a/api/src/controllers/auth0-middleware.ts b/api/src/controllers/auth0-middleware.ts new file mode 100644 index 0000000..ed88db0 --- /dev/null +++ b/api/src/controllers/auth0-middleware.ts @@ -0,0 +1,21 @@ +import { auth } from "express-oauth2-jwt-bearer"; +import dotenv from "dotenv"; +import path from "path"; + +dotenv.config({ path: path.resolve(__dirname, "../.env") }); + +const auth0Domain = process.env.AUTH0_DOMAIN; +const auth0Audience = process.env.AUTH0_AUDIENCE; + +try { + if (!auth0Domain || !auth0Audience) { + throw new Error("AUTH0_DOMAIN or AUTH0_AUDIENCE is not set"); + } +} catch (error) { + console.error(error); +} + +export const validateAccessToken = auth({ + issuerBaseURL: `https://${auth0Domain}`, + audience: auth0Audience, +}); diff --git a/api/src/controllers/auth0-notFound.ts b/api/src/controllers/auth0-notFound.ts new file mode 100644 index 0000000..56914e5 --- /dev/null +++ b/api/src/controllers/auth0-notFound.ts @@ -0,0 +1,11 @@ +import { Request, Response, NextFunction } from "express"; + +export const notFoundHandler = ( + request: Request, + response: Response, + next: NextFunction +) => { + const message = "Not Found"; + + response.status(404).json({ message }); +}; diff --git a/api/src/routes/user.ts b/api/src/routes/user.ts index a734b81..1edc571 100644 --- a/api/src/routes/user.ts +++ b/api/src/routes/user.ts @@ -1,9 +1,12 @@ import express from "express"; import mongoose from "mongoose"; import dbConnect from "../config/db"; +import { validateAccessToken } from "../controllers/auth0-middleware"; const router = express.Router(); +router.use(validateAccessToken); + // Call the dbConnect function to connect to MongoDB dbConnect(); diff --git a/api/src/routes/workshop.ts b/api/src/routes/workshop.ts index 4fa779c..57d92a0 100644 --- a/api/src/routes/workshop.ts +++ b/api/src/routes/workshop.ts @@ -1,11 +1,14 @@ import express from "express"; import mongoose from "mongoose"; import dbConnect from "../config/db"; // Import the dbConnect function +import { validateAccessToken } from "../controllers/auth0-middleware"; import { createWorkshop, getWorkshop } from "../controllers/workshopController"; const router = express.Router(); +router.use(validateAccessToken); + // Call the dbConnect function to connect to MongoDB dbConnect(); @@ -48,9 +51,15 @@ router.get( "/workshops/:id", async (req: express.Request, res: express.Response) => { await getWorkshop(req, res); - }, + } ); +router.post("/testId/:id", async (req: any, res: any) => { + res + .status(200) + .json({ message: "Workshop test successful", id: req.params.id }); +}); + // POPULATE VERSION (if details of mentor/mentee objects are needed on the frontend like name or picture) // import express from 'express'; diff --git a/api/src/server.ts b/api/src/server.ts index b5b7054..a7e3b84 100644 --- a/api/src/server.ts +++ b/api/src/server.ts @@ -1,11 +1,13 @@ -import express from "express"; -import bodyParser from "body-parser"; -import connectDB from "./config/db"; import dotenv from "dotenv"; import path from "path"; dotenv.config({ path: path.resolve(__dirname, "../.env") }); +import express from "express"; +import bodyParser from "body-parser"; +import connectDB from "./config/db"; +import { errorHandler } from "./controllers/auth0-errors"; +import { notFoundHandler } from "./controllers/auth0-notFound"; import * as routes from "./routes/index"; var cors = require("cors"); @@ -20,6 +22,9 @@ app.use("/workshop", routes.workshop); connectDB(); +app.use(notFoundHandler); +app.use(errorHandler); + app.listen(process.env.PORT || 8000, () => - console.log(`Server running on port ${process.env.PORT || 8000}`), + console.log(`Server running on port ${process.env.PORT || 8000}`) ); From ce7feb1a41b63e97ad7f174073d14d0adaa3dfb8 Mon Sep 17 00:00:00 2001 From: Lyton Date: Sat, 9 Nov 2024 19:53:12 -0600 Subject: [PATCH 14/31] lint: fixed linting errors --- api/src/controllers/auth0-errors.ts | 2 +- api/src/controllers/auth0-notFound.ts | 2 +- api/src/routes/workshop.ts | 2 +- api/src/server.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/api/src/controllers/auth0-errors.ts b/api/src/controllers/auth0-errors.ts index eaa874a..23dcee5 100644 --- a/api/src/controllers/auth0-errors.ts +++ b/api/src/controllers/auth0-errors.ts @@ -8,7 +8,7 @@ export const errorHandler = ( error: any, request: Request, response: Response, - next: NextFunction + next: NextFunction, ) => { console.log("Auth Error"); diff --git a/api/src/controllers/auth0-notFound.ts b/api/src/controllers/auth0-notFound.ts index 56914e5..752e809 100644 --- a/api/src/controllers/auth0-notFound.ts +++ b/api/src/controllers/auth0-notFound.ts @@ -3,7 +3,7 @@ import { Request, Response, NextFunction } from "express"; export const notFoundHandler = ( request: Request, response: Response, - next: NextFunction + next: NextFunction, ) => { const message = "Not Found"; diff --git a/api/src/routes/workshop.ts b/api/src/routes/workshop.ts index 57d92a0..6fba172 100644 --- a/api/src/routes/workshop.ts +++ b/api/src/routes/workshop.ts @@ -51,7 +51,7 @@ router.get( "/workshops/:id", async (req: express.Request, res: express.Response) => { await getWorkshop(req, res); - } + }, ); router.post("/testId/:id", async (req: any, res: any) => { diff --git a/api/src/server.ts b/api/src/server.ts index a7e3b84..2a4ecb9 100644 --- a/api/src/server.ts +++ b/api/src/server.ts @@ -26,5 +26,5 @@ app.use(notFoundHandler); app.use(errorHandler); app.listen(process.env.PORT || 8000, () => - console.log(`Server running on port ${process.env.PORT || 8000}`) + console.log(`Server running on port ${process.env.PORT || 8000}`), ); From ad79fc7beda6e249d399c1b5e2325467d1cf4e3a Mon Sep 17 00:00:00 2001 From: Lyton Date: Mon, 11 Nov 2024 16:34:45 -0600 Subject: [PATCH 15/31] ref: remove token validation from backend --- api/src/routes/user.ts | 15 +++++++++++---- api/src/routes/workshop.ts | 7 ++++--- api/src/server.ts | 2 +- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/api/src/routes/user.ts b/api/src/routes/user.ts index 1edc571..fc60779 100644 --- a/api/src/routes/user.ts +++ b/api/src/routes/user.ts @@ -1,11 +1,12 @@ import express from "express"; import mongoose from "mongoose"; import dbConnect from "../config/db"; -import { validateAccessToken } from "../controllers/auth0-middleware"; +// import { validateAccessToken } from "../controllers/auth0-middleware"; const router = express.Router(); -router.use(validateAccessToken); +// TODO: Add auth0 middleware +// router.use(validateAccessToken); // Call the dbConnect function to connect to MongoDB dbConnect(); @@ -69,9 +70,15 @@ router.post("/create-user", async (req: any, res: any) => { // Test route to check if the API is working router.post("/test", async (req: any, res: any) => { console.log("Received group data:"); - const { name } = req.body; - return res.status(200).json({ name }); + let name; + if (req.body.name === undefined) { + name = "empty"; + } else { + ({ name } = req.body); + } + + return res.status(200).json(`Your name is ${name}`); }); export default router; diff --git a/api/src/routes/workshop.ts b/api/src/routes/workshop.ts index 6fba172..dade82d 100644 --- a/api/src/routes/workshop.ts +++ b/api/src/routes/workshop.ts @@ -1,13 +1,14 @@ import express from "express"; import mongoose from "mongoose"; import dbConnect from "../config/db"; // Import the dbConnect function -import { validateAccessToken } from "../controllers/auth0-middleware"; +// import { validateAccessToken } from "../controllers/auth0-middleware"; import { createWorkshop, getWorkshop } from "../controllers/workshopController"; const router = express.Router(); -router.use(validateAccessToken); +// TODO: Add auth0 middleware +// router.use(validateAccessToken); // Call the dbConnect function to connect to MongoDB dbConnect(); @@ -51,7 +52,7 @@ router.get( "/workshops/:id", async (req: express.Request, res: express.Response) => { await getWorkshop(req, res); - }, + } ); router.post("/testId/:id", async (req: any, res: any) => { diff --git a/api/src/server.ts b/api/src/server.ts index 2a4ecb9..a7e3b84 100644 --- a/api/src/server.ts +++ b/api/src/server.ts @@ -26,5 +26,5 @@ app.use(notFoundHandler); app.use(errorHandler); app.listen(process.env.PORT || 8000, () => - console.log(`Server running on port ${process.env.PORT || 8000}`), + console.log(`Server running on port ${process.env.PORT || 8000}`) ); From 8d4fd773a18c9b5ae6d9f448b2989b1d51d46979 Mon Sep 17 00:00:00 2001 From: Lyton Date: Mon, 11 Nov 2024 16:42:08 -0600 Subject: [PATCH 16/31] lint: fixed linting errors --- api/src/routes/workshop.ts | 2 +- api/src/server.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/api/src/routes/workshop.ts b/api/src/routes/workshop.ts index dade82d..13d47a8 100644 --- a/api/src/routes/workshop.ts +++ b/api/src/routes/workshop.ts @@ -52,7 +52,7 @@ router.get( "/workshops/:id", async (req: express.Request, res: express.Response) => { await getWorkshop(req, res); - } + }, ); router.post("/testId/:id", async (req: any, res: any) => { diff --git a/api/src/server.ts b/api/src/server.ts index a7e3b84..2a4ecb9 100644 --- a/api/src/server.ts +++ b/api/src/server.ts @@ -26,5 +26,5 @@ app.use(notFoundHandler); app.use(errorHandler); app.listen(process.env.PORT || 8000, () => - console.log(`Server running on port ${process.env.PORT || 8000}`) + console.log(`Server running on port ${process.env.PORT || 8000}`), ); From fe25c5ecd96cf50e6a1b9fa2c3df385513f0a5be Mon Sep 17 00:00:00 2001 From: Lyton Date: Mon, 11 Nov 2024 16:46:04 -0600 Subject: [PATCH 17/31] fix: change sign up callback route and remove redundant code --- app/src/App.tsx | 2 +- app/src/components/mock-sign-up.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/App.tsx b/app/src/App.tsx index 4321c72..e225897 100644 --- a/app/src/App.tsx +++ b/app/src/App.tsx @@ -1,5 +1,5 @@ import React, { type ReactElement } from "react"; -import { BrowserRouter as Router, Routes, Route } from "react-router-dom"; +import { Routes, Route } from "react-router-dom"; import Home from "./pages/Home"; import MentorDashboard from "./pages/MentorDashboard"; import CreateWorkshop from "./pages/CreateWorkshop"; diff --git a/app/src/components/mock-sign-up.tsx b/app/src/components/mock-sign-up.tsx index 59e4560..4fdd26e 100644 --- a/app/src/components/mock-sign-up.tsx +++ b/app/src/components/mock-sign-up.tsx @@ -7,7 +7,7 @@ export const SignupButton = () => { const handleSignUp = async () => { await loginWithRedirect({ appState: { - returnTo: "/profile", + returnTo: "/home", }, authorizationParams: { screen_hint: "signup", From 8ddb307baae443bff69c114492d8a34ff1c6a817 Mon Sep 17 00:00:00 2001 From: kjgilder Date: Thu, 14 Nov 2024 19:29:29 -0600 Subject: [PATCH 18/31] Adding connection between New Workshop button and mongo database --- api/package-lock.json | 218 +++++++++++++++++++++++++++++++ api/package.json | 6 +- api/src/routes/workshop.ts | 71 ++++------ api/src/server.ts | 19 +-- app/src/pages/CreateWorkshop.tsx | 150 ++++++++++++--------- 5 files changed, 349 insertions(+), 115 deletions(-) diff --git a/api/package-lock.json b/api/package-lock.json index 3d1b60b..54c7776 100644 --- a/api/package-lock.json +++ b/api/package-lock.json @@ -24,7 +24,9 @@ "@types/node": "^22.8.1", "@types/uuid": "^10.0.0", "body-parser": "^1.20.3", + "nodemon": "^3.1.7", "prettier": "^3.3.3", + "ts-node": "^10.9.2", "typescript": "^5.6.2" } }, @@ -848,6 +850,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/has-property-descriptors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", @@ -918,6 +929,12 @@ "node": ">=0.10.0" } }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -1273,6 +1290,57 @@ "node": ">= 0.6" } }, + "node_modules/nodemon": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.7.tgz", + "integrity": "sha512-hLj7fuMow6f0lbB0cD14Lz2xNjwsyruH251Pk4t/yIitCFJbmY1myuLlHm/q06aST4jg6EgAh74PIBBrRqpVAQ==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/nodemon/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -1384,10 +1452,18 @@ "node": ">= 0.10" } }, +<<<<<<< Updated upstream "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" +======= + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true +>>>>>>> Stashed changes }, "node_modules/punycode": { "version": "2.3.1", @@ -1496,6 +1572,18 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/send": { "version": "0.19.0", "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", @@ -1589,6 +1677,18 @@ "resolved": "https://registry.npmjs.org/sift/-/sift-17.1.3.tgz", "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==" }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -1638,6 +1738,18 @@ "node": ">=0.10.0" } }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -1668,6 +1780,15 @@ "node": ">=0.6" } }, + "node_modules/touch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "dev": true, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, "node_modules/tr46": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", @@ -1797,6 +1918,12 @@ "node": ">=14.17" } }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, "node_modules/undici-types": { "version": "6.19.8", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", @@ -2526,6 +2653,12 @@ "get-intrinsic": "^1.1.3" } }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, "has-property-descriptors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", @@ -2572,6 +2705,12 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -2779,6 +2918,41 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" }, + "nodemon": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.7.tgz", + "integrity": "sha512-hLj7fuMow6f0lbB0cD14Lz2xNjwsyruH251Pk4t/yIitCFJbmY1myuLlHm/q06aST4jg6EgAh74PIBBrRqpVAQ==", + "dev": true, + "requires": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "dependencies": { + "debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "requires": { + "ms": "^2.1.3" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + } + } + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -2850,10 +3024,18 @@ "ipaddr.js": "1.9.1" } }, +<<<<<<< Updated upstream "proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" +======= + "pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true +>>>>>>> Stashed changes }, "punycode": { "version": "2.3.1", @@ -2920,6 +3102,12 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true + }, "send": { "version": "0.19.0", "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", @@ -2997,6 +3185,15 @@ "resolved": "https://registry.npmjs.org/sift/-/sift-17.1.3.tgz", "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==" }, + "simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "requires": { + "semver": "^7.5.3" + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -3034,6 +3231,15 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==" }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, "supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -3052,6 +3258,12 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, + "touch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "dev": true + }, "tr46": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", @@ -3127,6 +3339,12 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==" }, + "undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, "undici-types": { "version": "6.19.8", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", diff --git a/api/package.json b/api/package.json index de25796..1144eaa 100644 --- a/api/package.json +++ b/api/package.json @@ -5,8 +5,8 @@ "main": "src/server.ts", "scripts": { "build": "tsc", - "start": "nodemon ./dist/server.js", - "dev": "nodemon ./src/server.ts", + "start": "npx ts-node src/server.ts", + "dev": "nodemon --watch 'src/**/*.ts' --exec 'npx ts-node src/server.ts'", "test": "echo \"Error: no test specified\" && exit 1", "prettier": "prettier --single-quote --write 'src/**/*.{js,ts}'", "format": "prettier --check ." @@ -30,7 +30,9 @@ "@types/node": "^22.8.1", "@types/uuid": "^10.0.0", "body-parser": "^1.20.3", + "nodemon": "^3.1.7", "prettier": "^3.3.3", + "ts-node": "^10.9.2", "typescript": "^5.6.2" } } diff --git a/api/src/routes/workshop.ts b/api/src/routes/workshop.ts index 4fa779c..1b91d82 100644 --- a/api/src/routes/workshop.ts +++ b/api/src/routes/workshop.ts @@ -2,66 +2,51 @@ import express from "express"; import mongoose from "mongoose"; import dbConnect from "../config/db"; // Import the dbConnect function -import { createWorkshop, getWorkshop } from "../controllers/workshopController"; - -const router = express.Router(); +const router = express.Router() // Call the dbConnect function to connect to MongoDB dbConnect(); -// Workshop schema definition (name and S3 bucket ID) -const workshopIDSchema = new mongoose.Schema({ - name: String, - s3ID: String, -}); +// Workshop schema definition (name (required by user), description (required by user), and S3 bucket ID (not required as user input)) +const workshopSchema = new mongoose.Schema({ + name: { type: String, required: true }, + description: { type: String, required: true }, + s3id: { type: String, required: false }, +}) -const Workshop = mongoose.model("WorkshopID", workshopIDSchema); +const Workshop = mongoose.model("Workshop", workshopSchema) // Route to create a new workshop router.post("/create-workshop", async (req: any, res: any) => { - const { name, s3id } = req.body; + const { name, description, s3id } = req.body - if (!name || !s3id) { - return res.status(400).json({ message: "Missing required fields" }); + if (!name || !description ) { + return res.status(400).json({ message: "Missing required fields" }) } - // Create a new workshop - const newWorkshop = new Workshop({ - name, - s3id, - }); - try { - const savedWorkshop = await newWorkshop.save(); + // Create a new workshop with + const newWorkshop = new Workshop({ name, description, s3id }) + const savedWorkshop = await newWorkshop.save() + + // Success: res.status(201).json({ message: "Workshop created successfully", - WorkshopID: savedWorkshop, - }); + workshop: savedWorkshop, + }) + } catch (error) { - res.status(401).json({ message: "Failed to create workshop", error }); + console.error("Error saving workshop:", error) + res.status(500).json({ message: "Failed to create workshop", error }) } }); -// router.post("/workshops", createWorkshop) -// router.get('/workshops/:id', getWorkshop); -router.get( - "/workshops/:id", - async (req: express.Request, res: express.Response) => { - await getWorkshop(req, res); - }, -); - -// POPULATE VERSION (if details of mentor/mentee objects are needed on the frontend like name or picture) - -// import express from 'express'; -// import { createWorkshop, getWorkshop } from '../controllers/workshopController'; - -// const router = express.Router(); - -// router.post('/workshops', createWorkshop); -// router.get('/workshops/:id', getWorkshop); +// router.get( +// "/workshops/:id", +// async (req: express.Request, res: express.Response) => { +// await getWorkshop(req, res) +// } +// ) -// export default router; +export default router -export default router; -// NO POPULATE VERSION diff --git a/api/src/server.ts b/api/src/server.ts index c3f6ace..5933a3d 100644 --- a/api/src/server.ts +++ b/api/src/server.ts @@ -1,24 +1,25 @@ +import path from "path"; import dotenv from "dotenv"; dotenv.config({ path: path.resolve(__dirname, "../.env") }); import express from "express"; import bodyParser from "body-parser"; import connectDB from "./config/db"; -import * as routes from "./routes/index"; -import path from "path"; var cors = require("cors"); -const app = express(); -app.use(cors()); +const app = express() +app.use(cors({ origin: "http://localhost:3000" })); // Connect to the frontend PORT 3000 app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true })); +connectDB(); + +import * as routes from "./routes/index"; app.use("/user", routes.user); -app.use("/workshop", routes.workshop); +app.use("/api", routes.workshop); // New workshop route -connectDB(); -app.listen(process.env.PORT || 8000, () => - console.log(`Server running on port ${process.env.PORT || 8000}`), -); + +app.listen(process.env.PORT || 8000, () => console.log("Server running...")); + diff --git a/app/src/pages/CreateWorkshop.tsx b/app/src/pages/CreateWorkshop.tsx index fa1e61d..55f7a7f 100644 --- a/app/src/pages/CreateWorkshop.tsx +++ b/app/src/pages/CreateWorkshop.tsx @@ -3,75 +3,103 @@ import { Formik, Form, Field } from "formik"; import * as Yup from "yup"; import Navbar from "../components/Navbar"; -const CreateWorkshop = () => { - // Initial form values - const initialValues = { +const initialValues = { name: "", description: "", - }; +} - // Validation schema using Yup - const validationSchema = Yup.object().shape({ +// Validation schema using Yup +const validationSchema = Yup.object().shape({ name: Yup.string().required("Name is required"), description: Yup.string().required("Description is required"), - }); +}) - // Handle form submission - const handleSubmit = (values: any) => { - console.log(values); - }; +const CreateWorkshop = () => { + // Handle form submission + const handleSubmit = async (values: any, { setSubmitting, resetForm }: any) => { + setSubmitting(true) + try { + // Make a POST request to the backend API + const response = await fetch("http://localhost:8000/api/create-workshop", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + name: values.name, + description: values.description, + s3id: "example-s3-id", // TODO: Placeholder for S3 ID until set up + }), + }) - return ( - <> - -

Create Workshop

- - {({ errors, touched, isSubmitting }) => ( -
-
- - - {/* Display error message if name field is invalid */} - {errors.name && touched.name && ( -
{errors.name}
- )} -
+ // Parse the response + const data = await response.json() -
- - - {/* Display error message if description field is invalid */} - {errors.description && touched.description && ( -
{errors.description}
- )} -
+ if (response.ok) { + alert("Workshop created successfully!") + resetForm() // Reset the form after a successful submission + } else { + alert(`Error: ${data.message}`) + } + } catch (error) { + console.error("Error creating workshop:", error) + alert("Failed to create workshop. Please try again.") + } finally { + setSubmitting(false) + } + } - -
- )} -
- - ); -}; + {({ errors, touched, isSubmitting }) => ( +
+
+ + + {/* Display error message if name field is invalid */} + {errors.name && touched.name && ( +
{errors.name}
+ )} +
+ +
+ + + {/* Display error message if description field is invalid */} + {errors.description && touched.description && ( +
{errors.description}
+ )} +
+ + +
+ )} + + + ) +} -export default CreateWorkshop; +export default CreateWorkshop From 4d7b47b489476cac119ef350d366ca3440b99ba4 Mon Sep 17 00:00:00 2001 From: kjgilder Date: Thu, 14 Nov 2024 19:31:58 -0600 Subject: [PATCH 19/31] Applied prettier for lint check --- api/src/routes/workshop.ts | 26 ++++++++++++-------------- api/src/server.ts | 5 +---- 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/api/src/routes/workshop.ts b/api/src/routes/workshop.ts index 1b91d82..d9c7f7d 100644 --- a/api/src/routes/workshop.ts +++ b/api/src/routes/workshop.ts @@ -2,7 +2,7 @@ import express from "express"; import mongoose from "mongoose"; import dbConnect from "../config/db"; // Import the dbConnect function -const router = express.Router() +const router = express.Router(); // Call the dbConnect function to connect to MongoDB dbConnect(); @@ -12,32 +12,31 @@ const workshopSchema = new mongoose.Schema({ name: { type: String, required: true }, description: { type: String, required: true }, s3id: { type: String, required: false }, -}) +}); -const Workshop = mongoose.model("Workshop", workshopSchema) +const Workshop = mongoose.model("Workshop", workshopSchema); // Route to create a new workshop router.post("/create-workshop", async (req: any, res: any) => { - const { name, description, s3id } = req.body + const { name, description, s3id } = req.body; - if (!name || !description ) { - return res.status(400).json({ message: "Missing required fields" }) + if (!name || !description) { + return res.status(400).json({ message: "Missing required fields" }); } try { // Create a new workshop with - const newWorkshop = new Workshop({ name, description, s3id }) - const savedWorkshop = await newWorkshop.save() + const newWorkshop = new Workshop({ name, description, s3id }); + const savedWorkshop = await newWorkshop.save(); // Success: res.status(201).json({ message: "Workshop created successfully", workshop: savedWorkshop, - }) - + }); } catch (error) { - console.error("Error saving workshop:", error) - res.status(500).json({ message: "Failed to create workshop", error }) + console.error("Error saving workshop:", error); + res.status(500).json({ message: "Failed to create workshop", error }); } }); @@ -48,5 +47,4 @@ router.post("/create-workshop", async (req: any, res: any) => { // } // ) -export default router - +export default router; diff --git a/api/src/server.ts b/api/src/server.ts index 5933a3d..9b89ece 100644 --- a/api/src/server.ts +++ b/api/src/server.ts @@ -8,7 +8,7 @@ import connectDB from "./config/db"; var cors = require("cors"); -const app = express() +const app = express(); app.use(cors({ origin: "http://localhost:3000" })); // Connect to the frontend PORT 3000 app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true })); @@ -19,7 +19,4 @@ import * as routes from "./routes/index"; app.use("/user", routes.user); app.use("/api", routes.workshop); // New workshop route - - app.listen(process.env.PORT || 8000, () => console.log("Server running...")); - From ee027834e786a5ed7ec71b633a141a1cd605fa91 Mon Sep 17 00:00:00 2001 From: Kiersten Brennan Date: Fri, 15 Nov 2024 10:06:19 -0600 Subject: [PATCH 20/31] Mentee Dashboard --- app/src/App.tsx | 2 ++ app/src/assets/home.png | Bin 0 -> 1130 bytes app/src/components/Navbar.tsx | 15 ++++++--- app/src/pages/MenteeDashboard.tsx | 54 ++++++++++++++++++++++++++++++ app/src/styles/_components.scss | 15 ++++++++- app/src/styles/_utilities.scss | 12 ++++++- app/src/styles/_variables.scss | 15 ++++++--- app/src/styles/main.scss | 6 ++-- 8 files changed, 107 insertions(+), 12 deletions(-) create mode 100644 app/src/assets/home.png create mode 100644 app/src/pages/MenteeDashboard.tsx diff --git a/app/src/App.tsx b/app/src/App.tsx index 0b32a50..a8d7e2b 100644 --- a/app/src/App.tsx +++ b/app/src/App.tsx @@ -2,6 +2,7 @@ import React, { type ReactElement } from "react" import { BrowserRouter as Router, Routes, Route } from "react-router-dom" import Home from "./pages/Home" import MentorDashboard from "./pages/MentorDashboard" +import MenteeDashboard from "./pages/MenteeDashboard" import CreateWorkshop from "./pages/CreateWorkshop" function App(): ReactElement { return ( @@ -11,6 +12,7 @@ function App(): ReactElement { } /> } /> } /> + } /> } /> diff --git a/app/src/assets/home.png b/app/src/assets/home.png new file mode 100644 index 0000000000000000000000000000000000000000..f3b2179e9ef72650f625d7a2fd70cbf495dc3796 GIT binary patch literal 1130 zcmeAS@N?(olHy`uVBq!ia0vp^i9j5{!3HEb6{J^#r~;43Vg?3oVGw3ym^DWND9BhG z}9&!xPv*JN2X-jg8=IZx1YDT9~V$?kW+tB6B_pP zp!4VF|NZm!u#0fa{P5{hkUU>Idt2h2sg53V>-NVN$9@mgWbJ$WX1asN+@hT^pVwY< zVPWgw;1Lj%P*5^Zn7Vp#ciHdR*M6~VsawYoGizFEvw>=%`kd`i=C?|BYaC!)H_w8h z|83cCh89gOp+h-l*?mFZA2-`KufFpA_3PJqA_7t?E?P8BD_nEI`v_;rvdfb8{tSzj zeC6HA((+^OgQxaK{Xg_hsXDrA1NUa@dD>CtT_Ng1rH4%ZGcUNbcT?h<%!Xj0$A|q& zxOcWa;^y+w@%!*e{(-pOHRpQ|J}pn3Ir*!a-8W%ZQNHWV{kmRrJMMB`{=?7VkZ!Z@ z$I5tyLx*liGRZvr*Zv?oaBhbAZ2JWXIZs$l)%OS+tGwRJoU42CXLs7=BOSABUqr{L zClw!3`QOYG@GpGTRcGx(j4IPT=0+Um?EWOr|04JJrgI6dU192GMTa*1iFap63Q{lF zD1Ilr#Y*rdP)YoBuU^09pLq-eTC6rs6Q1_8K88u)-c=E|fQhe;IH{{l{2zGp8Az$; z)A|sg7oFx#2>a)rdi&LpAoV3Pfs)^>3`?D+{gj`YyHa?e-wCV#i#M$;bxQmrvsiXl z%qM%T;@3ws%%qoP?qdp0n=261u=&jY6=&88zes!j_b*Ek%hABI`x`&W|39F7F8xxA z_8La!wfuz_zvYJ~{y&&}=FC;W>3{mUu5y;V%Rgag^s}2$iHR8!%^j(FT5+4NE2b>j ztECtB^i9ZW{>mLj-IIG=7hK#X$8TfS`fi~`e*SR-DN*sZ-p4DR?21>6dlg`?M9n~< z^IwbHu~V0|{AU#NuP`{G$HXZxr*wPIXQp$zJ}Vai9 zSJrY`zWuw1&#&kFu~0wzl9XqgbysA|O|?8czgG5=<@wga*K2zBKMp=>@b1%<%K}lt zEhU~$lV`PF#p8RU1Otg1`$D7hqElS<-(UY&m;3$dhX0JuoPAFzIjvs+EE*U*UHx3v IIVCg!01}4qvH$=8 literal 0 HcmV?d00001 diff --git a/app/src/components/Navbar.tsx b/app/src/components/Navbar.tsx index 04c64f4..01ea404 100644 --- a/app/src/components/Navbar.tsx +++ b/app/src/components/Navbar.tsx @@ -15,13 +15,12 @@ const Navbar = (): ReactElement => { >
{ navigate("/home") }} - > - Home -
+ className="Navbar-body-home" + >
{ @@ -30,6 +29,14 @@ const Navbar = (): ReactElement => { > Mentor
+
{ + navigate("/mentee") + }} + > + Mentee +
{ diff --git a/app/src/pages/MenteeDashboard.tsx b/app/src/pages/MenteeDashboard.tsx new file mode 100644 index 0000000..c6168e5 --- /dev/null +++ b/app/src/pages/MenteeDashboard.tsx @@ -0,0 +1,54 @@ +import React, { useState } from "react" +import Navbar from "../components/Navbar" + +const MenteeDashboard = () => { + return ( + <> + +
+
+
My courses
+ +
+
+ +
+
+

Resume Workshop

+

Workshop content

+
+
+ +
+ +
+
+

Resume Workshop

+

Workshop content

+
+
+ +
+ +
+
+

Resume Workshop

+

Workshop content

+
+
+ +
+
+
+
Upcoming Events
+ +
+ +
+ + + + ) +} + +export default MenteeDashboard \ No newline at end of file diff --git a/app/src/styles/_components.scss b/app/src/styles/_components.scss index 89959b6..893505f 100644 --- a/app/src/styles/_components.scss +++ b/app/src/styles/_components.scss @@ -21,12 +21,25 @@ width: 125px; height: 75px; /* Adjust height based on the image’s aspect ratio */ } + &-home { + font-size: var(--pww-font-size-30); + font-weight: 900; + background-image: url('../assets/home.png'); + background-size: contain; /* Ensure the entire logo fits within the defined area */ + background-repeat: no-repeat; /* Prevent repeating */ + background-position: center; /* Center the logo within its container */ + width: 50px; // Reduced from 125px to be more proportional + height: 50px; // Reduced from 70px to match navbar height + margin-right: 20px; + } &-link { color: var(--pww-color-dark-1000); cursor: pointer; font-size: var(--pww-font-size-16); - + display: flex; // Add this + align-items: center; // Add this + height: 50px; // Match the height of the home icon &:hover { color: var(--pww-color-teal-1000); } diff --git a/app/src/styles/_utilities.scss b/app/src/styles/_utilities.scss index 3d202e1..30159a8 100644 --- a/app/src/styles/_utilities.scss +++ b/app/src/styles/_utilities.scss @@ -300,6 +300,7 @@ background-color: var(--pww-color-light-50); padding: 10px; border-radius: var(--pww-border-radius-8); + border: 1px solid var(--pww-color-gray-200); box-shadow: var(--pww-shadow-dark); height: fit-content; @@ -309,6 +310,9 @@ box-shadow: 0 0 3px 3px var(--pww-color-light-500); } } + &--noPadding { + padding: 0; + } &-dark { background-color: var(--pww-color-dark-1000); @@ -316,10 +320,11 @@ } .Block { - padding: 56px 48px; + padding: 30px 30px; box-shadow: var(--pww-shadow-dark); background-color: var(--pww-color-light-1000); border-radius: var(--pww-border-radius-8); + border: 1px solid var(--pww-color-gray-200); &-header { font-size: var(--pww-font-size-24); @@ -449,6 +454,8 @@ // } // } } +.Width--40 { width: 40%; } +.Width--60 { width: 60%; } .Width--50 { width: 50%; } .Width-max--100 { max-width: 100%; } @@ -456,6 +463,9 @@ .Height--100 { height: 100%; } +.Height--100vh { + height: 100vh; +} ul { list-style-type: none; diff --git a/app/src/styles/_variables.scss b/app/src/styles/_variables.scss index d4fb002..51cdc10 100644 --- a/app/src/styles/_variables.scss +++ b/app/src/styles/_variables.scss @@ -3,12 +3,17 @@ //add spaces so that the hex codes are lined up $pww-color-yellow: #B1CF24; -$pww-color-teal: #149BAF; -$pww-color-blue: #32559A; +//$pww-color-teal: #149BAF; +$pww-color-teal: #0096C0; +//$pww-color-blue: #32559A; +$pww-color-blue: #4C65A6; $pww-color-red: #DB504A; -$pww-color-green: #4A9A4E; +// $pww-color-green: #4A9A4E; +$pww-color-green: #BFD71B; $pww-color-light: #ffffff; -$pww-color-gray: #626262; +$pww-color-neutral: #f6f4ef; +// $pww-color-gray: #626262; +$pww-color-gray: #545454; $pww-color-dark: #000000; // allow the colors to be used in inline styles @@ -19,6 +24,7 @@ $palette: ( "red": $pww-color-red, "green": $pww-color-green, "light": $pww-color-light, + "neutral": $pww-color-neutral, "gray": $pww-color-gray, "dark": $pww-color-dark ); @@ -59,6 +65,7 @@ $zIndex: -10 -5 0 5 10 50 100 1000; // initializes all the vairations of the variables :root { + @each $fontSize in $fontSizes { --pww-font-size-#{$fontSize}: #{$fontSize}px; } diff --git a/app/src/styles/main.scss b/app/src/styles/main.scss index a1bc20b..ad13c4c 100644 --- a/app/src/styles/main.scss +++ b/app/src/styles/main.scss @@ -1,5 +1,6 @@ // Imports for all of the external libraries @import url('https://fonts.googleapis.com/css?family=Rubik'); +@import url('https://fonts.googleapis.com/css?family=Lato'); @import url('https://pro.fontawesome.com/releases/v5.10.0/css/all.css'); @import '~bootstrap/scss/bootstrap-utilities.scss'; @@ -32,14 +33,15 @@ // Fonts html, body { - font-family: 'Quattrocento'; + // font-family: 'Quattrocento'; + font-family: Lato; margin: 0; } // default settings for the body body { font-size: var(--pww-font-size-4); - background-color: var(--pww-color-blue-100); + background-color: var(--pww-color-neutral-1000); color: var(--pww-color-dark-1000); } From 4af7cd8ec62210051ca06462cd74aaf84c343f70 Mon Sep 17 00:00:00 2001 From: kjgilder Date: Fri, 15 Nov 2024 13:14:18 -0600 Subject: [PATCH 21/31] Changed post to using api.ts --- app/src/pages/CreateWorkshop.tsx | 28 ++++++++-------------------- 1 file changed, 8 insertions(+), 20 deletions(-) diff --git a/app/src/pages/CreateWorkshop.tsx b/app/src/pages/CreateWorkshop.tsx index 55f7a7f..5e00cd7 100644 --- a/app/src/pages/CreateWorkshop.tsx +++ b/app/src/pages/CreateWorkshop.tsx @@ -2,6 +2,7 @@ import React from "react"; import { Formik, Form, Field } from "formik"; import * as Yup from "yup"; import Navbar from "../components/Navbar"; +import { api } from "../api"; const initialValues = { name: "", @@ -19,28 +20,15 @@ const CreateWorkshop = () => { const handleSubmit = async (values: any, { setSubmitting, resetForm }: any) => { setSubmitting(true) try { - // Make a POST request to the backend API - const response = await fetch("http://localhost:8000/api/create-workshop", { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ - name: values.name, - description: values.description, - s3id: "example-s3-id", // TODO: Placeholder for S3 ID until set up - }), - }) + const payload = { + name: values.name, + description: values.description, + s3id: "example-s3-id", // TODO: Placeholder for S3 ID until set up + }; - // Parse the response - const data = await response.json() + await api.post("/api/create-workshop", payload); + // api.ts deals with error responses ! - if (response.ok) { - alert("Workshop created successfully!") - resetForm() // Reset the form after a successful submission - } else { - alert(`Error: ${data.message}`) - } } catch (error) { console.error("Error creating workshop:", error) alert("Failed to create workshop. Please try again.") From 04d8b43b6075874a1568db586a3698946ce12ca8 Mon Sep 17 00:00:00 2001 From: Grayson Marie Smith Date: Sun, 17 Nov 2024 14:26:55 -0600 Subject: [PATCH 22/31] Add Mentor Dashboard Home --- app/src/assets/home.png | Bin 0 -> 1130 bytes app/src/assets/jane.jpg | Bin 0 -> 21962 bytes app/src/assets/jess.jpg | Bin 0 -> 28702 bytes app/src/assets/john.jpg | Bin 0 -> 28430 bytes app/src/components/Navbar.tsx | 7 +- app/src/pages/MentorDashboard.tsx | 148 +++++++++++++++++++++++++++++- app/src/styles/_components.scss | 12 +++ app/src/styles/_utilities.scss | 29 +++++- app/src/styles/_variables.scss | 14 ++- app/src/styles/main.scss | 6 +- 10 files changed, 200 insertions(+), 16 deletions(-) create mode 100644 app/src/assets/home.png create mode 100644 app/src/assets/jane.jpg create mode 100644 app/src/assets/jess.jpg create mode 100644 app/src/assets/john.jpg diff --git a/app/src/assets/home.png b/app/src/assets/home.png new file mode 100644 index 0000000000000000000000000000000000000000..f3b2179e9ef72650f625d7a2fd70cbf495dc3796 GIT binary patch literal 1130 zcmeAS@N?(olHy`uVBq!ia0vp^i9j5{!3HEb6{J^#r~;43Vg?3oVGw3ym^DWND9BhG z}9&!xPv*JN2X-jg8=IZx1YDT9~V$?kW+tB6B_pP zp!4VF|NZm!u#0fa{P5{hkUU>Idt2h2sg53V>-NVN$9@mgWbJ$WX1asN+@hT^pVwY< zVPWgw;1Lj%P*5^Zn7Vp#ciHdR*M6~VsawYoGizFEvw>=%`kd`i=C?|BYaC!)H_w8h z|83cCh89gOp+h-l*?mFZA2-`KufFpA_3PJqA_7t?E?P8BD_nEI`v_;rvdfb8{tSzj zeC6HA((+^OgQxaK{Xg_hsXDrA1NUa@dD>CtT_Ng1rH4%ZGcUNbcT?h<%!Xj0$A|q& zxOcWa;^y+w@%!*e{(-pOHRpQ|J}pn3Ir*!a-8W%ZQNHWV{kmRrJMMB`{=?7VkZ!Z@ z$I5tyLx*liGRZvr*Zv?oaBhbAZ2JWXIZs$l)%OS+tGwRJoU42CXLs7=BOSABUqr{L zClw!3`QOYG@GpGTRcGx(j4IPT=0+Um?EWOr|04JJrgI6dU192GMTa*1iFap63Q{lF zD1Ilr#Y*rdP)YoBuU^09pLq-eTC6rs6Q1_8K88u)-c=E|fQhe;IH{{l{2zGp8Az$; z)A|sg7oFx#2>a)rdi&LpAoV3Pfs)^>3`?D+{gj`YyHa?e-wCV#i#M$;bxQmrvsiXl z%qM%T;@3ws%%qoP?qdp0n=261u=&jY6=&88zes!j_b*Ek%hABI`x`&W|39F7F8xxA z_8La!wfuz_zvYJ~{y&&}=FC;W>3{mUu5y;V%Rgag^s}2$iHR8!%^j(FT5+4NE2b>j ztECtB^i9ZW{>mLj-IIG=7hK#X$8TfS`fi~`e*SR-DN*sZ-p4DR?21>6dlg`?M9n~< z^IwbHu~V0|{AU#NuP`{G$HXZxr*wPIXQp$zJ}Vai9 zSJrY`zWuw1&#&kFu~0wzl9XqgbysA|O|?8czgG5=<@wga*K2zBKMp=>@b1%<%K}lt zEhU~$lV`PF#p8RU1Otg1`$D7hqElS<-(UY&m;3$dhX0JuoPAFzIjvs+EE*U*UHx3v IIVCg!01}4qvH$=8 literal 0 HcmV?d00001 diff --git a/app/src/assets/jane.jpg b/app/src/assets/jane.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2ef969143401fd9768d3353d1e174d4fd9173715 GIT binary patch literal 21962 zcmbrF1ymhD)}Z_0?(XjH?oM#G;O=e#g1Zw4?iMV#hTt09HMnbVUo!LW%S0$2gS*wocYK}|{>co$hoaT3>eqrd!bxt#~z zQv!e)Mj2%il7H*}uL#xD$;Ax-K+5md>}KY!rtci`&UT(|PJi_m?~Gw$`2w)>||zd_LuwKIl{x;{GGu+ymOd`wYldz&%QH- zox8pDJKw)EhP}D5D*!+s{MEaen_9gy%R3{usH=*lOos1p40pOqa{5KYW_P17^AwYe$N-va%Y{2vYe zW%<8`|F|C0-|PLW>_{ZcEsWjm+(`Zws;Q%$qq_@K1FR+eKhFQd2`v8oCzz|XCCOj4 zxT-pdsk@8EUw-cse@~DA9Dod90Js1VKn~CVi~t+J4e$dZfFvLXC;{q#4)75$1*`yj zzyp56yC zXb>U@9fS)a22q0OL2Mu%kPt``^Z}#_(g7KPEI|$+chDzLFen<71j+#AgUUg*pjJ>f zXc#mFS^{l?4ncoFk6_?n2w)gsgkV%)%wRlVqG0l1>R<+7mSE0cK42kWabRD;3cxDC zn!vijM#1L5Ho%U-ZomO>cyKImQgB9a9&mARC2(DE3vd^3fAA>qRPX}uYVbDjLGT&y z4e%522M8z#bO;g%MhJcg83+vsQwV1We~1`}42Uv_CWt7^rNh8mKO)DX49z z8)#@~Txfb|L1-mtV`w+%Fz9sXO6Z@^)6l!n_b~7<#4v0yQZTwO4lqG5sW9JQI$@?^ z_F8?@&xh;3M>j0ia3ff zia$ywN-N3&$_*+yDl4iIsy%89>NnJ3)B`kVG%7SnG&8giv_iCAv~6^7baHfYbW`+T z^dj_r^j!=n3~CHn3>%DSj4F(Aj0;ROOb$#bh&qW5 ziP4FLh^>iJh<_3vkzkUDlGu@aCFvu%ASED`A$2FsCmkn!BBLhLAPXX^AzLGdBj+Kv zAWtFhA-|v?rcj{xL{UMpObJWLLuo~sMmb1%M@3DgMHNofOm#qwLoG|~LtR0=N`puv zOyf*bKr>4VMax5LOPftQNe4#9NoPfuNjE_cM$biWO`lCa#Q@2`%izFJz_7rGz$nV- z!C1k#$%Mu9fhmZondyv~f?1b2k$I5$m4%bVj-`lYg%yoejx~t2jr9*39h)gzCfh7K zBD)lO0DBAjB?mo+IY$o1A}2bh0%tg959bRPHb$} zuV~O{xNG!iB5UevmTTT=NoXZ$ZD=!V`)QBr;OSWFwCFK2ko#z7W2qzCE8vKLvi;^b_^V_Xqi#`1b^m2ZRLdewO}R z76=z;8#ork5|k8l9jq1H7D5>EIb=IjI+Ljm~|{ zv(8)0m(Fi0pejf$gevqX+$+*78Z721E-%3=i7t65btv5^Q!VQ&=Pob*M({1Z0<6Nl z;;>S`aE-I==?1Ci*+@-TnJftx@fKoqSzSJx_gg17$;2BYI<06R63%>7v=H zd80+AWvW%KwWp20t+Ab{y|jb0Bl8F5kN8fw&XCTxpFTftx}3UBx-Gl6dklM4dbN9J z`&9bI`{nzG2BZdh2So>e4har*4D$`Qj_`~$k8+JR{o?%9IL0~FIL4E@MMcLUz`@2LAR{Iwqo<|k;gJXZ|0eL(1E9iyHb5faATj_96$Fk7 zdh2_4LI4mre%B8ZJW%Qs~$M$=xVaaz)VWH|;+R5pwQLmo`y47L^uW38*N z8%a#YM!7FTvacu+tU@DWHSF4@ye=YQj8pW(0tng(Me2i}+{Sk_8dnZ{wV9i>h+7zBJZ~ zVnwM77*rG*qzY@w%ZX!Ll!Qie$Y6+{UqG?)Q&OU>*5E%Vtl&df8;3oD-SZ1!-Kg?B zK#ll`XoQhQl948Cs?)U7P301l#yquD94bK(U{pt^F@2~Q7@0-rqD3_FGW{k6=n6-@ zh;g6MkkVrZHkin0W=R`8x-u#;L9|$46za4RB(Rc*bTMhN4H>kWVve?b-&Bj>`bq|E z2neCuac0AeXWNJ3_)mRxRVfC*oNYRM`$oMg~g>C$kdSrM*N2LrROU4#tTZ z?3_pwQdVwqSV7-1lGuQE!kOKeumfX{%cJHV^9^kvGbw>I8#b(VRbRfD(~&5@(X%;g zaBm=7<8|bEV*KN;+$r;p@oS4;-kOIJn;ysbA|O4uu*^V)q9F%PN-0CtaK6be6bXrL zU_oZx%l&f3Kl(T+tnmxjX|NcVI}#Y@H?)=&g~nuRh3+KlKG^sXE4r{3%90m(H*zdp zYh+$7ED8z~Y?bk174-`DAh#u+tn!;3Dp$kNU8OsX;N@H+6+YU)*J_*0!?P*Jj- zV#mf!wkRo1#jo#LnTk2+gu!Ahr<#rchO|W|+Lk7QWPRw!m)e4y;lsz({W}cAa+IPd zO!YX+Nv(>+;GDA`Go~YHEyxYIy-?26=+3*orkG>$XzoZ7+^CqOkxc1P4E~u`#;jk% zdclltDq&Khzghfy3`axEC`eMh7^-#`xr|8q>Zxu=p7D61WQ+6IfIM?%pF#bu%0Mc% zN-pCIdsz7jQ#f-G$yrwH{foccfTK!)ZLqL!{MGQe;OfizK~tP}DnF}292ldTjB`en z`v_1R$xllcQpvx_5LCpdC6DP=Mv6@TBJt;U=I`{|8mEQ68v%SopKk0W$JpB6l_i^?vkK?iZgb6dy!otLC0zjsc&r=Cw2uJ&$v2Y-rtT=}ue(Y>mr6f>xq!1g5D z$|^)^@9Lry^;p-{U~9H1Q_%eq`@p3!BMSR4b4Z>2oU3$gP$AFq6MgbvH1v)rz_5TL zy)>tBGlp#K(PE+^?qa2Z$R_dfXx+`^Y9UC_@~YX9JBKe7cKC+J|ADb$y)<1HgDPRI z*Mvr)o6R3p;s_1VoJIeOexk&OBouWLF+NZm9O=PF318xEXzZC69r35?-GS?zPY!!47tZ2DV(k`CcQ0 zTm+%6h^EC3v;0l53zK>0jb}Nxw@Q313Cxdf+?oqd8g@dyPw?a_D)GBp>Ilp47#E-`O?^za^c(y_vr(Et-!N$M$AHiCz+LX z0)^6zD%GcD-tn&E2@QAg``3A-{Ql1yi?@<`jL> z;!^BhNL0?0ykm~#TMcpTZZSGolE7l}ka<(q4vde&L`YWB^4~W*O*(E|7%pwTO&u*@ z*=m0>Ag*>9NRm#vp7MZ_n*4qmK}w4q_$6MTw5jU&xjpukgW56i_(Sd1p!!1Y&tr|n ze7(>H^@5`eo&MdWnRrWWnQV*iOi*~rrM{8w^=qy8+!WUV;msZThApf@er_^KRjD<^t^}5eT0RTEv!pUV$i>ijPPad?_jZ1)p2R1p9qmH z&I)?`q;RjcNezXNQgi3=aLT>ge8c97^%Y)ig%hMZ=~ESvcu#N(GCeQ~4B z*Y&Vkd)j{diixUQ&UK>=ehJroek+b?>&T|zLemM?XYm)8p*?qlL5%Er?W(%vTCeO1 zyzQ!6ErP8&os%ye2iH(hf5NQXiFWOLb<*ny0PDtY=(-6q{Fm7F59X8K7-Gy8(d%J6 zg`*em1?}f`?2zslaS%$-TF>k~nLJ^bOWpMc2w6)6$IO4SHUp0bv$VV;Rf`2xg$feE zKatIjjN)&qj*$C(Q@y2HnIT>#nxk$7R-0#WkIn*9*hWw>%uda9@JEL=>4mxd)qN;~BLf(M^Ukghnoq>Tyc|NaTveu$ z3PCY3)CK3L2sNpPT3&J74*P6^(cRzwG;OVzmBnRo2NsOAPuEbFv@qvG=wNOrpS#G2 ze~#M+PuZ!C4c|j%J@I#c-oI`ioiN_pJG2h&ykkeoO7TR)I~GztvGbXNbmVP6nl?(u zR_iWxTKx4}16a6f`@wbm6xNtnJrrjUwaaiTkNeE-a7Uk0l&$8pYi~BeU$cb3#LqS; za6$e3p#5->tIXBr_WMX89l8pX@%7p2oDlc=^OlQ5zoGag?_NK%V|vhxrhrf3cVyGyQ+Qi7H|!AiB8r`zVjPOj3UeWlmA8m5^?j3Ipee*D+x^R^iy=@oRl16|xytL~m!HJ$=cul}Iea=R=QYp0YM*`NvmaI{1?g1hYQlP}J+-pc zllx@ZrSVK7KU&Pmt9LuVPJEK3KC-A*aj4Dcy?oS(OeH>Wh~p*{A0ZlY^~p)H$t(%o z5|j`{k-LNvd|YRJWtS8v@OD+cc|~r{q^*&Ts&910t^C}wKRl?gD4_Mzw$H$N;M(C& zWD@;p0OjD7r=+VRx7*Vf$FBz#>ZrV8+8o!_q3uWf?3=6)S%Rvwk&&H*>0|6HV>}C} zY5mS^{1E5Ria+8!!mlN-(yniI{0u)x{edvu=Vw_Jr|MhsFiyv9${@>jWDL3^<~rRW z#oA$8`N+QR-&UoBj+v?fUFob@dS`3+qa3)Ng+q`}01HOX+0I;*SIK+1fad z7#|me^zXHFN{Bg$=v%i80o493W-*?f6a0#gr4J5|-!J@Ee4;31 z(&DEh$cDi?kf)`}LTdlDRZcDTRMn5_+LEKdE5;9D;`Im+wRRCDKS3 z|6&RuN0!M93ATg-*?{G`>Oh6jz-^=pPHl-QrznrUZdSIm01Rgh?on;#bCE}2O4Lbn z-gNprf9-eCX^LmUdK?FyIU`g(4vfJQ4| zNO~`pA5EPiq6{NXF~WN9Y0Q|)XrOO9i093kAoa^^@FQEQ3i@N`#%9}oj`Z>)ZUpOEUJaTu5RlB-!|)#>Ol}1(z(EfH!rQH;4z4sJh;zr zbDOkc`F%tzjexpAoR&1O1Wm<)VyZgo3ys#Wa-O?>jdQss(xdMursf8lrD*)GSd1y= zl=Jo+$BIe|%+9TtaoeJc{FwV~PU2cu7wWHo)s$F@FyABIu~vIp+>HZnd|Z>gtx3a> zY*_oUQ!~esBKDYz5VcvRu=YbI-x4D2-C=ZVbsJCthhe2CxA}ulpto zrP`|Pn;*y?%oiVOEFSrlcNl$`q^ca5v(}pxP5mvp?dxg;Hrbl^cRI{7q9iF&9S1C{ zv)pXQ+@z&4FLNJV1auut=3Jk>a~~>1H}xfJSXQ@duww_oS1zi;&^&ggz8^lB54BCz z`Nwav)dqZAy|!K0G?n_y(XC|{&KbN}Ic|$f;iZR;%(U>heAzT;x!q=4&h;P^y_}B? z{@MKQpw=2*#UvC)IESX5U67LMW*$xc%7r#e)rSoHhdSUFxx#8)ov)mK^On_q%YE(J=ip^dY3dh#C) z1#&G;RG9dFf9y431YPS7{o$ovvaxaOfw2*em4xHj|KS9bI zvpIdOYX8HlS|Xd1&Jy*|C+8EQ2sd*d#*Lb!A~%hc3Q|ZJj$Z3tml~)~@Yl>#)_T-f z#}7ZkqqtY8R?M&V30*vF9-j`!mD%S!f^D>1X0)R zGm&gowG9X^K-U@HDzf(;rMB9w`_lW3<9*OpWO?{4vVCK;`;rdd9;8=NQa}`cuJ8e_ zF5!BPU6Yu-^rRW}1PdS2Ky&o_8<2PZ20WK@T20ECA-^D$h?27;G+SiEa`FIh9JAKt zA+h9*tk5ys(yimeb*mOvsTm$(Bfg)~>-NarfJr&ZTQdfD%o3yiuStE0a>e?MXamxo zo*t+16fPZHOJl;^gPOWI4!un2)VoOXV`ut0L!!||Rm?ZY=d-H(VH7!IsB#J{Bt;El zjB+2gIHyhAoA}PnI2+8MvhDbu#^I@> z?KSa2%>lu8sAw&-Tlxj_&b0kk*)SLPf4a~&~HE>6}EYWOvV%=N%O-~QV@n21Z(^-Fjf6U?8~EV0?TdYr*zxn z_9|0?x_-}?kq!1w`H3@>KZeZeRg^F$oT+q|?Z)=V`oyLTif}(NKFaYgq%CLIkbmQ# zZ(CtsdGBY<9|lTIot;aM@6vc-PfXIVn=KoT2|A^8o5Rsf1L)vkF7NTPe#FK$Hi?)s zYTOrQT&BCzS%2yGTzm#U91GiJTWE!?ztdH$;WshuHrUwQ87tHqB>9=jSKla8$G)t) zL{P1#*k#6upyfL3H4@t+P>lcTG244-ZL|3hY?S)s)Y8Qi8#<`FL%CRe|0>8tT)@<_ zpuf1^k%sMP>X?)>4TWDK4sSg>DcC9YQkV!E`|7{5@jFKTZh5jK{*aKy@DJvmEQ?pD zFO4@peWj>9G@Jf*GAD1Pd5p8gScfv=-kof7BNF#X9MXte>QWg3lw(}83qkHZMq`!s zOKrEZ-d^csZ9UaTJ)EmM-Iq>zqXnZ0A^&5LIRUa3tfx>d=Fa2dfEae7qg@pf;xn5_ zn0T*#_{j`1<9$P641){m3wQY$_o`ZGq=YZ!O_foa)v(h#wtYt{4?kE*jbTTj=>p1R z(ad)0t2{hG@A~p;&(^Y-ECP%syu7}srPpr*Gvjb%QdKYA9s zA;#z}@IlD5YbNM=Sfw7F+bfh|){Iqq*5Aw|Pjb4i129|W@sEGjpSS$hYxxvqSaB%at9N2wZCb)mCz)M4#Uk)IReP1ftAF?SWWt2-W4p8T_{NH0dtur&=aau+pL zuPGin^07$o`Dtk~iN54$FrCdzWNSNgO6#i~wZ!c9^}+rAY{^z8II;QyiyON94&qXlQfIjtIge&hm&QracoY}0QSohXjJT640(YTEuaZb8fIO7qRZ9FbwG3zy!F z+JUEddRr{kABwK3wpf>v%^%&(I5~d!i7_!fY^&YV3Gogu$`g*fEP4&b;0{xzRP?m@ zGabG*X7uoqd8{~mXSL^AY~HDCLR(;VNTJ)=E$A9`c_>elA#ZT5`9%KZVX@dP%CW zPH=#%c79FCjc|{)Z_|YQclnf5Y1gLVB}=lDN93aIy_V6P)}yl?+qT9utSK_d0MDNJ zdbvyeqP@*|TlmT>Z#>a(eRoTW2Vvq*D-i7vORyAdggJ`c3^FG7@Z>snufF^vE1a3D zKf0H<`z0|lS63B`19McI*lYzx**Z>>iYoCcTQE1|`G?uBPSigBI@=dy&imDscGKs9 zE9*`4WVy30yQ7ED*eQ0lolM%NzqCNRvd#Kfm3>07R`o0<@0Qd{9{&amcbnF;IYZ{+ z4<_UqX9`npa59=}bH6W0WdANmz`;RK;E)i|5HQgHwID%-L?dN|LO~}JH6~GU#$aI! zOcYZ!$%n=yXRqy^q7ZROg29q7bqxxx!xmRlFW9>LuT=}UFz^(7VWvzt*s*`sZ~8JQ zI1pK>QW>?sDeOMsi6KNP{xXx>vekOes&hXEH`rx$=X$Xf-<#XgU3rJxMsXJ?zOnx^ zKIRQ*hr2D*IpeJ)I`h51cV71=@@>73C3>YNT*?>mgyT@K+!}Oxs=UknJXKOC^>wQ7 z_k{DqGw(TADAJ}_C>#d=pob6<&D0p4;6N;Kusgc+=7jT^u$$F0h2K0Rs!kq%z4m=z zrC;|`t^V^TRa|9x3M$kVom!<>~2rXviaw8Ffot`V| zUox6fZOi{)SjK=RJ|r7tgnw-qO@BBjR(rPn?$eh;FukhXf-7tVP(RO=99>2-oabdD zS32N@ufE@K&ZbmqsO!bfyr7jPa=&TuioC10TSDLGR7(;hddctX;)QyRqcQQg&$SEI zoYp&EZm11@*Tsm%=atSfnYn+72{~hsUCVkt*62`9o)CEQ!Nuu>-dCf!qAjl)-XMrU zkrKtMw(^vBEjdcVatTs2b)+4hATJh1qGWuse029W3igJ}HXt z^O#t=wf@jxULm;?%nKyrWJ^lW2iq*oY&5$h=yiXESE&M791@%f>FsL{_8_j@WK{=T zeA$D5$r);u#H%X9N5PILY;UG(YaFlJklp-Oo`5mi52sk^mgUyX*3R}$f!m2lqEO+# zvod(Ag@nBG*R1oc)3}?Nz@&--j|L~Jp6cG75jl}c44-`~f-dH%)?=|ik;LpviZ zF2&v&AeUCh_vbK8E%&HON(2{nYu$BP^6_!f2!V_+QmJXEJvM!|-NKmTzfj^pRH7+F+zvFj6C9O$Nuek+#z{_bHJ3ivc zV4MblqVB4xh)pVLpXJ?_Wd>J=S^)Mrs4@UmEw)SJbL`FsZwlihSxsn63stfFkgp2u zKHxDqo!8X*TNzZWKd^>g@@Li~x39~dNS9yO4okpbpZTq4cB;Cm53DI;2^GZwX{RyM zmYf@^w7AVxMC6z$sFpKqM#oa1S5~*n@eS`!UiByV1l;Z1 zK}efUf>}5E*{W*qY!;b4g8F4Cu9|p6cZvH3t%%j8W3zgec+3rX?*x?|l~bpxcf`n! zI*<5F($C<(zObI~9_x6`I^i=u&|uUs!*^pSMYIQ)p+DgDrKuzymA)EB?a0QpFbF>4 zIbEV`;83V4)f1>tZJO%GBk^uOq9)Np@F6?Da!`n$cN3HAAm!3=J(m2)>&TMDTNi_U z@c#HdG=+2cqyE0NCs#@1Spv^`??iJun}Loe>(cv4N*oSn9A3)kty?*&{#LCjk5d_s zJc)I83qh0*A-`i@O;YFQm#0ztoVVk$oIk=XU-#B0pI`^RVhri@>{Ob2-Emy9c?ZBD zOb>_-QVBHg*`72*eQ+8Ay#XV0n+=PH9f{{TR>;jw!Y3bkUulMnUoj}^PUdF)sB5jh z=4!?#8d_#(FPd5pJrao)LWJIKYG?N}8Ib#Ma$C0hE{%?LQ7`+C(LM}1@4f*9%3gCn zIvG5ppwASDE*+Ny{lx+hQwHCFfug3UEw%29rMPoD&_~R*3?u9w2i_g?fKd+Sb|q_S zeEZB;@jOTU7m8f^SU$ z40|czw=n@#V_#4b^ac1&}zTA9x)vAM#PW(WN+)APiD`jFB4*o&!;77qzy||yo3H}8oZD}$x zix^g@I2YkZ^WTXR)Aij+HyUdm6$kH@Kp{Y!!YM zR;9BY<;>vNlDK3M*-Q&lJ44im&2>#A+jZd?8b9Jr&(3{PxevU-+*(G?*qEC2MN0j( zWQ!jjeo(ciJLvfXZ=#A|Tkt-ARoc1m0{p`CJ7J;Wdb6>rp=|NWxA*NMH`rHZE?cP? zH%3~Ac}(dr4*ag2M1zE8t%S9eg2b>@u}g!{Q^NA#$LYC?c7Zr<)IU{dzP>GtyW$vm z_76dVHvISIsH54xket|H2yGq@aEh{3B#MLMHK=zF=9XSqw^Mz~ala%+QXr|Dv=dr_ zd)2@YnAO9*#v`u$s5&vLC6k#=&RQ@!cM#3kQwTBAjD%m|iuH-Qt?6XX`XbapEH2N% z-8A0OayjcZ@CNk97phsO#mFTN^J3JXT8Jj_80)hUX-5L1i?V?zgr$94AR7oFF|HoIWM!IlUlypGYzH4>MkhU<4Vd zJrX*6En|q>kCHR$S@116=x5qmDW7o9!8f5hp0#U;>-aVX0+w>Bt~-}kI(|4foK_|H zw$?zcqVU0;tY^DA+q+jSuZ*FLN^=CULGK&nWE@CCRXNgQk$AaOSQO3zZcfq@983)d zzX`R-LNiBPRaOnZwI0~kFAJayI+v}8Q$(l8QfOE_f=OCcQAA^&c7&IpnVCLUNT8?q z9;hdG{Z4*_3s(E2cjkPwB11ghEIo8x(_oD@0!;&3+VI7*1_FvWo3^cXC2)r~zv#BU z-qSzPP%^iWYesJlSy_avb}ggdY!dqKBzRvdF_~HKGyQy8^aj8+PrGNr_pjp3C^xm? z2b{@RV5HrmG_fW1Rox)48{{z3+G8!&yYoYO_;0IaDmP6sYU<#-vPeQzURNwp#VvHP zfmJ5v((liOmt!(!XGrA5Bg$a(kL0RJ&7b!XidIh;7~1f~o@FdFYlYm`EB-odzE%J9 z#Sf_dr6V_e_(&U(tJWz#G3s4Ga|RJC59gYFuChcT2_B!&@2$X)A-H2^)^>_%qryxr zqE1FvLmqO&S!!^s258Y;)GK6Zs&yZrej4FJtC_Bq304l4VR!kA0XUiq`RN6zvT#Ljv8{5cozhej6LaY*;WkR{LSS0}h{qDLn)? z5=A-_7pY{tm@_W&21MFzPwdg>whykEp-Rmdw%DOm;}C!PL+jA+ap~55mq;-5acv-{ z6LDnw4RFCr&Dh<9~(IV7Qydm8lygi4n#OQOUWYvEu*2WbX_8H$vIo7es@b!Yp9JZxouPNOENK-^Hoa}-(x`n_(3 z)7LhZZSORZ@mJYL-1J9?M6cm%sH*j~XKW-NOlSn5f~rOt3d%pr$4a#ie)>5`zwqgw(rNj;tB%nJ7I#rcx9ykovd5hI5T3p3#}% z=DU_4X=s z<2$0J?tHKwtzVJ7Kw23zO4X z)aN_(G&F1%*&C`x#YG#Z!&{c@Rw9m;KLd@W9+r}|Gj_&H7&OrB+~tCc1(IAe8IIYO z=a;|1TTO9>k9DgXmfg<+-R3hwi$|0oF0-rfOQoQypTw7*_yz5^>@{&v^f^pzR&`ope`17kZ|e` zrB3q6h?lK*$`-@(ru?$>Kry>O+Jhc7$K+7lD&Z*skMw_;0Uz4TL`mRg${b>zivm3fmZoTXB_fd0&j=$&G4E}k&-cgNk9!O zVbAHiW0*-nsOD3JB*`?SCY%kxR+VjgQkAw{@z90O%ubUfHsw93a@5k(@{q&?AzDpy z*uNMer(JA9Vdy?a!h+aKWyb zFZTM~({4`iN{KlAWi>Op+_ zxUHt3fD};nwYq#N=m^V^=J=j(Lc{A0)#Siwx>Nyc(V9g|5-}rW>6n1&SMz(=)oC9h zJMy5gUHv5cK4a`pIGFZ?G-i=U)7%HPkQVR>cmfoEc5Tk&yRVp*ruc&WJ!Ccd87HaP z{N0d~EnmD=h%*{t3lmSPG%2r{Y@5^^Bz~gOyDc`>*d$@K%~hLE;jO!W+Lbg{Fpp(G;pXAQGWSf>(4tI_1FA<3 zsC*eQs%!k&ir&4AEyt|@wG(>nQ^ius*HSl&^fpkB)X%o)1Nw}8uvmjd#WbvDW{7WI zZakc2OAVTjt3m<>0&YacH<%^1P35kp9?9g$;zN(|pPvc*7Ed5kU>#9X_cl%>$2@92 zHgaQU6y;M0uaVMyA#V{Xnho<}Bnwb!$AnuJh0*`zJe`imvhCU|fk_%GAlmTh8&^Xc z1oA1=FJFzOTwj;eReQTA)Pqx7jvTMwIGh9<#(%eQYLm`2=Bg^URkCMf&>Ea9gX`Pe zns?A3ruT3HW*6+9OxdZ5t7I7CUy@e88a;RI{^WaqF~qIGvNLB) z=1yR=WHnFbD{M1Z7gG_j$OV&e>og(dU#MFHmo-jYh50tI6%$#F=5 zwsLy8^T3F_^eTr_KeFMA&V(G#BB_sRE3kB?B zTqHSa*d2&8)}Fh{yGhl#Nf1zzXI^X$3i)Zes6Y2kn$3D_y$;iJGYG0?W*Eub^%HxWXDLyaH?Y;_ye>W&5#t7JjPhmr-;ku<9~p-iOM@kD4YAER z2YkZ+mV@s!L>8M}L9wa60p zsH$>+Q`Tqs_{=u7*}nnH4g&IHsvD!U(4=QhMFawZ^;~*pNRWD-0tMaq6Ii35X!4>}U zvl{VQzC(02$mu8LoMfDNrSXnYOUH%qC>*F zA9;d$4M+_ysunkhm3XcnC$ll9CEXoa$RSXyC#uj~l)MB7HwY)Kb?txs;lWql%2jWj zV_M7_+KDeMhWA?g;VdyU6}FROjak%@c_G36F#9<6Ku&?xMKqhLLc7c!lfiCa?8m1Z zS;a7O$qM-f@R4i%G{4q>zR4#Tb*kwN(oy>Gd~odZGTSNyC!1&|_0TaX z5OOQRwvRPMx1%15a0y!F6ojz&*)pm7s0?hYtXQiK-Gg%90DHmSgwmMl5N@>iVyGr* z@L+8z>MBWFe0`;v0_JnP)SC=hp*$5$vRK)rHBq~>Vyd3aE+-#}!NT~fVkcag_qkCB zVP1$ZvHepZCs%RJk>t)$a_iPEWRPc!y35;>8f2PajrH|0(*3BlDz zBi7Hn9A+tj;)>HA`-rr!>K<$30Ztk47TT{XtQ@EAg)87YD-(_f}ce zR!shG=62{)!NSoQVsLB8SY;c`MvBT*}T*L5O;*ay#J3%{T`SGB8XuQiZ~DLeHK7AqKR19pUq8c1Vbi7L{~X%PQ7Ct zM-7aqo)jmiR@3w=ohE4$D==cT(ClyqT$ucQ*&PA6?Q- z9$LV^lw!M71i_WeLkATRiRLrjtUc$h>BT1celMME4EZwfX=TjP2Bf_h6k1hTm(%W5 z=>E<9V6o)2s&Scpf9(xm)E!-t7bN55X8%C-1p@`$)?t(=J-_;PP@^q5MQ1I13JEJj zW#dzY+b>WJYOl#>03<3s-OM^sUKy+>H0AdDxojB2fw{zWTss5n*7UBZpu8ns4iU^( zrDNWxN$pE~^83gEKfqHdG`k!Br_j+JW`eTr_r4@NGv^L(by#k_PoE=wZry0a8TLJU z?~7(jzE0&QA+Abd0;$%bBjtU5ZMX&KxE6%V)&JpOR+M=ceNy7jVs zSpP|?2Oa=Z$Wgkw5Q=v>-xOqZB`V)4$WxLyC-}!o+r!^QdQN!8z8Oj`0<-=r3& z-;2-NF@eLK(B8ylm_&R@#cw+nQ=A&X@A$u8yl*|{q(F^--Du4jLT zUC)^4IpeZg-IRkQYJ5&gY)hf&#B_i zhJC;8p_^+=hKxXOQ*z^*s)+_4Cz_7bizryiA9chk8B6wq_~Zxy`s#ZxPT+{!IKoOd zr7%*^;Cq6QN}g1~r32gyj}fb`hbW8+jz;-TQtQ$)QHkepY>B~QG{G##+Fclewmw6y zvBA!d79})`pjMn6*O{5Ca!-NrLYw3xK`5K8EA^J;{4Zv#!HG}2V-oH#KrBsm5`cGUOytEnnF5C~^~SNM_p{ zLQ_fjX?X`pP@~#1Ty(leQ+ZVuDBgf<#q(7ELgMl@C650VR}!f0s_w*+d7vZajQ7@7 z;Ql8RA+>=Aq5vqsU4a~o5P1frW-QNz=cwzRYIodv;y^C%n0c;cQRT_bBVLLt!P9hky-nd?)eqd8y;jw6z&nrSTT}}B zE}eZTYy^ed^c4M~?cSv^JA}8A$WO6zLKu=Y=%W>xWN&O&fo|tCWz-f!>ec zJs0z-oW*gkNH94TupSToBmV%9t6etQ7%lCR7^6@XBT%ZN*a}geC=SeN5AxKP`NsbM zam{6?x+C~juqbJLi0w7eYMrv)TJ=gTcCaZcqNJmZNc~mH8S9J+WPAg~b%MV7*NX zi?i}knlL`{I#W$M5^FM7oL871m3VgSeXH$#rN6ji#6$dRw%^hT52sigdnP>IP6$K) z008Rs*_|R4lT~@ONyk-??2GrVg&Avn9EITAx`<`jIiA+~R2 ztt+;ArT(j}!Y8yz_eXE(Ax~GUEk4>fEv=F$(QvAx00BXFaa_G})C(FFCvD*D?SZ-Q zE#kdvi-#Px)k2^zxy@;voztMO)2&t*A{+tLkE=2DC*e4wO?#?Z$Bck?H_%qq0=%t6 z_9t8e(FJXTIO=Ku#IYDEfR9mu&00wk%AgFD9=_QXX?L%>Zcpz4INV2;GMOy#xag*T4F$}akp_8AqLzWjlF8nkUXQ6`TFA`tv5QBPNO|Y<27Zp zk&Fgx1Cx=1R;Xlft+<8Tj)3Eu`#qV-YwsV5DPi2su&BS-d1R12IAC z?U6#)vMD5J2IcC$=B6ux4?$86KD08`<~7NzibFgAk@#vOj-H+Q_&B+`Bls4ED~1{L zuN$&j@(#WOAJV*#AnS~p+rQ~XTMMZDKrAR8&`+P6R?C9b_KBr$4>;gfr}j%*JG+@? zwt$lY7RZRV1mo1>jGjQFsrK(wxhEnQ@R#VEP!U82qVrji@zXWtJXaNog8R`VW|mmG z(-XJ9%qzoyH5MwM^)xK|4Q0pdC2(s2tMS*E(K+V0tlp^kAfZR%`woq0gkhO?AE~XN z*1+7*pGVZ=&*O#1@}n)(;Ge>PS0=XH1w9`t`q8rOMZ%v+m{*S~fzr0AaD7b+cqWv$ zk~p2uwgo(bTc;Umr7Ta+JkXt`QPB=4i5|N9*3>5z{kxjZYiqI^&xqB@?#zkxt&lI$ zzSF8&L^;f;zp0^X*quCM89`oFuPaf>=CbCwpha%fW%dd?#SZg%sae7~-yjF+LKu_| ziU1WHOjYCxPeN&0DRAC&>OansYiopO^df{>jq>_su}VUp-lC76RbXrE-L0920!LOK z`Kw}u^;FJl`!SKnHTG=-T9hCAD+Tu42%&GJ+7db@^ZC(~T{-o0S&^s{TMx0~hl;@T zqOCz?&TB9~%!>21aw{^WY_-p|8_v{eN&DAH{Elnvy^+$B{^d&NFuLg?hT4l$h#G^jzOFo|rykx_Q8(1I07j;gZoxemG zGf5N!=IC8nq%9=dBMlg6DoZ_4p-aiPXeLKWIvd1Qv zHt;;8@mpAf`B9U^Z2kq@e^4rYga8}pYJJk3qsmTj!_Z{nrxG%#4TmX^N2Y($rBIFl zKQIU+VB((I-I0bE3OBvC(Nh`3yQo`eRtN`3lz%GV&>OhxkwuFU+;@@kqqmAbZMx6@ z08zijuq*$>05%Z-0R#X91Ox*I0|fv80000100ILM1P~G-1t2j|6G35dA~2B#6eBWH zfw4ehp+Zw~g2DgV00;pB0RcY%R;^mJ3blVQ6hb5VJI?v7UU!-0IUZs%v=wubiOe2L zN9EpkkjS23MnfX6kg8OIKO*w9Rda%`lTh*@YLj*1IC)xY!@42J6>=V3B!X13UdhDP z$}CN^0@_D(de~9BP~-=a`LPZSXc-g&vc+Jl(n0# zDT=chUQ~e37e+u2=_!I|>>O*NmNLe)YUmSZlu~h!yf`Sa4sBZsnnDeMOAjZA#<(UO z!YE`iIgI#&fH&xdDa_friS$p$NL@}Od#BiIPjuO20@_n?k`uUk@%%ur*pkMOu=1BR zu0H&OG8F~3d`OQGjqcK&0dUkhuLQ~Yjj7vBXiTu+LXbVi^_3Gerx(6fF}+F+4btAi zlMS_}xaA=QXOoMxgA4l_`k^>$YLqW@yN!TT-8Rkcq`L$mAS%`d1~rX-fvEYX9m-&) zf!KV5l`Lc)G*55QJ^~rID+A&%y{&gnfT`MEY&8i3MG?PlrFy0~64v>XNVqkjqo5R^ zX18CEL*x<3EMek^Sd0LMO>F2?ta0Acqibw|x{>;Q)&^7ehB?NC(rz1l-Lhx^01){$ ztzKB2J`|VIiB6T(=kaHcDZFM6yos6>a{=o z1&blA0@M**l<`87MYshI$1!pDQMYe(C&x3pH)W@)Avw0IA~ND{)ieDlD?fC>w(Pnv zp^w9jt?U%1O9@;!Sb6SK#;id8#(ygib-s{hmW3h*Oj0}2hwiY0f899gV~=34?EE|P zakSyE2!Xn)Ih?0>dz^ccRt7C@g8DKx{{R_I>xxpicrA?!9y7gb=oAdpONw!|Atu%{ z;Epza5UzNAgq5Aiw$6%PyHkR09GG}$vk?fH*zRsPFUG|I3zvA z58X!6=d^bqEIcAMA5}B-u$3sRH@bnE7zd($(6{@y`tF$BEu`~6s2E+jSjXy+tP5?; z_gLSE!p`mmWBA?@3u$?Chm&`uj{8SE)*~JpdyU+MlDKFlFh9GKjZM69{^fA`IG6$d z0CB&{K1&?^nBUakrERsMwgf4rxZDSwG=JM=D{KLix3vk<*8-(B;<$MDn!eIw9>+%3 zI*Hi(DTN@T6u4AjxON)rd0Gn}KDnOnRfC*1cu!}7iCEK5!=BDmrfBhCU>jL?(LZvC zTDqt1)hFgFhYvqR_J&7%m>tP*6;Zh?oG6UU(h`q`vKw&)s5FIz& z7*n9wC>u@-7lp0DZ#6SCy~88y9_|jy5+Kv0H@lIKr-dtbKZ24vj1LOCDTHd6Z#+)^$>-TFoTdmkQS#Yr=*QS{g_; zu`&8@b4tZF<32OrG49}k*hl#$VN9o`d0)bdSRT*_@KjV>=GP_YfVxIh#_7bBAN?2i^NUApUy~P!Hsp4ygwGipI6EfE;baeoF)e zxX~LZqZ&=9_EWiW3{@$Mm`=Vp``4a75uT zPKVbTb%H%WewTE=39z>a^Azqexx3i~&2aA0IjlYoY)~&{n833uhL#V+sT>4_tu_GX z-A>{f=N^GIq`0}<$+e7}F{PmHLa%W5K{KOpa4Q4EOzhC}@*noFTv}MzBRX6MEkf$n zCyU~-O=BM~!MvC@0YuBS#E0@88aJ!^(ti;;c5M{r7ZORco##joWoLyh633^Vg$tMt z>91`d^audC!~i*xvF0~oB{BU3?5S3DnD(%T8VJQg$y^c>EZn&iTTV=M(vo=L8lLJ4 zi1AnANND)RI(PC`fm^3B9EkP|sSas|RHAc>0=tK2{ifmM!(A zs??)QYzq%fE_Y`Bs}3xZqEhvP98rtQ<~r2 zaVMa8Qa@9Rlw#Z#EbiX{G}K4@o%$$tYA)1DVmrN!Sc9?~xCJx5b=zbQR1YPx+b}Ib z7KSmsfD08SpIW)PM}E0PDeMatL3$)p8{_p;K7auQ8pG3`_kIfyu)^hUjnI(URu&6~ zONpWemVa^o0L3-|ki53bwi}cR8F1)*OhjX#Hh%yES0=P9|z0fup;&SS|q!bYwoE^RrO^E+p{T z2`8XIQVW4WO_D>`V6lJgr$6z#^h27%H|jltVWLg+P`2FCe*XZHYpTvo+LVp52vLoK z#hz<`;TZPJ_crv^eeFVRbP3Ch%3XR@ZzZ6SSYJ3*!Bv;s*L zOBWBPG^3z#3krT@cLXk_T|@_Weu}xF%>al@`a;ADcw9M^gJACBR88clCzXqR%`xus GzyI0Oj{#r+ literal 0 HcmV?d00001 diff --git a/app/src/assets/jess.jpg b/app/src/assets/jess.jpg new file mode 100644 index 0000000000000000000000000000000000000000..246b83d87ad6334f94f043f4be81cc4bfed080f3 GIT binary patch literal 28702 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%0ACRm<;S#AB|g;Fm95DAC$?OC~ zQYbL<1G;HJWZ5$w1T5U@7amEDPmA6aeN5NOX{rhauI7L@=Pd2c8Ui9sp=d!CW|372 zV|D-lqV^Gv3_69I$M`9;$I=kugqMk#;A^+ zpb2ZWo#LPtdF~n3zF5ggiz{CvIkH(@ndZ`al67-EA%H zg|Ynv3#R%F<1s-Cyi^dF8)3PZxeyb!@XG+qSh14icB3+!?pG^?>Ad24WpXBEBVIyD z8!hiMwpUhaCvZAK<7*DRAX;WM(7?(WY)v@Ht<>@{v9e|#had#~XYumk$lr+VGp2Bw zwmSjjZ#D1(Al#uEzu>{EcmX^R#d}>8!-Gtfwy5e%tzmk zf0#2qO6f5m2P4^v2+%n~2t8pWIOaLe^vqS5Ha%Mos(ef=<<&ihnC#w1XfGxVgJv5u zb=zsA2RzjNlNL@LaySI50DiGJZYN7`hlpJ_&=WFzAg8sl^ET3;**yFRxR77Y9O??) z6TiwD(a`QpELU4nB-fC9Ao_V-(J@hUi9#}h6dN!i@67a#k-rJA5G)KiQ0O8JfaYuV zxyrZJH@=ZE5l8$)2S7JNlsR6=6CM;NP!%wT1lvsrLf{av#?6mru|j?%$}Jo4y?cj) zI1K4-7fbTWyJyler>0I3ybX0C}Jb7ECNnpK<-5MWASZyteV$3f#;^OM+OCc0MI3X6R~!&5)** z(xClJDx`sAOqz=0p;InWOSwLyL#^qra5ZtrM+Z{!Jpr6o3>YX6jrp%Iz|1X-6hJHS zD^S0mkukQRrh|PU$7_Dgx4uMg0yZ_E;fN~057Ij4zcz$G*;zw-y7m@1eFV*oQwjcQTK4sDca@0gPaRJGR+?~h~b-BA0%=L`qc7mLMNIZ%01#WGo_Qoo> z9r_8R4Mr#;&ocmhY{Y}G0%OIfo~G-!k25A+w15Xs^8#tN6&6ZG#;Ff>RPsZWv8DbN`- L?m2V>?LYt7PZW{t literal 0 HcmV?d00001 diff --git a/app/src/assets/john.jpg b/app/src/assets/john.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a9bcd556d65e3f3527eb5757eee9d7a94d78e6ce GIT binary patch literal 28430 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 literal 0 HcmV?d00001 diff --git a/app/src/components/Navbar.tsx b/app/src/components/Navbar.tsx index f0f8ef6..3f0b799 100644 --- a/app/src/components/Navbar.tsx +++ b/app/src/components/Navbar.tsx @@ -15,13 +15,12 @@ const Navbar = (): ReactElement => { >
{ navigate("/home"); }} - > - Home -
+ className="Navbar-body-home" + >
{ diff --git a/app/src/pages/MentorDashboard.tsx b/app/src/pages/MentorDashboard.tsx index 6f2b98c..ebc1605 100644 --- a/app/src/pages/MentorDashboard.tsx +++ b/app/src/pages/MentorDashboard.tsx @@ -1,13 +1,155 @@ import React, { useState } from "react"; import Navbar from "../components/Navbar"; +import Jane from "../assets/jane.jpg"; +import John from "../assets/john.jpg"; +import Jess from "../assets/jess.jpg"; + const MentorDashboard = () => { return ( <> -

Mentor Dashboard

-
-
Example Button
+
+
+ +
+
My Mentees
+
Courses
+
+ +
+
+
+ Jane Doe +
+
+

Jane Doe

+
+
+ +
+
+ Jane Doe +
+
+

Jane Doe

+
+
+ +
+
+ Jane Doe +
+
+

Jane Doe

+
+
+ +
+ + + +
+
+
+ John Doe +
+
+

John Doe

+
+
+ +
+
+ John Doe +
+
+

John Doe

+
+
+ +
+
+ John Doe +
+
+

John Doe

+
+
+ +
+ + +
+
+
+ Jess Doe +
+
+

Jess Doe

+
+
+ +
+
+ Jess Doe +
+
+

Jess Doe

+
+
+ +
+
+ Jess Doe +
+
+

Jess Doe

+
+
+ +
+
+
+
Upcoming Events!
+
+
); diff --git a/app/src/styles/_components.scss b/app/src/styles/_components.scss index f79bd2b..c922f95 100644 --- a/app/src/styles/_components.scss +++ b/app/src/styles/_components.scss @@ -22,6 +22,18 @@ height: 75px; /* Adjust height based on the image’s aspect ratio */ } + &-home { + font-size: var(--pww-font-size-30); + font-weight: 900; + background-image: url('../assets/home.png'); + background-size: contain; /* Ensure the entire logo fits within the defined area */ + background-repeat: no-repeat; /* Prevent repeating */ + background-position: center; /* Center the logo within its container */ + width: 50px; // Reduced from 125px to be more proportional + height: 50px; // Reduced from 70px to match navbar height + margin-right: 20px; + } + &-link { color: var(--pww-color-dark-1000); cursor: pointer; diff --git a/app/src/styles/_utilities.scss b/app/src/styles/_utilities.scss index 0f590c0..8b06ac2 100644 --- a/app/src/styles/_utilities.scss +++ b/app/src/styles/_utilities.scss @@ -117,6 +117,10 @@ justify-content: space-between; } +.Justify-content--center { + justify-content: center; +} + .Align-items--center { align-items: center; } @@ -390,6 +394,7 @@ background-color: var(--pww-color-light-50); padding: 10px; border-radius: var(--pww-border-radius-8); + border: 1px solid var(--pww-color-gray-200); box-shadow: var(--pww-shadow-dark); height: fit-content; @@ -400,20 +405,25 @@ } } + &--noPadding { + padding: 0; + } + &-dark { background-color: var(--pww-color-dark-1000); } } .Block { - padding: 56px 48px; + padding: 30px 30px; box-shadow: var(--pww-shadow-dark); background-color: var(--pww-color-light-1000); border-radius: var(--pww-border-radius-8); + border: 1px solid var(--pww-color-gray-200); &-header { font-size: var(--pww-font-size-24); - margin-bottom: 10px; + margin-bottom: 30px; } &-subtitle { @@ -425,13 +435,18 @@ } } +.Image { + width: 50%; + height: auto; +} + .Modal--overlay { background-color: rgba(0, 0, 0, 0.4); position: fixed; top: 0; left: 0; right: 0; - bottom: 0; + bottom: 0x; z-index: var(--pww-z-100); overflow: hidden; } @@ -520,6 +535,7 @@ // } } + .Display--gteDesktop { display: none; @@ -556,6 +572,9 @@ // } } +.Width--40 { width: 40%; } +.Width--60 { width: 60%; } + .Width--50 { width: 50%; } @@ -567,6 +586,10 @@ height: 100%; } +.Height--100vh { + height: 100vh; +} + ul { list-style-type: none; padding: 0; diff --git a/app/src/styles/_variables.scss b/app/src/styles/_variables.scss index 310e609..1e795c4 100644 --- a/app/src/styles/_variables.scss +++ b/app/src/styles/_variables.scss @@ -3,12 +3,17 @@ //add spaces so that the hex codes are lined up $pww-color-yellow: #b1cf24; -$pww-color-teal: #149baf; -$pww-color-blue: #32559a; +//$pww-color-teal: #149baf; +$pww-color-teal: #0096C0; +//$pww-color-blue: #32559a; +$pww-color-blue: #4C65A6; $pww-color-red: #db504a; -$pww-color-green: #4a9a4e; +//$pww-color-green: #4a9a4e; +$pww-color-green: #BFD71B; $pww-color-light: #ffffff; -$pww-color-gray: #626262; +$pww-color-neutral: #f6f4ef; +//$pww-color-gray: #626262; +$pww-color-gray: #545454; $pww-color-dark: #000000; // allow the colors to be used in inline styles @@ -19,6 +24,7 @@ $palette: ( "red": $pww-color-red, "green": $pww-color-green, "light": $pww-color-light, + "neutral": $pww-color-neutral, "gray": $pww-color-gray, "dark": $pww-color-dark, ); diff --git a/app/src/styles/main.scss b/app/src/styles/main.scss index 3de83af..363de19 100644 --- a/app/src/styles/main.scss +++ b/app/src/styles/main.scss @@ -1,5 +1,6 @@ // Imports for all of the external libraries @import url("https://fonts.googleapis.com/css?family=Rubik"); +@import url('https://fonts.googleapis.com/css?family=Lato'); @import url("https://pro.fontawesome.com/releases/v5.10.0/css/all.css"); @import "~bootstrap/scss/bootstrap-utilities.scss"; @@ -32,14 +33,15 @@ // Fonts html, body { - font-family: "Quattrocento"; + //font-family: "Quattrocento"; + font-family: Lato; margin: 0; } // default settings for the body body { font-size: var(--pww-font-size-4); - background-color: var(--pww-color-blue-100); + background-color: var(--pww-color-neutral-1000); color: var(--pww-color-dark-1000); } From 843cb70e430a0f766f6c13eddba6b78e38201e6e Mon Sep 17 00:00:00 2001 From: Grayson Marie Smith Date: Sun, 17 Nov 2024 17:04:28 -0600 Subject: [PATCH 23/31] Change dashboard to grid --- app/src/assets/jane.jpg | Bin 21962 -> 0 bytes app/src/assets/jess.jpg | Bin 28702 -> 0 bytes app/src/assets/john.jpg | Bin 28430 -> 0 bytes app/src/pages/MentorDashboard.tsx | 123 ++---------------------------- app/src/styles/_utilities.scss | 10 +++ 5 files changed, 18 insertions(+), 115 deletions(-) delete mode 100644 app/src/assets/jane.jpg delete mode 100644 app/src/assets/jess.jpg delete mode 100644 app/src/assets/john.jpg diff --git a/app/src/assets/jane.jpg b/app/src/assets/jane.jpg deleted file mode 100644 index 2ef969143401fd9768d3353d1e174d4fd9173715..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21962 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
!47tZ2DV(k`CcQ0 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 GzyI0Oj{#r+ diff --git a/app/src/assets/jess.jpg b/app/src/assets/jess.jpg deleted file mode 100644 index 246b83d87ad6334f94f043f4be81cc4bfed080f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28702 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%0ACRm<;S#AB|g;Fm95DAC$?OC~ zQYbL<1G;HJWZ5$w1T5U@7amEDPmA6aeN5NOX{rhauI7L@=Pd2c8Ui9sp=d!CW|372 zV|D-lqV^Gv3_69I$M`9;$I=kugqMk#;A^+ zpb2ZWo#LPtdF~n3zF5ggiz{CvIkH(@ndZ`al67-EA%H zg|Ynv3#R%F<1s-Cyi^dF8)3PZxeyb!@XG+qSh14icB3+!?pG^?>Ad24WpXBEBVIyD z8!hiMwpUhaCvZAK<7*DRAX;WM(7?(WY)v@Ht<>@{v9e|#had#~XYumk$lr+VGp2Bw zwmSjjZ#D1(Al#uEzu>{EcmX^R#d}>8!-Gtfwy5e%tzmk zf0#2qO6f5m2P4^v2+%n~2t8pWIOaLe^vqS5Ha%Mos(ef=<<&ihnC#w1XfGxVgJv5u zb=zsA2RzjNlNL@LaySI50DiGJZYN7`hlpJ_&=WFzAg8sl^ET3;**yFRxR77Y9O??) z6TiwD(a`QpELU4nB-fC9Ao_V-(J@hUi9#}h6dN!i@67a#k-rJA5G)KiQ0O8JfaYuV zxyrZJH@=ZE5l8$)2S7JNlsR6=6CM;NP!%wT1lvsrLf{av#?6mru|j?%$}Jo4y?cj) zI1K4-7fbTWyJyler>0I3ybX0C}Jb7ECNnpK<-5MWASZyteV$3f#;^OM+OCc0MI3X6R~!&5)** z(xClJDx`sAOqz=0p;InWOSwLyL#^qra5ZtrM+Z{!Jpr6o3>YX6jrp%Iz|1X-6hJHS zD^S0mkukQRrh|PU$7_Dgx4uMg0yZ_E;fN~057Ij4zcz$G*;zw-y7m@1eFV*oQwjcQTK4sDca@0gPaRJGR+?~h~b-BA0%=L`qc7mLMNIZ%01#WGo_Qoo> z9r_8R4Mr#;&ocmhY{Y}G0%OIfo~G-!k25A+w15Xs^8#tN6&6ZG#;Ff>RPsZWv8DbN`- L?m2V>?LYt7PZW{t diff --git a/app/src/assets/john.jpg b/app/src/assets/john.jpg deleted file mode 100644 index a9bcd556d65e3f3527eb5757eee9d7a94d78e6ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28430 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 diff --git a/app/src/pages/MentorDashboard.tsx b/app/src/pages/MentorDashboard.tsx index ebc1605..7fab3a0 100644 --- a/app/src/pages/MentorDashboard.tsx +++ b/app/src/pages/MentorDashboard.tsx @@ -1,150 +1,43 @@ import React, { useState } from "react"; import Navbar from "../components/Navbar"; -import Jane from "../assets/jane.jpg"; -import John from "../assets/john.jpg"; -import Jess from "../assets/jess.jpg"; const MentorDashboard = () => { + return ( <>
-
-
My Mentees
-
Courses
+
+
My Mentees
+
Courses
-
+
-
- Jane Doe -
+

Jane Doe

-
- Jane Doe -
+

Jane Doe

-
- Jane Doe -
+

Jane Doe

-
- - -
-
-
- John Doe -
-
-

John Doe

-
-
- -
-
- John Doe -
-
-

John Doe

-
-
- -
-
- John Doe -
-
-

John Doe

-
-
- -
- - -
-
-
- Jess Doe -
-
-

Jess Doe

-
-
- -
-
- Jess Doe -
-
-

Jess Doe

-
-
- -
-
- Jess Doe -
-
-

Jess Doe

-
-
- -
Upcoming Events!
diff --git a/app/src/styles/_utilities.scss b/app/src/styles/_utilities.scss index 8b06ac2..d4ea585 100644 --- a/app/src/styles/_utilities.scss +++ b/app/src/styles/_utilities.scss @@ -336,6 +336,11 @@ padding: 2px 5px; } + &--large { + font-size: 20px; + padding: 8px 16px; + } + &:hover { background-color: transparent; cursor: pointer; @@ -473,6 +478,11 @@ // } } +.Flex-grid { + display: flex; + flex-wrap: wrap; +} + .Flex-column { display: flex; flex-direction: column; From 73ccc9a14aea50aa91275e72c2380d5e221731a6 Mon Sep 17 00:00:00 2001 From: Grayson Marie Smith Date: Sun, 17 Nov 2024 18:31:04 -0600 Subject: [PATCH 24/31] Add grid elements --- app/src/pages/MentorDashboard.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/pages/MentorDashboard.tsx b/app/src/pages/MentorDashboard.tsx index 7fab3a0..4c7c25e 100644 --- a/app/src/pages/MentorDashboard.tsx +++ b/app/src/pages/MentorDashboard.tsx @@ -19,7 +19,7 @@ const MentorDashboard = () => {
-

Jane Doe

+

JaneDoe

From 4e241baea4bf27027602c49732215a8d02ed6364 Mon Sep 17 00:00:00 2001 From: Lolita Rozenbaum <60853898+lolitaroz@users.noreply.github.com> Date: Sun, 17 Nov 2024 19:21:52 -0600 Subject: [PATCH 25/31] Update Navbar.tsx --- app/src/components/Navbar.tsx | 5 ----- 1 file changed, 5 deletions(-) diff --git a/app/src/components/Navbar.tsx b/app/src/components/Navbar.tsx index b0724d8..3246e69 100644 --- a/app/src/components/Navbar.tsx +++ b/app/src/components/Navbar.tsx @@ -21,11 +21,6 @@ const Navbar = (): ReactElement => { >
>>>>>> 95b86b1204320b9b921bba8d9bc4c56c24148501 onClick={() => { navigate("/home"); }} From 1a2d6a20bb952c7322faf6683407e02a2551b0ad Mon Sep 17 00:00:00 2001 From: Lyton Date: Sun, 24 Nov 2024 21:05:17 -0600 Subject: [PATCH 26/31] feat: implement dynamic email template based on user role --- api/src/routes/user.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/api/src/routes/user.ts b/api/src/routes/user.ts index f3a3b1d..064bfde 100644 --- a/api/src/routes/user.ts +++ b/api/src/routes/user.ts @@ -91,14 +91,19 @@ router.post("/send-email", async (req: any, res: any) => { throw new Error("SendGrid API key or test email is missing"); } - const { email, name } = req.body; + const { email, name, role } = req.body; sgMail.setApiKey(SENDGRID_API_KEY); + const templateId = + role.toLowerCase().trim() === "mentor" + ? "d-1694192e437348e2a0517103acae3f00" + : "d-7e26b82cf8624bafa4077b6ed73b52bf"; + await sgMail.send({ to: email, from: SEND_GRID_TEST_EMAIL, - templateId: "d-7e26b82cf8624bafa4077b6ed73b52bf", + templateId: templateId, dynamicTemplateData: { name: name, }, From 9999b46f8c266533520749eb57ee46fdfc79d7cf Mon Sep 17 00:00:00 2001 From: kjgilder Date: Thu, 28 Nov 2024 12:22:38 -0600 Subject: [PATCH 27/31] Wiring meeting notes to user --- api/package-lock.json | 591 ++++++++++++++++++++++++------- api/package.json | 2 +- api/src/routes/user.ts | 44 +++ api/src/server.ts | 1 - app/src/pages/CreateMeeting.tsx | 142 +++++--- app/src/pages/CreateWorkshop.tsx | 2 +- 6 files changed, 597 insertions(+), 185 deletions(-) diff --git a/api/package-lock.json b/api/package-lock.json index 00fe43d..6b3b710 100644 --- a/api/package-lock.json +++ b/api/package-lock.json @@ -13,9 +13,9 @@ "cors": "^2.8.5", "dotenv": "^16.4.5", "express": "^4.21.0", - "express-oauth2-jwt-bearer": "^1.6.0", "mongodb": "^6.9.0", "mongoose": "^8.4.1", + "sendgrid": "^5.2.3", "ts-node-dev": "^2.0.0", "uuid": "^10.0.0" }, @@ -168,9 +168,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.19.5", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", - "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", + "version": "4.19.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", + "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", "dev": true, "dependencies": { "@types/node": "*", @@ -192,17 +192,17 @@ "dev": true }, "node_modules/@types/node": { - "version": "22.8.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.8.1.tgz", - "integrity": "sha512-k6Gi8Yyo8EtrNtkHXutUu2corfDf9su95VYVP10aGYMMROM6SAItZi0w1XszA6RtWTHSVp5OeFof37w0IEqCQg==", + "version": "22.10.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.0.tgz", + "integrity": "sha512-XC70cRZVElFHfIUB40FgZOBbgJYFKKMa5nb9lxcwYstFG/Mi+/Y0bGS+rs6Dmhmkpq4pnNiLiuZAbc02YCOnmA==", "dependencies": { - "undici-types": "~6.19.8" + "undici-types": "~6.20.0" } }, "node_modules/@types/qs": { - "version": "6.9.15", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", - "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", + "version": "6.9.17", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz", + "integrity": "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==", "dev": true }, "node_modules/@types/range-parser": { @@ -274,9 +274,9 @@ } }, "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "bin": { "acorn": "bin/acorn" }, @@ -295,6 +295,11 @@ "node": ">=0.4.0" } }, + "node_modules/addressparser": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/addressparser/-/addressparser-1.0.1.tgz", + "integrity": "sha512-aQX7AISOMM7HFE0iZ3+YnD07oIeJqWGVnJ+ZIKaBZAk03ftmVYVqsGas/rbXKR21n4D/hKCSHypvcyOkds/xzg==" + }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -317,15 +322,88 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, + "node_modules/async.ensureasync": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.ensureasync/-/async.ensureasync-0.5.2.tgz", + "integrity": "sha512-eez/kJFHbnnHUBWpYlmWcjZpho/Oh7SHwnnnuscM8nOZcIJ41t+ACMSYTfNtdrES+XfbGVQtyw+6YK2evQgV5w==", + "dependencies": { + "async.util.ensureasync": "0.5.2" + } + }, + "node_modules/async.queue": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.queue/-/async.queue-0.5.2.tgz", + "integrity": "sha512-SX5gCWh47bIRLqHAt/zfJmRl2xpCF4OM4kkT3HehVJLmgQfLzYjL6QhLHe+SS4e7FOYU6NgMy2kXPB2wVchncg==", + "dependencies": { + "async.util.queue": "0.5.2" + } + }, + "node_modules/async.util.arrayeach": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.arrayeach/-/async.util.arrayeach-0.5.2.tgz", + "integrity": "sha512-PIb4rVYjwzLqb93XX2wj0+mA9YTgSWtxQRKxtuLqxXvGj1xZMB6qJUfr1NhS+FSaMPJIE1tF40Gl/o/vlfIz/A==" + }, + "node_modules/async.util.ensureasync": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.ensureasync/-/async.util.ensureasync-0.5.2.tgz", + "integrity": "sha512-sQufNz4JYLHO/7ZUklaTGJtiX36gCp28McNNcMZfVYPm/wqi1pKk4xRCPr2DOZDM6KfA54zjG36jQjBU2mLzXg==", + "dependencies": { + "async.util.restparam": "0.5.2", + "async.util.setimmediate": "0.5.2" + } + }, + "node_modules/async.util.isarray": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.isarray/-/async.util.isarray-0.5.2.tgz", + "integrity": "sha512-wbUzlrwON8RUgi+v/rhF0U99Ce8Osjcn+JP/mFNg6ymvShcobAOvE6cvLajSY5dPqKCOE1xfdhefgBif11zZgw==" + }, + "node_modules/async.util.map": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.map/-/async.util.map-0.5.2.tgz", + "integrity": "sha512-uXZhyNIH9Jo25jn35lUoEwFLAdZWC2ZQKjLO5PLq8VAisfW6qvSfgDLH4H57/WQSKZSo6OOmuqGhtdvIHDTi1Q==" + }, + "node_modules/async.util.noop": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.noop/-/async.util.noop-0.5.2.tgz", + "integrity": "sha512-AdwShXwE0KoskgqVJAck8zcM32nIHj3AC8ZN62ZaR5srhrY235Nw18vOJZWxcOfhxdVM0hRVKM8kMx7lcl7cCQ==" + }, + "node_modules/async.util.onlyonce": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.onlyonce/-/async.util.onlyonce-0.5.2.tgz", + "integrity": "sha512-UgQvkU9JZ+I0Cm1f56XyGXcII+J3d/5XWUuHpcevlItuA3WFSJcqZrsyAUck2FkRSD8BwYQX1zUTDp3SJMVESg==" + }, + "node_modules/async.util.queue": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.queue/-/async.util.queue-0.5.2.tgz", + "integrity": "sha512-DlKOFnhCzERL9D3bLKlNdgXwSckckcj+XkCvNuX4KMs4brBc2lHvPg8MK4NoPIhwAvUBGvE4NECdNRY0I5UOEQ==", + "dependencies": { + "async.util.arrayeach": "0.5.2", + "async.util.isarray": "0.5.2", + "async.util.map": "0.5.2", + "async.util.noop": "0.5.2", + "async.util.onlyonce": "0.5.2", + "async.util.setimmediate": "0.5.2" + } + }, + "node_modules/async.util.restparam": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.restparam/-/async.util.restparam-0.5.2.tgz", + "integrity": "sha512-Q9Z+zgmtMxFX5i7CnBvNOkgrL5hptztCqwarQluyNudUUk4iCmyjmsQl8MuQEjNh3gGqP5ayvDaextL1VXXgIg==" + }, + "node_modules/async.util.setimmediate": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.setimmediate/-/async.util.setimmediate-0.5.2.tgz", + "integrity": "sha512-aCYF85ZFCQ9Xn0106GcOVx+LvFguIIzfbfRTOlQoie3G4KeSjURfA6f7CfpFAF09FNP2A1MtdjeFdvYeTGDebw==" + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/axios": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", - "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.8.tgz", + "integrity": "sha512-Uu0wb7KNqK2t5K+YQyVCLM76prD5sRFjKHbJYCP1J7JFGEQ6nN7HWn9+04LAeiJ3ji54lgS/gZCH1oxyrf1SPw==", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -352,7 +430,6 @@ "version": "1.20.3", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "license": "MIT", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -372,6 +449,11 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/bottleneck": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-1.16.0.tgz", + "integrity": "sha512-HinT6aCt+ZLPVvMtOy8Vd1vQtR2R/Qi06fKRCa4oGiIuFF+CQwNYR/KZTjrEynkER7y9WaY8fhwWKqZp+/aXeg==" + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -393,9 +475,9 @@ } }, "node_modules/bson": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/bson/-/bson-6.8.0.tgz", - "integrity": "sha512-iOJg8pr7wq2tg/zSlCCHMi3hMm5JTOxLTagf3zxhcenHsFp+c6uOs6K7W5UE7A4QIJGtqh/ZovFNMP4mOPJynQ==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-6.10.0.tgz", + "integrity": "sha512-ROchNosXMJD2cbQGm84KoP7vOGPO6/bOAW0veMMbzhXLqoZptcaYRVLitwvuhwhjjpU1qP4YZRWLhgETdgqUQw==", "engines": { "node": ">=16.20.1" } @@ -502,6 +584,16 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, + "node_modules/core-js": { + "version": "3.39.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.39.0.tgz", + "integrity": "sha512-raM0ew0/jJUqkJ0E6e8UDtl+y/7ktFivgWvqw8dNSQeNWoSDLvQ1H/RN3aPXB9tBd4/FhyR4RDPGhsNIMsAn7g==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, "node_modules/cors": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", @@ -616,6 +708,25 @@ "node": ">= 0.8" } }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/es-define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", @@ -640,6 +751,14 @@ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -689,16 +808,10 @@ "node": ">= 0.10.0" } }, - "node_modules/express-oauth2-jwt-bearer": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/express-oauth2-jwt-bearer/-/express-oauth2-jwt-bearer-1.6.0.tgz", - "integrity": "sha512-HXnez7vocYlOqlfF3ozPcf/WE3zxT7zfUNfeg5FHJnvNwhBYlNXiPOvuCtBalis8xcigvwtInzEKhBuH87+9ug==", - "dependencies": { - "jose": "^4.13.1" - }, - "engines": { - "node": "^12.19.0 || ^14.15.0 || ^16.13.0 || ^18.12.0 || ^20.2.0" - } + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, "node_modules/fill-range": { "version": "7.1.1", @@ -1022,14 +1135,6 @@ "node": ">=0.12.0" } }, - "node_modules/jose": { - "version": "4.15.9", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", - "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, "node_modules/kareem": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.6.3.tgz", @@ -1038,6 +1143,23 @@ "node": ">=12.0.0" } }, + "node_modules/lodash.chunk": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.chunk/-/lodash.chunk-4.2.0.tgz", + "integrity": "sha512-ZzydJKfUHJwHa+hF5X66zLFCBrWn5GeF28OHEr4WVWtNDXlQ/IjWKPBiikqKo2ne0+v6JgCgJ0GzJp8k8bHC7w==" + }, + "node_modules/mailparser": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/mailparser/-/mailparser-0.6.2.tgz", + "integrity": "sha512-5Z5nv7TYojrdrKHjhCOKKFaYs0Lo7PCja4RnLZ2kFE1Fskqg+rRVwFpG9Oqx3YjosGM2QEItjHo7+Jc9qvxGqw==", + "deprecated": "Mailparser versions older than v2.3.0 are deprecated", + "dependencies": { + "encoding": "^0.1.12", + "mime": "^1.3.4", + "mimelib": "^0.3.0", + "uue": "^3.1.0" + } + }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -1102,6 +1224,16 @@ "node": ">= 0.6" } }, + "node_modules/mimelib": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/mimelib/-/mimelib-0.3.1.tgz", + "integrity": "sha512-ipzNp6TBsNfD3hButGlPVlGmuCgybIM9SBf8YwIG+SYmBgtU0u8wjf+BSrJX0mvqtv59SLmwphw/XiCbkLWv7w==", + "deprecated": "This project is unmaintained", + "dependencies": { + "addressparser": "~1.0.1", + "encoding": "~0.1.12" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -1133,12 +1265,12 @@ } }, "node_modules/mongodb": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.9.0.tgz", - "integrity": "sha512-UMopBVx1LmEUbW/QE0Hw18u583PEDVQmUmVzzBRH0o/xtE9DBRA5ZYLOjpLIa03i8FXjzvQECJcqoMvCXftTUA==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.11.0.tgz", + "integrity": "sha512-yVbPw0qT268YKhG241vAMLaDQAPbRyTgo++odSgGc9kXnzOujQI60Iyj23B9sQQFPSvmNPvMZ3dsFz0aN55KgA==", "dependencies": { - "@mongodb-js/saslprep": "^1.1.5", - "bson": "^6.7.0", + "@mongodb-js/saslprep": "^1.1.9", + "bson": "^6.10.0", "mongodb-connection-string-url": "^3.0.0" }, "engines": { @@ -1187,13 +1319,13 @@ } }, "node_modules/mongoose": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.4.1.tgz", - "integrity": "sha512-odQ2WEWGL3hb0Qex+QMN4eH6D34WdMEw7F1If2MGABApSDmG9cMmqv/G1H6WsXmuaH9mkuuadW/WbLE5+tHJwA==", + "version": "8.8.3", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.8.3.tgz", + "integrity": "sha512-/I4n/DcXqXyIiLRfAmUIiTjj3vXfeISke8dt4U4Y8Wfm074Wa6sXnQrXN49NFOFf2mM1kUdOXryoBvkuCnr+Qw==", "dependencies": { "bson": "^6.7.0", "kareem": "2.6.3", - "mongodb": "6.6.2", + "mongodb": "~6.10.0", "mpath": "0.9.0", "mquery": "5.0.0", "ms": "2.1.3", @@ -1208,9 +1340,9 @@ } }, "node_modules/mongoose/node_modules/mongodb": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.6.2.tgz", - "integrity": "sha512-ZF9Ugo2JCG/GfR7DEb4ypfyJJyiKbg5qBYKRintebj8+DNS33CyGMkWbrS9lara+u+h+yEOGSRiLhFO/g1s1aw==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.10.0.tgz", + "integrity": "sha512-gP9vduuYWb9ZkDM546M+MP2qKVk5ZG2wPF63OvSRuUbqCR+11ZCAE1mOfllhlAG0wcoJY5yDL/rV3OmYEwXIzg==", "dependencies": { "@mongodb-js/saslprep": "^1.1.5", "bson": "^6.7.0", @@ -1378,9 +1510,9 @@ } }, "node_modules/object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", "engines": { "node": ">= 0.4" }, @@ -1445,11 +1577,10 @@ } }, "node_modules/prettier": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", - "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.1.tgz", + "integrity": "sha512-G+YdqtITVZmOJje6QkXQWzl3fSfMxFwm1tjTyo9exhkmWSqC4Yhd1+lug++IlR2mvRVAxEDDWYkQdeSztajqgg==", "dev": true, - "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" }, @@ -1472,18 +1603,16 @@ "node": ">= 0.10" } }, -<<<<<<< Updated upstream "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" -======= + }, "node_modules/pstree.remy": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", "dev": true ->>>>>>> Stashed changes }, "node_modules/punycode": { "version": "2.3.1", @@ -1640,6 +1769,44 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, + "node_modules/sendgrid": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/sendgrid/-/sendgrid-5.2.3.tgz", + "integrity": "sha512-FD7oR9TbJFUew1p0Vw9JX0wBetDyq634LzylSXz4n9+hwaf+6a9dNloZl8CcjpsX4NuEc3HJanTN4GjDwNyi4A==", + "deprecated": "Please see v6.X+ at https://www.npmjs.com/org/sendgrid", + "dependencies": { + "async.ensureasync": "^0.5.2", + "async.queue": "^0.5.2", + "bottleneck": "^1.12.0", + "debug": "^2.2.0", + "lodash.chunk": "^4.2.0", + "mailparser": "^0.6.1", + "sendgrid-rest": "^2.3.0" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/sendgrid-rest": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/sendgrid-rest/-/sendgrid-rest-2.6.1.tgz", + "integrity": "sha512-W7gPROAPkEiD3+XQh+jeiU5mTNWqfgn45y1Xi8WiFA3CYKGOvHn+U0d62pTWjjynNqsmQIq9AJ0+93Bq67gbSQ==", + "dependencies": { + "core-js": "^3.5.0", + "dotenv": "^4.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/sendgrid-rest/node_modules/dotenv": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-4.0.0.tgz", + "integrity": "sha512-XcaMACOr3JMVcEv0Y/iUM2XaOsATRZ3U1In41/1jjK6vJZ2PZbQ1bzCG8uvaByfaBpl9gqc9QWJovpUGBXLLYQ==", + "engines": { + "node": ">=4.6.0" + } + }, "node_modules/serve-static": { "version": "1.16.2", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", @@ -1927,9 +2094,9 @@ } }, "node_modules/typescript": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", - "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -1945,9 +2112,9 @@ "dev": true }, "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==" }, "node_modules/unpipe": { "version": "1.0.0", @@ -1965,6 +2132,15 @@ "node": ">= 0.4.0" } }, + "node_modules/uue": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/uue/-/uue-3.1.2.tgz", + "integrity": "sha512-axKLXVqwtdI/czrjG0X8hyV1KLgeWx8F4KvSbvVCnS+RUvsQMGRjx0kfuZDXXqj0LYvVJmx3B9kWlKtEdRrJLg==", + "dependencies": { + "escape-string-regexp": "~1.0.5", + "extend": "~3.0.0" + } + }, "node_modules/uuid": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", @@ -2155,9 +2331,9 @@ } }, "@types/express-serve-static-core": { - "version": "4.19.5", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", - "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", + "version": "4.19.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", + "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", "dev": true, "requires": { "@types/node": "*", @@ -2179,17 +2355,17 @@ "dev": true }, "@types/node": { - "version": "22.8.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.8.1.tgz", - "integrity": "sha512-k6Gi8Yyo8EtrNtkHXutUu2corfDf9su95VYVP10aGYMMROM6SAItZi0w1XszA6RtWTHSVp5OeFof37w0IEqCQg==", + "version": "22.10.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.0.tgz", + "integrity": "sha512-XC70cRZVElFHfIUB40FgZOBbgJYFKKMa5nb9lxcwYstFG/Mi+/Y0bGS+rs6Dmhmkpq4pnNiLiuZAbc02YCOnmA==", "requires": { - "undici-types": "~6.19.8" + "undici-types": "~6.20.0" } }, "@types/qs": { - "version": "6.9.15", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", - "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", + "version": "6.9.17", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz", + "integrity": "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==", "dev": true }, "@types/range-parser": { @@ -2258,9 +2434,9 @@ } }, "acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==" + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==" }, "acorn-walk": { "version": "8.3.4", @@ -2270,6 +2446,11 @@ "acorn": "^8.11.0" } }, + "addressparser": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/addressparser/-/addressparser-1.0.1.tgz", + "integrity": "sha512-aQX7AISOMM7HFE0iZ3+YnD07oIeJqWGVnJ+ZIKaBZAk03ftmVYVqsGas/rbXKR21n4D/hKCSHypvcyOkds/xzg==" + }, "anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -2289,15 +2470,88 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, + "async.ensureasync": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.ensureasync/-/async.ensureasync-0.5.2.tgz", + "integrity": "sha512-eez/kJFHbnnHUBWpYlmWcjZpho/Oh7SHwnnnuscM8nOZcIJ41t+ACMSYTfNtdrES+XfbGVQtyw+6YK2evQgV5w==", + "requires": { + "async.util.ensureasync": "0.5.2" + } + }, + "async.queue": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.queue/-/async.queue-0.5.2.tgz", + "integrity": "sha512-SX5gCWh47bIRLqHAt/zfJmRl2xpCF4OM4kkT3HehVJLmgQfLzYjL6QhLHe+SS4e7FOYU6NgMy2kXPB2wVchncg==", + "requires": { + "async.util.queue": "0.5.2" + } + }, + "async.util.arrayeach": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.arrayeach/-/async.util.arrayeach-0.5.2.tgz", + "integrity": "sha512-PIb4rVYjwzLqb93XX2wj0+mA9YTgSWtxQRKxtuLqxXvGj1xZMB6qJUfr1NhS+FSaMPJIE1tF40Gl/o/vlfIz/A==" + }, + "async.util.ensureasync": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.ensureasync/-/async.util.ensureasync-0.5.2.tgz", + "integrity": "sha512-sQufNz4JYLHO/7ZUklaTGJtiX36gCp28McNNcMZfVYPm/wqi1pKk4xRCPr2DOZDM6KfA54zjG36jQjBU2mLzXg==", + "requires": { + "async.util.restparam": "0.5.2", + "async.util.setimmediate": "0.5.2" + } + }, + "async.util.isarray": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.isarray/-/async.util.isarray-0.5.2.tgz", + "integrity": "sha512-wbUzlrwON8RUgi+v/rhF0U99Ce8Osjcn+JP/mFNg6ymvShcobAOvE6cvLajSY5dPqKCOE1xfdhefgBif11zZgw==" + }, + "async.util.map": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.map/-/async.util.map-0.5.2.tgz", + "integrity": "sha512-uXZhyNIH9Jo25jn35lUoEwFLAdZWC2ZQKjLO5PLq8VAisfW6qvSfgDLH4H57/WQSKZSo6OOmuqGhtdvIHDTi1Q==" + }, + "async.util.noop": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.noop/-/async.util.noop-0.5.2.tgz", + "integrity": "sha512-AdwShXwE0KoskgqVJAck8zcM32nIHj3AC8ZN62ZaR5srhrY235Nw18vOJZWxcOfhxdVM0hRVKM8kMx7lcl7cCQ==" + }, + "async.util.onlyonce": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.onlyonce/-/async.util.onlyonce-0.5.2.tgz", + "integrity": "sha512-UgQvkU9JZ+I0Cm1f56XyGXcII+J3d/5XWUuHpcevlItuA3WFSJcqZrsyAUck2FkRSD8BwYQX1zUTDp3SJMVESg==" + }, + "async.util.queue": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.queue/-/async.util.queue-0.5.2.tgz", + "integrity": "sha512-DlKOFnhCzERL9D3bLKlNdgXwSckckcj+XkCvNuX4KMs4brBc2lHvPg8MK4NoPIhwAvUBGvE4NECdNRY0I5UOEQ==", + "requires": { + "async.util.arrayeach": "0.5.2", + "async.util.isarray": "0.5.2", + "async.util.map": "0.5.2", + "async.util.noop": "0.5.2", + "async.util.onlyonce": "0.5.2", + "async.util.setimmediate": "0.5.2" + } + }, + "async.util.restparam": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.restparam/-/async.util.restparam-0.5.2.tgz", + "integrity": "sha512-Q9Z+zgmtMxFX5i7CnBvNOkgrL5hptztCqwarQluyNudUUk4iCmyjmsQl8MuQEjNh3gGqP5ayvDaextL1VXXgIg==" + }, + "async.util.setimmediate": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.setimmediate/-/async.util.setimmediate-0.5.2.tgz", + "integrity": "sha512-aCYF85ZFCQ9Xn0106GcOVx+LvFguIIzfbfRTOlQoie3G4KeSjURfA6f7CfpFAF09FNP2A1MtdjeFdvYeTGDebw==" + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "axios": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", - "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.8.tgz", + "integrity": "sha512-Uu0wb7KNqK2t5K+YQyVCLM76prD5sRFjKHbJYCP1J7JFGEQ6nN7HWn9+04LAeiJ3ji54lgS/gZCH1oxyrf1SPw==", "requires": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -2333,6 +2587,11 @@ "unpipe": "1.0.0" } }, + "bottleneck": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-1.16.0.tgz", + "integrity": "sha512-HinT6aCt+ZLPVvMtOy8Vd1vQtR2R/Qi06fKRCa4oGiIuFF+CQwNYR/KZTjrEynkER7y9WaY8fhwWKqZp+/aXeg==" + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -2351,9 +2610,9 @@ } }, "bson": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/bson/-/bson-6.8.0.tgz", - "integrity": "sha512-iOJg8pr7wq2tg/zSlCCHMi3hMm5JTOxLTagf3zxhcenHsFp+c6uOs6K7W5UE7A4QIJGtqh/ZovFNMP4mOPJynQ==" + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-6.10.0.tgz", + "integrity": "sha512-ROchNosXMJD2cbQGm84KoP7vOGPO6/bOAW0veMMbzhXLqoZptcaYRVLitwvuhwhjjpU1qP4YZRWLhgETdgqUQw==" }, "buffer-from": { "version": "1.1.2", @@ -2428,6 +2687,11 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, + "core-js": { + "version": "3.39.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.39.0.tgz", + "integrity": "sha512-raM0ew0/jJUqkJ0E6e8UDtl+y/7ktFivgWvqw8dNSQeNWoSDLvQ1H/RN3aPXB9tBd4/FhyR4RDPGhsNIMsAn7g==" + }, "cors": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", @@ -2508,6 +2772,24 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==" }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "requires": { + "iconv-lite": "^0.6.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, "es-define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", @@ -2526,6 +2808,11 @@ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + }, "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -2569,13 +2856,10 @@ "vary": "~1.1.2" } }, - "express-oauth2-jwt-bearer": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/express-oauth2-jwt-bearer/-/express-oauth2-jwt-bearer-1.6.0.tgz", - "integrity": "sha512-HXnez7vocYlOqlfF3ozPcf/WE3zxT7zfUNfeg5FHJnvNwhBYlNXiPOvuCtBalis8xcigvwtInzEKhBuH87+9ug==", - "requires": { - "jose": "^4.13.1" - } + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, "fill-range": { "version": "7.1.1", @@ -2792,16 +3076,27 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, - "jose": { - "version": "4.15.9", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", - "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==" - }, "kareem": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.6.3.tgz", "integrity": "sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==" }, + "lodash.chunk": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.chunk/-/lodash.chunk-4.2.0.tgz", + "integrity": "sha512-ZzydJKfUHJwHa+hF5X66zLFCBrWn5GeF28OHEr4WVWtNDXlQ/IjWKPBiikqKo2ne0+v6JgCgJ0GzJp8k8bHC7w==" + }, + "mailparser": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/mailparser/-/mailparser-0.6.2.tgz", + "integrity": "sha512-5Z5nv7TYojrdrKHjhCOKKFaYs0Lo7PCja4RnLZ2kFE1Fskqg+rRVwFpG9Oqx3YjosGM2QEItjHo7+Jc9qvxGqw==", + "requires": { + "encoding": "^0.1.12", + "mime": "^1.3.4", + "mimelib": "^0.3.0", + "uue": "^3.1.0" + } + }, "make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -2845,6 +3140,15 @@ "mime-db": "1.52.0" } }, + "mimelib": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/mimelib/-/mimelib-0.3.1.tgz", + "integrity": "sha512-ipzNp6TBsNfD3hButGlPVlGmuCgybIM9SBf8YwIG+SYmBgtU0u8wjf+BSrJX0mvqtv59SLmwphw/XiCbkLWv7w==", + "requires": { + "addressparser": "~1.0.1", + "encoding": "~0.1.12" + } + }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -2864,12 +3168,12 @@ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" }, "mongodb": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.9.0.tgz", - "integrity": "sha512-UMopBVx1LmEUbW/QE0Hw18u583PEDVQmUmVzzBRH0o/xtE9DBRA5ZYLOjpLIa03i8FXjzvQECJcqoMvCXftTUA==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.11.0.tgz", + "integrity": "sha512-yVbPw0qT268YKhG241vAMLaDQAPbRyTgo++odSgGc9kXnzOujQI60Iyj23B9sQQFPSvmNPvMZ3dsFz0aN55KgA==", "requires": { - "@mongodb-js/saslprep": "^1.1.5", - "bson": "^6.7.0", + "@mongodb-js/saslprep": "^1.1.9", + "bson": "^6.10.0", "mongodb-connection-string-url": "^3.0.0" } }, @@ -2883,13 +3187,13 @@ } }, "mongoose": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.4.1.tgz", - "integrity": "sha512-odQ2WEWGL3hb0Qex+QMN4eH6D34WdMEw7F1If2MGABApSDmG9cMmqv/G1H6WsXmuaH9mkuuadW/WbLE5+tHJwA==", + "version": "8.8.3", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.8.3.tgz", + "integrity": "sha512-/I4n/DcXqXyIiLRfAmUIiTjj3vXfeISke8dt4U4Y8Wfm074Wa6sXnQrXN49NFOFf2mM1kUdOXryoBvkuCnr+Qw==", "requires": { "bson": "^6.7.0", "kareem": "2.6.3", - "mongodb": "6.6.2", + "mongodb": "~6.10.0", "mpath": "0.9.0", "mquery": "5.0.0", "ms": "2.1.3", @@ -2897,9 +3201,9 @@ }, "dependencies": { "mongodb": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.6.2.tgz", - "integrity": "sha512-ZF9Ugo2JCG/GfR7DEb4ypfyJJyiKbg5qBYKRintebj8+DNS33CyGMkWbrS9lara+u+h+yEOGSRiLhFO/g1s1aw==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.10.0.tgz", + "integrity": "sha512-gP9vduuYWb9ZkDM546M+MP2qKVk5ZG2wPF63OvSRuUbqCR+11ZCAE1mOfllhlAG0wcoJY5yDL/rV3OmYEwXIzg==", "requires": { "@mongodb-js/saslprep": "^1.1.5", "bson": "^6.7.0", @@ -2997,9 +3301,9 @@ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" }, "object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==" + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==" }, "on-finished": { "version": "2.4.1", @@ -3043,9 +3347,9 @@ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" }, "prettier": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", - "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.1.tgz", + "integrity": "sha512-G+YdqtITVZmOJje6QkXQWzl3fSfMxFwm1tjTyo9exhkmWSqC4Yhd1+lug++IlR2mvRVAxEDDWYkQdeSztajqgg==", "dev": true }, "proxy-addr": { @@ -3057,18 +3361,16 @@ "ipaddr.js": "1.9.1" } }, -<<<<<<< Updated upstream "proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" -======= + }, "pstree.remy": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", "dev": true ->>>>>>> Stashed changes }, "punycode": { "version": "2.3.1", @@ -3173,6 +3475,36 @@ } } }, + "sendgrid": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/sendgrid/-/sendgrid-5.2.3.tgz", + "integrity": "sha512-FD7oR9TbJFUew1p0Vw9JX0wBetDyq634LzylSXz4n9+hwaf+6a9dNloZl8CcjpsX4NuEc3HJanTN4GjDwNyi4A==", + "requires": { + "async.ensureasync": "^0.5.2", + "async.queue": "^0.5.2", + "bottleneck": "^1.12.0", + "debug": "^2.2.0", + "lodash.chunk": "^4.2.0", + "mailparser": "^0.6.1", + "sendgrid-rest": "^2.3.0" + } + }, + "sendgrid-rest": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/sendgrid-rest/-/sendgrid-rest-2.6.1.tgz", + "integrity": "sha512-W7gPROAPkEiD3+XQh+jeiU5mTNWqfgn45y1Xi8WiFA3CYKGOvHn+U0d62pTWjjynNqsmQIq9AJ0+93Bq67gbSQ==", + "requires": { + "core-js": "^3.5.0", + "dotenv": "^4.0.0" + }, + "dependencies": { + "dotenv": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-4.0.0.tgz", + "integrity": "sha512-XcaMACOr3JMVcEv0Y/iUM2XaOsATRZ3U1In41/1jjK6vJZ2PZbQ1bzCG8uvaByfaBpl9gqc9QWJovpUGBXLLYQ==" + } + } + }, "serve-static": { "version": "1.16.2", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", @@ -3368,9 +3700,9 @@ } }, "typescript": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", - "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==" + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==" }, "undefsafe": { "version": "2.0.5", @@ -3379,9 +3711,9 @@ "dev": true }, "undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==" }, "unpipe": { "version": "1.0.0", @@ -3393,6 +3725,15 @@ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" }, + "uue": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/uue/-/uue-3.1.2.tgz", + "integrity": "sha512-axKLXVqwtdI/czrjG0X8hyV1KLgeWx8F4KvSbvVCnS+RUvsQMGRjx0kfuZDXXqj0LYvVJmx3B9kWlKtEdRrJLg==", + "requires": { + "escape-string-regexp": "~1.0.5", + "extend": "~3.0.0" + } + }, "uuid": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", diff --git a/api/package.json b/api/package.json index c6a49fc..07fe8b2 100644 --- a/api/package.json +++ b/api/package.json @@ -19,9 +19,9 @@ "cors": "^2.8.5", "dotenv": "^16.4.5", "express": "^4.21.0", - "express-oauth2-jwt-bearer": "^1.6.0", "mongodb": "^6.9.0", "mongoose": "^8.4.1", + "sendgrid": "^5.2.3", "ts-node-dev": "^2.0.0", "uuid": "^10.0.0" }, diff --git a/api/src/routes/user.ts b/api/src/routes/user.ts index f3a3b1d..d7646e3 100644 --- a/api/src/routes/user.ts +++ b/api/src/routes/user.ts @@ -23,6 +23,13 @@ const userSchema = new mongoose.Schema({ menteeInfo: [String], // For mentors only meetingSchedule: [String], // For mentees only mentorData: String, // For mentees only + meetings: [ + { + name: String, // title ?? + notes: String, + createdAt: { type: Date, default: Date.now }, + }, + ], }); const User = mongoose.model("User", userSchema); @@ -39,6 +46,7 @@ router.post("/create-user", async (req: any, res: any) => { menteeInfo, meetingSchedule, mentorData, + meetings, } = req.body; if (!firstName || !lastName || !username || !email || !role) { @@ -56,6 +64,7 @@ router.post("/create-user", async (req: any, res: any) => { menteeInfo: role === "mentor" ? menteeInfo : undefined, meetingSchedule: role === "mentee" ? meetingSchedule : undefined, mentorData: role === "mentee" ? mentorData : undefined, + meetings: meetings || [], }); try { @@ -110,4 +119,39 @@ router.post("/send-email", async (req: any, res: any) => { } }); +// Route to add a meeting +router.post("/add-meeting", async (req, res) => { + const { username, meeting, notes } = req.body; + + // Validate required fields + if (!username || !meeting || !notes) { + return res.status(400).json({ message: "Missing required fields" }); + } + + try { + // Find the user by username + console.log("Searching for user with username:", username); + const user = await User.findOne({ username }); + + if (!user) { + console.error(`User not found for username: ${username}`); + return res.status(404).json({ message: "User not found" }); + } + + // Add the meeting to the user's meetings array + user.meetings.push({ name: meeting, notes }); + + // Save the updated user document + await user.save(); + + console.log("Meeting added successfully for username:", username); + return res.status(200).json({ message: "Meeting added successfully", user }); + } catch (error) { + console.error("Error adding meeting:", error); + return res.status(500).json({ message: "Error adding meeting", error }); + } +}); + + + export default router; diff --git a/api/src/server.ts b/api/src/server.ts index 92f97bd..1557625 100644 --- a/api/src/server.ts +++ b/api/src/server.ts @@ -1,4 +1,3 @@ -import path from "path"; import dotenv from "dotenv"; import path from "path"; diff --git a/app/src/pages/CreateMeeting.tsx b/app/src/pages/CreateMeeting.tsx index 5cdf493..7dfb233 100644 --- a/app/src/pages/CreateMeeting.tsx +++ b/app/src/pages/CreateMeeting.tsx @@ -1,66 +1,94 @@ -import React, { useState } from "react"; -import { Formik, Form, Field, FieldArray } from "formik"; +import React from "react"; +import { Formik, Form, Field } from "formik"; import Navbar from "../components/Navbar"; import * as Yup from "yup"; +import { api } from "../api"; // Ensure this points to your configured API instance -const CreateMeeting = () => { - const initialValues = { +const initialValues = { meeting: "", notes: "", - }; - const validationSchema = Yup.object().shape({ - meeting: Yup.string().required("Please enter a meeting name"), - notes: Yup.string().required("Please enter meeting notes"), - }); - const handleSubmit = (values: any) => { - console.log(values); - }; - return ( - <> - -

Create Meeting

- - {({ values, errors, touched, isSubmitting }) => ( -
-
- - - {errors.meeting && touched.meeting && ( -
{errors.meeting}
- )} -
-
- - - {errors.notes && touched.notes && ( -
{errors.notes}
- )} -
- -
- )} -
- - ); + {({ errors, touched, isSubmitting }) => ( +
+
+ + + {errors.meeting && touched.meeting && ( +
{errors.meeting}
+ )} +
+ +
+ + + {errors.notes && touched.notes && ( +
{errors.notes}
+ )} +
+ + +
+ )} + + + ); }; export default CreateMeeting; diff --git a/app/src/pages/CreateWorkshop.tsx b/app/src/pages/CreateWorkshop.tsx index 5e00cd7..f9bffbb 100644 --- a/app/src/pages/CreateWorkshop.tsx +++ b/app/src/pages/CreateWorkshop.tsx @@ -90,4 +90,4 @@ const CreateWorkshop = () => { ) } -export default CreateWorkshop +export default CreateWorkshop \ No newline at end of file From 8d9283dd9be11d117301fe3c7fae8154db2cf374 Mon Sep 17 00:00:00 2001 From: kjgilder Date: Thu, 28 Nov 2024 16:08:54 -0600 Subject: [PATCH 28/31] Fixing lint --- app/src/App.tsx | 2 +- app/src/components/Navbar.tsx | 4 +- app/src/pages/CreateMeeting.tsx | 143 ++++++++++++++-------------- app/src/pages/CreateWorkshop.tsx | 152 +++++++++++++++--------------- app/src/pages/MenteeDashboard.tsx | 82 ++++++++++------ 5 files changed, 207 insertions(+), 176 deletions(-) diff --git a/app/src/App.tsx b/app/src/App.tsx index 61c5e31..e225897 100644 --- a/app/src/App.tsx +++ b/app/src/App.tsx @@ -21,4 +21,4 @@ function App(): ReactElement { ); } -export default App; \ No newline at end of file +export default App; diff --git a/app/src/components/Navbar.tsx b/app/src/components/Navbar.tsx index a39d1fc..5392d4e 100644 --- a/app/src/components/Navbar.tsx +++ b/app/src/components/Navbar.tsx @@ -38,7 +38,7 @@ const Navbar = (): ReactElement => {
{ - navigate("/mentee") + navigate("/mentee"); }} > Mentee @@ -46,7 +46,7 @@ const Navbar = (): ReactElement => {
{ - navigate("/create-workshop") + navigate("/create-workshop"); }} > Create Workshop diff --git a/app/src/pages/CreateMeeting.tsx b/app/src/pages/CreateMeeting.tsx index 7dfb233..4ef8724 100644 --- a/app/src/pages/CreateMeeting.tsx +++ b/app/src/pages/CreateMeeting.tsx @@ -5,90 +5,93 @@ import * as Yup from "yup"; import { api } from "../api"; // Ensure this points to your configured API instance const initialValues = { - meeting: "", - notes: "", + meeting: "", + notes: "", }; // Validation schema using Yup const validationSchema = Yup.object().shape({ - meeting: Yup.string().required("Meeting name is required"), - notes: Yup.string().required("Meeting notes are required"), + meeting: Yup.string().required("Meeting name is required"), + notes: Yup.string().required("Meeting notes are required"), }); const CreateMeeting = () => { - const handleSubmit = async (values: any, { setSubmitting, resetForm }: any) => { - setSubmitting(true); - try { - const payload = { - username: "sample-username", // TODO: Replace with the logged-in user's username - meeting: values.meeting, - notes: values.notes, - }; + const handleSubmit = async ( + values: any, + { setSubmitting, resetForm }: any, + ) => { + setSubmitting(true); + try { + const payload = { + username: "sample-username", // TODO: Replace with the logged-in user's username + meeting: values.meeting, + notes: values.notes, + }; - console.log("Submitting payload:", payload); // Debugging log + console.log("Submitting payload:", payload); // Debugging log - await api.post("/user/add-meeting", payload); + await api.post("/user/add-meeting", payload); - alert("Meeting added successfully!"); + alert("Meeting added successfully!"); - resetForm(); // Clear the form after successful submission - } catch (error) { - console.error("Error adding meeting:", error); - alert("Failed to add meeting. Please try again."); - } finally { - setSubmitting(false); - } - }; + resetForm(); // Clear the form after successful submission + } catch (error) { + console.error("Error adding meeting:", error); + alert("Failed to add meeting. Please try again."); + } finally { + setSubmitting(false); + } + }; - return ( - <> - -

Create Meeting

- - {({ errors, touched, isSubmitting }) => ( -
-
- - - {errors.meeting && touched.meeting && ( -
{errors.meeting}
- )} -
+ return ( + <> + +

Create Meeting

+ + {({ errors, touched, isSubmitting }) => ( + +
+ + + {errors.meeting && touched.meeting && ( +
{errors.meeting}
+ )} +
-
- - - {errors.notes && touched.notes && ( -
{errors.notes}
- )} -
+
+ + + {errors.notes && touched.notes && ( +
{errors.notes}
+ )} +
- - - )} -
- - ); + + + )} +
+ + ); }; export default CreateMeeting; diff --git a/app/src/pages/CreateWorkshop.tsx b/app/src/pages/CreateWorkshop.tsx index f9bffbb..00e0cc7 100644 --- a/app/src/pages/CreateWorkshop.tsx +++ b/app/src/pages/CreateWorkshop.tsx @@ -5,89 +5,91 @@ import Navbar from "../components/Navbar"; import { api } from "../api"; const initialValues = { - name: "", - description: "", -} + name: "", + description: "", +}; // Validation schema using Yup const validationSchema = Yup.object().shape({ - name: Yup.string().required("Name is required"), - description: Yup.string().required("Description is required"), -}) + name: Yup.string().required("Name is required"), + description: Yup.string().required("Description is required"), +}); const CreateWorkshop = () => { - // Handle form submission - const handleSubmit = async (values: any, { setSubmitting, resetForm }: any) => { - setSubmitting(true) - try { - const payload = { - name: values.name, - description: values.description, - s3id: "example-s3-id", // TODO: Placeholder for S3 ID until set up - }; + // Handle form submission + const handleSubmit = async ( + values: any, + { setSubmitting, resetForm }: any, + ) => { + setSubmitting(true); + try { + const payload = { + name: values.name, + description: values.description, + s3id: "example-s3-id", // TODO: Placeholder for S3 ID until set up + }; - await api.post("/api/create-workshop", payload); - // api.ts deals with error responses ! - - } catch (error) { - console.error("Error creating workshop:", error) - alert("Failed to create workshop. Please try again.") - } finally { - setSubmitting(false) - } + await api.post("/api/create-workshop", payload); + // api.ts deals with error responses ! + } catch (error) { + console.error("Error creating workshop:", error); + alert("Failed to create workshop. Please try again."); + } finally { + setSubmitting(false); } + }; - return ( - <> - -

Create Workshop

- - {({ errors, touched, isSubmitting }) => ( -
-
- - - {/* Display error message if name field is invalid */} - {errors.name && touched.name && ( -
{errors.name}
- )} -
+ return ( + <> + +

Create Workshop

+ + {({ errors, touched, isSubmitting }) => ( + +
+ + + {/* Display error message if name field is invalid */} + {errors.name && touched.name && ( +
{errors.name}
+ )} +
-
- - - {/* Display error message if description field is invalid */} - {errors.description && touched.description && ( -
{errors.description}
- )} -
+
+ + + {/* Display error message if description field is invalid */} + {errors.description && touched.description && ( +
{errors.description}
+ )} +
- - - )} -
- - ) -} + + + )} +
+ + ); +}; -export default CreateWorkshop \ No newline at end of file +export default CreateWorkshop; diff --git a/app/src/pages/MenteeDashboard.tsx b/app/src/pages/MenteeDashboard.tsx index c6168e5..a8878b8 100644 --- a/app/src/pages/MenteeDashboard.tsx +++ b/app/src/pages/MenteeDashboard.tsx @@ -1,5 +1,5 @@ -import React, { useState } from "react" -import Navbar from "../components/Navbar" +import React, { useState } from "react"; +import Navbar from "../components/Navbar"; const MenteeDashboard = () => { return ( @@ -7,48 +7,74 @@ const MenteeDashboard = () => {
-
My courses
+
+ My courses +
-
- -
+
+
-

Resume Workshop

-

Workshop content

+

+ Resume Workshop +

+

+ Workshop content +

-
- -
+
+
-

Resume Workshop

-

Workshop content

+

+ Resume Workshop +

+

+ Workshop content +

-
- -
+
+
-

Resume Workshop

-

Workshop content

+

+ Resume Workshop +

+

+ Workshop content +

-
-
Upcoming Events
- -
- +
+ Upcoming Events +
+
- - - ) -} + ); +}; -export default MenteeDashboard \ No newline at end of file +export default MenteeDashboard; From f4d20494dfc5984b67883a21063b2ae10545f486 Mon Sep 17 00:00:00 2001 From: kjgilder Date: Thu, 28 Nov 2024 16:12:17 -0600 Subject: [PATCH 29/31] Prettier --- api/src/routes/user.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/api/src/routes/user.ts b/api/src/routes/user.ts index d7646e3..ccae87b 100644 --- a/api/src/routes/user.ts +++ b/api/src/routes/user.ts @@ -145,13 +145,13 @@ router.post("/add-meeting", async (req, res) => { await user.save(); console.log("Meeting added successfully for username:", username); - return res.status(200).json({ message: "Meeting added successfully", user }); + return res + .status(200) + .json({ message: "Meeting added successfully", user }); } catch (error) { console.error("Error adding meeting:", error); return res.status(500).json({ message: "Error adding meeting", error }); } }); - - export default router; From 78a348f9df2c76fb59d2eb118a66f6a03da02f71 Mon Sep 17 00:00:00 2001 From: Grayson Marie Smith Date: Mon, 2 Dec 2024 17:35:13 -0600 Subject: [PATCH 30/31] Resolve conflicts + update grid styling --- app/.env.example | 6 ----- app/src/components/Navbar.tsx | 4 --- app/src/styles/_components.scss | 15 +---------- app/src/styles/_variables.scss | 28 -------------------- app/src/styles/main.scss | 46 --------------------------------- 5 files changed, 1 insertion(+), 98 deletions(-) delete mode 100644 app/.env.example diff --git a/app/.env.example b/app/.env.example deleted file mode 100644 index c53f8e6..0000000 --- a/app/.env.example +++ /dev/null @@ -1,6 +0,0 @@ -REACT_APP_API_URL = http://127.0.0.1:8000 - -# auth -REACT_APP_AUTH0_DOMAIN=##check notion## -REACT_APP_AUTH0_CLIENT_ID=##check notion## -REACT_APP_AUTH0_CALLBACK_URL=http://localhost:3000/callback diff --git a/app/src/components/Navbar.tsx b/app/src/components/Navbar.tsx index b0724d8..6618a1b 100644 --- a/app/src/components/Navbar.tsx +++ b/app/src/components/Navbar.tsx @@ -21,11 +21,7 @@ const Navbar = (): ReactElement => { >
>>>>>> 95b86b1204320b9b921bba8d9bc4c56c24148501 onClick={() => { navigate("/home"); }} diff --git a/app/src/styles/_components.scss b/app/src/styles/_components.scss index 33dbf9d..f66a4ee 100644 --- a/app/src/styles/_components.scss +++ b/app/src/styles/_components.scss @@ -38,7 +38,6 @@ margin-right: 20px; } -<<<<<<< HEAD &-home { font-size: var(--pww-font-size-30); font-weight: 900; @@ -59,19 +58,6 @@ &:hover { color: var(--pww-color-teal-1000); } -======= - &-link { - color: var(--pww-color-dark-1000); - cursor: pointer; - font-size: var(--pww-font-size-16); - display: flex; // Add this - align-items: center; // Add this - height: 50px; // Match the height of the home icon - &:hover { - color: var(--pww-color-teal-1000); - } - } ->>>>>>> 95b86b1204320b9b921bba8d9bc4c56c24148501 } } } @@ -163,3 +149,4 @@ } } } +} diff --git a/app/src/styles/_variables.scss b/app/src/styles/_variables.scss index bcf6704..a608e19 100644 --- a/app/src/styles/_variables.scss +++ b/app/src/styles/_variables.scss @@ -2,7 +2,6 @@ // this is where we define our colors used in the app //add spaces so that the hex codes are lined up -<<<<<<< HEAD $pww-color-yellow: #b1cf24; //$pww-color-teal: #149baf; $pww-color-teal: #0096C0; @@ -28,33 +27,6 @@ $palette: ( "neutral": $pww-color-neutral, "gray": $pww-color-gray, "dark": $pww-color-dark, -======= -$pww-color-yellow: #B1CF24; -//$pww-color-teal: #149BAF; -$pww-color-teal: #0096C0; -//$pww-color-blue: #32559A; -$pww-color-blue: #4C65A6; -$pww-color-red: #DB504A; -// $pww-color-green: #4A9A4E; -$pww-color-green: #BFD71B; -$pww-color-light: #ffffff; -$pww-color-neutral: #f6f4ef; -// $pww-color-gray: #626262; -$pww-color-gray: #545454; -$pww-color-dark: #000000; - -// allow the colors to be used in inline styles -$palette: ( - "yellow": $pww-color-yellow, - "teal": $pww-color-teal, - "blue": $pww-color-blue, - "red": $pww-color-red, - "green": $pww-color-green, - "light": $pww-color-light, - "neutral": $pww-color-neutral, - "gray": $pww-color-gray, - "dark": $pww-color-dark ->>>>>>> 95b86b1204320b9b921bba8d9bc4c56c24148501 ); // opacities diff --git a/app/src/styles/main.scss b/app/src/styles/main.scss index e421652..363de19 100644 --- a/app/src/styles/main.scss +++ b/app/src/styles/main.scss @@ -1,13 +1,7 @@ // Imports for all of the external libraries -<<<<<<< HEAD @import url("https://fonts.googleapis.com/css?family=Rubik"); @import url('https://fonts.googleapis.com/css?family=Lato'); @import url("https://pro.fontawesome.com/releases/v5.10.0/css/all.css"); -======= -@import url('https://fonts.googleapis.com/css?family=Rubik'); -@import url('https://fonts.googleapis.com/css?family=Lato'); -@import url('https://pro.fontawesome.com/releases/v5.10.0/css/all.css'); ->>>>>>> 95b86b1204320b9b921bba8d9bc4c56c24148501 @import "~bootstrap/scss/bootstrap-utilities.scss"; @import "~bootstrap/scss/bootstrap-grid.scss"; @@ -22,7 +16,6 @@ :root { // define colors -<<<<<<< HEAD @include root-palette($palette); --text-on-dark: var(--pww-color-light-1000); @@ -60,42 +53,3 @@ body { color: var(--pww-color-dark-1000); font-weight: 100; } -======= - @include root-palette($palette); - - --text-on-dark: var(--pww-color-light-1000); - --text-on-light: var(--pww-color-dark-1000); - - --transition-duration: 0.15s; - - --border-radius: 4rem; - --box-shadow: 0 0 3rem rgba(var(--dark), .1); - --line-height: 1.5em; - - --container-padding: 2rem; - } - - // Fonts - html, - body { - // font-family: 'Quattrocento'; - font-family: Lato; - margin: 0; - } - - // default settings for the body - body { - font-size: var(--pww-font-size-4); - background-color: var(--pww-color-neutral-1000); - color: var(--pww-color-dark-1000); - } - - // Background Colors - .app { - min-height: 100vh; - display: flex; - flex-direction: column; - color: var(--pww-color-dark-1000); - font-weight: 100; - } ->>>>>>> 95b86b1204320b9b921bba8d9bc4c56c24148501 From 70a765372e3dec5420daef0e248440fdb80036b2 Mon Sep 17 00:00:00 2001 From: Grayson Marie Smith Date: Mon, 2 Dec 2024 17:44:35 -0600 Subject: [PATCH 31/31] Update merge conflicts + grid styling --- app/src/components/Navbar.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/components/Navbar.tsx b/app/src/components/Navbar.tsx index f50519f..c8e5af0 100644 --- a/app/src/components/Navbar.tsx +++ b/app/src/components/Navbar.tsx @@ -21,7 +21,6 @@ const Navbar = (): ReactElement => { >
{ navigate("/home"); }}