nice touchups and now working cleaner with audio manager

This commit is contained in:
Arjun Patel
2022-01-15 19:33:14 -08:00
parent 5bf0274af9
commit c9108a6d50
5 changed files with 122 additions and 69 deletions
-2
View File
@@ -49,8 +49,6 @@ export default function Header() {
currUser.email currUser.email
); );
console.log(newTeams);
setUserTeams(newTeams); setUserTeams(newTeams);
} catch (error) { } catch (error) {
console.log("problem getting teams of this user"); console.log("problem getting teams of this user");
+19 -61
View File
@@ -19,6 +19,7 @@ import {
import { Collections } from "../../services/collections"; import { Collections } from "../../services/collections";
import { KeyCode } from "../../globals/keycode"; import { KeyCode } from "../../globals/keycode";
import { Tooltip } from "antd"; import { Tooltip } from "antd";
import { useAudioContext } from "../../contexts/audioContext";
const userService = new UserService(); const userService = new UserService();
const db = getFirestore(); const db = getFirestore();
@@ -67,16 +68,14 @@ function renderPulse(status: UserStatus) {
const maxNumberOfKeyboardMappings: number = 9; const maxNumberOfKeyboardMappings: number = 9;
const shortcutMappings = new Map(); // keycode number to the user id
export default function TeamVoiceLine() { export default function TeamVoiceLine() {
const audioContext = useAudioContext();
const router = useRouter(); const router = useRouter();
const { teamid } = router.query; const { teamid } = router.query;
const { team, user, userTeamMember, teamMembers } = useTeamDashboardContext(); const { team, user, userTeamMember, teamMembers } = useTeamDashboardContext();
const [loading, setLoading] = useState<Boolean>(true); const [loading, setLoading] = useState<Boolean>(true);
const [teamUsers, setTeamUsers] = useState<User[]>([]); const [teamUsers, setTeamUsers] = useState<User[]>([]);
const [count, setCount] = useState<number>(0);
useEffect(() => { useEffect(() => {
const unsubs: Unsubscribe[] = []; const unsubs: Unsubscribe[] = [];
@@ -107,9 +106,6 @@ export default function TeamVoiceLine() {
return; return;
}); });
document.addEventListener("keydown", handleKeyboardShortcut);
document.addEventListener("keyup", handleKeyUp);
} }
} catch (error) { } catch (error) {
console.log(error); console.log(error);
@@ -122,12 +118,19 @@ export default function TeamVoiceLine() {
return () => { return () => {
unsubs.map((listener) => listener()); unsubs.map((listener) => listener());
document.removeEventListener("keydown", handleKeyboardShortcut);
document.removeEventListener("keyup", handleKeyUp);
}; };
}, []); }, []);
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() { async function handleAdminRoute() {
if (userTeamMember.role == TeamMemberRole.admin) { if (userTeamMember.role == TeamMemberRole.admin) {
router.push("/teams/" + teamid + "/admin"); router.push("/teams/" + teamid + "/admin");
@@ -137,57 +140,10 @@ export default function TeamVoiceLine() {
toast.error("You are not a team admin!"); toast.error("You are not a team admin!");
} }
// SECTION: set up for shortcuts and recording and such
const [selectedTeammate, setSelectedTeammate] = useState<string>(); // id of selected teammate
const [isRecording, setIsRecording] = useState<Boolean>(false);
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
shortcutMappings.set(shortcut, tmUser.id);
}
});
useEffect(() => { useEffect(() => {
// todo move all variable stuff like shortcut mappings here // todo move all variable stuff like shortcut mappings here
}, [teamUsers]); }, [teamUsers]);
function handleKeyUp(event) {
console.log("on key up");
// if was recording and released R, then stop recording
if (event.keyCode == KeyCode.R) {
console.log("stopped recording");
setIsRecording(false);
setSelectedTeammate(null);
}
}
function handleKeyboardShortcut(event) {
if (event.repeat) {
return;
}
console.log(event.keyCode);
// recording
if (event.keyCode == KeyCode.R) {
console.log("started recording");
setIsRecording(true);
}
// if we have a valid user for such a shortcut, then go ahead...otherwise
else if (shortcutMappings.has(event.keyCode)) {
setSelectedTeammate(shortcutMappings.get(event.keyCode));
} else if (event.keyCode == KeyCode.Escape) {
setSelectedTeammate(null);
} else {
toast("Invalid teammate selection.");
}
// todo if we press the same shortcut twice, deactive selected user
}
function renderTeamMemberList() { function renderTeamMemberList() {
// show loading skeleton if not yet got friend info // show loading skeleton if not yet got friend info
if (loading) { if (loading) {
@@ -210,10 +166,12 @@ export default function TeamVoiceLine() {
return teamUsers.map((tmember, i) => { return teamUsers.map((tmember, i) => {
return ( return (
<span <span
onClick={() => setSelectedTeammate(tmember.id)} onClick={() => audioContext.setSelectedTeamMember(tmember.id)}
key={i} key={i}
className={`rounded flex flex-row items-center py-2 px-2 justify-items-start ease-in-out duration-300 hover:cursor-pointer ${ 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" : "" tmember.id == audioContext.selectedTeammate
? "bg-white scale-150 z-20"
: ""
}`} }`}
> >
<span className="relative flex mr-2"> <span className="relative flex mr-2">
@@ -229,7 +187,7 @@ export default function TeamVoiceLine() {
</span> </span>
<span className="flex flex-col mr-10"> <span className="flex flex-col mr-10">
{tmember.id == selectedTeammate ? ( {tmember.id == audioContext.selectedTeammate ? (
<> <>
<span className="flex flex-row items-center space-x-2"> <span className="flex flex-row items-center space-x-2">
<span className="text-sm text-black font-bold"> <span className="text-sm text-black font-bold">
@@ -256,7 +214,7 @@ export default function TeamVoiceLine() {
)} )}
</span> </span>
{tmember.id == selectedTeammate ? ( {tmember.id == audioContext.selectedTeammate ? (
<> <>
<Tooltip title="send link"> <Tooltip title="send link">
<button className="ml-auto bg-gray-400 bg-opacity-80 p-2 rounded hover:bg-opacity-100"> <button className="ml-auto bg-gray-400 bg-opacity-80 p-2 rounded hover:bg-opacity-100">
@@ -271,7 +229,7 @@ export default function TeamVoiceLine() {
</Tooltip> </Tooltip>
<Tooltip title="press and hold R to send audio message"> <Tooltip title="press and hold R to send audio message">
{isRecording ? ( {audioContext.isRecording ? (
<button className="ml-2 w-10 h-10 border-orange-400 bg-orange-400 border-2 bg-opacity-80 p-2 rounded hover:bg-opacity-100"> <button className="ml-2 w-10 h-10 border-orange-400 bg-orange-400 border-2 bg-opacity-80 p-2 rounded hover:bg-opacity-100">
<span className="text-sm text-white font-bold">R</span> <span className="text-sm text-white font-bold">R</span>
</button> </button>
+97
View File
@@ -0,0 +1,97 @@
import React, { useContext, useEffect, useState } from "react";
import toast from "react-hot-toast";
import { KeyCode } from "../globals/keycode";
interface AudioContextInterface {
selectedTeammate: string; // can only have one selected
setSelectedTeamMember: Function;
teamShortcutMappings: {};
addTeamShortcutBinding: Function;
isRecording: Boolean; // can only record if someone is selected or maybe for an announcement
// inputDevice: string;
// outputDevice: string;
isMuted: Boolean;
isSilenceMode: Boolean; // won't automatically listen to notifications or sounds
}
const AudioContext = React.createContext<AudioContextInterface | null>(null);
export default function AudioContextProvider({ children }) {
// SECTION: set up for shortcuts and recording and such
const [selectedTeammate, setSelectedTeamMember] = useState<string>(null); // id of selected teammate
const [isRecording, setIsRecording] = useState<Boolean>(false);
const [teamShortcutMappings, setTeamShortcutMappings] = useState<{}>({});
useEffect(() => {
document.addEventListener("keydown", handleKeyboardShortcut);
document.addEventListener("keyup", handleKeyUp);
return () => {
document.removeEventListener("keydown", handleKeyboardShortcut);
document.removeEventListener("keyup", handleKeyUp);
};
}, []);
function handleKeyUp(event) {
console.log("on key up");
// if was recording and released R, then stop recording
if (event.keyCode == KeyCode.R) {
console.log("stopped recording");
setIsRecording(false);
setSelectedTeamMember(null);
}
}
function handleKeyboardShortcut(event) {
if (event.repeat) {
return;
}
console.log(event.keyCode);
// recording
if (event.keyCode == KeyCode.R) {
console.log("started recording");
setIsRecording(true);
}
// if we have a valid user for such a shortcut, then go ahead...otherwise
else if (teamShortcutMappings[event.keyCode]) {
setSelectedTeamMember(teamShortcutMappings[event.keyCode]);
} else if (event.keyCode == KeyCode.Escape) {
setSelectedTeamMember(null);
} else {
toast("Invalid keyboard shortcut.");
}
// todo if we press the same shortcut twice, deactive selected user
}
function addTeamShortcutBinding(keyCode: number, userId: string) {
setTeamShortcutMappings((prevMap) => ({ ...prevMap, [keyCode]: [userId] }));
}
const value: AudioContextInterface = {
selectedTeammate,
setSelectedTeamMember,
addTeamShortcutBinding,
isRecording,
teamShortcutMappings,
isMuted: false,
isSilenceMode: false,
};
return (
<AudioContext.Provider value={value}>{children}</AudioContext.Provider>
);
}
export function useAudioContext() {
return useContext(AudioContext);
}
+6 -3
View File
@@ -5,6 +5,7 @@ import Header from "../../components/Dashboard/Header";
import TeamVoiceLine from "../../components/Dashboard/TeamVoiceLine"; import TeamVoiceLine from "../../components/Dashboard/TeamVoiceLine";
import BackgroundLayout from "../../components/Layouts/BackgroundLayout"; import BackgroundLayout from "../../components/Layouts/BackgroundLayout";
import Loading from "../../components/Loading"; import Loading from "../../components/Loading";
import AudioContextProvider from "../../contexts/audioContext";
import { useAuth } from "../../contexts/authContext"; import { useAuth } from "../../contexts/authContext";
import { import {
TeamDashboardContextProvider, TeamDashboardContextProvider,
@@ -67,9 +68,11 @@ function TeamDashboard() {
export default function TeamDashboardWrapper() { export default function TeamDashboardWrapper() {
return ( return (
<TeamDashboardContextProvider> <TeamDashboardContextProvider>
<BackgroundLayout> <AudioContextProvider>
<TeamDashboard /> <BackgroundLayout>
</BackgroundLayout> <TeamDashboard />
</BackgroundLayout>
</AudioContextProvider>
</TeamDashboardContextProvider> </TeamDashboardContextProvider>
); );
} }
-3
View File
@@ -268,9 +268,6 @@ export default class TeamService implements IService {
email email
); );
console.log(userTeamMembers);
console.log(userTeamMembersByEmail);
// traverse through and get the teams for each // traverse through and get the teams for each
var teams: Promise<Team>[]; var teams: Promise<Team>[];
if (userTeamMembers) { if (userTeamMembers) {