Create room with multiple users using firebase

i am trying to create a room video call something like Whatsapp with firebase as signalisation server for two users it works perfect as expected but when a third user join everything stop working

if the user A the first who join and the user B the second until the user C join everything work fine but when C join user A freeze and lost user B connection and B share screen with C but also sometimes freezing

here is my code

here is my join function

const joinRoom = async () => {
    const roomRef = await firestore().collection('meets').doc(params.callId);

    roomRef
      .collection('users')
      .add({name, type: 'join'})
      .then(() => {
        roomRef
          .collection('users')
          .get()
          .then(async querySnapshot => {
            if (querySnapshot.empty) {
              console.log('EMPTY');
            } else {
              querySnapshot.forEach(async snap => {
                if (snap.data().name !== name && snap.data().type === 'join') {
                  // data.push(snap.data().name);
                  await creatOffer(snap.data().name);
                }
                // if (data.length > 0) {
                //   Promise.all(data).then(async user => {
                //     return await creatOffer(user);
                //   });
                // }
              });
            }
          });
      });

    //     // listen on any new offers
    roomRef.collection('offers').onSnapshot(data => {
      data.docChanges().forEach(async change => {
        if (change.type === 'added') {
          // console.log('changes', change.doc.data());
          if (change.doc.data().to === name) {
            await createAnswer(change.doc.data().from, change.doc.data().offer);
          }
        }
      });
    });

    //listen to answers
    roomRef.collection('answers').onSnapshot(async snapshot => {
      snapshot.docChanges().forEach(async change => {
        if (change.type === 'added') {
          const pc = pcPeers[change.doc.data().from];
          if (change.doc.data().to === name) {
            const rtcSessionDescription = new RTCSessionDescription(
              change.doc.data().answer,
            );

            if (pc && rtcSessionDescription) {
              await pc.setRemoteDescription(rtcSessionDescription);
            }
          }
        }
      });
    });

    //listen to candidate change
    roomRef.collection('candidates').onSnapshot(async snapshot => {
      snapshot.docChanges().forEach(async change => {
        // console.log('answers', change.doc.data());
        if (change.type === 'added') {
          console.log('added', Platform.OS);
          if (change.doc.data().to === name) {
            const pc = pcPeers[change.doc.data().from];

            // console.log(pc);

            if (pc) {
              await pc.addIceCandidate(
                new RTCIceCandidate(change.doc.data().candidate),
              );
            }
          }
        }
      });
    });
  };

and create offer

const creatOffer = async to => {
    try {
      const {roomRef, localPC} = await initializePeer(to);

      const offer = await localPC.createOffer();
      // console.log('offer', offer);
      if (offer) {
        await localPC.setLocalDescription(offer);

        await roomRef.collection('offers').add({from: name, to, offer});
      }
      pcPeers = {...pcPeers, [to]: localPC};
    } catch (e) {
      console.log(e);
    }
  };

and here is create answer

 const createAnswer = async (from, offer) => {
    try {
      const {localPC, roomRef} = await initializePeer(from);

      await localPC.setRemoteDescription(new RTCSessionDescription(offer));

      const answer = await localPC.createAnswer();
      await localPC.setLocalDescription(answer);

      // await checkIfAnswerAlreadyCreated(from, name);

      await roomRef.collection('answers').add({from: name, to: from, answer});

      pcPeers = {...pcPeers, [from]: localPC};
    } catch (e) {
      console.log(e);
    }
  };

and here is how i initialise a peer

const initializePeer = async (to: string) => {
    const initialStream = await initLocalStream();

    const localPC = new RTCPeerConnection(configuration);
    await localPC.addStream(initialStream);
    setLocalStream(initialStream);

    const roomRef = await firestore().collection('meets').doc(params.callId);

    const collection = roomRef.collection('candidates');

    localPC.onicecandidate = async e => {
      if (!e.candidate) {
        return;
      }
      // console.log('canditates', Platform.OS);
      const state = localPC.iceGatheringState;

      if (state !== 'complete') {
        await collection.add({
          from: name,
          candidate: e.candidate.toJSON(),
          to,
          date: new Date(),
        });
      } else {
        Alert.alert('tes');
      }
      // InCallManager.setForceSpeakerphoneOn(true);
      // InCallManager.setSpeakerphoneOn(true);
    };

    localPC.onsignalingstatechange = async event => {
      // when the signal state become stable record the data and stop ringback

      if (event.target.signalingState === 'stable') {
        if (Platform.OS === 'ios') {
          localStream?.getVideoTracks().forEach(track => {
            //For ios to trigger the camera on
            track._switchCamera();
            track._switchCamera();
          });
        }
      }
    };
    localPC.onaddstream = e => {
      if (e?.stream) {
        // console.log(
        //   `RemotePC received the stream call ${Platform.OS}_${Platform.Version}`,
        //   e?.stream,
        // );

        console.log(Platform.OS, ' ', Platform.Version);
        if (remoteStream === null) {
          // Alert.alert('stream 1');
          setRemoteStream(e?.stream);
        } else {
          // Alert.alert('stream 2');

          setRemoteStream_(e?.stream);
        }
      }
    };

    return {localPC, roomRef};
  };

can anyone help me with some hints where is tthe problem i’ve created for my self here and thank you