projects/deliberation_at_scale/packages/frontend/components/RoomConnection/WaitingForRoom.tsx (31 lines of code) (raw):
import useChatFlowState from "@/hooks/useChatFlowState";
import useLobby from "@/hooks/useLobby";
import { setFlowStateEntry } from "@/state/slices/flow";
import { LOBBY_FOUND_ROOM_STATE_KEY, LOBBY_WANT_TO_JOIN_ROOM_STATE_KEY } from "@/utilities/constants";
import { useEffect } from "react";
import { useDispatch } from "react-redux";
export default function WaitingForRoom() {
const { canEnterRoom, enterRoom } = useLobby();
const dispatch = useDispatch();
const wantToJoinRoom = useChatFlowState<boolean>({
flowId: 'permission',
stateKey: LOBBY_WANT_TO_JOIN_ROOM_STATE_KEY,
});
// wait until there is a candidate room
useEffect(() => {
if (!canEnterRoom) {
return;
}
dispatch(setFlowStateEntry({
flowId: 'permission',
key: LOBBY_FOUND_ROOM_STATE_KEY,
value: true,
}));
}, [canEnterRoom, dispatch]);
// wait until the user confirmed entering the room
useEffect(() => {
if (!wantToJoinRoom || !canEnterRoom) {
return;
}
enterRoom();
}, [canEnterRoom, enterRoom, wantToJoinRoom]);
return null;
}