import React, { useEffect, useState } from "react"; import { FaAngleDown, FaBell, FaClock, FaPlus, FaLink } from "react-icons/fa"; import { IoTimer } from "react-icons/io5"; import { BsThreeDots } from "react-icons/bs"; import Image from "next/image"; import CreateOrUpdateRoom from "../Modals/CreateOrUpdateRoom"; import { ShowModalType, useKeyboardContext, } from "../../contexts/keyboardContext"; import { collection, getFirestore, onSnapshot, orderBy, query, where, } from "firebase/firestore"; import { Collections } from "../../services/collections"; import { useTeamDashboardContext } from "../../contexts/teamDashboardContext"; import Room, { RoomStatus, RoomType } from "../../models/room"; import { useAuth } from "../../contexts/authContext"; import { Dropdown, Menu, Radio, Tooltip } from "antd"; import RoomCard from "../RoomCard"; import toast from "react-hot-toast"; enum RoomTypeFilter { team = "team", me = "me", live = "live", archived = "archived", } enum RoomTimeFilter { today = "today", week = "week", month = "month", } const db = getFirestore(); const lastWeek = new Date(); lastWeek.setDate(lastWeek.getDate() - 7); export default function DashboardRoom() { const { currUser } = useAuth(); const { handleModalType, showModalType } = useKeyboardContext(); const { team } = useTeamDashboardContext(); const [roomsMap, setRoomsMap] = useState>( new Map() ); // get rooms data realtime useEffect(() => { /** * QUERY: * all rooms in the past week * order createdDate desc * */ const q = query( collection(db, Collections.rooms), where("teamId", "==", team.id), where("createdDate", ">", lastWeek), orderBy("createdDate", "desc") ); // return unsubscribe return onSnapshot(q, (snapshot) => { snapshot.docChanges().forEach((change) => { let updatedRoom = change.doc.data() as Room; updatedRoom.id = change.doc.id; if (change.type === "added" || change.type === "modified") { console.log("New or updated room: ", updatedRoom); // update rooms map setRoomsMap((prevMap) => { return new Map(prevMap.set(updatedRoom.id, updatedRoom)); }); } if (change.type === "removed") { console.log("Removed room: ", updatedRoom); } }); }); }, []); // on CTRL + Q, new tab to google meet // on CTRL + V, show modal to create meeting with the link const [selectedTabPane, setSelectedTabPane] = useState( RoomTypeFilter.me ); // tab pane ui from scratch // function renderTabPane() { // return ( // // setSelectedTabPane(RoomTypeFilter.all)} // className={`${ // selectedTabPane == RoomTypeFilter.all // } underline underline-offset-8 decoration-white text-white hover:text-white hover:cursor-pointer`} // > // All // // setSelectedTabPane(RoomTypeFilter.me)} // className="text-gray-300 hover:text-white hover:cursor-pointer" // > // Me // // setSelectedTabPane(RoomTypeFilter.now)} // className="text-gray-300 hover:text-white hover:cursor-pointer" // > // Now // // setSelectedTabPane(RoomTypeFilter.scheduled)} // className="text-gray-300 hover:text-white hover:cursor-pointer" // > // Scheduled // // setSelectedTabPane(RoomTypeFilter.recurring)} // className="text-gray-300 hover:text-white hover:cursor-pointer" // > // Recurring // // setSelectedTabPane(RoomTypeFilter.archived)} // className="text-gray-300 hover:text-white hover:cursor-pointer" // > // Archive // // // ); // } const allRooms = Array.from(roomsMap.values()); const teamRooms = allRooms.filter( (room) => room.status != RoomStatus.archived ); const meRooms = allRooms.filter( (room) => room.members.includes(currUser.uid) && room.status != RoomStatus.archived ); const liveRooms = allRooms.filter((room) => room.status == RoomStatus.live); const archivedRooms = allRooms.filter( (room) => room.status == RoomStatus.archived ); function getRoomContent() { // return data based on the selected filters switch (selectedTabPane) { case RoomTypeFilter.team: return teamRooms; case RoomTypeFilter.me: return meRooms; case RoomTypeFilter.live: return liveRooms; default: return allRooms; } } const TimePeriodFilterMenu = ( Past 24 Hours (Coming Soon) This Month(Coming Soon) ); const [selectedUpdateRoom, setSelectedUpdateRoom] = useState(null); async function handleUpdateRoom(roomId: string) { console.log("going to update room"); // get the room details and pass it into the modal if (!roomsMap.has(roomId)) { toast.error("not a valid room to edit"); return; } // pass this to the modal for use setSelectedUpdateRoom(roomsMap.get(roomId)); // call the keyboard context to show the modal handleModalType(ShowModalType.createRoom); } return (
{/* modal for creating room */} {/* header */} Rooms setSelectedTabPane(e.target.value)} > {RoomTypeFilter.team}{" "} {teamRooms.length} {RoomTypeFilter.me}{" "} {meRooms.length} {RoomTypeFilter.live}{" "} {liveRooms.length} {RoomTypeFilter.archived}{" "} {archivedRooms.length} Week {/* */} {/* all rooms */} {getRoomContent().map((room) => { return ( ); })}
); }