From 4f7d8c92c1a9f981b6463eb371a7f367d586d775 Mon Sep 17 00:00:00 2001 From: talksik Date: Sun, 29 May 2022 08:46:58 -0500 Subject: [PATCH] adding stuff for mic --- packages/desktop/src/components/Terminal.tsx | 231 +++++++++++-------- packages/desktop/src/electron/constants.ts | 2 + packages/desktop/src/electron/global.d.ts | 1 + packages/desktop/src/electron/preload.ts | 4 + packages/desktop/src/firebase/firestore.ts | 2 +- packages/desktop/src/index.ts | 6 +- 6 files changed, 142 insertions(+), 104 deletions(-) diff --git a/packages/desktop/src/components/Terminal.tsx b/packages/desktop/src/components/Terminal.tsx index 632bac5..9f57a57 100644 --- a/packages/desktop/src/components/Terminal.tsx +++ b/packages/desktop/src/components/Terminal.tsx @@ -65,6 +65,7 @@ import NirvanaAvatar from './NirvanaAvatar'; import { useDebounce, useKeyPressEvent } from 'react-use'; import KeyboardShortcutLabel from './KeyboardShortcutLabel'; +import Channels from '../electron/constants'; type ConversationMap = { [conversationId: string]: Conversation; }; @@ -86,10 +87,14 @@ interface ITerminalContext { handleQuickDial?: (otherUserId: string) => void; getUser?: (userId: string) => Promise; + + isUserSpeaking: boolean; } const TerminalContext = React.createContext({ conversationMap: {}, + + isUserSpeaking: false, }); // TODOS @@ -151,7 +156,7 @@ export function TerminalProvider({ children }: { children?: React.ReactNode }) { }); return () => unsub(); - }, [user, enqueueSnackbar, updateConversationMap]); + }, [user, updateConversationMap]); // cache of selected conversation const selectedConversation: Conversation | undefined = useMemo(() => { @@ -240,15 +245,32 @@ export function TerminalProvider({ children }: { children?: React.ReactNode }) { useKeyPressEvent('Shift', onSearchFocus); + const [isUserSpeaking, setIsUserSpeaking] = useState(false); + + const [userAudioStream, setUserAudioStream] = useState(null); + + const handleAskForMicrophonePermissions = useCallback(() => { + window.electronAPI.send(Channels.ASK_MICROPHONE_PERMISSIONS); + }, []); + // when user wants to talk, // unmute them and send clip for everyone to hear in the distance const handleBroadcast = useCallback(() => { + if (!userAudioStream) { + enqueueSnackbar('Check your audio mic permissions!', { variant: 'error' }); + handleAskForMicrophonePermissions(); + return; + } + setIsUserSpeaking(true); + enqueueSnackbar('started recording'); - }, []); + }, [setIsUserSpeaking, userAudioStream, handleAskForMicrophonePermissions]); const handleStopBroadcast = useCallback(() => { + setIsUserSpeaking(false); + enqueueSnackbar('stopped...', { variant: 'info' }); - }, []); + }, [setIsUserSpeaking]); useKeyPressEvent('`', handleBroadcast, handleStopBroadcast); @@ -295,6 +317,7 @@ export function TerminalProvider({ children }: { children?: React.ReactNode }) { return ( - - - yesterday - - - - - - - - {'Viet Phan'} - - - - - - - - - - - - today - - - - - - - - {'Viet Phan'} - - - - - - - - - - - - right now - - - - - - - - {'Arjun Patel'} - - - - - - - - - - + {/* */} ); } + +function ConversationHistory() { + return ( + + + yesterday + + + + + + + + {'Viet Phan'} + + + + + + + + + + + + today + + + + + + + + {'Viet Phan'} + + + + + + + + + + + + right now + + + + + + + + {'Arjun Patel'} + + + + + + + + + + + ); +} diff --git a/packages/desktop/src/electron/constants.ts b/packages/desktop/src/electron/constants.ts index d6c5a4d..e23ff77 100644 --- a/packages/desktop/src/electron/constants.ts +++ b/packages/desktop/src/electron/constants.ts @@ -8,6 +8,8 @@ enum Channels { RESIZE_WINDOW = 'RESIZE_WINDOW', ON_WINDOW_BLUR = 'ON_WINDOW_BLUR', ON_WINDOW_FOCUS = 'ON_WINDOW_FOCUS', + + ASK_MICROPHONE_PERMISSIONS = 'ASK_MICROPHONE_PERMISSIONS', } export enum STORE_ITEMS { diff --git a/packages/desktop/src/electron/global.d.ts b/packages/desktop/src/electron/global.d.ts index 7335bb0..e2bd259 100644 --- a/packages/desktop/src/electron/global.d.ts +++ b/packages/desktop/src/electron/global.d.ts @@ -15,6 +15,7 @@ declare global { window: { resizeWindow(dimensionChangeRequest: DimensionChangeRequest): void; }; + send(channel: Channels, data?: any); on(channel: Channels, func: any): () => void; once(channel: Channels, func: any): () => void; }; diff --git a/packages/desktop/src/electron/preload.ts b/packages/desktop/src/electron/preload.ts index aeb466a..6f5d490 100644 --- a/packages/desktop/src/electron/preload.ts +++ b/packages/desktop/src/electron/preload.ts @@ -23,6 +23,10 @@ const electronAPI = { }, }, + send(channel: Channels, data?: any) { + ipcRenderer.send(channel, data); + }, + on(channel: Channels, func: any) { // const validChannels = ['ipc-example']; // if (validChannels.includes(channel)) { diff --git a/packages/desktop/src/firebase/firestore.ts b/packages/desktop/src/firebase/firestore.ts index c9cef73..e13a4a5 100644 --- a/packages/desktop/src/firebase/firestore.ts +++ b/packages/desktop/src/firebase/firestore.ts @@ -134,7 +134,7 @@ export const getUserById = async (userId: string): Promise => // get the conversations for particular user export const getConversationsQueryLIVE = (userId: string) => - query(db.conversations, where('memberIdsList', 'array-contains', userId)); + query(db.conversations, where(`members.${userId}.isActive`, '==', true)); /** * diff --git a/packages/desktop/src/index.ts b/packages/desktop/src/index.ts index a77ef27..853993f 100644 --- a/packages/desktop/src/index.ts +++ b/packages/desktop/src/index.ts @@ -1,4 +1,4 @@ -import { app, BrowserWindow, ipcMain, Display, screen } from 'electron'; +import { app, BrowserWindow, ipcMain, Display, screen, systemPreferences } from 'electron'; import Channels, { DEFAULT_APP_PRESET, DimensionChangeRequest } from './electron/constants'; import { handleGoogleLogin } from './electron/handleLogin'; @@ -64,6 +64,10 @@ app console.log('initiating log in'); await handleGoogleLogin(); }); + + ipcMain.on(Channels.ASK_MICROPHONE_PERMISSIONS, async () => { + systemPreferences.askForMediaAccess('microphone'); + }); }) .then(() => { // dynamically changing the window bounds