From b1dc5868b2007f8802c9aa71d4ce5893646c6bc9 Mon Sep 17 00:00:00 2001 From: Kimberlee Johnson Date: Tue, 4 Jan 2022 15:01:06 -0800 Subject: [PATCH 1/3] First pass at creating a multipleWaiting state value and memoizing notification accordingly --- .../WaitingRoom/WaitingRoomNotification.js | 102 +++++++++++------- custom/shared/contexts/WaitingRoomProvider.js | 3 + 2 files changed, 66 insertions(+), 39 deletions(-) diff --git a/custom/shared/components/WaitingRoom/WaitingRoomNotification.js b/custom/shared/components/WaitingRoom/WaitingRoomNotification.js index 3dee756..5ccbc38 100644 --- a/custom/shared/components/WaitingRoom/WaitingRoomNotification.js +++ b/custom/shared/components/WaitingRoom/WaitingRoomNotification.js @@ -1,5 +1,4 @@ -import React, { useEffect, useState } from 'react'; - +import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { useCallState } from '../../contexts/CallProvider'; import { useWaitingRoom } from '../../contexts/WaitingRoomProvider'; import { ReactComponent as IconWaiting } from '../../icons/add-person-lg.svg'; @@ -14,9 +13,70 @@ export const WaitingRoomNotification = () => { showModal, setShowModal, waitingParticipants, + multipleWaiting, } = useWaitingRoom(); const [showNotification, setShowNotification] = useState(false); + /** + * Click handlers passed to render functions + */ + const handleViewAllClick = useCallback(() => { + setShowModal(true); + setShowNotification(false); + }, [setShowModal]); + + const handleAllowClick = useCallback(() => { + grantAccess(waitingParticipants[0].id); + }, [grantAccess, waitingParticipants]); + + const handleDenyClick = useCallback(() => { + denyAccess(multipleWaiting ? 'all' : waitingParticipants[0].id); + }, [denyAccess, waitingParticipants, multipleWaiting]); + + /** + * Render the full participant waiting list + */ + const showMultipleParticipants = useMemo(() => { + return ( + +

+ {waitingParticipants.length} people would like to + join the call +

+ + + + +
+ ); + }, [waitingParticipants, handleDenyClick, handleViewAllClick]); + + /** + * Render the single waiting participant + */ + const showSingleParticipant = useMemo(() => { + return ( + +

+ {waitingParticipants[0]?.name} would like to join the + call +

+ + + + +
+ ); + }, [waitingParticipants, handleAllowClick, handleDenyClick]); + /** * Show notification when waiting participants change. */ @@ -47,48 +107,12 @@ export const WaitingRoomNotification = () => { if (!showNotification || waitingParticipants.length === 0) return null; - const hasMultiplePeopleWaiting = waitingParticipants.length > 1; - - const handleViewAllClick = () => { - setShowModal(true); - setShowNotification(false); - }; - const handleAllowClick = () => { - grantAccess(waitingParticipants[0].id); - }; - const handleDenyClick = () => { - denyAccess(hasMultiplePeopleWaiting ? 'all' : waitingParticipants[0].id); - }; - return ( - - - {hasMultiplePeopleWaiting - ? waitingParticipants.length - : waitingParticipants[0].name} - - {hasMultiplePeopleWaiting - ? ` people would like to join the call` - : ` would like to join the call`} - - {hasMultiplePeopleWaiting ? ( - - ) : ( - - )} - - - + {multipleWaiting ? showMultipleParticipants : showSingleParticipant} ); }, [denied]); @@ -329,16 +340,6 @@ export const HairCheck = () => { grid-column-gap: var(--spacing-xs); } - .waiting { - display: flex; - align-items: center; - justify-content: center; - } - - .waiting span { - margin-left: var(--spacing-xxs); - } - .logo { position: absolute; top: var(--spacing-sm); diff --git a/custom/shared/contexts/WaitingRoomProvider.js b/custom/shared/contexts/WaitingRoomProvider.js index b99ab51..f6498de 100644 --- a/custom/shared/contexts/WaitingRoomProvider.js +++ b/custom/shared/contexts/WaitingRoomProvider.js @@ -3,6 +3,7 @@ import React, { useCallback, useContext, useEffect, + useMemo, useState, } from 'react'; import PropTypes from 'prop-types'; @@ -13,7 +14,6 @@ const WaitingRoomContext = createContext(null); export const WaitingRoomProvider = ({ children }) => { const { callObject } = useCallState(); const [waitingParticipants, setWaitingParticipants] = useState([]); - const [multipleWaiting, setMultipleWaiting] = useState(); const [showModal, setShowModal] = useState(false); const handleWaitingParticipantEvent = useCallback(() => { @@ -32,9 +32,12 @@ export const WaitingRoomProvider = ({ children }) => { }; }) ); - setMultipleWaiting(waiting.length > 1); }, [callObject]); + const multipleWaiting = useMemo(() => waitingParticipants.length > 1, [ + waitingParticipants, + ]); + useEffect(() => { if (waitingParticipants.length === 0) { setShowModal(false);