added view mode to UIState
This commit is contained in:
parent
7723d0c86c
commit
236e91d302
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
@ -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,
|
||||||
}}
|
}}
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue