created useCallUI hook to simplify cross demo call loop

This commit is contained in:
Jon 2021-06-15 17:32:27 +01:00
parent e47ada8fa4
commit 6166898bfb
6 changed files with 88 additions and 62 deletions

View File

@ -1,77 +1,23 @@
import React, { useCallback, useEffect, useMemo } from 'react';
import Loader from '@dailyjs/shared/components/Loader';
import React, { useMemo } from 'react';
import { useCallState } from '@dailyjs/shared/contexts/CallProvider';
import {
CALL_STATE_ENDED,
CALL_STATE_JOINED,
CALL_STATE_JOINING,
CALL_STATE_LOBBY,
CALL_STATE_NOT_FOUND,
CALL_STATE_NOT_BEFORE,
CALL_STATE_READY,
CALL_STATE_REDIRECTING,
} from '@dailyjs/shared/contexts/useCallMachine';
import { useCallUI } from '@dailyjs/shared/hooks/useCallUI';
import { useRouter } from 'next/router';
import HairCheck from '../HairCheck';
import MessageCard from '../MessageCard';
import Room from '../Room';
import { Modals } from './Modals';
export const App = () => {
const { state, leave } = useCallState();
const router = useRouter();
useEffect(() => {
console.log(`%c🔀 App state changed: ${state}`, `color: gray;`);
}, [state]);
const renderState = useCallback(() => {
// Show loader when state is undefined or ready to join
if (!state || [CALL_STATE_READY, CALL_STATE_JOINING].includes(state)) {
return <Loader />;
}
// Update the UI based on the state of our call
switch (state) {
case CALL_STATE_NOT_FOUND:
router.replace('/not-found');
return null;
case CALL_STATE_NOT_BEFORE:
return (
<MessageCard error header="Cannot join before owner">
This room has `nbf` set, meaning you cannot join the call before the
owner
</MessageCard>
);
case CALL_STATE_LOBBY:
return <HairCheck />;
case CALL_STATE_JOINED:
return <Room onLeave={() => leave()} />;
case CALL_STATE_REDIRECTING:
case CALL_STATE_ENDED:
// Note: you could set a manual redirect here but we'll show just an exit screen
return (
<MessageCard onBack={() => window.location.reload()}>
You have left the call. We hope you had fun!
</MessageCard>
);
default:
break;
}
return (
<MessageCard error header="An error occured">
An unknown error has occured in the call loop. This should not happen!
</MessageCard>
);
}, [leave, router, state]);
const componentForState = useCallUI({
state,
room: () => <Room onLeave={() => leave()} />,
});
// Memoize children to avoid unnecassary renders from HOC
return useMemo(
() => (
<div className="app">
{renderState()}
{componentForState()}
<Modals />
<style jsx>{`
color: white;
@ -86,7 +32,7 @@ export const App = () => {
`}</style>
</div>
),
[renderState]
[componentForState]
);
};

View File

@ -0,0 +1,80 @@
import React, { useCallback, useEffect } from 'react';
import Loader from '@dailyjs/shared/components/Loader';
import MessageCard from '@dailyjs/shared/components/MessageCard';
import {
CALL_STATE_ENDED,
CALL_STATE_JOINED,
CALL_STATE_JOINING,
CALL_STATE_LOBBY,
CALL_STATE_NOT_FOUND,
CALL_STATE_NOT_BEFORE,
CALL_STATE_READY,
CALL_STATE_REDIRECTING,
} from '@dailyjs/shared/contexts/useCallMachine';
import { useRouter } from 'next/router';
import HairCheck from '../components/HairCheck';
export const useCallUI = ({
state,
room,
haircheck,
redirectUrl,
notFoundRedirect = 'not-found',
}) => {
const router = useRouter();
useEffect(() => {
console.log(`%c🔀 App state changed: ${state}`, `color: gray;`);
}, [state]);
const renderByState = useCallback(() => {
// Show loader when state is undefined or ready to join
if (!state || [CALL_STATE_READY, CALL_STATE_JOINING].includes(state)) {
return <Loader />;
}
// Update the UI based on the state of our call
switch (state) {
case CALL_STATE_NOT_FOUND:
router.replace(notFoundRedirect);
return null;
case CALL_STATE_NOT_BEFORE:
return (
<MessageCard error header="Cannot join before owner">
This room has `nbf` set, meaning you cannot join the call before the
owner
</MessageCard>
);
case CALL_STATE_LOBBY:
return haircheck ? haircheck() : <HairCheck />;
case CALL_STATE_REDIRECTING:
window.location = redirectUrl;
break;
case CALL_STATE_JOINED:
return room ? (
room()
) : (
<MessageCard error header="No room component declared" />
);
case CALL_STATE_ENDED:
// Note: you could set a manual redirect here but we'll show just an exit screen
return (
<MessageCard onBack={() => window.location.reload()}>
You have left the call. We hope you had fun!
</MessageCard>
);
default:
break;
}
return (
<MessageCard error header="An error occured">
An unknown error has occured in the call loop. This should not happen!
</MessageCard>
);
}, [state, notFoundRedirect, redirectUrl, haircheck, room, router]);
return renderByState;
};
export default useCallUI;