<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Shyam Vijay</title>
    <description>The latest articles on DEV Community by Shyam Vijay (@shyam_vijay).</description>
    <link>https://dev.to/shyam_vijay</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2985184%2F463f21ba-bae5-4a16-8763-4731847f56a0.png</url>
      <title>DEV Community: Shyam Vijay</title>
      <link>https://dev.to/shyam_vijay</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shyam_vijay"/>
    <language>en</language>
    <item>
      <title>I Built a Custom AI Chatbot Using a JS Widget – Here's a Quick Walkthrough</title>
      <dc:creator>Shyam Vijay</dc:creator>
      <pubDate>Thu, 12 Mar 2026 08:22:37 +0000</pubDate>
      <link>https://dev.to/shyam_vijay/i-built-a-custom-ai-chatbot-using-a-js-widget-heres-a-quick-walkthrough-163l</link>
      <guid>https://dev.to/shyam_vijay/i-built-a-custom-ai-chatbot-using-a-js-widget-heres-a-quick-walkthrough-163l</guid>
      <description>&lt;p&gt;&lt;strong&gt;Learn how to build AI chatbot for websites in 48 hours&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For over 5 months, I’ve been thinking about building an AI chatbot for my website.&lt;/p&gt;

&lt;p&gt;I added Noupe once. It was fun and worked well. But in a week I had some amazing ideas to customize the features further for my business. Unfortunately, the features I was looking for were locked behind the enterprise plans.&lt;/p&gt;

&lt;p&gt;And then in over a month, I met one of my old acquaintances. We discussed this project and he shared his idea on building chatbots with JS widgets.&lt;/p&gt;

&lt;p&gt;He used Sendbird. I felt it was a bit pricey for my business currently.&lt;/p&gt;

&lt;p&gt;So I made a list and condensed it to two options: MirrorFly and Vapi. Since I wanted an on-prem solution for the next few years, I picked MirrorFly after reading their guide on &lt;a href="https://www.mirrorfly.com/blog/how-to-build-a-custom-ai-chatbot/" rel="noopener noreferrer"&gt;how to build a custom AI chatbot&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The setup was simple and quick (completed the entire dev in 43 hours). I felt it would be helpful for other developers who have a similar idea and mine and so I made this chatbot tutorial.&lt;/p&gt;

&lt;p&gt;In this guide, I’m sharing the exact steps I followed. You can replicate it or make changes as per your requirements.&lt;/p&gt;

&lt;h2&gt;
  
  
  Part I: Agent Creation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Setting up your agent
&lt;/h3&gt;

&lt;p&gt;To get started with this project, you will need access to MirrorFly’s AI agent dashboard. Contact the team, discuss your requirements and get your credentials.&lt;/p&gt;

&lt;p&gt;Once you get the credentials, log in to the dashboard.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fub77xj5xgy88zqhhs6jd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fub77xj5xgy88zqhhs6jd.png" alt="MirrorFly AI Agent Dashboard"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Inside the dashboard, click the 'Create Agent' button. A popup will appear with 3 different options: Chatbot, Voice Agent and Task Agent. Select 'Task Agent'.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjxfubb5sjuzq1ffg40r0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjxfubb5sjuzq1ffg40r0.png" alt="Select Agent Type in MirrorFly dashboard"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on 'Continue'. This will open a form to collect your chat agent’s name, description, system prompt (guardrails), dataset, agent avatar, language, dataset and the opening message.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F10g6bgtbs7vsl9lw7woz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F10g6bgtbs7vsl9lw7woz.png" alt="MirrorFly Chat Configuration form for creating a new agentic chatbot."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Setting up the Personality &amp;amp; Agent Model
&lt;/h3&gt;

&lt;p&gt;Once you create the AI chatbot,&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set the welcome message that the agent will start the conversation with.&lt;/li&gt;
&lt;li&gt;Next, set the fallback response - the message which the agent will respond with when the agent does not have an accurate/ relevant response.&lt;/li&gt;
&lt;li&gt;Pick a Formality: Casual, neutral or formal&lt;/li&gt;
&lt;li&gt;Choose a tone: Personable, confident, empathetic, engaging, witty or direct.&lt;/li&gt;
&lt;li&gt;Select an AI model - one from OpenAI or Anthropic&lt;/li&gt;
&lt;li&gt;Create an SDK key to start the integration process.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fedaru0sfjgqjavnljitn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fedaru0sfjgqjavnljitn.png" alt="MirrorFly AI chatbot personality and model settings screen."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Agent Training
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Prepare a knowledge base of your product or service details in PDF, CSV or TXT format.
&lt;/li&gt;
&lt;li&gt;Navigate the Datasets
&lt;/li&gt;
&lt;li&gt;Click on ‘Import from file’.
&lt;/li&gt;
&lt;li&gt;Add the file from your local device.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Another option is adding the details from your website.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click on the ‘Sync from website’ button.
&lt;/li&gt;
&lt;li&gt;Add the URL you want to sync the data from.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Since you are creating a RAG-based assistant, your chatbot will fetch data from this dataset rather than generic automated conversations.&lt;/p&gt;

&lt;p&gt;Make sure you update the data periodically to keep the chatbot up-to-date. Other way around, syncing your website will help the chatbot fetch the latest information from your website, without having to manually update the information.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgzcgyjsz7u0qjoy4t2ov.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgzcgyjsz7u0qjoy4t2ov.png" alt="MirrorFly dataset upload screen for training the AI agent."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Workflow Builder
&lt;/h3&gt;

&lt;p&gt;Go to the Workflows tab and set up how your agent talks to users:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Define the conversation flow and decision logic.&lt;/li&gt;
&lt;li&gt;Add API calls and forms to collect user data.&lt;/li&gt;
&lt;li&gt;Set up email triggers and message nodes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Connect Custom Tools
&lt;/h3&gt;

&lt;p&gt;Go to the Custom Tools section to connect external services to your agent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set up a Webhook to send and receive real-time data from third-party apps.&lt;/li&gt;
&lt;li&gt;Connect an MCP Server to give your agent access to external tools and data sources.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fep12p7odxjpuvk7m4nyv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fep12p7odxjpuvk7m4nyv.png" alt="MirrorFly Custom Tools screen with Webhook and MCP Server options."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By the end of this step, your chat agent set up is complete.&lt;/p&gt;

&lt;h2&gt;
  
  
  Part II: Integrating the Agent Into Your Website
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What you’ll need?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your Agent ID from the dashboard.
&lt;/li&gt;
&lt;li&gt;Your website must run on HTTPS for microphone access.
&lt;/li&gt;
&lt;li&gt;Latest versions of Chrome, Edge, or Safari.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Supported Browsers:&lt;/strong&gt; Latest versions of Chrome, Edge, and Safari.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Install the SDK
&lt;/h3&gt;

&lt;p&gt;Copy the script below and add it to your HTML file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://d1nzh49hhug3.cloudfront.net/aiVoiceScript/uat/mirrorfly/mirror-fly-ai.v1.1.1.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Initialize the Agent
&lt;/h3&gt;

&lt;p&gt;Add a container element to your HTML and initialize the SDK with your settings.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;// HTML Container
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"widget"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

// Initialization
MirrorFlyAi.init({
  container: "#widget",
  agentId: "&lt;span class="nt"&gt;&amp;lt;YOUR_AGENT_ID&amp;gt;&lt;/span&gt;",
  title: "Voice Assistant",
  theme: "dark",
  triggerStartCall: true,
  transcriptionEnable: true,
  transcriptionInUi: true,
  chatEnable: true,
  agentConnectionTimeout: 500
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Handle Callbacks
&lt;/h3&gt;

&lt;p&gt;Use callbacks to track the agent's connection status and capture transcriptions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;callbacks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;onTranscription&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Transcription:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;onAgentConnectionState&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Connection:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;onError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SDK Error:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Dynamic Agent Switching
&lt;/h3&gt;

&lt;p&gt;If you're running multiple agents, use this function to switch between them on the fly.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;switchAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newAgentId&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;

  &lt;span class="nx"&gt;MirrorFlyAi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;destroy&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#widget&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;MirrorFlyAi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;container&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#widget&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;agentId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;newAgentId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;triggerStartCall&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And that's it!&lt;/p&gt;

&lt;p&gt;Your AI chatbot is ready!&lt;/p&gt;

&lt;p&gt;Over the past few months, I assumed the process of developing chatbots was some rocket science. But it turned out to be one of the most interesting and straightforward builds I’ve done recently.&lt;/p&gt;

&lt;p&gt;I hope things turn out well with your chatbot ideas for you as well!&lt;/p&gt;

&lt;p&gt;If you have questions about any of the steps or ran into something different in your setup, drop a comment below. Happy to help troubleshoot.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reference
&lt;/h3&gt;

&lt;p&gt;For the complete implementation and source code, check the official repository below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/MirrorFly/White-Label-AI-Chatbot" rel="noopener noreferrer"&gt;https://github.com/MirrorFly/White-Label-AI-Chatbot&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>chatbot</category>
      <category>jswidget</category>
      <category>development</category>
    </item>
    <item>
      <title>How To Integrate Video Calling Feature In React Native Apps</title>
      <dc:creator>Shyam Vijay</dc:creator>
      <pubDate>Fri, 08 Aug 2025 10:04:25 +0000</pubDate>
      <link>https://dev.to/shyam_vijay/how-to-integrate-video-calling-feature-in-react-native-apps-1l6h</link>
      <guid>https://dev.to/shyam_vijay/how-to-integrate-video-calling-feature-in-react-native-apps-1l6h</guid>
      <description>&lt;p&gt;&lt;strong&gt;A step-by-step guide on adding video calls to React Native apps&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The goal of this guide is to demonstrate how to use React Native to build Android and iOS apps the easy way. In this step-by-step tutorial, we will use pre-built APIs and SDKs that can help build our app within a few minutes.&lt;/p&gt;

&lt;p&gt;To get started, let’s first skim through the basics of why we are using React Native, while there are a bunch of languages and frameworks out there. &lt;/p&gt;

&lt;h2&gt;
  
  
  Why Choose React Native For Video Calling APIs?
&lt;/h2&gt;

&lt;p&gt;Not just one or two, React Native have several good reasons why developers like using it to build their apps:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Works on Both iOS and Android:&lt;/strong&gt; Want to build your app for both iPhone and Android? React Native makes it easier for you. You can write the code once and use it to build your app for both devices. And don’t worry about the look and performance. It feels similar and works the same way everywhere. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Build Faster:&lt;/strong&gt; React Native is undoubtedly a great choice of framework if you need to develop apps at a faster rate. You need not worry about making mistakes. RN’s Hot Reloading helps you see the output without restarting your app. The less you reload, the more time you save in development. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lower Costs:&lt;/strong&gt; This is a good deal, Since you’re only building one app for two platforms, and you can develop it more quickly, the total cost of creating and maintaining the app is usually lower than doing two separate native apps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Smooth Performance:&lt;/strong&gt; When you build apps in React Native, it runs smoothly as if it is built directly for iOS or Android. This is because it uses real native components.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Extensive Communication Features:&lt;/strong&gt; With React Native, you can easily add features like video calls, voice chats, and messaging using available APIs and SDKs. It works well for real-time video chat, especially with tools like WebRTC.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Secure and Compliant:&lt;/strong&gt; React Native is a good choice if you prioritize security and privacy. It helps you easily achieve the critical privacy standards and encryption criteria that apps require. &lt;/p&gt;

&lt;h2&gt;
  
  
  Types of React Native Video Call Apps
&lt;/h2&gt;

&lt;p&gt;React Native video call apps can be grouped based on what they’re mainly used for and the tech they rely on. Here’s a simple overview of the common types:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbwsxwtx1jl42n1dormbb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbwsxwtx1jl42n1dormbb.png" alt="Types of React Native Video Call Apps" width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Basic Video Calling Apps
&lt;/h3&gt;

&lt;p&gt;These apps are made for straightforward video chats either one-on-one or in small groups like the ones you use to talk to friends or coworkers. &lt;/p&gt;

&lt;p&gt;They usually rely on services like MirrorFly or Apphitect, which handle the heavy lifting of sending audio and video in real time over the internet. These tools also help manage things like weak signals or dropped connections.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Live Streaming Apps
&lt;/h3&gt;

&lt;p&gt;These are designed for broadcasting live video to big audiences, think social media livestreams or online events. They often come with extras like live comments, emojis, and viewer interaction. &lt;/p&gt;

&lt;p&gt;Services like GetStream can help you add live streaming features into a React Native app easily.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Audio-First Apps with Optional Video
&lt;/h3&gt;

&lt;p&gt;These apps focus mainly on voice conversations, but can include video if needed. They’re built for more organized discussions, with tools like speaker controls, hand-raising, and moderators kind of like online panels, podcasts, or talk shows.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Apps with Built-In Video Calling
&lt;/h3&gt;

&lt;p&gt;Some apps aren’t about video calling at their core, but add it as a feature like a doctor’s appointment in a health app, customer support in an e-commerce app, or face-to-face chats in a dating app. This is when you can go for tools like MirrorFly, Sendbird, or CometChat that offer ready-to-use features for adding video and chat to these types of apps.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Specialized or Niche Apps
&lt;/h3&gt;

&lt;p&gt;These are built for specific needs, for example, virtual classrooms with lesson tools, online conferences with breakout rooms, or work apps with screen sharing and whiteboards. They’re usually customized to fit what their users need most.&lt;/p&gt;

&lt;h2&gt;
  
  
  Must-Have Features When Developing a Video Calling App
&lt;/h2&gt;

&lt;p&gt;If you’re building a video chat app in React Native, there are some key features you’ll want to include to make sure it’s easy to use, secure, and works well. Here’s a breakdown of the essentials, explained in simple terms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Video Calling&lt;/strong&gt;: Lets people have face-to-face conversations over the internet, either one-on-one or in groups, with smooth, high-quality video.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Screen Sharing&lt;/strong&gt;: Allows someone to show what's on their screen to others in real-time during a video call.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;WebRTC Technology&lt;/strong&gt;: The behind-the-scenes tech that makes voice and video calls work quickly and smoothly right in your web browser or mobile app.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Voice Broadcasting&lt;/strong&gt;: Useful for things like webinars, where one person needs to talk to a big group without interruptions or feedback.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Private and Group Chat&lt;/strong&gt;: Lets users send instant messages to individuals or groups, either during a call or separately.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;End-to-End Encryption&lt;/strong&gt;: Protects conversations so that only the people in the chat or call can see or hear what’s being shared.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;User Login and Permissions&lt;/strong&gt;: Makes sure only the right people can sign in, access the app, or join calls.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Push Notifications&lt;/strong&gt;: Sends alerts when there’s an incoming call, a missed call, or a new message.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Message Tracking&lt;/strong&gt;:  Lets users see if their messages were delivered and read in a chat.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Chatbots or AI Helpers&lt;/strong&gt;: Can help automate things like joining a call, booking meetings, or answering common questions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;File and Media Sharing&lt;/strong&gt;: Lets users send things like documents, images, or slides during or outside of calls.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Works on All Devices&lt;/strong&gt;: The app runs smoothly on phones, tablets, and computers, no matter the platform.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How A Video Call Works In A React Native App
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frk0mffzrpdtqkqlz7cpq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frk0mffzrpdtqkqlz7cpq.png" alt="How A Video Call Works In A React Native App" width="800" height="951"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Caller Starts the Call
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The person who wants to make the call taps a button in the app.&lt;/li&gt;
&lt;li&gt;The app uses a tool called CallKeep to show the system’s calling screen (like a regular phone call).&lt;/li&gt;
&lt;li&gt;The app also tells Firebase that a call has started.&lt;/li&gt;
&lt;li&gt;Firebase then sends a VoIP push notification to the person being called to let their phone know a call is coming in.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Receiver Gets the Call
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The person receiving the call sees a ringing screen pop up on their phone.&lt;/li&gt;
&lt;li&gt;CallKeep is used again to show this incoming call screen.&lt;/li&gt;
&lt;li&gt;If they choose to answer, they’re connected to a Call room, which is where the video/audio call actually happens.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Both Users Join the Call
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;After the receiver accepts, the app tells Firebase that the call has been answered.&lt;/li&gt;
&lt;li&gt;The original caller is also connected to the same Call room.&lt;/li&gt;
&lt;li&gt;Now, both users are in the same virtual space and can see and hear each other.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Ending the Call
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;If the receiver hangs up, the app tells CallKeep to close the call screen.&lt;/li&gt;
&lt;li&gt;The receiver leaves the Call room.&lt;/li&gt;
&lt;li&gt;Firebase is updated when the call ends, and it sends a regular push notification (not VoIP) to the caller’s device.&lt;/li&gt;
&lt;li&gt;The caller’s app then ends the call on their end too and disconnects from the Call room.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  💡 Quick Tips for Developers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Keep UUIDs Consistent&lt;/strong&gt;&lt;br&gt;
Every call gets its own unique ID (called a UUID). That same ID should be used throughout the entire call process. Only create a new one if it's a brand-new call.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Only One VoIP Push Per Call&lt;/strong&gt;&lt;br&gt;
When starting a call, send just one VoIP push notification to the receiver. Do not send one to end the call. Use a regular push notification instead. Apple enforces this strictly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Always Report Calls to CallKeep&lt;/strong&gt;&lt;br&gt;
Whenever your app receives a VoIP push, report the incoming call using CallKeep. When the call ends, report that too using the same UUID.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ask for Permissions&lt;/strong&gt;&lt;br&gt;
Before the call starts, your app needs to ask users for permission to use the camera and microphone.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Listen for Events&lt;/strong&gt;&lt;br&gt;
Your app should listen for important events such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Incoming push notifications
&lt;/li&gt;
&lt;li&gt;When the user answers or ends the call
&lt;/li&gt;
&lt;li&gt;Other call-related actions&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Once these events have occurred, remove the listeners so they are not left running in the background.&lt;/p&gt;

&lt;h3&gt;
  
  
  Handle Tricky Situations
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;If the person being called is already on another call, use &lt;code&gt;checkIfBusy()&lt;/code&gt; to notify the caller.&lt;/li&gt;
&lt;li&gt;You can place calls on hold using &lt;code&gt;setOnHold()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;On Android, if the app is in the background or not running, use headless tasks to properly handle ending or rejecting calls.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step-By-Step Guide: How To Build A React Native Video Calling App
&lt;/h2&gt;

&lt;p&gt;In this tutorial, we will use a &lt;a href="https://www.mirrorfly.com/docs/audio-video/reactnative/quick-start/" rel="noopener noreferrer"&gt;React Native Video Calling SDK&lt;/a&gt; from MirrorFly to speed up the process and complete the entire development in 10 mins&lt;/p&gt;

&lt;h3&gt;
  
  
  Requirements
&lt;/h3&gt;

&lt;p&gt;When integrating MirrorFly in a React Native project, ensure all required peer dependencies are installed with the exact versions specified to avoid compatibility issues.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Node &amp;gt;= 18.20.4
&lt;/li&gt;
&lt;li&gt;npm - 10.7.0
&lt;/li&gt;
&lt;li&gt;react-native &amp;gt;= 0.73.0 &amp;lt;= 0.75.4
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Get SDK License Key
&lt;/h3&gt;

&lt;p&gt;To integrate the MirrorFly Call SDK into your React Native app, you’ll need an SDK License Key. This key is used by the MirrorFly server to authenticate your app’s SDK instance.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0l1qkw6mz56arlqwv9rc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0l1qkw6mz56arlqwv9rc.png" alt="MirrorFly Video SDK License Key" width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.mirrorfly.com/contact-sales.php" rel="noopener noreferrer"&gt;Contact the MirrorFly team&lt;/a&gt; to create a user account.&lt;/li&gt;
&lt;li&gt;Log in to your MirrorFly account.&lt;/li&gt;
&lt;li&gt;Navigate to the Application Info section to retrieve your License Key.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Integrate Call SDK into Your React Native App
&lt;/h3&gt;

&lt;p&gt;MirrorFly’s Call SDK for React Native streamlines the implementation of in-app calling functionality, providing all the core features needed for real-time communication.&lt;/p&gt;

&lt;h4&gt;
  
  
  Installation via npm
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Step 1:&lt;/strong&gt; Add the MirrorFly SDK to your project using npm:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  npm i mirrorfly-reactnative-sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Step 2:&lt;/strong&gt; Import the SDK into the required module or component:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;  &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;SDK&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mirrorfly-reactnative-sdk&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use this import in any file where you need to initialize or interact with the MirrorFly call functionalities.&lt;/p&gt;

&lt;h3&gt;
  
  
  Adding NPM Package Dependencies for Call SDK Integration
&lt;/h3&gt;

&lt;p&gt;First, include the necessary chat-related dependencies as outlined in the MirrorFly documentation.&lt;/p&gt;

&lt;p&gt;Next, add the call-specific dependencies required for enabling in-app calling functionality:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Add&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;chat&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;related&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;dependencies.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;And&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;then&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;add&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;below&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;calls&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;related&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;dependencies&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"react-native-webrtc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"124.0.4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;must&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;use&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;version&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"124.0.4"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"react-native-background-timer"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^2.4.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"react-native-permissions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^5.2.1"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ensure all peer dependencies are resolved and linked properly, especially if using React Native versions below 0.60.&lt;/p&gt;

&lt;h3&gt;
  
  
  Initialize calls SDK
&lt;/h3&gt;

&lt;p&gt;To initialize the MirrorFly Call SDK, you’ll need to provide specific parameters that enable the SDK to respond to connection status changes within the client application.&lt;/p&gt;

&lt;p&gt;Pass your license key to the &lt;code&gt;licenseKey&lt;/code&gt; parameter, along with any other required initialization data. Use the following method to initialize the SDK:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;incomingCallListener&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;callStatusListener&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userTrackListener&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;muteStatusListener&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;missedCallListener&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mediaErrorListener&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;callSpeakingListener&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;callUsersUpdateListener&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;callSwitchListener&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userCallLogListener&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;helper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;initializeObj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;apiBaseUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`API_URL`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;licenseKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`LICENSE_KEY`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;isTrialLicenseKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`TRIAL_MODE`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;callbackListeners&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;connectionListener&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;incomingCallListener&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;callStatusListener&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;userTrackListener&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;muteStatusListener&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;missedCallListener&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;mediaErrorListener&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;callSpeakingListener&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;callUsersUpdateListener&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;callSwitchListener&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;userCallLogListener&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;helper&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;SDK&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;initializeSDK&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;initializeObj&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ensure this method is invoked during your app’s startup flow or wherever appropriate for SDK readiness.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sandbox Configuration
&lt;/h3&gt;

&lt;p&gt;You can retrieve the apiUrl and licenseKey required for SDK initialization from the Overview section of the MirrorFly Console dashboard.&lt;/p&gt;

&lt;p&gt;These values are essential for authenticating your application and establishing a connection to the MirrorFly services during development and testing in the sandbox environment.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;connectionListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;CONNECTED&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Connection Established&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;DISCONNECTED&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Disconnected&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;initializeObj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;apiBaseUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://api-preprod-sandbox.mirrorfly.com/api/v1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;licenseKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;XXXXXXXXXXXXXXXXX&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;isTrialLicenseKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;callbackListeners&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;connectionListener&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;SDK&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;initializeSDK&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;initializeObj&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example Response
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"statusCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Success"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  User Registration
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Step 1:&lt;/strong&gt; Register a new user using the following method:
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Step 2:&lt;/strong&gt; On successful registration, the SDK will return a username and password. These credentials are required to establish a server connection using the &lt;code&gt;connect()&lt;/code&gt; method.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;SDK&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`USER_IDENTIFIER`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;`ANDROID_FCM_TOKEN`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;`IOS_VOIP_TOKEN`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;`IS_PRODUCTION`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Sample code for register user
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;messaging&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@react-native-firebase/messaging&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;RNVoipPushNotification&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native-voip-push-notification&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;RNVoipPushNotification&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;register&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nx"&gt;voipToken&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fcmToken&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;messaging&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;getToken&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;SDK&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userIdentifier&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;fcmToken&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;voipToken&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;NODE_ENV&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;production&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// =====  register for VOIP  =====&lt;/span&gt;
&lt;span class="nx"&gt;RNVoipPushNotification&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;registerVoipToken&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Sample Response:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"statusCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Success"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"username"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"123456789"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"password"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"987654321"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Connecting to the MirrorFly Server
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Step 1:&lt;/strong&gt; Use the username and password obtained during user registration to establish a connection to the MirrorFly server
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Step 2:&lt;/strong&gt; On successful connection, the SDK returns a response with &lt;code&gt;statusCode: 200&lt;/code&gt;. If the connection fails, an execution error will be thrown.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Step 3:&lt;/strong&gt; You can monitor real-time connection state changes via the &lt;code&gt;connectionListener&lt;/code&gt; callback, which helps you track events like connected, disconnected, or connection lost.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Step 4:&lt;/strong&gt; In case of a failure during the connection attempt, the error details will be available in the callback for debugging and handling purposes.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Login Success"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"statusCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Generating a User JID
&lt;/h3&gt;

&lt;p&gt;To generate a JID (Jabber ID) for any registered user, use the following method:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userJid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;SDK&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getJid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;USER_NAME&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This method constructs the fully qualified JID required for identifying users during call operations or messaging within the MirrorFly infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;Using &lt;a href="https://www.mirrorfly.com/react-native-chat-sdk.php" rel="noopener noreferrer"&gt;MirrorFly’s React Native Video SDK&lt;/a&gt; makes it much easier to add video calling to your mobile app without having to build everything from the ground up. The SDK takes care of the heavy lifting like user setup, server connection, and managing call IDs so you can focus on your app's core experience. &lt;/p&gt;

&lt;p&gt;This step-by-step guide walks you through the basics, making it simple to get started. To get the most out of it in a live app, make sure to handle things like connection updates, push notifications, and any errors properly. When you're ready to go deeper, the official docs have everything you need to customize and scale further.&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>integration</category>
      <category>video</category>
      <category>calling</category>
    </item>
    <item>
      <title>Top 5 Video Chat SDKs For Developing React Native Chat Apps</title>
      <dc:creator>Shyam Vijay</dc:creator>
      <pubDate>Fri, 27 Jun 2025 13:06:06 +0000</pubDate>
      <link>https://dev.to/shyam_vijay/top-5-video-chat-sdks-for-developing-react-native-chat-apps-2jj6</link>
      <guid>https://dev.to/shyam_vijay/top-5-video-chat-sdks-for-developing-react-native-chat-apps-2jj6</guid>
      <description>&lt;p&gt;Trust me or not, &lt;a href="https://www.mirrorfly.com/blog/video-communication/" rel="noopener noreferrer"&gt;video communication&lt;/a&gt; is skyrocketing at a much faster pace than anyone can imagine, from interacting with peers to having a quick face-to-face chat with friends and family, to purchasing a product online - every individual prefers this mode of communication. As a result of this, developers are seeking video calling SDKs to integrate an in-app video chat feature into their React Native apps, as it is the most popular cross-platform framework for building mobile applications.&lt;/p&gt;

&lt;p&gt;But which provider to choose for your next app development project? Because there are many video calling APIs in the market that support the React Native framework. And that is where we step in, providing you with comprehensive information on the best providers, key features to consider, and more through this blog post. &lt;/p&gt;

&lt;h2&gt;
  
  
  What is a video calling SDK &amp;amp; API?
&lt;/h2&gt;

&lt;p&gt;A &lt;a href="https://www.contus.com/blog/what-is-a-video-api/" rel="noopener noreferrer"&gt;video calling API&lt;/a&gt; (Application Programming Interface) is a technology that allows two applications to interact with each other, meaning you can use video APIs to easily add calling features like one-to-one face calls, group video calls, push notifications, and more to your existing chat software.&lt;/p&gt;

&lt;p&gt;A video SDK (Software Development Kit), on the other hand, is a toolkit that provides pre-made UI components, libraries, documentation, and tools to enable developers to proceed with the integration process. &lt;/p&gt;

&lt;h2&gt;
  
  
  What are React Native video calling apps?
&lt;/h2&gt;

&lt;p&gt;A React Native video calling app is simply a software or an application that is developed using the React Native framework for fostering real-time video communication between peers. Being a cross-platform framework, developers can use a single codebase to deploy the app on both Android and iOS platforms. &lt;/p&gt;

&lt;h2&gt;
  
  
  Top 10 must-have features of React Native video SDKs
&lt;/h2&gt;

&lt;p&gt;With the fundamental part done, our next focus should be on how to choose the right in-app video calling API provider for React Native apps, and for that, you must ensure the third-party provider offers the following features:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cross-Platform Support (iOS &amp;amp; Android)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Allows you to easily integrate a video calling feature into multiple platforms, such as Android and iOS, for a better user experience.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;HD Video &amp;amp; Audio with Adaptive Bitrate&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Let users make crystal-clear video and audio calls with no lag or jitters, ensuring the utmost quality at all times. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Noise Suppression &amp;amp; Echo Cancellation&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Helps users connect with each other without any background noise and clean audio.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Prebuilt &amp;amp; Customizable UI Components&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Your choice of React Native video API provider must offer pre-built UI kits to speed up the user interface development process and add features that you require.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;One-to-one &amp;amp; Group Video Calling&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Allows users to engage in single face-to-face interactions or group video calls with friends and family.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Screen Sharing &amp;amp; Call Recording&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Your preferred provider must have this attribute, which enables users to share their screen during a call and record it for later use.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;End-to-End Encryption &amp;amp; Token Authentication&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The APIs and SDKs must be secured with stringent encryption mechanisms, such as end-to-end encryption, and multiple access control policies to safeguard them from threats.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Push Notifications &amp;amp; Background Call Handling&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Notifies users of any incoming or missed calls and allows them to handle calls from any device or platform smoothly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Low Latency &amp;amp; Real-Time Performance&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The video calls made by users should have &lt;a href="https://www.mirrorfly.com/blog/what-is-low-latency/" rel="noopener noreferrer"&gt;low latency&lt;/a&gt; and be able to deliver content instantly, even over unstable networks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Analytics, Logs &amp;amp; Reconnection Support&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Your desired API provider must offer the ability to monitor call performance, provide white label apps that reflect your business identity, and auto-recover from disconnections. &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  5 Best React Native Video Call APIs &amp;amp; Chat SDKs
&lt;/h2&gt;

&lt;p&gt;Below are 2025's best video SDKs and APIs to easily integrate high-quality video calling capabilities and other collaboration features into your React Native chat apps. &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://www.mirrorfly.com/react-native-chat-sdk.php" rel="noopener noreferrer"&gt;1. MirrorFly&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fui95urhmbc2lh1c8lxl3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fui95urhmbc2lh1c8lxl3.png" alt="Image description" width="800" height="355"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MirrorFly is simply the industry's best and leading provider of in-app video, voice, and chat SDK, helping businesses and developers in building secure and feature-rich React Native chat apps. Along with this, they also support an end-to-end encryption mechanism to safeguard chats from potential threats, ultra-low latencies for instant communication even in unstable network conditions, over 1,000 call and chat features, and a dual pricing model - SaaS and SaaP. &lt;/p&gt;

&lt;p&gt;While these are a positive aspect on one side of the coin, the other is the limitless customization capability and on-premise hosting ability that businesses love. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Features&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;One-to-one and group video calls
&lt;/li&gt;
&lt;li&gt;Topic-based chats
&lt;/li&gt;
&lt;li&gt;Low-code SDKs
&lt;/li&gt;
&lt;li&gt;Pre-built UI kits
&lt;/li&gt;
&lt;li&gt;Multi-tenancy support
&lt;/li&gt;
&lt;li&gt;100% customizable solution
&lt;/li&gt;
&lt;li&gt;Complete control on source codes
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Developer Support&lt;/strong&gt; - Yes&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Deployment Options&lt;/strong&gt; - On-cloud and on-prem hosting&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Pricing&lt;/strong&gt; - Offers Saas and SaaP pricing solutions for businesses&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://www.apphitect.ae/blog/build-a-react-native-chat-app/" rel="noopener noreferrer"&gt;2. Apphitect&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft67skhmk8ntwy5dhiv0e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft67skhmk8ntwy5dhiv0e.png" alt="Image description" width="800" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Apphitect is yet another self-hosted video calling SDK provider that aids businesses in creating polished React Native applications in minutes. If we speak of their excellence, then the list goes on - from offering myriads of chat and call attributes, high security, unmatched scalability, low latency, and the ability to host apps on business servers. Apart from this, they also let businesses build white-label video chat apps with their branding elements and logos. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Features&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Private and group video calls
&lt;/li&gt;
&lt;li&gt;Presence indicators
&lt;/li&gt;
&lt;li&gt;File and media sharing
&lt;/li&gt;
&lt;li&gt;On-prem hosting
&lt;/li&gt;
&lt;li&gt;Push notifications
&lt;/li&gt;
&lt;li&gt;Complete control over source codes
&lt;/li&gt;
&lt;li&gt;Whitelabel solutions
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Developer Support&lt;/strong&gt; - Yes&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Deployment Options&lt;/strong&gt; - On-premise hosting&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Pricing&lt;/strong&gt; - One-time payment option&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://www.agora.io/en/" rel="noopener noreferrer"&gt;3. Agora&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp74pkfrlpu2zh92uviwm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp74pkfrlpu2zh92uviwm.png" alt="Image description" width="800" height="340"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora is one such real-time messaging platform whose APIs and SDKs are known to create functional video calling apps with rich feature set and great scalability. The platform is also known to positively enhance user engagement and interaction - because of its ultra-low latencies and advanced calling functionalities. Along with this, their major highlight is the global coverage that it gives with high-quality communication. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Features&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;HD-video calls
&lt;/li&gt;
&lt;li&gt;Screen sharing
&lt;/li&gt;
&lt;li&gt;Adaptive video bitrate
&lt;/li&gt;
&lt;li&gt;AI noise suppression
&lt;/li&gt;
&lt;li&gt;Breakout rooms
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Developer Support&lt;/strong&gt; - Polished integration guides with GitHub repo&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Deployment Options&lt;/strong&gt; - Cloud hosting&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Pricing&lt;/strong&gt; - Pay-per-use pricing structure with $0.0009/min for voice conferencing and $0.0039/user for video conferencing&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://www.twilio.com/en-us/video" rel="noopener noreferrer"&gt;4. Twilio&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb7lrdc4rsfvtlg3k2m6t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb7lrdc4rsfvtlg3k2m6t.png" alt="Image description" width="800" height="346"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Twilio's React Native video SDKs offer cloud-based services that enable developers to integrate premium communication and collaboration features into their applications seamlessly. Plus, their APIs support high-definition visuals, thus making them a superior communication platform. However, their major drawback is that Twilio video can support only 50 participants and no more than that. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Features&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;HD-quality video calls
&lt;/li&gt;
&lt;li&gt;Individual and group interactions
&lt;/li&gt;
&lt;li&gt;Video call recording
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Developer Support&lt;/strong&gt; - Clean and documented React Native SDKs&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Deployment Options&lt;/strong&gt; - Twilio's cloud infrastructure&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Pricing&lt;/strong&gt; - Pricing varies based on features but mostly it is billed per minute&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://sinch.com/" rel="noopener noreferrer"&gt;5. Sinch&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw54mljigxqt8cttizw1y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw54mljigxqt8cttizw1y.png" alt="Image description" width="800" height="324"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sinch’s React Native video SDK has become a must-try API provider by businesses around for building customizable web and mobile video chat applications with ease. Their APIs and SDKs are known for their multi-platform support and high-end features, unlike those of their peers. However, their only setback is the steep learning curve, which makes it difficult for new developers. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Features&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Single and group calls
&lt;/li&gt;
&lt;li&gt;Multi-platform support
&lt;/li&gt;
&lt;li&gt;Custom filters and masks
&lt;/li&gt;
&lt;li&gt;Live streaming and broadcasting
&lt;/li&gt;
&lt;li&gt;SMS and MMS capabilities
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Developer Support&lt;/strong&gt; - Only documentation support&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Deployment Options&lt;/strong&gt; - On-cloud hosting&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Pricing&lt;/strong&gt; - Offers variable pricing model, reach out to their sales team for accurate pricing&lt;/p&gt;

&lt;h2&gt;
  
  
  Concluding Notes!
&lt;/h2&gt;

&lt;p&gt;To conclude, we can say that video SDKs are the future and a game-changer for businesses in creating customized, real-time video chat apps tailored to their specific needs and requirements. And with plenty of them in the market, look for SDKs that offer exquisite features, cross-platform support, and limitless customization capabilities so that you can boost user engagement and retention rates.&lt;/p&gt;

&lt;p&gt;Also, conduct a thorough review of its latency and scalability parameters, as well as which provider outperforms the others in these aspects. That's all from us, and it's time to start integrating!&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>webrtc</category>
      <category>videocalling</category>
      <category>videosdk</category>
    </item>
  </channel>
</rss>
