<?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: Zain Ahmed</title>
    <description>The latest articles on DEV Community by Zain Ahmed (@zainbinfurqan).</description>
    <link>https://dev.to/zainbinfurqan</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%2F293801%2Fa9c7c794-a635-4a29-8a70-24b34b15cea1.jpeg</url>
      <title>DEV Community: Zain Ahmed</title>
      <link>https://dev.to/zainbinfurqan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zainbinfurqan"/>
    <language>en</language>
    <item>
      <title>Currency Converter Chrome Extension</title>
      <dc:creator>Zain Ahmed</dc:creator>
      <pubDate>Sun, 24 Nov 2024 11:48:39 +0000</pubDate>
      <link>https://dev.to/zainbinfurqan/currency-converter-chrome-extension-3844</link>
      <guid>https://dev.to/zainbinfurqan/currency-converter-chrome-extension-3844</guid>
      <description>&lt;h2&gt;
  
  
  Case study
&lt;/h2&gt;

&lt;p&gt;I was working on a trading concept and I noticed as per my search that there is no platform (website/extension) where I can convert currency cases as one to all like USD to all other currencies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Product
&lt;/h2&gt;

&lt;p&gt;Here I built a Chrome extension which used to convert any currency to all others with a single click, also I wanted to save users' clicks so I built a Chrome extension so if any trader wants to check any conversion user can get conversion without navigating to any website just open the extension and convert it.&lt;/p&gt;

&lt;p&gt;You can also filter the result after conversion, so see only your preferred currency.&lt;/p&gt;

&lt;p&gt;Not just that, I have added Crypto coins conversion also for some most popular cryptocurrencies. So you can get normal and crypto conversion at the same time.&lt;/p&gt;

&lt;p&gt;Link to Chrome extension &lt;a href="https://chromewebstore.google.com/detail/currency-converter-extens/dmclabfilpimdfkififkfndpgfkffbkm" rel="noopener noreferrer"&gt;https://chromewebstore.google.com/detail/currency-converter-extens/dmclabfilpimdfkififkfndpgfkffbkm&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Do check out and give feedback
don't forget to leave a review/rating on extension
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Demo
&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%2Fziwabe088lkx9gus67fe.gif" 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%2Fziwabe088lkx9gus67fe.gif" alt="Chrome Extension Demo" width="600" height="557"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;p&gt;Javascript | React.js&lt;/p&gt;

&lt;p&gt;You can follow me here &lt;a href="https://linktr.ee/zaahmed" rel="noopener noreferrer"&gt;https://linktr.ee/zaahmed&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>programming</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Create NPM package In React.JS</title>
      <dc:creator>Zain Ahmed</dc:creator>
      <pubDate>Fri, 15 Nov 2024 16:55:59 +0000</pubDate>
      <link>https://dev.to/zainbinfurqan/create-npm-package-in-reactjs-1mi</link>
      <guid>https://dev.to/zainbinfurqan/create-npm-package-in-reactjs-1mi</guid>
      <description>&lt;p&gt;In this article, I'll walk you through the process of creating and publishing an npm package for a React.js application.&lt;/p&gt;

&lt;p&gt;First, run the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx create-react-library react-loader
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will generate a basic React.js application/package. After running the command, you'll see a project structure like this:&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%2Fg6medbocp7upmtoic5l8.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%2Fg6medbocp7upmtoic5l8.png" alt="React npm example structure" width="780" height="1298"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;in the &lt;code&gt;src&lt;/code&gt; folder, you'll find an &lt;code&gt;index.js&lt;/code&gt; file.&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%2F9ieznibef5764cgaglbh.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%2F9ieznibef5764cgaglbh.png" alt="React npm example structure" width="780" height="848"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can either create your library component directly in the &lt;code&gt;index.js&lt;/code&gt;file, or you can create a new component file in the &lt;code&gt;src&lt;/code&gt; folder and export it from the &lt;code&gt;index.js&lt;/code&gt; file like this:&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%2Fy1kbb2hmjlx1fnruls4s.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%2Fy1kbb2hmjlx1fnruls4s.png" alt="React npm example structure" width="800" height="522"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're using CSS for your component, be sure to import it into your component file.&lt;/p&gt;

&lt;p&gt;Next, if you have a &lt;code&gt;dist&lt;/code&gt; folder in your project, delete it. To test if your component is functioning correctly, navigate to the &lt;code&gt;example/src&lt;/code&gt; folder.&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%2Fg8es0tzlgweqvviinzbu.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%2Fg8es0tzlgweqvviinzbu.png" alt="React npm example structure" width="800" height="535"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the &lt;code&gt;App.js&lt;/code&gt; file, import your component as shown here. This is the same approach you'll use to include this library as an npm package in other projects.&lt;/p&gt;

&lt;p&gt;To run the app, execute the following commands:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cd react-loader &amp;amp;&amp;amp; npm start&lt;/code&gt;&lt;br&gt;
&lt;code&gt;cd react-loader/example &amp;amp;&amp;amp; npm start&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;After testing your library, it's time to publish it.&lt;/p&gt;

&lt;p&gt;If you've already set up a repository for your project, simply push the final changes. Otherwise, create a new repository and push your changes.&lt;/p&gt;

&lt;p&gt;You also need to create a &lt;code&gt;.npmignore&lt;/code&gt; file at the root of your project, which functions similarly to a &lt;code&gt;.gitignore&lt;/code&gt; file for NPM. It prevents certain files and folders (like &lt;code&gt;node_modules&lt;/code&gt;, &lt;code&gt;.git&lt;/code&gt;, &lt;code&gt;.gitignore&lt;/code&gt;, etc.) from being published to the NPM registry.&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%2Fv6gokd991r6am4yz2hzp.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%2Fv6gokd991r6am4yz2hzp.png" alt="npmignore file" width="570" height="834"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After pushing your changes, run the command &lt;code&gt;npm login&lt;/code&gt;. You'll be prompted to open NPM in your browser, where you can log in to your account or sign up if you don’t have one. Then, execute &lt;code&gt;npm publish&lt;/code&gt;, which will publish your &lt;code&gt;dist&lt;/code&gt; folder to NPM with the version specified in your &lt;code&gt;package.json&lt;/code&gt; file.&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%2F879ufxyonqwh1ejv1ssk.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%2F879ufxyonqwh1ejv1ssk.png" alt="package.json file" width="800" height="1028"&gt;&lt;/a&gt;&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%2Fcbeof30hfjhw0aql81w1.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%2Fcbeof30hfjhw0aql81w1.png" alt="npm package" width="800" height="301"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once the package is published, you can view it on the NPM website by searching for your package name or by visiting your profile, where all your packages will be listed.&lt;/p&gt;

&lt;p&gt;Follow for more &lt;a href="https://linktr.ee/zaahmed" rel="noopener noreferrer"&gt;You can find me here&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>react</category>
      <category>npm</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Make your documentation with AI Tool (Spreading)</title>
      <dc:creator>Zain Ahmed</dc:creator>
      <pubDate>Tue, 07 Nov 2023 13:52:33 +0000</pubDate>
      <link>https://dev.to/zainbinfurqan/make-you-documentation-with-ai-tool-spreading-2j4l</link>
      <guid>https://dev.to/zainbinfurqan/make-you-documentation-with-ai-tool-spreading-2j4l</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.spreading.ai" rel="noopener noreferrer"&gt;Spreading&lt;/a&gt;&lt;/strong&gt; is an advanced AI tool designed to boost the visibility of your projects or products by crafting visually striking documentation. It goes beyond just aesthetics, as it serves as a valuable resource for internal team collaboration, enabling members to efficiently generate detailed, comprehensive, and expedited documentation covering product information, features, modules, and setup procedures etc. thanks to its powerful AI-driven capabilities, &lt;/p&gt;

&lt;p&gt;Spredding.io has versatile applications across various categories, including UI/UX, software development, resource management, and the creation of documentation for open source libraries, etc. &lt;/p&gt;

&lt;h2&gt;
  
  
  Benefits
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;University Students&lt;/strong&gt;: This is an excellent tool for university students to quickly create proper documentation for their FYPs (Final Year Projects) and university assignments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Freelancers&lt;/strong&gt;: If you're a freelancer looking to impress your clients, you can use it to establish a clear roadmap for your project or develop comprehensive documentation. This ensures that anyone, from any location, can easily understand your project or product, facilitating a quick start.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Startups&lt;/strong&gt;: If you're launching your startup, this tool can be invaluable for maintaining user guides that keep communication seamless among different teams, right from the initial stages, ensuring a thorough understanding of your product&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open Source Contributor&lt;/strong&gt;: The open-source community plays a pivotal role in the life of developers. If you are an open-source contributor with an open-source library or project, you can utilize this documentation tool to craft well-maintained documentation. This, in turn, aids others in comprehending your concept and guides them on how they can contribute to it.&lt;/p&gt;

&lt;p&gt;Steps&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sign up for a free account on Spreading&lt;/li&gt;
&lt;/ol&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%2Fgjdrfjf2d3cnpud0n8p8.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%2Fgjdrfjf2d3cnpud0n8p8.png" alt="Image description" width="800" height="278"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You have the option to either create a personal private page or initiate a team project.&lt;/li&gt;
&lt;/ol&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%2Fjajxu9m990s4mhqwxgwr.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%2Fjajxu9m990s4mhqwxgwr.png" alt="Image description" width="800" height="335"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Let's start by delving into Team Projects. Begin by creating a new team project and giving it a name; this action will take you to your team project interface&lt;/li&gt;
&lt;/ol&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%2Ff252guw1htkjvw8ecylx.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%2Ff252guw1htkjvw8ecylx.png" alt="Image description" width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;While on the Team Project screen, select the AI options. You will be prompted to input specific information for the following categories:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Developer Documentation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Product Documentation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;User Guide or Other&lt;br&gt;
Based on the details you provide, the system will automatically generate a folder structure for your project, similar to the example shown.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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%2Fig71yslailaebpthh3ap.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%2Fig71yslailaebpthh3ap.png" alt="Image description" width="800" height="629"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Choose the page within the folder structure where you wish to proceed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Opt for the 'Edit' options&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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%2Fv72wh08d9ldr8rvxeiuc.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%2Fv72wh08d9ldr8rvxeiuc.png" alt="Image description" width="630" height="1150"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This will provide you with an editable view, allowing you to craft documents specific to that page.&lt;/p&gt;

&lt;p&gt;Entering "/" will present you with numerous options, and you can choose the one that suits your needs and add it to your document.&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%2Fzpntr1kfr9bp81em088w.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%2Fzpntr1kfr9bp81em088w.png" alt="Image description" width="540" height="1214"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can also choose an option to automatically generate a detailed explanation for your code by selecting "Generate Documentation from Code.&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%2Fkruotuybobxrg8bnfiai.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%2Fkruotuybobxrg8bnfiai.png" alt="Image description" width="800" height="170"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This tool will take your code and transform it into a clear, detailed explanation that aligns with your code, similar to the example provided.&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%2Fgftrcq68nnwq1ofak7cm.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%2Fgftrcq68nnwq1ofak7cm.png" alt="Image description" width="800" height="424"&gt;&lt;/a&gt;&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%2Fsdfdft99p09dd337uydi.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%2Fsdfdft99p09dd337uydi.png" alt="Image description" width="800" height="435"&gt;&lt;/a&gt;&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%2Fzrxy7xep1ls5lb7kxcm9.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%2Fzrxy7xep1ls5lb7kxcm9.png" alt="Image description" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can also generate an outline by supplying some information. For example, I chose the 'User Guide' option to create a manual guide for my open-source project, and it provided me with a well-structured document that I could continue to build upon by adding the relevant 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%2Fji7gpxw13vlc9nxy9pwx.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%2Fji7gpxw13vlc9nxy9pwx.png" alt="Image description" width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You have the option to utilize a preview feature located at the bottom left corner to view your document as it would appear from a user's perspective. &lt;/p&gt;

&lt;p&gt;Additionally, you can also publish your document on a complimentary domain, enabling you to easily share it with your team or even a global audience.&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%2Fnhc00ykn5nvd2b94dytv.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%2Fnhc00ykn5nvd2b94dytv.png" alt="Image description" width="800" height="521"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can further customize your live document by configuring settings, such as incorporating icons and selecting a unique site name.&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%2Fp0l9pbc3edzp35wgcves.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%2Fp0l9pbc3edzp35wgcves.png" alt="Image description" width="800" height="970"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After you deploy your document to a specific domain, you'll be able to access it online and easily distribute it to others.&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%2Fuc7rt3y5zrbjeo9aof51.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%2Fuc7rt3y5zrbjeo9aof51.png" alt="Image description" width="800" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You also have the option to include a personalized domain and set up a custom proxy.&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%2Fkw3to1p0hs37c9kp9uv0.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%2Fkw3to1p0hs37c9kp9uv0.png" alt="Image description" width="800" height="1057"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Adding a custom domain will direct you to your designated reference domain.&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%2Foyw3hu8fc3u3px2jx97o.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%2Foyw3hu8fc3u3px2jx97o.png" alt="Image description" width="800" height="523"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you prefer collaborative work and are leading a team in a project or product development, you can utilize the team feature to include your colleagues in the project. This will help you create documentation that enhances your team's efficiency and makes your project or product more comprehensive.&lt;/p&gt;

&lt;p&gt;From this menu, you can also review a list of members who have been included in this team project.&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%2Fu751zx26qp2xzc6q7jls.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%2Fu751zx26qp2xzc6q7jls.png" alt="Image description" width="516" height="908"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can invite others to your private or team project by simply copying the default link and sharing it with the relevant individuals.&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%2Fuc159z3qgdg483h70mmy.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%2Fuc159z3qgdg483h70mmy.png" alt="Image description" width="800" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Signup for free to get for features
&lt;/h3&gt;

&lt;p&gt;Spreading AI is a versatile tool that benefits not only startups but also larger enterprises and their products. Unlocking professional-level features is easy – simply sign up for free at &lt;a href="https://app.spreading.ai/login" rel="noopener noreferrer"&gt;https://app.spreading.ai/login&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Streak continues for 4 years as Hacktoberfest 2023</title>
      <dc:creator>Zain Ahmed</dc:creator>
      <pubDate>Sat, 04 Nov 2023 02:49:29 +0000</pubDate>
      <link>https://dev.to/zainbinfurqan/streak-continues-for-4-years-as-hacktoberfest-2023-1he5</link>
      <guid>https://dev.to/zainbinfurqan/streak-continues-for-4-years-as-hacktoberfest-2023-1he5</guid>
      <description>&lt;p&gt;As most of you know about what hacktoberfest is. I’m here to just show how this year hacktoberfest2023 change my learning curve&lt;/p&gt;

&lt;h3&gt;
  
  
  That’s Me
&lt;/h3&gt;

&lt;p&gt;Hi everyone I am Zain Ahmed (Software Engineer) who trying to become a good developer every day. I don’t have a passion about code but i have passion about impact someone’s life to make it better and for that I code to make thinks easy and sustainable for them. I also have a YouTube channel &lt;a href="https://youtube.com/@YarCoder?si=_5tGu0uX9hFOSvXH" rel="noopener noreferrer"&gt;YarCoder&lt;/a&gt; where i post content related to Software engineering. Not just that i also write articles on different platforms about Software Engineering &lt;a href="https://linktr.ee/zaahmed" rel="noopener noreferrer"&gt;That’s Me&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Highs and Lows
&lt;/h3&gt;

&lt;p&gt;I recently relocated to Malaysia and that’s the reason I was not ready to take a part in this year hacktoberfest2023 but then I thought and decided to make things easy for this time and not to take big challenges but instead take few smaller ones but learn something new this time so I decided to take a part in time but to learn about how things structure to build and here I have learn some different architecture concepts to design a product/project to make it sustainable and optimal for everyone one&lt;/p&gt;

&lt;h3&gt;
  
  
  A new growth
&lt;/h3&gt;

&lt;p&gt;while working on different repositories for hacktoberfest in learn/explore different things not just coding. Its kind of a new experience to take a look on different projects how they structure, How flexible they are in terms of complex scenarios, code complexity, features integration, security prospective etc. To be honest, This time I didn’t get a chance to contribute on some big projects/products but I gain a different experience/knowledge about how things design to build a solid pillar project/product.&lt;/p&gt;

</description>
      <category>hack23contributor</category>
      <category>javascript</category>
      <category>react</category>
      <category>hacktoberfest23</category>
    </item>
    <item>
      <title>Build In-App chatting feature with ZEGOCLOUD</title>
      <dc:creator>Zain Ahmed</dc:creator>
      <pubDate>Mon, 27 Feb 2023 10:25:45 +0000</pubDate>
      <link>https://dev.to/zainbinfurqan/build-in-app-chatting-feature-with-zegocloud-49c4</link>
      <guid>https://dev.to/zainbinfurqan/build-in-app-chatting-feature-with-zegocloud-49c4</guid>
      <description>&lt;p&gt;Customer service is one of the main key factor in any business and when it's comes to e-commerce business its really help to any owner to grow their business in online market, Most of the times users/costumers have different querier which they want to ask before visit any physical shop like, queries about products and shop locations, quires about order update. &lt;br&gt;
let assume you order some products and the order is dispatch its been 5 to 7 days and the parcel didn't reach at your place. in that case you need to find the email address of that store then email them then wait for their response, isn't it kind of hectic, In-App feature can reduce and minimize that cycle and you can just ask any queries from their &lt;a href="https://www.zegocloud.com/product/in-app-chat" rel="noopener noreferrer"&gt;In-App chatting&lt;/a&gt; feature, &lt;br&gt;
The In-App chatting feature not just help only in e-commerce but also in different fields like, medical, gaming, live youtube streaming etc.&lt;/p&gt;

&lt;p&gt;When you developing any app or web feature the In-App feature can be some critical to implement as you need to create it from custom or need to use some third party library. In custom option, the feature can be take up to 15 to 20 days to develop and make it in working model. But for third party library you can just plug any play, but most of the times to use third party it become difficult  to choose the best one, which can provide you all you necessary feature in one model.&lt;/p&gt;

&lt;p&gt;What if i tell you a library/platform that can be really useful for In-App feature, in-fact not just for In-App feature but also it have more features like, Live Streaming, Video/Audio calling, Cloud recording, Super board and etc.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.zegocloud.com/" rel="noopener noreferrer"&gt;ZEGOCLOUD&lt;/a&gt; is a platform that provide varieties of features/options that are required my today's modern web/app(s). They provide best quality in terms of video calling, connectivity, Massive concurrency and much more.&lt;/p&gt;

&lt;p&gt;ZEGOCLOUD In-App chatting feature have cool features like &lt;br&gt;
Room module , Group module, Message priority, Push system notifications, Offline messages, Offline notifications and etc.&lt;/p&gt;

&lt;p&gt;Some of the use cases where you can user ZEGOCLOUD as your In-App patner&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Online shopping   Build&lt;/strong&gt; real-time purchasing-related communications with text, images, order information, and more.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Social interactions&lt;/strong&gt; When you're planning a live-streaming event, it's important to make sure your audience can interact with you. You might want them to ask questions or get involved in the conversation--and doing so can be just as fun for you as it is for them.&lt;/p&gt;

&lt;p&gt;Most of the time influencers use their chatting feature when they do Youtube Live events. You can create a Live chatting feature in your apps by using ZEGOCLOUD In-App feature.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Online education&lt;/strong&gt; Online education apps are the future of education. When you develop an online education app, the in-app chatting feature of ZEGOCLOUD can create a big impact on your users' experience and grow your user base! Students can ask questions while learning, and get answers from mentors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Online consulting&lt;/strong&gt; If you're in the medical field, you know how important it is to be available for patients.&lt;/p&gt;

&lt;p&gt;In-App features are a great way to make sure that you're always there for your patients. You can use these features to be a first aid for any patient and save millions of lives! &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Online games&lt;/strong&gt; Online gaming has become one of the biggest markets in today's world, with millions of people playing games together through live streaming platforms. In-app chatting is a feature that allows you to interact with your favorite gamer on any platform.&lt;/p&gt;

&lt;p&gt;ZEGOCOLOUD Compatibility with almost every platform&lt;br&gt;
Android&lt;br&gt;
IOS&lt;br&gt;
Windows&lt;br&gt;
MacOS&lt;br&gt;
Web&lt;br&gt;
Flutter&lt;br&gt;
React Native&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Add permissions&lt;/strong&gt;&lt;br&gt;
Permissions can be set as needed.&lt;/p&gt;

&lt;p&gt;Open the AndroidManifest.xml file from directory app/src/main, and add permissions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!-- Permissions required by the SDK --&amp;gt;
&amp;lt;uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /&amp;gt;
&amp;lt;uses-permission android:name="android.permission.INTERNET" /&amp;gt;
&amp;lt;uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Prevent class name obfuscation&lt;/strong&gt; &lt;br&gt;
You can prevent the ZEGO SDK public class names from being obfuscated by adding the following code in file proguard-rules.pro&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-keep class **.zego.**{*;}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Import the class file&lt;br&gt;
Import the class file to your project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import im.zego.zim.ZIM
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create instance of ZEGOCLOUD. Suppose you have 2 users A and B, they both need to create instance and call a method with app id and appsign id&lt;br&gt;
developer can get both ids from project dashboard and add them in code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Create a ZIM SDK object and pass the AppID, AppSign, and Application in Android.
ZIMAppConfig appConfig = new ZIMAppConfig();
appConfig.appID = 12345;
appConfig.appSign = "appSign";
zim = ZIM.create(appConfig, application);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;add listener to listen messages from other connected client or if any error occur.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;zim.setEventHandler(new ZIMEventHandler() {
    @Override
    public void onReceivePeerMessage(ZIM zim, ArrayList&amp;lt;ZIMMessage&amp;gt; messageList, String fromUserID) {
        // Implement the callback for receiving the one-to-one messages.
    }
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// userID must be within 32 bytes, and can only contain letters, numbers, and the following special characters: '~', '!', '@', '#', '$', '%', '^', '&amp;amp;', '*', '(', ')', '_', '+', '=', '-', '`', ';', '’', ',', '.', '&amp;lt;', '&amp;gt;', '/', '\'.
// userName must be within 64 bytes, no special characters limited.
ZIMUserInfo zimUserInfo = new ZIMUserInfo();
zimUserInfo.userID = userID;
zimUserInfo.userName = userName;

// When logging in:
// If you are using the Token-based authentication mode, you will need to fill in the Token which you generated by referring to the [Authentication] doc.
// If you are using the AppSign mode for authentication (the default auth mode for v2.3.0 or later), leave the Token parameter blank.

zim.login(zimUserInfo, new ZIMLoggedInCallback() {
    @Override
    public void onLoggedIn(ZIMError error) {
          // You can know whether the login is successful according to the ZIMError.
    }
 });
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;To send one to one message&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// The following shows how to send one-to-one message, the [conversationType] needs to be set to [ZIMConversationTypePeer].
String conversationID = "xxxx";

ZIMTextMessage zimMessage = new ZIMTextMessage();
zimMessage.message = "Message content";

ZIMMessageSendConfig config = new ZIMMessageSendConfig();
// Set priority for the message. 1: Low (by default). 2: Medium. 3: High.
config.priority = ZIMMessagePriority.LOW;
// Set the offline push notificaition config.
ZIMPushConfig pushConfig = new ZIMPushConfig();
pushConfig.title = "Title of the offline push";
pushConfig.content= "Content of the offline push";
pushConfig.extendedData = "Extended info of the offline push";
config.pushConfig = pushConfig;

// In 1-on-1 chats, the conversationID is the peer user ID. In group chats, the conversationID is the groupID. In the chat room, the conversationID is the roomID.
zim.sendMessage(zimMessage, conversationID, ZIMConversationType.Peer,config, new ZIMMessageSentCallback() {
    @Override
    public void onMessageAttached(ZIMMessage zimMessage){
         // The callback on the message not sent yet. You can get a temporary object here and this object must be the same as that created zimMessage object. You can make your own business logic using this as needed, for example, display a UI ahead of time.
    }
    @Override
    public void onMessageSent(ZIMMessage zimMessage, ZIMError error) {
        // Implement the event callback on message sent.
    }
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;to receive one to one message&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;zim.setEventHandler(new ZIMEventHandler() {
    @Override
    public void onReceivePeerMessage(ZIM zim, ArrayList&amp;lt;ZIMMessage&amp;gt; messageList, String fromUserID) {

      for (ZIMMessage zimMessage : messageList) {
          if (zimMessage instanceof ZIMTextMessage)
          {
            ZIMTextMessage zimTextMessage = (ZIMTextMessage) zimMessage;
            Log.e(TAG, "Received message:"+ zimTextMessage.message);
          }
      }
   }
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;for logout&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;zim.logout();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;For destroy instance&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;zim.destroy();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can find a working documentation &lt;a href="https://docs.zegocloud.com/article/13932" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can find sample app &lt;a href="https://docs.zegocloud.com/article/13964" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

</description>
      <category>gratitude</category>
    </item>
    <item>
      <title>ZEGOCLOUD Video calling UIKits in Flutter</title>
      <dc:creator>Zain Ahmed</dc:creator>
      <pubDate>Mon, 09 Jan 2023 04:21:18 +0000</pubDate>
      <link>https://dev.to/zainbinfurqan/zegocloud-video-calling-uikit-in-flutter-l35</link>
      <guid>https://dev.to/zainbinfurqan/zegocloud-video-calling-uikit-in-flutter-l35</guid>
      <description>&lt;h2&gt;
  
  
  Flutter Introduction
&lt;/h2&gt;

&lt;p&gt;Flutter is an open source Software Development kit by Google. You all are maybe confused why choose flutter when you have other platforms like swifts &amp;amp; Android. the reason is cross platform feature, If you use swifts you can only run your app to IOS devices, If you choose Android you can only run your app to Android devices, but with Flutter you can develop Web Application, Mobile Application and even desktop Application.&lt;/p&gt;

&lt;p&gt;Also the best part of flutter is you can create Web Application and Mobile application with single code base, so you don't need to worry about maintain different codebase for different devices (web/mobile).&lt;/p&gt;

&lt;p&gt;Here i am developing a basic Video calling feature with Flutter using library &lt;a href="https://www.zegocloud.com/" rel="noopener noreferrer"&gt;ZEGOCLOUD&lt;/a&gt; UIKit. Let's talk about what is ZEGOCLOUD and Why use it.&lt;/p&gt;

&lt;h2&gt;
  
  
  ZEGOCLOUD
&lt;/h2&gt;

&lt;p&gt;ZEGOCLOUD is a library/platform where you can find different products like Video/Audio calling, Live Streaming, In-App Chatting and much more.&lt;br&gt;
By using this library you can instantly develop app with these different features using just chunk of code.&lt;br&gt;
As compare to other libraries ZEGOCLOUD has some good price margin and also free account to test your app feature. &lt;/p&gt;
&lt;h2&gt;
  
  
  What is UIKit
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://www.zegocloud.com/uikits" rel="noopener noreferrer"&gt;UIKit&lt;/a&gt; is like plug &amp;amp; Play feature, You just need a very little configuration and add small chunk of code. In ZEGOCLOUD is very easy and pretty simple to integrate UIKit.&lt;/p&gt;

&lt;p&gt;I have create an app in flutter with two screens Login and Home&lt;/p&gt;
&lt;h2&gt;
  
  
  Configure your project
&lt;/h2&gt;
&lt;h4&gt;
  
  
  Android
&lt;/h4&gt;

&lt;p&gt;If your project is created with Flutter 2.x.x, you will need to open the your_project/android/app/build.gradle file, and modify the compileSdkVersion to 33.&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%2Fnnizacizb1upx7cynor6.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%2Fnnizacizb1upx7cynor6.png" alt="1" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And in the same file, edit the minSdkVersion.&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%2Fjb6fg0w0kbwgl5tycyqx.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%2Fjb6fg0w0kbwgl5tycyqx.png" alt="2" width="800" height="449"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;minSdkVersion 21
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add app permissions. Open the file your_project/app/src/main/AndroidManifest.xml, and add the following code:&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%2F2uzc8zpt0q7z9uf9pbjh.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%2F2uzc8zpt0q7z9uf9pbjh.png" alt="3" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To prevent obfuscation of the SDK public class names, do the following:&lt;/p&gt;

&lt;p&gt;In your project's your_project &amp;gt; android &amp;gt; app folder, create a proguard-rules.pro file with the following content as shown below&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-keep class **.zego.** { *; }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add the following config code to the release part of the your_project/android/app/build.gradle file&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  IOS
&lt;/h4&gt;

&lt;p&gt;To add permissions, open your_project/ios/Runner/Info.plist, and add the following code to the dict part:&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%2F75kkqbzi7agzoyztg3sv.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%2F75kkqbzi7agzoyztg3sv.png" alt="4" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In home screen I simple create 2 fields Id and Username on login button click I'm navigating user to Video calling screen where user will start calling with other person.&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%2F59qwrbomyhtx9hduqvvx.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%2F59qwrbomyhtx9hduqvvx.png" alt="home screen" width="800" height="1026"&gt;&lt;/a&gt;&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%2Fkl9g8ksqrr1x6fxeunh9.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%2Fkl9g8ksqrr1x6fxeunh9.png" alt="Video calling screen" width="800" height="977"&gt;&lt;/a&gt;&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%2F019ley94lvwjkgpjyc66.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%2F019ley94lvwjkgpjyc66.png" alt="2" width="800" height="492"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  App Code
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Login Screen
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import 'package:flutter/material.dart';
import 'package:video/screens/video_call.dart';

class HomeScreen extends StatefulWidget {
  const HomeScreen({super.key});

  @override
  State&amp;lt;HomeScreen&amp;gt; createState() =&amp;gt; _HomeScreenState();
}

class _HomeScreenState extends State&amp;lt;HomeScreen&amp;gt; {
  final username = TextEditingController();
  final id = TextEditingController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            const SizedBox(
              height: 50,
            ),
            TextField(
              controller: username,
              decoration: const InputDecoration(
                labelText: 'username',
                hintText: 'username',
                enabledBorder: OutlineInputBorder(
                  borderSide: BorderSide(color: Colors.teal, width: 2.0),
                ),
                focusedBorder: OutlineInputBorder(
                  borderSide: BorderSide(color: Colors.teal, width: 2.0),
                ),
              ),
            ),
            const SizedBox(height: 16.0),
            TextField(
              controller: id,
              decoration: const InputDecoration(
                labelText: 'user id',
                hintText: 'userid',
                enabledBorder: OutlineInputBorder(
                  borderSide: BorderSide(color: Colors.teal, width: 2.0),
                ),
                focusedBorder: OutlineInputBorder(
                  borderSide: BorderSide(color: Colors.blue, width: 2.0),
                ),
              ),
            ),
            const SizedBox(height: 16.0),
            MaterialButton(
              color: Colors.teal,
              onPressed: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(
                    builder: (context) =&amp;gt; VideoCalling(
                      id: id.text,
                      username: username.text,
                    ),
                  ),
                );
              },
              child: const Text(
                'Login',
                style: TextStyle(fontSize: 20, color: Colors.white),
              ),
            ),
          ],
        ),
      ),
    );
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Home screen
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import 'dart:math' as math;

import 'package:flutter/material.dart';
import 'package:zego_uikit_prebuilt_call/zego_uikit_prebuilt_call.dart';

class VideoCalling extends StatefulWidget {
  final String username;
  final String id;

  const VideoCalling({Key? key, required this.id, required this.username})
      : super(key: key);

  @override
  State&amp;lt;VideoCalling&amp;gt; createState() =&amp;gt; _VideoCallingState();
}

final String localUserID = math.Random().nextInt(10000).toString();

class _VideoCallingState extends State&amp;lt;VideoCalling&amp;gt; {
  final callIDTextCtrl = TextEditingController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Padding(
          padding: const EdgeInsets.symmetric(horizontal: 10),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            crossAxisAlignment: CrossAxisAlignment.center,
            children: [
              TextField(
                controller: callIDTextCtrl,
                decoration: const InputDecoration(
                  labelText: 'call id',
                  hintText: 'call id',
                  enabledBorder: OutlineInputBorder(
                    borderSide: BorderSide(color: Colors.teal, width: 2.0),
                  ),
                  focusedBorder: OutlineInputBorder(
                    borderSide: BorderSide(color: Colors.blue, width: 2.0),
                  ),
                ),
              ),
              const SizedBox(
                height: 20,
              ),
              MaterialButton(
                color: Colors.teal,
                onPressed: () {
                  Navigator.push(
                    context,
                    MaterialPageRoute(builder: (context) {
                      return CallPage(
                        callID: callIDTextCtrl.text,
                        userId: widget.id,
                        userName: widget.username,
                      );
                    }),
                  );
                },
                child: const Text("join",style: TextStyle(fontSize: 20,color: Colors.white),),
              )
            ],
          ),
        ),
      ),
    );
  }
}

class CallPage extends StatelessWidget {
  final String callID;
  final String userId;
  final String userName;

  const CallPage({
    Key? key,
    required this.callID,
    required this.userId,
    required this.userName,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: ZegoUIKitPrebuiltCall(
        appID: 177503827,
        appSign:
            '4813ca648e686180b2d6e12956bf6ba8465112251090af88228754356c3939b1',
        userID: userId,
        userName: userName,
        callID: callID,
        config: ZegoUIKitPrebuiltCallConfig.oneOnOneVideoCall()
          ..onOnlySelfInRoom = (context) {
            Navigator.of(context).pop();
          },
      ),
    );
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;the Callpage method have a ZEGOCLOUD UIKit for video calling. which requires some params, AppId, AppSign, CallId, UserId &amp;amp; UserName.&lt;/p&gt;

&lt;p&gt;AppId: You can get the AppId from dashboard particular app,&lt;br&gt;
AppSign: You can get AppSign key from dashboard for particular app&lt;br&gt;
AppId and AppSign id should of same project/app which you will create on dashboard.&lt;/p&gt;

&lt;p&gt;CallId: Id will be unique and only number, also callid is like a room id, the other user can join the call if he/she know the callid,&lt;/p&gt;

&lt;p&gt;CallPage method will initiate from Home screen when user put unique callid.&lt;/p&gt;

&lt;p&gt;If the CallId associate to any channel/room he/she will join to that video call.&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%2F28740qok0acj2avk0tii.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%2F28740qok0acj2avk0tii.png" alt="4" width="800" height="1688"&gt;&lt;/a&gt;&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%2Friscjiylcmsns0dxddo9.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%2Friscjiylcmsns0dxddo9.png" alt="5" width="800" height="1688"&gt;&lt;/a&gt;&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%2Fjn5eqi4ygcy6ce3v43mc.jpg" 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%2Fjn5eqi4ygcy6ce3v43mc.jpg" alt="1" width="800" height="1688"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.zegocloud.com/article/14821" rel="noopener noreferrer"&gt;Documentation For Flutter UIKit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.zegocloud.com/docs" rel="noopener noreferrer"&gt;Other Features&lt;/a&gt; &lt;/p&gt;

</description>
      <category>gratitude</category>
    </item>
    <item>
      <title>In-App Chatting in React Native</title>
      <dc:creator>Zain Ahmed</dc:creator>
      <pubDate>Tue, 03 Jan 2023 04:12:03 +0000</pubDate>
      <link>https://dev.to/zainbinfurqan/in-app-chatting-in-react-native-16gm</link>
      <guid>https://dev.to/zainbinfurqan/in-app-chatting-in-react-native-16gm</guid>
      <description>&lt;p&gt;We often use a feature like chatting in most of the Mobile Application whether is related to banking app, Ecommerce and/or chatting apps. Its required enough time to build a chatting feature for any App in different Tech Stack, "What if i tell you a easiest way to integrate/build &lt;a href="https://www.zegocloud.com/product/in-app-chat" rel="noopener noreferrer"&gt;In App Chatting&lt;/a&gt; feature which required almost 15 mins to build and reliable.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.zegocloud.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;ZEGOCLOUD&lt;/strong&gt;&lt;/a&gt; is a library which offer may feature like Audio/Video calling, Live Streaming, Super Board, Cloud recording and much more.&lt;br&gt;
In-App Chatting is one of them and I must say in my 4 years of experience I found the the platform easy to adopt in most of the features.&lt;/p&gt;

&lt;p&gt;Here are some points which you should know before choosing any library to integrate In-App Chatting feature.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ultra-low latency
&lt;/h3&gt;

&lt;p&gt;Have you ever miss important messages due to law latency? well in ZEGOCLOUD you don't need to worry about is as t delivers real-time messages to users with an ultra-low latency as low as 200 ms.&lt;/p&gt;

&lt;h3&gt;
  
  
  Massive concurrency
&lt;/h3&gt;

&lt;p&gt;One of the main issue is how to handle concurrent messages when the count is in millions, well ZEGOCLOUD handle it pretty perfectly as needs of large-scale and highly demanding live communication events&lt;/p&gt;

&lt;h3&gt;
  
  
  Instruction/Steps
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Go to ZEGOCLOUD and &lt;a href="https://console.zegocloud.com/account/signup" rel="noopener noreferrer"&gt;make a account&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Go to dashboard and create a APP&lt;/li&gt;
&lt;li&gt;Select In-app chatting feature&lt;/li&gt;
&lt;li&gt;Go to Service Management option from dashboard and select In-App chatting feature
&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%2F1cusmfd3fok68q2lcbpz.png" alt="in app chatting option" width="800" height="430"&gt;
&lt;/li&gt;
&lt;li&gt;Activate it
&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%2Fttci73l9n5q2iuckdher.png" alt="activation" width="800" height="435"&gt;
&lt;/li&gt;
&lt;li&gt;Copy and save AppID for later use&lt;/li&gt;
&lt;li&gt;Run command &lt;code&gt;npm i zego-zim-react-native&lt;/code&gt; to install library.&lt;/li&gt;
&lt;li&gt;Import SDK in Component &lt;code&gt;import ZIM from 'zego-zim-react-native';&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Create a instance of ZIM using method create, You need &lt;strong&gt;AppID **and&lt;/strong&gt; &lt;strong&gt;appSign&lt;/strong&gt; which you can get from dashboard
&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%2Fs9suno416npi67moj9l0.png" alt="appSign" width="800" height="148"&gt;
&lt;/li&gt;
&lt;li&gt;I have define some state for later user
&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%2Fqudkkprpd12avawprn9r.png" alt="component states" width="800" height="208"&gt;
&lt;/li&gt;
&lt;li&gt;Create a login function that will login user to application
&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%2Fpcdhda72a957a5h0nqiz.png" alt="login" width="800" height="290"&gt;
&lt;/li&gt;
&lt;li&gt;Create sendMessage function that will help to send message to other user
&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%2Fkan80nk6oomn4treofua.png" alt="sendMessage " width="800" height="302"&gt;
&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;useEffect&lt;/strong&gt; is define to handle some realtime events, If user connection state change the event &lt;strong&gt;connectionStateChanged&lt;/strong&gt; will notify us, If any error occur the event &lt;strong&gt;error&lt;/strong&gt; will notify us &amp;amp; if user get any message from other user the event &lt;strong&gt;receivePeerMessage&lt;/strong&gt; will have that received message from where we can show it on UI
&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%2Fk71v6wr2hlkonpoekls8.png" alt="receivePeerMessage" width="800" height="362"&gt;
&lt;/li&gt;
&lt;li&gt;We also have a &lt;strong&gt;logout&lt;/strong&gt; &amp;amp; &lt;strong&gt;destroy&lt;/strong&gt; method which will help to logout user when user leave screen and destroy the ZIM instance.
Here is my component
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { useEffect, useState } from 'react';
import { Button, TextInput, View, Text } from 'react-native';
import ZIM from 'zego-zim-react-native';
ZIM.create({ appID: ******, appSign: '***********************' })
const zim = ZIM.geInstance();

const VideoCalling = (props) =&amp;gt; {
    // const zim = ZIM.geInstance();
    useEffect(() =&amp;gt; {
        try {
            // ZIM.caller({ appID: '177503827', appSign: '4813ca648e686180b2d6e12956bf6ba8465112251090af88228754356c3939b1' });
        } catch (error) {
            console.log(error)
        }
    }, [])
    const [userInfo, setUserInfo] = useState({
        userID: '', //
        userName: '',
        token: ''
    })
    const [state, setState] = useState({
        message: '',
        otherUserId: ''
    })

    useEffect(() =&amp;gt; {
        // Set up and listen for the callback for receiving error codes.  
        zim.on('error', function (zim, errorInfo) {
            console.log('error', errorInfo.code, errorInfo.message);
        });

        // Set up and listen for the callback for connection status changes. 
        zim.on('connectionStateChanged', function (zim, { state, event, extendedData }) {
            console.log('connectionStateChanged', state, event, extendedData);
        });

        // Set up and listen for the callback for receiving one-to-one messages. 
        zim.on('receivePeerMessage', function (zim, { messageList, fromConversationID }) {
            console.log('receivePeerMessage', messageList, fromConversationID);
        });

        return () =&amp;gt; {
            zim.logout();
            zim.destroy();
        }
    }, [])

    const handleLogin = () =&amp;gt; {
        try {
            zim.login(userInfo, token)
                .then(function () {
                    // Login successful.
                })
                .catch(function (err) {
                    // Login failed.
                });
        } catch (error) {

        }
    }

    const sendMessage = () =&amp;gt; {
        try {
            const messageTextObj = { type: 1, message: state.message };
            zim.sendMessage(messageTextObj, toUserID)
                .then(function ({ message }) {
                    // Message sent successfully.
                })
                .catch(function (err) {
                    // Failed to send the message.
                });
        } catch (error) {

        }
    }

    const onStateHandleChange = (key, value) =&amp;gt; {
        setState({ ...state, [key]: value })
    }
    const onUserObjHandleChange = (key, value) =&amp;gt; {
        setUserInfo({ ...state, [key]: value })
    }

    return (
        &amp;lt;View style={{ padding: 5 }}&amp;gt;
            &amp;lt;View&amp;gt;
                &amp;lt;View style={{ paddingVertical: 5 }}&amp;gt;
                    &amp;lt;Text&amp;gt;UserID&amp;lt;/Text&amp;gt;
                    &amp;lt;TextInput
                        value={userInfo.userID}
                        onChangeText={(value) =&amp;gt;
                            onUserObjHandleChange('userID', value)}
                        style={{ borderWidth: 1 }} /&amp;gt;
                &amp;lt;/View&amp;gt;
                &amp;lt;View style={{ paddingVertical: 5 }}&amp;gt;
                    &amp;lt;Text&amp;gt;User Name&amp;lt;/Text&amp;gt;
                    &amp;lt;TextInput
                        value={userInfo.userName}
                        onChangeText={(value) =&amp;gt;
                            onUserObjHandleChange('userName', value)}
                        style={{ borderWidth: 1 }} /&amp;gt;
                &amp;lt;/View&amp;gt;
                &amp;lt;View style={{ paddingVertical: 5 }}&amp;gt;
                    &amp;lt;Text&amp;gt;Token&amp;lt;/Text&amp;gt;
                    &amp;lt;TextInput
                        value={userInfo.token}
                        onChangeText={(value) =&amp;gt;
                            onUserObjHandleChange('token', value)}
                        style={{ borderWidth: 1 }} /&amp;gt;
                &amp;lt;/View&amp;gt;
                &amp;lt;Button title="Login" onPress={handleLogin} /&amp;gt;
                &amp;lt;View&amp;gt;
                    &amp;lt;View style={{ paddingVertical: 5 }}&amp;gt;
                        &amp;lt;Text&amp;gt;Other person ID&amp;lt;/Text&amp;gt;
                        &amp;lt;TextInput
                            value={state.otherUserId}
                            onChangeText={(value) =&amp;gt;
                                onStateHandleChange('otherUserId', value)}
                            style={{ borderWidth: 1 }} /&amp;gt;
                    &amp;lt;/View&amp;gt;
                    &amp;lt;Button title="Submit" /&amp;gt;
                &amp;lt;/View&amp;gt;
                &amp;lt;View&amp;gt;
                    &amp;lt;View style={{ paddingVertical: 5 }}&amp;gt;
                        &amp;lt;Text&amp;gt;Message&amp;lt;/Text&amp;gt;
                        &amp;lt;TextInput
                            value={state.message}
                            onChangeText={(value) =&amp;gt;
                                onStateHandleChange('message', value)}
                            style={{ borderWidth: 1 }} /&amp;gt;
                    &amp;lt;/View&amp;gt;
                    &amp;lt;Button title="Send" onPress={sendMessage} /&amp;gt;
                &amp;lt;/View&amp;gt;
            &amp;lt;/View&amp;gt;
        &amp;lt;/View&amp;gt;
    );
}

export default VideoCalling;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Links:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://docs.zegocloud.com/article/14692" rel="noopener noreferrer"&gt;React Native In-App chatting Doc&lt;/a&gt;&lt;br&gt;
&lt;a href="https://docs.zegocloud.com/article/14697" rel="noopener noreferrer"&gt;Sample Codebase&lt;/a&gt;&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%2Fmd4qqehqr5vth2t17jof.jpg" 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%2Fmd4qqehqr5vth2t17jof.jpg" alt="1" width="800" height="1777"&gt;&lt;/a&gt;&lt;br&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%2Fcuypq8f84q8fa96yryhu.jpg" 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%2Fcuypq8f84q8fa96yryhu.jpg" alt="2" width="800" height="1777"&gt;&lt;/a&gt;&lt;br&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%2Fwqm16t4fcq8cucynav1k.jpg" 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%2Fwqm16t4fcq8cucynav1k.jpg" alt="Image description" width="800" height="1777"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>kendoreactchallenge</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>In-App Chatting UIKit</title>
      <dc:creator>Zain Ahmed</dc:creator>
      <pubDate>Thu, 29 Dec 2022 06:56:01 +0000</pubDate>
      <link>https://dev.to/zainbinfurqan/in-app-chatting-uikit-328e</link>
      <guid>https://dev.to/zainbinfurqan/in-app-chatting-uikit-328e</guid>
      <description>&lt;p&gt;We often use Chatting feature in our Applications, &amp;amp; to build that feature we required some logic, and a lot coding. What if i tell you that you can create a chatting feature with simple integration and small chunk of code. Here is &lt;a href="https://www.zegocloud.com/" rel="noopener noreferrer"&gt;ZEGOCLOUD&lt;/a&gt; which have many features and In-App Chatting is one of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;ZEGOCLOUD is a platform which you can use to integrate multiple feature like Live Audio/Video calling, Live Streaming, In-App chatting  and much more in your App/Web Application &amp;amp; the best part they have custom code integrations as well as UI Kits integration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Custom Integration
&lt;/h2&gt;

&lt;p&gt;They offer Libraries for different stacks like &lt;br&gt;
IOS (Flutter, React Native IOS Native)&lt;br&gt;
Android (Flutter, React Native, Android Native)&lt;br&gt;
Web (JavaScript) (React.JS, Vue.JS, etc).&lt;/p&gt;
&lt;h2&gt;
  
  
  UI Kits
&lt;/h2&gt;

&lt;p&gt;They offer some pre-design UI kits which just need a little configuration and a chunk of code and you feature will be ready to test and deploy.&lt;/p&gt;

&lt;p&gt;Feature&lt;br&gt;
VIDEO Calling Documentation : &lt;a href="https://docs.zegocloud.com/article/5542" rel="noopener noreferrer"&gt;Video Calling&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Live Streaming Documentation : &lt;a href="https://docs.zegocloud.com/article/7927" rel="noopener noreferrer"&gt;Live Streaming&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In-App Chatting Documentation : &lt;a href="https://docs.zegocloud.com/article/13919" rel="noopener noreferrer"&gt;In-App Chatting&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can find different tech stack in each documentation for each feature.&lt;/p&gt;

&lt;p&gt;Here for my In-App Chatting feature i am using UI Kit to integrate the feature.&lt;/p&gt;

&lt;p&gt;Introduction of In-App Chatting SDK&lt;/p&gt;

&lt;p&gt;As experience developer and build many chatting features, I love to use ZEGOCLOUD for many feature from now on. Here are some point to use In-App Chatting SDK&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The SDK provide smooth communication and transmission for messaging even when network is poor.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;priority&lt;/strong&gt; feature is really useful when you want to never miss any message from any user.&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  Integration
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;npm i @zegocloud/zimkit-react&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Import ZIMKitManager, Common from zimkit-react&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Define state for some configuration and add AppID, serverSecret along with some user details like userID, userName &amp;amp; avatar.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Get AppId and serverSecret from dashboard&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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%2Fcj29fvjkunds9w4alb4r.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%2Fcj29fvjkunds9w4alb4r.png" alt="AppID and serverSecret" width="800" height="52"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Define &lt;code&gt;&amp;lt;Common&amp;gt;&amp;lt;Common/&amp;gt;&lt;/code&gt; in return statement for UI&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a useEffect, which will run only once when first time render happen.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a function to configure UI kit with parameter we define in component state&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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%2Flkq8inyescix6f3i15mp.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%2Flkq8inyescix6f3i15mp.png" alt="load UI kit method" width="800" height="257"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;create a instance of &lt;strong&gt;ZIMKitManager&lt;/strong&gt; then call generateKitTokenForTest to generate token &lt;/p&gt;

&lt;p&gt;call &lt;strong&gt;init&lt;/strong&gt; function to inject the UI Kit &lt;br&gt;
then call &lt;strong&gt;connection&lt;/strong&gt; function which will create a connection for Chatting.&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%2Flqntihae06e9q6pp30jq.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%2Flqntihae06e9q6pp30jq.png" alt="code snippet" width="800" height="750"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { useEffect } from 'react';
import { ZIMKitManager, Common } from '@zegocloud/zimkit-react';
import '@zegocloud/zimkit-react/index.css';

function ZEGOCLOUDUIKIET(props) {
    const state = {
        appConfig: {
            appID:***********,        // The AppID you get from the ZEGOCLOUD admin console.
            serverSecret: '****************************' // The serverSecret you get from ZEGOCLOUD Admin Console.
        },
        // The userID and userName is a strings of 1 to 32 characters.
        // Only digits, letters, and the following special characters are supported: '~', '!', '@', '#', '$', '%', '^', '&amp;amp;', '*', '(', ')', '_', '+', '=', '-', '`', ';', '’', ',', '.', '&amp;lt;', '&amp;gt;', '/', '\'
        userInfo: {
            // Your ID as a user.
            userID: '12345',
            // Your name as a user.
            userName: 'Zain Ahmed',
            // The image you set as a user avatar must be network images. e.g., https://storage.zego.im/IMKit/avatar/avatar-0.png
            userAvatarUrl: 'https://storage.zego.im/IMKit/avatar/avatar-0.png'
        },
    }
    useEffect(() =&amp;gt; {
        loadUIKIT()
    }, [])
    const loadUIKIT = async () =&amp;gt; {
        const zimKit = new ZIMKitManager();
        const token = zimKit.generateKitTokenForTest(state.appConfig.appID, state.appConfig.serverSecret, state.userInfo.userID);
        await zimKit.init(state.appConfig.appID);
        await zimKit.connectUser(state.userInfo, token);
    }

    return (
        &amp;lt;div&amp;gt;
            &amp;lt;Common&amp;gt;&amp;lt;/Common&amp;gt;
        &amp;lt;/div&amp;gt;
    );
}

export default ZEGOCLOUDUIKIET;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Application UIKit
&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%2Fug318q810xd7vs3arf0c.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%2Fug318q810xd7vs3arf0c.png" alt="Chatting app UIKit" width="800" height="574"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Checkout In-App Chatting UI Kit Documentation &lt;a href="https://docs.zegocloud.com/article/14665" rel="noopener noreferrer"&gt;In App Chatting kit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow for more content &lt;a href="https://linktr.ee/zaahmed?fbclid=PAAab2H3ZN7kLlwTfmWMOEBcjLCyGdCooDqwGjJ0WCvBlk77l6WIr38rWmbFs" rel="noopener noreferrer"&gt;Find me here&lt;/a&gt;&lt;/p&gt;

</description>
      <category>testing</category>
    </item>
    <item>
      <title>In-App chat in react.js with ZEGOCLOUD</title>
      <dc:creator>Zain Ahmed</dc:creator>
      <pubDate>Tue, 20 Dec 2022 07:24:44 +0000</pubDate>
      <link>https://dev.to/zainbinfurqan/in-app-chat-in-reactjs-with-zegocloud-1o7b</link>
      <guid>https://dev.to/zainbinfurqan/in-app-chat-in-reactjs-with-zegocloud-1o7b</guid>
      <description>&lt;p&gt;Almost any developer create a &lt;strong&gt;&lt;a href="https://docs.zegocloud.com/article/14662" rel="noopener noreferrer"&gt;Chat Application&lt;/a&gt;&lt;/strong&gt; in their initial career as a showcase project. I also did when I start learning about MERN Stack &amp;amp; I build chat app in with 2 different tech, Firebase with React.js &amp;amp; Socket.io (Node.js) with React.js.&lt;/p&gt;

&lt;p&gt;As we grow in over experience we learn that thing can be done more easily and quickly by taking some help from pre build libraries instead of creating it custom.&lt;/p&gt;

&lt;p&gt;Here is another feature of &lt;strong&gt;&lt;a href="https://www.zegocloud.com/" rel="noopener noreferrer"&gt;ZEGOCLOUD&lt;/a&gt;&lt;/strong&gt; called In-App chatting which love it, it just take a small configuration and chunk of code and your life can be easy.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I build
&lt;/h2&gt;

&lt;p&gt;I have build a basic one-to-one chatting app using &lt;strong&gt;ZEGOCLOUD&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;p&gt;React.js (Frontend)&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuration
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;ZEGOCLOUD&lt;/strong&gt; and make a account &lt;/li&gt;
&lt;li&gt;Go to dashboard and create a APP&lt;/li&gt;
&lt;/ol&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%2Fdiypbxnba9ikzuklbkzx.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%2Fdiypbxnba9ikzuklbkzx.png" alt="step-" width="800" height="610"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Select &lt;strong&gt;In-app chatting&lt;/strong&gt; feature&lt;/li&gt;
&lt;li&gt;Go to Service Management option from dashboard and select In-App chatting feature&lt;/li&gt;
&lt;/ol&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%2Frjbfcfev1a71muf2gnbt.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%2Frjbfcfev1a71muf2gnbt.png" alt="step-" width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Active it &lt;/li&gt;
&lt;/ol&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%2Fkjtd6xm36tx82snvqzr8.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%2Fkjtd6xm36tx82snvqzr8.png" alt="step-" width="800" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Copy and save &lt;strong&gt;AppID&lt;/strong&gt; for later use&lt;/li&gt;
&lt;li&gt;Create a React.JS app using &lt;strong&gt;create-reat-app&lt;/strong&gt; or any React framework. &lt;/li&gt;
&lt;li&gt;Create a component for chatting/messaging&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Application work flow
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;install zego-zim-web package in React.js and define AppID which you copy earlier &lt;/li&gt;
&lt;/ol&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%2Fd94wr5huxasxyg111iws.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%2Fd94wr5huxasxyg111iws.png" alt="step-" width="800" height="1263"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { useEffect, useState } from 'react';
import { ZIM } from 'zego-zim-web';

var appID = 1423906504;
ZIM.create({ appID });
var zim = ZIM.getInstance();

function Chatting(props) {

    const [toUserId, setToUserId] = useState('')
    const [token, setToken] = useState('')
    const [userId, setUserId] = useState('')
    const [userName, setUserName] = useState('')

return (
        &amp;lt;div className='p-5 flex flex-col'&amp;gt;

            &amp;lt;label className='p-2 font-bold'&amp;gt;Token&amp;lt;/label&amp;gt;
            &amp;lt;input className='border p-2 m-2' value={token} onChange={(e) =&amp;gt; setToken(e.target.value)} /&amp;gt;

            &amp;lt;label className='p-2 font-bold'&amp;gt;Your name&amp;lt;/label&amp;gt;
            &amp;lt;input className='border p-2 m-2' value={userName} onChange={(e) =&amp;gt; setUserName(e.target.value)} /&amp;gt;

            &amp;lt;label className='p-2 font-bold'&amp;gt;UserId&amp;lt;/label&amp;gt;
            &amp;lt;input className='border p-2 m-2' value={userId} onChange={(e) =&amp;gt; setUserId(e.target.value)} /&amp;gt;

            &amp;lt;button className='border p-2 m-2' onClick={handleLogin}&amp;gt;Login&amp;lt;/button&amp;gt;

            &amp;lt;label className='p-2 font-bold'&amp;gt;Other person User Id &amp;lt;/label&amp;gt;
            &amp;lt;input className='border p-2 m-2' value={toUserId} onChange={(e) =&amp;gt; setToUserId(e.target.value)} /&amp;gt;

            &amp;lt;button className='border p-2 m-2' onClick={handleSendMessage}&amp;gt;Send Message&amp;lt;/button&amp;gt;

        &amp;lt;/div&amp;gt;
    );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I also define some other states for later use&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Both user need to generate &lt;strong&gt;token&lt;/strong&gt; from dashboard with unique *&lt;em&gt;userID *&lt;/em&gt; save the taken for later use in frontend (the token can be auto generate from backend, If you are using any backend service).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;After input userID and Token click login button and it will create a room for user &lt;/p&gt;&lt;/li&gt;
&lt;/ol&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%2Fq0t0tr9mmu0js1ofgxm5.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%2Fq0t0tr9mmu0js1ofgxm5.PNG" alt="step-" width="665" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Once the User enter in room User can send message and can receive message from other user.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;There are some event listeners which will help to indicate constantly whether the connection is stable or not also the receive event listener will constantly listen if any new message emit from any other user or not.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  useEffect(() =&amp;gt; {
        // Set up and listen for the callback for receiving error codes. 
        zim.on('error', function (zim, errorInfo) {
            console.log('error', errorInfo.code, errorInfo.message);
        });

        // Set up and listen for the callback for connection status changes.
        zim.on('connectionStateChanged', function (zim, { state, event, extendedData }) {
            console.log('connectionStateChanged', state, event, extendedData);
            // When SDK logout occurred due to a long-time network disconnection, you will need to log in again. 
            if (state === 0 &amp;amp;&amp;amp; event === 3) {
                zim.login({ userName }, token)
            }
        });

        // Set up and listen for the callback for receiving one-to-one messages. 
        zim.on('receivePeerMessage', function (zim, { messageList, fromConversationID }) {
            console.log('receivePeerMessage', messageList, fromConversationID);
        });

        // Set up and listen for the callback for token expires.
        zim.on('tokenWillExpire', function (zim, { second }) {
            console.log('tokenWillExpire', second);
            // You can call the renewToken method to renew the token. 
            // To generate a new Token, refer to the Prerequisites.
            zim.renewToken(token)
                .then(function ({ token }) {
                    // Renewed successfully.
                })
                .catch(function (err) {
                    // Renew failed.
                })
        });

        zim.on('receivePeerMessage', function (zim, { messageList, fromConversationID }) {
            console.log('receivePeerMessage', messageList, fromConversationID);
        });
    }, [])

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As I define some event listeners for some Realtime work, To get current connect state, To get runtime message emit/receive, TO get is token expire and to get error if any.&lt;br&gt;
Here is final component for one-to-one chatting app&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { useEffect, useState } from 'react';
import { ZIM } from 'zego-zim-web';

var appID = 1423906504;
ZIM.create({ appID });
var zim = ZIM.getInstance();

function Chatting(props) {

    const [toUserId, setToUserId] = useState('')
    const [token, setToken] = useState('')
    const [userId, setUserId] = useState('')
    const [userName, setUserName] = useState('')


    useEffect(() =&amp;gt; {
        // Set up and listen for the callback for receiving error codes. 
        zim.on('error', function (zim, errorInfo) {
            console.log('error', errorInfo.code, errorInfo.message);
        });

        // Set up and listen for the callback for connection status changes.
        zim.on('connectionStateChanged', function (zim, { state, event, extendedData }) {
            console.log('connectionStateChanged', state, event, extendedData);
            // When SDK logout occurred due to a long-time network disconnection, you will need to log in again. 
            if (state === 0 &amp;amp;&amp;amp; event === 3) {
                zim.login({ userName }, token)
            }
        });

        // Set up and listen for the callback for receiving one-to-one messages. 
        zim.on('receivePeerMessage', function (zim, { messageList, fromConversationID }) {
            console.log('receivePeerMessage', messageList, fromConversationID);
        });

        // Set up and listen for the callback for token expires.
        zim.on('tokenWillExpire', function (zim, { second }) {
            console.log('tokenWillExpire', second);
            // You can call the renewToken method to renew the token. 
            // To generate a new Token, refer to the Prerequisites.
            zim.renewToken(token)
                .then(function ({ token }) {
                    // Renewed successfully.
                })
                .catch(function (err) {
                    // Renew failed.
                })
        });

        zim.on('receivePeerMessage', function (zim, { messageList, fromConversationID }) {
            console.log('receivePeerMessage', messageList, fromConversationID);
        });
    }, [])


    const handleLogin = () =&amp;gt; {
        try {
            const newUserDetails = { userName, userID: userId }
            zim.login(newUserDetails, token)
                .then(function (res) {
                    console.log("res", res)
                })
                .catch(function (err) {
                    console.log("err", err)
                });
        } catch (error) {
            console.log("error", error)
        }
    }

    const handleSendMessage = () =&amp;gt; {
        try {
            var toUserID = toUserId;
            var config = {
                priority: 1 // Set priority for the message. 1: Low (by default). 2: Medium. 3: High.
            };

            // Send one-to-one text messages. 
            var messageTextObj = { type: 1, message: `user to ${toUserID} ` };
            zim.sendMessage(messageTextObj, toUserID, 0, config)
                .then(function ({ message }) {
                    console.log("message", message)
                })
                .catch(function (err) {
                    console.log("err", err)
                });
        } catch (error) {
            console.log("error", error)
        }
    }

    return (
        &amp;lt;div className='p-5 flex flex-col'&amp;gt;

            &amp;lt;label className='p-2 font-bold'&amp;gt;Token&amp;lt;/label&amp;gt;
            &amp;lt;input className='border p-2 m-2' value={token} onChange={(e) =&amp;gt; setToken(e.target.value)} /&amp;gt;

            &amp;lt;label className='p-2 font-bold'&amp;gt;Your name&amp;lt;/label&amp;gt;
            &amp;lt;input className='border p-2 m-2' value={userName} onChange={(e) =&amp;gt; setUserName(e.target.value)} /&amp;gt;

            &amp;lt;label className='p-2 font-bold'&amp;gt;UserId&amp;lt;/label&amp;gt;
            &amp;lt;input className='border p-2 m-2' value={userId} onChange={(e) =&amp;gt; setUserId(e.target.value)} /&amp;gt;

            &amp;lt;button className='border p-2 m-2' onClick={handleLogin}&amp;gt;Login&amp;lt;/button&amp;gt;

            &amp;lt;label className='p-2 font-bold'&amp;gt;Other person User Id &amp;lt;/label&amp;gt;
            &amp;lt;input className='border p-2 m-2' value={toUserId} onChange={(e) =&amp;gt; setToUserId(e.target.value)} /&amp;gt;

            &amp;lt;button className='border p-2 m-2' onClick={handleSendMessage}&amp;gt;Send Message&amp;lt;/button&amp;gt;

        &amp;lt;/div&amp;gt;
    );
}

export default Chatting;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also get sample code in web(JavaScript) from here &lt;a href="https://docs.zegocloud.com/article/13967" rel="noopener noreferrer"&gt;Sample code for In-App chatting&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Documentation here &lt;a href="https://docs.zegocloud.com/article/13935" rel="noopener noreferrer"&gt;In-App Chatting Documentation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Checkout my YouTube Channel for more content &lt;a href="https://www.youtube.com/c/yarcoder" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;em&gt;YarCoder&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>react</category>
      <category>webdev</category>
      <category>zegocloud</category>
    </item>
    <item>
      <title>What is reverse-email-lookup</title>
      <dc:creator>Zain Ahmed</dc:creator>
      <pubDate>Mon, 19 Dec 2022 07:55:49 +0000</pubDate>
      <link>https://dev.to/zainbinfurqan/what-is-reverse-email-lookup-556b</link>
      <guid>https://dev.to/zainbinfurqan/what-is-reverse-email-lookup-556b</guid>
      <description>&lt;p&gt;In today's world where email scams can be done to easily and a person can really authenticate it and can be scrammed, Here is a product which can be useful in different aspects. &lt;/p&gt;

&lt;p&gt;this tool can save you from different types of scam's and can be be useful in different ways &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scams &amp;amp; Fraud Prevention&lt;/strong&gt;&lt;br&gt;
In today's world where there is a proliferation of scams, it's worth worrying about your own security. But luckily, you can use a reverse email lookup to verify the identity of the emails, to further protect yourself from theft and risks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verification of Ecommerce Transactions&lt;/strong&gt;&lt;br&gt;
one important use case is to check and verify an online buyer or seller especially when e-commerce shopping is so prominent today&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HR Talent Identification&lt;/strong&gt;&lt;br&gt;
Hiring HR recruitment firms gathering all the information available on the candidates and filter them accurately to fast-track the hiring process. Using a simple email search, they can also retrieve relevant information that is not disclosed by the candidates&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lead Generation&lt;/strong&gt;&lt;br&gt;
in sales and lead generation. Using a reverse email lookup, sales team can qualify leads accurately, thus cutting down time wasted to work on leads and instead, focus on getting sales quicker and more efficiently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Credit Risks Analysis&lt;/strong&gt;&lt;br&gt;
Financial firms, especially those that extend credit and loans to their customers, can identify the risk level of a prospective customer before dealing with them based on the data that they are able to obtain from a reverse email lookup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You can read more about it on this link&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://nubela.co/blog/3-simple-methods-to-do-reverse-email-lookup/?utm_campaign=writers%20domain&amp;amp;utm_source=social&amp;amp;utm_medium=review&amp;amp;utm_content=3%20reverse%20email%20lookup" rel="noopener noreferrer"&gt;3 Simple Methods To Do Reverse Email Lookup&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow for more on &lt;a href="https://www.youtube.com/@YarCoder" rel="noopener noreferrer"&gt;YarCoder&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Add Voice &amp; Video calling Feature in React Native using ZEGOCLOUD</title>
      <dc:creator>Zain Ahmed</dc:creator>
      <pubDate>Sat, 10 Dec 2022 20:21:08 +0000</pubDate>
      <link>https://dev.to/zainbinfurqan/add-voice-video-calling-feature-in-react-native-using-zegocloud-9i7</link>
      <guid>https://dev.to/zainbinfurqan/add-voice-video-calling-feature-in-react-native-using-zegocloud-9i7</guid>
      <description>&lt;p&gt;On one of my &lt;strong&gt;&lt;em&gt;React Native&lt;/em&gt;&lt;/strong&gt; project related to Medical field required to add a Video calling feature in Mobile application &amp;amp; for that I search some third part libraries/SDKs. I found &lt;a href="https://www.zegocloud.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;em&gt;ZEGOCLOUD&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt; SDK for React Native Video calling and turn out it was pretty simple and easy to integrate in React Native for Android &amp;amp; IOS&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup ZEGOCLOUD Account/Project
&lt;/h2&gt;

&lt;p&gt;After signup to ZEGOCLOUD you will landed to Admin panel from where create a project with suitable name.&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%2Fn4aj2kz1emigi4p13ota.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%2Fn4aj2kz1emigi4p13ota.PNG" alt="create project screen" width="800" height="429"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Their will be multiple options like Video calling, Live Streaming, In App Chatting etc., we will select &lt;a href="https://www.zegocloud.com/product/video-call" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;em&gt;Video Chat&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&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%2Fn3vhf90g36bjz0g5jlly.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%2Fn3vhf90g36bjz0g5jlly.PNG" alt="select use case for you pproject" width="800" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click the next button and select Start with UIKits&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%2Fa21fj8xjbnmv0iipip7z.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%2Fa21fj8xjbnmv0iipip7z.PNG" alt="select name and UIKits" width="619" height="592"&gt;&lt;/a&gt;&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%2Fcjzhibxv3nva2thftg34.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%2Fcjzhibxv3nva2thftg34.PNG" alt="select mobile application tech stack" width="796" height="523"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Select React Native option for React Native Video Calling mobile application&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can also do some basic configuration from right side panel&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%2Ffhx8mfwzya4v89idthwv.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%2Ffhx8mfwzya4v89idthwv.PNG" alt="select app configuration" width="255" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click save button on bottom right&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click on Quick start button but before click save the &lt;em&gt;*&lt;em&gt;AppID *&lt;/em&gt;_and **_AppSign&lt;/em&gt;**&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Open &lt;code&gt;package.json&lt;/code&gt; and add this all libraries &amp;amp; run command &lt;code&gt;npm i&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"@react-navigation/native": "^6.0.13",
"@react-navigation/native-stack": "^6.9.1",
"@zegocloud/zego-uikit-prebuilt-call-rn": "^1.2.1",
"@zegocloud/zego-uikit-rn": "^1.2.0",
"react-delegate-component": "^1.0.0",
"react-native-gesture-handler": "^2.8.0",
"react-native-safe-area-context": "^4.4.1",
"react-native-screens": "^3.18.2",
"react-navigation": "^4.4.4",
"zego-express-engine-reactnative": "^0.21.0"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2F1uufps4b73m4kwh2xeva.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%2F1uufps4b73m4kwh2xeva.PNG" alt="Image description" width="605" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a component and add following code, it will show a button to join a call
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { NavigationContainer, useNavigation} from '@react-navigation/native';
import React from "react";
import { Button, View} from 'react-native'
import { createNativeStackNavigator } from '@react-navigation/native-stack';

const Stack = createNativeStackNavigator();
export default function App() {
  return (
    &amp;lt;NavigationContainer&amp;gt;
      &amp;lt;Stack.Navigator initialRouteName="HomePage"&amp;gt;
        &amp;lt;Stack.Screen name="HomePage" component={HomePage} /&amp;gt;
      &amp;lt;/Stack.Navigator&amp;gt;
    &amp;lt;/NavigationContainer&amp;gt;
  );
}

function HomePage(props) {
    const navigation = useNavigation();
    return (
        &amp;lt;View style={{flex: 1,alignItems: 'center',justifyContent: 'space-around'}}&amp;gt;
            &amp;lt;Button title="Call" onPress={() =&amp;gt; { navigation.navigate('CallPage') }} /&amp;gt;
        &amp;lt;/View&amp;gt;
    )
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fqr7ptctv3qkkhxhjy33i.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%2Fqr7ptctv3qkkhxhjy33i.PNG" alt="Image description" width="800" height="482"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add a component for Video calling
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import ZegoUIKitPrebuiltCall, {GROUP_VOICE_CALL_CONFIG} from '@zegocloud/zego-uikit-prebuilt-call-rn';
function CallPage(props) {
  randomUserID = String(Math.floor(Math.random() * 100000))
  return (
      &amp;lt;View style={{flex: 1}}&amp;gt;
          &amp;lt;ZegoUIKitPrebuiltCall
            appID={1484647939}
            appSign='16e1c2b4d4c6345c8644546e8fe636d8b7e47d010e9b4a8825439ecd64ccee6f'
            userID={randomUserID}
            userName={'user_'+randomUserID}

            config={{
              ...GROUP_VOICE_CALL_CONFIG,
              onHangUp: () =&amp;gt; {props.navigation.navigate('HomePage')},
            }}
          /&amp;gt;
      &amp;lt;/View&amp;gt;
  )
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fwz09co9j9kjlmhmjchl3.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%2Fwz09co9j9kjlmhmjchl3.PNG" alt="Image description" width="800" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Add Device permission
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Android
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Go to file &lt;code&gt;project-name/android/app/src/main/AndroidManifest.xml&lt;/code&gt;and add below code
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /&amp;gt;
&amp;lt;uses-permission android:name="android.permission.RECORD_AUDIO" /&amp;gt;
&amp;lt;uses-permission android:name="android.permission.INTERNET" /&amp;gt;
&amp;lt;uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /&amp;gt;
&amp;lt;uses-permission android:name="android.permission.CAMERA" /&amp;gt;
&amp;lt;uses-permission android:name="android.permission.BLUETOOTH" /&amp;gt;
&amp;lt;uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /&amp;gt;
&amp;lt;uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /&amp;gt;
&amp;lt;uses-permission android:name="android.permission.READ_PHONE_STATE" /&amp;gt;
&amp;lt;uses-permission android:name="android.permission.WAKE_LOCK" /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fkpc96lt5etou5lz2vuws.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%2Fkpc96lt5etou5lz2vuws.PNG" alt="Image description" width="800" height="301"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to file &lt;code&gt;my_project/android/app/proguard-rules.pro&lt;/code&gt; and add below code
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-keep class **.zego.**  { *; }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fp3zxrg5spggyktln82o1.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%2Fp3zxrg5spggyktln82o1.PNG" alt="Image description" width="800" height="276"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  IOS
&lt;/h3&gt;

&lt;p&gt;9.Go to this file &lt;code&gt;my_project/ios/my_project/Info.plist&lt;/code&gt;  and add below code&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;key&amp;gt;NSCameraUsageDescription&amp;lt;/key&amp;gt;
&amp;lt;string&amp;gt;We need to use the camera&amp;lt;/string&amp;gt;
&amp;lt;key&amp;gt;NSMicrophoneUsageDescription&amp;lt;/key&amp;gt;
&amp;lt;string&amp;gt;We need to use the microphone&amp;lt;/string&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Ffsfw6dyq621uft377oao.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%2Ffsfw6dyq621uft377oao.PNG" alt="Image description" width="800" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Run Application
&lt;/h2&gt;

&lt;p&gt;Run on an iOS device: &lt;code&gt;yarn ios&lt;/code&gt;&lt;br&gt;
Run on an Android device: &lt;code&gt;yarn android&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Checkout &lt;a href="https://www.zegocloud.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;ZEGOCLOUD&lt;/strong&gt;&lt;/a&gt; documentation for more understanding and other common use cases. You can get a sample &lt;a href="https://github.com/DavidReloo/call_kit_demo_react_native" rel="noopener noreferrer"&gt;&lt;strong&gt;source code&lt;/strong&gt;&lt;/a&gt; for React Native Voice &amp;amp; Video Calling demo from their documentation a&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>mobile</category>
      <category>zegocloud</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Find Courses for Learning (Submission for Hackathon)</title>
      <dc:creator>Zain Ahmed</dc:creator>
      <pubDate>Tue, 06 Dec 2022 12:31:41 +0000</pubDate>
      <link>https://dev.to/zainbinfurqan/find-my-free-course-3k0a</link>
      <guid>https://dev.to/zainbinfurqan/find-my-free-course-3k0a</guid>
      <description>&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;A platform that will help people to find &lt;strong&gt;&lt;em&gt;FREE&lt;/em&gt;&lt;/strong&gt; courses related to their respective domain (frontend, backend, fullstack etc) from different resources like &lt;strong&gt;Udemy&lt;/strong&gt;, &lt;strong&gt;Coursera&lt;/strong&gt;, &lt;strong&gt;Youtube&lt;/strong&gt; etc.&lt;/p&gt;

&lt;h3&gt;
  
  
  Category Submission: &lt;strong&gt;Search No More&lt;/strong&gt;
&lt;/h3&gt;

&lt;h3&gt;
  
  
  App Link
&lt;/h3&gt;

&lt;p&gt;I will deploy it soon, mean while it's an &lt;strong&gt;&lt;em&gt;open source&lt;/em&gt;&lt;/strong&gt; project you guys can &lt;strong&gt;clone&lt;/strong&gt; and run the project for testing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Screenshots
&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%2Fdjki5qiff393jtkudgqv.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%2Fdjki5qiff393jtkudgqv.PNG" alt="Login" width="470" height="452"&gt;&lt;/a&gt;&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%2Fdquau2v5t4kpyuplptgr.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%2Fdquau2v5t4kpyuplptgr.PNG" alt="Signup" width="505" height="619"&gt;&lt;/a&gt;&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%2Fmwb6reewaj1mhkstexty.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%2Fmwb6reewaj1mhkstexty.PNG" alt="Full text search" width="800" height="369"&gt;&lt;/a&gt;&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%2Fqgcl9hbikka6n83ggqov.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%2Fqgcl9hbikka6n83ggqov.PNG" alt="Autocomplete search" width="800" height="368"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Description
&lt;/h2&gt;

&lt;p&gt;Tech Stack: MERN Stack (React, Node.js, MongoDB Atlas) &lt;br&gt;
On FrontEnd (React.js) i have use a basic folder structure to for CRUD operations, UI, API's calling etc, you can review below&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%2Fr12idrd9y5joa26b4p0m.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%2Fr12idrd9y5joa26b4p0m.png" alt="Frontend codebase structure" width="800" height="898"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On BackEnd (Node.js) i have use MRC structure (Model, Route, Controller). currently i have done all the functionality in a single "index.js" file for time save, I have also use Socket.io to make a Realtime connection from Backend to Frontend for some features.&lt;/p&gt;

&lt;p&gt;On Database, I have use MongoDB Atlas to save data and use the full-text-search and auto suggest search feature of MongoDB.&lt;/p&gt;

&lt;h3&gt;
  
  
  Features
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;User can SignUp, Login &amp;amp; login as guest&lt;br&gt;
User can search for free courses.&lt;br&gt;
Courses will be free and from different resources like Udemy, Coursera, youtube etc.&lt;br&gt;
Courses will be related to different domain like frontend, backend, devops, fullstack etc, with parent domain IT&lt;br&gt;
User can filter courses on bases of search input&lt;br&gt;
User will get some quick suggestions for search input to make search more quick.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Phase 2 Features
&lt;/h3&gt;

&lt;p&gt;I will create/design a script to scrapping from different courses websites and will update database,&lt;br&gt;
I will create a job using MongoDB Tigger feature which will update courses and.&lt;br&gt;
check out video about this feature on my YouTube channel &lt;a href="https://www.youtube.com/watch?v=hDyFF0EicUU" rel="noopener noreferrer"&gt;MongoDB Trigger&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Link to Source Code
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/zainbinfurqan/hackathon-mongoDB-2022" rel="noopener noreferrer"&gt;Find my course - Source Code&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Permissive License
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/zainbinfurqan/hackathon-mongoDB-2022/blob/master/LICENSE" rel="noopener noreferrer"&gt;License&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Background
&lt;/h2&gt;

&lt;p&gt;I was making a video on &lt;strong&gt;&lt;em&gt;recession&lt;/em&gt;&lt;/strong&gt; in the field of Software engineering for my Youtube Channel &lt;a href="https://www.youtube.com/c/yarcoder" rel="noopener noreferrer"&gt;Yar Coder&lt;/a&gt;, and I thought why not to create a platform that will help people learn new things for their future so they will have more opportunities to explore &amp;amp; get job easily in this recession wave.&lt;/p&gt;

&lt;h3&gt;
  
  
  How I built it
&lt;/h3&gt;

&lt;p&gt;My main focus was to make search more quick and easy so i decided to pick &lt;strong&gt;search&lt;/strong&gt; category and explore the full text search &amp;amp; autocomplete feature in MongoDB Atlas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Personal note
&lt;/h3&gt;

&lt;p&gt;You can check out my YouTube channel for other &lt;strong&gt;IT&lt;/strong&gt; related &lt;strong&gt;Tutorials&lt;/strong&gt;. &lt;br&gt;
&lt;a href="https://www.youtube.com/c/yarcoder" rel="noopener noreferrer"&gt;Yar Coder&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
