<?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: Kyle Buntin</title>
    <description>The latest articles on DEV Community by Kyle Buntin (@kyle_buntin).</description>
    <link>https://dev.to/kyle_buntin</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%2F682451%2Fe4c17976-2d4d-4572-aa58-bcaecab178da.jpg</url>
      <title>DEV Community: Kyle Buntin</title>
      <link>https://dev.to/kyle_buntin</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kyle_buntin"/>
    <language>en</language>
    <item>
      <title>How to build a simple Live Video Streaming App with React Native and Agora</title>
      <dc:creator>Kyle Buntin</dc:creator>
      <pubDate>Sat, 22 Jan 2022 15:49:37 +0000</pubDate>
      <link>https://dev.to/kyle_buntin/how-to-build-a-simple-live-video-streaming-app-with-react-native-and-agora-o40</link>
      <guid>https://dev.to/kyle_buntin/how-to-build-a-simple-live-video-streaming-app-with-react-native-and-agora-o40</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NlbNJwLm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s78x4t8xzpa46wadouzx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NlbNJwLm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s78x4t8xzpa46wadouzx.png" alt="Image description" width="880" height="587"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are different characteristics to building flexible, premium, live video streaming app. For instance, While maintaining cross-platform compatibility, maintaining low latency, load balancing, and directing thousands of users in the audience can be quite tasking.&lt;/p&gt;

&lt;p&gt;However, there is a convenient way to making this happen using the Agora React Native SDK. In this article, we will create a live broadcasting app which can accommodate numerous broadcasters and entertain thousands of users by using the magic of the Agora Video SDK. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What we need:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://console.agora.io/"&gt;Agora Account&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;App-ID from Agora&lt;/li&gt;
&lt;li&gt;Client-side implementation with the module — &lt;a href="https://github.com/AgoraIO-Community/react-native-agora#readme"&gt;react-native-agora&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Client-side implementation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We add our agora module&lt;/p&gt;

&lt;p&gt;&lt;code&gt;yarn add react-native-agora&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;After doing that, you follow the simple installation instructions &lt;a href="https://github.com/AgoraIO-Community/react-native-agora#:~:text=Android%20Installation"&gt;here for android&lt;/a&gt; and &lt;a href="https://github.com/AgoraIO-Community/react-native-agora#:~:text=Android%20Installation-,iOS%20Installation,-Installing%20"&gt;here for iOS&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Got to your ios folder and run: &lt;br&gt;
&lt;code&gt;pod install&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now we implement the Live stream.&lt;/p&gt;

&lt;p&gt;First, we need to sort out permissions in a different file named Permission.ts, we request permission bellow.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  import { PermissionsAndroid } from 'react-native';

export default async function requestCameraAndAudioPermission() {
  try {
    const granted = await PermissionsAndroid.requestMultiple([
      PermissionsAndroid.PERMISSIONS.CAMERA,
      PermissionsAndroid.PERMISSIONS.RECORD_AUDIO,
    ]);
    if (
      granted['android.permission.RECORD_AUDIO'] ===
        PermissionsAndroid.RESULTS.GRANTED &amp;amp;&amp;amp;
      granted['android.permission.CAMERA'] ===
        PermissionsAndroid.RESULTS.GRANTED
    ) {
      console.log('You can use the cameras &amp;amp; mic');
    } else {
      console.log('Permission denied');
    }
  } catch (err) {
    console.warn(err);
  }
}


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

&lt;/div&gt;



&lt;p&gt;Now we import it in our main LiveScreen.js file where our main logic will be implemented&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, useRef, useState } from 'react';
import {
  Platform,
  ActivityIndicator,
  StyleSheet,
  Dimensions,
} from 'react-native';
import 'react-native-get-random-values';
import { v4 as uuid } from 'uuid';
import RtcEngine, {
  ChannelProfile,
  RtcLocalView,
  RtcRemoteView,
} from 'react-native-agora';
import requestCameraAndAudioPermission from './Permission';

const SCREEN_HEIGHT = Dimensions.get('window').height;
const SCREEN_WIDTH = Dimensions.get('window').width;

export default function LiveScreen({ route }) {
  const isBroadcaster = route.params.type === 'create';
  const channelId = route.params.channel;

  const [joined, setJoined] = useState(false);

  const AgoraEngine = useRef();

  useEffect(() =&amp;gt; {
    if (Platform.OS === 'android') requestCameraAndAudioPermission();
    const uid = isBroadcaster ? 1 : 0;
    init().then(() =&amp;gt;
      AgoraEngine.current.joinChannel(null, channelId, null, uid),
    );
    return () =&amp;gt; {
      AgoraEngine.current.destroy();
    };
  }, []);

  const init = async () =&amp;gt; {
    AgoraEngine.current = await RtcEngine.create('You App ID Here');
    AgoraEngine.current.enableVideo();
    AgoraEngine.current.setChannelProfile(ChannelProfile.LiveBroadcasting);
    if (isBroadcaster)
      AgoraEngine.current.setClientRole(ClientRole.Broadcaster);

    AgoraEngine.current.addListener(
      'JoinChannelSuccess',
      (channelId, uid, elapsed) =&amp;gt; {
        console.log('JoinChannelSuccess', channelId, uid, elapsed);
        setJoined(true);
      },
    );
  };

  const onSwitchCamera = () =&amp;gt; AgoraEngine.current.switchCamera();

  return (
    &amp;lt;View style={styles.container}&amp;gt;
      {!joined ? (
        &amp;lt;&amp;gt;
          &amp;lt;ActivityIndicator
            size={60}
            color="#222"
            style={styles.activityIndicator}
          /&amp;gt;
          &amp;lt;Text style={styles.loadingText}&amp;gt;
            {'Joining Stream, Please Wait'}
          &amp;lt;/Text&amp;gt;
        &amp;lt;/&amp;gt;
      ) : (
        &amp;lt;&amp;gt;
          {isBroadcaster ? (
            &amp;lt;RtcLocalView.SurfaceView
              style={styles.fullscreen}
              channelId={channelId}
            /&amp;gt;
          ) : (
            &amp;lt;RtcRemoteView.SurfaceView
              uid={1}
              style={styles.fullscreen}
              channelId={channelId}
            /&amp;gt;
          )}
          &amp;lt;View style={styles.buttonContainer}&amp;gt;
            &amp;lt;TouchableOpacity style={styles.button} onPress={onSwitchCamera}&amp;gt;
              &amp;lt;Text style={styles.buttonText}&amp;gt;{'Switch Camera'}&amp;lt;/Text&amp;gt;
            &amp;lt;/TouchableOpacity&amp;gt;
          &amp;lt;/View&amp;gt;
        &amp;lt;/&amp;gt;
      )}
    &amp;lt;/View&amp;gt;
  );
}

const styles = StyleSheet.create({
  loadingText: {
    fontSize: 18,
    color: '#222',
  },
  fullscreen: {
    width: SCREEN_WIDTH,
    height: SCREEN_HEIGHT,
  },
});


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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Let's work through the bunch of code we just wrote&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The LiveScreen receives a props: a channelId and a type. The channelId is a unique string of the channel to connect to and the type can either be "create" or "join" to either start a broadcast of join one.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We acquired Camera and Microphone permissions from Android to send Audio and Video.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We initiated the Agora Engine instance and setup all the necessary configurations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We joined the channel using no authentication and the channelId from the route prop.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;(NB: The joinChannel function takes 4 arguments, Authentication Token, Channel ID, Optional Info, and Optional UID.&lt;/p&gt;

&lt;p&gt;For a production app, you will need to fetch an authentication token to be generated by a middleware hosted on server-side.  To learn more about joinChannel, refer &lt;a href="https://docs.agora.io/en/Video/API%20Reference/react_native/classes/rtcengine.html#joinchannel"&gt;here&lt;/a&gt;.)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;We displayed the Local View and Remote View based on who is using the app, the broadcaster, or the audience.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We added a Switch Camera button to switch between the front camera and the back camera.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And That's all. You have a simple Live stream app working in minutes.&lt;/p&gt;

&lt;p&gt;Now, the next step can be to add advanced features such as:&lt;/p&gt;

&lt;p&gt;Live stream with video conference(many participants) and multiple audience, with embedded live chat with multiple audience, send request to join stream, and more. You can checkout this complete &lt;a href="https://www.quickcomponent.com/react-native-instagram-clone"&gt;Instagram clone&lt;/a&gt; with the features mentioned above and more. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vbbDKpJA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://static.wixstatic.com/media/6f8b4c_d8719413e6cd414f9393a7db580536d8%257Emv2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vbbDKpJA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://static.wixstatic.com/media/6f8b4c_d8719413e6cd414f9393a7db580536d8%257Emv2.png" alt="Image" width="880" height="695"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You should checkout &lt;a href="https://www.quickcomponent.com/app-templates"&gt;QuickComponent&lt;/a&gt; for other templates such as a Video calling app, Whatsapp clone, Shopify mobile app templates, and more.&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>tutorial</category>
      <category>javascript</category>
    </item>
    <item>
      <title>CreateRef VS UseRef</title>
      <dc:creator>Kyle Buntin</dc:creator>
      <pubDate>Thu, 14 Oct 2021 08:39:31 +0000</pubDate>
      <link>https://dev.to/kyle_buntin/createref-vs-useref-2k1f</link>
      <guid>https://dev.to/kyle_buntin/createref-vs-useref-2k1f</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_LJfi3Px--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4vmkxvrvsat3hzk3h0vc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_LJfi3Px--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4vmkxvrvsat3hzk3h0vc.png" alt="React" width="880" height="502"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A long time React user must have come across createRef and useRef refs to avoid the typical React dataflow and access a DOM element or a React component. Initially, these two provide similar functions, especially when looking closer at how each of them functions. Although, this is not the case. In order to eliminate the confusion between createRef and useRef, emphasis on the differences between these two will be given.&lt;/p&gt;

&lt;p&gt;First, before going deep into their differences, it is important to know how and where refs can be used in React.&lt;/p&gt;

&lt;p&gt;Specifically in React, Refs provides an escape invent to directly access React components or DOM elements in place of props and component state. This however, gives us the chance to modify the values that are associated with the React component or DOM elements without substituting its state. Moving forward, we’ll be going into the differences between CreateRef and UseRef.&lt;/p&gt;

&lt;p&gt;The utmost difference between CreateRef and UseRef is that it is advisable to use CreateRef inside class components and UseRef inside function components. The question now is, can we use it the other way round? An example will be given below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function TextInput () {
    const textInput = createRef()

    const focusOnInput = () =&amp;gt; {
        textInput.current.focus()
    }

    return (
        &amp;lt;div&amp;gt;
            &amp;lt;input ref={textInput} type="text" /&amp;gt;
            &amp;lt;button onClick={focusOnInput}&amp;gt;Focus on text input&amp;lt;/button&amp;gt;
        &amp;lt;/div&amp;gt;
    )
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the example above, using CreateRef does not have any specific difference to using useRef. Both refs successfully achieves the required goal of focusing the input in this situation. &lt;/p&gt;

&lt;p&gt;However, what if we decide to use CreateRef instead of useRef for a different situation inside the following ValueComponent function?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function ValueComponent () {
    const valueComponent = createRef(10)

    const changeValue = () =&amp;gt; {
       valueComponent.current += 1
    }


    return (
        &amp;lt;div&amp;gt;
            &amp;lt;div ref={valueComponent}&amp;gt;Value: {valueComponent.current}&amp;lt;/div&amp;gt;
            &amp;lt;button onClick={changeValue}&amp;gt;Change Value&amp;lt;/button&amp;gt;
        &amp;lt;/div&amp;gt;
    )
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, we can still get away with using CreateRef inside function component. The question now is; What happens if we render the element after changing the value stored in ref?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function ValueComponent () {
    const valueComponent = React.createRef(10)
    const {state, setState} = React.useState()


    return (
        &amp;lt;div&amp;gt;
            &amp;lt;div ref={valueComponent}&amp;gt;Value: {valueComponent.current}&amp;lt;/div&amp;gt;
            &amp;lt;button onClick={() =&amp;gt; (valueComponent.current = 2, setState({}))}&amp;gt;Change Value&amp;lt;/button&amp;gt;
        &amp;lt;/div&amp;gt;
    )
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Clicking on the button, we expect to see the value inside the div to change to 2 from the initial value of 10. In reality however, the value displayed is not 2 but 10.  Why is this so?&lt;/p&gt;

&lt;p&gt;Once a function component &lt;strong&gt;re-renders&lt;/strong&gt;, it acts like a &lt;strong&gt;normal function&lt;/strong&gt; and execute the full content in function logic. In this case, though the value of component current changes to 2 when we click the button, it changes again to 10 once the component &lt;strong&gt;re-renders&lt;/strong&gt;. It is clear that the displayed value &lt;strong&gt;does not&lt;/strong&gt; change as expected.&lt;/p&gt;

&lt;p&gt;Furthermore, CreateRef works with class components in this structure because &lt;strong&gt;re-rendering&lt;/strong&gt; a class component only calls the &lt;strong&gt;render()&lt;/strong&gt; function of the component.  Given the nature of function complements, it is safe to say we cannot use createRef with them in the same aspect.  Alternatively, we have to make use of useRef.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UseRef however does not reboot its values every time a function component re-renders&lt;/strong&gt;. As a substitute, it &lt;strong&gt;persists&lt;/strong&gt; the value stored all through the lifetime of the component.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function ValueComponent () {
    const valueComponent = React.useRef(10)
    const {state, setState} = React.useState()


    return (
        &amp;lt;div&amp;gt;
            &amp;lt;div ref={valueComponent}&amp;gt;Value: {valueComponent.current}&amp;lt;/div&amp;gt;
            &amp;lt;button onClick={() =&amp;gt; (valueComponent.current = 2, setState({}))}&amp;gt;Change Value&amp;lt;/button&amp;gt;
        &amp;lt;/div&amp;gt;
    )
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the button is clicked, the value changes to 2.&lt;/p&gt;

&lt;p&gt;In summary, in the process of using React for fronted development, there are situations where we have to go from the typical dataflow to directly accessing the DOM elements and React components. We make use of createRef and useRef API’s for this reason. &lt;br&gt;
Nevertheless, the two refs behave similarly most of the time, there is still a major difference between the two: createRef is required to be used inside Class components and useRef is required to be used inside function components. With this in mind, one can make use of React refs one program without needing to debate on which one to choose from henceforth.&lt;/p&gt;

&lt;p&gt;If you are interested in learning React native, you can check out this cool mobile templates at &lt;a href="https://www.quickcomponent.com/app-templates"&gt;Quick Component&lt;/a&gt;. These mobile templates are production ready and also good for learning purposes. &lt;br&gt;
They include; &lt;br&gt;
&lt;a href="https://www.quickcomponent.com/react-native-dating-app"&gt;Dating app&lt;/a&gt; &lt;a href="https://www.quickcomponent.com/react-native-whatsapp-clone"&gt;Whatsapp clone&lt;/a&gt; and more&lt;/p&gt;

</description>
      <category>react</category>
      <category>reactnative</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
    <item>
      <title>How to Reduce your Android release App size, up to 47% or even more — React Native</title>
      <dc:creator>Kyle Buntin</dc:creator>
      <pubDate>Wed, 29 Sep 2021 08:11:15 +0000</pubDate>
      <link>https://dev.to/kyle_buntin/how-to-reduce-your-android-release-app-size-up-to-47-or-even-more-react-native-h95</link>
      <guid>https://dev.to/kyle_buntin/how-to-reduce-your-android-release-app-size-up-to-47-or-even-more-react-native-h95</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--a3cMTRm8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8siwjkp9eh7fqfobx74s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--a3cMTRm8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8siwjkp9eh7fqfobx74s.png" alt="image" width="800" height="374"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;After finished developing and building your app, you then realise that it is somewhat bigger than what you prefer. &lt;br&gt;
The first thought that comes to your mind is "how can this be reduced?"&lt;br&gt;
Consider using Hermes to achieve this.&lt;/p&gt;

&lt;p&gt;In one of our apps at &lt;a href="https://www.quickcomponent.com/"&gt;Quick Component&lt;/a&gt;, we experienced about 19.2 percent decrease in app size when building release with Hermes. See the image below.&lt;/p&gt;

&lt;p&gt;Without Hermes&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KRXHaUeP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rcbdsytzfloomhvigqtl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KRXHaUeP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rcbdsytzfloomhvigqtl.png" alt="image" width="880" height="129"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With Hermes&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AZdwheTE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6q3df0l55fglxgh07jsv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AZdwheTE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6q3df0l55fglxgh07jsv.png" alt="image" width="880" height="90"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also checkout another app where about 47% decrease in app size was experienced using Hermes.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WQrYGeRI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gvu8a5j5awtqldzjtz6z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WQrYGeRI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gvu8a5j5awtqldzjtz6z.png" alt="image" width="880" height="62"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How do we build with Hermes?&lt;br&gt;
You only need to edit one or two files.&lt;/p&gt;

&lt;p&gt;In android/app/build.gradle enable Hermes&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; project.ext.react = [     
    entryFile: "index.js",          
    enableHermes: true  // clean and rebuild if changing 
 ]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also, if you're using ProGuard, you will need to add this rule in 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 com.facebook.hermes.unicode.** { *; }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, if you've already built your app at least once, clean the build:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ cd android &amp;amp;&amp;amp; ./gradlew clean
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And now you can build ur release as you would normally do  with&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;./gradlew bundleRelease
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also note that There are other benefits to using hermes like stated here: &lt;br&gt;
Hermes is an open-source JavaScript engine optimized for running React Native apps on Android. &lt;br&gt;
For many apps, enabling Hermes will result in improved start-up time, decreased memory usage, and smaller app size.&lt;/p&gt;

&lt;p&gt;Also, ensure you're using at least version 0.60.4 of React Native.&lt;/p&gt;

&lt;p&gt;Checkout a fully functioning templates with backend like the &lt;a href="https://www.quickcomponent.com/react-native-dating-app"&gt;Dating app&lt;/a&gt;, &lt;a href="https://www.quickcomponent.com/react-native-whatsapp-clone"&gt;Whatsapp clone&lt;/a&gt;(with audio and video calling), &lt;a href="https://www.quickcomponent.com/react-native-uber-eats-clone"&gt;UberEats clone&lt;/a&gt; and more built with React Native.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>What you didn't know about presenting screens with react-navigation</title>
      <dc:creator>Kyle Buntin</dc:creator>
      <pubDate>Mon, 20 Sep 2021 22:18:58 +0000</pubDate>
      <link>https://dev.to/kyle_buntin/what-you-didn-t-know-about-presenting-screens-with-react-navigation-47f6</link>
      <guid>https://dev.to/kyle_buntin/what-you-didn-t-know-about-presenting-screens-with-react-navigation-47f6</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0VFXSyYF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/13gbp19yu15es5t5fvoo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0VFXSyYF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/13gbp19yu15es5t5fvoo.png" alt="image" width="297" height="170"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Routing and Navigation in your react native apps have always been managed conveniently by &lt;a href="https://reactnavigation.org/docs/getting-started/"&gt;react navigation&lt;/a&gt; using different navigators like the Stack Navigator. &lt;/p&gt;

&lt;p&gt;But do you know you can easily manage how your screens are presented by editing the stack navigation options?&lt;br&gt;
This can be done using TransitionPresets imported from “@react-navigation/stack”. Let’s get right into it. First you import TransitionPresets.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0ZIi32Zg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/75ihajtl495wx0dbu05k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0ZIi32Zg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/75ihajtl495wx0dbu05k.png" alt="image" width="880" height="96"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Uz8lzyZf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gcn0epppuzvb9s4qea7e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Uz8lzyZf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gcn0epppuzvb9s4qea7e.png" alt="image" width="880" height="329"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From the dropdown in the image above, we have lot of options to choose from when presenting our screens. In this article, we will examine a few.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ScaleFromCenterAndroid:&lt;/strong&gt; As stated in the image, this is the standard Android navigation transition when opening an activity. See in the gif bellow how it is been used in a &lt;a href="https://www.quickcomponent.com/react-native-dating-app"&gt;Dating app&lt;/a&gt; to transition from a card to a card detail.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YQoEFWmB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://miro.medium.com/max/592/0%2AefENFGheogt_6h5q.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YQoEFWmB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://miro.medium.com/max/592/0%2AefENFGheogt_6h5q.gif" alt="image" width="296" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ModalPresentationIOS:&lt;/strong&gt; In here, we have the standard ios modal presentation style introduced in iOS13.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DBoFE0Iv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://miro.medium.com/max/592/0%2ALp9ePfjWuiKwalVR.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DBoFE0Iv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://miro.medium.com/max/592/0%2ALp9ePfjWuiKwalVR.gif" alt="image" width="296" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You should note that transitions are very smooth, but reduced here since it was a gif image upload. Moving forward, you can take advantage of this TransitionPreset and try out other options on your own. In doing so, you won’t even need the modal component imported from react-native, and you will have more control on how individual screens are presented. &lt;br&gt;
See here how we have taken full advantage of this at &lt;a href="https://www.quickcomponent.com/app-templates"&gt;Quickcomponent&lt;/a&gt; with all fully functioning templates like the &lt;a href="https://www.quickcomponent.com/react-native-dating-app"&gt;Dating app&lt;/a&gt;, &lt;a href="https://www.quickcomponent.com/react-native-whatsapp-clone"&gt;Whatsapp clone&lt;/a&gt;, &lt;a href="https://www.quickcomponent.com/react-native-uber-eats-clone"&gt;UberEats clone&lt;/a&gt; and more.&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>react</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Get a Dating App built with React Native</title>
      <dc:creator>Kyle Buntin</dc:creator>
      <pubDate>Fri, 17 Sep 2021 11:07:43 +0000</pubDate>
      <link>https://dev.to/kyle_buntin/functioning-react-native-dating-app-9am</link>
      <guid>https://dev.to/kyle_buntin/functioning-react-native-dating-app-9am</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GRs3KS76--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/aee4etim4pmqvj3omb71.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GRs3KS76--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/aee4etim4pmqvj3omb71.png" alt="React Native Dating app" width="880" height="695"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Reduce your development time tremendously with a fully functional &lt;a href="https://www.quickcomponent.com/app-templates"&gt;Dating app&lt;/a&gt; for both IOS and Android build with React Native.&lt;br&gt;
With the React Native Dating app, You get a clean codebase that can be easily modified and maintained. Created with React Native, easily editable and ready to launch.&lt;/p&gt;

&lt;h3&gt;
  
  
  Features include:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Matching Algorithm for recommendations&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Swipe for Like, Super like and Dislike - like Tinder&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Filter&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Age&lt;/li&gt;
&lt;li&gt;Distance&lt;/li&gt;
&lt;li&gt;Location&lt;/li&gt;
&lt;li&gt;Gender Interest&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Video and Audio calling&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Connection Service integration for Android&lt;/li&gt;
&lt;li&gt;PushKit &amp;amp; CallKit integration for iOS&lt;/li&gt;
&lt;li&gt;Foreground, Background and Locked Screen calls&lt;/li&gt;
&lt;li&gt;Group and 1:1 calls&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Messaging&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Real-time 1:1 Private conversation&lt;/li&gt;
&lt;li&gt;Real-time Group conversation&lt;/li&gt;
&lt;li&gt;Share photos, videos, and audio file.&lt;/li&gt;
&lt;li&gt;Typing indicator&lt;/li&gt;
&lt;li&gt;Online indicator&lt;/li&gt;
&lt;li&gt;last seen&lt;/li&gt;
&lt;li&gt;unread message count&lt;/li&gt;
&lt;li&gt;clickable URL&lt;/li&gt;
&lt;li&gt;copy text feature&lt;/li&gt;
&lt;li&gt;caption photos and videos&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Push Notification&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;New match&lt;/li&gt;
&lt;li&gt;New messages&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Settings&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;switch Show me&lt;/li&gt;
&lt;li&gt;push notifications settings for chat and new match&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Account&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Profile Details&lt;/li&gt;
&lt;li&gt;Edit Profile Info&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Customer Authentication and Registration Flow&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>How to Structure and Modularise a Maintainable code in React Native</title>
      <dc:creator>Kyle Buntin</dc:creator>
      <pubDate>Wed, 18 Aug 2021 07:43:55 +0000</pubDate>
      <link>https://dev.to/kyle_buntin/how-to-structure-and-modularise-a-maintainable-code-in-react-native-4ef7</link>
      <guid>https://dev.to/kyle_buntin/how-to-structure-and-modularise-a-maintainable-code-in-react-native-4ef7</guid>
      <description>&lt;p&gt;When bootstrapping a new project, we always strive to achieve the best structure that enables, scalability, easy maintenance and a modularised structure. The goal is to have a self explanatory code structure. In this tutorial which is opinionated and was inspired by my new job at &lt;a href="https://www.quickcomponent.com/app-templates"&gt;QuickComponent&lt;/a&gt;, I will be sharing few tips on how we have tried to achieve a well structured code in building a simple &lt;a href="https://github.com/quickcomponent/LoginApp"&gt;LoginApp&lt;/a&gt; Screen.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--J64n737k--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0wdcur9zdgyqv5he4w7g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--J64n737k--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0wdcur9zdgyqv5he4w7g.png" alt="image" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For this simple login screen, we have folders and files such as:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ern2Na8n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2mxeni67yc4ygcyrdvqa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ern2Na8n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2mxeni67yc4ygcyrdvqa.png" alt="image" width="730" height="1086"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;src:&lt;/strong&gt; A folder where all source code lives&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;components:&lt;/strong&gt; This house reusable components that are shared anywhere in the app.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;hooks:&lt;/strong&gt; This folders contains the general custom hooks used anywhere in the app.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;screens:&lt;/strong&gt; This generally holds different reusable components to make up a single component for screen display.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Analysing the components folder:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Button:&lt;/strong&gt; A subfolder of components, In here, we have separated the ui from the styles file.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--r_N38jnn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5jqo4jgngqjcb6pb8wo4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--r_N38jnn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5jqo4jgngqjcb6pb8wo4.png" alt="image" width="734" height="358"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AnimatedTextInput:&lt;/strong&gt; A subfolder of components, In here, we have a text input component of which the ui is separated from the styles file.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AnimatedInputFields:&lt;/strong&gt; A subfolder of components, In here, we have used AnimatedTextInput to create auto generate multiple fields based on given props passed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;index:&lt;/strong&gt; A file that simply exports all components to enable us import in this manner.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--49guF6XN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kozvx2zr329zcvc1rilv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--49guF6XN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kozvx2zr329zcvc1rilv.png" alt="image" width="880" height="245"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Analysing the &lt;strong&gt;screens&lt;/strong&gt; folder:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--t3yVmgXO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w309pv4njhoo5nwtvqcn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--t3yVmgXO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w309pv4njhoo5nwtvqcn.png" alt="image" width="526" height="1014"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Auth:&lt;/strong&gt; A subfolder of screens In here, we have created multiple subfolders in a attempt to group all auth related screens in a single folder.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;hooks:&lt;/strong&gt; A subfolder of Auth, In here, we have all custom auth related hooks. This include a useAuth hook used to authenticate user. In doing so, you have separated your auth business logic from the ui code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;components:&lt;/strong&gt; A subfolder of Auth, In here, we have all components reused only in Auth related screens.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;LoginScreen:&lt;/strong&gt; A subfolder of Auth, In here, we have The LoginScreen ui file separated from the styles file. You can also find the inputFields file, whose content is display in the picture bellow.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;inputFieldsConfig:&lt;/strong&gt; A subfolder of LoginScreen, This inputFieldsConfig file clearly defines the input fields rendered in the login screen. In doing so, it becomes easy to add or delete from a field without touching the UI code. It also contains the error messages and regex for validation.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Mr42-uQx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2zus5vpzhmb8dko6yq6d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Mr42-uQx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2zus5vpzhmb8dko6yq6d.png" alt="image" width="880" height="768"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;index:&lt;/strong&gt; Just like the index file recently mentioned, it does the same thing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You should Take note of what we have done below and try to adapt it to your own style of structuring and modularising. we have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Made sure all codes in each files are written with the goal of not exceeding 350 lines of code in a single file. When this threshold is hit, we start to examine the module being created and see how it can be broken down.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We try to create reusable custom hooks to separate business logic from UI code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We try to group related components close to the screen components when we are not sure if it will be use any other place in the app.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We have made sure a single function doesn’t get overly long and become too difficult to read.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;More pictures showing code sample&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1uyr-wZ6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9aiga6ced73uymgauq2k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1uyr-wZ6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9aiga6ced73uymgauq2k.png" alt="image" width="880" height="886"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WRjBL0Z---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m42k3g090z2y7vbois2n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WRjBL0Z---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m42k3g090z2y7vbois2n.png" alt="image" width="880" height="615"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Moving forward, you can try to adopt and improve this style of structuring in your own app today.&lt;/p&gt;

&lt;p&gt;You will learn, unlearn, grow and get better in the way you structure your react native projects, when you work in a team, meet other developers and get your hands on large structured projects.&lt;/p&gt;

&lt;p&gt;We appreciate the time spent in reading this article. Find the complete source code for the &lt;a href="https://github.com/quickcomponent/LoginApp"&gt;LoginApp here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Check out other mobile templates that has adopted this file structuring system at &lt;a href="https://www.quickcomponent.com/app-templates"&gt;QuickComponent&lt;/a&gt;, where this article was first published.&lt;/p&gt;

&lt;p&gt;This mobile templates includes a &lt;a href="https://www.quickcomponent.com/react-native-whatsapp-clone"&gt;Whatsapp clone&lt;/a&gt;, &lt;a href="https://www.quickcomponent.com/react-native-uber-eats-clone"&gt;Uber Eats Clone&lt;/a&gt; and more. It comes with a backend &lt;a href="https://rnfirebase.io/"&gt;(Firebase)&lt;/a&gt; configured, saving you quality hours of development time.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How To Build A Food Delivery App Like Uber Eats - Uber Eats clone</title>
      <dc:creator>Kyle Buntin</dc:creator>
      <pubDate>Sun, 15 Aug 2021 23:29:48 +0000</pubDate>
      <link>https://dev.to/kyle_buntin/how-to-build-a-food-delivery-app-like-uber-eats-uber-eats-clone-275p</link>
      <guid>https://dev.to/kyle_buntin/how-to-build-a-food-delivery-app-like-uber-eats-uber-eats-clone-275p</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aKKNG77Y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lbdt39hb42tmo7wtyp2x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aKKNG77Y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lbdt39hb42tmo7wtyp2x.png" alt="image" width="880" height="695"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Building an &lt;a href="https://www.quickcomponent.com/react-native-uber-eats-clone"&gt;Uber Eats Clone&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Building a Food delivery platform that connects you with a wide range of nearby restaurants and makes getting great food from your favorite local restaurants as easy as requesting a ride, consists of 3 panels. &lt;/p&gt;

&lt;p&gt;These panels can be customised by adding extra features and make it unique from other apps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Restaurant App:&lt;/strong&gt; A Restaurant, create a menu and add a new cuisine, with options letting customer browse through their page of different menu and place an order. The order placed is received and prepared for food delivery and places a request to the delivery boy to deliver the order to the customer. 75% of the profit, is kept by the Restaurant, and 25% goes to the  Food delivery platform.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Customer App:&lt;/strong&gt; A customer can browse through hundreds of nearby restaurants, make search for preferred restaurant, select a cuisine of their wish and place an order. This order is fully tracked on a map by the customer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Delivery Boy App:&lt;/strong&gt; A delivery request is received by the delivery boy They can choose to accept the order based on their convenience, and get turn-by-turn navigation UI with voice support. &lt;/p&gt;

&lt;p&gt;Generally, Before launching a food delivery platform like Uber Eats, you will be interested in;&lt;/p&gt;

&lt;p&gt;Carrying Out a Research&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The first thing would be to consider your target audience.&lt;/li&gt;
&lt;li&gt;Your business model and how you plan to operate.&lt;/li&gt;
&lt;li&gt;The persisting trend in the food delivery network and how you can improve on that.&lt;/li&gt;
&lt;li&gt;Consumer preference to enable you have the right first set of Restaurants on ur app.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Payment support&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You would want to consider a good payment support system that enable you accept all kind of payments. Stripe payment is a good choice to consider and also if you support cash on delivery.&lt;/p&gt;

&lt;p&gt;Considering all this, putting a team of developers is costly, from thousands of dollars and more than 6 months of development time to complete. You should not wait that long to start. Consider using a template. The good people at &lt;a href="https://www.quickcomponent.com"&gt;QuickComponent&lt;/a&gt; have an affordable &lt;a href="https://www.quickcomponent.com/react-native-uber-eats-clone"&gt;Uber Eats Clone Template&lt;/a&gt; that supports both iOS and Android and is ready for launch. This is important as it saves you Thousands of dollars and months of development time. You simply download and have your app running. You can easily modify this template to fit your business needs and requirements.&lt;/p&gt;

</description>
      <category>react</category>
      <category>reactnative</category>
      <category>template</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How To Turn Any Shopify Store to a Mobile App</title>
      <dc:creator>Kyle Buntin</dc:creator>
      <pubDate>Sun, 15 Aug 2021 22:19:35 +0000</pubDate>
      <link>https://dev.to/kyle_buntin/how-to-turn-any-shopify-store-to-a-mobile-app-4c05</link>
      <guid>https://dev.to/kyle_buntin/how-to-turn-any-shopify-store-to-a-mobile-app-4c05</guid>
      <description>&lt;p&gt;In this article, we are going to describe in details, the simple steps required to turn any Shopify store to a mobile app for iOS and android using this Shopify template.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--q06WCxj0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4o57tvipxrywc8u37l49.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--q06WCxj0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4o57tvipxrywc8u37l49.png" alt="image" width="880" height="780"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Check out the template &lt;a href="https://www.quickcomponent.com/react-native-shopify"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This template is built with Expo React Native, and is optimised for both android and iOS. All you really need to do to have your app ready to be published to App Store(ios) or Google Play Store(Android) can be summarised in the steps below.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Shopify set up.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a Stripe account.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Link the created Stripe account to enable Apple pay, Google pay, and scan or input Card to pay.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You should note that the listed steps above require no coding knowledge. Everything is fully explained in details and anyone can apply and turn their Shopify store into a mobile app with ease.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Shopify set up&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To set up Shopify, you will need to;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Generate the necessary  Shopify API keys -Storefront access token, API key and password.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Sign in to your Shopify admin dashboard of the store you have chosen to connect with your mobile app and generate a Storefront access token.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Right at the dashboard, the left menu list, go to Apps.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You should see &lt;strong&gt;Manage private apps&lt;/strong&gt;, at the bottom right of the page, click on it.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--A-WOPPSK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m8l4gcdykib09m9q944s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A-WOPPSK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m8l4gcdykib09m9q944s.png" alt="image" width="880" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Click on Create a new private app.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Locate App Details section, and input a name for the private app you are about to create and your contact email address. (Shopify uses the email address to contact the developer if there is an issue with the private app, such as when an API change might break it).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Locate Admin API section, and select the areas of your store you will like the app to have access to.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Please, Make sure you tick "Allow this app to access your storefront data..." like in the picture below. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fPtGnTQE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d310wr5ffxtsm5loawtb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fPtGnTQE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d310wr5ffxtsm5loawtb.png" alt="image" width="880" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;In the Storefront API permissions section, select which types of data you want to expose to the app.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Now click Save, and your storefront access token will be created. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After your Storefront access token has been created successfully, you will be routed to a page with different sections:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;App Details.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Admin API.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Storefront API.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Locate the Admin API, section, where you will find the API key and password, note this, as you will need this later. Also, make sure read and write permissions are set for all bellow.&lt;/p&gt;

&lt;p&gt;Also, Scroll to the bottom to locate the Storefront API section, note the Storefront access token you will find there.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KRiicXlG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ldg6eutijegb4ihmbaka.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KRiicXlG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ldg6eutijegb4ihmbaka.png" alt="image" width="880" height="328"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Update the Shopify keys in the React Native code**
Now, the noted keys should be used to update the config file on your project.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Open src/config.js file and paste the keys where specified.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;See &lt;a href="https://heliumdev.com/blog/shopify-enable-customer-accounts"&gt;here&lt;/a&gt; to enable customer accounts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You should note that details on getting started and linking stripe to your mobile app is added to the template folder.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Getting your mobile app to Run&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;First, make sure you have Node install and expo cli installed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We have chosen yarn to manage dependencies; since things are quite fast with yarn. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Install yarn here  If you do not currently have it installed.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To install dependencies, run command: &lt;/p&gt;

&lt;p&gt;&lt;code&gt;expo install  &lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;For IOS run the command :&lt;/p&gt;

&lt;p&gt;&lt;code&gt;yarn ios&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;For Android run the command :&lt;/p&gt;

&lt;p&gt;&lt;code&gt;yarn android&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

</description>
      <category>shopify</category>
      <category>reactnative</category>
      <category>javascript</category>
    </item>
    <item>
      <title>React Native Video Calling App</title>
      <dc:creator>Kyle Buntin</dc:creator>
      <pubDate>Tue, 10 Aug 2021 07:02:39 +0000</pubDate>
      <link>https://dev.to/kyle_buntin/react-native-video-calling-app-cga</link>
      <guid>https://dev.to/kyle_buntin/react-native-video-calling-app-cga</guid>
      <description>&lt;p&gt;&lt;a href="https://media.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%2Ffo48q1obyopfruujlhc2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Ffo48q1obyopfruujlhc2.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What you need:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A Twilio Account &lt;/li&gt;
&lt;li&gt;Server-side implementation (node.js)&lt;/li&gt;
&lt;li&gt;Client-side implementation with the module — react-native-twilio-video-webrtc &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Twiilio Account&lt;/strong&gt;&lt;br&gt;
We will be using Twilio, so you should signup &lt;a href="https://www.twilio.com/try-twilio" rel="noopener noreferrer"&gt;here&lt;/a&gt; and retrieve the essential keys -  API KEY SID, ACCOUNT SID, API KEY SECRET.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fxvhufl28tfn9qpbs1q0r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fxvhufl28tfn9qpbs1q0r.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;After that, navigate to Settings =&amp;gt; API Keys&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;click add a new api key, for &lt;strong&gt;type&lt;/strong&gt;, select the dropdown and choose &lt;strong&gt;main&lt;/strong&gt;.&lt;br&gt;
The api secret will only be shown once. You should copy and paste somewhere safe as you will need all keys for server-side implementation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fct30rvplczib6lyntn8d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fct30rvplczib6lyntn8d.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Server-side implementation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The step here is quite simple. Implement ur regular node express and add this route:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import 'dotenv/config';
import express from 'express';
import twilio from 'twilio';

const AccessToken = twilio.jwt.AccessToken;
const VideoGrant = AccessToken.VideoGrant;
const app = express();

app.get('/getToken', (req, res) =&amp;gt; {
if (!req.query || !req.query.room || !req.query.username) {
 return res.status(400).send('username and room parameter is required');
}
const accessToken = new AccessToken(
    process.env.ACCOUNT_SID,
    process.env.API_KEY_SID,
    process.env.API_KEY_SECRET
 ); // Set the Identity of this token
 const grant = new VideoGrant();

  accessToken.identity = req.query.username;// Grant access to Video
  grant.room = req.query.room;

  accessToken.addGrant(grant); // Serialize the token as a JWT
  const jwt = accessToken.toJwt();
  return res.send(jwt);
  });
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For this endpoint, we get a username as string and a room as string in the body of the query. We create a room and add the user to that room awaiting other participants.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Client-side implementation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now we can add twilio video webrtc module to our project&lt;/p&gt;

&lt;p&gt;&lt;code&gt;yarn add https://github.com/blackuy/react-native-twilio-video-webrtc&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Then, you follow the simple installation instructions &lt;a href="https://github.com/blackuy/react-native-twilio-video-webrtc#install-node-package" rel="noopener noreferrer"&gt;here&lt;/a&gt; for both android and iOS.&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, { useState, useRef } from "react";
import {
 Alert,
 AppRegistry,
 StyleSheet,
 Text,
 TextInput,
 View,
 Button,
 PermissionsAndroid,
 Platform,
 TouchableOpacity,
} from "react-native";

import {
 TwilioVideoLocalView,
 TwilioVideoParticipantView,
 TwilioVideo,
} from "react-native-twilio-video-webrtc";

import styleSheet from "./styles";

const styles = StyleSheet.create(styleSheet);

const App = (props) =&amp;gt; {
 const [isAudioEnabled, setIsAudioEnabled] = useState(true);
 const [isVideoEnabled, setIsVideoEnabled] = useState(true);
 const [status, setStatus] = useState("disconnected");
 const [participants, setParticipants] = useState(new Map());
 const [videoTracks, setVideoTracks] = useState(new Map());
 const [room, setRoom] = useState("");
 const [username, setUsername] = useState("");
 const twilioVideo = useRef(null);

 const fetchToken = async () =&amp;gt; {
 try {
 const res = await fetch(
 `https://&amp;lt;your_base_url&amp;gt;/getToken?username=${username}&amp;amp;room=${room}`
      );
 if (!res.ok) {
 console.log("error", error);
 Alert.alert("API not available");
 return null;
      }
 const jwt = await res.text();
 return jwt;
    } catch (error) {
 console.log("error", error);
 Alert.alert("An Error occurred");
 return null;
    }
  };

 const _onConnectButtonPress = async () =&amp;gt; {
 if (Platform.OS === "android") {
 await _requestAudioPermission();
 await _requestCameraPermission();
    }
 const token = await fetchToken();
 if (!token) {
 return;
    }
 twilioVideo.current.connect({
 accessToken: token,
 enableNetworkQualityReporting: true,
 dominantSpeakerEnabled: true,
    });
 setStatus("connecting");
  };

 const _onEndButtonPress = () =&amp;gt; {
 twilioVideo.current.disconnect();
  };

 const _onMuteButtonPress = () =&amp;gt; {
 twilioVideo.current
      .setLocalAudioEnabled(!isAudioEnabled)
      .then((isEnabled) =&amp;gt; setIsAudioEnabled(isEnabled));
  };

 const _onFlipButtonPress = () =&amp;gt; {
 twilioVideo.current.flipCamera();
  };

 const _onRoomDidConnect = () =&amp;gt; {
 setStatus("connected");
  };

 const _onRoomDidDisconnect = ({ error }) =&amp;gt; {
 console.log("ERROR: ", error);

 setStatus("disconnected");
  };

 const _onRoomDidFailToConnect = (error) =&amp;gt; {
 console.log("ERROR: ", error);

 setStatus("disconnected");
  };

 const _onParticipantAddedVideoTrack = ({ participant, track }) =&amp;gt; {
 console.log("onParticipantAddedVideoTrack: ", participant, track);

 setVideoTracks(
 new Map([
        ...videoTracks,
        [
 track.trackSid,
          { participantSid: participant.sid, videoTrackSid: track.trackSid },
        ],
      ])
    );
  };

 const _onParticipantRemovedVideoTrack = ({ participant, track }) =&amp;gt; {
 console.log("onParticipantRemovedVideoTrack: ", participant, track);

 const videoTracks = new Map(videoTracks);
 videoTracks.delete(track.trackSid);

 setVideoTracks(videoTracks);
  };

 const _onNetworkLevelChanged = ({ participant, isLocalUser, quality }) =&amp;gt; {
 console.log(
 "Participant",
 participant,
 "isLocalUser",
 isLocalUser,
 "quality",
 quality
    );
  };

 const _onDominantSpeakerDidChange = ({ roomName, roomSid, participant }) =&amp;gt; {
 console.log(
 "onDominantSpeakerDidChange",
 `roomName: ${roomName}`,
 `roomSid: ${roomSid}`,
 "participant:",
 participant
    );
  };

 const _requestAudioPermission = () =&amp;gt; {
 return PermissionsAndroid.request(
 PermissionsAndroid.PERMISSIONS.RECORD_AUDIO,
      {
 title: "Need permission to access microphone",
 message:
 "To run this demo we need permission to access your microphone",
 buttonNegative: "Cancel",
 buttonPositive: "OK",
      }
    );
  };

 const _requestCameraPermission = () =&amp;gt; {
 return PermissionsAndroid.request(PermissionsAndroid.PERMISSIONS.CAMERA, {
 title: "Need permission to access camera",
 message: "To run this demo we need permission to access your camera",
 buttonNegative: "Cancel",
 buttonPositive: "OK",
    });
  };

 return (
 &amp;lt;View style={styles.container}&amp;gt;
 {status === "disconnected" &amp;amp;&amp;amp; (
 &amp;lt;View&amp;gt;
 &amp;lt;Text style={styles.welcome}&amp;gt;React Native Twilio Video&amp;lt;/Text&amp;gt;
 &amp;lt;TextInput
 style={styles.input}
 autoCapitalize="none"
 value={username}
 onChangeText={(text) =&amp;gt; setUsername(text)}
 /&amp;gt;
 &amp;lt;TextInput
 style={styles.input}
 autoCapitalize="none"
 value={room}
 onChangeText={(text) =&amp;gt; setRoom(text)}
 /&amp;gt;
 &amp;lt;Button
 title="Connect"
 style={styles.button}
 onPress={_onConnectButtonPress}
 &amp;gt;&amp;lt;/Button&amp;gt;
 &amp;lt;/View&amp;gt;
      )}

 {(status === "connected" || status === "connecting") &amp;amp;&amp;amp; (
 &amp;lt;View style={styles.callContainer}&amp;gt;
 {status === "connected" &amp;amp;&amp;amp; (
 &amp;lt;View style={styles.remoteGrid}&amp;gt;
 {Array.from(videoTracks, ([trackSid, trackIdentifier]) =&amp;gt; {
 return (
 &amp;lt;TwilioVideoParticipantView
 style={styles.remoteVideo}
 key={trackSid}
 trackIdentifier={trackIdentifier}
 /&amp;gt;
                );
              })}
 &amp;lt;/View&amp;gt;
          )}
 &amp;lt;View style={styles.optionsContainer}&amp;gt;
 &amp;lt;TouchableOpacity
 style={styles.optionButton}
 onPress={_onEndButtonPress}
 &amp;gt;
 &amp;lt;Text style={{ fontSize: 12 }}&amp;gt;End&amp;lt;/Text&amp;gt;
 &amp;lt;/TouchableOpacity&amp;gt;
 &amp;lt;TouchableOpacity
 style={styles.optionButton}
 onPress={_onMuteButtonPress}
 &amp;gt;
 &amp;lt;Text style={{ fontSize: 12 }}&amp;gt;
 {isAudioEnabled ? "Mute" : "Unmute"}
 &amp;lt;/Text&amp;gt;
 &amp;lt;/TouchableOpacity&amp;gt;
 &amp;lt;TouchableOpacity
 style={styles.optionButton}
 onPress={_onFlipButtonPress}
 &amp;gt;
 &amp;lt;Text style={{ fontSize: 12 }}&amp;gt;Flip&amp;lt;/Text&amp;gt;
 &amp;lt;/TouchableOpacity&amp;gt;
 &amp;lt;TwilioVideoLocalView enabled={true} style={styles.localVideo} /&amp;gt;
 &amp;lt;/View&amp;gt;
 &amp;lt;/View&amp;gt;
      )}

 &amp;lt;TwilioVideo
 ref={twilioVideo}
 onRoomDidConnect={_onRoomDidConnect}
 onRoomDidDisconnect={_onRoomDidDisconnect}
 onRoomDidFailToConnect={_onRoomDidFailToConnect}
 onParticipantAddedVideoTrack={_onParticipantAddedVideoTrack}
 onParticipantRemovedVideoTrack={_onParticipantRemovedVideoTrack}
 onNetworkQualityLevelsChanged={_onNetworkLevelChanged}
 onDominantSpeakerDidChange={_onDominantSpeakerDidChange}
 /&amp;gt;
 &amp;lt;/View&amp;gt;
  );
};

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

&lt;/div&gt;



&lt;p&gt;copy and paste the above code in ur react native project, enter a room and a username and hit the connect button to start your video call.&lt;br&gt;
Oh. and make sure you have at least two devices to test and see that it actually works.&lt;/p&gt;

&lt;p&gt;After implementing a a basic video call in react native using Twilio , implementing both server-side and client side, the next step can be to add advanced features and help improve your skills like building a &lt;strong&gt;WhatsApp clone&lt;/strong&gt; which include standard calling features such as:&lt;br&gt;
Ringing another participant or multiple participant video calling rooms, group calls, managing and displaying participant status such as busy, declined call or not answered call. &lt;/p&gt;

&lt;p&gt;You should checkout &lt;a href="https://www.quickcomponent.com" rel="noopener noreferrer"&gt;QuickComponent&lt;/a&gt; for a proper Video calling app where all this features has been added. You find the React Native &lt;a href="https://www.quickcomponent.com/react-native-whatsapp-clone" rel="noopener noreferrer"&gt;WhatsApp Clone&lt;/a&gt; previously mentioned and more React native apps like, &lt;a href="https://www.quickcomponent.com/react-native-dating-app" rel="noopener noreferrer"&gt;Dating app&lt;/a&gt;, &lt;a href="https://www.quickcomponent.com/react-native-uber-eats-clone" rel="noopener noreferrer"&gt;UberEats clone&lt;/a&gt;, and more with complete video calling feature.&lt;/p&gt;

</description>
      <category>react</category>
      <category>reactnative</category>
    </item>
    <item>
      <title>Building Apps with React Native and Its Benefits
</title>
      <dc:creator>Kyle Buntin</dc:creator>
      <pubDate>Sun, 08 Aug 2021 21:31:52 +0000</pubDate>
      <link>https://dev.to/kyle_buntin/building-apps-with-react-native-and-its-benefits-1oig</link>
      <guid>https://dev.to/kyle_buntin/building-apps-with-react-native-and-its-benefits-1oig</guid>
      <description>&lt;p&gt;Building a mobile app, you will want to achieve attractiveness, great functionality and good user-experience. Below are some examples of how a successful mobile app is expected to be:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;◦ COMPATIBLE:&lt;/strong&gt; The app is expected to function in an effective manner for the device and its operating system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;◦ USER FRIENDLY AND APPEALING:&lt;/strong&gt; The app cannot have far more than usual interfering graphics. It is important that the app should look good and as well function properly without the normal usage being disturbed or affected in anyway.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;◦ UNIQUE AND BRANDED:&lt;/strong&gt; There's absolutely no reason assimilating into the extreme excess of apps available. Your app has to be highly noticeable and should therefore be able to create an impression on its users.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;◦ SUITABLE FOR ITS PURPOSE:&lt;/strong&gt; Apps must meet adequate standards for the target demographic and also for the audience your app would be helpful for. Its design needs to find all the boxes suitable.&lt;br&gt;
React Native is one of the app frameworks that make their app function effectively and incapable of being wrong or misused in less time. The JavaScript-based framework however helps you create the best apps from scratch or existing apps for the best User Interface and User Experience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HOW DOES REACT NATIVE HELP?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An app framework is a blessing for beginner developers. Below are the characteristics of React Native development:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;◦ Great Coding:&lt;/strong&gt; React Native includes JavaScript and it is rendered with their native code. They are able to exist and perform in agreeable condition with many platforms and they help create platform-specific technology with ease.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;◦ Native User Experience:&lt;/strong&gt; The platforms agnostic components helps give access to the UI building blocks without any complications which means there's no need to compromise your unique ideas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;◦ Versatile:&lt;/strong&gt; The work is easier and faster for new developers and existing ones because the framework is used to wrap already existing code for usage across different platforms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;◦ Speed:&lt;/strong&gt; When the work is completed, it can be saved, iterated and edited in no time thanks to React Native. It helps developers work at lighting speech with instant saving.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BENEFITS RESULTING IN BUILDING APPS WITH REACT NATIVE&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The development toolkit designed by Facebook however helps beginners to have significant progress across the most appealing apps with an extensive choice of the best elements in the market. This technology comes with benefits such as:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Less Development Time:&lt;/strong&gt; The reusable code offered can be used on many platforms to a large extent. Affording comfort in editing the existing work simply from amateurs to professionals, a prebuilt framework can surely increase their speed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Affordable:&lt;/strong&gt; It is much affordable to apply REACT NATIVE than to develop native codes for various operating systems. The framework capable of being used again makes its simpler for integration and creation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Engaging UI/UX Interface:&lt;/strong&gt; A successful app should be interactive, it shouldn't be like a storybook because responses are required from its users. With components like Picker, Button, Slider, etc, the job is made quite easier.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Credibility:&lt;/strong&gt; Apps like Facebook, F8, Instagram, Skype, and Bloomberg are the products of React Native developers which is therefore a guaranteed success because they were all built on the platform. The framework however, makes certain the foolproof app development with cross-platform compatibility.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Transfer and Testing:&lt;/strong&gt; Through a range of test runs, the Native App developers give certainty and confidence about the apps quality before the app is released. The Native code that has been used for apps can also be migrated and edited by the developers hassle-free.&lt;/p&gt;

&lt;p&gt;In conclusion, React Native development has proven to have the best quality and also to be cost-effective. &lt;br&gt;
&lt;a href="https://www.quickcomponent.com/"&gt;QuickComponent&lt;/a&gt; is a company that builds mobile app templates using react native framework. This templates comes with a backend configured, and are ready to launch, saving you thousands of dollars and quality hours of development time.&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>react</category>
      <category>mobile</category>
    </item>
    <item>
      <title>How to add Stripe payments in React Native</title>
      <dc:creator>Kyle Buntin</dc:creator>
      <pubDate>Sun, 08 Aug 2021 18:10:02 +0000</pubDate>
      <link>https://dev.to/kyle_buntin/stripe-payments-in-react-native-368j</link>
      <guid>https://dev.to/kyle_buntin/stripe-payments-in-react-native-368j</guid>
      <description>&lt;p&gt;Using stripe in react native, you should implement:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Server-side (node.js)&lt;/li&gt;
&lt;li&gt;Client-side using the official stripe react-native module.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  &lt;a href="https://github.com/stripe/stripe-react-native"&gt;— @stripe/stripe-react-native&lt;/a&gt;
&lt;/h5&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Server-side&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;You can find a great example to guide you &lt;a href="https://github.com/stripe/stripe-react-native/tree/master/example/server"&gt;here&lt;/a&gt;. This was implemented by the good people at stripe. We will make a few adjustment to this code. Using the routes found in the example, we will adjust how it is handled. The result is in the image below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aNpN1WD1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jv3fczy36i8ihy5phwrl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aNpN1WD1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jv3fczy36i8ihy5phwrl.png" alt="image" width="880" height="856"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XGQKXexa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l014ructpmt854q2i2ao.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XGQKXexa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l014ructpmt854q2i2ao.png" alt="image" width="880" height="130"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SLJj-bLq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/aqp6tccwxp75lnwbedy3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SLJj-bLq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/aqp6tccwxp75lnwbedy3.png" alt="image" width="880" height="598"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;payment-sheet:&lt;/strong&gt; We receive a request body containing customerId, currency, amount, and we make the necessary checks to ensure this field is supplied. After that, we use the fields to create a paymentIntent and an ephemeralKey. We send a response of this object to the client side.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;stripe-key:&lt;/strong&gt; This was implemented to retrieve the stripe publishable key.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;create-setup-intent:&lt;/strong&gt; We implemented this to set up stripe. We pass an email in the body of the request, with the email received, we retrieve the existing or create a new stripe customerId. We also create a setupIntent, after which we will have the client_secret available.&lt;/p&gt;

&lt;p&gt;We then respond with the publishableKey, clientSecret, and the customerId. And this is all in the server side. You should note that this is a minimum implementation and you should always ensure the amount ti charge is not passed in the body of the request but calculated on the server-side for security reasons.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Client-side using the official stripe react-native module&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Again, the good people at stripe, has made it extremely easy for us to implement any stripe supported payment means such as &lt;strong&gt;Apple Pay, Card payment, Scan card&lt;/strong&gt; to pay. We simply present a simple payment sheet.&lt;br&gt;
This payment sheet also enable us manage &lt;strong&gt;customer cards&lt;/strong&gt;(save and delete card) with ease. The work needed here is getting the keys needed to display this sheet hence the server-side implementation. Add the official react native module for stripe by running the command.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;yarn add @stripe/stripe-react-native&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;install pods by running the command&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cd iOS &amp;amp;&amp;amp; pod install &amp;amp;&amp;amp; cd ..&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And that’s all for installation, you should rebuild ur app now. If you have any problem while building for iOS relating to linking problem for swift. Then you should Try this solution. It wasn’t included in the documentation and I had to figure it out.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open ur project in Xcode&lt;/li&gt;
&lt;li&gt;From your project directory, add a new file, file.swift and don’t link bridge header when asked.&lt;/li&gt;
&lt;li&gt;Also, click on your project and not the target file, then Remove $(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME) and the rest from LIBRARY_SEARCH_PATHS in build settings.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now that our app is running successfully, We need to wrap our root App, most likely in the App.js file with a StripeProvider imported from @stripe/stripe-react-native, and set the publishableKey and merchantIds props like in the picture below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--clt_OfJe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g5hfrr10yjjugg3l7lc5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--clt_OfJe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g5hfrr10yjjugg3l7lc5.png" alt="image" width="880" height="730"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can now create a payment hook. Like in the image below&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aV-oX8kY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yh7dqdkkcip80o2mjar9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aV-oX8kY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yh7dqdkkcip80o2mjar9.png" alt="image" width="880" height="723"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;setupStripePayment and setupPaymentSheet:&lt;/strong&gt; We assume you are on ur checkout screen and this hook is implemented. These methods are called once the checkout component is mounted. we need to connect with the server-side, fetch the keys required to set up the payment sheet and this method help us to achieve that. we alertOnlinePaymentFailed if an error occurred while setting up the keys. If it is all successful, we initPaymentSheet with the keys and setCanPayOnline to true. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BYuZzlgI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hql4lek0n5eofubbx440.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BYuZzlgI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hql4lek0n5eofubbx440.png" alt="image" width="880" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--f9nfbhmW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jt91reauhftirggqiwd7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--f9nfbhmW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jt91reauhftirggqiwd7.png" alt="image" width="880" height="877"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;openPaymentSheet:&lt;/strong&gt; This method is called when the checkout button is pressed. We present a payment sheet and not worry about any other thing but the response from the presentPaymentSheet method. If we have an error filed from the response, we alert alertOnlinePaymentFailed and handle error, and if success, we handle success.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uu6yHN6u--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r7nj8767sg3slnh2raxe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uu6yHN6u--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r7nj8767sg3slnh2raxe.png" alt="image" width="880" height="255"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And That is all. We now have the client-side and server-side implemented and you will find that it is extremely easy to implement.&lt;br&gt;
See here how we have included this amazing &lt;a href="https://github.com/stripe/stripe-react-native"&gt;@stripe/stripe-react-native&lt;/a&gt; library in our templates at &lt;a href="https://www.quickcomponent.com/app-templates"&gt;QuickComponent&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CEawQN7Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qg1cet41cpi3bsrtd0fz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CEawQN7Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qg1cet41cpi3bsrtd0fz.png" alt="image" width="880" height="926"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Handling all user case error and success, using hooks.&lt;br&gt;
We have also used it in a complete Shopify mobile app templates built with react native. Also available with Woocommerce and Firebase backend.&lt;br&gt;
All Projects can be found here at &lt;a href="https://www.quickcomponent.com/app-templates"&gt;QuickComponent&lt;/a&gt;.  &lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>stripe</category>
      <category>react</category>
    </item>
  </channel>
</rss>
