<?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 Aman Mittal on Medium]]></title>
        <description><![CDATA[Stories by Aman Mittal on Medium]]></description>
        <link>https://medium.com/@amanhimself?source=rss-c35630ebd4d------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*L2HqlPuCG1ULIVPiucnQ6g.jpeg</url>
            <title>Stories by Aman Mittal on Medium</title>
            <link>https://medium.com/@amanhimself?source=rss-c35630ebd4d------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 14 Nov 2026 13:22:34 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@amanhimself/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[Expo Launch Party Recap]]></title>
            <link>https://blog.expo.dev/expo-launch-party-recap-697d7b7739e8?source=rss-c35630ebd4d------2</link>
            <guid isPermaLink="false">https://medium.com/p/697d7b7739e8</guid>
            <category><![CDATA[react-native]]></category>
            <category><![CDATA[expo]]></category>
            <category><![CDATA[ios-app-development]]></category>
            <category><![CDATA[android-app-development]]></category>
            <category><![CDATA[mobile-app-development]]></category>
            <dc:creator><![CDATA[Aman Mittal]]></dc:creator>
            <pubDate>Tue, 05 Sep 2023 20:28:33 GMT</pubDate>
            <atom:updated>2023-09-05T21:04:10.497Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*aYiMrYopDtYhLAhWAhCvDw.png" /></figure><p>We wrapped up summer with Expo’s first Launch Party. Here are all the feature previews and proofs of concept announced during the event.</p><h3>Feature preview: Rollouts</h3><p>With <a href="https://docs.expo.dev/eas-update/introduction/">EAS Update</a>, you can now ship critical bug fixes and improvements to your end users on a percentage-based rollout when you publish an update without publishing it to 100% of end users. This makes it less risky and getting changes to your end users quickly.</p><p><a href="https://expo.dev/changelog/2023/08-08-rollouts-eas-update">Rollouts for EAS Update - Expo Changelog</a></p><h3>Feature preview: Updates JS API for expo-updates</h3><p>The <a href="https://docs.expo.dev/versions/latest/sdk/updates/">expo-updates library</a> allows your app to download and manage remote updates to your application code. We’ve introduced a new React hook: useUpdates(), into state and lifecycle updates, powered by a new state machine implemented within native code.</p><p><a href="https://expo.dev/changelog/2023/08-08-use-updates-api">useUpdates() API for expo-updates - Expo Changelog</a></p><h3>Feature preview: Single Sign-On (SSO)</h3><p>EAS Enterprise customers who use <a href="https://okta.com/">Okta</a> as their workforce Identity Provider can now take advantage of SSO for employee sign-in on EAS. Support for additional Identity Providers is coming soon.</p><p><a href="https://expo.dev/changelog/2023/08-08-sso">Single Sign-On (SSO) - Expo Changelog</a></p><h3>Expo Orbit</h3><p>To make development workflow even faster, we introduced a new way of launching builds and running Snack projects into your devices and simulators, called Expo Orbit. It’s a macOS menu bar app that allows you to:</p><ul><li>Install &amp; launch builds from EAS with one click</li><li>Launch Snack projects in simulators via links</li><li>List &amp; launch simulators (even Android without audio!)</li><li>Install &amp; launch apps from local files</li></ul><p><a href="https://expo.dev/changelog/2023/08-09-orbit">Expo Orbit: Download and launch builds - Expo Changelog</a></p><h3>Feature preview: Customizable builds on EAS Build</h3><p>Builds just got a lot better. In the same build job, you can customize steps in your build process and run a test suite, install dependencies from Rush or Nx monorepos, send a Slack notification, and do more.</p><p><a href="https://expo.dev/changelog/2023/08-10-custom-builds">Preview: fully customizable builds on EAS Build - Expo Changelog</a></p><h3>Proof of concept: expo-sqlite integration with CR-SQLite</h3><p>We released an alpha version of the expo-sqlite library that includes a proof-of-concept integration with <a href="https://github.com/vlcn-io/cr-sqlite">CR-SQLite</a>, an SQLite extension that “allows merging different SQLite databases together that have taken independent writes”. Your users can now write to their local SQLite databases offline and merge them online without conflict.</p><p><a href="https://expo.dev/changelog/2023/08-10-cr-sqlite">Proof of concept: expo-sqlite integration with CR-SQLite - Expo Changelog</a></p><h3>Proof of concept: Expo CLI Dev Tools Plugins</h3><p>In <a href="https://blog.expo.dev/expo-sdk-49-c6d398cdf740">Expo SDK 49</a>, we released support for debugging network requests from the JS debugger and added integration with React Dev Tools so you can launch it directly from Expo CLI. This made possible for many developers to migrate away from Flipper.</p><p>With this migration, we recognized the need for <a href="https://fbflipper.com/docs/tutorial/intro/">dev tools plugin</a> support and released a proof of concept that aims to show that it is possible to implement a similar solution on top of existing Expo infrastructure.</p><p><a href="https://expo.dev/changelog/2023/08-10-dev-tools-plugins">Proof of concept: Expo CLI Dev Tools Plugins - Expo Changelog</a></p><h3>Community Highlights</h3><p>We also hosted our first-ever AMA in our <a href="https://chat.expo.dev/">Discord</a> community. Shoutout to our 80+ community members who joined the AMA during the event!</p><p><a href="https://chat.expo.dev/">Join the Expo Developers Discord Server!</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=697d7b7739e8" width="1" height="1" alt=""><hr><p><a href="https://blog.expo.dev/expo-launch-party-recap-697d7b7739e8">Expo Launch Party Recap</a> was originally published in <a href="https://blog.expo.dev/">Exposition</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Preview: fully customizable builds on EAS Build]]></title>
            <link>https://blog.expo.dev/preview-fully-customizable-builds-on-eas-build-4945161b92d?source=rss-c35630ebd4d------2</link>
            <guid isPermaLink="false">https://medium.com/p/4945161b92d</guid>
            <category><![CDATA[ios-app-development]]></category>
            <category><![CDATA[react-native]]></category>
            <category><![CDATA[expo]]></category>
            <category><![CDATA[android-app-development]]></category>
            <category><![CDATA[ea]]></category>
            <dc:creator><![CDATA[Aman Mittal]]></dc:creator>
            <pubDate>Thu, 10 Aug 2023 12:21:33 GMT</pubDate>
            <atom:updated>2023-08-10T12:21:33.300Z</atom:updated>
            <content:encoded><![CDATA[<h4>A preview of customizing your builds process on EAS Build.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ce-32A32RHw3QjvKkJ7doQ.png" /></figure><p>It’s extremely satisfying when you eas build on a new project and it Just Works — at Expo, we know what we need to do to build Android and iOS React Native apps, and we handle all of that automatically for you. In many cases, this is all a project ever needs; but, not always.</p><p>We’ve come across a number of cases where developers have asked to replace single steps in their build process with their own implementations (such as for <a href="https://expo.canny.io/feature-requests/p/eas-custom-install-command">installing dependencies for Rush or Nx monorepos</a>) or even replace the majority of the build process in order to build for another platform (such as Electron app or one of the many TV platforms). We’ve also heard from developers that want to use EAS Build to run their test suite so that they can consolidate their CI into a single service.</p><p>To enable all of these use cases and more, today we are releasing a preview of our new fully customizable build process. You can use it by creating a yml file in .eas/build and pointing to that file from the config field on your build profile.</p><p><strong>Learn more about this release in the full article on the </strong><a href="https://expo.dev/changelog/2023/08-10-custom-builds"><strong>Expo Changelog</strong></a><strong>.</strong></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=4945161b92d" width="1" height="1" alt=""><hr><p><a href="https://blog.expo.dev/preview-fully-customizable-builds-on-eas-build-4945161b92d">Preview: fully customizable builds on EAS Build</a> was originally published in <a href="https://blog.expo.dev/">Exposition</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Proof of concept: expo-sqlite integration with CR-SQLite]]></title>
            <link>https://blog.expo.dev/proof-of-concept-expo-sqlite-integration-with-cr-sqlite-4351206fa23d?source=rss-c35630ebd4d------2</link>
            <guid isPermaLink="false">https://medium.com/p/4351206fa23d</guid>
            <category><![CDATA[android-app-development]]></category>
            <category><![CDATA[react-native]]></category>
            <category><![CDATA[ios-app-development]]></category>
            <category><![CDATA[expo]]></category>
            <category><![CDATA[mobile-app-development]]></category>
            <dc:creator><![CDATA[Aman Mittal]]></dc:creator>
            <pubDate>Thu, 10 Aug 2023 12:20:53 GMT</pubDate>
            <atom:updated>2023-08-10T12:20:53.311Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*29wRm9vSZVIDorflGwkvkw.png" /></figure><p>We&#39;re releasing an alpha version of the expo-sqlite library that includes a proof-of-concept iOS integration with <a href="https://github.com/vlcn-io/cr-sqlite">CR-SQLite</a>, an SQLite extension that &quot;allows merging different SQLite databases together that have taken independent writes&quot; that makes up part of the <a href="https://vlcn.io/">Vulcan toolchain</a>.</p><p>We&#39;re also releasing an <a href="https://github.com/expo/todo-sync-example/tree/initial-poc">example project</a> that uses CR-SQLite with <a href="https://tinybase.org/">TinyBase</a>, a reactive datastore for local first apps. It demonstrates what is known as <em>local-first architecture</em>.</p><p><strong>Learn more about this release in the full article on the </strong><a href="https://expo.dev/changelog/2023/08-10-cr-sqlite"><strong>Expo Changelog</strong></a><strong>.</strong></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=4351206fa23d" width="1" height="1" alt=""><hr><p><a href="https://blog.expo.dev/proof-of-concept-expo-sqlite-integration-with-cr-sqlite-4351206fa23d">Proof of concept: expo-sqlite integration with CR-SQLite</a> was originally published in <a href="https://blog.expo.dev/">Exposition</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Launching Expo Orbit]]></title>
            <link>https://blog.expo.dev/launching-expo-orbit-c1ecb13a98aa?source=rss-c35630ebd4d------2</link>
            <guid isPermaLink="false">https://medium.com/p/c1ecb13a98aa</guid>
            <category><![CDATA[ios-app-development]]></category>
            <category><![CDATA[mobile-app-development]]></category>
            <category><![CDATA[react-native]]></category>
            <category><![CDATA[android-app-development]]></category>
            <category><![CDATA[expo]]></category>
            <dc:creator><![CDATA[Aman Mittal]]></dc:creator>
            <pubDate>Wed, 09 Aug 2023 12:42:43 GMT</pubDate>
            <atom:updated>2023-08-09T12:42:43.901Z</atom:updated>
            <content:encoded><![CDATA[<h4>Accelerate your development workflow with one-click build launches and simulator management</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*tPrqN-niyqaKXAoZSCm1Dg.jpeg" /></figure><p>To make development workflow even faster, we are introducing a new way of launching builds and running Snack projects into your devices and simulators. It’s called <strong>Expo Orbit</strong>. It’s a macOS menu bar app that allows you to:</p><ul><li>install and launch builds from EAS with just one click</li><li>launch Snack projects in your simulators by opening a link</li><li>list and launch simulators, including the ability to run Android emulators without audio</li><li>install and launch apps from local files</li></ul><h3>Get started with Expo Orbit</h3><p><a href="https://github.com/expo/orbit/releases"><strong>Download Orbit</strong></a> and enable the Orbit experiment by going to <a href="https://www.expo.dev/settings">settings</a> and turning on the “Expo Orbit” experiment under the <strong>Experiments</strong> section.</p><p><em>Note: Orbit relies on the Android SDK and </em><em>xcrun for device management, which requires having both Android Studio and Xcode set up.</em></p><p>We can’t wait for you to try Orbit, explore its capabilities, and <a href="/service/mailto:orbit@expo.dev">hear your feedback</a>. Your input will shape the future of this tool and guide us on where to take it next.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c1ecb13a98aa" width="1" height="1" alt=""><hr><p><a href="https://blog.expo.dev/launching-expo-orbit-c1ecb13a98aa">Launching Expo Orbit</a> was originally published in <a href="https://blog.expo.dev/">Exposition</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Feature Preview: Updates JS API for expo-updates]]></title>
            <link>https://blog.expo.dev/feature-preview-updates-js-api-for-expo-updates-3b92beb40dab?source=rss-c35630ebd4d------2</link>
            <guid isPermaLink="false">https://medium.com/p/3b92beb40dab</guid>
            <category><![CDATA[ios-app-development]]></category>
            <category><![CDATA[react-native]]></category>
            <category><![CDATA[expo]]></category>
            <category><![CDATA[ea]]></category>
            <category><![CDATA[android-app-development]]></category>
            <dc:creator><![CDATA[Aman Mittal]]></dc:creator>
            <pubDate>Tue, 08 Aug 2023 13:22:29 GMT</pubDate>
            <atom:updated>2023-08-08T19:54:43.534Z</atom:updated>
            <content:encoded><![CDATA[<h4>A new React hook to seamlessly manage updates with the Expo Updates library</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*QeT5o-cF84u3HmJ1ZdBsTA.jpeg" /></figure><p>The <a href="https://docs.expo.dev/versions/latest/sdk/updates/">expo-updates library</a> allows your app to download and manage remote updates to your application code.</p><p>We now provide a React hook: useUpdates(), for hooking into state and lifecycle updates from the module. The new hook uses a new state machine implemented within the native code.</p><h4>Features:</h4><ul><li>Wraps information on the currently running app bundle and any available or downloaded new updates</li><li>Reads from and receives change events from the native state machine so it always reflects the current state of the system</li><li>Can be used from any component in the application</li><li>Tracks the last time the device checked the update server for an available update</li><li>Existing async methods (checkForUpdatesAsync() and fetchUpdateAsync()) can be called without waiting for results — the hook will automatically refresh when the methods complete</li><li>Surfaces errors that occur during initialization, checking for updates, or downloading an update</li></ul><h4>Example usage</h4><pre>import { StatusBar } from &#39;expo-status-bar&#39;;<br>import * as Updates from &#39;expo-updates&#39;;<br>import React from &#39;react&#39;;<br>import { Pressable, Text, View } from &#39;react-native&#39;;<br><br>export default function UpdatesDemo() {<br>  const { currentlyRunning, availableUpdate, isUpdateAvailable, isUpdatePending } = Updates.useUpdates();<br><br>  // If true, we show the button to download and run the update<br>  const showDownloadButton = isUpdateAvailable;<br><br>  React.useEffect(() =&gt; {<br>    if (isUpdatePending) {<br>      // Update has been successfully downloaded, so reload with the new update bundle<br>      Updates.reloadAsync();<br>    }<br>  }, [isUpdatePending]);<br><br>  // Show whether or not we are running embedded code or an update<br>  const runTypeMessage = currentlyRunning.isEmbeddedLaunch<br>    ? &#39;This app is running from built-in code&#39;<br>    : &#39;This app is running an update&#39;;<br><br>  return (<br>    &lt;View style={styles.container}&gt;<br>      &lt;Text style={styles.headerText}&gt;Updates Demo&lt;/Text&gt;<br>      &lt;Text&gt;{runTypeMessage}&lt;/Text&gt;<br>      &lt;Button pressHandler={() =&gt; Updates.checkForUpdateAsync()} text=&quot;Check manually for updates&quot; /&gt;<br>      {showDownloadButton ? (<br>        &lt;Button pressHandler={() =&gt; Updates.fetchUpdateAsync()} text=&quot;Download and run update&quot; /&gt;<br>      ) : null}<br>      &lt;StatusBar style=&quot;auto&quot; /&gt;<br>    &lt;/View&gt;<br>  );<br>}</pre><h4>Learn more</h4><p>To learn more, check out the <a href="https://github.com/douglowder/UpdatesAPIDemo">example repository on GitHub</a>.</p><p><em>Note: The hook is currently in alpha and will be stable in SDK 50.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3b92beb40dab" width="1" height="1" alt=""><hr><p><a href="https://blog.expo.dev/feature-preview-updates-js-api-for-expo-updates-3b92beb40dab">Feature Preview: Updates JS API for expo-updates</a> was originally published in <a href="https://blog.expo.dev/">Exposition</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Feature Preview: Rollouts for EAS Update]]></title>
            <link>https://blog.expo.dev/feature-preview-rollouts-for-eas-update-4eac28596470?source=rss-c35630ebd4d------2</link>
            <guid isPermaLink="false">https://medium.com/p/4eac28596470</guid>
            <category><![CDATA[ea]]></category>
            <category><![CDATA[mobile-app-development]]></category>
            <category><![CDATA[expo]]></category>
            <category><![CDATA[react]]></category>
            <category><![CDATA[react-native]]></category>
            <dc:creator><![CDATA[Aman Mittal]]></dc:creator>
            <pubDate>Tue, 08 Aug 2023 13:22:01 GMT</pubDate>
            <atom:updated>2023-08-08T13:22:01.908Z</atom:updated>
            <content:encoded><![CDATA[<h4>A new EAS CLI command to send updates to a percentage of app users.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*zh2rbd_dZoWOdO4KjO64aQ.png" /></figure><p>EAS Update lets you ship critical bug fixes and improvements to your end-users between app store releases. By default, published updates go to 100% of users running a compatible build. While this can get changes to your end users quickly, it also can be risky.</p><p><strong>For developers who want more control, we’re releasing percentage-based rollouts with EAS Update in Developer Preview.</strong></p><p>You can get started by publishing an update to a new EAS Update branch you’d like to roll out. You can do this with eas update -branch [branch-name].</p><p>Then, you can start a rollout with npx eas-cli@latest channel:rollout. Once your rollout has begun, you can rerun this command to increase, decrease, or end the rollout.</p><p><strong>Learn more in our </strong><a href="https://docs.expo.dev/eas-update/rollouts/"><strong>EAS Update documentation</strong></a><strong>.</strong></p><h3>Usage</h3><pre>npx eas-cli@latest channel:rollout</pre><p>Since this feature is currently in Developer Preview, it is advised to wait to use it in production workflows. We’d love to hear your feedback on it, so email <a href="/service/mailto:rollouts@expo.dev">rollouts@expo.dev</a> if you have any thoughts or questions.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=4eac28596470" width="1" height="1" alt=""><hr><p><a href="https://blog.expo.dev/feature-preview-rollouts-for-eas-update-4eac28596470">Feature Preview: Rollouts for EAS Update</a> was originally published in <a href="https://blog.expo.dev/">Exposition</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Lightweight Alternatives to Redux]]></title>
            <link>https://medium.com/stackanatomy/lightweight-alternatives-to-redux-eef4d4eb387c?source=rss-c35630ebd4d------2</link>
            <guid isPermaLink="false">https://medium.com/p/eef4d4eb387c</guid>
            <category><![CDATA[react]]></category>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[redux]]></category>
            <category><![CDATA[javascript]]></category>
            <dc:creator><![CDATA[Aman Mittal]]></dc:creator>
            <pubDate>Fri, 28 Jan 2022 08:12:40 GMT</pubDate>
            <atom:updated>2022-01-28T08:12:40.142Z</atom:updated>
            <content:encoded><![CDATA[<h4>Sometimes all you need is just a hook</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*vKfQpcQH8tZIrCYqLT80Ww.jpeg" /></figure><p>When building a React application, there are many options to choose from when it comes to a state management library. Redux has been the go-to choice for many development teams over the years. However, React’s ever evolving ecosystem and unopinionated nature provide various solutions where Redux might not be the best choice.</p><p>In this article, let’s look at these lightweight alternatives to Redux that you can use in your React applications to manage the application state.</p><h3>React Hooks</h3><p>Depending on the React application, it might not be a state management library. Hooks available in React brought the state to functional components. It’s a powerful feature that allows a function component to manage its own local state. Not all applications would require having everything in a central state. It might be over-engineered for such cases.</p><p>You can create a local state management system for the functional component using React hooks such as useState, useEffect, &#39; useReducer&#39;. These hooks are available in React out of the box. You can create custom hooks and separate them from the presentational components to make the code more readable.</p><h3>React Context and useReducer hook</h3><p>There are two types of states to deal with in React apps. The first type is the local state that is used only within a React component. The second type is the global state that can be shared among multiple components within a React application.</p><p>Another API that React ships out of the box is Context. It falls under the second type of shared state category. Using it with the useReducer hook, you can implement a custom global lightweight state management system. The useReducer hook is a great way to manage complex state objects and state transitions. It is different from useState. It updates the state by accepting a reducer function and an initial state. Then, it returns the actual state and a dispatch function. This dispatch function is used to make changes to the state.</p><p>If you have used Redux in the past, that may sound familiar. Conceptually, Redux uses the same concept of dispatching a function to make changes.</p><p>With an example, let’s see you can use them together. Start by importing the required hooks from React library.</p><pre>import { useReducer, createContext } from <a href="https://github.com/facebook/react/tree/master/packages/react">&#39;react&#39;</a>;</pre><p>Next, create an empty context and an initial state object. If there is no initial state, you can leave this object empty. For example, in the code snippet below, we’ve defined an initial state with a todos array with a single item.</p><pre>export const TodosContext = createContext();</pre><pre>const initialState = {<br>  todos: [<br>    {<br>      id: 0,<br>      item: &#39;Buy a notebook&#39;<br>    }<br>  ]<br>};</pre><p>The next step is to define a function called reducer. It is going to take two arguments, the current state, and action. This function is used to update the state object whenever there is an action dispatched. The action dispatches when the app user performs an activity with it. One example of an action is a user adding more items to the todos array.</p><pre>const reducer = (state, action) =&gt; {<br>  switch (action.type) {<br>    case &#39;ADD_ITEM&#39;:<br>      return {<br>        todos: [...state.todos, action.payload]<br>      };<br>    default:<br>      return {<br>        state<br>      };<br>  }<br>};</pre><p>Next, define a TodoContextProvider that will be the central store.</p><pre>export const TodosContextProvider = props =&gt; {<br>  const [state, dispatch] = useReducer(reducer, initialState);</pre><pre>  return (<br>    &lt;TodosContext.Provider value={[state, dispatch]}&gt;<br>      {props.children}<br>    &lt;/TodosContext.Provider&gt;<br>  );<br>};</pre><p>The useReducer hook creates a reducer using the reducer function defined in the previous code snippet. This reducer is the first argument to the hook. The initialState is passed as the second argument.</p><p>After that, you will have to wrap the set of components or the initial App component of the React application with the TodosContextProvider. This way, the Context API makes the state and dispatch function available anywhere without passing anything down the component tree.</p><pre>export const App = () =&gt; {<br>  return (<br>    &lt;TodosContextProvider&gt;<br>      &lt;MainApp /&gt;<br>    &lt;/TodosContextProvider&gt;<br>  );<br>};</pre><p>Using the useContext hook from React within the MainApp function component, you can access values from the TodosContext. In the same component, you can dispatch the action to add more todos.</p><pre>import { useContext, useState } from <a href="https://github.com/facebook/react/tree/master/packages/react">&#39;react&#39;</a>;</pre><pre>export const MainApp = () =&gt; {<br>  const [state, dispatch] = useContext(TodosContext);</pre><pre>  // the below is a local state variable to get the item name<br>  const [item, setItem] = useState(&#39;&#39;);</pre><pre>  const addTodos = event =&gt; {<br>    if (name !== &#39;&#39;) {<br>      dispatch({<br>        type: &#39;ADD_EXPENSE&#39;,<br>        payload: { id: uuid(), item }<br>      });</pre><pre>      // clean input fields<br>      setItem(&#39;&#39;);<br>    }<br>  };</pre><pre>  // ... rest of the component code<br>};</pre><h3>Zustand</h3><p><a href="https://github.com/pmndrs/zustand">Zustand</a> is an open-source state management library that uses the same flux principles but in a simplified manner. It is one of the lightest management libraries available with bundle size at 2kB according to <a href="https://bundlephobia.com/package/zustand@3.6.9">bundlephobia</a> when minified.</p><p>It tackles a few of the common pitfalls like:</p><ul><li><a href="https://react-redux.js.org/api/hooks#stale-props-and-zombie-children">Zombie children</a></li><li><a href="https://github.com/bvaughn/rfcs/blob/useMutableSource/text/0000-use-mutable-source.md">React Concurrency</a></li><li><a href="https://github.com/facebook/react/issues/13332">Context loss</a></li></ul><p>It is straightforward to get started with Zustand when it comes to creating a store using the hook create method provided by the library. It accepts a callback function as its first argument. The store created is a React hook.</p><pre>import create from <a href="https://github.com/pmndrs/zustand">&#39;zustand&#39;</a>;</pre><pre>const useStore = create(set =&gt; ({<br>  todos: [<br>    {<br>      id: 1,<br>      item: &#39;Buy a notebook&#39;<br>    },<br>    {<br>      id: 2,<br>      item: &#39;Buy coffee beans&#39;<br>    }<br>  ],<br>  addTodo: todo =&gt;<br>    set(state =&gt; ({<br>      todos: [{ item: pokemon.item, id: uuid() }, ...state.todos]<br>    }))<br>}));</pre><p>The callback function accepts a set function as its argument that is used when manipulating the state.</p><p>The create method returns the useStore as a hook such that you can use it in any of the React components.</p><pre>const App = () =&gt; {<br>  const todos = useStore(state =&gt; state.todos);</pre><pre>  // ...<br>};</pre><p>Zustand also recommends a practice of memoizing selectors with a useCallback hook from React. This prevents unnecessary computations on each render. This way, the React application is optimized for performance in concurrent mode.</p><p>Due to its unopinionated nature, Zustand is a great lightweight solution for state management in a React application. It has less boilerplate code and doesn’t wrap the React app in context providers. You can create multiple stores to handle different states and actions. It is also compatible with well-known tools like Redux Devtools and offers built-in middleware such as persist to persist the state of the application.</p><h3>Open Source Session Replay</h3><p>Debugging a web application in production may be challenging and time-consuming. <a href="https://github.com/openreplay/openreplay">OpenReplay</a> is an Open-source alternative to FullStory, LogRocket and Hotjar. It allows you to monitor and replay everything your users do and shows how your app behaves for every issue. It’s like having your browser’s inspector open while looking over your user’s shoulder. OpenReplay is the only open-source alternative currently available.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*IaqBG5qxzEFrLK1Z.png" /></figure><p>Happy debugging, for modern frontend teams — <a href="https://github.com/openreplay/openreplay">Start monitoring your web app for free</a>.</p><h3>Jotai</h3><p><a href="https://github.com/pmndrs/jotai">Jotai</a> is another open-source state management library developed and maintained by the same team behind Zustand. While the latter is based on flux principles, the former is based on the atomic approach. The state in an application, when split into atoms, is much smaller and lighter when compared to a redux store.</p><p>According to <a href="https://bundlephobia.com/package/jotai@1.5.3">bundlephobia</a>, the bundle size at 8.1kB when minified.</p><p>For all purposes, the Jotai has a simple API that revolves around Provider, atom, and useAtom hook. An atom is stored inside the React state tree. It uses React Context, so you will have to take care of optimizing the re-rendering of components.</p><p>Here is an example of creating a primitive atom with initial values:</p><pre>import { atom } from <a href="https://github.com/pmndrs/jotai">&#39;jotai&#39;</a>;</pre><pre>const countAtom = atom(0);<br>const countryAtom = atom(&#39;Japan&#39;);<br>const citiesAtom = atom([&#39;Tokyo&#39;, &#39;Kyoto&#39;, &#39;Osaka&#39;]);</pre><p>Using the atom in a React component is equivalent to using React.useState.</p><pre>import { useAtom } from <a href="https://github.com/pmndrs/jotai">&#39;jotai&#39;</a>;</pre><pre>function Counter() {<br>  const [count, setCount] = useAtom(countAtom);<br>  return (<br>    &lt;h1&gt;<br>      {count}<br>      &lt;button onClick={() =&gt; setCount(c =&gt; c + 1)}&gt;one up&lt;/button&gt;<br>    &lt;/h1&gt;<br>  );<br>}</pre><p>Jotai offers a hook called <a href="https://jotai.org/docs/api/devtools">useAtomDevTools</a> that can be used to manage Redux DevTools integration for a particular atom.</p><h3>Valtio</h3><p><a href="https://github.com/pmndrs/valtio">Valtio</a> is a lightweight proxy based state management system for React applications. Proxy is a design pattern for observing an object and modifying it, with each object can have its own custom behavior.</p><p>Creating a state with Valtio means you have to wrap the state object in the React app with proxy. Any updates to the state object are handled by the library.</p><pre>import { proxy } from <a href="https://github.com/pmndrs/valtio">&#39;valtio&#39;</a>;</pre><pre>const state = proxy({<br>  count: 0<br>});</pre><p>Since the library handles tracking of the updates to the state object, you can mutate it directly in a React component, just like a normal JavaScript object.</p><pre>setInterval(() =&gt; {<br>  ++state.count;<br>}, 1000);</pre><p>Valtio has a built-in hook called useProxy that reads a value from snapshots. Using it, the React component will only re-render when the part of the state in the component changes.</p><pre>const Counter = () =&gt; {<br>  const snapshot = useProxy(state);<br>  return (<br>    &lt;div&gt;<br>      {snapshot.count}<br>      &lt;button onClick={() =&gt; ++state.count}&gt;Add&lt;/button&gt;<br>    &lt;/div&gt;<br>  );<br>};</pre><p>According to <a href="https://bundlephobia.com/package/valtio@1.2.10">bundlephobia</a>, the bundle size at 6.7kB when minified.</p><h3>Conclusion</h3><p>Picking up a state management library that fulfills the need of having a centralized store in your React application comes with a variety of options. We went through some of those options in this post. Some of these options are powerful, and while the vanilla React hooks way of dedicating a component’s state and not creating a centralized store for everything is a tried and tested approach.</p><p><em>Originally published at </em><a href="https://blog.openreplay.com/lightweight-alternatives-to-redux"><em>https://blog.openreplay.com</em></a><em> on January 27, 2022.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=eef4d4eb387c" width="1" height="1" alt=""><hr><p><a href="https://medium.com/stackanatomy/lightweight-alternatives-to-redux-eef4d4eb387c">Lightweight Alternatives to Redux</a> was originally published in <a href="https://medium.com/stackanatomy">StackAnatomy</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[React Architecture Patterns for Your Projects]]></title>
            <link>https://medium.com/stackanatomy/react-architecture-patterns-for-your-projects-6f495448f04b?source=rss-c35630ebd4d------2</link>
            <guid isPermaLink="false">https://medium.com/p/6f495448f04b</guid>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[technology]]></category>
            <category><![CDATA[react]]></category>
            <dc:creator><![CDATA[Aman Mittal]]></dc:creator>
            <pubDate>Wed, 22 Dec 2021 13:09:54 GMT</pubDate>
            <atom:updated>2021-12-22T13:09:54.927Z</atom:updated>
            <content:encoded><![CDATA[<h4>Learn what are the best practices when structuring your React.JS projects</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*vnAzOnk2mGxHyMTGBCLdnQ.jpeg" /></figure><p>React is an un-opinionated framework in the front-end ecosystem. Its versatile nature does not provide a way to organize and structure a web application. The way an application is organized and structured is how a developer or a team of developers interact with it. A project with no logical structure means that everyone can do whatever they want inside it. A well-structured project requires developers to think deeper about their implementation and at the same time keep things organized. It also makes the codebase easy to navigate, modify and scale to add new features.</p><p>The architecture of a project is essential. An organized codebase is how a team of developers gets productive within the given structure in the long run. In this article, let’s look at some of the ways to keep the lifecycle of a React application healthy and well organized and what patterns you can follow.</p><h3>Navigating a Directory Structure</h3><p>Always have a starting point in your React application. This starting point comprises various folders such as assets, components, services, utils (reusable utility functions), pages, etc. Each of these folders contains various files required to fulfill the directory’s purpose.</p><p>For example, a bare minimum React project created using the create-react-app command-line utility to create a new React app comes with a /src directory. The starting point of this default React app (index.js file) is situated in this directory. A common practice is to use the /src directory as a familiar convention. That means all the different folders for components, pages, etc., are created inside this directory.</p><p>Using this convention, the top-level directory structure where your React app’s codebase lives can be viewed as:</p><pre>└── /src<br>    ├── /assets<br>    ├── /components<br>    ├── /context<br>    ├── /hooks<br>    ├── /pages<br>    ├── /services<br>    ├── /utils<br>    └── App.js<br>    ├── index.js</pre><p>The important part here is not to make the directory name a hard and fast rule but to follow a neat organization that anyone in the codebase can understand. That means, depending on the directory names you like to follow, the /services directory can be called /api.</p><h3>Common Modules</h3><p>One advantage of React being un-opinionated is it doesn’t care how you divide your modules. When developing a page in a React app, consider dividing it into modular pieces. This will help you reduce the complexity and create structures that are open for reusable or shared across the application.</p><p>Shareable code in React app should be divided under its own domain. A common module can be reusable custom components, custom hooks, business logic, constants, and utility functions. These reusable pieces are shared across the application to be used on more than one page component. Having a folder for them in your application’s directory structure is a good starting point.</p><h3>Add Custom Components in their own folders</h3><p>Examples of reusable components can be buttons, input fields, and content containers like cards. All of these components live within the /components directory. Each component will live inside its own sub-directory. For example, if you are creating reusable Buttons, here is an example of a directory structure you can consider:</p><pre>└── /src<br>    ├── /components<br>    |   ├── /Button<br>    |   |   ├── Button.js<br>    |   |   ├── Button.styles.js<br>    |   |   ├── Button.test.js<br>    |   |   ├── Button.stories.js<br>    |   ├──index.js</pre><p>Here is a brief explanation of what each file inside the Button directory contains:</p><ul><li>Button.js file that contains the actual React component</li><li>Button.styles.js file, let’s assume you are using styled components, contains corresponding styles</li><li>Button.test.js file that contains tests</li><li>Button.stories.js the Storybook file</li></ul><p>In the above structure, also notice that there is an index.js file located in the /components directory. In this scenario, this file acts as an index of all components that are part of the namesake directory. This file will look like the following:</p><pre>// /src/components/index.js</pre><pre>import { Button } from &#39;./Button/Button&#39;;<br>import { InputField } from &#39;./InputField/InputField&#39;;<br>import { Card } from &#39;./Card/Card&#39;;</pre><pre>export { Button, Card, InputField };</pre><h3>Create Custom Hooks</h3><p>A reusable React Hook is like a reusable working part. Just like you create custom components, creating a custom hook can help reduce code complexity.</p><p>Consider an example. In your React app, you have two different pages representing a login and a signup form. Each of these pages contains text input fields where users can enter their credentials and submit the form using a button. One of the input fields used in both forms is for users to enter their password. The password field contains an icon that allows the app user to toggle between the field’s visibility. Suppose you write the same code to implement this behavior in both login and signup forms. In that case, you will be duplicating the code.</p><p>A solution to this problem is to create a custom hook to toggle the icon and the field’s visibility based on the icon. Here is an example of a custom hook:</p><pre>// /src/hooks/useTogglePasswordVisibility/index.js</pre><pre>export const useTogglePasswordVisibility = () =&gt; {<br>  const [passwordVisibility, setPasswordVisibility] = useState(true);<br>  const [rightIcon, setRightIcon] = useState(&#39;eye&#39;);</pre><pre>const handlePasswordVisibility = () =&gt; {<br>    if (rightIcon === &#39;eye&#39;) {<br>      setRightIcon(&#39;eye-off&#39;);<br>      setPasswordVisibility(!passwordVisibility);<br>    } else if (rightIcon === &#39;eye-off&#39;) {<br>      setRightIcon(&#39;eye&#39;);<br>      setPasswordVisibility(!passwordVisibility);<br>    }<br>  };</pre><pre>return {<br>    passwordVisibility,<br>    rightIcon,<br>    handlePasswordVisibility<br>  };<br>};</pre><p>The custom hook above starts with a use naming convention. Even though React isn’t strict about naming conventions, it is important to follow them in this scenario. This hook also handles its own state and method and can be re-used on a password field, whether inside the login or a signup form.</p><p>The /hooks directory structure can be similar to components where a reusable hook lives inside their subdirectories:</p><pre>└── /src<br>    ├── /hooks<br>    |   ├── /useTogglePasswordVisibility<br>    |   |   ├── index.js<br>    |   |   ├── useTogglePasswordVisibility.test.js<br>    |   ├──index.js</pre><h3>Use Absolute Imports</h3><p>By default, a React app that uses the before mentioned directory structure might lead you to use import paths in the following manner:</p><pre>// some file</pre><pre>import { Button } from &#39;../../components&#39;;</pre><p>You can configure your React application by adding support for importing modules using absolute paths. In a plain React app, this can be done by creating and configuring a jsconfig.json file at the root of your project.</p><p>Here is an example of a simple configuration inside the jsconfig.json file:</p><pre>{<br>  &quot;compilerOptions&quot;: {<br>    &quot;baseUrl&quot;: &quot;src&quot;<br>  },<br>  &quot;include&quot;: [&quot;src&quot;]<br>}</pre><p>It makes it a lot easier to import components within the project and also, at the same time moving files without the need to change the import statements. If you want to import a module located at /src/components, you can import it as follows:</p><pre>import { Button } from &#39;components&#39;;</pre><p>If you have a custom Webpack configuration inside a file called webpack.config.js. In that case, you can customize this further to use a prefix like @components or ~components.</p><pre>module.exports = {<br>  resolve: {<br>    extensions: [&#39;js&#39;],<br>    alias: {<br>      &#39;@&#39;: path.resolve(__dirname, &#39;src&#39;),<br>      &#39;<a href="http://twitter.com/components">@components</a>&#39;: path.resolve(__dirname, &#39;src/components&#39;)<br>      &#39;<a href="http://twitter.com/hooks">@hooks</a>&#39;: path.resolve(__dirname, &#39;src/hooks&#39;),<br>    }<br>  }<br>};</pre><p>This will allow you to import using a prefix. For example, a module located at /src/components/Button can be imported as:</p><pre>import { Button } from &#39;@components&#39;;</pre><p>Note: If you’re using TypeScript, you will have a file called tsconfig.json. You can configure this file. For more information, check out Create React App documentation <a href="https://create-react-app.dev/docs/importing-a-component/#absolute-imports">here</a>.</p><h3>Open Source Session Replay</h3><p>Debugging a web application in production may be challenging and time-consuming. <a href="https://github.com/openreplay/openreplay">OpenReplay</a> is an Open-source alternative to FullStory, LogRocket and Hotjar. It allows you to monitor and replay everything your users do and shows how your app behaves for every issue. It’s like having your browser’s inspector open while looking over your user’s shoulder. OpenReplay is the only open-source alternative currently available.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*hj82YGaZdMMqIfUTqPwO8A.png" /></figure><p>Happy debugging, for modern frontend teams — <a href="https://github.com/openreplay/openreplay">Start monitoring your web app for free</a>.</p><h3>Separate business logic from UI</h3><p>The /pages directory will contain the UI for most of the application and the structure of each page in the form of React components. These components are naturally coupled with the business logic they represent. It is a common behavior that you will find in any React application. However, avoid unnecessary complexity in a UI component, you can separate the business logic from it.</p><p>One way to separate the UI and the logic is to create a custom hook, for example, for making an API request. Here is an example of making an API request to get items from an endpoint:</p><pre>import { useQuery } from &#39;react-query&#39;;</pre><pre>export const moviesApi = {<br>  nowPlaying: () =&gt;<br>    fetch(`${BASE_URL}/movie/now_playing?api_key=${API_KEY}&amp;page=1`).then(res =&gt;<br>      res.json()<br>    )<br>};</pre><pre>export const useNowPlayingMovies = () =&gt; {<br>  const { isLoading: nowPlayingLoading, data: nowPlayingData } = useQuery(<br>    [&#39;movies&#39;, &#39;nowPlaying&#39;],<br>    moviesApi.nowPlaying<br>  );</pre><pre>return {<br>    nowPlayingLoading,<br>    nowPlayingData<br>  };<br>};</pre><p>In the above snippet, take note that the API request to fetch data from the endpoint /movie/now_playing happens in two parts. The first part is the API request itself using JavaScript’s fetch method that gets the data in JSON format. The second part is where the useQuery hook from React Query library is configured and wrapped inside a custom hook.</p><p>You can store or create this custom hook file inside the dedicated /hooks directory or create another directory for API-related hooks such as /api or /services.</p><h3>The Utils directory</h3><p>Having a utils directory is completely optional. If your application tends to have some global utility functions, it could be a good idea to separate them from the UI components. A /utils directory may contain app-wide constants and helper methods. For example, more than one UI component in your application may require some validation logic. Separating this validation business logic in its own file under the /utils directory will help you create separate flows.</p><h3>Avoiding creating a single Context for everything</h3><p>Usually, when you pass props from a parent to a child component, it can be as simple as passing them from one to another. However, the complexity arises when there are many components in between. This creates an inconvenient way to pass props.</p><p><a href="https://beta.reactjs.org/learn/passing-data-deeply-with-context">React Context</a> provides a way to pass data through the component tree without <a href="https://beta.reactjs.org/learn/passing-data-deeply-with-context#the-problem-with-passing-props">prop drilling</a>. It is an alternative approach that lets a parent component provide props to the entire tree below it. This way, sharing data becomes easy, and one can avoid passing unnecessary props.</p><p>In your React application, you should have separate Contexts for different things. For example, your React app uses themes for UI components, but some of these components use internationalization or i18n.</p><p>The i18n context doesn’t care if the theme exposes a certain dark or light mode value. In this scenario, you will have two different context providers. This helps you separate data logically.</p><pre>const App = () =&gt; {<br>    return (    <br>    &lt;ThemeProvider&gt;<br>        &lt;QueryClientProvider&gt;<br>            &lt;Routes /&gt;<br>        &lt;/QueryClientProvider&gt;<br>    &lt;/ThemeProvider&gt;<br>    )<br>}</pre><p>Also, if a Context is used in one of the components, you do not need to wrap the application’s root with that Context’s provider. If a section of the application doesn’t require specific data, you don’t have to share it.</p><h3>Conclusion</h3><p>Patterns or practices described in this article are based on one’s experience. They may not work for every large-scale application of every kind. Take the parts that resonate with you or you think will help you get things more organized in your React project and leave out the rest. The important part when it comes to organizing a React app is to structure it in a manner that makes sense to you, and if you happen to work in a team with other people, it should make sense to them too.</p><p><em>Originally published at </em><a href="https://blog.openreplay.com/5-projects-you-need-to-build-to-get-started-with-reactjs"><em>https://blog.openreplay.com</em></a><em> on December 22, 2021.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6f495448f04b" width="1" height="1" alt=""><hr><p><a href="https://medium.com/stackanatomy/react-architecture-patterns-for-your-projects-6f495448f04b">React Architecture Patterns for Your Projects</a> was originally published in <a href="https://medium.com/stackanatomy">StackAnatomy</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Create a Custom Hook to Show/Hide Password Visibility in React Native]]></title>
            <link>https://javascript.plainenglish.io/create-a-custom-hook-for-show-hide-password-visibility-in-react-native-db184a48126e?source=rss-c35630ebd4d------2</link>
            <guid isPermaLink="false">https://medium.com/p/db184a48126e</guid>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[react-native]]></category>
            <category><![CDATA[expo]]></category>
            <category><![CDATA[mobile-app-development]]></category>
            <dc:creator><![CDATA[Aman Mittal]]></dc:creator>
            <pubDate>Mon, 13 Dec 2021 12:33:13 GMT</pubDate>
            <atom:updated>2021-12-14T07:34:17.733Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*nf3NO1mz-MVDpv4ouGFP_Q.png" /></figure><p>Building login and signup forms in a React Native app comprise input fields and buttons. One field that you will often find yourself adding to these forms is the password field. This password field is composed of using React Native’s TextInput component.</p><p>The common behavior of this field is to hide a user’s password behind obscure characters.</p><p>Take a look at an example of the TextInput component that is used to create a password field.</p><pre>import React, { useState } from <a href="https://github.com/facebook/react/tree/master/packages/react">&#39;react&#39;</a>;<br>import { StyleSheet, TextInput, View } from <a href="https://github.com/facebook/react-native">&#39;react-native&#39;</a>;</pre><pre>export default function App() {<br>  const [password, setPassword] = useState(&#39;&#39;);</pre><pre>  return (<br>    &lt;View style={styles.container}&gt;<br>      &lt;View style={styles.inputContainer}&gt;<br>        &lt;TextInput<br>          style={styles.inputField}<br>          name=&#39;password&#39;<br>          placeholder=&#39;Enter password&#39;<br>          autoCapitalize=&#39;none&#39;<br>          autoCorrect={false}<br>          textContentType=&#39;newPassword&#39;<br>          secureTextEntry<br>          value={password}<br>          enablesReturnKeyAutomatically<br>          onChangeText={text =&gt; setPassword(text)}<br>        /&gt;<br>      &lt;/View&gt;<br>    &lt;/View&gt;<br>  );<br>}</pre><pre>const styles = StyleSheet.create({<br>  container: {<br>    flex: 1,<br>    backgroundColor: &#39;#F5EEDC&#39;,<br>    alignItems: &#39;center&#39;,<br>    justifyContent: &#39;center&#39;,<br>    paddingHorizontal: 12<br>  },<br>  inputContainer: {<br>    backgroundColor: &#39;white&#39;,<br>    width: &#39;100%&#39;,<br>    borderRadius: 8,<br>    flexDirection: &#39;row&#39;,<br>    alignItems: &#39;center&#39;,<br>    borderWidth: 4,<br>    borderColor: &#39;#d7d7d7&#39;<br>  },<br>  inputField: {<br>     padding: 14,<br>    fontSize: 22,<br>    width: &#39;90%&#39;<br>  }<br>  }<br>});</pre><p>It uses the secureTextEntry prop such that when a text value is entered in the input field, it is unclear what is being entered in that field.</p><p>Here is the output of the above snippet on a device:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/308/0*VdUiQ4JdrZ9QrT2R" /></figure><p>However, giving an option to a user to let them see the current value they enter could lead to a good experience and might be necessary in some cases.</p><h3>Show or Hide Password Visibility Hook</h3><p>To add the ability to show or hide the password field’s visibility, let’s create a custom hook in a new file called useTogglePasswordVisibility.js.js.</p><p>Start by importing the useState hook from React library. You will need to create two different state variables to toggle between the field&#39;s visibility and change the icon.</p><p>Then define a function called useTogglePasswordVisibility. Inside this function, create two new state variables. The first one is called passwordVisibility. Its initial value is set to boolean true. The reason is that this variable will be the value of the prop secureTextEntry on the TextInput component. You would want to hide the password field initially when the user enters the password in the input field.</p><p>The second state variable defined is called rightIcon. It has a default value of eye. This value depends on the Icon Library you&#39;re using in your React Native app. For this example, I&#39;m using MaterialCommunityIcons from <a href="https://docs.expo.dev/guides/icons/">Expo Vector Icons</a>.</p><pre>export const useTogglePasswordVisibility = () =&gt; {<br>  const [passwordVisibility, setPasswordVisibility] = useState(true);<br>  const [rightIcon, setRightIcon] = useState(&#39;eye&#39;);</pre><pre>  // ...<br>};</pre><p>Next, add a method called handlePasswordVisibility that will allow the app user to toggle the password field&#39;s visibility between shown and hidden state.</p><p>Lastly, do not forget to return all the variables and the handler method.</p><pre>export const useTogglePasswordVisibility = () =&gt; {<br>  const [passwordVisibility, setPasswordVisibility] = useState(true);<br>  const [rightIcon, setRightIcon] = useState(&#39;eye&#39;);</pre><pre>  const handlePasswordVisibility = () =&gt; {<br>    if (rightIcon === &#39;eye&#39;) {<br>      setRightIcon(&#39;eye-off&#39;);<br>      setPasswordVisibility(!passwordVisibility);<br>    } else if (rightIcon === &#39;eye-off&#39;) {<br>      setRightIcon(&#39;eye&#39;);<br>      setPasswordVisibility(!passwordVisibility);<br>    }<br>  };</pre><pre>  return {<br>    passwordVisibility,<br>    rightIcon,<br>    handlePasswordVisibility<br>  };<br>};</pre><h3>Use the Password Visibility Hook</h3><p>Start by updating import statements in the App.js file:</p><pre>import React, { useState } from <a href="https://github.com/facebook/react/tree/master/packages/react">&#39;react&#39;</a>;<br>import { StyleSheet, Pressable, TextInput, View } from <a href="https://github.com/facebook/react-native">&#39;react-native&#39;</a>;<br>import { MaterialCommunityIcons } from <a href="https://github.com/expo/vector-icons">&#39;@expo/vector-icons&#39;</a>;</pre><pre>import { useTogglePasswordVisibility } from &#39;./hooks/useTogglePasswordVisibility&#39;;</pre><p>Next, access the required variables and method from the useTogglePasswordVisibility hook. Add the following line at the top of the App component:</p><pre>export default function App() {<br>  const { passwordVisibility, rightIcon, handlePasswordVisibility } =<br>    useTogglePasswordVisibility();<br>  const [password, setPassword] = useState(&#39;&#39;);</pre><pre>  // ...<br>}</pre><p>Modify the TextInput component&#39;s prop. Make sure to addthe passwordVisibility as the value to the secureTextEntry prop.</p><pre>&lt;TextInput<br>  secureTextEntry={passwordVisibility}<br>  // ... rest of the props remain unchanged<br>/&gt;</pre><p>Inside the View component that wraps the TextInput, add a button using the Pressable component. This button will allow the user to toggle between the hidden and shown state of the password field.</p><p>This button wraps the icon component.</p><pre>&lt;View style={styles.inputContainer}&gt;<br>  {/* After TextInput component */}<br>  &lt;Pressable onPress={handlePasswordVisibility}&gt;<br>    &lt;MaterialCommunityIcons name={rightIcon} size={22} color=&quot;#232323&quot; /&gt;<br>  &lt;/Pressable&gt;<br>&lt;/View&gt;</pre><p>That’s all! Here is the output after this step:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/308/0*_NN4hvWqKUNc2yw5" /></figure><p>Here is the complete code for the App.js file:</p><pre>import React, { useState } from <a href="https://github.com/facebook/react/tree/master/packages/react">&#39;react&#39;</a>;<br>import { StyleSheet, Pressable, TextInput, View } from <a href="https://github.com/facebook/react-native">&#39;react-native&#39;</a>;<br>import { MaterialCommunityIcons } from <a href="https://github.com/expo/vector-icons">&#39;@expo/vector-icons&#39;</a>;</pre><pre>import { useTogglePasswordVisibility } from &#39;./hooks/useTogglePasswordVisibility&#39;;</pre><pre>export default function App() {<br>  const { passwordVisibility, rightIcon, handlePasswordVisibility } =<br>    useTogglePasswordVisibility();<br>  const [password, setPassword] = useState(&#39;&#39;);</pre><pre>  return (<br>    &lt;View style={styles.container}&gt;<br>      &lt;View style={styles.inputContainer}&gt;<br>        &lt;TextInput<br>          style={styles.inputField}<br>          name=&quot;password&quot;<br>          placeholder=&quot;Enter password&quot;<br>          autoCapitalize=&quot;none&quot;<br>          autoCorrect={false}<br>          textContentType=&quot;newPassword&quot;<br>          secureTextEntry={passwordVisibility}<br>          value={password}<br>          enablesReturnKeyAutomatically<br>          onChangeText={text =&gt; setPassword(text)}<br>        /&gt;<br>        &lt;Pressable onPress={handlePasswordVisibility}&gt;<br>          &lt;MaterialCommunityIcons name={rightIcon} size={22} color=&quot;#232323&quot; /&gt;<br>        &lt;/Pressable&gt;<br>      &lt;/View&gt;<br>    &lt;/View&gt;<br>  );<br>}</pre><pre>const styles = StyleSheet.create({<br>  container: {<br>    flex: 1,<br>    backgroundColor: &#39;#F5EEDC&#39;,<br>    alignItems: &#39;center&#39;,<br>    justifyContent: &#39;center&#39;,<br>    paddingHorizontal: 12<br>  },<br>  inputContainer: {<br>    backgroundColor: &#39;white&#39;,<br>    width: &#39;100%&#39;,<br>    borderRadius: 8,<br>    flexDirection: &#39;row&#39;,<br>    alignItems: &#39;center&#39;,<br>    borderWidth: 4,<br>    borderColor: &#39;#d7d7d7&#39;<br>  },<br>  inputField: {<br>    padding: 14,<br>    fontSize: 22,<br>    width: &#39;90%&#39;<br>  }<br>});</pre><ul><li><a href="https://github.com/amandeepmittal/react-native-examples/tree/master/custom-hook-password-toggle"><strong>Source code at this GitHub repo</strong></a><strong> 🐙</strong></li><li><a href="https://amanhimself.dev/"><strong>Check out other blog posts</strong></a> I wrote on React Native and Expo 📄</li><li><a href="https://twitter.com/amanhimself"><strong>Say hi on Twitter</strong></a> 👋</li></ul><p><em>More content at </em><a href="http://plainenglish.io/"><em>plainenglish.io</em></a><em>. Sign up for our </em><a href="http://newsletter.plainenglish.io/"><em>free weekly newsletter here</em></a><em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=db184a48126e" width="1" height="1" alt=""><hr><p><a href="https://javascript.plainenglish.io/create-a-custom-hook-for-show-hide-password-visibility-in-react-native-db184a48126e">Create a Custom Hook to Show/Hide Password Visibility in React Native</a> was originally published in <a href="https://javascript.plainenglish.io/">JavaScript in Plain English</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[11 Best No-Code and Low-Code Back-Ends for 2021]]></title>
            <link>https://medium.com/geekculture/11-best-no-code-and-low-code-back-ends-for-2021-138066ca81f6?source=rss-c35630ebd4d------2</link>
            <guid isPermaLink="false">https://medium.com/p/138066ca81f6</guid>
            <category><![CDATA[low-code]]></category>
            <category><![CDATA[technology]]></category>
            <category><![CDATA[startup]]></category>
            <category><![CDATA[no-code]]></category>
            <category><![CDATA[backend]]></category>
            <dc:creator><![CDATA[Aman Mittal]]></dc:creator>
            <pubDate>Thu, 23 Sep 2021 16:54:24 GMT</pubDate>
            <atom:updated>2021-11-01T10:19:17.073Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*j_F8FvKGpUOFcD7dFFO-Xw.png" /></figure><p>No-code and Low-code development platforms let people worldwide build their businesses and applications to serve them without writing code. According to <a href="https://go.forrester.com/blogs/predictions-2020-software-development/"><strong>Forrester</strong></a>, the no-code/low-code category will grow to $21.2 billion by 2021.</p><p>Before these platforms, building an application for a business would require hiring experienced software developers. But that’s not the case anymore. Today, many no-code/low-code platforms make it possible for independent creators, artists, and entrepreneurs alike to build applications on their own.</p><p>Even though there seems to be a paradigm shift from writing code to using visual development tools, the fundamental concepts of having a back-end and front-end remain the same. To build an application for your business, you will require a way to connect your back-end and front-end. A communication channel called Application Programming Interface (API) is used to request information from one computer system to another. When developing an application, you typically call APIs back and forth between a back-end and a front-end.</p><p><a href="https://draftbit.com/">Draftbit</a> is a visual development platform to build native mobile applications. It is back-end agnostic. Mobile apps built with Draftbit can be connected to virtually any back-end-as-a-service (BaaS) platform via REST API. Our vast user base uses different back-end services to connect their applications with a database.</p><p>This allowed us to look at the most popular back-ends being integrated inside Draftbit. For example, Xano, Supabase, Firestore, Airtable, and more that aim to provide a better user experience overall. We are also <a href="https://draftbit.com/experts">app development experts</a> and can guide you towards the right back-end and what to look for.</p><p>This article aims to highlight some of the best no-code/low-code back-end platforms for you to use in 2021. We highlight their unique features, if the tool offers scalability, and if it is flexible enough or not. Lastly, for each tool, there is a sneak peek into their pricing plans. Many of the back-end tools listed below provide an API gateway to connect the front-end from a hosted back-end offered by the platform.</p><h3>Airtable</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/1*0jpPX7n7XAfgZp1VsgyU7Q.png" /></figure><blockquote><strong>Best for Beginners who want a visual, flexible back-end and are just getting started with understanding APIs.</strong></blockquote><p><a href="https://airtable.com/"><strong>Airtable</strong></a> is an enhanced version of Google Sheets or a typical spreadsheet. However, it offers more than that. Simple to get started, it has rich API support. It allows creating a spreadsheet-based database without the hassle of writing code. In addition, it is a fast and flexible way to organize data tables (known as <em>Bases</em>).</p><p>It contains features such as computed fields. They are special field types where Airtable handles the computation of values. Automating repetitive tasks saves a ton of time and reduces the margin of error. Building automated workflows in an Airtable base is done by using a custom action to trigger an event. Eventually, the action integrates inside an Airtable Base.</p><p>Airtable also generates a REST API for each base. A front-end development tool can consume the API directly. Various operations are performed using different endpoints generated by Airtable. Operations such as reading, writing, updating, sorting and filtering data, and more, are all available.</p><p>While Airtable might not be a traditional back-end, it gives both teams and individuals the freedom to organize tasks. In addition, it offers 50+ built-in applications to easily integrate with a wide array of other apps like G Suite, Outlook, Sendgrid, Slack, Jira, and more.</p><p><strong>Pricing:</strong></p><ul><li>Free: unlimited bases with each base limited to 1200 records and 2 GB of attachments per base.</li><li>Plus: costs $12 per month with 5000 records per base, snapshot history, and 5 GB of attachments per base.</li><li>Pro: costs $24 per month with unlimited apps, 50000 records per base, and 20 GB of attachments per base.</li></ul><h3>Supabase</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*2mLWbhp4-nbnxpO8Sj5RLg.png" /></figure><blockquote><strong>Best for Experts who are building production-grade applications, are familiar with SQL queries, value open-source, and want a scalable solution from the start.</strong></blockquote><p><a href="https://supabase.io/"><strong>Supabase</strong></a> is an open-source Firebase alternative back-end. It provides a dedicated database based on Postgres. It supports importing existing databases as well. Besides, there is built-in support for making authenticated API requests with integrated JWT authentication. This allows you to control what your app users can access. It exposes a WebSocket endpoint that enables any front-end apps to communicate in real-time. The advantage of using a relational database is that it helps you be consistent all the time.</p><p>Relational or SQL databases are table-based databases. They have pre-defined schema and use Structured Query Language (<em>SQL</em>) for defining and manipulating data. Non-relational or NoSQL databases have dynamic schema. They store data in the form of a collection or multiple collections of documents.</p><p>When using Supabase, you will spend most of the time inside its Graphical User Interface (<em>GUI</em>). It also provides an SQL editor, which you can use to write custom SQL queries to manipulate data inside a table.</p><p>One of the most likable features is that it provides a ready-to-use REST API as soon as a database is created. It is front-end agnostic and can be used with any front-end tool building application. It gives you the choice of either self-hosting a Supabase or using their cloud service to host one.</p><p><strong>Pricing:</strong></p><ul><li>Free: $0 per month with unlimited API requests, real-time functionality, and database space up to 500 MB.</li><li>Pro: $25 per month unlimited API requests, real-time functionality, database space up to 8 GB, supports automatic backup and log retention for up to 7 days.</li><li>Pay as you go: Starts at $25 per month plus the usage of services like database space, storage, and transfer limits.</li></ul><h3>Firebase Firestore</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*xhxraF3HeEoL3ui-HAlI_A.png" /></figure><blockquote><strong>Best for Intermediates who are looking to build fast, want to delegate security and user management to the backend service, and can cope with some learning curve.</strong></blockquote><p><a href="https://firebase.google.com/docs/firestore"><strong>Firebase Firestore</strong></a> is a database service from Google. It has a colossal community even though Firestore came out of beta only two years back. It is a managed database designed to embrace serverless application development. With an Opinionated set of features, it provides and is based on NoSQL.</p><p>The NoSQL paradigm lets you store data in the form of collections and documents. Each document contains fields. Every field has its unique data type. The advantage of such a database type is that it helps you move fast when building applications.</p><p>Firestore has its own built-in security system. It helps you to define rules to allow app users to access data based on their authenticated state. It supports traditional sign providers using email/password. Social providers such as Google, Facebook, Apple, Twitter, and more.</p><p>Integrating Firebase with a front-end development platform is a bit opinionated. It usually means that a no-code or a low-code platform has to provide an out-of-the-box integration for Firebase to use within their platform.</p><p><strong>Pricing:</strong></p><ul><li>Spark Plan(free): 1 GiB total stored data in Firestore</li><li>Blaze plan (pay as you go): 1 GiB total plus $0.108 per more GiB stored data in Firestore</li></ul><h3>Xano</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*4e4wj0K_GIVxXFf0Y6V_yg.png" /></figure><blockquote><strong>Best for Low-Coders who want to move fast, and need a scalable database with a built-in API gateway.</strong></blockquote><p><a href="https://www.xano.com/"><strong>Xano</strong></a> is a scalable back-end that is front-end agnostic. It provides a hosted and flexible database based on Postgres. It supports the REST API paradigm to consume data to a front-end tool. It automatically generates ready-to-use REST API endpoints for each data table based on the schema created. Each endpoint generated by Xano can be customized using its No code API Builder.</p><p>Getting started with Xano is easy. There aren’t many configurations required once you log in. It abstracts the back-end away to a large extent. However, the abstraction doesn’t cost the performance and the power of a database. Another feature included with Xano is that it supports authenticated API requests. It also provides the ability to create custom functions to query databases without writing a line of code. The flexibility and scalability of such a platform make it one of the most simple back-end to get started.</p><p><strong>Pricing:</strong></p><ul><li>Free: limited to one workspace with 1000 total records and a rate-limited API.</li><li>Launch: costs $67 per month, includes five workspaces with 100,000 total records per workspace, and no rate limitation on the API.</li><li>Scale: costs $225 per month, includes 10 workspaces, storage with 1,000,000 total records.</li></ul><h3>Bubble CMS</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/470/1*hpMYIz_1i6_3B9M719cy8g.png" /></figure><blockquote><strong>Best for No-Coders who already have their web application built and database hosted with Bubble.</strong></blockquote><p><a href="https://bubble.io/"><strong>Bubble</strong></a> is a hosted web application “all in one” builder that gives complete design freedom to its users with no-code. It allows you to create web application layouts without having any knowledge of CSS or HTML. Traditional web apps require you to manage the code and set up a deployment process to a web server. The platform manages the deployment process and web hosting for you.</p><p>Despite Bubble being an all-in-one tool, their powerful Bubble CMS is also easy to connect to any other front-end development tool. Thus, you can consume the same data tables created inside the Bubble CMS to connect it with any other front-end tool, for example, to develop native applications.</p><p><strong>Pricing:</strong></p><ul><li>Free: no access to API</li><li>Personal: costs $29 per month with access to API</li><li>Professional: costs $129 per month</li><li>Production: costs $529 per month</li></ul><h3>Backendless</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*uE5HTjOvglX_Fhx23akOFQ.jpeg" /></figure><p><strong>Best for Low-coders looking for a solution to host their database in the cloud and looking for integrated services such as file storage.</strong></p><p><a href="https://backendless.com/"><strong>Backendless</strong></a> is a cloud back-end platform to create apps without writing any server-side code. It provides programmable services that supply standard server functions. In addition, it supports authenticated user management, authenticated API requests, relational data, push notifications, publish/subscribe messaging, geolocation, video/audio recording, live streaming on the server, file service, and more.</p><p>Backendless makes these services available through the implementation of REST API. It provides access to a REST API that can be used with any front-end tool. Apart from its REST API support, it also supports native SDKs for iOS, Android, JavaScript applications, and more.</p><p><strong>Pricing:</strong></p><ul><li>Springboard: costs $0 per month with unlimited API calls per month</li><li>Cloud9: costs $35 per month with 10,000,000 API calls per month</li><li>Cloud99: costs $149 per month with 40,000,00 API calls per month</li></ul><h3>Contentful</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*DwNELNP22gyMo-6OqIdj4g.png" /></figure><blockquote><strong>Best for Intermediates who are looking for a Content Management platform that provides an API gateway to create media-intensive applications.</strong></blockquote><p><a href="https://www.contentful.com/"><strong>Contentful</strong></a> is an API-first content management platform to create, manage and publish content to any digital channel. It is a modern Content Management System (CMS) where a content model is created independently from any presentation layer. It organizes content into spaces that allow you to group all the related resources for a project together, including content entries, media assets, and settings for localizing content into different languages.</p><p><strong>Pricing:</strong></p><ul><li>Community: costs $0 with full-featured headless CMS</li><li>Team: costs US$489 per month, ideal for a team working on or more digital products</li></ul><h3>Hasura</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/301/1*p-x2neDqoebIN3Oie90Z7w.png" /></figure><blockquote><strong>Best for Experts who are looking for a fast GraphQL based solution and want backward compatibility with REST.</strong></blockquote><p><a href="https://hasura.io/"><strong>Hasura</strong></a> is an instant real-time GraphQL APIs engine. It makes your data instantly accessible through a GraphQL API or a REST API. This helps you to focus on the build and ship applications much faster.</p><p>Hasura connects to a database using a Postgres connection. It can scale horizontally and hold state for caching queries. Authentication based on JSON Web Tokens (JWT) is available to add permission or a role-based system.</p><p><strong>Pricing:</strong></p><ul><li>Free: costs $0 and includes 1 GB data pass-through</li><li>Standard: costs $99 per month and includes 20 GB data pass-through</li></ul><h3>Fauna</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*M7PmRotKPNTVCiaMQBK8sQ.jpeg" /></figure><blockquote><strong>Best for Experts who can deal with a little bit of learning curve and are looking for a transactional, serverless database.</strong></blockquote><p><a href="https://fauna.com/"><strong>Fauna</strong></a> is a database as a service that works well with serverless applications. It is not a traditional database. It has its own query language called FQL. It provides flexible data modeling and supports ACID transactions that eliminate data anomalies.</p><p>While Fauna is more of a complete database solution, usually to generate an API, you will have to use a tool like <a href="https://nocodeapi.com/">NoCodeApi.com</a>.</p><p><strong>Pricing:</strong></p><ul><li>Individual: costs $25 per month</li><li>Team: $150 per month</li></ul><h3>Directual</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*im5yZhQZhjOxbV8umIgHyw.jpeg" /></figure><blockquote><strong>Best for Low-coders who are looking for a scalable NoSQL database that supports advanced API configurations such as authentication.</strong></blockquote><p><a href="https://www.directual.com/"><strong>Directual</strong></a> provides a cloud-hosted scalable NoSQL database. It provides tools to configure a database with the support of data structures and object fields. It also supports the vast majority of data types such as string, number, file, and more.</p><p>It has an in-built web page builder interface and is free to connect to any other low-code or no-code tool. In addition, you can create web or mobile interfaces using its RESTful API feature using any front-end platform.</p><p>It offers an API builder that supports configuring advanced API settings to make authenticated API requests, user management, and event processing without setting up the infrastructure. It also includes filtering, validation, sorting, and custom query params processing.</p><p><strong>Pricing:</strong></p><ul><li>Free: includes one developer seat with 3k operations.</li><li>Startup: costs $39 per month with three developer seats and 30k operations.</li><li>Pro: costs $129 per month with five developer seats and 500k operations.</li><li>Business: costs $439 per month with 10 develop seats and 2M operations.</li></ul><h3>Back4App</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/440/1*XFDPmQhPOiv4MPyJ-7SaEw.png" /></figure><blockquote><strong>Best for Experts who want an advanced solution that supports authentication, file storage, supports REST, and GraphQL, and who value open-source.</strong></blockquote><p><a href="https://www.back4app.com/"><strong>Back4App</strong></a> is an open-source low-code platform to develop modern applications. It supports creating a spreadsheet-like database. It includes data storage, RESTful and GraphQL APIs, file storage, authentication, and push notifications.</p><p>It offers a solution to integrate GDPR compliance into your application. It also offers two hosting options. You can either choose shared if you are looking for a cost-effective solution or dedicated to scaling and large applications.</p><p><strong>Pricing:</strong></p><p>Back4app has the most <a href="https://www.back4app.com/parse-pricing">vibrant and vast pricing options</a> than any other back-end platform on this list.</p><ul><li>Free: up to 10k requests per month</li><li>Solo: starts at $5 for 50k requests per month</li><li>Basic: starts at $25 for 500k requests per month</li><li>Standard: starts at $50 for 2M requests per month</li><li>Silver: starts at $200 with unlimited requests per month</li></ul><h3>Conclusion</h3><p>Given the demand for no-code and low-code applications in recent times, it is not a surprise that there are various options for creating the back-end for your application.</p><p>Depending on your requirements, any one of these tools will help you kickstart low-code app development. However, each back-end platform described in this list has its advantages and limitations. Therefore, it is crucial to consider which suits your needs the best.</p><h4>Next Steps</h4><p>If you are interested in learning more about No-code/Low-code development or building native mobile apps visually, check out the following resources:</p><ul><li>Draftbit on Twitter — <a href="https://twitter.com/draftbit">@draftbit</a></li><li><a href="https://docs.draftbit.com/docs/rest-api-integrations">Guides on using above mentioned back-ends with Draftbit</a></li><li>Aman on Twitter — <a href="https://twitter.com/amanhimself">@amanhimself</a></li></ul><p>And if you need help or have questions, visit the <a href="https://community.draftbit.com/">Draftbit Community</a> forums.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=138066ca81f6" width="1" height="1" alt=""><hr><p><a href="https://medium.com/geekculture/11-best-no-code-and-low-code-back-ends-for-2021-138066ca81f6">11 Best No-Code and Low-Code Back-Ends for 2021</a> was originally published in <a href="https://medium.com/geekculture">Geek Culture</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>