From 72d1186b946bdb0134d1c038edf88da6b0acf538 Mon Sep 17 00:00:00 2001 From: Alan Roybal Date: Thu, 24 Oct 2024 14:00:21 -0500 Subject: [PATCH 01/12] fixed comments --- src/App.jsx | 2 +- src/components/Card.jsx | 2 +- src/components/FeaturedItem.jsx | 11 +++++------ 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/App.jsx b/src/App.jsx index d1ab6c4..2702bf6 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -21,7 +21,7 @@ function App() { } /> - {/* Browse route displaying Navbar and BrowsePage */} + {/* Browse route displaying Navbar and specific page */} } /> } /> } /> diff --git a/src/components/Card.jsx b/src/components/Card.jsx index 1608443..6dde648 100644 --- a/src/components/Card.jsx +++ b/src/components/Card.jsx @@ -22,7 +22,7 @@ function Card(props) {

Bringing: {props.bringing}

- {/* Status and Button */} + {/* Status */}
{/* Status */}

diff --git a/src/components/FeaturedItem.jsx b/src/components/FeaturedItem.jsx index 3147e27..9c16e07 100644 --- a/src/components/FeaturedItem.jsx +++ b/src/components/FeaturedItem.jsx @@ -12,7 +12,7 @@ function FeaturedItem() { {/* Inner White Box with Shadow */}

- {/* Item Image with Hover Effect */} + {/* Location Image with Hover Effect */} - {/* Item Title */} + {/* Location Title */}

Lake Texarkana

- {/* Item Details */} + {/* RSVP Details */}

4 Going | 3 Unsure

- {/* Item Description */} + {/* Picnic Description */}

Time for a day of relaxation on the lake. Bring a floatie and a swimsuit!

- {/* SELLING TYPE AND BUTTON */} + {/* RSVP Status */}

Going

- {/* Flashy Glowing Button */}
From 0cabad2828d6dab9d6411b2e004f662d8b96b613 Mon Sep 17 00:00:00 2001 From: Alan Roybal Date: Tue, 5 Nov 2024 14:43:07 -0600 Subject: [PATCH 02/12] firebase almost done. need to fix login register routing --- .gitignore | 3 + package-lock.json | 932 +++++++++++++++++++++++++++++++- package.json | 2 + src/App.jsx | 55 +- src/components/Login.jsx | 116 ++++ src/components/Navbar.jsx | 2 +- src/components/PrivateRoute.jsx | 17 + src/components/Register.jsx | 105 ++++ src/contexts/authContext.jsx | 28 + src/firebase/auth.js | 35 ++ src/pages/LandingPage.jsx | 21 + src/pages/LoginPage.jsx | 58 ++ src/pages/RegisterPage.jsx | 68 +++ 13 files changed, 1417 insertions(+), 25 deletions(-) create mode 100644 src/components/Login.jsx create mode 100644 src/components/PrivateRoute.jsx create mode 100644 src/components/Register.jsx create mode 100644 src/contexts/authContext.jsx create mode 100644 src/firebase/auth.js create mode 100644 src/pages/LandingPage.jsx create mode 100644 src/pages/LoginPage.jsx create mode 100644 src/pages/RegisterPage.jsx diff --git a/.gitignore b/.gitignore index a547bf3..b54f062 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,9 @@ yarn-error.log* pnpm-debug.log* lerna-debug.log* +firebase +.firebase.js + node_modules dist dist-ssr diff --git a/package-lock.json b/package-lock.json index cc525c8..9fcf694 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,8 @@ "name": "devday", "version": "0.0.0", "dependencies": { + "firebase": "^10.14.1", + "firebaseui": "^6.1.0", "react": "^18.3.1", "react-dom": "^18.3.1", "react-icons": "^5.3.0", @@ -818,6 +820,554 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@firebase/analytics": { + "version": "0.10.8", + "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.8.tgz", + "integrity": "sha512-CVnHcS4iRJPqtIDc411+UmFldk0ShSK3OB+D0bKD8Ck5Vro6dbK5+APZpkuWpbfdL359DIQUnAaMLE+zs/PVyA==", + "dependencies": { + "@firebase/component": "0.6.9", + "@firebase/installations": "0.6.9", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.10.0", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/analytics-compat": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.14.tgz", + "integrity": "sha512-unRVY6SvRqfNFIAA/kwl4vK+lvQAL2HVcgu9zTrUtTyYDmtIt/lOuHJynBMYEgLnKm39YKBDhtqdapP2e++ASw==", + "dependencies": { + "@firebase/analytics": "0.10.8", + "@firebase/analytics-types": "0.8.2", + "@firebase/component": "0.6.9", + "@firebase/util": "1.10.0", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/analytics-types": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.8.2.tgz", + "integrity": "sha512-EnzNNLh+9/sJsimsA/FGqzakmrAUKLeJvjRHlg8df1f97NLUlFidk9600y0ZgWOp3CAxn6Hjtk+08tixlUOWyw==" + }, + "node_modules/@firebase/app": { + "version": "0.10.13", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.10.13.tgz", + "integrity": "sha512-OZiDAEK/lDB6xy/XzYAyJJkaDqmQ+BCtOEPLqFvxWKUz5JbBmej7IiiRHdtiIOD/twW7O5AxVsfaaGA/V1bNsA==", + "dependencies": { + "@firebase/component": "0.6.9", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.10.0", + "idb": "7.1.1", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/app-check": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.8.8.tgz", + "integrity": "sha512-O49RGF1xj7k6BuhxGpHmqOW5hqBIAEbt2q6POW0lIywx7emYtzPDeQI+ryQpC4zbKX646SoVZ711TN1DBLNSOQ==", + "dependencies": { + "@firebase/component": "0.6.9", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.10.0", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/app-check-compat": { + "version": "0.3.15", + "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.3.15.tgz", + "integrity": "sha512-zFIvIFFNqDXpOT2huorz9cwf56VT3oJYRFjSFYdSbGYEJYEaXjLJbfC79lx/zjx4Fh+yuN8pry3TtvwaevrGbg==", + "dependencies": { + "@firebase/app-check": "0.8.8", + "@firebase/app-check-types": "0.5.2", + "@firebase/component": "0.6.9", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.10.0", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/app-check-interop-types": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.2.tgz", + "integrity": "sha512-LMs47Vinv2HBMZi49C09dJxp0QT5LwDzFaVGf/+ITHe3BlIhUiLNttkATSXplc89A2lAaeTqjgqVkiRfUGyQiQ==" + }, + "node_modules/@firebase/app-check-types": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.5.2.tgz", + "integrity": "sha512-FSOEzTzL5bLUbD2co3Zut46iyPWML6xc4x+78TeaXMSuJap5QObfb+rVvZJtla3asN4RwU7elaQaduP+HFizDA==" + }, + "node_modules/@firebase/app-compat": { + "version": "0.2.43", + "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.43.tgz", + "integrity": "sha512-HM96ZyIblXjAC7TzE8wIk2QhHlSvksYkQ4Ukh1GmEenzkucSNUmUX4QvoKrqeWsLEQ8hdcojABeCV8ybVyZmeg==", + "dependencies": { + "@firebase/app": "0.10.13", + "@firebase/component": "0.6.9", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.10.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/app-types": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.2.tgz", + "integrity": "sha512-oMEZ1TDlBz479lmABwWsWjzHwheQKiAgnuKxE0pz0IXCVx7/rtlkx1fQ6GfgK24WCrxDKMplZrT50Kh04iMbXQ==" + }, + "node_modules/@firebase/auth": { + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.7.9.tgz", + "integrity": "sha512-yLD5095kVgDw965jepMyUrIgDklD6qH/BZNHeKOgvu7pchOKNjVM+zQoOVYJIKWMWOWBq8IRNVU6NXzBbozaJg==", + "dependencies": { + "@firebase/component": "0.6.9", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.10.0", + "tslib": "^2.1.0", + "undici": "6.19.7" + }, + "peerDependencies": { + "@firebase/app": "0.x", + "@react-native-async-storage/async-storage": "^1.18.1" + }, + "peerDependenciesMeta": { + "@react-native-async-storage/async-storage": { + "optional": true + } + } + }, + "node_modules/@firebase/auth-compat": { + "version": "0.5.14", + "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.5.14.tgz", + "integrity": "sha512-2eczCSqBl1KUPJacZlFpQayvpilg3dxXLy9cSMTKtQMTQSmondUtPI47P3ikH3bQAXhzKLOE+qVxJ3/IRtu9pw==", + "dependencies": { + "@firebase/auth": "1.7.9", + "@firebase/auth-types": "0.12.2", + "@firebase/component": "0.6.9", + "@firebase/util": "1.10.0", + "tslib": "^2.1.0", + "undici": "6.19.7" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/auth-interop-types": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.3.tgz", + "integrity": "sha512-Fc9wuJGgxoxQeavybiuwgyi+0rssr76b+nHpj+eGhXFYAdudMWyfBHvFL/I5fEHniUM/UQdFzi9VXJK2iZF7FQ==" + }, + "node_modules/@firebase/auth-types": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.12.2.tgz", + "integrity": "sha512-qsEBaRMoGvHO10unlDJhaKSuPn4pyoTtlQuP1ghZfzB6rNQPuhp/N/DcFZxm9i4v0SogjCbf9reWupwIvfmH6w==", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/component": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.9.tgz", + "integrity": "sha512-gm8EUEJE/fEac86AvHn8Z/QW8BvR56TBw3hMW0O838J/1mThYQXAIQBgUv75EqlCZfdawpWLrKt1uXvp9ciK3Q==", + "dependencies": { + "@firebase/util": "1.10.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/data-connect": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@firebase/data-connect/-/data-connect-0.1.0.tgz", + "integrity": "sha512-vSe5s8dY13ilhLnfY0eYRmQsdTbH7PUFZtBbqU6JVX/j8Qp9A6G5gG6//ulbX9/1JFOF1IWNOne9c8S/DOCJaQ==", + "dependencies": { + "@firebase/auth-interop-types": "0.2.3", + "@firebase/component": "0.6.9", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.10.0", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/database": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.8.tgz", + "integrity": "sha512-dzXALZeBI1U5TXt6619cv0+tgEhJiwlUtQ55WNZY7vGAjv7Q1QioV969iYwt1AQQ0ovHnEW0YW9TiBfefLvErg==", + "dependencies": { + "@firebase/app-check-interop-types": "0.3.2", + "@firebase/auth-interop-types": "0.2.3", + "@firebase/component": "0.6.9", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.10.0", + "faye-websocket": "0.11.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/database-compat": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-1.0.8.tgz", + "integrity": "sha512-OpeWZoPE3sGIRPBKYnW9wLad25RaWbGyk7fFQe4xnJQKRzlynWeFBSRRAoLE2Old01WXwskUiucNqUUVlFsceg==", + "dependencies": { + "@firebase/component": "0.6.9", + "@firebase/database": "1.0.8", + "@firebase/database-types": "1.0.5", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.10.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/database-types": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.5.tgz", + "integrity": "sha512-fTlqCNwFYyq/C6W7AJ5OCuq5CeZuBEsEwptnVxlNPkWCo5cTTyukzAHRSO/jaQcItz33FfYrrFk1SJofcu2AaQ==", + "dependencies": { + "@firebase/app-types": "0.9.2", + "@firebase/util": "1.10.0" + } + }, + "node_modules/@firebase/firestore": { + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.7.3.tgz", + "integrity": "sha512-NwVU+JPZ/3bhvNSJMCSzfcBZZg8SUGyzZ2T0EW3/bkUeefCyzMISSt/TTIfEHc8cdyXGlMqfGe3/62u9s74UEg==", + "dependencies": { + "@firebase/component": "0.6.9", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.10.0", + "@firebase/webchannel-wrapper": "1.0.1", + "@grpc/grpc-js": "~1.9.0", + "@grpc/proto-loader": "^0.7.8", + "tslib": "^2.1.0", + "undici": "6.19.7" + }, + "engines": { + "node": ">=10.10.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/firestore-compat": { + "version": "0.3.38", + "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.38.tgz", + "integrity": "sha512-GoS0bIMMkjpLni6StSwRJarpu2+S5m346Na7gr9YZ/BZ/W3/8iHGNr9PxC+f0rNZXqS4fGRn88pICjrZEgbkqQ==", + "dependencies": { + "@firebase/component": "0.6.9", + "@firebase/firestore": "4.7.3", + "@firebase/firestore-types": "3.0.2", + "@firebase/util": "1.10.0", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/firestore-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-3.0.2.tgz", + "integrity": "sha512-wp1A+t5rI2Qc/2q7r2ZpjUXkRVPtGMd6zCLsiWurjsQpqPgFin3AhNibKcIzoF2rnToNa/XYtyWXuifjOOwDgg==", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/functions": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.11.8.tgz", + "integrity": "sha512-Lo2rTPDn96naFIlSZKVd1yvRRqqqwiJk7cf9TZhUerwnPKgBzXy+aHE22ry+6EjCaQusUoNai6mU6p+G8QZT1g==", + "dependencies": { + "@firebase/app-check-interop-types": "0.3.2", + "@firebase/auth-interop-types": "0.2.3", + "@firebase/component": "0.6.9", + "@firebase/messaging-interop-types": "0.2.2", + "@firebase/util": "1.10.0", + "tslib": "^2.1.0", + "undici": "6.19.7" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/functions-compat": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.14.tgz", + "integrity": "sha512-dZ0PKOKQFnOlMfcim39XzaXonSuPPAVuzpqA4ONTIdyaJK/OnBaIEVs/+BH4faa1a2tLeR+Jy15PKqDRQoNIJw==", + "dependencies": { + "@firebase/component": "0.6.9", + "@firebase/functions": "0.11.8", + "@firebase/functions-types": "0.6.2", + "@firebase/util": "1.10.0", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/functions-types": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.6.2.tgz", + "integrity": "sha512-0KiJ9lZ28nS2iJJvimpY4nNccV21rkQyor5Iheu/nq8aKXJqtJdeSlZDspjPSBBiHRzo7/GMUttegnsEITqR+w==" + }, + "node_modules/@firebase/installations": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.9.tgz", + "integrity": "sha512-hlT7AwCiKghOX3XizLxXOsTFiFCQnp/oj86zp1UxwDGmyzsyoxtX+UIZyVyH/oBF5+XtblFG9KZzZQ/h+dpy+Q==", + "dependencies": { + "@firebase/component": "0.6.9", + "@firebase/util": "1.10.0", + "idb": "7.1.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/installations-compat": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.9.tgz", + "integrity": "sha512-2lfdc6kPXR7WaL4FCQSQUhXcPbI7ol3wF+vkgtU25r77OxPf8F/VmswQ7sgIkBBWtymn5ZF20TIKtnOj9rjb6w==", + "dependencies": { + "@firebase/component": "0.6.9", + "@firebase/installations": "0.6.9", + "@firebase/installations-types": "0.5.2", + "@firebase/util": "1.10.0", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/installations-types": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.5.2.tgz", + "integrity": "sha512-que84TqGRZJpJKHBlF2pkvc1YcXrtEDOVGiDjovP/a3s6W4nlbohGXEsBJo0JCeeg/UG9A+DEZVDUV9GpklUzA==", + "peerDependencies": { + "@firebase/app-types": "0.x" + } + }, + "node_modules/@firebase/logger": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.2.tgz", + "integrity": "sha512-Q1VuA5M1Gjqrwom6I6NUU4lQXdo9IAQieXlujeHZWvRt1b7qQ0KwBaNAjgxG27jgF9/mUwsNmO8ptBCGVYhB0A==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/messaging": { + "version": "0.12.12", + "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.12.tgz", + "integrity": "sha512-6q0pbzYBJhZEtUoQx7hnPhZvAbuMNuBXKQXOx2YlWhSrlv9N1m0ZzlNpBbu/ItTzrwNKTibdYzUyaaxdWLg+4w==", + "dependencies": { + "@firebase/component": "0.6.9", + "@firebase/installations": "0.6.9", + "@firebase/messaging-interop-types": "0.2.2", + "@firebase/util": "1.10.0", + "idb": "7.1.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/messaging-compat": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.12.tgz", + "integrity": "sha512-pKsiUVZrbmRgdImYqhBNZlkKJbqjlPkVdQRZGRbkTyX4OSGKR0F/oJeCt1a8jEg5UnBp4fdVwSWSp4DuCovvEQ==", + "dependencies": { + "@firebase/component": "0.6.9", + "@firebase/messaging": "0.12.12", + "@firebase/util": "1.10.0", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/messaging-interop-types": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.2.tgz", + "integrity": "sha512-l68HXbuD2PPzDUOFb3aG+nZj5KA3INcPwlocwLZOzPp9rFM9yeuI9YLl6DQfguTX5eAGxO0doTR+rDLDvQb5tA==" + }, + "node_modules/@firebase/performance": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.6.9.tgz", + "integrity": "sha512-PnVaak5sqfz5ivhua+HserxTJHtCar/7zM0flCX6NkzBNzJzyzlH4Hs94h2Il0LQB99roBqoE5QT1JqWqcLJHQ==", + "dependencies": { + "@firebase/component": "0.6.9", + "@firebase/installations": "0.6.9", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.10.0", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/performance-compat": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.9.tgz", + "integrity": "sha512-dNl95IUnpsu3fAfYBZDCVhXNkASE0uo4HYaEPd2/PKscfTvsgqFAOxfAXzBEDOnynDWiaGUnb5M1O00JQ+3FXA==", + "dependencies": { + "@firebase/component": "0.6.9", + "@firebase/logger": "0.4.2", + "@firebase/performance": "0.6.9", + "@firebase/performance-types": "0.2.2", + "@firebase/util": "1.10.0", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/performance-types": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.2.2.tgz", + "integrity": "sha512-gVq0/lAClVH5STrIdKnHnCo2UcPLjJlDUoEB/tB4KM+hAeHUxWKnpT0nemUPvxZ5nbdY/pybeyMe8Cs29gEcHA==" + }, + "node_modules/@firebase/remote-config": { + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.4.9.tgz", + "integrity": "sha512-EO1NLCWSPMHdDSRGwZ73kxEEcTopAxX1naqLJFNApp4hO8WfKfmEpmjxmP5TrrnypjIf2tUkYaKsfbEA7+AMmA==", + "dependencies": { + "@firebase/component": "0.6.9", + "@firebase/installations": "0.6.9", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.10.0", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/remote-config-compat": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.9.tgz", + "integrity": "sha512-AxzGpWfWFYejH2twxfdOJt5Cfh/ATHONegTd/a0p5flEzsD5JsxXgfkFToop+mypEL3gNwawxrxlZddmDoNxyA==", + "dependencies": { + "@firebase/component": "0.6.9", + "@firebase/logger": "0.4.2", + "@firebase/remote-config": "0.4.9", + "@firebase/remote-config-types": "0.3.2", + "@firebase/util": "1.10.0", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/remote-config-types": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.3.2.tgz", + "integrity": "sha512-0BC4+Ud7y2aPTyhXJTMTFfrGGLqdYXrUB9sJVAB8NiqJswDTc4/2qrE/yfUbnQJhbSi6ZaTTBKyG3n1nplssaA==" + }, + "node_modules/@firebase/storage": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.13.2.tgz", + "integrity": "sha512-fxuJnHshbhVwuJ4FuISLu+/76Aby2sh+44ztjF2ppoe0TELIDxPW6/r1KGlWYt//AD0IodDYYA8ZTN89q8YqUw==", + "dependencies": { + "@firebase/component": "0.6.9", + "@firebase/util": "1.10.0", + "tslib": "^2.1.0", + "undici": "6.19.7" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/storage-compat": { + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.12.tgz", + "integrity": "sha512-hA4VWKyGU5bWOll+uwzzhEMMYGu9PlKQc1w4DWxB3aIErWYzonrZjF0icqNQZbwKNIdh8SHjZlFeB2w6OSsjfg==", + "dependencies": { + "@firebase/component": "0.6.9", + "@firebase/storage": "0.13.2", + "@firebase/storage-types": "0.8.2", + "@firebase/util": "1.10.0", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/storage-types": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.8.2.tgz", + "integrity": "sha512-0vWu99rdey0g53lA7IShoA2Lol1jfnPovzLDUBuon65K7uKG9G+L5uO05brD9pMw+l4HRFw23ah3GwTGpEav6g==", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/util": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.10.0.tgz", + "integrity": "sha512-xKtx4A668icQqoANRxyDLBLz51TAbDP9KRfpbKGxiCAW346d0BeJe5vN6/hKxxmWwnZ0mautyv39JxviwwQMOQ==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/vertexai-preview": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@firebase/vertexai-preview/-/vertexai-preview-0.0.4.tgz", + "integrity": "sha512-EBSqyu9eg8frQlVU9/HjKtHN7odqbh9MtAcVz3WwHj4gLCLOoN9F/o+oxlq3CxvFrd3CNTZwu6d2mZtVlEInng==", + "dependencies": { + "@firebase/app-check-interop-types": "0.3.2", + "@firebase/component": "0.6.9", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.10.0", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@firebase/app": "0.x", + "@firebase/app-types": "0.x" + } + }, + "node_modules/@firebase/webchannel-wrapper": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-1.0.1.tgz", + "integrity": "sha512-jmEnr/pk0yVkA7mIlHNnxCi+wWzOFUg0WyIotgkKAb2u1J7fAeDBcVNSTjTihbAYNusCLQdW5s9IJ5qwnEufcQ==" + }, + "node_modules/@grpc/grpc-js": { + "version": "1.9.15", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.15.tgz", + "integrity": "sha512-nqE7Hc0AzI+euzUwDAy0aY5hCp10r734gMGRdU+qOPX0XSceI2ULrcXB5U2xSc5VkWwalCj4M7GzCAygZl2KoQ==", + "dependencies": { + "@grpc/proto-loader": "^0.7.8", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", + "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.5", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -981,6 +1531,60 @@ "node": ">=14" } }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, "node_modules/@remix-run/router": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.20.0.tgz", @@ -1244,6 +1848,14 @@ "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", "dev": true }, + "node_modules/@types/node": { + "version": "22.7.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.9.tgz", + "integrity": "sha512-jrTfRC7FM6nChvU7X2KqcrgquofrWLFDeYC1hKfwNWomVvrn7JIksqf344WN2X/y8xrgqBd2dJATZV4GbatBfg==", + "dependencies": { + "undici-types": "~6.19.2" + } + }, "node_modules/@types/prop-types": { "version": "15.7.12", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", @@ -1329,7 +1941,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -1738,6 +2349,83 @@ "node": ">= 6" } }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/cliui/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -1914,6 +2602,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/dialog-polyfill": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/dialog-polyfill/-/dialog-polyfill-0.4.10.tgz", + "integrity": "sha512-j5yGMkP8T00UFgyO+78OxiN5vC5dzRQF3BEio+LhNvDbyfxWBsi3sfPArDm54VloaJwy2hm3erEiDWqHRC8rzw==" + }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -2156,7 +2849,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, "engines": { "node": ">=6" } @@ -2506,6 +3198,17 @@ "reusify": "^1.0.4" } }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", @@ -2546,6 +3249,53 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/firebase": { + "version": "10.14.1", + "resolved": "https://registry.npmjs.org/firebase/-/firebase-10.14.1.tgz", + "integrity": "sha512-0KZxU+Ela9rUCULqFsUUOYYkjh7OM1EWdIfG6///MtXd0t2/uUIf0iNV5i0KariMhRQ5jve/OY985nrAXFaZeQ==", + "dependencies": { + "@firebase/analytics": "0.10.8", + "@firebase/analytics-compat": "0.2.14", + "@firebase/app": "0.10.13", + "@firebase/app-check": "0.8.8", + "@firebase/app-check-compat": "0.3.15", + "@firebase/app-compat": "0.2.43", + "@firebase/app-types": "0.9.2", + "@firebase/auth": "1.7.9", + "@firebase/auth-compat": "0.5.14", + "@firebase/data-connect": "0.1.0", + "@firebase/database": "1.0.8", + "@firebase/database-compat": "1.0.8", + "@firebase/firestore": "4.7.3", + "@firebase/firestore-compat": "0.3.38", + "@firebase/functions": "0.11.8", + "@firebase/functions-compat": "0.3.14", + "@firebase/installations": "0.6.9", + "@firebase/installations-compat": "0.2.9", + "@firebase/messaging": "0.12.12", + "@firebase/messaging-compat": "0.2.12", + "@firebase/performance": "0.6.9", + "@firebase/performance-compat": "0.2.9", + "@firebase/remote-config": "0.4.9", + "@firebase/remote-config-compat": "0.2.9", + "@firebase/storage": "0.13.2", + "@firebase/storage-compat": "0.3.12", + "@firebase/util": "1.10.0", + "@firebase/vertexai-preview": "0.0.4" + } + }, + "node_modules/firebaseui": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/firebaseui/-/firebaseui-6.1.0.tgz", + "integrity": "sha512-5WiVYVxPGMANuZKxg6KLyU1tyqIsbqf/59Zm4HrdFYwPtM5lxxB0THvgaIk4ix+hCgF0qmY89sKiktcifKzGIA==", + "dependencies": { + "dialog-polyfill": "^0.4.7", + "material-design-lite": "^1.2.0" + }, + "peerDependencies": { + "firebase": "^9.1.3 || ^10.0.0" + } + }, "node_modules/flat-cache": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", @@ -2662,6 +3412,14 @@ "node": ">=6.9.0" } }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, "node_modules/get-intrinsic": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", @@ -2875,6 +3633,16 @@ "node": ">= 0.4" } }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" + }, + "node_modules/idb": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==" + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -3076,7 +3844,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "engines": { "node": ">=8" } @@ -3468,12 +4235,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -3494,6 +4271,14 @@ "yallist": "^3.0.2" } }, + "node_modules/material-design-lite": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/material-design-lite/-/material-design-lite-1.3.0.tgz", + "integrity": "sha512-ao76b0bqSTKcEMt7Pui+J/S3eVF0b3GWfuKUwfe2lP5DKlLZOwBq37e0/bXEzxrw7/SuHAuYAdoCwY6mAYhrsg==", + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -4149,6 +4934,29 @@ "react-is": "^16.13.1" } }, + "node_modules/protobufjs": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", + "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -4314,6 +5122,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve": { "version": "2.0.0-next.5", "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", @@ -4426,6 +5242,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/safe-regex-test": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", @@ -4706,7 +5541,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -4893,6 +5727,11 @@ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", "dev": true }, + "node_modules/tslib": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==" + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -4993,6 +5832,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/undici": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.19.7.tgz", + "integrity": "sha512-HR3W/bMGPSr90i8AAp2C4DM3wChFdJPLrWYpIS++LxS8K+W535qftjt+4MyjNYHeWabMj1nvtmLIi7l++iq91A==", + "engines": { + "node": ">=18.17" + } + }, + "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==" + }, "node_modules/update-browserslist-db": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", @@ -5097,6 +5949,27 @@ } } }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -5327,6 +6200,14 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -5345,6 +6226,49 @@ "node": ">= 14" } }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index eabf5b6..a54db9d 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,8 @@ "preview": "vite preview" }, "dependencies": { + "firebase": "^10.14.1", + "firebaseui": "^6.1.0", "react": "^18.3.1", "react-dom": "^18.3.1", "react-icons": "^5.3.0", diff --git a/src/App.jsx b/src/App.jsx index 2702bf6..10f2adb 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -5,29 +5,44 @@ import Dashboard from './components/Dashboard'; import ActivityPage from './pages/ActivityPage'; import RSVPPage from './pages/RSVPPage'; import MapPage from './pages/MapPage'; +import LoginPage from './pages/LoginPage'; +import RegisterPage from './pages/RegisterPage'; +import LandingPage from './pages/LandingPage'; +import { AuthProvider } from './contexts/authContext'; +import PrivateRoute from './components/PrivateRoute'; function App() { return ( - - - - {/* Home route displaying Navbar, FeaturedItem, and Dashboard */} - - - - - } - /> - {/* Browse route displaying Navbar and specific page */} - } /> - } /> - } /> - - + + + + {/* Landing Page at Root Path */} + } /> + + {/* Protected Routes */} + + <> + + + + + + } + /> + } /> + } /> + } /> + + {/* Public Routes */} + } /> + } /> + + + ); } -export default App; \ No newline at end of file +export default App; diff --git a/src/components/Login.jsx b/src/components/Login.jsx new file mode 100644 index 0000000..2de382d --- /dev/null +++ b/src/components/Login.jsx @@ -0,0 +1,116 @@ +import React, { useState } from 'react' +import { Navigate, Link } from 'react-router-dom' +import { doSignInWithEmailAndPassword, doSignInWithGoogle } from '../firebase/auth' +import { useAuth } from '../contexts/authContext' + +const Login = () => { + const { userLoggedIn } = useAuth() + + const [email, setEmail] = useState('') + const [password, setPassword] = useState('') + const [isSigningIn, setIsSigningIn] = useState(false) + const [errorMessage, setErrorMessage] = useState('') + + const onSubmit = async (e) => { + e.preventDefault() + if(!isSigningIn) { + setIsSigningIn(true) + await doSignInWithEmailAndPassword(email, password) + // doSendEmailVerification() + } + } + + const onGoogleSignIn = (e) => { + e.preventDefault() + if (!isSigningIn) { + setIsSigningIn(true) + doSignInWithGoogle().catch(err => { + setIsSigningIn(false) + }) + } + } + + return ( +
+ {userLoggedIn && ()} + +
+
+
+
+

Welcome Back

+
+
+
+
+ + { setEmail(e.target.value) }} + className="w-full mt-2 px-3 py-2 text-gray-500 bg-transparent outline-none border focus:border-indigo-600 shadow-sm rounded-lg transition duration-300" + /> +
+ + +
+ + { setPassword(e.target.value) }} + className="w-full mt-2 px-3 py-2 text-gray-500 bg-transparent outline-none border focus:border-indigo-600 shadow-sm rounded-lg transition duration-300" + /> +
+ + {errorMessage && ( + {errorMessage} + )} + + +
+

Don't have an account? Sign up

+
+
OR
+
+ +
+
+
+ ) +} + +export default Login \ No newline at end of file diff --git a/src/components/Navbar.jsx b/src/components/Navbar.jsx index 3703d6a..4bb2638 100644 --- a/src/components/Navbar.jsx +++ b/src/components/Navbar.jsx @@ -1,7 +1,7 @@ import React from 'react'; import { PiBellSimpleRinging } from 'react-icons/pi'; import { VscAccount } from 'react-icons/vsc'; -import { Link } from 'react-router-dom'; +import { Link, useNavigate } from 'react-router-dom'; function Navbar() { return ( diff --git a/src/components/PrivateRoute.jsx b/src/components/PrivateRoute.jsx new file mode 100644 index 0000000..a7194f2 --- /dev/null +++ b/src/components/PrivateRoute.jsx @@ -0,0 +1,17 @@ +import React from 'react'; +import { Navigate } from 'react-router-dom'; +import { useAuth } from '../contexts/authContext'; + +function PrivateRoute({ children }) { + const { userLoggedIn } = useAuth(); + + // Redirect to LandingPage if not logged in + if (!userLoggedIn) { + return ; + } + + // Otherwise, render the child components + return children; +} + +export default PrivateRoute; diff --git a/src/components/Register.jsx b/src/components/Register.jsx new file mode 100644 index 0000000..1dfeb40 --- /dev/null +++ b/src/components/Register.jsx @@ -0,0 +1,105 @@ +import React, { useState } from 'react' +import { Navigate, Link, useNavigate } from 'react-router-dom' +import { useAuth } from '../contexts/authContext' +import { doCreateUserWithEmailAndPassword } from '../firebase/auth' + +const Register = () => { + + const navigate = useNavigate() + + const [email, setEmail] = useState('') + const [password, setPassword] = useState('') + const [confirmPassword, setconfirmPassword] = useState('') + const [isRegistering, setIsRegistering] = useState(false) + const [errorMessage, setErrorMessage] = useState('') + + const { userLoggedIn } = useAuth() + + const onSubmit = async (e) => { + e.preventDefault() + if(!isRegistering) { + setIsRegistering(true) + await doCreateUserWithEmailAndPassword(email, password) + } + } + + return ( + <> + {userLoggedIn && ()} + +
+
+
+
+

Create a New Account

+
+ +
+
+
+ + { setEmail(e.target.value) }} + className="w-full mt-2 px-3 py-2 text-gray-500 bg-transparent outline-none border focus:indigo-600 shadow-sm rounded-lg transition duration-300" + /> +
+ +
+ + { setPassword(e.target.value) }} + className="w-full mt-2 px-3 py-2 text-gray-500 bg-transparent outline-none border focus:border-indigo-600 shadow-sm rounded-lg transition duration-300" + /> +
+ +
+ + { setconfirmPassword(e.target.value) }} + className="w-full mt-2 px-3 py-2 text-gray-500 bg-transparent outline-none border focus:border-indigo-600 shadow-sm rounded-lg transition duration-300" + /> +
+ + {errorMessage && ( + {errorMessage} + )} + + +
+ Already have an account? {' '} + Continue +
+
+
+
+ + ) +} + +export default Register \ No newline at end of file diff --git a/src/contexts/authContext.jsx b/src/contexts/authContext.jsx new file mode 100644 index 0000000..3778e08 --- /dev/null +++ b/src/contexts/authContext.jsx @@ -0,0 +1,28 @@ +import { createContext, useContext, useEffect, useState } from 'react'; +import { onAuthStateChanged, signInWithEmailAndPassword, createUserWithEmailAndPassword, signOut } from 'firebase/auth'; +import { auth } from '../firebase/firebase'; + +const AuthContext = createContext(); + +export const useAuth = () => useContext(AuthContext); + +export const AuthProvider = ({ children }) => { + const [user, setUser] = useState(null); + + useEffect(() => { + const unsubscribe = onAuthStateChanged(auth, (user) => { + setUser(user); + }); + return unsubscribe; + }, []); + + const login = (email, password) => signInWithEmailAndPassword(auth, email, password); + const register = (email, password) => createUserWithEmailAndPassword(auth, email, password); + const logout = () => signOut(auth); + + return ( + + {children} + + ); +}; diff --git a/src/firebase/auth.js b/src/firebase/auth.js new file mode 100644 index 0000000..c933825 --- /dev/null +++ b/src/firebase/auth.js @@ -0,0 +1,35 @@ +import { auth } from "./firebase"; +import { createUserWithEmailAndPassword, GoogleAuthProvider, sendEmailVerification, sendPasswordResetEmail, signInWithEmailAndPassword, signInWithPopup, updatePassword } from "firebase/auth"; + +export const doCreateUserWithEmailAndPassword = async (email, password) => { + return createUserWithEmailAndPassword(auth, email, password); +}; + +export const doSignInWithEmailAndPassword = (email, password) => { + return signInWithEmailAndPassword(auth, email, password); +} + +export const doSignInWithGoogle = async () => { + const provider = new GoogleAuthProvider(); + const result = await signInWithPopup(auth, provider); + + return result; +}; + +export const doSignOut = () => { + return auth.signOut(); +}; + +export const doPasswordReset = (email) => { + return sendPasswordResetEmail(auth, email); +}; + +export const doPasswordChange = (password) => { + return updatePassword(auth.currentUser, password); +}; + +export const doSendEmailVerification = () => { + return sendEmailVerification(auth.currentUser, { + url: `${window.location.origin}/home`, + }); +}; \ No newline at end of file diff --git a/src/pages/LandingPage.jsx b/src/pages/LandingPage.jsx new file mode 100644 index 0000000..e40b87b --- /dev/null +++ b/src/pages/LandingPage.jsx @@ -0,0 +1,21 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; + +function LandingPage() { + return ( +
+

Welcome to Ripple & Refresh

+

Please log in or register to continue

+
+ + Login + + + Register + +
+
+ ); +} + +export default LandingPage; diff --git a/src/pages/LoginPage.jsx b/src/pages/LoginPage.jsx new file mode 100644 index 0000000..875e2ff --- /dev/null +++ b/src/pages/LoginPage.jsx @@ -0,0 +1,58 @@ +import React, { useEffect, useState } from 'react'; +import { Link, useNavigate } from 'react-router-dom'; +import { useAuth } from '../contexts/authContext'; + +function LoginPage() { + const { userLoggedIn, login } = useAuth(); + const navigate = useNavigate(); + const [email, setEmail] = useState(''); + const [password, setPassword] = useState(''); + const [error, setError] = useState(''); + + useEffect(() => { + if (userLoggedIn) { + navigate('/home'); // Redirect to home if already logged in + } + }, [userLoggedIn, navigate]); + + const handleSubmit = async (e) => { + e.preventDefault(); + try { + await login(email, password); + navigate('/home'); // Redirect to home after login + } catch (error) { + setError('Invalid credentials, please try again.'); + } + }; + + return ( +
+
+

Login

+ {error &&

{error}

} + setEmail(e.target.value)} + className="border p-2 mt-2 w-full" + required + /> + setPassword(e.target.value)} + className="border p-2 mt-2 w-full" + required + /> + +

+ Don't have an account? Register +

+
+
+ ); +} + +export default LoginPage; diff --git a/src/pages/RegisterPage.jsx b/src/pages/RegisterPage.jsx new file mode 100644 index 0000000..8a0383a --- /dev/null +++ b/src/pages/RegisterPage.jsx @@ -0,0 +1,68 @@ +import React, { useState } from 'react'; +import { Link, useNavigate } from 'react-router-dom'; // Import useNavigate +import { useAuth } from '../contexts/authContext'; + +function RegisterPage() { + const [email, setEmail] = useState(''); + const [password, setPassword] = useState(''); + const [error, setError] = useState(''); + const { register } = useAuth(); + const navigate = useNavigate(); // Initialize useNavigate + + const handleRegister = async (e) => { + e.preventDefault(); + try { + await register(email, password); + navigate('/test'); // Redirect to the main page after registration + } catch (error) { + setError('This email is already registered. Please use a different email.'); + } + }; + + return ( +
+
+

Register

+ + {error &&

{error}

} + +
+
+ + setEmail(e.target.value)} + required + /> +
+ +
+ + setPassword(e.target.value)} + required + /> +
+ + +
+ +
+

+ Already have an account?{' '} + Login here +

+
+
+
+ ); +} + +export default RegisterPage; From 0088c14edb4be6daa7e43392bc2b7aefbb43461b Mon Sep 17 00:00:00 2001 From: Alan Roybal Date: Tue, 5 Nov 2024 15:39:39 -0600 Subject: [PATCH 03/12] i gave her auth to route on me til i navigate --- src/components/PrivateRoute.jsx | 6 +++--- src/contexts/authContext.jsx | 4 ++-- src/pages/LoginPage.jsx | 10 +++++----- src/pages/RegisterPage.jsx | 6 +++--- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/components/PrivateRoute.jsx b/src/components/PrivateRoute.jsx index a7194f2..4964327 100644 --- a/src/components/PrivateRoute.jsx +++ b/src/components/PrivateRoute.jsx @@ -3,11 +3,11 @@ import { Navigate } from 'react-router-dom'; import { useAuth } from '../contexts/authContext'; function PrivateRoute({ children }) { - const { userLoggedIn } = useAuth(); + const { user } = useAuth(); // Check if the user is logged in // Redirect to LandingPage if not logged in - if (!userLoggedIn) { - return ; + if (!user) { + return ; // Correct redirect for non-logged-in users } // Otherwise, render the child components diff --git a/src/contexts/authContext.jsx b/src/contexts/authContext.jsx index 3778e08..04e4bac 100644 --- a/src/contexts/authContext.jsx +++ b/src/contexts/authContext.jsx @@ -11,10 +11,10 @@ export const AuthProvider = ({ children }) => { useEffect(() => { const unsubscribe = onAuthStateChanged(auth, (user) => { - setUser(user); + setUser(user); // Ensure 'user' state is updated }); return unsubscribe; - }, []); +}, []); const login = (email, password) => signInWithEmailAndPassword(auth, email, password); const register = (email, password) => createUserWithEmailAndPassword(auth, email, password); diff --git a/src/pages/LoginPage.jsx b/src/pages/LoginPage.jsx index 875e2ff..1ff9867 100644 --- a/src/pages/LoginPage.jsx +++ b/src/pages/LoginPage.jsx @@ -3,23 +3,23 @@ import { Link, useNavigate } from 'react-router-dom'; import { useAuth } from '../contexts/authContext'; function LoginPage() { - const { userLoggedIn, login } = useAuth(); + const { user, login } = useAuth(); // Use 'user' instead of 'userLoggedIn' const navigate = useNavigate(); const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const [error, setError] = useState(''); useEffect(() => { - if (userLoggedIn) { - navigate('/home'); // Redirect to home if already logged in + if (user) { // Check if a user is logged in + navigate('/home'); // Redirect to home if logged in } - }, [userLoggedIn, navigate]); + }, [user, navigate]); // 'user' state triggers navigation to /home const handleSubmit = async (e) => { e.preventDefault(); try { await login(email, password); - navigate('/home'); // Redirect to home after login + navigate('/home'); // Ensure you navigate to '/home' after login } catch (error) { setError('Invalid credentials, please try again.'); } diff --git a/src/pages/RegisterPage.jsx b/src/pages/RegisterPage.jsx index 8a0383a..29daa3e 100644 --- a/src/pages/RegisterPage.jsx +++ b/src/pages/RegisterPage.jsx @@ -1,5 +1,5 @@ import React, { useState } from 'react'; -import { Link, useNavigate } from 'react-router-dom'; // Import useNavigate +import { Link, useNavigate } from 'react-router-dom'; import { useAuth } from '../contexts/authContext'; function RegisterPage() { @@ -7,13 +7,13 @@ function RegisterPage() { const [password, setPassword] = useState(''); const [error, setError] = useState(''); const { register } = useAuth(); - const navigate = useNavigate(); // Initialize useNavigate + const navigate = useNavigate(); const handleRegister = async (e) => { e.preventDefault(); try { await register(email, password); - navigate('/test'); // Redirect to the main page after registration + navigate('/home'); // Redirect to home after registration } catch (error) { setError('This email is already registered. Please use a different email.'); } From 7b46e7974f884fed03dd06f0a36755f9e9c4a035 Mon Sep 17 00:00:00 2001 From: Alan Roybal Date: Tue, 5 Nov 2024 16:22:45 -0600 Subject: [PATCH 04/12] firestore added --- src/components/Dashboard.jsx | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/src/components/Dashboard.jsx b/src/components/Dashboard.jsx index 60e6f26..4654b9b 100644 --- a/src/components/Dashboard.jsx +++ b/src/components/Dashboard.jsx @@ -1,10 +1,26 @@ -import { useState } from 'react'; -import data from '../data/data.json'; +import { useState, useEffect } from 'react'; +import { collection, getDocs } from 'firebase/firestore'; +import { db } from '../firebase/firebase'; import Card from './Card'; function Dashboard() { - // State to store items, initialized with data from JSON file - const [items, setItems] = useState(data); + const [items, setItems] = useState([]); // Empty array to hold Firebase data + + // Function to fetch invitee data from Firestore + const fetchData = async () => { + try { + const querySnapshot = await getDocs(collection(db, "invitees")); + const dataArray = querySnapshot.docs.map(doc => doc.data()); + setItems(dataArray); // Set the state with the data from Firestore + } catch (error) { + console.error("Error fetching data: ", error); + } + }; + + // UseEffect to call fetchData when component loads + useEffect(() => { + fetchData(); + }, []); return (
@@ -24,7 +40,6 @@ function Dashboard() { key={index} name={item.name} img={item.img} - date={item.date} status={item.status} bringing={item.bringing} /> @@ -34,4 +49,4 @@ function Dashboard() { ); } -export default Dashboard; +export default Dashboard; \ No newline at end of file From c6db1553cc43261a9b4ca9961cca6b5055c7a322 Mon Sep 17 00:00:00 2001 From: Alan Roybal Date: Tue, 5 Nov 2024 17:31:19 -0600 Subject: [PATCH 05/12] get rid of unneeded files --- public/images/Arjun.webp | Bin 10854 -> 0 bytes public/images/Daniel.webp | Bin 8402 -> 0 bytes public/images/Evan.webp | Bin 11428 -> 0 bytes public/images/Joshua.webp | Bin 11002 -> 0 bytes public/images/Michael.webp | Bin 8488 -> 0 bytes public/images/Purva.webp | Bin 14956 -> 0 bytes public/images/Reiki.webp | Bin 17416 -> 0 bytes public/images/Salman.webp | Bin 7486 -> 0 bytes public/images/Veer.webp | Bin 9002 -> 0 bytes public/images/sample1.webp | Bin 10480 -> 0 bytes src/components/Login.jsx | 116 ------------------------------------ src/components/Register.jsx | 105 -------------------------------- src/data/data.json | 82 ------------------------- 13 files changed, 303 deletions(-) delete mode 100644 public/images/Arjun.webp delete mode 100644 public/images/Daniel.webp delete mode 100644 public/images/Evan.webp delete mode 100644 public/images/Joshua.webp delete mode 100644 public/images/Michael.webp delete mode 100644 public/images/Purva.webp delete mode 100644 public/images/Reiki.webp delete mode 100644 public/images/Salman.webp delete mode 100644 public/images/Veer.webp delete mode 100644 public/images/sample1.webp delete mode 100644 src/components/Login.jsx delete mode 100644 src/components/Register.jsx delete mode 100644 src/data/data.json diff --git a/public/images/Arjun.webp b/public/images/Arjun.webp deleted file mode 100644 index 98ad5226b9a6bc02296bb149fc0c2e1aadcad231..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10854 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 diff --git a/public/images/Joshua.webp b/public/images/Joshua.webp deleted file mode 100644 index 86c8b3e1effe4868a53fe2524db747af735543e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11002 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%0DGdY#rIg!fKAh+Hr2BQNB?7`j- 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 ^(^5+HSe~GH83YMX3jBY6+-F05KOb~Lhs&) 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 If7%BC09rTvL;wH) diff --git a/public/images/Salman.webp b/public/images/Salman.webp deleted file mode 100644 index d23e9ba14c6a7ec0bcf32a2e348bf93ab258ffa7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7486 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 IFIWHo0LJ-?X#fBK diff --git a/public/images/Veer.webp b/public/images/Veer.webp deleted file mode 100644 index ede6e1604f747d4e576a79cab988596771f1cbf2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9002 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 E0SLmc?EnA( diff --git a/public/images/sample1.webp b/public/images/sample1.webp deleted file mode 100644 index de32bcfb461e466707e27eb00db02d796a79f4e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10480 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 diff --git a/src/components/Login.jsx b/src/components/Login.jsx deleted file mode 100644 index 2de382d..0000000 --- a/src/components/Login.jsx +++ /dev/null @@ -1,116 +0,0 @@ -import React, { useState } from 'react' -import { Navigate, Link } from 'react-router-dom' -import { doSignInWithEmailAndPassword, doSignInWithGoogle } from '../firebase/auth' -import { useAuth } from '../contexts/authContext' - -const Login = () => { - const { userLoggedIn } = useAuth() - - const [email, setEmail] = useState('') - const [password, setPassword] = useState('') - const [isSigningIn, setIsSigningIn] = useState(false) - const [errorMessage, setErrorMessage] = useState('') - - const onSubmit = async (e) => { - e.preventDefault() - if(!isSigningIn) { - setIsSigningIn(true) - await doSignInWithEmailAndPassword(email, password) - // doSendEmailVerification() - } - } - - const onGoogleSignIn = (e) => { - e.preventDefault() - if (!isSigningIn) { - setIsSigningIn(true) - doSignInWithGoogle().catch(err => { - setIsSigningIn(false) - }) - } - } - - return ( -
- {userLoggedIn && ()} - -
-
-
-
-

Welcome Back

-
-
-
-
- - { setEmail(e.target.value) }} - className="w-full mt-2 px-3 py-2 text-gray-500 bg-transparent outline-none border focus:border-indigo-600 shadow-sm rounded-lg transition duration-300" - /> -
- - -
- - { setPassword(e.target.value) }} - className="w-full mt-2 px-3 py-2 text-gray-500 bg-transparent outline-none border focus:border-indigo-600 shadow-sm rounded-lg transition duration-300" - /> -
- - {errorMessage && ( - {errorMessage} - )} - - -
-

Don't have an account? Sign up

-
-
OR
-
- -
-
-
- ) -} - -export default Login \ No newline at end of file diff --git a/src/components/Register.jsx b/src/components/Register.jsx deleted file mode 100644 index 1dfeb40..0000000 --- a/src/components/Register.jsx +++ /dev/null @@ -1,105 +0,0 @@ -import React, { useState } from 'react' -import { Navigate, Link, useNavigate } from 'react-router-dom' -import { useAuth } from '../contexts/authContext' -import { doCreateUserWithEmailAndPassword } from '../firebase/auth' - -const Register = () => { - - const navigate = useNavigate() - - const [email, setEmail] = useState('') - const [password, setPassword] = useState('') - const [confirmPassword, setconfirmPassword] = useState('') - const [isRegistering, setIsRegistering] = useState(false) - const [errorMessage, setErrorMessage] = useState('') - - const { userLoggedIn } = useAuth() - - const onSubmit = async (e) => { - e.preventDefault() - if(!isRegistering) { - setIsRegistering(true) - await doCreateUserWithEmailAndPassword(email, password) - } - } - - return ( - <> - {userLoggedIn && ()} - -
-
-
-
-

Create a New Account

-
- -
-
-
- - { setEmail(e.target.value) }} - className="w-full mt-2 px-3 py-2 text-gray-500 bg-transparent outline-none border focus:indigo-600 shadow-sm rounded-lg transition duration-300" - /> -
- -
- - { setPassword(e.target.value) }} - className="w-full mt-2 px-3 py-2 text-gray-500 bg-transparent outline-none border focus:border-indigo-600 shadow-sm rounded-lg transition duration-300" - /> -
- -
- - { setconfirmPassword(e.target.value) }} - className="w-full mt-2 px-3 py-2 text-gray-500 bg-transparent outline-none border focus:border-indigo-600 shadow-sm rounded-lg transition duration-300" - /> -
- - {errorMessage && ( - {errorMessage} - )} - - -
- Already have an account? {' '} - Continue -
-
-
-
- - ) -} - -export default Register \ No newline at end of file diff --git a/src/data/data.json b/src/data/data.json deleted file mode 100644 index b3980fc..0000000 --- a/src/data/data.json +++ /dev/null @@ -1,82 +0,0 @@ -[ - { - "id": 0, - "name": "Alan Roybal", - "img": "/images/sample1.webp", - "bringing": "Pizza", - "status": "Going", - "date": 10 - }, - { - "id": 1, - "name": "Salman Jaher", - "img": "/images/Salman.webp", - "bringing": "N/A", - "status": "Can't Go", - "date": 2 - }, - { - "id": 2, - "name": "Purva Pawar", - "img": "/images/Purva.webp", - "bringing": "N/A", - "status": "Unsure", - "date": 4 - }, - { - "id": 3, - "name": "Joshua Das", - "img": "/images/Joshua.webp", - "bringing": "Chips", - "status": "Going", - "date": 2 - }, - { - "id": 4, - "name": "Reiki Hingorani", - "img": "/images/Reiki.webp", - "bringing": "Lemonade", - "status": "Going", - "date": 3 - }, - { - "id": 5, - "name": "Veer Shah", - "img": "/images/Veer.webp", - "bringing": "N/A", - "status": "Unsure", - "date": 6 - }, - { - "id": 6, - "name": "Arjun Kumar", - "img": "/images/Arjun.webp", - "bringing": "N/A", - "status": "Can't Go", - "date": 7 - }, - { - "id": 7, - "name": "Daniel Kim", - "img": "/images/Daniel.webp", - "bringing": "Honey Packs", - "status": "Going", - "date": 12 - }, - { - "id": 8, - "name": "Evan Ngo", - "img": "/images/Evan.webp", - "bringing": "N/A", - "status": "Can't Go", - "date": 8 - }, - { - "id": 9, - "name": "Michael Zhao", - "img": "/images/Michael.webp", - "bringing": "N/A", - "status": "Unsure", - "date": 2 - } -] From 455da91f94711f08087e653db65bbeffc6fc483d Mon Sep 17 00:00:00 2001 From: Alan Roybal Date: Tue, 5 Nov 2024 18:06:48 -0600 Subject: [PATCH 06/12] map page with api --- package-lock.json | 71 +++++++++++++++++++++++++++++++++++++-- package.json | 1 + src/components/Navbar.jsx | 2 +- src/pages/MapPage.jsx | 44 ++++++++++++++++++++++-- 4 files changed, 112 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9fcf694..043e69b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "devday", "version": "0.0.0", "dependencies": { + "@react-google-maps/api": "^2.20.3", "firebase": "^10.14.1", "firebaseui": "^6.1.0", "react": "^18.3.1", @@ -1339,6 +1340,20 @@ "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-1.0.1.tgz", "integrity": "sha512-jmEnr/pk0yVkA7mIlHNnxCi+wWzOFUg0WyIotgkKAb2u1J7fAeDBcVNSTjTihbAYNusCLQdW5s9IJ5qwnEufcQ==" }, + "node_modules/@googlemaps/js-api-loader": { + "version": "1.16.8", + "resolved": "https://registry.npmjs.org/@googlemaps/js-api-loader/-/js-api-loader-1.16.8.tgz", + "integrity": "sha512-CROqqwfKotdO6EBjZO/gQGVTbeDps5V7Mt9+8+5Q+jTg5CRMi3Ii/L9PmV3USROrt2uWxtGzJHORmByxyo9pSQ==" + }, + "node_modules/@googlemaps/markerclusterer": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/@googlemaps/markerclusterer/-/markerclusterer-2.5.3.tgz", + "integrity": "sha512-x7lX0R5yYOoiNectr10wLgCBasNcXFHiADIBdmn7jQllF2B5ENQw5XtZK+hIw4xnV0Df0xhN4LN98XqA5jaiOw==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "supercluster": "^8.0.1" + } + }, "node_modules/@grpc/grpc-js": { "version": "1.9.15", "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.15.tgz", @@ -1585,6 +1600,33 @@ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, + "node_modules/@react-google-maps/api": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/@react-google-maps/api/-/api-2.20.3.tgz", + "integrity": "sha512-ndXC8nZDPT78nCceZnftGSvA/iVhwx2XhlfEYaoUy2biGelhrE2vDzjyTuZhb4RV+bVYpd4LkIf3hzyxAFd+Qg==", + "dependencies": { + "@googlemaps/js-api-loader": "1.16.8", + "@googlemaps/markerclusterer": "2.5.3", + "@react-google-maps/infobox": "2.20.0", + "@react-google-maps/marker-clusterer": "2.20.0", + "@types/google.maps": "3.58.1", + "invariant": "2.2.4" + }, + "peerDependencies": { + "react": "^16.8 || ^17 || ^18", + "react-dom": "^16.8 || ^17 || ^18" + } + }, + "node_modules/@react-google-maps/infobox": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/@react-google-maps/infobox/-/infobox-2.20.0.tgz", + "integrity": "sha512-03PJHjohhaVLkX6+NHhlr8CIlvUxWaXhryqDjyaZ8iIqqix/nV8GFdz9O3m5OsjtxtNho09F/15j14yV0nuyLQ==" + }, + "node_modules/@react-google-maps/marker-clusterer": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/@react-google-maps/marker-clusterer/-/marker-clusterer-2.20.0.tgz", + "integrity": "sha512-tieX9Va5w1yP88vMgfH1pHTacDQ9TgDTjox3tLlisKDXRQWdjw+QeVVghhf5XqqIxXHgPdcGwBvKY6UP+SIvLw==" + }, "node_modules/@remix-run/router": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.20.0.tgz", @@ -1848,6 +1890,11 @@ "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", "dev": true }, + "node_modules/@types/google.maps": { + "version": "3.58.1", + "resolved": "https://registry.npmjs.org/@types/google.maps/-/google.maps-3.58.1.tgz", + "integrity": "sha512-X9QTSvGJ0nCfMzYOnaVs/k6/4L+7F5uCS+4iUmkLEls6J9S/Phv+m/i3mDeyc49ZBgwab3EFO1HEoBY7k98EGQ==" + }, "node_modules/@types/node": { "version": "22.7.9", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.9.tgz", @@ -3146,8 +3193,7 @@ "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { "version": "3.3.2", @@ -3691,6 +3737,14 @@ "node": ">= 0.4" } }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/is-array-buffer": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", @@ -4183,6 +4237,11 @@ "node": ">=4.0" } }, + "node_modules/kdbush": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-4.0.2.tgz", + "integrity": "sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==" + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -5595,6 +5654,14 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/supercluster": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-8.0.1.tgz", + "integrity": "sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ==", + "dependencies": { + "kdbush": "^4.0.2" + } + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", diff --git a/package.json b/package.json index a54db9d..fb1b0f5 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "preview": "vite preview" }, "dependencies": { + "@react-google-maps/api": "^2.20.3", "firebase": "^10.14.1", "firebaseui": "^6.1.0", "react": "^18.3.1", diff --git a/src/components/Navbar.jsx b/src/components/Navbar.jsx index 4bb2638..c81df66 100644 --- a/src/components/Navbar.jsx +++ b/src/components/Navbar.jsx @@ -9,7 +9,7 @@ function Navbar() { {/* Main navbar container */}
{/* TITLE */} - Ripple & Refresh + Ripple & Refresh {/* PAGES */}
diff --git a/src/pages/MapPage.jsx b/src/pages/MapPage.jsx index 4d0fd98..2224b9b 100644 --- a/src/pages/MapPage.jsx +++ b/src/pages/MapPage.jsx @@ -1,11 +1,49 @@ import React from 'react'; +import { GoogleMap, Marker, useJsApiLoader } from '@react-google-maps/api'; +import Navbar from '../components/Navbar'; + +const MapPage = () => { + const mapCenter = { lat: 40.7128, lng: -74.0060 }; + const mapStyles = { + height: "400px", + width: "100%", + }; + + const { isLoaded } = useJsApiLoader({ + googleMapsApiKey: "GOOGLE MAPS API KEY", + }); + + if (!isLoaded) return
Loading...
; -function MapPage() { return (
-

Map Page

+ +
+ {/* Navbar */} + + {/* TITLE */} +

Map Page

+
+ + {/* Glow Effects */} +
+
+ + {/* Map Section */} +
+
+ + + +
+
+
); -} +}; export default MapPage; From 081143b0a36f66572feebe26497618eaa0676544 Mon Sep 17 00:00:00 2001 From: Alan Roybal Date: Tue, 5 Nov 2024 19:21:18 -0600 Subject: [PATCH 07/12] map page styling --- src/pages/MapPage.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/MapPage.jsx b/src/pages/MapPage.jsx index 2224b9b..8ecf5b7 100644 --- a/src/pages/MapPage.jsx +++ b/src/pages/MapPage.jsx @@ -10,7 +10,7 @@ const MapPage = () => { }; const { isLoaded } = useJsApiLoader({ - googleMapsApiKey: "GOOGLE MAPS API KEY", + googleMapsApiKey: "AIzaSyCpJWCanaBIY1jqmEdyOSoWQVwaIVADjrw", }); if (!isLoaded) return
Loading...
; From 31e27022ded8146c71aebca388f9c971b1b11d74 Mon Sep 17 00:00:00 2001 From: Alan Roybal Date: Tue, 5 Nov 2024 19:49:34 -0600 Subject: [PATCH 08/12] i changed one word --- src/pages/MapPage.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/MapPage.jsx b/src/pages/MapPage.jsx index 8ecf5b7..99c6428 100644 --- a/src/pages/MapPage.jsx +++ b/src/pages/MapPage.jsx @@ -22,7 +22,7 @@ const MapPage = () => { {/* Navbar */} {/* TITLE */} -

Map Page

+

Where we at?


{/* Glow Effects */} From 29a34aeac90dc220a220fc22bccf46f9ca3348f4 Mon Sep 17 00:00:00 2001 From: Alan Roybal Date: Thu, 7 Nov 2024 18:36:48 -0600 Subject: [PATCH 09/12] activitypage done --- package-lock.json | 118 +++++++++++++++++++++++++++ package.json | 3 + src/components/VoteComponent.jsx | 120 ++++++++++++++++++++++++++++ src/components/WeatherComponent.jsx | 81 +++++++++++++++++++ src/pages/ActivityPage.jsx | 21 ++++- 5 files changed, 342 insertions(+), 1 deletion(-) create mode 100644 src/components/VoteComponent.jsx create mode 100644 src/components/WeatherComponent.jsx diff --git a/package-lock.json b/package-lock.json index 043e69b..d410005 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,9 +9,12 @@ "version": "0.0.0", "dependencies": { "@react-google-maps/api": "^2.20.3", + "axios": "^1.7.7", + "chart.js": "^4.4.6", "firebase": "^10.14.1", "firebaseui": "^6.1.0", "react": "^18.3.1", + "react-chartjs-2": "^5.2.0", "react-dom": "^18.3.1", "react-icons": "^5.3.0", "react-router-dom": "^6.27.0" @@ -1501,6 +1504,11 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@kurkle/color": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz", + "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==" + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -2165,6 +2173,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "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/autoprefixer": { "version": "10.4.20", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", @@ -2217,6 +2230,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/axios": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -2360,6 +2383,17 @@ "node": ">=4" } }, + "node_modules/chart.js": { + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.6.tgz", + "integrity": "sha512-8Y406zevUPbbIBA/HRk33khEmQPk5+cxeflWE/2rx1NJsjVWMPw/9mSP9rxHP5eqi6LNoPBVMfZHxbwLSgldYA==", + "dependencies": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": ">=8" + } + }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -2488,6 +2522,17 @@ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", @@ -2649,6 +2694,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/dialog-polyfill": { "version": "0.4.10", "resolved": "https://registry.npmjs.org/dialog-polyfill/-/dialog-polyfill-0.4.10.tgz", @@ -3361,6 +3414,25 @@ "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -3386,6 +3458,19 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fraction.js": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", @@ -4360,6 +4445,25 @@ "node": ">=8.6" } }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -5016,6 +5120,11 @@ "node": ">=12.0.0" } }, + "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/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -5056,6 +5165,15 @@ "node": ">=0.10.0" } }, + "node_modules/react-chartjs-2": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/react-chartjs-2/-/react-chartjs-2-5.2.0.tgz", + "integrity": "sha512-98iN5aguJyVSxp5U3CblRLH67J8gkfyGNbiK3c+l1QI/G4irHMPQw44aEPmjVag+YKTyQ260NcF82GTQ3bdscA==", + "peerDependencies": { + "chart.js": "^4.1.1", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/react-dom": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", diff --git a/package.json b/package.json index fb1b0f5..fdcf011 100644 --- a/package.json +++ b/package.json @@ -11,9 +11,12 @@ }, "dependencies": { "@react-google-maps/api": "^2.20.3", + "axios": "^1.7.7", + "chart.js": "^4.4.6", "firebase": "^10.14.1", "firebaseui": "^6.1.0", "react": "^18.3.1", + "react-chartjs-2": "^5.2.0", "react-dom": "^18.3.1", "react-icons": "^5.3.0", "react-router-dom": "^6.27.0" diff --git a/src/components/VoteComponent.jsx b/src/components/VoteComponent.jsx new file mode 100644 index 0000000..e2f8bc9 --- /dev/null +++ b/src/components/VoteComponent.jsx @@ -0,0 +1,120 @@ +import React, { useEffect, useState } from 'react'; +import { getFirestore, doc, updateDoc, setDoc, getDoc } from 'firebase/firestore'; +import { useAuth } from '../contexts/authContext'; +import { Bar } from 'react-chartjs-2'; +import { + Chart as ChartJS, + CategoryScale, + LinearScale, + BarElement, + Title, + Tooltip, + Legend, +} from 'chart.js'; + +ChartJS.register(CategoryScale, LinearScale, BarElement, Title, Tooltip, Legend); + +function VoteComponent() { + const db = getFirestore(); + const [votes, setVotes] = useState({ activity1: 0, activity2: 0, activity3: 0 }); + const [userVote, setUserVote] = useState(null); + const { user } = useAuth(); + + useEffect(() => { + const fetchVotes = async () => { + const docRef = doc(db, 'votes', 'picnicActivities'); + const docSnap = await getDoc(docRef); + if (docSnap.exists()) { + setVotes(docSnap.data()); + } else { + await setDoc(docRef, { activity1: 0, activity2: 0, activity3: 0 }); + } + }; + + const fetchUserVote = async () => { + if (user) { + const userVoteRef = doc(db, 'userVotes', user.uid); + const userVoteSnap = await getDoc(userVoteRef); + if (userVoteSnap.exists()) { + setUserVote(userVoteSnap.data().vote); + } + } + }; + + fetchVotes(); + fetchUserVote(); + }, [user]); + + const handleVote = async (activity) => { + if (!user || userVote === activity) return; + + const docRef = doc(db, 'votes', 'picnicActivities'); + const userVoteRef = doc(db, 'userVotes', user.uid); + + if (userVote) { + await updateDoc(docRef, { [userVote]: votes[userVote] - 1 }); + } + + await updateDoc(docRef, { [activity]: votes[activity] + 1 }); + await setDoc(userVoteRef, { vote: activity }); + + setUserVote(activity); + setVotes((prevVotes) => ({ + ...prevVotes, + [userVote]: userVote && userVote !== activity ? prevVotes[userVote] - 1 : prevVotes[userVote], + [activity]: prevVotes[activity] + 1, + })); + }; + + const data = { + labels: ['Activity 1', 'Activity 2', 'Activity 3'], + datasets: [ + { + label: 'Votes', + data: [votes.activity1, votes.activity2, votes.activity3], + backgroundColor: ['rgba(75,192,192,0.4)', 'rgba(153,102,255,0.4)', 'rgba(255,159,64,0.4)'], + borderColor: ['rgba(75,192,192,1)', 'rgba(153,102,255,1)', 'rgba(255,159,64,1)'], + borderWidth: 1, + }, + ], + }; + + return ( +
+

Vote for an Activity

+
+ + + +
+ + {userVote &&

You have voted for {userVote.replace('activity', 'Activity ')}.

} +
+ ); +} + +export default VoteComponent; diff --git a/src/components/WeatherComponent.jsx b/src/components/WeatherComponent.jsx new file mode 100644 index 0000000..a4da3b2 --- /dev/null +++ b/src/components/WeatherComponent.jsx @@ -0,0 +1,81 @@ +import React, { useState, useEffect } from 'react'; +import { getFirestore, doc, getDoc, updateDoc } from 'firebase/firestore'; +import axios from 'axios'; + +function WeatherComponent() { + const db = getFirestore(); + const [weather, setWeather] = useState(null); + const [date, setDate] = useState(''); + + useEffect(() => { + const fetchDate = async () => { + const dateDoc = await getDoc(doc(db, 'settings', 'picnicDate')); + if (dateDoc.exists()) { + const savedDate = dateDoc.data().date; + setDate(savedDate); + fetchWeather(savedDate); + } else { + console.log("No date found in Firestore."); + } + }; + fetchDate(); + }, [db]); + + const fetchWeather = async (selectedDate) => { + try { + const response = await axios.get(`https://api.weatherapi.com/v1/forecast.json`, { + params: { + key: '736f7b72cf89470dae4195414240611', + q: 'location', + dt: selectedDate, + }, + }); + setWeather(response.data.forecast.forecastday[0].day); + } catch (error) { + console.error("Error fetching weather:", error); + } + }; + + const handleDateChange = (e) => { + setDate(e.target.value); + }; + + const handleDateUpdate = async () => { + try { + await updateDoc(doc(db, 'settings', 'picnicDate'), { date }); + fetchWeather(date); + console.log("Date updated successfully in Firestore."); + } catch (error) { + console.error("Error updating date:", error); + } + }; + + return ( +
+

Weather Forecast

+ + + {weather && ( +
+

Temperature: {weather.avgtemp_f}°F

+

Condition: {weather.condition.text}

+
+ )} +
+ ); +} + +export default WeatherComponent; diff --git a/src/pages/ActivityPage.jsx b/src/pages/ActivityPage.jsx index c9f6f2d..39d2623 100644 --- a/src/pages/ActivityPage.jsx +++ b/src/pages/ActivityPage.jsx @@ -1,9 +1,28 @@ +// ActivityPage.jsx import React from 'react'; +import VoteComponent from '../components/VoteComponent'; +import WeatherComponent from '../components/WeatherComponent'; +import Navbar from '../components/Navbar'; function ActivityPage() { return (
-

Activity Page

+ +
+ {/* TITLE */} +

Activity Voting & Weather

+
+ + {/* Glow Effects */} +
+
+ + {/* Center Card for Vote and Weather */} +
+ + +
+
); } From 9e2bd0e8769aa26580eaf6c987051f0057b19f07 Mon Sep 17 00:00:00 2001 From: Alan Roybal Date: Thu, 7 Nov 2024 18:39:00 -0600 Subject: [PATCH 10/12] fixed navbar and put firebase file --- .gitignore | 3 --- src/App.jsx | 2 -- src/components/Navbar.jsx | 3 --- src/firebase/firebase.js | 21 +++++++++++++++++++++ src/pages/RSVPPage.jsx | 11 ----------- 5 files changed, 21 insertions(+), 19 deletions(-) create mode 100644 src/firebase/firebase.js delete mode 100644 src/pages/RSVPPage.jsx diff --git a/.gitignore b/.gitignore index b54f062..a547bf3 100644 --- a/.gitignore +++ b/.gitignore @@ -7,9 +7,6 @@ yarn-error.log* pnpm-debug.log* lerna-debug.log* -firebase -.firebase.js - node_modules dist dist-ssr diff --git a/src/App.jsx b/src/App.jsx index 10f2adb..449e8d4 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -3,7 +3,6 @@ import Navbar from './components/Navbar'; import FeaturedItem from './components/FeaturedItem'; import Dashboard from './components/Dashboard'; import ActivityPage from './pages/ActivityPage'; -import RSVPPage from './pages/RSVPPage'; import MapPage from './pages/MapPage'; import LoginPage from './pages/LoginPage'; import RegisterPage from './pages/RegisterPage'; @@ -33,7 +32,6 @@ function App() { } /> } /> - } /> } /> {/* Public Routes */} diff --git a/src/components/Navbar.jsx b/src/components/Navbar.jsx index c81df66..9c8a66b 100644 --- a/src/components/Navbar.jsx +++ b/src/components/Navbar.jsx @@ -16,9 +16,6 @@ function Navbar() { map - - rsvp - activity diff --git a/src/firebase/firebase.js b/src/firebase/firebase.js new file mode 100644 index 0000000..7498be8 --- /dev/null +++ b/src/firebase/firebase.js @@ -0,0 +1,21 @@ +// Import the functions you need from the SDKs you need +import { initializeApp } from "firebase/app"; +import { getAuth } from "firebase/auth"; +import { getFirestore } from 'firebase/firestore'; +// TODO: Add SDKs for Firebase products that you want to use +// https://firebase.google.com/docs/web/setup#available-libraries + +// Your web app's Firebase configuration +const firebaseConfig = { + YOUR STUFF HERE +}; + +// Initialize Firebase +const app = initializeApp(firebaseConfig); + +// Initialize Firebase Authentication and get a reference to the service +const auth = getAuth(app); + +const db = getFirestore(app); + +export { app, auth, db }; \ No newline at end of file diff --git a/src/pages/RSVPPage.jsx b/src/pages/RSVPPage.jsx deleted file mode 100644 index 284eee9..0000000 --- a/src/pages/RSVPPage.jsx +++ /dev/null @@ -1,11 +0,0 @@ -import React from 'react'; - -function RSVPPage() { - return ( -
-

RSVP Page

-
- ); -} - -export default RSVPPage; From ed45cb645bf00816a104befacdcb2c3b1ba2dc5b Mon Sep 17 00:00:00 2001 From: Alan Roybal Date: Mon, 11 Nov 2024 14:58:50 -0600 Subject: [PATCH 11/12] remove styling --- src/components/Card.jsx | 12 ++++++------ src/components/Dashboard.jsx | 8 ++------ src/components/FeaturedItem.jsx | 22 +++++++++------------- src/components/Navbar.jsx | 20 +++++++------------- src/components/VoteComponent.jsx | 27 ++++++++++++--------------- src/components/WeatherComponent.jsx | 8 ++++---- src/firebase/firebase.js | 7 ++++++- src/pages/ActivityPage.jsx | 10 +++------- src/pages/LandingPage.jsx | 8 ++++---- src/pages/LoginPage.jsx | 16 ++++++++-------- src/pages/MapPage.jsx | 14 +++++--------- src/pages/RegisterPage.jsx | 22 +++++++++++----------- tailwind.config.js | 5 ----- 13 files changed, 77 insertions(+), 102 deletions(-) diff --git a/src/components/Card.jsx b/src/components/Card.jsx index 6dde648..6653427 100644 --- a/src/components/Card.jsx +++ b/src/components/Card.jsx @@ -4,28 +4,28 @@ function Card(props) { return (
{/* Card Container with a Gradient Border */} -
+
{/* Inner Box */} -
+
{/* Image */} {/* Text Content */}
{/* Title */} -

{props.name}

+

{props.name}

-
+

Bringing: {props.bringing}

{/* Status */}
{/* Status */} -

+

{props.status}

diff --git a/src/components/Dashboard.jsx b/src/components/Dashboard.jsx index 4654b9b..ca5a51e 100644 --- a/src/components/Dashboard.jsx +++ b/src/components/Dashboard.jsx @@ -25,12 +25,8 @@ function Dashboard() { return (
{/* TITLE */} -

Who's Invited?

-
- - {/* Glow Effects */} -
-
+

Who's Invited?

+
{/* Event List Grid */}
diff --git a/src/components/FeaturedItem.jsx b/src/components/FeaturedItem.jsx index 9c16e07..bfbbccb 100644 --- a/src/components/FeaturedItem.jsx +++ b/src/components/FeaturedItem.jsx @@ -4,17 +4,17 @@ function FeaturedItem() { return (
{/* TITLE */} -

Your Picnic

-
+

Your Picnic

+
{/* BOX */} -
+
{/* Inner White Box with Shadow */} -
+
{/* Location Image with Hover Effect */} Used Bike @@ -22,19 +22,19 @@ function FeaturedItem() { {/* TEXT */}
{/* Location Title */} -

Lake Texarkana

+

Lake Texarkana

{/* RSVP Details */} -

+

4 Going | 3 Unsure

{/* Picnic Description */} -

+

Time for a day of relaxation on the lake. Bring a floatie and a swimsuit!

{/* RSVP Status */}
-

+

Going

@@ -42,10 +42,6 @@ function FeaturedItem() {
- - {/* Floating Glow Effect */} -
-
); } diff --git a/src/components/Navbar.jsx b/src/components/Navbar.jsx index 9c8a66b..2d36218 100644 --- a/src/components/Navbar.jsx +++ b/src/components/Navbar.jsx @@ -7,32 +7,26 @@ function Navbar() { return (
{/* Main navbar container */} -
+
{/* TITLE */} - Ripple & Refresh + Ripple & Refresh {/* PAGES */} -
- +
+ map - + activity
{/* ICONS */} -
- {/* - - - - - */ } +
{/* Horizontal line separator */} -
+
); } diff --git a/src/components/VoteComponent.jsx b/src/components/VoteComponent.jsx index e2f8bc9..48f0410 100644 --- a/src/components/VoteComponent.jsx +++ b/src/components/VoteComponent.jsx @@ -72,47 +72,44 @@ function VoteComponent() { { label: 'Votes', data: [votes.activity1, votes.activity2, votes.activity3], - backgroundColor: ['rgba(75,192,192,0.4)', 'rgba(153,102,255,0.4)', 'rgba(255,159,64,0.4)'], - borderColor: ['rgba(75,192,192,1)', 'rgba(153,102,255,1)', 'rgba(255,159,64,1)'], - borderWidth: 1, }, ], }; return ( -
-

Vote for an Activity

+
+

Vote for an Activity

- {userVote &&

You have voted for {userVote.replace('activity', 'Activity ')}.

} + {userVote &&

You have voted for {userVote.replace('activity', 'Activity ')}.

}
); } diff --git a/src/components/WeatherComponent.jsx b/src/components/WeatherComponent.jsx index a4da3b2..e19d7b4 100644 --- a/src/components/WeatherComponent.jsx +++ b/src/components/WeatherComponent.jsx @@ -51,20 +51,20 @@ function WeatherComponent() { }; return ( -
-

Weather Forecast

+
+

Weather Forecast

diff --git a/src/firebase/firebase.js b/src/firebase/firebase.js index 7498be8..69b4049 100644 --- a/src/firebase/firebase.js +++ b/src/firebase/firebase.js @@ -7,7 +7,12 @@ import { getFirestore } from 'firebase/firestore'; // Your web app's Firebase configuration const firebaseConfig = { - YOUR STUFF HERE + apiKey: "AIzaSyBCbR78em9ht-AI_tlia9t7YauZr3ei-3w", + authDomain: "ultra-beginner.firebaseapp.com", + projectId: "ultra-beginner", + storageBucket: "ultra-beginner.appspot.com", + messagingSenderId: "301389393222", + appId: "1:301389393222:web:e37c68d575a48d5fefc947" }; // Initialize Firebase diff --git a/src/pages/ActivityPage.jsx b/src/pages/ActivityPage.jsx index 39d2623..305d873 100644 --- a/src/pages/ActivityPage.jsx +++ b/src/pages/ActivityPage.jsx @@ -10,15 +10,11 @@ function ActivityPage() {
{/* TITLE */} -

Activity Voting & Weather

-
- - {/* Glow Effects */} -
-
+

Activity Voting & Weather

+
{/* Center Card for Vote and Weather */} -
+
diff --git a/src/pages/LandingPage.jsx b/src/pages/LandingPage.jsx index e40b87b..b8735ad 100644 --- a/src/pages/LandingPage.jsx +++ b/src/pages/LandingPage.jsx @@ -3,14 +3,14 @@ import { Link } from 'react-router-dom'; function LandingPage() { return ( -
-

Welcome to Ripple & Refresh

+
+

Welcome to Ripple & Refresh

Please log in or register to continue

- + Login - + Register
diff --git a/src/pages/LoginPage.jsx b/src/pages/LoginPage.jsx index 1ff9867..aded87c 100644 --- a/src/pages/LoginPage.jsx +++ b/src/pages/LoginPage.jsx @@ -26,16 +26,16 @@ function LoginPage() { }; return ( -
-
-

Login

- {error &&

{error}

} +
+ +

Login

+ {error &&

{error}

} setEmail(e.target.value)} - className="border p-2 mt-2 w-full" + className="p-2 mt-2 w-full" required /> setPassword(e.target.value)} - className="border p-2 mt-2 w-full" + className="p-2 mt-2 w-full" required /> - +

- Don't have an account? Register + Don't have an account? Register

diff --git a/src/pages/MapPage.jsx b/src/pages/MapPage.jsx index 99c6428..04d7002 100644 --- a/src/pages/MapPage.jsx +++ b/src/pages/MapPage.jsx @@ -10,7 +10,7 @@ const MapPage = () => { }; const { isLoaded } = useJsApiLoader({ - googleMapsApiKey: "AIzaSyCpJWCanaBIY1jqmEdyOSoWQVwaIVADjrw", + googleMapsApiKey: "GOOGLE_API_KEY", }); if (!isLoaded) return
Loading...
; @@ -22,16 +22,12 @@ const MapPage = () => { {/* Navbar */} {/* TITLE */} -

Where we at?

-
- - {/* Glow Effects */} -
-
+

Where we at?

+
{/* Map Section */} -
-
+
+
-
-

Register

+
+
+

Register

- {error &&

{error}

} + {error &&

{error}

}
- + setEmail(e.target.value)} required @@ -40,24 +40,24 @@ function RegisterPage() {
- + setPassword(e.target.value)} required />
- +
-

+

Already have an account?{' '} - Login here + Login here

diff --git a/tailwind.config.js b/tailwind.config.js index 2e86a01..0a81768 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -4,11 +4,6 @@ export default { theme: { extend: { colors: { - pastelblue: '#A1CAF1', - pastelgreen: '#B0E57C', - pastelpink: '#FDC1C5', - darkgreen: '#355E3B', - darkblue: '#003366', }, }, }, From 9f262f06a8c99772de1ffffffa591fcaf7161a71 Mon Sep 17 00:00:00 2001 From: Alan Roybal Date: Thu, 14 Nov 2024 18:32:00 -0600 Subject: [PATCH 12/12] add virebase --- src/firebase/firebase.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/firebase/firebase.js b/src/firebase/firebase.js index 69b4049..98a65ca 100644 --- a/src/firebase/firebase.js +++ b/src/firebase/firebase.js @@ -7,12 +7,12 @@ import { getFirestore } from 'firebase/firestore'; // Your web app's Firebase configuration const firebaseConfig = { - apiKey: "AIzaSyBCbR78em9ht-AI_tlia9t7YauZr3ei-3w", - authDomain: "ultra-beginner.firebaseapp.com", - projectId: "ultra-beginner", - storageBucket: "ultra-beginner.appspot.com", - messagingSenderId: "301389393222", - appId: "1:301389393222:web:e37c68d575a48d5fefc947" + apiKey: "YOUR STUFF", + authDomain: "YOUR STUFF", + projectId: "YOUR STUFF", + storageBucket: "YOUR STUFF", + messagingSenderId: "YOUR STUFF", + appId: "YOUR STUFF" }; // Initialize Firebase