<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Duc Ng</title>
    <description>The latest articles on DEV Community by Duc Ng (@ngduc).</description>
    <link>https://dev.to/ngduc</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F106067%2F7f98c5ba-27bf-4d5c-93c8-82a7af97fa36.png</url>
      <title>DEV Community: Duc Ng</title>
      <link>https://dev.to/ngduc</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ngduc"/>
    <language>en</language>
    <item>
      <title>Keep Life Organized With Dashb.io: It changed my morning routine</title>
      <dc:creator>Duc Ng</dc:creator>
      <pubDate>Tue, 31 Oct 2023 05:51:37 +0000</pubDate>
      <link>https://dev.to/ngduc/keep-life-organized-with-dashbio-it-changed-my-morning-routine-2ogb</link>
      <guid>https://dev.to/ngduc/keep-life-organized-with-dashbio-it-changed-my-morning-routine-2ogb</guid>
      <description>&lt;p&gt;We've all wished for a one-stop solution to our bustling digital life—a single, cohesive tool that could streamline the multitude of apps, tabs and tools we use to keep our life in order. I found this Dashb.io, a web application designed to be your personal productivity dashboard, changed my morning routine and how I start my day with the information I need.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Dashboard For All Your Needs
&lt;/h2&gt;

&lt;p&gt;You know how we've all got a million tabs open for everything under the sun - weather, stocks, news, notes, and that essential lofi playlist to keep us sane throughout the day? Well, Dashb.io is a neat little solution to that mess. It lets you create a personal dashboard using widgets, and it's been super helpful in streamlining my digital chaos. Offering a wide range of customizable widgets, it gives you the power to create a dashboard that suits your needs and aligns with your lifestyle.&lt;/p&gt;

&lt;p&gt;The platform is smooth and intuitive, providing a user-friendly experience. It's almost like having an assistant who neatly organizes all the important information you need on one convenient page. What's more, it's fully customizable. You can make your dashboard as minimalist or as detailed as you want, based on what you need at your fingertips.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Take on Dashb.io
&lt;/h2&gt;

&lt;p&gt;Using Dashb.io has genuinely improved my browser hygiene. No more scrambling between tabs, and no more feeling overwhelmed by the internet’s infinity. It's all there, in one place, beautifully organized, and fully under my control. Having a dedicated space for everything gives me a sense of calm and order in the otherwise chaotic digital world.&lt;/p&gt;

&lt;p&gt;In a nutshell, Dashb.io is an incredibly handy tool for anyone juggling various digital tasks. It's like your personal command center, keeping you informed and in control. And who knows, it might just become your browser's default tab (I know it has become mine!).&lt;/p&gt;

&lt;h2&gt;
  
  
  The Dashb.io Experience: No Strings Attached
&lt;/h2&gt;

&lt;p&gt;One thing that really stood out to me about Dashb.io was how easy it was to get started. No sign-up, no login, no need to remember another password. It's as easy as hitting the link and diving right in. And did I mention it's free? You get to try out all the features without spending a dime. It's about as no-strings-attached as you can get.&lt;/p&gt;

&lt;p&gt;The best part? It's open source! (written in React, you can even create your own widget). You can try it out for free, and you don't even need to login or anything. Give it a try and let me know what you think! &lt;a href="https://www.dashb.io"&gt;https://www.dashb.io&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Create your next project with "create-blank-app" CLI</title>
      <dc:creator>Duc Ng</dc:creator>
      <pubDate>Fri, 20 Oct 2023 00:01:57 +0000</pubDate>
      <link>https://dev.to/ngduc/create-your-next-project-with-create-blank-app-cli-4391</link>
      <guid>https://dev.to/ngduc/create-your-next-project-with-create-blank-app-cli-4391</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TiC4-Nai--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://i.imgur.com/pAkj3k9.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TiC4-Nai--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://i.imgur.com/pAkj3k9.gif" width="800" height="461"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Setting up a new project can be a tedious task, especially when you're dealing with multiple tech stacks. Wouldn't it be great if we could automate this process with a single command? That's where &lt;strong&gt;create-blank-app&lt;/strong&gt; comes into play.&lt;/p&gt;

&lt;p&gt;With the advent of AI technologies in the programming world, developers are now finding more efficient ways to create project codes. One of the latest techniques involves using OpenAI's ChatGPT to generate new project code. This method simplifies and accelerates the process of initializing projects with various tech stacks. In this blog post, I will introduce a tool named &lt;strong&gt;create-blank-app&lt;/strong&gt; (or &lt;strong&gt;cba&lt;/strong&gt; for short), which leverages this cutting-edge technique.&lt;/p&gt;

&lt;h3&gt;
  
  
  Simplify Your Project Initialization with 'create-blank-app'
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;create-blank-app&lt;/strong&gt; is a powerful command-line tool designed to simplify the process of creating new apps. Users can quickly search for tech stacks using keywords, which makes this tool highly flexible and customizable. One of the unique features of &lt;strong&gt;create-blank-app&lt;/strong&gt; is its support for generative AI. With just one command, you can leverage the power of AI to kick-start your project.&lt;/p&gt;

&lt;p&gt;To install &lt;strong&gt;create-blank-app&lt;/strong&gt;, assume you already have NodeJS installed, just run: &lt;code&gt;$ npm install create-blank-app -g&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Supported Tech Stacks
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;create-blank-app&lt;/strong&gt; supports a wide range of popular tech stacks:&lt;/p&gt;

&lt;p&gt;Frontend Frameworks: Vite, bun, create-react-app (CRA), create-next-app (CNA), create-nuxt-app, angular, create-web3js-app (CWA), and create-react-native-app (Expo)&lt;br&gt;
Backend Framework: Express-generator-typescript&lt;br&gt;
Mobile: React-native init&lt;br&gt;
Bundler: Vite (vue, react, preact, lit-element, svelte app)&lt;/p&gt;

&lt;h3&gt;
  
  
  Using ChatGPT with create-blank-app (optional)
&lt;/h3&gt;

&lt;p&gt;In addition to these tech stacks, create-blank-app also supports ChatGPT to generate a new app using a prompt file. This feature turbocharges the app creation process by allowing you to leverage the power of AI.&lt;/p&gt;

&lt;p&gt;Steps to generate a New Project using ChatGPT:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Set OpenAI api key like &lt;code&gt;$ export OPENAI_API_KEY=&amp;lt;yourkey&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Create an empty directory, inside, write your prompt in the &lt;strong&gt;"prompt" file&lt;/strong&gt; (or "prompt.gpt4" for gpt-4 model).&lt;/li&gt;
&lt;li&gt;Outside that directory, run: &lt;code&gt;$ cba &amp;lt;name&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Wrapping Up
&lt;/h3&gt;

&lt;p&gt;Embrace the future of coding with &lt;strong&gt;create-blank-app&lt;/strong&gt;, setting up a new project with your desired tech stack is just a command away. The support for ChatGPT adds another layer of convenience, not only does it save you time and effort, but with AI-driven code generation, it also opens new possibilities. Give it a try, contribute on GitHub, or share your feedback to help improve this tool.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Github: &lt;a href="https://github.com/ngduc/create-blank-app"&gt;https://github.com/ngduc/create-blank-app&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>boilerplate</category>
      <category>webdev</category>
      <category>programming</category>
      <category>ai</category>
    </item>
    <item>
      <title>Generate New Project Code Using "create-blank-app" command and ChatGPT</title>
      <dc:creator>Duc Ng</dc:creator>
      <pubDate>Wed, 13 Sep 2023 21:09:46 +0000</pubDate>
      <link>https://dev.to/ngduc/generate-new-project-code-using-create-blank-app-command-and-chatgpt-1a2m</link>
      <guid>https://dev.to/ngduc/generate-new-project-code-using-create-blank-app-command-and-chatgpt-1a2m</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TiC4-Nai--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://i.imgur.com/pAkj3k9.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TiC4-Nai--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://i.imgur.com/pAkj3k9.gif" width="800" height="461"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Setting up a new project can be a tedious task, especially when you're dealing with multiple tech stacks. Wouldn't it be great if we could automate this process with a single command? That's where &lt;strong&gt;create-blank-app&lt;/strong&gt; comes into play.&lt;/p&gt;

&lt;p&gt;With the advent of AI technologies in the programming world, developers are now finding more efficient ways to create project codes. One of the latest techniques involves using OpenAI's ChatGPT to generate new project code. This method simplifies and accelerates the process of initializing projects with various tech stacks. In this blog post, I will introduce a tool named &lt;strong&gt;create-blank-app&lt;/strong&gt; (or &lt;strong&gt;cba&lt;/strong&gt; for short), which leverages this cutting-edge technique.&lt;/p&gt;

&lt;h3&gt;
  
  
  Simplify Your Project Initialization with 'create-blank-app'
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;create-blank-app&lt;/strong&gt; is a powerful command-line tool designed to simplify the process of creating new apps. Users can search for tech stacks using keywords, which makes this tool highly flexible and customizable. One of the unique features of create-blank-app is its support for generative AI. With just one command, you can leverage the power of AI to kick-start your project.&lt;/p&gt;

&lt;p&gt;To install &lt;strong&gt;create-blank-app&lt;/strong&gt;, assume you already have NodeJS installed, just run: &lt;code&gt;$ npm install create-blank-app -g&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Supported Tech Stacks
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;create-blank-app&lt;/strong&gt; supports a wide range of popular tech stacks:&lt;/p&gt;

&lt;p&gt;Frontend Frameworks: Vite, bun, create-react-app (CRA), create-next-app (CNA), create-nuxt-app, angular, create-web3js-app (CWA), and create-react-native-app (Expo)&lt;br&gt;
Backend Framework: Express-generator-typescript&lt;br&gt;
Mobile: React-native init&lt;br&gt;
Bundler: Vite (vue, react, preact, lit-element, svelte app)&lt;/p&gt;

&lt;h3&gt;
  
  
  Using ChatGPT with create-blank-app
&lt;/h3&gt;

&lt;p&gt;In addition to these tech stacks, create-blank-app also supports ChatGPT to generate a new app using a prompt file. This feature turbocharges the app creation process by allowing you to leverage the power of AI.&lt;/p&gt;

&lt;p&gt;Steps to generate a New Project using ChatGPT:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Set OpenAI api key like &lt;code&gt;$ export OPENAI_API_KEY=&amp;lt;yourkey&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Create an empty directory, inside, write your prompt in the &lt;strong&gt;"prompt" file&lt;/strong&gt; (or "prompt.gpt4" for gpt-4 model).&lt;/li&gt;
&lt;li&gt;Outside that directory, run: &lt;code&gt;$ cba &amp;lt;name&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Wrapping Up
&lt;/h3&gt;

&lt;p&gt;Embrace the future of coding with 'create-blank-app', setting up a new project with your desired tech stack is just a command away. The support for ChatGPT adds another layer of convenience, not only does it save you time and effort, but with AI-driven code generation, it also opens new possibilities. Give it a try, contribute on GitHub, or share your feedback to help improve this tool.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Github: &lt;a href="https://github.com/ngduc/create-blank-app"&gt;https://github.com/ngduc/create-blank-app&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>boilerplate</category>
      <category>programming</category>
      <category>ai</category>
      <category>chatgpt</category>
    </item>
    <item>
      <title>Try React 18 with Vite, Typescript and Vercel</title>
      <dc:creator>Duc Ng</dc:creator>
      <pubDate>Thu, 17 Jun 2021 00:45:00 +0000</pubDate>
      <link>https://dev.to/ngduc/try-react-18-with-vite-typescript-and-vercel-okg</link>
      <guid>https://dev.to/ngduc/try-react-18-with-vite-typescript-and-vercel-okg</guid>
      <description>&lt;h3&gt;
  
  
  What's New In React 18?
&lt;/h3&gt;

&lt;p&gt;Please visit &lt;a href="https://nnote.io/s/x4od5/react-18-with-vite-and-vercel" rel="noopener noreferrer"&gt;https://nnote.io/s/x4od5/react-18-with-vite-and-vercel&lt;/a&gt; for the latest updates for this article.&lt;/p&gt;

&lt;p&gt;The new version of React - React 18 alpha has just come out. From ReactJS.org:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;There are no significant out-of-the-box breaking changes to component behavior. You can upgrade to React 18 with minimal or no changes to your application code, with a level of effort comparable to a typical major React release"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;New Improvements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React.lazy - new streaming server renderer support.&lt;/li&gt;
&lt;li&gt;Automatic batching.&lt;/li&gt;
&lt;li&gt;New APIs (like startTransition).&lt;/li&gt;
&lt;li&gt;Article: What’s coming in React 18 - &lt;a href="https://reactjs.org/blog/2021/06/08/the-plan-for-react-18.html" rel="noopener noreferrer"&gt;https://reactjs.org/blog/2021/06/08/the-plan-for-react-18.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This tutorial will demonstrate a step-by-step guide to create your project using React 18 alpha, Typescript, Vite and deploy it to Vercel (freemium).&lt;/p&gt;

&lt;h3&gt;
  
  
  Create a Vite project
&lt;/h3&gt;

&lt;p&gt;Required tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;NodeJS&lt;/li&gt;
&lt;li&gt;Yarn (npm install yarn -g)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Run this command to create your new project:&lt;br&gt;
(Vite is a code generator similar to CRA but it takes &amp;lt; 1s to launch dev mode versus &amp;gt; 45s using CRA)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn create @vitejs/app my-project --template react-ts
cd my-project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install the latest React 18 alpha version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn add react@alpha react-dom@alpha
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As &lt;code&gt;@types/react&lt;/code&gt; doesn't understand the new React 18's APIs or types yet, we need to update "tsconfig.json" file: after &lt;code&gt;"jsx": "react"&lt;/code&gt; add:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"types": ["react/next", "react-dom/next"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then run the new project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn dev

vite v2.3.7 dev server running at:
  &amp;gt; Local: http://localhost:3000/
  &amp;gt; Network: use `--host` to expose
  ready in 174ms.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And that's it! We have React 18 up and running with Typescript! Ready to rock.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2FbzcHGj2%2Fimage.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2FbzcHGj2%2Fimage.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Deploy to Vercel
&lt;/h3&gt;

&lt;p&gt;First, we need to build this project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then deploy the build (dist) directory to Vercel:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd dist
npx vercel .

...
✅  Deployed to: https://react-18-ts-vite-app.vercel.app [copied to clipboard] [11s]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, visit the link &lt;a href="https://react-18-ts-vite-app.vercel.app" rel="noopener noreferrer"&gt;https://react-18-ts-vite-app.vercel.app&lt;/a&gt;, we should have the app up and running there:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2FyV7s6WM%2Fimage.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2FyV7s6WM%2Fimage.png"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Github repository &lt;a href="https://github.com/ngduc/react-18-ts-vite-app" rel="noopener noreferrer"&gt;https://github.com/ngduc/react-18-ts-vite-app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Please visit &lt;a href="https://nnote.io/s/x4od5/react-18-with-vite-and-vercel" rel="noopener noreferrer"&gt;https://nnote.io/s/x4od5/react-18-with-vite-and-vercel&lt;/a&gt; for the latest updates for this article.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>react</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Introduction to Web3 and MetaMask</title>
      <dc:creator>Duc Ng</dc:creator>
      <pubDate>Wed, 19 May 2021 18:15:15 +0000</pubDate>
      <link>https://dev.to/ngduc/introduction-to-web3-and-metamask-562h</link>
      <guid>https://dev.to/ngduc/introduction-to-web3-and-metamask-562h</guid>
      <description>&lt;h1&gt;
  
  
  Web3 - Javascript - Resources
&lt;/h1&gt;

&lt;p&gt;Web3.js is a collection of libraries that allow you to interact with a local or remote ethereum node using HTTP, IPC or WebSocket.&lt;/p&gt;

&lt;p&gt;MetaMask is a browser plugin that serves as an Ethereum wallet. Users can store Ether and other ERC-20 tokens in the MetaMask wallet. The wallet can also be used to interact with decentralized applications, or dapps.&lt;/p&gt;

&lt;p&gt;This page is a collection of resources, tutorials, guides, articles, etc. for learning Web3 with Javascript.&lt;/p&gt;

&lt;p&gt;Last update: 05/21/2021 - Bookmark and come back to this page for more updates later.&lt;/p&gt;

&lt;p&gt;__&lt;/p&gt;

&lt;h3&gt;
  
  
  Tools / Requirements:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;NodeJs&lt;/li&gt;
&lt;li&gt;MetaMask (chrome extension) - connect to your test wallets.&lt;/li&gt;
&lt;li&gt;Golang - to run some geth commands.&lt;/li&gt;
&lt;li&gt;Ganache - local block chain for dev.&lt;/li&gt;
&lt;li&gt;VSCode and extensions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  Setups:
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Setting up Local block chain using Ganache and MetaMask

&lt;ul&gt;
&lt;li&gt;article: &lt;a href="https://docs.moralis.io/guides/setting-up-ganache"&gt;https://docs.moralis.io/guides/setting-up-ganache&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;


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

&lt;p&gt;__&lt;/p&gt;

&lt;h3&gt;
  
  
  Articles
&lt;/h3&gt;

&lt;p&gt;Intro to Web3.js · Ethereum Blockchain Developer Crash Course&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;article: &lt;a href="https://www.dappuniversity.com/articles/web3-js-intro"&gt;https://www.dappuniversity.com/articles/web3-js-intro&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;How to send transactions with Web3 and Node.JS?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;using web3, @truffle/hdwallet-provider, send transaction&lt;/li&gt;
&lt;li&gt;article: &lt;a href="https://morioh.com/p/d3ef8b16c770"&gt;https://morioh.com/p/d3ef8b16c770&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;How to Connect Web3.js to MetaMask in 2021&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;using window.ethereum.send('eth_requestAccounts')&lt;/li&gt;
&lt;li&gt;medium: &lt;a href="https://medium.com/valist/how-to-connect-web3-js-to-metamask-in-2020-fee2b2edf58a"&gt;https://medium.com/valist/how-to-connect-web3-js-to-metamask-in-2020-fee2b2edf58a&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hooks and components to use Moralis in a React app&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;using react-moralis, useMoralis hook&lt;/li&gt;
&lt;li&gt;build A Simple Dap in 3 Mins - &lt;a href="https://docs.moralis.io/guides/build-a-simple-dap-in-3-mins-login-part-2"&gt;https://docs.moralis.io/guides/build-a-simple-dap-in-3-mins-login-part-2&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;github repo: &lt;a href="https://github.com/MoralisWeb3/react-moralis"&gt;https://github.com/MoralisWeb3/react-moralis&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;__&lt;/p&gt;

&lt;h3&gt;
  
  
  Tutorial Videos
&lt;/h3&gt;

&lt;p&gt;How to connect smartContract to UI with Metamask(web3 tutorial)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;web3.js - web js - metamask - getAccount eth_requestAccounts - test with BNB token - send Eth button - eth_sendTransaction from/to account&lt;/li&gt;
&lt;li&gt;youtube: &lt;a href="https://www.youtube.com/watch?v=NseL8v9EH_Q"&gt;https://www.youtube.com/watch?v=NseL8v9EH_Q&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;How to send transactions with Web3 and NodeJS? (Backend Blockchain Development)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;web3.js - nodejs - test nest rinkeby - eth smart contract - sendTransaction&lt;/li&gt;
&lt;li&gt;youtube: &lt;a href="https://www.youtube.com/watch?v=n9QLsSagUzE&amp;amp;t=423s"&gt;https://www.youtube.com/watch?v=n9QLsSagUzE&amp;amp;t=423s&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;For latest updates, please follow and bookmark this page:&lt;br&gt;
&lt;a href="https://nnote.cc/s/zeiu8/web3-javascript-resources"&gt;https://nnote.cc/s/zeiu8/web3-javascript-resources&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>node</category>
      <category>react</category>
    </item>
    <item>
      <title>Benchmark your computers with real-world Web Development Tools</title>
      <dc:creator>Duc Ng</dc:creator>
      <pubDate>Thu, 31 Dec 2020 20:31:08 +0000</pubDate>
      <link>https://dev.to/ngduc/benchmark-your-computers-for-real-world-web-development-tools-27o3</link>
      <guid>https://dev.to/ngduc/benchmark-your-computers-for-real-world-web-development-tools-27o3</guid>
      <description>&lt;p&gt;Recently I realized that I own multiple computers for web development. I wanted to know which one can run my Web Dev Tools faster and more efficiently. So, I created this simple script to benchmark them by running my regular tools like CRA, express generator etc. and measure the time.&lt;/p&gt;

&lt;p&gt;Usually, we assume that a newer, more expensive computers should be faster than an old one. That is true but how much faster? We will need some numbers to prove that. And nothing is better than the performance results from real-world development tools.&lt;/p&gt;

&lt;h3&gt;
  
  
  How does it work?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The run.sh script will temporarily generate a CRA webapp (benchmark1) and an Express NodeJS app (benchmark2).&lt;/li&gt;
&lt;li&gt;Then it will run the usual npm commands like npm run build, npm run test, and measure the time (in seconds).&lt;/li&gt;
&lt;li&gt;Results will be added to this README.md file. (run git status to see the changes)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Usage
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Node JS v15+&lt;/li&gt;
&lt;li&gt;This has been tested with Ubuntu, Debian, MacOS, Windows (with Cygwin).
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Clone and Run:
git clone https://github.com/ngduc/dev-benchmark.git
cd dev-benchmark
sh run.sh "Brand Model - OS - CPU - RAM - HDD"

- Run sh run.sh twice to get more accurate results. (due to caching)
Results
After running the script (run it twice for accurate results), the benchmark results (in seconds) will be added to this README.md file.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result will look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;### HP 17z-ca300 - Ubuntu - AMD Ryzen 5 4500U - 16 GB DDR4-2666 SDRAM - SSD
#### CRA
- create 36.71
- npm run build 8.71
- npm run test 3.08
#### express
- create 18.55
- npm run build 3.90
- npm run test 4.82
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can create Pull Requests to add results of your computer performance to share with fellow developers.&lt;/p&gt;

&lt;p&gt;Any ideas, feedbacks, suggestions are welcome. Thanks.&lt;/p&gt;

&lt;p&gt;Github Repository: &lt;a href="https://github.com/ngduc/dev-benchmark"&gt;https://github.com/ngduc/dev-benchmark&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>tool</category>
      <category>benchmark</category>
    </item>
    <item>
      <title>Create and deploy an Express NodeJS with UI using Vercel (Free)</title>
      <dc:creator>Duc Ng</dc:creator>
      <pubDate>Sat, 07 Nov 2020 07:48:36 +0000</pubDate>
      <link>https://dev.to/ngduc/create-and-deploy-an-express-nodejs-app-using-vercel-free-1gnn</link>
      <guid>https://dev.to/ngduc/create-and-deploy-an-express-nodejs-app-using-vercel-free-1gnn</guid>
      <description>&lt;p&gt;&lt;em&gt;Disclosure:&lt;/em&gt; I have no affiliation or investment in any company mentioned in this post. This is just my experience.&lt;/p&gt;

&lt;p&gt;I assumed you have some experience with NodeJS, ExpressJS and signed up with Vercel.&lt;/p&gt;

&lt;p&gt;Vercel (zeit) has been working fine for me for a while. The problem is there are different ways on the internet to set it up and most of them doesn't work for me anymore, maybe due to changes from Vercel. But I'm glad this setup works now.&lt;/p&gt;

&lt;p&gt;In this article, I just want to share my experience and github repository which you can use it to create your own Express NodeJS App and deploy it to Vercel.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Github repository link:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/ngduc/vercel-express"&gt;https://github.com/ngduc/vercel-express&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Set up &amp;amp; Deploy with Vercel
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ npm install vercel -g
$ npm install
$ vercel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Vercel will generate ".vercel" directory, don't share or commit this one.&lt;/li&gt;
&lt;li&gt;After deploying, open your URL like this:

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://YOUR-VERCEL-APP-ID.vercel.app"&gt;http://YOUR-VERCEL-APP-ID.vercel.app&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Example: &lt;a href="https://vercel-express-3.ngduc.vercel.app"&gt;https://vercel-express-3.ngduc.vercel.app&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;


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

&lt;h3&gt;
  
  
  app/index.js
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;If you're using Typescript, build your source directory, output to "app"&lt;/li&gt;
&lt;li&gt;Update package.json: "main": "app/index.js"&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  vercel.json
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Map API routes (/api/...) and static (UI) routes (/...).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now you have a full-stack web application deployed to the Internet using Vercel! Happy coding!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Links:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This official article describes more in details about Vercel and Express - &lt;a href="https://vercel.com/guides/using-express-with-vercel"&gt;https://vercel.com/guides/using-express-with-vercel&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Github Repo - &lt;a href="https://github.com/ngduc/vercel-express"&gt;https://github.com/ngduc/vercel-express&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>node</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Hello world v2</title>
      <dc:creator>Duc Ng</dc:creator>
      <pubDate>Sun, 20 Sep 2020 20:31:40 +0000</pubDate>
      <link>https://dev.to/ngduc/hello-world-v2-14b7</link>
      <guid>https://dev.to/ngduc/hello-world-v2-14b7</guid>
      <description>&lt;p&gt;We know that "Hello world" is the simplest code example to demonstrate how to output a simple message in a programming language.&lt;/p&gt;

&lt;p&gt;This "version 2" aims to cover more basic syntax.&lt;/p&gt;

&lt;p&gt;It is a One-Page Code Example of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;String handling, length, spliting, template string.&lt;/li&gt;
&lt;li&gt;Characters, char codes handling.&lt;/li&gt;
&lt;li&gt;Array, array items accessing, looping.&lt;/li&gt;
&lt;li&gt;Number, casting, basic math calculation.&lt;/li&gt;
&lt;li&gt;Function, returning a value.&lt;/li&gt;
&lt;li&gt;JSON, parsing.&lt;/li&gt;
&lt;li&gt;From: &lt;a href="http://b.link/hello-world-v2"&gt;http://b.link/hello-world-v2&lt;/a&gt; (please keep this link)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  In different Programming Languages
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://syntax.wiki/python3"&gt;Python 3.7+&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://b.link/hello-world-v2-python3"&gt;Live example&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Javascript - &lt;a href="https://syntax.wiki"&gt;In Progress&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Typescript - &lt;a href="https://syntax.wiki"&gt;In Progress&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(Please &lt;a href="https://github.com/ngduc/syntax.codes"&gt;open a PR&lt;/a&gt; to add for other languages here)&lt;/p&gt;

&lt;h2&gt;
  
  
  Github link
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/ngduc/syntax.codes/blob/master/docs/articles/hello-world-v2.mdx"&gt;https://github.com/ngduc/syntax.codes/blob/master/docs/articles/hello-world-v2.mdx&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Please comment with any idea or feedback. Thanks.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>python</category>
      <category>tutorial</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Compare React Component Libraries in September 2020</title>
      <dc:creator>Duc Ng</dc:creator>
      <pubDate>Wed, 09 Sep 2020 21:47:29 +0000</pubDate>
      <link>https://dev.to/ngduc/compare-react-component-libraries-in-september-2020-3clk</link>
      <guid>https://dev.to/ngduc/compare-react-component-libraries-in-september-2020-3clk</guid>
      <description>&lt;h1&gt;
  
  
  Compare React Component Libraries in September 2020
&lt;/h1&gt;

&lt;p&gt;Recently, I need to evaluate many React Component Libraries so I tried them all, compared and took some notes about them in a table format. Hope you find it useful.&lt;/p&gt;

&lt;p&gt;Please note that I didn't intend to cover all libraries, only the ones with latest techs like Typescript, latest changes, etc.&lt;/p&gt;

&lt;h2&gt;
  
  
  Features
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Chakra UI&lt;/th&gt;
&lt;th&gt;Reakit&lt;/th&gt;
&lt;th&gt;Semantic UI React&lt;/th&gt;
&lt;th&gt;Material UI&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Links&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/chakra-ui/chakra-ui"&gt;Github&lt;/a&gt; - &lt;a href="https://next.chakra-ui.com/docs/getting-started"&gt;Demo&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/reakit/reakit"&gt;Github&lt;/a&gt; - &lt;a href="https://reakit.io/docs/get-started/"&gt;Link&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/Semantic-Org/Semantic-UI-React"&gt;Github&lt;/a&gt; - &lt;a href="https://react.semantic-ui.com/"&gt;Demo&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/mui-org/material-ui"&gt;Github&lt;/a&gt; - &lt;a href="https://medium.com/material-ui"&gt;Blog&lt;/a&gt; - &lt;a href="https://material-ui.com/components/box/"&gt;Demo&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Status&lt;/td&gt;
&lt;td&gt;9k ★ since 06-2019&lt;/td&gt;
&lt;td&gt;4.2k ★ since 01-2018&lt;/td&gt;
&lt;td&gt;11.5k ★ since 10-2016&lt;/td&gt;
&lt;td&gt;61k ★ since 08-2014&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Components&lt;/td&gt;
&lt;td&gt;~52&lt;/td&gt;
&lt;td&gt;~22&lt;/td&gt;
&lt;td&gt;~52&lt;/td&gt;
&lt;td&gt;~55&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Size&lt;/td&gt;
&lt;td&gt;100 KB gz&lt;/td&gt;
&lt;td&gt;20 KB gz&lt;/td&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;td&gt;404 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tree shaking&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typescript source&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;JS with d.ts&lt;/td&gt;
&lt;td&gt;JS with d.ts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WAI-ARIA&lt;/td&gt;
&lt;td&gt;✔ 1.1&lt;/td&gt;
&lt;td&gt;✔ 1.1&lt;/td&gt;
&lt;td&gt;Yes, partial&lt;/td&gt;
&lt;td&gt;Yes, partial&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Styles&lt;/td&gt;
&lt;td&gt;Style props&lt;/td&gt;
&lt;td&gt;React&lt;/td&gt;
&lt;td&gt;LESS&lt;/td&gt;
&lt;td&gt;JSS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Themes&lt;/td&gt;
&lt;td&gt;styleConfig({...}), CSS-in-JS&lt;/td&gt;
&lt;td&gt;Yes, reakit-system-bootstrap&lt;/td&gt;
&lt;td&gt;LESS vars&lt;/td&gt;
&lt;td&gt;"classes" prop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dark Theme&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Layout&lt;/td&gt;
&lt;td&gt;Grid, Flex, Box&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;Container, Grid&lt;/td&gt;
&lt;td&gt;Box, Container, Grid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Icons&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Popover&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;✔ Popper&lt;/td&gt;
&lt;td&gt;✔ Popper&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Table&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Form
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Chakra&lt;/th&gt;
&lt;th&gt;Reakit&lt;/th&gt;
&lt;th&gt;Semantic UI React&lt;/th&gt;
&lt;th&gt;Material UI&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Form&lt;/td&gt;
&lt;td&gt;uses Formik&lt;/td&gt;
&lt;td&gt;reakit/Form&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;✔ Formik works&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Validation&lt;/td&gt;
&lt;td&gt;Field validate prop&lt;/td&gt;
&lt;td&gt;useFormState onValidate&lt;/td&gt;
&lt;td&gt;react-hook-form&lt;/td&gt;
&lt;td&gt;Formik validate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Field error style&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;Yes, error prop&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Modal
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Chakra&lt;/th&gt;
&lt;th&gt;Reakit&lt;/th&gt;
&lt;th&gt;Semantic UI React&lt;/th&gt;
&lt;th&gt;Material UI&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Syntax&lt;/td&gt;
&lt;td&gt;Modal isOpen onClose&lt;/td&gt;
&lt;td&gt;DialogBackdrop, Dialog&lt;/td&gt;
&lt;td&gt;Modal open, Modal.Content&lt;/td&gt;
&lt;td&gt;Modal, Dialog&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Animating&lt;/td&gt;
&lt;td&gt;✔ CSS?&lt;/td&gt;
&lt;td&gt;✔ CSS&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nested&lt;/td&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Mobile Browser
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Chakra&lt;/th&gt;
&lt;th&gt;Reakit&lt;/th&gt;
&lt;th&gt;Semantic UI React&lt;/th&gt;
&lt;th&gt;Material UI&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Touch / Tap&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Smooth animation&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Accordion&lt;/td&gt;
&lt;td&gt;Works&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;Works&lt;/td&gt;
&lt;td&gt;Works&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Drawer / Sidebar&lt;/td&gt;
&lt;td&gt;Works&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;Works&lt;/td&gt;
&lt;td&gt;Works&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modal&lt;/td&gt;
&lt;td&gt;Works&lt;/td&gt;
&lt;td&gt;Works, body shifted&lt;/td&gt;
&lt;td&gt;Works, partially cut off&lt;/td&gt;
&lt;td&gt;Works&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modal scroll&lt;/td&gt;
&lt;td&gt;Works&lt;/td&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;td&gt;Works, partially cut off&lt;/td&gt;
&lt;td&gt;Works&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Popover&lt;/td&gt;
&lt;td&gt;Works&lt;/td&gt;
&lt;td&gt;Works&lt;/td&gt;
&lt;td&gt;Works&lt;/td&gt;
&lt;td&gt;Works&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Table&lt;/td&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;td&gt;Works&lt;/td&gt;
&lt;td&gt;Works&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tooltip&lt;/td&gt;
&lt;td&gt;Works&lt;/td&gt;
&lt;td&gt;Works&lt;/td&gt;
&lt;td&gt;Works&lt;/td&gt;
&lt;td&gt;Works&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Chakra&lt;/th&gt;
&lt;th&gt;Reakit&lt;/th&gt;
&lt;th&gt;Semantic UI React&lt;/th&gt;
&lt;th&gt;Material UI&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Strengths&lt;/td&gt;
&lt;td&gt;+ Many components&lt;/td&gt;
&lt;td&gt;+ Small size&lt;/td&gt;
&lt;td&gt;+ Many components&lt;/td&gt;
&lt;td&gt;+ Many components&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;+ Style props (inspired by Tailwinds)&lt;/td&gt;
&lt;td&gt;+ Lower level components&lt;/td&gt;
&lt;td&gt;+ Layouts&lt;/td&gt;
&lt;td&gt;+ Works well on mobile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;+ Layouts&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;+ Layout&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need improvements&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Need more components, layouts&lt;/td&gt;
&lt;td&gt;Better demos for mobile&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;Obviously not every library can be evaluated and added, but I also evaluated other libraries: Carbon (IBM), Rebass, Atlaskit, Fluent UI (Fabric, Microsoft), Lucid UI, Grommet, Spectrum, PatternFly, etc. They may get into this list later.&lt;/p&gt;

&lt;p&gt;For the latest updates, please visit &lt;a href="https://nnote.cc/s/0wihj/compare-react-component-libraries-in-september-2020"&gt;nnote.cc/s/0wihj&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>component</category>
      <category>library</category>
    </item>
    <item>
      <title>Compare React Component Libraries in August 2020</title>
      <dc:creator>Duc Ng</dc:creator>
      <pubDate>Thu, 06 Aug 2020 03:10:25 +0000</pubDate>
      <link>https://dev.to/ngduc/compare-react-component-libraries-in-august-2020-5969</link>
      <guid>https://dev.to/ngduc/compare-react-component-libraries-in-august-2020-5969</guid>
      <description>&lt;p&gt;Recently, I need to evaluate many React Component Libraries so I tried them all, compared and took some notes about them in a table format. Hope you find it useful.&lt;/p&gt;

&lt;p&gt;Please note that I didn't intend to cover all libraries, only the ones with latest techs like Typescript, latest changes, etc.&lt;/p&gt;

&lt;h2&gt;
  
  
  Features
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt; &lt;/th&gt;
&lt;th&gt;Chakra UI&lt;/th&gt;
&lt;th&gt;Reakit&lt;/th&gt;
&lt;th&gt;Semantic UI React&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Links&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/chakra-ui/chakra-ui"&gt;Github&lt;/a&gt; - &lt;a href="https://next.chakra-ui.com/docs/getting-started"&gt;Demo&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/reakit/reakit"&gt;Github&lt;/a&gt; - &lt;a href="https://reakit.io/docs/get-started/"&gt;Link&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/Semantic-Org/Semantic-UI-React"&gt;Github&lt;/a&gt; - &lt;a href="https://react.semantic-ui.com/"&gt;Demo&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Status&lt;/td&gt;
&lt;td&gt;9k stars&lt;/td&gt;
&lt;td&gt;4.2k stars&lt;/td&gt;
&lt;td&gt;11.5k stars&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Size&lt;/td&gt;
&lt;td&gt;100 KB gz&lt;/td&gt;
&lt;td&gt;20 KB gz&lt;/td&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typescript source&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;JS with d.ts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tree shaking&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WAI-ARIA&lt;/td&gt;
&lt;td&gt;✔ 1.1&lt;/td&gt;
&lt;td&gt;✔ 1.1&lt;/td&gt;
&lt;td&gt;Yes, partial&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Styles&lt;/td&gt;
&lt;td&gt;Style props&lt;/td&gt;
&lt;td&gt;React&lt;/td&gt;
&lt;td&gt;LESS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Themes&lt;/td&gt;
&lt;td&gt;styleConfig({...}), CSS-in-JS&lt;/td&gt;
&lt;td&gt;Yes, reakit-system-bootstrap&lt;/td&gt;
&lt;td&gt;LESS vars&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dark Theme&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Layout&lt;/td&gt;
&lt;td&gt;Grid, Flex, Box&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;Container, Grid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Icons&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Table&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Popover&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;✔ Popper&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Smart popover&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Table&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Form
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt; &lt;/th&gt;
&lt;th&gt;Chakra&lt;/th&gt;
&lt;th&gt;Reakit&lt;/th&gt;
&lt;th&gt;Semantic UI React&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Form&lt;/td&gt;
&lt;td&gt;uses Formik&lt;/td&gt;
&lt;td&gt;Custom reakit/Form&lt;/td&gt;
&lt;td&gt;Custom&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Validation&lt;/td&gt;
&lt;td&gt;Field validate prop&lt;/td&gt;
&lt;td&gt;useFormState onValidate&lt;/td&gt;
&lt;td&gt;react-hook-form&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Field error style&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;Yes, error prop&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Modal
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt; &lt;/th&gt;
&lt;th&gt;Chakra&lt;/th&gt;
&lt;th&gt;Reakit&lt;/th&gt;
&lt;th&gt;Semantic UI React&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Syntax&lt;/td&gt;
&lt;td&gt;Modal isOpen onClose&lt;/td&gt;
&lt;td&gt;DialogBackdrop, Dialog&lt;/td&gt;
&lt;td&gt;Modal open, Modal.Content&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Animating&lt;/td&gt;
&lt;td&gt;✔ CSS?&lt;/td&gt;
&lt;td&gt;✔ CSS&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nested&lt;/td&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Mobile Browser
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt; &lt;/th&gt;
&lt;th&gt;Chakra&lt;/th&gt;
&lt;th&gt;Reakit&lt;/th&gt;
&lt;th&gt;Semantic UI React&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Touch / Tap&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Smooth animation&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Accordion&lt;/td&gt;
&lt;td&gt;Works&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;Works&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Drawer / Sidebar&lt;/td&gt;
&lt;td&gt;Works&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;Works&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modal&lt;/td&gt;
&lt;td&gt;Works&lt;/td&gt;
&lt;td&gt;Works, body shifted&lt;/td&gt;
&lt;td&gt;Works, partially cut off&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modal scroll&lt;/td&gt;
&lt;td&gt;Works&lt;/td&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;td&gt;Works, partially cut off&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Popover&lt;/td&gt;
&lt;td&gt;Works&lt;/td&gt;
&lt;td&gt;Works&lt;/td&gt;
&lt;td&gt;Works&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Table&lt;/td&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;td&gt;Works&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tooltip&lt;/td&gt;
&lt;td&gt;Works&lt;/td&gt;
&lt;td&gt;Works&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt; &lt;/th&gt;
&lt;th&gt;Chakra&lt;/th&gt;
&lt;th&gt;Reakit&lt;/th&gt;
&lt;th&gt;Semantic UI React&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Strengths&lt;/td&gt;
&lt;td&gt;+ Many components&lt;/td&gt;
&lt;td&gt;+ Small size&lt;/td&gt;
&lt;td&gt;+ Many components&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;+ Style props (inspired by Tailwinds)&lt;/td&gt;
&lt;td&gt;+ Lower level components&lt;/td&gt;
&lt;td&gt;+ Layouts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;+ Layouts&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need improvements&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Need more components, layouts&lt;/td&gt;
&lt;td&gt;Better demos for mobile&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;I also evaluated other libraries: Rebass, Material UI, Atlaskit, Fluent, Spectrum, PatternFly, etc. They may get into this list later.&lt;/p&gt;

&lt;p&gt;Found a mistake? - Please feel free to &lt;a href="https://github.com/ngduc/syntax.codes/issues"&gt;create a ticket&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Want to suggest a UI Component Library? - If it's comparable with the above projects, please feel free to &lt;a href="https://github.com/ngduc/syntax.codes/issues"&gt;create a ticket&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For the latest updates, please visit &lt;a href="https://syntax.wiki/articles/react-component-library-comparison"&gt;syntax.wiki/articles/react-component-library-comparison&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>component</category>
      <category>library</category>
    </item>
    <item>
      <title>How to add Authentication to your React app using AuthUI</title>
      <dc:creator>Duc Ng</dc:creator>
      <pubDate>Sat, 27 Jun 2020 23:44:40 +0000</pubDate>
      <link>https://dev.to/ngduc/how-to-add-authentication-to-your-react-app-3c9c</link>
      <guid>https://dev.to/ngduc/how-to-add-authentication-to-your-react-app-3c9c</guid>
      <description>&lt;p&gt;When starting a new project, it takes some effort to implement Login / Sign-up screens. We often have to repeat the same implementation again and again.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Authentication should be simple to remove friction to build an MVP (Most Viable Product) or get users started.&lt;/li&gt;
&lt;li&gt;Authentication logic should be reused to save development time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are a few online services that let you integrate your application with their Authentication APIs. But it doesn't really save much time when we have to go through long documentation to understand it, then spend more time learning and integrating.&lt;/p&gt;

&lt;p&gt;An Authentication Service should be simple to integrate with. Below is an example:&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1 - Import and use Login Component
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;$&lt;/span&gt; &lt;span class="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;install&lt;/span&gt; &lt;span class="nx"&gt;authui&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;ui&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;LoginBox&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;authui-ui/dist/js/components/LoginBox/LoginBox&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;LoginBox&lt;/span&gt; &lt;span class="nx"&gt;accountId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;MyProductName&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;afterSubmit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;afterSubmitHandler&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://github.com/authui/authui"&gt;LoginBox source code&lt;/a&gt; can also be customized and used directly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2 - Handle response
&lt;/h3&gt;

&lt;p&gt;After user submitted the form (Sign up or Log in), the "afterSubmit" callback function will be called. Here you can handle the response (full User object) by redirecting user to the home page, dashboard, etc.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;afterSubmitHandler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;jwtData&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;jwtData&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;jwtData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;jwtData: &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;jwtData&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;jwtData&lt;/code&gt; is the user object which has properties like: user uuid, accessToken, email, name, picUrl, etc. which can be used in the app (or store in localStorage).&lt;/p&gt;

&lt;p&gt;That's it! There is no Step 3. In the next article, I will write more about how it works. In the meantime, there is more information in the links below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/authui/authui"&gt;AuthUI Repo&lt;/a&gt; - both UI and APIs are open source.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codesandbox.io/s/authui-example-8jswg?module=/src/LoginBox/LoginBox.tsx"&gt;Live Example&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are a maker or have a project that needs Authentication, give it a try. Please feel free to reach out (via Github) if you need help to integrate with it!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dEXSN1fs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://raw.githack.com/authui/authui/master/docs/authui-demo.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dEXSN1fs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://raw.githack.com/authui/authui/master/docs/authui-demo.gif" width="799" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>react</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to create an UI app using latest Rails + React + Typescript + Jest - June, 2020.</title>
      <dc:creator>Duc Ng</dc:creator>
      <pubDate>Sat, 06 Jun 2020 02:44:13 +0000</pubDate>
      <link>https://dev.to/ngduc/how-to-create-an-ui-app-using-rails-react-typescript-jest-4hm0</link>
      <guid>https://dev.to/ngduc/how-to-create-an-ui-app-using-rails-react-typescript-jest-4hm0</guid>
      <description>&lt;p&gt;This article will show you how to create an UI app using Rails + React + Typescript + Jest with the latest versions.&lt;/p&gt;

&lt;p&gt;First, make sure you have these requirements installed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ruby 2.7.0p0&lt;/li&gt;
&lt;li&gt;gem 3.1.2&lt;/li&gt;
&lt;li&gt;rails 6.0.3.1&lt;/li&gt;
&lt;li&gt;node 13.x&lt;/li&gt;
&lt;li&gt;yarn 1.22.0&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Create your Rails application with React support:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ rails new myapp --webpack=react
$ cd myapp

Add Typescript:
$ bundle exec rails webpacker:install:typescript
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add &lt;code&gt;eslint&lt;/code&gt; which is a linting program to check for syntax errors in your typescript code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ yarn add eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin eslint-config-preact @types/webpack-env eslint-plugin-react -D
$ yarn add babel-plugin-transform-react-jsx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add ".eslintrc" - a config file of eslint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;module.exports&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;root:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;parser:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'@typescript-eslint/parser'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;plugins:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;'@typescript-eslint'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;extends:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;'eslint:recommended'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;'plugin:react/recommended'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;'plugin:@typescript-eslint/eslint-recommended'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;'plugin:@typescript-eslint/recommended'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;settings:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;react:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="err"&gt;version:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'detect'&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;&lt;span class="w"&gt;

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

&lt;/div&gt;



&lt;p&gt;Now we have the base rails app with React &amp;amp; Typescript support. Next, create your first Rails Controller:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ rails generate controller hello

Open "app/controllers/hello_controller.rb", update it:

class HelloController &amp;lt; ApplicationController
  def home
  end
end

Open "config/routes.rb", update it to point root URL to the new controller:

Rails.application.routes.draw do
  root to: 'hello#home'
end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We also need a "View" file to render the page:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Open "app/views/hello/home.html.erb", add:

&amp;lt;%= javascript_pack_tag 'hello_typescript' %&amp;gt;
&amp;lt;h1&amp;gt;Hello world!&amp;lt;/h1&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, you can create your first React component in Typescript: "app/javascript/packs/hello_typescript.tsx" (source link at the bottom)&lt;/p&gt;

&lt;p&gt;It's time to add Jest so you can write some jest tests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ yarn add jest ts-jest @types/jest @testing-library/react @testing-library/jest-dom -D
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In "&lt;a href="https://github.com/ngduc/rails-react-typescript-jest/blob/master/package.json"&gt;package.json&lt;/a&gt;", add "jest" section point to "setupTests.ts" file to configure jest. Also add "script" section so we can run &lt;code&gt;$ yarn lint&lt;/code&gt; and &lt;code&gt;$yarn test&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"scripts": {
  "lint": "eslint app/javascript/**/*.ts[x]",
  "test": "jest"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Write your first test "hello.spec.tsx"&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;render&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@testing-library/react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@testing-library/jest-dom/extend-expect&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Hello&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./hello_typescript&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello test&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;container&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Hello&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Jest"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;toHaveTextContent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello Jest!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;That's it! Now you can enjoy your Rails app with the latest support from React, Typescript and Jest! It's time to run your app:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ rails s --binding=127.0.0.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I will write another article to show how to create and use a Rails API endpoint from a React component.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Source code: &lt;a href="https://github.com/ngduc/rails-react-typescript-jest"&gt;https://github.com/ngduc/rails-react-typescript-jest&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>typescript</category>
      <category>rails</category>
    </item>
  </channel>
</rss>
