User can rejoin ongoing meeting, but embedded meeting view doesn’t appear

Description
I join the video successfully, left the meeting and then rejoin again. I’m able to rejoin as I can see in other’s zoom client but on my screen I can’t see the embed meeting.

Browser Console Error
Use the attachVideo method to render the video. The renderVideo method is deprecated. See the reference for details.
GL_INVALID_VALUE : glViewport: negative width/height
WebGL: too many errors, no more errors will be reported to the console for this context.

Which Web Meeting SDK version?
meetingsdk": “^3.12.0”
“react”: “^18.2.0”,
“react-dom”: “^18.2.0”,
“react-router-dom”: “^6.16.0”,

Meeting SDK Code Snippets

import React, { useEffect, useRef, useState } from 'react';
import ZoomMtgEmbedded from "@zoom/meetingsdk/embedded";
import * as ReactDOM from 'react-dom/client';
import { getZoomMeetingCredentials, getZoomSignature } from '../services/meetings';

/**
 * Component for embedding Zoom meetings
 * Based on Zoom Meeting SDK
 */
const ZoomMeetingEmbed = ({
  meetingId,
  userName = 'Guest User',
  userEmail = ''
}) => {
  const meetingSDKRef = useRef(null);
  const clientRef = useRef(null);
  const isInitializedRef = useRef(false);
  const [error, setError] = useState(null);
  const [loading, setLoading] = useState(true);

  // Suppress React key warning from Zoom SDK
  useEffect(() => {
    // Store original console.error
    const originalConsoleError = console.error;

    // Replace console.error with filtered version
    console.error = (...args) => {
      // Don't log React key warnings from the Zoom SDK
      if (args[0] && typeof args[0] === 'string' &&
        (args[0].includes('Each child in a list should have a unique "key" prop') ||
          args[0].includes('Warning: Encountered two children with the same key'))) {
        return;
      }
      originalConsoleError(...args);
    };

    // Restore original on unmount
    return () => {
      console.error = originalConsoleError;
    };
  }, []);

  useEffect(() => {
    if (!meetingId) {
      setError('Meeting ID is required');
      setLoading(false);
      return;
    }

    // Patch React DOM createRoot for Zoom SDK
    // This handles the warning about importing from "react-dom" instead of "react-dom/client"
    if (window.React === undefined) {
      window.React = React;
      window.ReactDOM = ReactDOM;
    }

    // Create the Zoom client
    if (!clientRef.current) {
      try {
        clientRef.current = ZoomMtgEmbedded.createClient();
      } catch (err) {
        console.error('Error creating Zoom client:', err);
        setError('Failed to create Zoom client: ' + err.message);
        setLoading(false);
        return;
      }
    }

    // Initialize the meeting SDK and join the meeting
    const initializeAndJoinMeeting = async () => {
      setError(null);
      setLoading(true);

      try {
        // Only initialize once
        if (!isInitializedRef.current && meetingSDKRef.current) {
          console.log('Initializing Zoom Meeting SDK...');
          await clientRef.current.init({
            zoomAppRoot: meetingSDKRef.current,
            language: 'en-US',
            patchJsMedia: true,
            leaveOnPageUnload: true,
          });
          isInitializedRef.current = true;
          console.log('Zoom Meeting SDK initialized successfully');
        }

        // Step 1: Get meeting credentials
        console.log('Fetching meeting credentials for meeting ID:', meetingId);
        const meetingCredentials = await getZoomMeetingCredentials(meetingId);
        console.log('Meeting credentials response:', meetingCredentials);

        if (!meetingCredentials || !meetingCredentials.meetingNumber) {
          throw new Error('Failed to fetch valid meeting credentials');
        }

        // Step 2: Get signature
        console.log('Generating signature for meeting number:', meetingCredentials.meetingNumber);
        const signatureResponse = await getZoomSignature(meetingCredentials.meetingNumber, 0);
        console.log('Signature response:', signatureResponse);

        if (!signatureResponse || !signatureResponse.signature || !signatureResponse.sdkKey) {
          throw new Error('Failed to generate meeting signature');
        }

        // Create join parameters with fetched credentials
        const joinParams = {
          sdkKey: String(signatureResponse.sdkKey),
          signature: String(signatureResponse.signature),
          meetingNumber: String(meetingCredentials.meetingNumber),
          password: meetingCredentials.password ? String(meetingCredentials.password) : '',
          userName: String(userName),
          userEmail: userEmail ? String(userEmail) : '',
          tk: '',
          zak: '',
        };

        console.log('Joining meeting with params:', {
          meetingNumber: joinParams.meetingNumber,
          sdkKey: 'Valid',
          signature: 'Valid',
          password: joinParams.password ? 'Present' : 'Not provided',
          userName: joinParams.userName
        });

        // Join the meeting
        // Add a small delay to ensure SDK is fully initialized
        setTimeout(async () => {
          try {
            await clientRef.current.join(joinParams);
            console.log('Joined Zoom meeting successfully');
          } catch (joinError) {
            console.error('Error joining meeting:', joinError);
            // setError('Failed to join meeting: ' + joinError.message);
          } finally {
            setLoading(false);
          }
        }, 500);
      } catch (error) {
        console.error('Error in meeting setup:', error);
        setError('Failed to set up meeting: ' + error.message);
        setLoading(false);
      }
    };

    initializeAndJoinMeeting();

    // Cleanup function
    return () => {
      if (clientRef.current && isInitializedRef.current) {
        try {
          // Use the correct method to leave the meeting
          if (typeof clientRef.current.leaveMeeting === 'function') {
            clientRef.current.leaveMeeting();
          } else if (typeof clientRef.current.leave === 'function') {
            clientRef.current.leave();
          } else {
            // SDK might offer another method or approach to clean up
            console.log('No leave method found on Zoom client, meeting may have already ended');
          }
        } catch (error) {
          console.error('Error leaving Zoom meeting:', error);
        }
      }
    };
  }, [meetingId, userName, userEmail]);

  return (
    <div className="zoom-meeting-container">
      {error && (
        <div className="bg-red-100 border border-red-400 text-red-700 px-4 py-3 rounded mb-4">
          <p className="font-bold">Error</p>
          <p>{error}</p>
        </div>
      )}
      {loading && (
        <div className="flex justify-center items-center py-6">
          <svg className="animate-spin h-8 w-8 text-blue-600 mr-3" fill="none" viewBox="0 0 24 24">
            <circle className="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" strokeWidth="4"></circle>
            <path className="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>
          </svg>
          <span>Connecting to meeting...</span>
        </div>
      )}
      <div
        id="zmmtg-root"
        ref={meetingSDKRef}
        className="w-full h-full min-h-[600px]"
      ></div>
    </div>
  );
};

export default ZoomMeetingEmbed; 

To Reproduce(If applicable)
Steps to reproduce the behavior:

  1. Join a meeting as a participant.
  2. Leave the meeting.
  3. Now rejoin the meeting
  4. We are unable to view the embeded meeting video. The page is blank.

Device (please complete the following information):

  • Device: Macbook Pro
  • OS: Ventura 13.7.4
  • Browser: Chrome
  • Browser Version: Version 134.0.6998.118 (Official Build) (x86_64)

Additional context
Add any other context about the problem here.

Hey @Sumved
Thanks for reaching out to us!
Are you still experiencing this issue? Are you able to see the embedded meeting if you refresh the browser once you rejoin?

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.