import { useRouter } from "next/router"; import { FaPlus, FaExternalLinkAlt, FaLink, FaBackward } from "react-icons/fa"; import { IoPulseOutline, IoRemoveOutline, IoTimer } from "react-icons/io5"; import { MdScreenShare } from "react-icons/md"; import { BsThreeDots } from "react-icons/bs"; import { useTeamDashboardContext } from "../../contexts/teamDashboardContext"; import { User, UserStatus } from "../../models/user"; import { useEffect, useState } from "react"; import { toast } from "react-hot-toast"; import { TeamMemberRole, TeamMemberStatus } from "../../models/teamMember"; import UserService from "../../services/userService"; import { collection, doc, DocumentSnapshot, getFirestore, onSnapshot, orderBy, query, Unsubscribe, where, } from "firebase/firestore"; import { Collections } from "../../services/collections"; import { KeyCode } from "../../globals/keycode"; import { Tooltip } from "antd"; import { useKeyboardContext } from "../../contexts/keyboardContext"; import UserStatusBubble, { UserPulse } from "../UserStatusBubble"; import { useAuth } from "../../contexts/authContext"; import { Message } from "../../models/message"; import { compareStatus } from "../../helpers/userHelper"; const maxNumberOfKeyboardMappings: number = 9; const db = getFirestore(); export default function TeamVoiceLine() { const { currUser } = useAuth(); const { addTeamShortcutBinding, selectTeamMember, selectedTeammate, isRecording, } = useKeyboardContext(); const router = useRouter(); const { teamid } = router.query; const { team, user, userTeamMember, teamMembers } = useTeamDashboardContext(); const [loading, setLoading] = useState(true); const [teamUsers, setTeamUsers] = useState([]); // setup listeners for each teammate or their status changes useEffect(() => { const unsubs: Unsubscribe[] = []; (async function () { try { // listeners for all teammates' status if (teamMembers) { teamMembers.map((tmember) => { if (tmember.status == TeamMemberStatus.activated) { const docRef = doc(db, Collections.users, tmember.userId); const unsub = onSnapshot(docRef, (doc) => { const updatedteamMateUser = doc.data() as User; setTeamUsers((prevTeamUsers) => { const newTeamUsers = prevTeamUsers.filter( (tm) => tm.id != updatedteamMateUser.id ); newTeamUsers.push(updatedteamMateUser); // order users by status setTeamUsers(newTeamUsers.sort(compareStatus)); return newTeamUsers; }); }); unsubs.push(unsub); } return; }); } } catch (error) { console.log(error); toast.error("Something went wrong"); router.push("/teams/landing"); } setLoading(false); })(); return () => { unsubs.map((listener) => listener()); }; }, []); // set up shortcuts for each teammate useEffect(() => { // create shortcuts teamUsers.forEach((tmUser, i) => { // make sure we don't map a user if they are past the max allowed if (i < maxNumberOfKeyboardMappings) { let shortcut: number = i + 49; // 49 is what number 1 is on the keyboard addTeamShortcutBinding(shortcut, tmUser.id); } }); }, [teamUsers]); async function handleAdminRoute() { if (userTeamMember.role == TeamMemberRole.admin) { router.push("/teams/" + teamid + "/admin"); return; } toast.error("You are not a team admin!"); } useEffect(() => { // todo move all variable stuff like shortcut mappings here }, [teamUsers]); function renderTeamMemberList() { // show loading skeleton if not yet got friend info if (loading) { return (
); } // if not teammates, stale state message to tell admin to add people if (!teamUsers.length) { return Please add team members.; } return teamUsers.map((tmember, i) => { return ( selectTeamMember(tmember.id)} key={i} className={`rounded flex flex-row items-center py-2 px-2 justify-items-start ease-in-out duration-300 hover:cursor-pointer ${ tmember.id == selectedTeammate ? "bg-white scale-150 z-20" : "" }`} > asdf {tmember.id == selectedTeammate ? ( <> {tmember.nickName} {tmember.teamRole} ) : ( <> {tmember.nickName} {/* keyboard shortcuts start from 1 */} {i + 1} {tmember.teamRole} )} {tmember.id == selectedTeammate ? ( <> {isRecording ? ( ) : ( )} ) : ( )} ); }); } return (
TEAM {/* list of team members */} {renderTeamMemberList()}
); }