From 4c5261b39071b85cbb9545d0ce0d21916abd072e Mon Sep 17 00:00:00 2001 From: Arunima Dutta Date: Thu, 4 Jul 2024 10:57:45 +0530 Subject: [PATCH 1/3] Added Search bar and filters --- src/components/EventDetails/EventDetails.css | 8 +- src/components/EventDetails/EventDetails.tsx | 124 ++++--------------- src/components/Events/Events.css | 26 ++++ src/components/Events/Events.tsx | 117 +++++++++++++++++ src/firebaseConf.ts | 17 +-- src/utils/searchEvents.ts | 18 +++ 6 files changed, 197 insertions(+), 113 deletions(-) create mode 100644 src/components/Events/Events.css create mode 100644 src/components/Events/Events.tsx create mode 100644 src/utils/searchEvents.ts diff --git a/src/components/EventDetails/EventDetails.css b/src/components/EventDetails/EventDetails.css index 12637d9..3e1c846 100644 --- a/src/components/EventDetails/EventDetails.css +++ b/src/components/EventDetails/EventDetails.css @@ -9,22 +9,20 @@ .card-image { pointer-events: none; border-radius: 10px 10px 10px 10px; - /* height: 450px; */ object-fit: cover; } @media (min-width: 1024px) { - .card_image { + .card-image { height: 450px; } } @media (min-width: 768px) { - .card_image { + .card-image { height: 200px; } } - @media (max-width: 767px) { - .card_image { + .card-image { height: 150px; } } diff --git a/src/components/EventDetails/EventDetails.tsx b/src/components/EventDetails/EventDetails.tsx index e0104ae..588dde3 100644 --- a/src/components/EventDetails/EventDetails.tsx +++ b/src/components/EventDetails/EventDetails.tsx @@ -1,31 +1,18 @@ import React, { useEffect, useState } from "react"; -import { - Container, - Row, - Col, - Button, - Badge, - Card, - FormControl, - InputGroup, - Spinner, -} from "react-bootstrap"; -import { Image as BootstrapImage } from "react-bootstrap"; -import "./EventDetails.css"; -import bannerImage from "../image_assets/bannerImage.png"; -import { Link, useParams } from "react-router-dom"; +import { Container, Row, Col, Button, Card, FormControl, InputGroup, Spinner } from "react-bootstrap"; +import { useParams } from "react-router-dom"; import { ref, get, update } from "firebase/database"; -import { Zoom, toast } from "react-toastify"; import { database } from "../../firebaseConf"; import PageTitle from "../../utils/PageTitle"; import moment from "moment"; +import "./EventDetails.css"; const EventDetails = () => { const { id } = useParams(); const userUid = localStorage.getItem("userUid"); const [isHost, setIsHost] = useState(false); const [isLoading, setIsLoading] = useState(true); - const [banner_Image, setBannerImage] = useState(bannerImage); + const [banner_Image, setBannerImage] = useState(""); const [title, setTitle] = useState(""); const [description, setDescription] = useState(""); const [tags, setTags] = useState([]); @@ -35,21 +22,17 @@ const EventDetails = () => { const [hostName, setHostName] = useState(""); const [lastEdited, setLastEdited] = useState(null); const [registeredUsers, setRegisteredUsers] = useState([]); - const [googleMeetLink, setGoogleMeetLink] = useState( - "Nothing yet, ask the host to add one" - ); + const [googleMeetLink, setGoogleMeetLink] = useState("Nothing yet, ask the host to add one"); useEffect(() => { - if (userUid == null) { + if (!userUid) { window.location.href = "#/dashboard"; - toast.warn("You are not signed in", { transition: Zoom }); } const fetchData = async () => { - const eventRef = ref(database, "events/" + id); + const eventRef = ref(database, `events/${id}`); const snapshot = await get(eventRef); if (snapshot.exists()) { const eventData = snapshot.val(); - setBannerImage(eventData.banner); setTitle(eventData.title); setDescription(eventData.description); @@ -65,35 +48,22 @@ const EventDetails = () => { } if (eventData.registrants) { setRegisteredUsers(eventData.registrants.split(",")); - - if ( - (!eventData.registrants.split(",").includes(userUid) || - userUid == null) && - userUid !== eventData.host - ) { + if (!eventData.registrants.split(",").includes(userUid) && userUid !== eventData.host) { window.location.href = "#/dashboard"; - toast.warn("You are not registered for this event", { - transition: Zoom, - }); } } if (eventData.googleMeetLink) { setGoogleMeetLink(eventData.googleMeetLink); } setIsLoading(false); - } else { - toast.error("Event not found", { transition: Zoom }); } }; fetchData(); }, [id, userUid]); const addMeetingLink = () => { - const eventRef = ref(database, "events/" + id); - update(eventRef, { - googleMeetLink: googleMeetLink, - }); - toast.success("Google Meet link added successfully", { transition: Zoom }); + const eventRef = ref(database, `events/${id}`); + update(eventRef, { googleMeetLink }); }; return ( @@ -101,12 +71,7 @@ const EventDetails = () => {
{isLoading ? ( -
+
) : ( @@ -114,34 +79,19 @@ const EventDetails = () => { - + {title} - - - + {date} - - - + {time} - Host:{" "} - - {hostName} - + Host: {hostName} @@ -150,9 +100,7 @@ const EventDetails = () => { {tags.map((tag, index) => ( - - {tag} - + {tag} ))} @@ -168,40 +116,16 @@ const EventDetails = () => {
{isHost ? ( - <> - - - Google Meet link : - - - setGoogleMeetLink(e.target.value) - } - /> - - - + + Google Meet link : + setGoogleMeetLink(e.target.value)} /> + + ) : ( - <> + Google Meet link :{" "} - {googleMeetLink === - "Nothing yet, ask the host to add one" ? ( - "Nothing yet, ask the host to add one" - ) : ( - - {googleMeetLink} - - )} - + {googleMeetLink === "Nothing yet, ask the host to add one" ? googleMeetLink : {googleMeetLink}} + )}
diff --git a/src/components/Events/Events.css b/src/components/Events/Events.css new file mode 100644 index 0000000..f74a4e3 --- /dev/null +++ b/src/components/Events/Events.css @@ -0,0 +1,26 @@ +.event-card { + border-radius: 10px; + position: relative; + overflow: hidden; + } + .event-card img { + height: 200px; + object-fit: cover; + } + .event-card-info { + display: flex; + justify-content: space-between; + margin-bottom: 10px; + } + .tag { + background-color: rgb(233, 255, 199) !important; + border-radius: 100px !important; + border: 1px solid green; + color: #555 !important; + transition: 200ms; + } + .tag:hover { + cursor: pointer; + background-color: rgb(201, 255, 121) !important; + } + \ No newline at end of file diff --git a/src/components/Events/Events.tsx b/src/components/Events/Events.tsx new file mode 100644 index 0000000..fe3a803 --- /dev/null +++ b/src/components/Events/Events.tsx @@ -0,0 +1,117 @@ +import React, { useEffect, useState } from "react"; +import { Container, InputGroup, FormControl, Button, Spinner, Pagination } from "react-bootstrap"; +import { getDatabase, ref, get } from "firebase/database"; +import PageTitle from "../../utils/PageTitle"; +import EventCard from "../Cards/EventCard/EventCard"; +import "./Events.css"; + +const Events: React.FC = () => { + const [eventCardsData, setEventCardsData] = useState([]); + const [isLoading, setIsLoading] = useState(true); + const [searchTags, setSearchTags] = useState(""); + const [searchDate, setSearchDate] = useState(""); + const [currentPage, setCurrentPage] = useState(1); + const itemsPerPage = 5; + const [totalPages, setTotalPages] = useState(1); + + useEffect(() => { + const fetchData = async () => { + const db = getDatabase(); + const eventsRef = ref(db, "events"); + const snapshot = await get(eventsRef); + if (snapshot.exists()) { + const eventsData = snapshot.val(); + const fetchedEvents = Object.keys(eventsData).map((key) => ({ + id: key, + ...eventsData[key], + })); + setEventCardsData(fetchedEvents); + setTotalPages(Math.ceil(fetchedEvents.length / itemsPerPage)); + } else { + console.log("No data available"); + } + setIsLoading(false); + }; + + fetchData(); + }, []); + + const handleSearch = async () => { + setIsLoading(true); + const db = getDatabase(); + const searchRef = ref(db, "events"); + const snapshot = await get(searchRef); + if (snapshot.exists()) { + const eventsData = snapshot.val(); + const filteredEvents = Object.keys(eventsData) + .map((key) => ({ id: key, ...eventsData[key] })) + .filter((event) => { + const matchesTags = !searchTags || event.tags.toLowerCase().includes(searchTags.toLowerCase()); + const matchesDate = !searchDate || event.date === searchDate; + return matchesTags && matchesDate; + }); + + setEventCardsData(filteredEvents); + setTotalPages(Math.ceil(filteredEvents.length / itemsPerPage)); + } + setIsLoading(false); + }; + + const handlePageChange = (pageNumber: number) => { + setCurrentPage(pageNumber); + }; + + return ( + <> + + + + setSearchTags(e.target.value)} + /> + setSearchDate(e.target.value)} + /> + + + +
+ {isLoading ? ( + + ) : ( +
+ {eventCardsData + .slice((currentPage - 1) * itemsPerPage, currentPage * itemsPerPage) + .map((event) => ( + + ))} + + handlePageChange(1)} disabled={currentPage === 1} /> + handlePageChange(currentPage - 1)} disabled={currentPage === 1} /> + {[...Array(totalPages).keys()].map((number) => ( + handlePageChange(number + 1)} + > + {number + 1} + + ))} + handlePageChange(currentPage + 1)} disabled={currentPage === totalPages} /> + handlePageChange(totalPages)} disabled={currentPage === totalPages} /> + +
+ )} +
+ + ); +}; + +export default Events; diff --git a/src/firebaseConf.ts b/src/firebaseConf.ts index 0aaafdc..309d0cb 100644 --- a/src/firebaseConf.ts +++ b/src/firebaseConf.ts @@ -1,23 +1,21 @@ +import { initializeApp } from "firebase/app"; import { GoogleAuthProvider, getAuth, signInWithPopup, signOut, } from "firebase/auth"; -import firebase from "firebase/compat/app"; -import "firebase/compat/auth"; -import "firebase/compat/database"; -import "firebase/storage"; import { getFirestore } from "firebase/firestore"; import { getDatabase } from "firebase/database"; import { getStorage } from "firebase/storage"; import { Zoom, toast } from "react-toastify"; const firebaseConfig = { - // firebase config + // Your firebase config }; -const app = firebase.initializeApp(firebaseConfig); +const app = initializeApp(firebaseConfig); + // Initialize Firebase authentication const auth = getAuth(app); @@ -32,11 +30,13 @@ const storage = getStorage(app); const provider = new GoogleAuthProvider(); -// whenever a user interacts with the provider, we force them to select an account +// Whenever a user interacts with the provider, we force them to select an account provider.setCustomParameters({ - prompt: "select_account ", + prompt: "select_account", }); + const signInWithGooglePopup = () => signInWithPopup(auth, provider); + const signOutUser = () => { signOut(auth) .then(() => { @@ -50,6 +50,7 @@ const signOutUser = () => { console.error(error); }); }; + export { auth, firestore, diff --git a/src/utils/searchEvents.ts b/src/utils/searchEvents.ts new file mode 100644 index 0000000..d4e8919 --- /dev/null +++ b/src/utils/searchEvents.ts @@ -0,0 +1,18 @@ +import { getDatabase, ref, get } from "firebase/database"; + +export const searchEvents = async (tags: string, date: string) => { + const db = getDatabase(); + const eventsRef = ref(db, "events"); + const snapshot = await get(eventsRef); + if (snapshot.exists()) { + const eventsData = snapshot.val(); + return Object.keys(eventsData) + .map((key) => ({ id: key, ...eventsData[key] })) + .filter((event) => { + const matchesTags = !tags || event.tags.toLowerCase().includes(tags.toLowerCase()); + const matchesDate = !date || event.date === date; + return matchesTags && matchesDate; + }); + } + return []; +}; From d9ce1d8a011a99329639057e4d2a70e893752ada Mon Sep 17 00:00:00 2001 From: Arunima Dutta Date: Thu, 4 Jul 2024 22:27:53 +0530 Subject: [PATCH 2/3] Updated --- package-lock.json | 412 +++++++++++++------------ package.json | 2 +- src/components/EventList/EventList.tsx | 103 ++++--- src/components/Events/EventCard.tsx | 43 +++ src/components/Events/Events.tsx | 50 ++- src/firebaseConf.ts | 9 +- 6 files changed, 378 insertions(+), 241 deletions(-) create mode 100644 src/components/Events/EventCard.tsx diff --git a/package-lock.json b/package-lock.json index 4e4b686..1815461 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,7 +23,7 @@ "bootstrap-icons": "^1.11.3", "cropperjs": "^1.6.2", "dompurify": "^3.1.5", - "firebase": "^10.12.2", + "firebase": "^10.12.3", "image-conversion": "^2.1.1", "install": "^0.13.0", "marked": "^13.0.1", @@ -2394,20 +2394,21 @@ }, "node_modules/@fastify/busboy": { "version": "2.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", "engines": { "node": ">=14" } }, "node_modules/@firebase/analytics": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.4.tgz", - "integrity": "sha512-OJEl/8Oye/k+vJ1zV/1L6eGpc1XzAj+WG2TPznJ7PszL7sOFLBXkL9IjHfOCGDGpXeO3btozy/cYUqv4zgNeHg==", + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.5.tgz", + "integrity": "sha512-d0X2ksTOKHMf5zFAMKFZWXa8hSbgohsG507xFsGhF4Uet2b8uEUL/YLrEth67jXEbGEi1UQZX4AaGBxKNiDzjw==", "dependencies": { - "@firebase/component": "0.6.7", - "@firebase/installations": "0.6.7", + "@firebase/component": "0.6.8", + "@firebase/installations": "0.6.8", "@firebase/logger": "0.4.2", - "@firebase/util": "1.9.6", + "@firebase/util": "1.9.7", "tslib": "^2.1.0" }, "peerDependencies": { @@ -2415,14 +2416,14 @@ } }, "node_modules/@firebase/analytics-compat": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.10.tgz", - "integrity": "sha512-ia68RcLQLLMFWrM10JfmFod7eJGwqr4/uyrtzHpTDnxGX/6gNCBTOuxdAbyWIqXI5XmcMQdz9hDijGKOHgDfPw==", + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.11.tgz", + "integrity": "sha512-wmXxJ49pEY7H549Pa4CDPOTzkPJnfG2Yolptg72ntTgSrbKVq+Eg9cAQY6Z5Kn9ATSQRX5oGXKlNfEk5DJBvvA==", "dependencies": { - "@firebase/analytics": "0.10.4", + "@firebase/analytics": "0.10.5", "@firebase/analytics-types": "0.8.2", - "@firebase/component": "0.6.7", - "@firebase/util": "1.9.6", + "@firebase/component": "0.6.8", + "@firebase/util": "1.9.7", "tslib": "^2.1.0" }, "peerDependencies": { @@ -2435,24 +2436,25 @@ "integrity": "sha512-EnzNNLh+9/sJsimsA/FGqzakmrAUKLeJvjRHlg8df1f97NLUlFidk9600y0ZgWOp3CAxn6Hjtk+08tixlUOWyw==" }, "node_modules/@firebase/app": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.10.5.tgz", - "integrity": "sha512-iY/fNot+hWPk9sTX8aHMqlcX9ynRvpGkskWAdUZ2eQQdLo8d1hSFYcYNwPv0Q/frGMasw8udKWMcFOEpC9fG8g==", + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.10.6.tgz", + "integrity": "sha512-/r8Ikp7TOrIIdp7v2adD2kg9SqIXMGOoJXJB1HsX7LjpjWdsoy1fMkP0HlI7GQqqRxDueHNhETx5Zn5E8HyVAQ==", "dependencies": { - "@firebase/component": "0.6.7", + "@firebase/component": "0.6.8", "@firebase/logger": "0.4.2", - "@firebase/util": "1.9.6", + "@firebase/util": "1.9.7", "idb": "7.1.1", "tslib": "^2.1.0" } }, "node_modules/@firebase/app-check": { - "version": "0.8.4", - "license": "Apache-2.0", + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.8.5.tgz", + "integrity": "sha512-WyIckkVYAfnzsPIw6EAt/qBUANkUAVl6irF0xuJ1R9ISNyUT1h7dPAwvs/g3rsx0fpBWaHRAH0IFiN6zO6yLqQ==", "dependencies": { - "@firebase/component": "0.6.7", + "@firebase/component": "0.6.8", "@firebase/logger": "0.4.2", - "@firebase/util": "1.9.6", + "@firebase/util": "1.9.7", "tslib": "^2.1.0" }, "peerDependencies": { @@ -2460,14 +2462,15 @@ } }, "node_modules/@firebase/app-check-compat": { - "version": "0.3.11", - "license": "Apache-2.0", + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.3.12.tgz", + "integrity": "sha512-p/5w3pMih3JVT6u7g04KXgSZr6HDsQXyeWZkIe0+r71dPOlcKyUooe9/feTc8BWpjha3rUOkqQ7+JXZObwvYoQ==", "dependencies": { - "@firebase/app-check": "0.8.4", + "@firebase/app-check": "0.8.5", "@firebase/app-check-types": "0.5.2", - "@firebase/component": "0.6.7", + "@firebase/component": "0.6.8", "@firebase/logger": "0.4.2", - "@firebase/util": "1.9.6", + "@firebase/util": "1.9.7", "tslib": "^2.1.0" }, "peerDependencies": { @@ -2476,37 +2479,40 @@ }, "node_modules/@firebase/app-check-interop-types": { "version": "0.3.2", - "license": "Apache-2.0" + "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", - "license": "Apache-2.0" + "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.35", - "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.35.tgz", - "integrity": "sha512-vgay/WRjeH0r97/Q6L6df2CMx7oyNFDsE5yPQ9oR1G+zx2eT0s8vNNh0WlKqQxUEWaOLRnXhQ8gy7uu0cBgTRg==", + "version": "0.2.36", + "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.36.tgz", + "integrity": "sha512-qsf+pllpgy1IGe2f5vfenOHSX8Cs58sVR5L6h/zBlNy9Yo54B2jy61KxLpSOgyRZb18IlnLLGjo7VtGU1CHvHA==", "dependencies": { - "@firebase/app": "0.10.5", - "@firebase/component": "0.6.7", + "@firebase/app": "0.10.6", + "@firebase/component": "0.6.8", "@firebase/logger": "0.4.2", - "@firebase/util": "1.9.6", + "@firebase/util": "1.9.7", "tslib": "^2.1.0" } }, "node_modules/@firebase/app-types": { "version": "0.9.2", - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.2.tgz", + "integrity": "sha512-oMEZ1TDlBz479lmABwWsWjzHwheQKiAgnuKxE0pz0IXCVx7/rtlkx1fQ6GfgK24WCrxDKMplZrT50Kh04iMbXQ==" }, "node_modules/@firebase/auth-compat": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.5.9.tgz", - "integrity": "sha512-RX8Zh/3zz2CsVbmYfgHkfUm4fAEPCl+KHVIImNygV5jTGDF6oKOhBIpf4Yigclyu8ESQKZ4elyN0MBYm9/7zGw==", + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.5.10.tgz", + "integrity": "sha512-epDhgNIXmhl9DPuTW9Ec5NDJJKMFIdXBXiQI9O0xNHveow/ETtBCY86srzF7iCacqsd30CcpLwwXlhk8Y19Olg==", "dependencies": { - "@firebase/auth": "1.7.4", + "@firebase/auth": "1.7.5", "@firebase/auth-types": "0.12.2", - "@firebase/component": "0.6.7", - "@firebase/util": "1.9.6", + "@firebase/component": "0.6.8", + "@firebase/util": "1.9.7", "tslib": "^2.1.0", "undici": "5.28.4" }, @@ -2515,13 +2521,13 @@ } }, "node_modules/@firebase/auth-compat/node_modules/@firebase/auth": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.7.4.tgz", - "integrity": "sha512-d2Fw17s5QesojwebrA903el20Li9/YGgkoOGJjagM4I1qAT36APa/FcZ+OX86KxbYKCtQKTMqraU8pxG7C2JWA==", + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.7.5.tgz", + "integrity": "sha512-DMFR1OA/f1/voeuFbSORg9AP36pMgOoSb/DRgiDalLmIJsDTlQNMCu+givjMP4s/XL85+tBk2MerYnK/AscJjw==", "dependencies": { - "@firebase/component": "0.6.7", + "@firebase/component": "0.6.8", "@firebase/logger": "0.4.2", - "@firebase/util": "1.9.6", + "@firebase/util": "1.9.7", "tslib": "^2.1.0", "undici": "5.28.4" }, @@ -2537,7 +2543,8 @@ }, "node_modules/@firebase/auth-interop-types": { "version": "0.2.3", - "license": "Apache-2.0" + "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", @@ -2549,55 +2556,59 @@ } }, "node_modules/@firebase/component": { - "version": "0.6.7", - "license": "Apache-2.0", + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.8.tgz", + "integrity": "sha512-LcNvxGLLGjBwB0dJUsBGCej2fqAepWyBubs4jt1Tiuns7QLbXHuyObZ4aMeBjZjWx4m8g1LoVI9QFpSaq/k4/g==", "dependencies": { - "@firebase/util": "1.9.6", + "@firebase/util": "1.9.7", "tslib": "^2.1.0" } }, "node_modules/@firebase/database": { - "version": "1.0.5", - "license": "Apache-2.0", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.6.tgz", + "integrity": "sha512-nrexUEG/fpVlHtWKkyfhTC3834kZ1WS7voNyqbBsBCqHXQOvznN5Z0L3nxBqdXSJyltNAf4ndFlQqm5gZiEczQ==", "dependencies": { "@firebase/app-check-interop-types": "0.3.2", "@firebase/auth-interop-types": "0.2.3", - "@firebase/component": "0.6.7", + "@firebase/component": "0.6.8", "@firebase/logger": "0.4.2", - "@firebase/util": "1.9.6", + "@firebase/util": "1.9.7", "faye-websocket": "0.11.4", "tslib": "^2.1.0" } }, "node_modules/@firebase/database-compat": { - "version": "1.0.5", - "license": "Apache-2.0", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-1.0.6.tgz", + "integrity": "sha512-1OGA0sLY47mkXjhICCrUTXEYFnSSXoiXWm1SHsN62b+Lzs5aKA3aWTjTUmYIoK93kDAMPkYpulSv8jcbH4Hwew==", "dependencies": { - "@firebase/component": "0.6.7", - "@firebase/database": "1.0.5", - "@firebase/database-types": "1.0.3", + "@firebase/component": "0.6.8", + "@firebase/database": "1.0.6", + "@firebase/database-types": "1.0.4", "@firebase/logger": "0.4.2", - "@firebase/util": "1.9.6", + "@firebase/util": "1.9.7", "tslib": "^2.1.0" } }, "node_modules/@firebase/database-types": { - "version": "1.0.3", - "license": "Apache-2.0", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.4.tgz", + "integrity": "sha512-mz9ZzbH6euFXbcBo+enuJ36I5dR5w+enJHHjy9Y5ThCdKUseqfDjW3vCp1YxE9zygFCSjJJ/z1cQ+zodvUcwPQ==", "dependencies": { "@firebase/app-types": "0.9.2", - "@firebase/util": "1.9.6" + "@firebase/util": "1.9.7" } }, "node_modules/@firebase/firestore": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.6.3.tgz", - "integrity": "sha512-d/+N2iUsiJ/Dc7fApdpdmmTXzwuTCromsdA1lKwYfZtMIOd1fI881NSLwK2wV4I38wkLnvfKJUV6WpU1f3/ONg==", + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.6.4.tgz", + "integrity": "sha512-vk2MoH5HxYEhiNg1l+yBXq1Fkhue/11bFg4HdlTv6BJHcTnnAj2a+/afPpatcW4MOdYA3Tv+d5nGzWbbOC1SHw==", "dependencies": { - "@firebase/component": "0.6.7", + "@firebase/component": "0.6.8", "@firebase/logger": "0.4.2", - "@firebase/util": "1.9.6", - "@firebase/webchannel-wrapper": "1.0.0", + "@firebase/util": "1.9.7", + "@firebase/webchannel-wrapper": "1.0.1", "@grpc/grpc-js": "~1.9.0", "@grpc/proto-loader": "^0.7.8", "tslib": "^2.1.0", @@ -2611,14 +2622,14 @@ } }, "node_modules/@firebase/firestore-compat": { - "version": "0.3.32", - "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.32.tgz", - "integrity": "sha512-at71mwK7a/mUXH0OgyY0+gUzedm/EUydDFYSFsBoO8DYowZ23Mgd6P4Rzq/Ll3zI/3xJN7LGe7Qp4iE/V/3Arg==", + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.33.tgz", + "integrity": "sha512-i42a2l31N95CwYEB7zmfK0FS1mrO6pwOLwxavCrwu1BCFrVVVQhUheTPIda/iGguK/2Nog0RaIR1bo7QkZEz3g==", "dependencies": { - "@firebase/component": "0.6.7", - "@firebase/firestore": "4.6.3", + "@firebase/component": "0.6.8", + "@firebase/firestore": "4.6.4", "@firebase/firestore-types": "3.0.2", - "@firebase/util": "1.9.6", + "@firebase/util": "1.9.7", "tslib": "^2.1.0" }, "peerDependencies": { @@ -2635,14 +2646,15 @@ } }, "node_modules/@firebase/functions": { - "version": "0.11.5", - "license": "Apache-2.0", + "version": "0.11.6", + "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.11.6.tgz", + "integrity": "sha512-GPfIBPtpwQvsC7SQbgaUjLTdja0CsNwMoKSgrzA1FGGRk4NX6qO7VQU6XCwBiAFWbpbQex6QWkSMsCzLx1uibQ==", "dependencies": { "@firebase/app-check-interop-types": "0.3.2", "@firebase/auth-interop-types": "0.2.3", - "@firebase/component": "0.6.7", + "@firebase/component": "0.6.8", "@firebase/messaging-interop-types": "0.2.2", - "@firebase/util": "1.9.6", + "@firebase/util": "1.9.7", "tslib": "^2.1.0", "undici": "5.28.4" }, @@ -2651,13 +2663,14 @@ } }, "node_modules/@firebase/functions-compat": { - "version": "0.3.11", - "license": "Apache-2.0", + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.12.tgz", + "integrity": "sha512-r3XUb5VlITWpML46JymfJPkK6I9j4SNlO7qWIXUc0TUmkv0oAfVoiIt1F83/NuMZXaGr4YWA/794nVSy4GV8tw==", "dependencies": { - "@firebase/component": "0.6.7", - "@firebase/functions": "0.11.5", + "@firebase/component": "0.6.8", + "@firebase/functions": "0.11.6", "@firebase/functions-types": "0.6.2", - "@firebase/util": "1.9.6", + "@firebase/util": "1.9.7", "tslib": "^2.1.0" }, "peerDependencies": { @@ -2666,14 +2679,16 @@ }, "node_modules/@firebase/functions-types": { "version": "0.6.2", - "license": "Apache-2.0" + "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.7", - "license": "Apache-2.0", + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.8.tgz", + "integrity": "sha512-57V374qdb2+wT5v7+ntpLXBjZkO6WRgmAUbVkRfFTM/4t980p0FesbqTAcOIiM8U866UeuuuF8lYH70D3jM/jQ==", "dependencies": { - "@firebase/component": "0.6.7", - "@firebase/util": "1.9.6", + "@firebase/component": "0.6.8", + "@firebase/util": "1.9.7", "idb": "7.1.1", "tslib": "^2.1.0" }, @@ -2682,13 +2697,14 @@ } }, "node_modules/@firebase/installations-compat": { - "version": "0.2.7", - "license": "Apache-2.0", + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.8.tgz", + "integrity": "sha512-pI2q8JFHB7yIq/szmhzGSWXtOvtzl6tCUmyykv5C8vvfOVJUH6mP4M4iwjbK8S1JotKd/K70+JWyYlxgQ0Kpyw==", "dependencies": { - "@firebase/component": "0.6.7", - "@firebase/installations": "0.6.7", + "@firebase/component": "0.6.8", + "@firebase/installations": "0.6.8", "@firebase/installations-types": "0.5.2", - "@firebase/util": "1.9.6", + "@firebase/util": "1.9.7", "tslib": "^2.1.0" }, "peerDependencies": { @@ -2697,26 +2713,29 @@ }, "node_modules/@firebase/installations-types": { "version": "0.5.2", - "license": "Apache-2.0", + "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", - "license": "Apache-2.0", + "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.9", - "license": "Apache-2.0", + "version": "0.12.10", + "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.10.tgz", + "integrity": "sha512-fGbxJPKpl2DIKNJGhbk4mYPcM+qE2gl91r6xPoiol/mN88F5Ym6UeRdMVZah+pijh9WxM55alTYwXuW40r1Y2Q==", "dependencies": { - "@firebase/component": "0.6.7", - "@firebase/installations": "0.6.7", + "@firebase/component": "0.6.8", + "@firebase/installations": "0.6.8", "@firebase/messaging-interop-types": "0.2.2", - "@firebase/util": "1.9.6", + "@firebase/util": "1.9.7", "idb": "7.1.1", "tslib": "^2.1.0" }, @@ -2725,12 +2744,13 @@ } }, "node_modules/@firebase/messaging-compat": { - "version": "0.2.9", - "license": "Apache-2.0", + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.10.tgz", + "integrity": "sha512-FXQm7rcowkDm8kFLduHV35IRYCRo+Ng0PIp/t1+EBuEbyplaKkGjZ932pE+owf/XR+G/60ku2QRBptRGLXZydg==", "dependencies": { - "@firebase/component": "0.6.7", - "@firebase/messaging": "0.12.9", - "@firebase/util": "1.9.6", + "@firebase/component": "0.6.8", + "@firebase/messaging": "0.12.10", + "@firebase/util": "1.9.7", "tslib": "^2.1.0" }, "peerDependencies": { @@ -2739,16 +2759,18 @@ }, "node_modules/@firebase/messaging-interop-types": { "version": "0.2.2", - "license": "Apache-2.0" + "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.7", - "license": "Apache-2.0", + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.6.8.tgz", + "integrity": "sha512-F+alziiIZ6Yn8FG47mxwljq+4XkgkT2uJIFRlkyViUQRLzrogaUJW6u/+6ZrePXnouKlKIwzqos3PVJraPEcCA==", "dependencies": { - "@firebase/component": "0.6.7", - "@firebase/installations": "0.6.7", + "@firebase/component": "0.6.8", + "@firebase/installations": "0.6.8", "@firebase/logger": "0.4.2", - "@firebase/util": "1.9.6", + "@firebase/util": "1.9.7", "tslib": "^2.1.0" }, "peerDependencies": { @@ -2756,14 +2778,15 @@ } }, "node_modules/@firebase/performance-compat": { - "version": "0.2.7", - "license": "Apache-2.0", + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.8.tgz", + "integrity": "sha512-o7TFClRVJd3VIBoY7KZQqtCeW0PC6v9uBzM6Lfw3Nc9D7hM6OonqecYvh7NwJ6R14k+xM27frLS4BcCvFHKw2A==", "dependencies": { - "@firebase/component": "0.6.7", + "@firebase/component": "0.6.8", "@firebase/logger": "0.4.2", - "@firebase/performance": "0.6.7", + "@firebase/performance": "0.6.8", "@firebase/performance-types": "0.2.2", - "@firebase/util": "1.9.6", + "@firebase/util": "1.9.7", "tslib": "^2.1.0" }, "peerDependencies": { @@ -2772,16 +2795,18 @@ }, "node_modules/@firebase/performance-types": { "version": "0.2.2", - "license": "Apache-2.0" + "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.7", - "license": "Apache-2.0", + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.4.8.tgz", + "integrity": "sha512-AMLqe6wfIRnjc6FkCWOSUjhc1fSTEf8o+cv1NolFvbiJ/tU+TqN4pI7pT+MIKQzNiq5fxLehkOx+xtAQBxPJKQ==", "dependencies": { - "@firebase/component": "0.6.7", - "@firebase/installations": "0.6.7", + "@firebase/component": "0.6.8", + "@firebase/installations": "0.6.8", "@firebase/logger": "0.4.2", - "@firebase/util": "1.9.6", + "@firebase/util": "1.9.7", "tslib": "^2.1.0" }, "peerDependencies": { @@ -2789,14 +2814,15 @@ } }, "node_modules/@firebase/remote-config-compat": { - "version": "0.2.7", - "license": "Apache-2.0", + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.8.tgz", + "integrity": "sha512-UxSFOp6dzFj2AHB8Bq/BYtbq5iFyizKx4Rd6WxAdaKYM8cnPMeK+l2v+Oogtjae+AeyHRI+MfL2acsfVe5cd2A==", "dependencies": { - "@firebase/component": "0.6.7", + "@firebase/component": "0.6.8", "@firebase/logger": "0.4.2", - "@firebase/remote-config": "0.4.7", + "@firebase/remote-config": "0.4.8", "@firebase/remote-config-types": "0.3.2", - "@firebase/util": "1.9.6", + "@firebase/util": "1.9.7", "tslib": "^2.1.0" }, "peerDependencies": { @@ -2805,14 +2831,16 @@ }, "node_modules/@firebase/remote-config-types": { "version": "0.3.2", - "license": "Apache-2.0" + "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.12.5", - "license": "Apache-2.0", + "version": "0.12.6", + "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.12.6.tgz", + "integrity": "sha512-Zgb9WuehJxzhj7pGXUvkAEaH+3HvLjD9xSZ9nepuXf5f8378xME7oGJtREr/RnepdDA5YW0XIxe0QQBNHpe1nw==", "dependencies": { - "@firebase/component": "0.6.7", - "@firebase/util": "1.9.6", + "@firebase/component": "0.6.8", + "@firebase/util": "1.9.7", "tslib": "^2.1.0", "undici": "5.28.4" }, @@ -2821,13 +2849,14 @@ } }, "node_modules/@firebase/storage-compat": { - "version": "0.3.8", - "license": "Apache-2.0", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.9.tgz", + "integrity": "sha512-WWgAp5bTW961oIsCc9+98m4MIVKpEqztAlIngfHfwO/x3DYoBPRl/awMRG3CAXyVxG+7B7oHC5IsnqM+vTwx2A==", "dependencies": { - "@firebase/component": "0.6.7", - "@firebase/storage": "0.12.5", + "@firebase/component": "0.6.8", + "@firebase/storage": "0.12.6", "@firebase/storage-types": "0.8.2", - "@firebase/util": "1.9.6", + "@firebase/util": "1.9.7", "tslib": "^2.1.0" }, "peerDependencies": { @@ -2836,28 +2865,30 @@ }, "node_modules/@firebase/storage-types": { "version": "0.8.2", - "license": "Apache-2.0", + "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.9.6", - "license": "Apache-2.0", + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.9.7.tgz", + "integrity": "sha512-fBVNH/8bRbYjqlbIhZ+lBtdAAS4WqZumx03K06/u7fJSpz1TGjEMm1ImvKD47w+xaFKIP2ori6z8BrbakRfjJA==", "dependencies": { "tslib": "^2.1.0" } }, "node_modules/@firebase/vertexai-preview": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/@firebase/vertexai-preview/-/vertexai-preview-0.0.2.tgz", - "integrity": "sha512-NOOL63kFQRq45ioi5P+hlqj/4LNmvn1URhGjQdvyV54c1Irvoq26aW861PRRLjrSMIeNeiLtCLD5pe+ediepAg==", + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@firebase/vertexai-preview/-/vertexai-preview-0.0.3.tgz", + "integrity": "sha512-KVtUWLp+ScgiwkDKAvNkVucAyhLVQp6C6lhnVEuIg4mWhWcS3oerjAeVhZT4uNofKwWxRsOaB2Yec7DMTXlQPQ==", "dependencies": { "@firebase/app-check-interop-types": "0.3.2", - "@firebase/component": "0.6.7", + "@firebase/component": "0.6.8", "@firebase/logger": "0.4.2", - "@firebase/util": "1.9.6", + "@firebase/util": "1.9.7", "tslib": "^2.1.0" }, "engines": { @@ -2869,9 +2900,9 @@ } }, "node_modules/@firebase/webchannel-wrapper": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-1.0.0.tgz", - "integrity": "sha512-zuWxyfXNbsKbm96HhXzainONPFqRcoZblQ++e9cAIGUuHfl2cFSBzW01jtesqWG/lqaUyX3H8O1y9oWboGNQBA==" + "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/@floating-ui/core": { "version": "1.6.1", @@ -9085,47 +9116,47 @@ } }, "node_modules/firebase": { - "version": "10.12.2", - "resolved": "https://registry.npmjs.org/firebase/-/firebase-10.12.2.tgz", - "integrity": "sha512-ZxEdtSvP1I9su1yf32D8TIdgxtPgxwr6z3jYAR1TXS/t+fVfpoPc/N1/N2bxOco9mNjUoc+od34v5Fn4GeKs6Q==", - "dependencies": { - "@firebase/analytics": "0.10.4", - "@firebase/analytics-compat": "0.2.10", - "@firebase/app": "0.10.5", - "@firebase/app-check": "0.8.4", - "@firebase/app-check-compat": "0.3.11", - "@firebase/app-compat": "0.2.35", + "version": "10.12.3", + "resolved": "https://registry.npmjs.org/firebase/-/firebase-10.12.3.tgz", + "integrity": "sha512-dO2cQ8eP6RnM2wcGzbxnoljjjMBf1suUrHYFftjSpbPn/8bEx959cwTRDHqBx3MwSzNsg6zZV/wiWydJPhUKgw==", + "dependencies": { + "@firebase/analytics": "0.10.5", + "@firebase/analytics-compat": "0.2.11", + "@firebase/app": "0.10.6", + "@firebase/app-check": "0.8.5", + "@firebase/app-check-compat": "0.3.12", + "@firebase/app-compat": "0.2.36", "@firebase/app-types": "0.9.2", - "@firebase/auth": "1.7.4", - "@firebase/auth-compat": "0.5.9", - "@firebase/database": "1.0.5", - "@firebase/database-compat": "1.0.5", - "@firebase/firestore": "4.6.3", - "@firebase/firestore-compat": "0.3.32", - "@firebase/functions": "0.11.5", - "@firebase/functions-compat": "0.3.11", - "@firebase/installations": "0.6.7", - "@firebase/installations-compat": "0.2.7", - "@firebase/messaging": "0.12.9", - "@firebase/messaging-compat": "0.2.9", - "@firebase/performance": "0.6.7", - "@firebase/performance-compat": "0.2.7", - "@firebase/remote-config": "0.4.7", - "@firebase/remote-config-compat": "0.2.7", - "@firebase/storage": "0.12.5", - "@firebase/storage-compat": "0.3.8", - "@firebase/util": "1.9.6", - "@firebase/vertexai-preview": "0.0.2" + "@firebase/auth": "1.7.5", + "@firebase/auth-compat": "0.5.10", + "@firebase/database": "1.0.6", + "@firebase/database-compat": "1.0.6", + "@firebase/firestore": "4.6.4", + "@firebase/firestore-compat": "0.3.33", + "@firebase/functions": "0.11.6", + "@firebase/functions-compat": "0.3.12", + "@firebase/installations": "0.6.8", + "@firebase/installations-compat": "0.2.8", + "@firebase/messaging": "0.12.10", + "@firebase/messaging-compat": "0.2.10", + "@firebase/performance": "0.6.8", + "@firebase/performance-compat": "0.2.8", + "@firebase/remote-config": "0.4.8", + "@firebase/remote-config-compat": "0.2.8", + "@firebase/storage": "0.12.6", + "@firebase/storage-compat": "0.3.9", + "@firebase/util": "1.9.7", + "@firebase/vertexai-preview": "0.0.3" } }, "node_modules/firebase/node_modules/@firebase/auth": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.7.4.tgz", - "integrity": "sha512-d2Fw17s5QesojwebrA903el20Li9/YGgkoOGJjagM4I1qAT36APa/FcZ+OX86KxbYKCtQKTMqraU8pxG7C2JWA==", + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.7.5.tgz", + "integrity": "sha512-DMFR1OA/f1/voeuFbSORg9AP36pMgOoSb/DRgiDalLmIJsDTlQNMCu+givjMP4s/XL85+tBk2MerYnK/AscJjw==", "dependencies": { - "@firebase/component": "0.6.7", + "@firebase/component": "0.6.8", "@firebase/logger": "0.4.2", - "@firebase/util": "1.9.6", + "@firebase/util": "1.9.7", "tslib": "^2.1.0", "undici": "5.28.4" }, @@ -18643,9 +18674,9 @@ } }, "node_modules/protobufjs": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.0.tgz", - "integrity": "sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.2.tgz", + "integrity": "sha512-RXyHaACeqXeqAKGLDl68rQKbmObRsTIn4TYVUUug1KfS47YWCo5MacGITEryugIgZqORCvJWEk4l449POg5Txg==", "hasInstallScript": true, "dependencies": { "@protobufjs/aspromise": "^1.1.2", @@ -21378,7 +21409,8 @@ }, "node_modules/undici": { "version": "5.28.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", + "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", "dependencies": { "@fastify/busboy": "^2.0.0" }, diff --git a/package.json b/package.json index 09eca39..2d68cfa 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "bootstrap-icons": "^1.11.3", "cropperjs": "^1.6.2", "dompurify": "^3.1.5", - "firebase": "^10.12.2", + "firebase": "^10.12.3", "image-conversion": "^2.1.1", "install": "^0.13.0", "marked": "^13.0.1", diff --git a/src/components/EventList/EventList.tsx b/src/components/EventList/EventList.tsx index 6644ded..2c50295 100644 --- a/src/components/EventList/EventList.tsx +++ b/src/components/EventList/EventList.tsx @@ -8,10 +8,8 @@ import { Button, } from "react-bootstrap"; import "./EventList.css"; -import { TextField, InputAdornment, IconButton } from "@mui/material"; +import { TextField } from "@mui/material"; import SearchIcon from "@mui/icons-material/Search"; -import { ref, get } from "firebase/database"; -import { database } from "../../firebaseConf"; interface Event { banner: string; @@ -20,7 +18,6 @@ interface Event { description: string; host: string; hostName: string; - id: string; registrants: string[]; tags: string; @@ -42,6 +39,58 @@ const EventList = () => { const [searchQuery, setSearchQuery] = useState(""); const [displayedEvents, setDisplayedEvents] = useState([]); + // Sample event data + const sampleEvents: Event[] = [ + { + banner: "https://example.com/banner1.jpg", + createdAt: Date.now(), + date: "2024-07-10", + description: "Event 1 Description", + host: "Host 1", + hostName: "Host Name 1", + id: "1", + registrants: ["user1", "user2"], + tags: "workshop", + time: "10:00 AM", + title: "Event 1", + }, + { + banner: "https://example.com/banner2.jpg", + createdAt: Date.now(), + date: "2024-08-15", + description: "Event 2 Description", + host: "Host 2", + hostName: "Host Name 2", + id: "2", + registrants: ["user3", "user4"], + tags: "conference", + time: "2:00 PM", + title: "Event 2", + }, + { + banner: "https://example.com/banner3.jpg", + createdAt: Date.now(), + date: "2024-09-20", + description: "Event 3 Description", + host: "Host 3", + hostName: "Host Name 3", + id: "3", + registrants: ["user5", "user6"], + tags: "meetup", + time: "6:00 PM", + title: "Event 3", + }, + ]; + + useEffect(() => { + // Set sample events data + setEventCardsData(sampleEvents); + setSortedEvents(sampleEvents); + setDisplayedEvents(sampleEvents); + setTotalPages(Math.ceil(sampleEvents.length / itemsPerPage)); + setIsLoading(false); + }, []); + const handlePageChange = (pageNumber: number) => { setCurrentPage(pageNumber); }; @@ -73,10 +122,15 @@ const EventList = () => { } }; - const filterEventsByTitle = (events: Event[], query: string): Event[] => { - return events.filter((event) => - event.title.toLowerCase().includes(query.toLowerCase()) - ); + const filterEvents = (events: Event[], query: string): Event[] => { + const trimmedQuery = query.trim().toLowerCase(); + return events.filter((event) => { + const eventDate = new Date(event.date).toISOString().slice(0, 10); + return ( + event.tags.toLowerCase().includes(trimmedQuery) || + eventDate.includes(trimmedQuery) + ); + }); }; const handleSearchInputChange = (e: React.ChangeEvent) => { @@ -84,8 +138,7 @@ const EventList = () => { }; const handleSearch = () => { - const trimmedQuery = searchQuery.trim(); - const filteredEvents = filterEventsByTitle(eventCardsData, trimmedQuery); + const filteredEvents = filterEvents(eventCardsData, searchQuery); const sortedFilteredEvents = sortEvents(filteredEvents, sortOption); setSortedEvents(sortedFilteredEvents); setDisplayedEvents(sortedFilteredEvents); @@ -93,30 +146,6 @@ const EventList = () => { setCurrentPage(1); // Reset to first page when search is performed }; - useEffect(() => { - const fetchData = async () => { - const dbRef = ref(database, "events"); - const snapshot = await get(dbRef); - if (snapshot.exists()) { - const snapshotValue = snapshot.val(); - if (snapshotValue !== null && typeof snapshotValue === "object") { - const res: Event[] = Object.values(snapshotValue) as Event[]; - res.sort((a: Event, b: Event) => b.createdAt - a.createdAt); - setEventCardsData(res); - setSortedEvents(res); - setDisplayedEvents(res); - setTotalPages(Math.ceil(res.length / itemsPerPage)); - setIsLoading(false); - } - } else { - console.log("No data available"); - setIsLoading(false); - } - }; - - fetchData(); - }, []); - useEffect(() => { const sortedFilteredEvents = sortEvents(eventCardsData, sortOption); setSortedEvents(sortedFilteredEvents); @@ -139,11 +168,13 @@ const EventList = () => { return "No events found"; } }; + const handleKeyPress = (event: React.KeyboardEvent) => { if (event.key === "Enter") { handleSearch(); } }; + return (
{ }} > {isLoading ? ( -
+
) : ( @@ -165,7 +196,7 @@ const EventList = () => {
= ({ + id, + title, + description, + date, + time, + tags, + banner, + host, + hostName, +}) => { + return ( + + + + {title} + {description} + {date} + {time} + {tags} + {hostName} + + + ); +}; + +export default EventCard; diff --git a/src/components/Events/Events.tsx b/src/components/Events/Events.tsx index fe3a803..d59ced1 100644 --- a/src/components/Events/Events.tsx +++ b/src/components/Events/Events.tsx @@ -1,5 +1,12 @@ import React, { useEffect, useState } from "react"; -import { Container, InputGroup, FormControl, Button, Spinner, Pagination } from "react-bootstrap"; +import { + Container, + InputGroup, + FormControl, + Button, + Spinner, + Pagination, +} from "react-bootstrap"; import { getDatabase, ref, get } from "firebase/database"; import PageTitle from "../../utils/PageTitle"; import EventCard from "../Cards/EventCard/EventCard"; @@ -46,7 +53,9 @@ const Events: React.FC = () => { const filteredEvents = Object.keys(eventsData) .map((key) => ({ id: key, ...eventsData[key] })) .filter((event) => { - const matchesTags = !searchTags || event.tags.toLowerCase().includes(searchTags.toLowerCase()); + const matchesTags = + !searchTags || + event.tags.toLowerCase().includes(searchTags.toLowerCase()); const matchesDate = !searchDate || event.date === searchDate; return matchesTags && matchesDate; }); @@ -88,24 +97,39 @@ const Events: React.FC = () => { ) : (
{eventCardsData - .slice((currentPage - 1) * itemsPerPage, currentPage * itemsPerPage) + .slice( + (currentPage - 1) * itemsPerPage, + currentPage * itemsPerPage + ) .map((event) => ( - + ))} - handlePageChange(1)} disabled={currentPage === 1} /> - handlePageChange(currentPage - 1)} disabled={currentPage === 1} /> - {[...Array(totalPages).keys()].map((number) => ( + handlePageChange(1)} + disabled={currentPage === 1} + /> + handlePageChange(currentPage - 1)} + disabled={currentPage === 1} + /> + {Array.from({ length: totalPages }, (_, index) => ( handlePageChange(number + 1)} + key={index + 1} + active={index + 1 === currentPage} + onClick={() => handlePageChange(index + 1)} > - {number + 1} + {index + 1} ))} - handlePageChange(currentPage + 1)} disabled={currentPage === totalPages} /> - handlePageChange(totalPages)} disabled={currentPage === totalPages} /> + handlePageChange(currentPage + 1)} + disabled={currentPage === totalPages} + /> + handlePageChange(totalPages)} + disabled={currentPage === totalPages} + />
)} diff --git a/src/firebaseConf.ts b/src/firebaseConf.ts index 309d0cb..fd3d3b6 100644 --- a/src/firebaseConf.ts +++ b/src/firebaseConf.ts @@ -11,7 +11,14 @@ import { getStorage } from "firebase/storage"; import { Zoom, toast } from "react-toastify"; const firebaseConfig = { - // Your firebase config + apiKey: "AIzaSyCMYeQ0FuZp5bzFOtxH_pF5Nd3cAaTPpj8", + authDomain: "chintu-d2cf6.firebaseapp.com", + databaseURL: "https://chintu-d2cf6-default-rtdb.firebaseio.com", + projectId: "chintu-d2cf6", + storageBucket: "chintu-d2cf6.appspot.com", + messagingSenderId: "332922368810", + appId: "1:332922368810:web:745a2927f1af5068092453", + measurementId: "G-R2QSYCZM23", }; const app = initializeApp(firebaseConfig); From 073505515de7c70b934e42601d0f68cbf4672619 Mon Sep 17 00:00:00 2001 From: Arunima Dutta Date: Fri, 5 Jul 2024 19:16:03 +0530 Subject: [PATCH 3/3] updated --- src/components/EventDetails/EventDetails.tsx | 71 ++++++++-- src/components/EventList/EventList.tsx | 94 +++++++------ src/components/Events/EventCard.tsx | 43 ------ src/components/Events/Events.tsx | 141 ------------------- src/firebaseConf.ts | 11 +- src/utils/searchEvents.ts | 18 --- 6 files changed, 108 insertions(+), 270 deletions(-) delete mode 100644 src/components/Events/EventCard.tsx delete mode 100644 src/components/Events/Events.tsx delete mode 100644 src/utils/searchEvents.ts diff --git a/src/components/EventDetails/EventDetails.tsx b/src/components/EventDetails/EventDetails.tsx index 588dde3..cb16a4a 100644 --- a/src/components/EventDetails/EventDetails.tsx +++ b/src/components/EventDetails/EventDetails.tsx @@ -1,5 +1,14 @@ import React, { useEffect, useState } from "react"; -import { Container, Row, Col, Button, Card, FormControl, InputGroup, Spinner } from "react-bootstrap"; +import { + Container, + Row, + Col, + Button, + Card, + FormControl, + InputGroup, + Spinner, +} from "react-bootstrap"; import { useParams } from "react-router-dom"; import { ref, get, update } from "firebase/database"; import { database } from "../../firebaseConf"; @@ -22,7 +31,9 @@ const EventDetails = () => { const [hostName, setHostName] = useState(""); const [lastEdited, setLastEdited] = useState(null); const [registeredUsers, setRegisteredUsers] = useState([]); - const [googleMeetLink, setGoogleMeetLink] = useState("Nothing yet, ask the host to add one"); + const [googleMeetLink, setGoogleMeetLink] = useState( + "Nothing yet, ask the host to add one" + ); useEffect(() => { if (!userUid) { @@ -48,7 +59,10 @@ const EventDetails = () => { } if (eventData.registrants) { setRegisteredUsers(eventData.registrants.split(",")); - if (!eventData.registrants.split(",").includes(userUid) && userUid !== eventData.host) { + if ( + !eventData.registrants.split(",").includes(userUid) && + userUid !== eventData.host + ) { window.location.href = "#/dashboard"; } } @@ -71,7 +85,10 @@ const EventDetails = () => {
{isLoading ? ( -
+
) : ( @@ -79,19 +96,34 @@ const EventDetails = () => { - + {title} - + + + {date} - + + + {time} - Host: {hostName} + Host:{" "} + + {hostName} + @@ -100,7 +132,9 @@ const EventDetails = () => { {tags.map((tag, index) => ( - {tag} + + {tag} + ))} @@ -118,13 +152,26 @@ const EventDetails = () => { {isHost ? ( Google Meet link : - setGoogleMeetLink(e.target.value)} /> - + setGoogleMeetLink(e.target.value)} + /> + ) : ( Google Meet link :{" "} - {googleMeetLink === "Nothing yet, ask the host to add one" ? googleMeetLink : {googleMeetLink}} + {googleMeetLink === + "Nothing yet, ask the host to add one" ? ( + googleMeetLink + ) : ( + + {googleMeetLink} + + )} )}
diff --git a/src/components/EventList/EventList.tsx b/src/components/EventList/EventList.tsx index 2c50295..56ed914 100644 --- a/src/components/EventList/EventList.tsx +++ b/src/components/EventList/EventList.tsx @@ -1,5 +1,4 @@ import React, { useEffect, useState } from "react"; -import EventCard from "../Cards/EventCard/EventCard"; import { Pagination, Spinner, @@ -127,6 +126,7 @@ const EventList = () => { return events.filter((event) => { const eventDate = new Date(event.date).toISOString().slice(0, 10); return ( + event.title.toLowerCase().includes(trimmedQuery) || event.tags.toLowerCase().includes(trimmedQuery) || eventDate.includes(trimmedQuery) ); @@ -196,7 +196,7 @@ const EventList = () => {
{ (currentPage - 1) * itemsPerPage, currentPage * itemsPerPage ) - .map((card: Event, index) => { - const user_uid = localStorage.getItem("userUid"); - const isRegistered = card.registrants.includes(user_uid!); - return ( -
- + .map((event: Event, index) => ( +
+ {/* Event card content can go here, customize as needed */} +
+ {event.title} +

{event.title}

+

{event.description}

+

{event.date}

+

{event.time}

+

{event.tags}

- ); - }) +
+ )) + )} + {totalPages > 1 && ( +
+ + handlePageChange(1)} + disabled={currentPage === 1} + /> + handlePageChange(currentPage - 1)} + disabled={currentPage === 1} + /> + {[...Array(totalPages)].map((_, pageIndex) => ( + handlePageChange(pageIndex + 1)} + > + {pageIndex + 1} + + ))} + handlePageChange(currentPage + 1)} + disabled={currentPage === totalPages} + /> + handlePageChange(totalPages)} + disabled={currentPage === totalPages} + /> + +
)} - -
- - {[...Array(totalPages)].map((_, i) => ( - { - handlePageChange(i + 1); - window.scrollTo({ - top: 0, - left: 0, - behavior: "smooth", - }); - }} - > - {i + 1} - - ))} - -
)}
diff --git a/src/components/Events/EventCard.tsx b/src/components/Events/EventCard.tsx deleted file mode 100644 index 39d7c71..0000000 --- a/src/components/Events/EventCard.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import React from "react"; -import { Card } from "react-bootstrap"; -import "./EventCard.css"; - -interface EventCardProps { - id: string; - title: string; - description: string; - date: string; - time: string; - tags: string; - banner: string; - host: string; - hostName: string; -} - -const EventCard: React.FC = ({ - id, - title, - description, - date, - time, - tags, - banner, - host, - hostName, -}) => { - return ( - - - - {title} - {description} - {date} - {time} - {tags} - {hostName} - - - ); -}; - -export default EventCard; diff --git a/src/components/Events/Events.tsx b/src/components/Events/Events.tsx deleted file mode 100644 index d59ced1..0000000 --- a/src/components/Events/Events.tsx +++ /dev/null @@ -1,141 +0,0 @@ -import React, { useEffect, useState } from "react"; -import { - Container, - InputGroup, - FormControl, - Button, - Spinner, - Pagination, -} from "react-bootstrap"; -import { getDatabase, ref, get } from "firebase/database"; -import PageTitle from "../../utils/PageTitle"; -import EventCard from "../Cards/EventCard/EventCard"; -import "./Events.css"; - -const Events: React.FC = () => { - const [eventCardsData, setEventCardsData] = useState([]); - const [isLoading, setIsLoading] = useState(true); - const [searchTags, setSearchTags] = useState(""); - const [searchDate, setSearchDate] = useState(""); - const [currentPage, setCurrentPage] = useState(1); - const itemsPerPage = 5; - const [totalPages, setTotalPages] = useState(1); - - useEffect(() => { - const fetchData = async () => { - const db = getDatabase(); - const eventsRef = ref(db, "events"); - const snapshot = await get(eventsRef); - if (snapshot.exists()) { - const eventsData = snapshot.val(); - const fetchedEvents = Object.keys(eventsData).map((key) => ({ - id: key, - ...eventsData[key], - })); - setEventCardsData(fetchedEvents); - setTotalPages(Math.ceil(fetchedEvents.length / itemsPerPage)); - } else { - console.log("No data available"); - } - setIsLoading(false); - }; - - fetchData(); - }, []); - - const handleSearch = async () => { - setIsLoading(true); - const db = getDatabase(); - const searchRef = ref(db, "events"); - const snapshot = await get(searchRef); - if (snapshot.exists()) { - const eventsData = snapshot.val(); - const filteredEvents = Object.keys(eventsData) - .map((key) => ({ id: key, ...eventsData[key] })) - .filter((event) => { - const matchesTags = - !searchTags || - event.tags.toLowerCase().includes(searchTags.toLowerCase()); - const matchesDate = !searchDate || event.date === searchDate; - return matchesTags && matchesDate; - }); - - setEventCardsData(filteredEvents); - setTotalPages(Math.ceil(filteredEvents.length / itemsPerPage)); - } - setIsLoading(false); - }; - - const handlePageChange = (pageNumber: number) => { - setCurrentPage(pageNumber); - }; - - return ( - <> - - - - setSearchTags(e.target.value)} - /> - setSearchDate(e.target.value)} - /> - - - -
- {isLoading ? ( - - ) : ( -
- {eventCardsData - .slice( - (currentPage - 1) * itemsPerPage, - currentPage * itemsPerPage - ) - .map((event) => ( - - ))} - - handlePageChange(1)} - disabled={currentPage === 1} - /> - handlePageChange(currentPage - 1)} - disabled={currentPage === 1} - /> - {Array.from({ length: totalPages }, (_, index) => ( - handlePageChange(index + 1)} - > - {index + 1} - - ))} - handlePageChange(currentPage + 1)} - disabled={currentPage === totalPages} - /> - handlePageChange(totalPages)} - disabled={currentPage === totalPages} - /> - -
- )} -
- - ); -}; - -export default Events; diff --git a/src/firebaseConf.ts b/src/firebaseConf.ts index fd3d3b6..6ce8084 100644 --- a/src/firebaseConf.ts +++ b/src/firebaseConf.ts @@ -10,16 +10,7 @@ import { getDatabase } from "firebase/database"; import { getStorage } from "firebase/storage"; import { Zoom, toast } from "react-toastify"; -const firebaseConfig = { - apiKey: "AIzaSyCMYeQ0FuZp5bzFOtxH_pF5Nd3cAaTPpj8", - authDomain: "chintu-d2cf6.firebaseapp.com", - databaseURL: "https://chintu-d2cf6-default-rtdb.firebaseio.com", - projectId: "chintu-d2cf6", - storageBucket: "chintu-d2cf6.appspot.com", - messagingSenderId: "332922368810", - appId: "1:332922368810:web:745a2927f1af5068092453", - measurementId: "G-R2QSYCZM23", -}; +const firebaseConfig = {}; const app = initializeApp(firebaseConfig); diff --git a/src/utils/searchEvents.ts b/src/utils/searchEvents.ts deleted file mode 100644 index d4e8919..0000000 --- a/src/utils/searchEvents.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { getDatabase, ref, get } from "firebase/database"; - -export const searchEvents = async (tags: string, date: string) => { - const db = getDatabase(); - const eventsRef = ref(db, "events"); - const snapshot = await get(eventsRef); - if (snapshot.exists()) { - const eventsData = snapshot.val(); - return Object.keys(eventsData) - .map((key) => ({ id: key, ...eventsData[key] })) - .filter((event) => { - const matchesTags = !tags || event.tags.toLowerCase().includes(tags.toLowerCase()); - const matchesDate = !date || event.date === date; - return matchesTags && matchesDate; - }); - } - return []; -};