<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Ran Greenberg on Medium]]></title>
        <description><![CDATA[Stories by Ran Greenberg on Medium]]></description>
        <link>https://medium.com/@RanGreenberg?source=rss-11a05c32556------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/0*DdJFGWsuwS-kr_Wa.jpg</url>
            <title>Stories by Ran Greenberg on Medium</title>
            <link>https://medium.com/@RanGreenberg?source=rss-11a05c32556------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Thu, 12 Nov 2026 08:34:46 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@RanGreenberg/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[COVID-19 BLE Solutions Index]]></title>
            <link>https://medium.com/@RanGreenberg/covid-19-ble-solutions-index-b64be1f544d7?source=rss-11a05c32556------2</link>
            <guid isPermaLink="false">https://medium.com/p/b64be1f544d7</guid>
            <category><![CDATA[coronavirus]]></category>
            <category><![CDATA[open-source]]></category>
            <category><![CDATA[covid19]]></category>
            <category><![CDATA[bluetooth]]></category>
            <category><![CDATA[mobile]]></category>
            <dc:creator><![CDATA[Ran Greenberg]]></dc:creator>
            <pubDate>Sun, 19 Apr 2020 05:58:03 GMT</pubDate>
            <atom:updated>2020-04-19T05:58:03.930Z</atom:updated>
            <content:encoded><![CDATA[<h3>COVID-19 Bluetooth Solutions Index</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*25veBSNmyd_O3Gky" /><figcaption>Photo by <a href="https://unsplash.com/@marvelous?utm_source=medium&amp;utm_medium=referral">Marvin Meyer</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>In the past two weeks, I’ve been working on a BLE solution as part of a joint effort team in Israel, for the ministry of health. <br>During those two weeks, I witnessed enormous efforts of technology companies, universities, and technology enthusiasts all trying to stop the COVID-19 epidemic spreading.</p><p>I decided to create a list of projects I came across. If you know (or own) any other projects you are more then welcome to PM me on twitter &gt; <a href="https://twitter.com/gran33">@gran33</a></p><h3><strong>Hamagen</strong></h3><h4><strong>Israel’s Ministry of Health’s COVID-19 Exposure Prevention</strong></h4><p><strong>Source: </strong><a href="https://github.com/MohGovIL/hamagen-react-native">https://github.com/MohGovIL/hamagen-react-native</a><br><strong>Made By</strong>: Israeli Ministry of Health (official)<br><strong>Discussion:</strong> React Native app for iOS and Android. In its roadmap to integrate BLE integration for improving exposure and accuracy.</p><h3>DP-3T</h3><h4>Decentralized Privacy-Preserving Proximity Tracing</h4><p><strong>Source:</strong> <a href="https://github.com/DP-3T">https://github.com/DP-3T</a><br><strong>Made By</strong>: Switzerland<br><strong>Discussion: </strong>Include SDKs for iOS and Android with demo apps and backend SDK. They’re working to be forward-compatible with the upcoming solution by Apple and Goggle.</p><h3>OpenTrace (BlueTrace)</h3><h4>Privacy-Preserving Cross-BorderContact Tracing</h4><p><strong>Source: </strong><a href="https://github.com/opentrace-community">https://github.com/opentrace-community</a><br><strong>Made By:</strong> Singapore (official)<br><strong>Discussion: </strong>Using BlueTrace protocol. Includes iOS and Android apps and a device calibration solution.</p><h3>COVID19CZ</h3><h4>A joint activity of Czech technology companies and IT enthusiasts</h4><p><strong>Source:</strong> <a href="https://github.com/covid19cz">https://github.com/covid19cz</a><br><strong>Made By: </strong>Czechia (Czech Republic) technology companies and IT enthusiasts<br><strong>Discussion: </strong>A list of projects include iOS and Android apps to fight against viral infection</p><h3>RN-Contact-Tracing</h3><h4>React Native library with dedicated BLE usage to manage contact tracing</h4><p><strong>Source: </strong><a href="https://github.com/wix-incubator/rn-contact-tracing">https://github.com/wix-incubator/rn-contact-tracing</a><br><strong>Made By</strong>: Wix (Israel)<br><strong>Discussion:</strong> This library is under WIP (work-in-progress). Include React-Native library (native module) with specific functionality to manage contact tracing.</p><h3>PrivateTracer</h3><h4>Enabling the tracing of interactions between citizens, while preserving privacy.</h4><p><strong>Source:</strong> <a href="https://gitlab.com/PrivateTracer">https://gitlab.com/PrivateTracer</a><br><strong>Made By</strong>: Netherlands<br><strong>Discussion: </strong>Native iOS and Android apps with Python backend. Using DP3T solution.</p><h3>SafePathes</h3><h4>Slow the spread without giving up privacy</h4><p><strong>Source:</strong> <a href="https://github.com/tripleblindmarket/covid-safe-paths">https://github.com/tripleblindmarket/covid-safe-paths</a><br><strong>Made By</strong>: MIT (Massachusetts, United States)<br><strong>Discussion: </strong>Using new PrivateKit framework (by MIT)</p><h3>CovidSafe</h3><h4>Slow the spread without giving up privacy</h4><p><strong>Source:</strong> <a href="https://github.com/COVIDSAFE">https://github.com/COVIDSAFE</a><br><strong>Made By</strong>: University of Washington (Seattle, United States)<br><strong>Discussion: </strong>React Native app on iOS and native Android app.</p><h3>COVID Watch</h3><h4>Reduce the spread of COVID-19 without increasing the spread of surveillance</h4><p><strong>Source:</strong> <a href="https://github.com/covid19risk">https://github.com/covid19risk</a><br><strong>Made By</strong>: United States (in collaboration with Stanford University)<br><strong>Discussion: </strong>List of projects includes native iOS and Android apps and server (Python).</p><h3>Covid Community Alert</h3><h4>World-level Open-Source Anonymous Protocol</h4><p><strong>Source:</strong> <a href="https://github.com/Coronavirus-Outbreak-Control">https://github.com/Coronavirus-Outbreak-Control</a><br><strong>Made By</strong>: Italy<br><strong>Discussion: </strong>iOS and Android native apps.</p><h3>Covid World</h3><h4>Fighting Covid Together</h4><p><strong>Source:</strong> <a href="https://github.com/CovidWorld">https://github.com/CovidWorld</a><br><strong>Made By</strong>: Slovakia<br><strong>Discussion: </strong>Native iOS and Android apps with C# backend. Using iBeacon signals.</p><h3>Pandoa</h3><h4>Stopping the infected chain by tracking contacts</h4><p><strong>Source:</strong> <a href="https://github.com/wirewirewirewire/pandoa">https://github.com/wirewirewirewire/pandoa</a><br><strong>Made By</strong>: WirVsVirus hackathon (Germany)<br><strong>Discussion: </strong>React native (expo) app for iOS and Android. Unmaintained.</p><h3>ito</h3><h4>Track infections, not people!</h4><p><strong>Source:</strong> <a href="https://github.com/ito-org">https://github.com/ito-org</a><br><strong>Made By</strong>: WirVsVirus hackathon (Germany)<br><strong>Discussion: </strong>React Native apps for iOS and Android, backend (Python).</p><h3>TrackCOVID</h3><h4>By tracking the spread of the virus, we can flatten the curve.</h4><p><strong>Source:</strong> <a href="https://github.com/tyleryasaka/TrackCOVID">https://github.com/tyleryasaka/TrackCOVID</a><br><strong>Made By</strong>: <a href="https://twitter.com/TylerMYasaka">Tyler M Yasaka</a> (United States)<br><strong>Discussion: </strong>Simulation web app, React native app, using Covid Watch. Unmaintained.</p><h3>CoEpi</h3><h4>Community Epidemiology in Action</h4><p><strong>Source:</strong> <a href="https://github.com/Co-Epi">https://github.com/Co-Epi</a><br><strong>Made By</strong>: A small group of individuals with diverse and relevant skills<br><strong>Discussion: </strong>A list of iOS, Android and backend projects.</p><h3>CX</h3><h4>Privacy-compatible distributed contact tracing</h4><p><strong>Source:</strong> <a href="https://github.com/ipxe/cx">https://github.com/ipxe/cx</a><br><strong>Made By:</strong> iPXE<br><strong>Discussion: </strong>Low-level solution includes an Android demo app.</p><h3>Conclusion</h3><p>Israel, Italy, United States, Czechia, Singapore, Germany, Slovakia, Stanford, MIT, UW, all these countries, universities and hackathons did an amazing isolated effort in order to avoid the epidemic spreading by using mobile devices Bluetooth abilities. <br>All of the above countries/institutions did more or less the same:</p><ul><li>iOS and Android code using advertise and scanning Bluetooth service.</li><li>Save to local database to gain users privacy as much as possible</li><li>Wrote some level of encryption in order to keep its etymology reliable</li><li>Blocked by the fact that iOS devices can’t be back to the background by any Bluetooth functionality</li></ul><p>In 2020 we have many worldwide unify efforts in order to achieve a goal, unfortunately, panic and stress lead the development processes and we got to this challenge one by one trying to solve the exact same problem.</p><p>I wish that in the next worldwide challenges we all be better in solving the shared challenge by less identical projects.</p><p>Stay safe and healthy! <br>❤</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b64be1f544d7" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Naming Convention — 8 Basic Rules for any Piece of Code]]></title>
            <link>https://medium.com/wix-engineering/naming-convention-8-basic-rules-for-any-piece-of-code-c4c5f65b0c09?source=rss-11a05c32556------2</link>
            <guid isPermaLink="false">https://medium.com/p/c4c5f65b0c09</guid>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[coding]]></category>
            <category><![CDATA[naming-conventions]]></category>
            <category><![CDATA[software-development]]></category>
            <dc:creator><![CDATA[Ran Greenberg]]></dc:creator>
            <pubDate>Thu, 10 Oct 2019 12:07:53 GMT</pubDate>
            <atom:updated>2022-01-29T20:31:34.303Z</atom:updated>
            <content:encoded><![CDATA[<h3>Naming Convention — 9 Basic Rules for any Piece of Code</h3><blockquote>“The ratio of time spent reading (code) versus writing is well over 10 to 1 … (therefore) making it easy to read makes it easier to write.” — Robert C. Martin</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*glqVwwdCval-C1eY" /><figcaption>Photo by <a href="https://unsplash.com/@brett_jordan?utm_source=medium&amp;utm_medium=referral">Brett Jordan</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>The naming convention is a very contentious topic. Everyone has their own style when it comes to naming variables, functions, classes, and even documentation.</p><p>There is no single or standard way to name your code parts.</p><h3>Definition</h3><blockquote>“Naming convention is a set of rules for choosing the character<strong> sequence</strong> to be used for identifiers which denote variables, types, functions, and other entities in source code and documentation” — Wikipedia</blockquote><h3>The Challenge</h3><blockquote><em>“The hardest thing about choosing good names is that it </em><strong><em>requires good descriptive skills</em></strong><em> and a </em><strong><em>shared cultural background</em></strong><em>. This is a teaching issue rather than a technical, business or management issue.”</em></blockquote><p>We’re all different and from different backgrounds. One can describe a thing completely different for others. More than that, people from different cultures can describe the same things differently. <br>Selecting the proper name for a function or a variable requires experience and many hours of code reading. This challenge is not a technical or management challenge, it’s a skill that requires much practice.</p><h3>Rule #1 — <strong>Consistency</strong></h3><h4>Pick One Word per Concept — Use the same concept across the codebase</h4><pre>fetchData() {...}</pre><pre>getData() {...}</pre><pre>retrieveData() {...}</pre><p>All 3 names of the above methods are the same and can be interpreted as the same operation. It doesn’t matter which one we actually pick, but it’s important that we’re consistent throughout the code. If we decide that fetch will request data remotely, we should stick with that convention for fetchPermissions and fetchUserDetails for instance.</p><h3>Rule #2 — <strong>Meaningful</strong></h3><h4>Characters are cheap, confusion is expensive</h4><pre>😳 const users;     😎 const numberOfUsers;<br>😳 const friends;   😎 const friendsOfCurrentUser;</pre><p>We write code with a 100% mindset of that feature or context. We forget that the next reader might come with a different mindset, so we should make sure we avoid ambiguity. <br>For instance, in function scope, we wrote users but we actually meant numberOfUsers, which can be misleading. Or if we wanted to create a variable with all the current user’s friends, we should name it friendsOfCurrentUserrather than friends.</p><h3>Rule #3 — <strong>Meaningful Distinctions</strong></h3><h4>Use the same word for the same purpose</h4><p>Two different things in the same scope? You might be <strong>tempted</strong> to change one name 😡</p><p>What is these functions’ return? 😕</p><pre>getUserDetails() {...}<br>getUserInfo() {...}<br>getUserData() {...}</pre><p>What’s the difference between details/info/data anyway?!</p><p>If we have 2 definitions for “not that different” object/class/variable we should consider aggregating its content differently. Or changing one of the names dramatically.</p><p>Another use-case:</p><pre>// Function in Class A<br>function add(x, y) {<br>  return x + y;<br>}</pre><pre>// Function in Class B<br>function add(x) {<br>  this.items.add(x);<br>}</pre><p>In class A, the add(x, y) function adding 2 numbers and in class B add(x) is insert element to the collection. Both functions&#39; names are correct, but without deep-dive to their implementations, you won’t be able to understand and use them. <br>A better name will be:</p><p>add(x, y) -&gt; addNumbers(x, y)</p><p>add(x) -&gt; insertElement(x)</p><h3>Rule #4 — <strong>Avoid Encodings</strong></h3><h4>Avoid unnecessary encodings of data-types along with the variable name</h4><pre>string urlString;<br>int numberOfMembersInt;<br>Array&lt;string&gt; namesArray;</pre><p>It might look good and be a useful practice, but in order to scale, this ambiguity will be annoying and hard to maintain.<br>The name should be a higher abstraction level of the implementation details of the actual variable type.</p><h3>Rule #5— <strong>Use Pronounceable Names</strong></h3><h4>Nobody wants a tongue twister or a non-searchable words</h4><pre>const lblFName; //first name label<br>const nowTsMs; //now date timestemp since 1970 in milliseconds</pre><p>These kinds of variables names are hard to pronounce and no one will be able to remember them, aside from the writer themself.</p><p>Moreover, our code should be able to be searchable. When the project becomes bigger and bigger we will search more and more. Better naming make scaling easier.</p><h3>Rule #6 — <strong>Don’t Be Offensive/Cute</strong></h3><h4>Don’t be a serial killer behind your code</h4><pre>function killThemAll();<br>function whack();<br>function giveSomeLove()</pre><p>Some projects are open-source, some are cross-cultural. The name you pick for your function will be read by a variety of people. The same thing can be interpreted differently between different people.</p><p>Naming convention should be generic, and as professional as possible, and should not include any cultural slang.</p><h3>Rule #7 — <strong>Be Positive</strong></h3><h4>shouldNotShowIfDisabledIsFalse ✌️</h4><p>isDisabled should become isEnabled</p><p>isUndefined should become isDefined</p><p>shouldNotShowScreen should become shouldShowScreen</p><p>avoidBroadcast should become doBroadcast</p><p>broadcastNotArrived() should become broadcastArrived({})</p><p>As humans, we have a better understanding of the positive approach (besides the <a href="https://en.wikipedia.org/wiki/New_Age#Religion,_spirituality,_and_esotericism">new-age</a> approach 😎) so we should use them in the names we pick.</p><h3>Rule #8 — Helper to the Manager with some Utils 🙄</h3><p>NetworkHelper<br>RequestManager<br>HttpUtils</p><p>These names above are just a way to ignore the challenges of select a descriptive name to that piece of code. No one really understands what has inside these files (or classes) or what does it do.</p><p>We better avoid these names, by avoiding that we’ll arrange our code better and won’t give life to these <a href="https://en.wikipedia.org/wiki/God_object">god objects</a>.</p><h3>Rule #9— <strong>Awareness 🤖</strong></h3><h4>Characters are cheap, confusion is expansive</h4><p>A few general bullets to keep in mind while we coding:</p><ul><li>We are NOT the <strong>only ones</strong> who read our code</li><li>Our <strong>mood</strong> is NOT related to the code we’re writing</li><li><strong>Humans</strong> read our code, not computers</li><li><strong>Read</strong> your code <strong>after</strong> you write it</li></ul><h3>Summary</h3><p>Naming is hard. Naming depends on your current mood and vibe. You can’t beat that. <br>More often than not, we’ll re-read the names we picked, the more readable the code will be. <br>The main focus of this article is raising awareness. Keep that in mind that you’re writing code for humans. Keep that in mind that someone needs to read what you wrote and actually understand it.</p><p>Hope you liked it! If so, don’t be shy to 👏 and share.</p><p>Awareness Naming ✌️ #goodlife</p><h4>Words Don’t Come Easy</h4><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FPTsSk0r_Tq8%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DPTsSk0r_Tq8&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FPTsSk0r_Tq8%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/02752ab95653fc074a77b691e8e9a9e3/href">https://medium.com/media/02752ab95653fc074a77b691e8e9a9e3/href</a></iframe><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c4c5f65b0c09" width="1" height="1" alt=""><hr><p><a href="https://medium.com/wix-engineering/naming-convention-8-basic-rules-for-any-piece-of-code-c4c5f65b0c09">Naming Convention — 8 Basic Rules for any Piece of Code</a> was originally published in <a href="https://medium.com/wix-engineering">Wix Engineering</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Velocity, Performance, Scaling - 3 Questions I ask before I pick React-Native over Native]]></title>
            <link>https://medium.com/wix-engineering/velocity-performance-scaling-3-questions-i-ask-before-i-pick-react-native-over-native-4048a855e91d?source=rss-11a05c32556------2</link>
            <guid isPermaLink="false">https://medium.com/p/4048a855e91d</guid>
            <category><![CDATA[android]]></category>
            <category><![CDATA[ios]]></category>
            <category><![CDATA[react-native]]></category>
            <category><![CDATA[performance]]></category>
            <category><![CDATA[development]]></category>
            <dc:creator><![CDATA[Ran Greenberg]]></dc:creator>
            <pubDate>Sun, 10 Feb 2019 21:13:10 GMT</pubDate>
            <atom:updated>2019-02-11T07:35:36.043Z</atom:updated>
            <content:encoded><![CDATA[<h3><strong>Velocity, Performance, Scaling </strong>- 3 Questions I ask before I choose React-Native over Native</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*94VYpXfC9h-nOiMIhb0xwg.jpeg" /><figcaption>Photo by <a href="https://unsplash.com/photos/G2mNz40OmBg?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Dawid Zawiła</a> on <a href="https://unsplash.com/search/photos/airshow?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></figcaption></figure><p>Technologies used for mobile apps development can pretty much be divided into 3 major categories:</p><ul><li><strong>Native </strong>- Java/Kotlin for Android and Objective-C and Swift for iOS</li><li><strong>Hybrid </strong>- Single code base in one language</li><li><strong>WebView based</strong> - Loads HTML + CSS + JavaScript pages</li></ul><p>I’ll mainly focus on Hybrid, and more specifically on <a href="https://facebook.github.io/react-native/">React Native</a>.</p><p>For the past 3 years, I’ve been using React Native for most of my mobile applications needs. Prior to that, I was all about native. In between, I published a couple of native apps (Java for Android and Objective-C for iOS) and even had thought about what I’d like to do next and what tech I’d use.</p><p>When I think of mobile applications technologies, I think of these topics:</p><ul><li><strong>Velocity </strong>- How fast is the development?</li><li><strong>Performance</strong> - How smooth the app will be?</li><li><strong>Scaling </strong>- Can I grow to 10x developers and features?</li></ul><h3>Velocity</h3><p><strong>Writing code once instead of twice</strong> is a key velocity factor when you pick cross-platform technology.</p><p>This means that the mobile development team can be <strong>half size</strong>. This also means that each team member can do <strong>any task</strong>, without any relations or dependency on his background or platform.</p><p>React Native covers most iOS and Android APIs, which in most cases, eliminates having to deal with platform-specific code and logic. And if we will have something missing, we will probably find it in one of the open sources libraries with are offered and supported by the incredibly friendly <strong>React Native community</strong>. I strongly suggest you dive into it, it’s a <a href="https://github.com/jondot/awesome-react-native">well-established community</a> and very helpful.</p><p>Usually, we have to deal with bugs, even when we sincerely think that our code is properly written and, in our hearts, are sure that is also functional. In this case, we write the code once, meaning we decrease the number of bug fixes we have to cover, rather than <strong>fixing the same bug twice</strong>, once in each platform.</p><p>React Native takes all the JavaScript code and bundles it into a single bundle file. Technologies, like Code Push, even offer to <strong>load this bundle file remotely</strong> in order to fix bugs without publishing any new binary files to the stores.</p><p>Since we write JavaScript code in React Native, we can also use <strong>test frameworks</strong> in order to test the code like <a href="https://jestjs.io/">Jest</a> and <a href="https://jasmine.github.io/">Jasmine</a>.</p><h3>Performance</h3><p>If we think CPUs, multiple cores, and advanced graphics, mobile devices nowadays are like computers. Mobile applications are super responsive and full of complex animations and gravity effects.</p><p>We can’t afford our next mobile application to have less than that, and under deliver. We can’t compromise on a low or non-responsive application.</p><p>React Native includes many challenges in the performance perspective, for instance:</p><ul><li>When the user presses a simple button, <strong>many messages</strong> are sent back and forth between the Native side and the JavaScript side. This might lead to frames dropping and laggy behavior.</li><li>React Native <strong>ListViews</strong> experiencing hard to perform when dealing with long lists.</li><li><strong>Interactive animations </strong>are hard to achieve.</li></ul><p>These are only a few of the many challenges we need to deal with when it comes to performance in React Native.</p><p>Most of our efforts will go to these kinds of tasks, and performance issues might lead to mediocre user experience.</p><p>In some cases, might even lead to writing platform-specific code, like complex grid views with complex animation, or animation while scrolling.</p><h3>Scaling</h3><p>React Native opens the door to JavaScript developers to write mobile applications. <strong>JavaScript is a dynamic-type language</strong>. JavaScript only interprets on runtime and doesn’t compile.</p><p>Tools like <a href="https://www.typescriptlang.org/">TypeScript</a> and <a href="https://flow.org/">Flow</a> try to soften the problem and offer great typing like tools which are supported by the vast majority of the IDEs (<a href="https://code.visualstudio.com/">VSCode</a>, <a href="https://www.jetbrains.com/webstorm/">WebStorm</a>, <a href="https://atom.io/">Atom</a>).</p><p>In order to have 10x more developers, you need to have strong <strong>testing methodologies</strong>, unit tests, E2E test, and integration tests. Without that, it will be hard to scale and will be hard to release the next application version.</p><p>Scaling also means that your app will do more. JavaScript is a <strong>single-threaded</strong> language, and when you do more, it means that the JavaScript thread will be busier by UI tasks, network requests, heavy computing and processing messages from the Native site to JavaScript side and vice versa.</p><p>When the JavaScript thread is busy, things start to have a delay and wait on the JavaScript events bus, meaning the application starts to lag.</p><p>At this point, you must examine the <strong>project architecture</strong> that was chosen. When the application loading time is greater than 10 seconds you have to deal with timeouts in the code and eager approach, instead of lazy loading approach.</p><p>But there is nothing special to React Native technology here, only the fact that you are getting punished earlier when you make wrong decisions because of the single-threaded limitation.</p><p>React Native is a new framework (~4 years) and the <strong>APIs still aren’t stable</strong> and break from version to version. Upgrading to the latest React Native version is hard and painful.</p><h3>Conclusion</h3><p><strong>React Native is awesome!</strong> Though it comes with a price.</p><p>You won’t pay this price if you bootstrap your application, have a POC or want an application that doesn’t do much. But if you want more than that, you’ll deal with performance and scale challenges.</p><p>React Native is getting better, its super strong community and big companies like <a href="https://github.com/facebook/react-native">Facebook</a>, <a href="https://www.wix.engineering/open-source">Wix</a>, and <a href="https://medium.com/@Pinterest_Engineering">Pinterest</a> choose this framework and are constantly improving it. Making the React Native choice is a smart choice, yet a risky and challenging one nonetheless.</p><p>It’s all about setting expectations.<br>For a simple application, containing just lists and simple pages with images and some text -React Native is perfect. But, if your application is a more complex, like a game with graphics and other visual effects, than React Native might not be the right fit.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=4048a855e91d" width="1" height="1" alt=""><hr><p><a href="https://medium.com/wix-engineering/velocity-performance-scaling-3-questions-i-ask-before-i-pick-react-native-over-native-4048a855e91d">Velocity, Performance, Scaling - 3 Questions I ask before I pick React-Native over Native</a> was originally published in <a href="https://medium.com/wix-engineering">Wix Engineering</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[React Native Developers - Save your Time with these 24 Terminal Tricks]]></title>
            <link>https://medium.com/wix-engineering/react-native-developers-save-your-time-with-these-24-terminal-tricks-10dc24f98e19?source=rss-11a05c32556------2</link>
            <guid isPermaLink="false">https://medium.com/p/10dc24f98e19</guid>
            <category><![CDATA[react-native]]></category>
            <category><![CDATA[terminal]]></category>
            <category><![CDATA[mobile-app-development]]></category>
            <category><![CDATA[cheatsheet]]></category>
            <category><![CDATA[development]]></category>
            <dc:creator><![CDATA[Ran Greenberg]]></dc:creator>
            <pubDate>Thu, 13 Sep 2018 11:48:13 GMT</pubDate>
            <atom:updated>2018-09-19T13:29:32.906Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*MWSc5-7CO_WUpvdnWZXzUA.jpeg" /><figcaption>Photo by <a href="https://unsplash.com/@takeshi2">Wu yi</a> on <a href="https://unsplash.com/photos/Bfrk9RCOhRE">Unsplash</a></figcaption></figure><p>I am a React Native developer. During my day-to-day work, I found these most useful terminal tricks to be super time savers for me, so I’m sharing. Enjoy!</p><p>This list is mine .zshrc related to react-native development</p><h3>General</h3><ul><li>Open <a href="https://www.jetbrains.com/webstorm/">WebStorm</a> from the current directory</li></ul><p>alias ws=”open -a /Applications/WebStorm.app .</p><ul><li>Print all scripts section in package.json (<a href="https://stedolan.github.io/jq/">jq</a> is required)</li></ul><p>alias scripts=”cat package.json | jq -r ‘.scripts’”</p><ul><li>Edit README.md (using <a href="https://macdown.uranusjr.com/">MacDown</a>)</li></ul><p>alias editReadme=”open -a /Applications/MacDown.app README.md”</p><ul><li>Search command or part of it in the history</li></ul><p>alias hgrep=”history | grep $1&quot;</p><h3><a href="https://www.iterm2.com/">iTerm</a></h3><ul><li>Open .zschrc quickly</li></ul><p>alias openzshrc=”open -a &lt;MY_FAVOURITE_TEXT_EDITOR&gt; ~/.zshrc”</p><ul><li>Load .zschrc quickly</li></ul><p>alias loadzshrc=”source ~/.zshrc”</p><h3><a href="https://facebook.github.io/react-native/docs/getting-started">React Native</a></h3><ul><li>Start the packager</li></ul><p>alias rns=”adb reverse tcp:8081 tcp:8081 &amp;&amp; watchman watch-del-all &amp;&amp; react-native start”</p><ul><li>Build and Launch iOS (on iPhone X)</li></ul><p>alias rnrios=&quot;react-native run-ios --simulator=&#39;iPhone X&#39;&quot;</p><ul><li>Build and Launch Android on the currently open emulator</li></ul><p>alias rnrandroid=&quot;react-native run-android&quot;</p><h3><a href="https://www.npmjs.com/">NPM</a> | <a href="https://yarnpkg.com/en/">Yarn</a></h3><ul><li>Reset npm (delete node_modules and reinstall)</li></ul><p>alias resetnpm=”rm package-lock.json &amp;&amp; rm -rf node_modules &amp;&amp; npm i”</p><ul><li>Reset yarn (delete node_modules and reinstall)</li></ul><p>alias resetyarn=”rm yarn.lock &amp;&amp; rm -rf node_modules &amp;&amp; yarn”</p><ul><li>Switch between private and public npm</li></ul><p>alias npmpublic=”npm config set registry https://registry.npmjs.org/&quot;</p><p>alias npmprivate=”npm config set registry http://my-private-npm.com&quot;</p><ul><li>Show remote dist-tags</li></ul><p>alias npmd=&quot;npm view $1 dist-tags&quot;</p><p>alias yarnd=&quot;yarn info $1 dist-tags&quot;</p><h3>Android</h3><ul><li>Android adb reverse port 8081</li></ul><p>alias rvrs=”adb reverse tcp:8081 tcp:8081&quot;</p><ul><li>Launch big screen Android emulator (for instance, Nexus 5X; the emulator should be preliminary installed)</li></ul><p>alias android_big=”cd ~/Library/Android/sdk/tools/; ./emulator -avd Nexus_5X_API_25&quot;</p><ul><li>Launch small screen Android emulator (for instance, Nexus S, the emulator should be preliminary installed)</li></ul><p>alias android_small=”cd ~/Library/Android/sdk/tools/; ./emulator -avd Nexus_S_API_25&quot;</p><ul><li>Open <a href="https://developer.android.com/studio/">Android Studio</a> from <strong>root</strong> react native app (the root should include android folder)</li></ul><p>alias as=’open -a /Applications/Android\ Studio.app ./android’</p><ul><li>Reload Android Simulator</li></ul><p>alias rr=&quot;adb shell am broadcast -a react.native.RELOAD&quot;</p><h3>Git</h3><ul><li>If you use zsh you can use all Git commands that are embedded in your terminal — see <a href="https://github.com/robbyrussell/oh-my-zsh/wiki/Cheatsheet#git">all commands here</a></li><li>Open repo page in a browser</li></ul><p>alias gh=’git config — get remote.origin.url | xargs open’</p><ul><li>Reset HEAD (hard)</li></ul><p>alias gitresethard=’git add . | echo “all added” | git reset — hard’</p><ul><li>Fetch and rebase</li></ul><p>alias gfpr=”git fetch &amp;&amp; git pull — rebase”</p><ul><li>Open <a href="https://www.sourcetreeapp.com/">SourceTree</a> from the current directory (should include .git/)</li></ul><p>alias stree=”/Applications/SourceTree.app/Contents/Resources/stree .”</p><h3><strong>Here is the complete list of the aliases. Copy it to your </strong><strong>.zshrc file and remember to adjust to your application installation locations</strong></h3><ol><li>alias ws=&quot;open -a /Applications/WebStorm.app .&quot;</li><li>alias scripts=&quot;cat package.json | jq -r ‘.scripts’&quot;</li><li>alias editReadme=&quot;open -a /Applications/MacDown.app README.md&quot;</li><li>alias hgrep=&quot;history | grep $1&quot;</li><li>alias openzshrc=&quot;open -a &lt;MY_FAVOURITE_TEXT_EDITOR&gt; ~/.zshrc&quot;</li><li>alias loadzshrc=&quot;source ~/.zshrc&quot;</li><li>alias rns=&quot;watchman watch-del-all &amp;&amp; react-native start&quot;</li><li>alias rnrios=&quot;react-native run-ios --simulator=&#39;iPhone X&#39;&quot;</li><li>alias rnrandroid=&quot;react-native run-android&quot;</li><li>alias resetnpm=&quot;rm package-lock.json &amp;&amp; rm -rf node_modules &amp;&amp; npm i&quot;</li><li>alias resetyarn=&quot;rm yarn.lock &amp;&amp; rm -rf node_modules &amp;&amp; yarn&quot;</li><li>alias npmpublic=&quot;npm config set registry https://registry.npmjs.org/&quot;</li><li>alias npmprivate=&quot;npm config set registry http://my-private-npm.com&quot;</li><li>alias npmd=&quot;npm view $1 dist-tags&quot;</li><li>alias yarnd=&quot;yarn info $1 dist-tags&quot;</li><li>alias rvrs=&quot;adb reverse tcp:8081 tcp:8081&quot;</li><li>alias android_big=&quot;cd ~/Library/Android/sdk/tools/; ./emulator -avd Nexus_5X_API_25&quot;</li><li>alias android_small=&quot;cd ~/Library/Android/sdk/tools/; ./emulator -avd Nexus_S_API_25&quot;</li><li>alias as=&quot;open -a /Applications/Android\ Studio.app ./android&quot;</li><li>alias rr=&quot;adb shell am broadcast -a react.native.RELOAD&quot;</li><li>alias gh=&quot;git config — get remote.origin.url | xargs open&quot;</li><li>alias gitresethard=&quot;git add . | echo &quot;resetting hard&quot; | git reset —- hard&quot;</li><li>alias gfpr=&quot;git fetch &amp;&amp; git pull — rebase&quot;</li><li>alias tree=&quot;/Applications/SourceTree.app/Contents/Resources/stree .&quot;</li></ol><p><em>Does it feel like you can add something to this list?<br>More then welcome to contact me on twitter @</em><a href="https://twitter.com/gran33"><em>gran33</em></a></p><p><em>Like it? please </em>👏<em> and share </em>😍</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=10dc24f98e19" width="1" height="1" alt=""><hr><p><a href="https://medium.com/wix-engineering/react-native-developers-save-your-time-with-these-24-terminal-tricks-10dc24f98e19">React Native Developers - Save your Time with these 24 Terminal Tricks</a> was originally published in <a href="https://medium.com/wix-engineering">Wix Engineering</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Build Your Own Navigation]]></title>
            <link>https://medium.com/@RanGreenberg/build-your-own-navigation-4492af0c3d6?source=rss-11a05c32556------2</link>
            <guid isPermaLink="false">https://medium.com/p/4492af0c3d6</guid>
            <category><![CDATA[mobile]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[react-native]]></category>
            <category><![CDATA[navigation]]></category>
            <dc:creator><![CDATA[Ran Greenberg]]></dc:creator>
            <pubDate>Tue, 05 Dec 2017 19:01:45 GMT</pubDate>
            <atom:updated>2017-12-16T08:34:21.875Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*tqGSDBJRk9hFh0y0twuaOA.jpeg" /></figure><p>Have you ever thought about how navigation really works under the hood? Have you ever thought about actually writing your own one?</p><p>So, let’s do it! it’s not that hard.</p><p>First, let’s define what basic navigation is for us. <br>Think of a super simple navigation as a stack of screen with basic functionality</p><ul><li><strong>push</strong> screen on top</li><li><strong>pop</strong> top screen by pressing the back button (or by any predefined action)</li><li><strong>pass data</strong> between screens</li></ul><p>In my example, I’ll use WelcomeView and EmojisView.</p><h3>Let’s start from the beginning</h3><p>The “router” or the “navigator” will be in charge of screens switching. In the very first screen, the one that index will render initially, the render function will be:</p><pre>render() {<br>  <strong>return </strong>(<br>    &lt;View style<strong>=</strong>{{flex: 1}}&gt;<br><strong>      {this._renderInternalView()}<br></strong>    &lt;/View&gt;<br>  );<br>}</pre><p>As you can see in the code snippet, it’s a simple View which renders an internal element inside. <br>And _renderInternalView function returns the actual content View which will decide which view to show when the state changed:</p><pre>import EmojisView from &#39;./EmojisView&#39;;<br>import WelcomeView from &#39;./WelcomeView&#39;;<br>...</pre><pre>renderInternalView() {<br>  <strong>let </strong>PresentedView;<br>  <strong>let </strong>pushScreen = <strong>&#39;&#39;</strong>;</pre><pre><strong>  switch</strong>(<strong>this</strong>.state.presentedView) {<br>    <strong>case </strong>Views.EmojisView:<br>      PresentedView = EmojisView;<br>      <strong>break</strong>;</pre><pre>    <strong>case </strong>Views.WelcomeView:<br>      PresentedView = WelcomeView;<br>      <strong>break</strong>;</pre><pre>    <strong>default</strong>:<br>      <strong>return null</strong>;<br>  }</pre><pre><strong>  return </strong>(<br>    &lt;PresentedView<br>      changeView<strong>=</strong>{<strong>this</strong>._changeView}<br>    /&gt;<br>  )<br>}</pre><p>Defining the case for each state for example:</p><pre><strong>case </strong>Views.WelcomeView:<br>      PresentedView = WelcomeView;<br>      <strong>break</strong>;</pre><p>Actually, that’s it, we need to add an action button in WelcomeView and we are about to push our new screen 🤗 .</p><p>So the WelcomeView will be:</p><pre>_onPress = () =&gt; {<br>  <strong>this</strong>.props.changeView(<strong>Views.EmijisView</strong>);<br>};</pre><pre>render() {<br>  <strong>return </strong>(<br>    &lt;View style<strong>=</strong>{styles.container}&gt;<br>      &lt;Button<br>        title<strong>=</strong>{<strong>&#39;Push&#39;</strong>}<br>        onPress<strong>=</strong>{<strong>this</strong>._onPress}<br>        style<strong>=</strong>{styles.welcome}<br>      /&gt;<br>    &lt;/View&gt;<br>  );<br>}</pre><p>As you can see, WelcomeView holds a Button with onPress method that will trigger this.props.changeView with the Views.EmojisView.</p><p>Ok, but what is this.props.changeView 😱 ?</p><p>changeView is a predefined function we set in PresentedView in our router, and it looks like this:</p><pre>_changeView = (presentedView) =&gt; {<br>  <strong>this</strong>.setState({presentedView});<br>};</pre><p>It’s a simple function that changes the router internal state with the wanted View.</p><p>The router at this step looks like this:</p><pre><strong>export default class </strong>Router <strong>extends </strong>Component {<br><br>  constructor(props) {<br>    <strong>super</strong>(props);<br>    <strong>this</strong>.state = {<br>      presentedView: Views.WelcomeView,<br>    }<br>  }<br><br>  _changeView = (presentedView) =&gt; {<br>    <strong>this</strong>.setState({presentedView});<br>  };<br><br>  _renderInternalView() {<br>    <strong>let </strong>PresentedView;<br><br>    <strong>switch</strong>(<strong>this</strong>.state.presentedView) {<br>      <br>      <strong>case </strong>Views.EmojisView:<br>        PresentedView = Views.EmojisView;<br>        <strong>break</strong>;<br><br>      <strong>case </strong>Views.WelcomeView:<br>        PresentedView = Views.WelcomeView;<br>        <strong>break</strong>;<br><br>      <strong>default</strong>:<br>        <strong>return null</strong>;<br>    }<br><br>    <strong>return </strong>(<br>      &lt;PresentedView<br>        changeView<strong>=</strong>{<strong>this</strong>._changeView}<br>      /&gt;<br>    );<br>  }<br><br>  render() {<br>    <strong>return </strong>(<br>      &lt;View&gt;<br>        {<strong>this</strong>._renderInternalView()}<br>      &lt;/View&gt;<br>    );<br>  }<br>}</pre><h3>Pop</h3><p>For the pop functionality, in _renderInternalView function, we need to add a back button in order to perform back/pop. This way we mimic the native-like back button. Let’s modify _renderInternalView, instead of rendering only the PresentedView now it will return button+ PresentedView:</p><pre>_renderInternalView() {<br>  <strong>let </strong>PresentedView;<br>  <strong>let </strong>backScreen;<br><br>  <strong>switch</strong>(<strong>this</strong>.state.presentedView) {<br>    <strong>case </strong>Views.EmojisView:<br>      PresentedView = Views.EmojisView;<br>      backScreen = Views.WelcomeView;<br>      <strong>break</strong>;<br><br>    <strong>case </strong>Views.WelcomeView:<br>      PresentedView = Views.WelcomeView;<br>      <strong>break</strong>;<br><br>    <strong>default</strong>:<br>      <strong>return null</strong>;<br>  }<br>  return (<br>    &lt;View style={{flex: 1}}&gt;</pre><pre>       // Back Button  <br>       &lt;Button<br>         title<strong>=</strong>{<strong>&#39;&lt; Pop&#39;</strong>}<br>         onPress<strong>=</strong>{() =&gt; <strong>this</strong>.setState({presentedView: backScreen})}<br>       /&gt;</pre><pre>       // Content View<br>       &lt;PresentedView<br>         changeView<strong>=</strong>{<strong>this</strong>._changeView}<br>       /&gt;</pre><pre>    &lt;/View&gt;<br>  );<br>}</pre><p>The new Button we just added, on onPress prop it will change presentedView screen state to the relevant backScreen we defined:</p><pre>onPress<strong>=</strong>{() =&gt; <strong>this</strong>.setState({presentedView: backScreen})}</pre><p>Now we set all of our goals, we have push and pop and we can use these functionalities wherever we want, much like regular navigation stack.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/328/1*Fab4jdii4buIScasC-imTw.gif" /></figure><h3>Pass Data Between Screens</h3><p>Each screen isn’t a standalone screen, it’s part of a flow, and each screen has to be some part of this flow. <br>In order to achieve this flow, we must be able to pass the data between screens.</p><p>Remember the function _changeView? The function that changed the screen state and its trig render which renders the new view. Let’s add one more parameter to this function, passProps</p><pre>_changeView = (presentedView, passProps) =&gt; {<br>  <strong>this</strong>.setState({presentedView, passProps});<br>};</pre><p>And we will add the passProps to the this.state in the screen state, so it will looks like this:</p><pre>constructor(props) {<br>  <strong>super</strong>(props);<br>  <strong>this</strong>.state = {<br>    presentedView: Views.WelcomeView,<br>    passProps: {}<br>  }<br>}</pre><p>Now, we need to pass this passProps object to the presentedView. In order to do so, we need to modify the view render function _renderInternalView , and it will return something like this:</p><pre><strong>return </strong>(<br>  &lt;View style<strong>=</strong>{{flex: 1, flexDirection: <strong>&#39;column&#39;</strong>}}&gt;<br>    {<strong>this</strong>._renderBackButton(backScreen)}<br>    &lt;PresentedView<br>      changeView<strong>=</strong>{<strong>this</strong>._changeView}<br>      passProps<strong>=</strong>{<strong>this</strong>.state.passProps} //This is the addition<br>    /&gt;<br>  &lt;/View&gt;<br>)</pre><p>Now that we can pass data between views, let’s pass some data though 😎. For instance, let’s pass a message from WelcomeView to EmojisView. In WelcomeView let’s add the message when we call to this.props.changeView :</p><pre>_onPress = () =&gt; {<br>  const passProps = <strong>{message: &#39;Hi from Welcome View&#39;};</strong><br>  <strong>this</strong>.props.changeView(Views.EmojisView, <strong>passProps</strong>);<br>};</pre><pre>render() {<br>  <strong>return </strong>(<br>    &lt;View style<strong>=</strong>{styles.container}&gt;<br>      ...<br>      &lt;Button title<strong>=</strong>{<strong>&#39;Push&#39;</strong>}<br>              onPress<strong>=</strong>{<strong>this</strong>._onPress}<br>      /&gt;<br>      ...<br>   &lt;/View&gt;<br>  );<br>}</pre><p>Last thing, now let’s get the passProps in EmojisView:</p><pre>render() {<br>  <strong>return </strong>(<br>    &lt;View style<strong>=</strong>{styles.container}&gt;<br>      ...<br>      {<strong>this</strong>.props.passProps.message &amp;&amp; //if message exist -&gt; show it<br>      &lt;Text style<strong>=</strong>{styles.welcome}&gt;<br>        {<strong>this</strong>.props.passProps.message}<br>      &lt;/Text&gt;}<br>      ...<br>    &lt;/View&gt;<br>  );<br>}</pre><p>That’s it! 🙌 Look what we just added to the Emojis screen:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/496/1*0tL9w0vWT6Io7Cuhtft3eg.png" /></figure><h3>Animate Transitions</h3><p>Our screens transition is kind of flicking. We can do better by adding animations to push and pop actions in order to have smoother transitions between screens.</p><p>We do it with an awesome React Native api <a href="https://facebook.github.io/react-native/docs/layoutanimation.html">LayoutAnimation</a>.<br>The transition we will demonstrate here is a simple fade animation by changing the presentedView style={{opacity: 1}} style value.</p><p><strong>Push Screen Transition:<br></strong>In _renderInternalView function, we will add style={{opacity: this.state.aniamteOpacityValue}} to the root view:</p><pre>constructor(props){<br>  ...<br>  this.state = {<br>    animateOpacityValue = 1<br>  }</pre><pre>_renderInternalView() {<br>  <strong>let </strong>PresentedView = <strong>this</strong>.state.presentedView;<br>  ...</pre><pre>  <strong>return </strong>(<br>    &lt;View style<strong>=</strong>{{... opacity: <strong>this</strong>.state.animateOpacityValue}}&gt;<br>      {<strong>this</strong>._renderBackButton(backScreen)},<br>      &lt;PresentedView<br>        ...<br>      /&gt;<br>    &lt;/View&gt;<br>  )<br>}</pre><p>Now that we have the ground to actually perform the animation we will add the LayoutAnimation.easeInEaseOut() right before we setState(...) with the changing view :</p><pre>_changeView = (presentedView, passProps) =&gt; {<br>  LayoutAnimation.easeInEaseOut();<br>  <strong>this</strong>.setState({presentedView, passProps, animateLeft: 0});<br>};</pre><p>Notice that since we wrap all screens with root view, this behaviour will apply for all transitions and we don’t need to do it for each view.</p><p><strong>Pop screen transition:<br></strong>This is easier, our back Botton onPress code currently looks like this:</p><pre>onPress<strong>=</strong>{() =&gt; <strong>this</strong>.setState({presentedView: backScreen})</pre><p>Instead of changing the state without the LayoutAnimation simply let’s call to _changeView which is already applying the animation, so our new onPress will be:</p><pre>onPress<strong>=</strong>{() =&gt; <strong>this</strong>._changeView(backScreen)}</pre><p>Now, our push/pop transitions will look sweeter:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/310/1*cX-76PlF2wu5UGVOnKndoA.gif" /></figure><p>Full working application can be found on GitHub:</p><p><a href="https://github.com/gran33/BuildYourOwnNavigationInReactNative">gran33/BuildYourOwnNavigationInReactNative</a></p><p>If you like it, you are more then welcome to share and claps. Feel free to comment and give feedback 🙏 .</p><h4><strong>Small Disclaimer</strong></h4><p>This simple navigation is a conceptual example which demonstrates how to be able to build your own navigation. <br>Out there, there are many awesome implementations like <a href="https://github.com/wix/react-native-navigation">react-native-navigation</a> which is native implementation for Bottom Bar (Tab Bar), Top Tab (Navigation Bar), Modals , screens stack and many more.</p><p>This example isn’t a production ready framework or library, I wanted to show and simplify the navigation challenge.</p><p>Many required features still need to be added here to make this concept available and really usable.</p><p><em>In Wix, we are using </em><a href="https://github.com/wix/react-native-navigation"><em>react-native-navigation</em></a><em> in our mobile application. I am one of the core contributors in that awesome native implementation for the navigation challenge.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=4492af0c3d6" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>