Ringing calls

The Call object provides several options to ring and notify users about a call.

Create call

To create a ring call, we need to set the ring flag to true and provide the list of members we want to call. It is important to note that the caller should also be included in the list of members.

await client.call("default", "test-outgoing-call").getOrCreate({
  ring: true,
  data: {
    members: [{ user_id: "myself" }, { user_id: "my friend" }],
  },
});

Call creation options

The following options are supported when creating a call:

OptionDescriptionDefault
membersA list of members to add to this call. You can specify the role and custom data on these members-
customAny custom data you want to store-
settingsYou can overwrite certain call settings for this specific call. This overwrites the call type standard settings-
startsAtWhen the call will start. Used for calls scheduled in the future, livestreams, audio rooms etc-
teamRestrict the access to this call to a specific team-
ringIf you want the call to ring for each memberfalse
notifyIf you want the call to nofiy each member by sending push notification.false

This step will start the signaling flow. The caller will automatically join the call once the first callee accepts the call. The call will automatically stop if every callee rejects the call.

Watch for incoming and outgoing calls

The easiest way to watch for incoming and outgoing calls is to use the useCalls hook.

import { useCalls, CallingState } from "@stream-io/video-react-sdk";

export const MyCallUI = () => {
  const calls = useCalls();

  // handle incoming ring calls
  const incomingCalls = calls.filter(
    (call) =>
      call.isCreatedByMe === false &&
      call.state.callingState === CallingState.RINGING,
  );

  const [incomingCall] = incomingCalls;
  if (incomingCall) {
    // render the incoming call UI
    return <MyIncomingCallUI call={incomingCall} />;
  }

  // handle outgoing ring calls
  const outgoingCalls = calls.filter(
    (call) =>
      call.isCreatedByMe === true &&
      call.state.callingState === CallingState.RINGING,
  );

  const [outgoingCall] = outgoingCalls;
  if (outgoingCall) {
    // render the outgoing call UI
    return <MyOutgoingCallUI call={outgoingCall} />;
  }

  return null;
};

You can also check the sample integration in the following CodeSandboxes:

Canceling an outgoing call

A caller can cancel an outgoing call until the first callee accepts the call. Canceling a call will stop the signaling flow.

await call.leave({ reject: true, reason: "cancel" });

Please note that calling call.leave() after joining the call won’t stop the signaling flow.

Rejecting an incoming call

A callee can accept or reject an incoming call. To reject the call:

await call.leave({ reject: true, reason: "decline" });

Accepting a call

A callee can accept or reject an incoming call. To accept and join the call:

await call.join();

Please note that it’s possible to join multiple calls. If you only want to allow one active call, you must leave joined calls before accepting an incoming call.

Leave call

To leave a joined call, you can use the leave method:

await call.leave();

End call

Ending a call requires a special permission. This action terminates the call for everyone.

await call.endCall();

Notifying

In some cases, you just want to notify users that you joined a call, instead of ringing. To do this, you should use the notify option:

await call.getOrCreate({ notify: true });

When notify is true, a regular push notification will be sent to all the members. This can be useful for livestreams apps or huddles.

Similarly to ringing, you can use the get method if you are sure that the call exists:

await call.get({ notify: true });
© Getstream.io, Inc. All Rights Reserved.