added view mode to UIState

This commit is contained in:
Jon 2021-07-22 12:14:17 +01:00
parent 7723d0c86c
commit 236e91d302
4 changed files with 69 additions and 13 deletions

View File

@ -5,6 +5,7 @@ import FlyingEmojiOverlay from '@dailyjs/flying-emojis/components/FlyingEmojis';
import { LiveStreamingProvider } from '@dailyjs/live-streaming/contexts/LiveStreamingProvider'; import { LiveStreamingProvider } from '@dailyjs/live-streaming/contexts/LiveStreamingProvider';
import { RecordingProvider } from '@dailyjs/recording/contexts/RecordingProvider'; import { RecordingProvider } from '@dailyjs/recording/contexts/RecordingProvider';
import { ChatProvider } from '@dailyjs/text-chat/contexts/ChatProvider'; import { ChatProvider } from '@dailyjs/text-chat/contexts/ChatProvider';
import { ClassStateProvider } from '../../context/ClassStateProvider';
import Room from '../Room'; import Room from '../Room';
/** /**
@ -15,12 +16,14 @@ export const LiveFitnessApp = () => (
<ChatProvider> <ChatProvider>
<LiveStreamingProvider> <LiveStreamingProvider>
<RecordingProvider> <RecordingProvider>
<FlyingEmojiOverlay /> <ClassStateProvider>
<App <FlyingEmojiOverlay />
customComponentForState={{ <App
room: () => <Room />, customComponentForState={{
}} room: () => <Room />,
/> }}
/>
</ClassStateProvider>
</RecordingProvider> </RecordingProvider>
</LiveStreamingProvider> </LiveStreamingProvider>
</ChatProvider> </ChatProvider>

View File

@ -0,0 +1,37 @@
import React, { createContext, useContext, useEffect, useState } from 'react';
import { useParticipants } from '@dailyjs/shared/contexts/ParticipantsProvider';
import PropTypes from 'prop-types';
export const CLASS_STATE_PRE_LOBBY = 'pre-lobby';
export const CLASS_STATE_IN_SESSION = 'in_session';
export const CLASS_STATE_POST_LOBBY = 'post-lobby';
const ClassStateContext = createContext();
export const ClassStateProvider = ({ children }) => {
const [classState, setClassState] = useState(CLASS_STATE_PRE_LOBBY);
const { isOwner } = useParticipants();
useEffect(() => {
console.log('🧘 Class provider initialised');
}, []);
return (
<ClassStateContext.Provider
value={{
classState,
setClassState,
}}
>
{children}
</ClassStateContext.Provider>
);
};
ClassStateProvider.propTypes = {
children: PropTypes.node,
};
export const useClassState = () => useContext(ClassStateContext);

View File

@ -1,15 +1,28 @@
import React, { useCallback, createContext, useContext, useState } from 'react'; import React, {
useCallback,
createContext,
useContext,
useState,
useEffect,
} from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { useDeepCompareMemo } from 'use-deep-compare'; import { useDeepCompareMemo } from 'use-deep-compare';
export const UIStateContext = createContext(); export const UIStateContext = createContext();
export const VIEW_MODE_GRID = 'grid';
export const VIEW_MODE_SPEAKER = 'speaker';
export const VIEW_MODE_MOBILE = 'mobile';
export const UIStateProvider = ({ export const UIStateProvider = ({
asides = [], asides = [],
modals = [], modals = [],
customTrayComponent, customTrayComponent,
children, children,
}) => { }) => {
const [preferredViewMode, setPreferredViewMode] = useState(VIEW_MODE_SPEAKER);
const [viewMode, setViewMode] = useState(preferredViewMode);
const [isShowingScreenshare, setIsShowingScreenshare] = useState(false);
const [showAside, setShowAside] = useState(); const [showAside, setShowAside] = useState();
const [activeModals, setActiveModals] = useState({}); const [activeModals, setActiveModals] = useState({});
const [customCapsule, setCustomCapsule] = useState(); const [customCapsule, setCustomCapsule] = useState();
@ -42,6 +55,13 @@ export const UIStateProvider = ({
setShowAside(null); setShowAside(null);
}, []); }, []);
useEffect(() => {
if (isShowingScreenshare) {
setViewMode(VIEW_MODE_SPEAKER);
}
setViewMode(preferredViewMode);
}, [isShowingScreenshare, preferredViewMode]);
return ( return (
<UIStateContext.Provider <UIStateContext.Provider
value={{ value={{
@ -55,6 +75,8 @@ export const UIStateProvider = ({
toggleAside, toggleAside,
showAside, showAside,
setShowAside, setShowAside,
setIsShowingScreenshare,
setPreferredViewMode,
customCapsule, customCapsule,
setCustomCapsule, setCustomCapsule,
}} }}

View File

@ -15,7 +15,6 @@ import {
} from '@dailyjs/shared/contexts/useCallMachine'; } from '@dailyjs/shared/contexts/useCallMachine';
import { useRouter } from 'next/router'; import { useRouter } from 'next/router';
import HairCheck from '../components/HairCheck'; import HairCheck from '../components/HairCheck';
import { useUIState } from '../contexts/UIStateProvider';
export const useCallUI = ({ export const useCallUI = ({
state, state,
@ -26,7 +25,6 @@ export const useCallUI = ({
notFoundRedirect = 'not-found', notFoundRedirect = 'not-found',
}) => { }) => {
const router = useRouter(); const router = useRouter();
const { closeAside, closeModal } = useUIState();
useEffect(() => { useEffect(() => {
console.log(`%c🔀 App state changed: ${state}`, `color: gray;`); console.log(`%c🔀 App state changed: ${state}`, `color: gray;`);
@ -38,10 +36,6 @@ export const useCallUI = ({
return <Loader />; return <Loader />;
} }
// Make sure we hide any active asides or modals when the state changes
closeAside();
closeModal();
// Update the UI based on the state of our call // Update the UI based on the state of our call
switch (state) { switch (state) {
case CALL_STATE_NOT_FOUND: case CALL_STATE_NOT_FOUND: