import { useRouter } from "next/router"; import { FaPlus, FaExternalLinkAlt, FaLink } 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 { doc, DocumentSnapshot, getFirestore, onSnapshot, Unsubscribe, } from "firebase/firestore"; import { Collections } from "../../services/collections"; import { KeyCode } from "../../globals/keycode"; import { Tooltip } from "antd"; import { useAudioContext } from "../../contexts/audioContext"; import UserStatusBubble, { UserPulse } from "../UserStatusBubble"; const userService = new UserService(); const db = getFirestore(); const maxNumberOfKeyboardMappings: number = 9; export default function TeamVoiceLine() { const audioContext = useAudioContext(); const router = useRouter(); const { teamid } = router.query; const { team, user, userTeamMember, teamMembers } = useTeamDashboardContext(); const [loading, setLoading] = useState(true); const [teamUsers, setTeamUsers] = useState([]); 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); 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()); }; }, []); useEffect(() => { 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 audioContext.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 ( audioContext.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 == audioContext.selectedTeammate ? "bg-white scale-150 z-20" : "" }`} > asdf {tmember.id == audioContext.selectedTeammate ? ( <> {tmember.nickName} {tmember.teamRole} ) : ( <> {tmember.nickName} {/* keyboard shortcuts start from 1 */} {i + 1} {tmember.teamRole} )} {tmember.id == audioContext.selectedTeammate ? ( <> {audioContext.isRecording ? ( ) : ( )} ) : ( )} ); }); } return (
TEAM {/* list of team members */} {renderTeamMemberList()}
); }