import React, { useCallback, useEffect, useMemo } from 'react'; import Loader from '@dailyjs/shared/components/Loader'; 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 { 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 ; } // 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 ( This room has `nbf` set, meaning you cannot join the call before the owner ); case CALL_STATE_LOBBY: return ; case CALL_STATE_JOINED: return 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 ( window.location.reload()}> You have left the call. We hope you had fun! ); default: break; } return ( An unknown error has occured in the call loop. This should not happen! ); }, [leave, router, state]); // Memoize children to avoid unnecassary renders from HOC return useMemo( () => (
{renderState()}
), [renderState] ); }; export default App;