Skip to main content

Use a PIN

In the previous tutorial we have learnt how to join an unprotected conference, but in day to day usage, we will encounter some conferences that are protected by a PIN (a security passcode). In this lesson we will learn how join protected conferences by following the next steps:

  • Identify when a conference is protected by a PIN.
  • Enter the conference with the PIN provided by the user.

You can download the starter code from Step.02-Exercise-Use-a-pin.

App component

To implement this feature, we only have to modify the file src/App.tsx, since the rest of the pieces are already on place.

The first step is to import a component that will display a form to enter the PIN:

import {Pin} from './components/Pin/Pin';

Next, we will define two new states that indicate if the user can or have to enter a PIN (PinOptional and PinRequired):

enum ConnectionState {
Disconnected,
Connecting,
Connected,
PinRequired,
PinOptional,
Error,
}

Now we define some state variables that will contain the info that the user needs to enter:

const [nodeDomain, setNodeDomain] = useState<string>('');
const [conferenceAlias, setConferenceAlias] = useState<string>('');
const [displayName, setDisplayName] = useState<string>('');

The meaning of each one these parameters is the following:

  • nodeDomain: It indicates the domain or IP of the Pexip Conference Node that we will use to connect.
  • conferenceAlias: This parameter refers to the conference that the user will connect. Sometimes it's also called VMR (Virtual Meeting Room).
  • displayName: Indicates the name to be displayed in the participants list.

Now we will modify the handleStartConference function and save the values of these parameters in the state variables:

const handleStartConference = async (
nodeDomain: string,
conferenceAlias: string,
displayName: string
): Promise<void> => {
setNodeDomain(nodeDomain);
setConferenceAlias(conferenceAlias);
setDisplayName(displayName);
...
};

And inside the same function, we will modify the handler for the error 403 to only display a warning:

case 403: {
console.warn('The conference is protected by PIN');
break;
}

Now we will define the function that will be called once the user enters their PIN:

const handleSetPin = async (pin: string): Promise<void> => {
const currentPin = pin !== '' ? pin : 'none';
infinityClient.setPin(currentPin);
setConnectionState(ConnectionState.Connecting);
await handleStartConference(nodeDomain, conferenceAlias, displayName);
};

This function will change the connection state to Connecting and connect to the conference with the provided PIN.

Now we need to attach a handler to the signal onPinRequired:

useEffect(() => {
...
infinityClientSignals.onPinRequired.add(({hasHostPin, hasGuestPin}) => {
if (hasHostPin && hasGuestPin) {
setConnectionState(ConnectionState.PinRequired);
} else {
setConnectionState(ConnectionState.PinOptional);
}
});
...
}, []);

This function will receive two parameter that indicate if the host or guest should enter a PIN. Depending on these values, we change the connection state to PinRequired or PinOptional.

Now we will make use of a component that we have created previously. This component will display a panel in which the user can enter their PIN:

let component;
switch (connectionState) {
case ConnectionState.PinRequired:
component = <Pin onSubmit={ handleSetPin } required={true}/>;
break;
case ConnectionState.PinOptional:
component = <Pin onSubmit={ handleSetPin } required={false}/>;
break;
...
}

You will have noticed that we pass an additional property to the component called required. This property indicates if the PIN can be left blank.

Run the app

Before testing this feature, you should use the Pexip Management Node to create a new VMR (Virtual Meeting Room) and set a PIN. Once you try to enter into that conference, you will see a new panel asking for it, and if you enter the right PIN, you will go inside the conference.

You can compare your code with the solution in Step.02-Solution-Use-a-pin. You can also check the differences with the previous lesson in the git diff.

PIN