allow owner of the call to change the class state

This commit is contained in:
harshithpabbati 2022-01-10 15:05:45 +05:30
parent 4afde01aa4
commit 1126143b6d
4 changed files with 68 additions and 24 deletions

View File

@ -7,6 +7,7 @@ import PropTypes from 'prop-types';
import { ChatProvider } from '../../contexts/ChatProvider'; import { ChatProvider } from '../../contexts/ChatProvider';
import { LiveStreamingProvider } from '../../contexts/LiveStreamingProvider'; import { LiveStreamingProvider } from '../../contexts/LiveStreamingProvider';
import { RecordingProvider } from '../../contexts/RecordingProvider'; import { RecordingProvider } from '../../contexts/RecordingProvider';
import { ViewProvider } from '../../contexts/ViewProvider';
import Room from '../Call/Room'; import Room from '../Call/Room';
import { Asides } from './Asides'; import { Asides } from './Asides';
import { Modals } from './Modals'; import { Modals } from './Modals';
@ -27,23 +28,25 @@ export const App = ({ customComponentForState }) => {
<ChatProvider> <ChatProvider>
<RecordingProvider> <RecordingProvider>
<LiveStreamingProvider> <LiveStreamingProvider>
{roomExp && <ExpiryTimer expiry={roomExp} />} <ViewProvider>
<div className="app"> {roomExp && <ExpiryTimer expiry={roomExp} />}
{componentForState()} <div className="app">
<Modals /> {componentForState()}
<Asides /> <Modals />
<style jsx>{` <Asides />
color: white; <style jsx>{`
height: 100vh; color: white;
display: flex; height: 100vh;
align-items: center; display: flex;
justify-content: center; align-items: center;
justify-content: center;
.loader {
margin: 0 auto; .loader {
} margin: 0 auto;
`}</style> }
</div> `}</style>
</div>
</ViewProvider>
</LiveStreamingProvider> </LiveStreamingProvider>
</RecordingProvider> </RecordingProvider>
</ChatProvider> </ChatProvider>

View File

@ -26,7 +26,7 @@ export const ChatAside = () => {
if (showAside === CHAT_ASIDE) { if (showAside === CHAT_ASIDE) {
setHasNewMessages(false); setHasNewMessages(false);
} }
}, [showAside, chatHistory.length, setHasNewMessages]); }, [showAside, chatHistory?.length, setHasNewMessages]);
useEffect(() => { useEffect(() => {
if (hasNewMessages && showAside !== CHAT_ASIDE) { if (hasNewMessages && showAside !== CHAT_ASIDE) {
@ -49,7 +49,7 @@ export const ChatAside = () => {
return ( return (
<Aside onClose={() => setShowAside(false)}> <Aside onClose={() => setShowAside(false)}>
<div className="messages-container" ref={chatWindowRef}> <div className="messages-container" ref={chatWindowRef}>
{chatHistory.map((chatItem) => ( {chatHistory?.map((chatItem) => (
<div <div
className={isLocalUser(chatItem.senderID) ? 'message local' : 'message'} className={isLocalUser(chatItem.senderID) ? 'message local' : 'message'}
key={chatItem.id} key={chatItem.id}

View File

@ -2,26 +2,27 @@ import React from 'react';
import { TrayButton } from '@custom/shared/components/Tray'; import { TrayButton } from '@custom/shared/components/Tray';
import { useParticipants } from '@custom/shared/contexts/ParticipantsProvider'; import { useParticipants } from '@custom/shared/contexts/ParticipantsProvider';
import { useUIState, VIEW_MODE_GRID, VIEW_MODE_SPEAKER } from '@custom/shared/contexts/UIStateProvider'; import { VIEW_MODE_GRID, VIEW_MODE_SPEAKER } from '@custom/shared/contexts/UIStateProvider';
import { ReactComponent as IconGridView } from '@custom/shared/icons/grid-md.svg'; import { ReactComponent as IconGridView } from '@custom/shared/icons/grid-md.svg';
import { ReactComponent as IconSpeakerView } from '@custom/shared/icons/speaker-view-md.svg'; import { ReactComponent as IconSpeakerView } from '@custom/shared/icons/speaker-view-md.svg';
import { useView } from '../../contexts/ViewProvider';
export const ViewTray = () => { export const ViewTray = () => {
const { participants, localParticipant } = useParticipants(); const { participants, localParticipant } = useParticipants();
const { viewMode, setPreferredViewMode } = useUIState(); const { view, setView } = useView();
const onViewClick = () => const onViewClick = () =>
setPreferredViewMode(viewMode === VIEW_MODE_SPEAKER ? VIEW_MODE_GRID : VIEW_MODE_SPEAKER); setView(view === VIEW_MODE_SPEAKER ? VIEW_MODE_GRID : VIEW_MODE_SPEAKER);
if (!localParticipant.isOwner) return null; if (!localParticipant.isOwner) return null;
return ( return (
<TrayButton <TrayButton
label={viewMode === VIEW_MODE_GRID ? 'Speaker': 'Grid'} label={view === VIEW_MODE_GRID ? 'Speaker': 'Grid'}
disabled={participants.length < 2} disabled={participants.length < 2}
onClick={onViewClick} onClick={onViewClick}
> >
{viewMode === VIEW_MODE_SPEAKER ? <IconGridView />: <IconSpeakerView />} {view === VIEW_MODE_SPEAKER ? <IconGridView />: <IconSpeakerView />}
</TrayButton> </TrayButton>
); );
}; };

View File

@ -0,0 +1,40 @@
import React, {
createContext,
useContext,
useCallback,
useMemo,
useEffect,
} from 'react';
import { useUIState } from '@custom/shared/contexts/UIStateProvider';
import { useSharedState } from '@custom/shared/hooks/useSharedState';
import PropTypes from 'prop-types';
export const ViewContext = createContext();
export const ViewProvider = ({ children }) => {
const { viewMode, setPreferredViewMode } = useUIState();
const { sharedState, setSharedState } = useSharedState({
initialValues: { viewMode },
});
const view = useMemo(() => sharedState.viewMode, [sharedState.viewMode]);
const setView = useCallback((view) => setSharedState({ viewMode: view }), [setSharedState]);
useEffect(() => {
if (viewMode === sharedState.viewMode) return;
setPreferredViewMode(sharedState.viewMode);
}, [setPreferredViewMode, sharedState.viewMode, viewMode]);
return (
<ViewContext.Provider value={{ view, setView }}>
{children}
</ViewContext.Provider>
);
};
ViewProvider.propTypes = {
children: PropTypes.node,
};
export const useView = () => useContext(ViewContext);