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

View File

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

View File

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