<?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: Jonnie Oak</title>
    <description>The latest articles on DEV Community by Jonnie Oak (@oakj).</description>
    <link>https://dev.to/oakj</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%2F568552%2F95e17d89-b64c-4852-a783-2645b7b15139.png</url>
      <title>DEV Community: Jonnie Oak</title>
      <link>https://dev.to/oakj</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/oakj"/>
    <language>en</language>
    <item>
      <title>Introducing Abstract — A React Prototyping Tool, Designed for Mobile.</title>
      <dc:creator>Jonnie Oak</dc:creator>
      <pubDate>Thu, 07 Oct 2021 15:56:06 +0000</pubDate>
      <link>https://dev.to/oakj/introducing-abstract-a-react-prototyping-tool-designed-for-mobile-dba</link>
      <guid>https://dev.to/oakj/introducing-abstract-a-react-prototyping-tool-designed-for-mobile-dba</guid>
      <description>&lt;p&gt;Enter &lt;strong&gt;Abstract&lt;/strong&gt; — a mobile-first progressive web application focused on improving the developer experience. Create mobile first application prototypes in real-time with proven UI frameworks such as React Bootstrap. &lt;/p&gt;

&lt;p&gt;Abstract allows you to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Develop from anywhere&lt;/li&gt;
&lt;li&gt;Lighten developer workload when prototyping&lt;/li&gt;
&lt;li&gt;Focus on more complex engineering issues&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  The world is moving towards mobile
&lt;/h3&gt;

&lt;p&gt;When analyzing market trends, we find that mobile usage on the web has gradually increased every year, while desktop usage is slowly declining by the year. Mobile devices are taking over modern-day web browsing, likely due to the increasing accessibility of smartphones. Nowadays creating an application only optimized for desktop devices will greatly hinder your application from being viewed by a large majority of users.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mobile-first philosophy
&lt;/h3&gt;

&lt;p&gt;“Mobile first”, simply means that we start product design with mobile users in mind because of their limitations.&lt;br&gt;
From a technical standpoint, when engineering a product, mobile is your limiting factor due to size, bandwidth, and hardware constraints. A mobile oriented design can scale to a desktop size and maintain full functionality, but a desktop design can’t scale down to mobile without removing and editing some features.&lt;br&gt;
Mobile first design approach allows for progressive advancement, which means you start designing for your most basic platform and then optimize for more advanced platforms later down the road.&lt;br&gt;
For developers this is a very efficient and lean strategy to build a product from scratch because they can push out a minimum viable product with core features while still reaching a majority of users.&lt;/p&gt;

&lt;h3&gt;
  
  
  There’s a demand for mobile developer tools
&lt;/h3&gt;

&lt;p&gt;QuickEdit — 35,000 ratings on Google App Store&lt;br&gt;
Dcoder — 32,000 ratings on Google App Store&lt;br&gt;
DroidEdit — 17,000 ratings on Google App Store&lt;br&gt;
These are a few of the many developer tools on the mobile app store; however, they are strictly mobile code editors. &lt;em&gt;The market currently lacks mobile prototyping tools for mobile-first development.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Abstract adopts mobile-first design and streamlines prototyping
&lt;/h3&gt;

&lt;p&gt;Our main priority is ease-of-use. With this in mind, we designed a simple interface targeted towards mobile users for easy navigation. We want developers to be able to work from anywhere, anytime, on any device. Elevating the developer experience with accessibility to useful tools streamlines the design stage during the product lifecycle and shortens turnaround time between product iterations.&lt;br&gt;
Here are some of Abstract’s core features:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install on any device to prototype at home or on the go.&lt;/li&gt;
&lt;li&gt;Design for iPad and iPhone resolutions to accommodate more users.&lt;/li&gt;
&lt;li&gt;Utilize React Bootstrap components, avoiding early design bottlenecks in premature product stages.&lt;/li&gt;
&lt;li&gt;Preview generated React code synchronized with the prototype render view.&lt;/li&gt;
&lt;li&gt;Quickly export React code to GitHub for easy code review and collaboration.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Abstract away from the tedious process of coding a prototype from scratch with our simplified, design based workflow that leverages hot reloading and code preview.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Select Device Resolution for the Canvas
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AeHD9kWp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/oslabs-beta/Abstract/blob/jonnie/readme-assets/switch-canvas.GIF%3Fraw%3Dtrue" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AeHD9kWp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/oslabs-beta/Abstract/blob/jonnie/readme-assets/switch-canvas.GIF%3Fraw%3Dtrue" alt="canvas-size-gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Render Components on the Canvas
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6UWlqTQg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/oslabs-beta/Abstract/blob/jonnie/readme-assets/render-components.GIF%3Fraw%3Dtrue" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6UWlqTQg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/oslabs-beta/Abstract/blob/jonnie/readme-assets/render-components.GIF%3Fraw%3Dtrue" alt="render-components-gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Review Code
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RbFJAU7Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/oslabs-beta/Abstract/blob/jonnie/readme-assets/review-code.GIF%3Fraw%3Dtrue" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RbFJAU7Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/oslabs-beta/Abstract/blob/jonnie/readme-assets/review-code.GIF%3Fraw%3Dtrue" alt="review-code-gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Export Code
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nzkJEwoo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/oslabs-beta/Abstract/blob/jonnie/readme-assets/export-code.GIF%3Fraw%3Dtrue" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nzkJEwoo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/oslabs-beta/Abstract/blob/jonnie/readme-assets/export-code.GIF%3Fraw%3Dtrue" alt="export-code-gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We hope you enjoy Abstract as much as we enjoyed creating it. Stay tuned for future updates!&lt;/p&gt;

&lt;h3&gt;
  
  
  Additional Resources
&lt;/h3&gt;

&lt;p&gt;Abstract is an open-sourced product. Interested in contributing or viewing?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/oslabs-beta/Abstract"&gt;Visit our Github project page.&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.abstractreact.net/"&gt;Visit Abstract’s website.&lt;/a&gt;&lt;br&gt;
&lt;a href="https://abstractreact.herokuapp.com/"&gt;Visit the live Abstract web-app.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Meet the Team! —&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Jonnie Oak &lt;a href="https://github.com/oakj"&gt;@Github&lt;/a&gt; &lt;a href="https://www.linkedin.com/in/oakj28/"&gt;@Linkedin&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Brian Cheng &lt;a href="https://github.com/chengbrian9"&gt;@Github&lt;/a&gt; &lt;a href="https://www.linkedin.com/in/brian-cheng24/"&gt;@Linkedin&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Raymond Hu &lt;a href="https://github.com/rhu0"&gt;@Github&lt;/a&gt; &lt;a href="https://www.linkedin.com/in/raymond-hu-3b18231a2/"&gt;@Linkedin&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Omar Brown &lt;a href="https://github.com/rashadhndrxx"&gt;@Github&lt;/a&gt; &lt;a href="https://www.linkedin.com/in/omar-b-76892521b/"&gt;@Linkedin&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>react</category>
      <category>opensource</category>
    </item>
    <item>
      <title>How to fetch an external API with useEffect()</title>
      <dc:creator>Jonnie Oak</dc:creator>
      <pubDate>Wed, 03 Mar 2021 07:54:09 +0000</pubDate>
      <link>https://dev.to/oakj/how-to-fetch-an-external-api-with-useeffect-2b4e</link>
      <guid>https://dev.to/oakj/how-to-fetch-an-external-api-with-useeffect-2b4e</guid>
      <description>&lt;p&gt;I just had a day full of headaches while trying to debug code while browsing StackOverflow, Reddit and Discord channels...&lt;/p&gt;

&lt;p&gt;This post is for my future self but also for anyone who's having issues making external API calls in React. Specifically using fetch inside of useEffect.&lt;/p&gt;

&lt;p&gt;TLDR: This is how you do it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    const fetchWeather = async (url) =&amp;gt; {
        const response = await fetch(url)
        const json = await response.json()
        setForecast({ data:json, loading:false })
    }

    useEffect(() =&amp;gt; {
        if (search !== '') {
            fetchWeather(url)
        }
    }, [search])
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this post I will be going over the following topics.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Why useEffect for fetching an api?&lt;/li&gt;
&lt;li&gt;What's with the if statement inside the useEffect?&lt;/li&gt;
&lt;li&gt;What's happening inside fetchWeather?&lt;/li&gt;
&lt;li&gt;Why async/await?&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;em&gt;Why useEffect for fetching an api?&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;useEffect is the functional version of ComponentDidMount, ComponentDidUpdate and ComponentWillUnmount&lt;/li&gt;
&lt;li&gt;When making an API call, typically you don't want to make a call to the API with every render. In the example above, useEffect will invoke the callback (first argument) ONLY WHEN an item inside the array of dependencies (second argument) is changed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;What's with the if statement inside the useEffect?&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Without the if statement, useEffect will always run in the initial render&lt;/li&gt;
&lt;li&gt;This was an issue in my code because the initial value for search (a dependency for the url) is ''. This results in a failed API call because there is a missing query to the API.&lt;/li&gt;
&lt;li&gt;Skipping the initial render allows the user to input a query to the API which then re-renders the app with the API data.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;What's happening inside fetchWeather?&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;fetchWeather takes a url as an argument&lt;/li&gt;
&lt;li&gt;It then uses fetch to make an http request with the url&lt;/li&gt;
&lt;li&gt;Next line parses the http response into json&lt;/li&gt;
&lt;li&gt;setForecast updates the forecast state with the new data and also sets loading to false so that the data can be rendered&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Why async await?&lt;/em&gt;&lt;br&gt;
Fetch is promise based so you have to "await" for the promise to be resolved before moving on to the next line of code. E.g. you can't parse the response to json until the response is resolved. Another option is to use .then() and .catch() syntax to perform actions after a promise is resolved.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>react</category>
    </item>
    <item>
      <title>My (almost) self-taught journey to code</title>
      <dc:creator>Jonnie Oak</dc:creator>
      <pubDate>Thu, 28 Jan 2021 07:21:28 +0000</pubDate>
      <link>https://dev.to/oakj/my-almost-self-taught-journey-to-code-114a</link>
      <guid>https://dev.to/oakj/my-almost-self-taught-journey-to-code-114a</guid>
      <description>&lt;h4&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;/h4&gt;

&lt;p&gt;I wasn't happy at my job. In September of 2020, I decided that I needed to make a change. After 5 years of working as an electrical engineer I bit the bullet and left my job to pursue coding. This is my journey. I hope that my journey can be used as a guide for anyone that wants to take on a similar path. It's never too late to learn how to code! &lt;/p&gt;

&lt;p&gt;In the past 4.5 months, I have learned so much. It makes me so happy to share this experience with the world. It also acts as a reminder for how far I've come and to not be too hard on myself when I feel like I'm not progressing fast enough. I hope people will find this useful. If it is - feel free to come a long on the journey by giving a follow!&lt;/p&gt;

&lt;h4&gt;&lt;strong&gt;September 2020&lt;/strong&gt;&lt;/h4&gt;

&lt;p&gt;9/8/20:&lt;br&gt;
I start my Python class and my SQL class at Bunker Hill Community College.&lt;/p&gt;

&lt;p&gt;I learned a lot from these classes but it's definitely not required. Actually, I recommend new coders to AVOID taking classes (unless it's low cost). Make sure to check back in for a future blog post where I go into detail on my experience and when structured classes are worth it!&lt;/p&gt;

&lt;p&gt;9/18/20:&lt;br&gt;
I start a Udemy course. The Complete Web Developer in 2020: Zero to Mastery by Andrei Neagoie. I highly recommend this course for any beginner interested in the world of web development. This course goes over everything: how the web works, HTML, CSS, JavaScript, React, databases, http requests and more. It also talks about coding environments. At this point I start using VSCode. To this day VSCode is still my favorite code editor.&lt;/p&gt;

&lt;p&gt;I'll go into detail on my experience and if this course is right for you in a future blog post.&lt;/p&gt;

&lt;h4&gt;&lt;strong&gt;October 2020&lt;/strong&gt;&lt;/h4&gt;

&lt;p&gt;10/5/20 - 10/9/20:&lt;br&gt;
I participate in live webinars for Springboards conference "RISE". Springboard is a coding boot camp and RISE is their annual conference that discusses the software engineering and data science industries. At this point I was still trying to see if a boot camp was right for me. &lt;/p&gt;

&lt;h4&gt;&lt;strong&gt;November 2020&lt;/strong&gt;&lt;/h4&gt;

&lt;p&gt;11/6/20-11/8/20:&lt;br&gt;
I participate in Liquid Hacks. This is my first "test" to see what I have learned. I tried building a website called "a team liquid story". Honestly it was supposed to be extremely simple. I fail at completing the project by the deadline and I end up not submitting. Even though I wasn't able to complete a project. I don't regret participating. It showed me how much I still didn't know.&lt;/p&gt;

&lt;p&gt;11/30/20:&lt;br&gt;
Back to The Complete Web Developer by Andrei Neagoie. At this point I did every exercise up to the React section. I felt like I needed to focus on the fundamentals. I "finished" the course by watching the rest of the videos. Finishing the course without completing the exercises helped me learn broad pictures of what other tools are used and how they are used. It gave me a good idea of what to expect in the future so that I wouldn't be completely lost.&lt;/p&gt;

&lt;p&gt;I start grinding FreeCodeCamp - Javascript Algorithms and Data Structures Certification.&lt;/p&gt;

&lt;h4&gt;&lt;strong&gt;December 2020&lt;/strong&gt;&lt;/h4&gt;

&lt;p&gt;12/1/20:&lt;br&gt;
I complete my semester project for my Python class. A program that takes a summoner name from the game League of Legends and outputs the user's match history and charts the frequency of each champion played. The program is coded in Python using Jupyter notebook.&lt;/p&gt;

&lt;p&gt;12/16/20:&lt;br&gt;
I finish FreeCodeCamp - Javascript Algorithms and Data Structures Certification&lt;/p&gt;

&lt;p&gt;12/16/20 - 12/24/20:&lt;br&gt;
I start learning React by working through the tutorial in the official docs. I can't find quality material on how to learn React until 12/28/20.&lt;/p&gt;

&lt;p&gt;12/18/20&lt;br&gt;
My Python and SQL classes end&lt;/p&gt;

&lt;p&gt;12/28/20 - 1/20/21:&lt;br&gt;
I start going through Pure React by Dave Ceddia. This was easily one of my best coding investments. I highly recommend this book for anyone that knows HTML/CSS/JavaScript and wants to jump into React. React is a framework that has many many many tools. It can be very overwhelming to figure out where to start. Pure React is a book that teaches... well.... pure React. All of the extra tools can be learned later.&lt;/p&gt;

&lt;h4&gt;&lt;strong&gt;January 2021&lt;/strong&gt;&lt;/h4&gt;

&lt;p&gt;1/20/21 - 1/22/21:&lt;br&gt;
I finish going through Pure React. At this point I feel comfortable and I decide that I am ready to build a web app from "scratch". Scratch is in quotes because I actually decide to build a Discord clone in React. I decide to build a Discord clone because building an actual app from scratch would involve designing UI/UX which is not the current goal. I want to test my developer knowledge.&lt;/p&gt;

&lt;p&gt;I start off by prototyping the frontend.&lt;/p&gt;

&lt;p&gt;1/22/21-1/26/21:&lt;br&gt;
Frontend prototype is complete. I start thinking about the backend. After some research, I end up going with Firebase. I have some familiarity with databases from my SQL class and The Complete Web Developer course but Firestore is a noSQL database so there is a a bit of a learning curve. I end up buying Fireship's course Firestore Data Modeling Master Course. This course is perfect for someone that has some database knowledge because it's short and sweet. It covers everything you need to know quickly. It shouldn't be used as your first course in databases.&lt;/p&gt;

&lt;p&gt;I have some familiarity from fetching data from my Python project where I fetched data from Riot Games API. I build my first feature that combines both frontend and backend: a side bar that fetches real time data and outputs the community name and avatar links as a list.&lt;/p&gt;

&lt;p&gt;1/27/21:&lt;br&gt;
This brings me to dev community and my first post. I've learned a lot... enough to where I felt like I needed to share my experience.&lt;/p&gt;

&lt;h4&gt;&lt;strong&gt;updates coming...&lt;/strong&gt;&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Money spent so far&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Worth it&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The Complete Web Developer by Andrei Neagoie&lt;/td&gt;
&lt;td&gt;$13.99&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pure React by Dave Ceddia&lt;/td&gt;
&lt;td&gt;$59.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fireship's Firestore Data Modeling Course&lt;/td&gt;
&lt;td&gt;$19.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total:&lt;/td&gt;
&lt;td&gt;$91.99&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Not worth it&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Python at Bunker Hill Community College&lt;/td&gt;
&lt;td&gt;$1248.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SQL at Bunker Hill Community College&lt;/td&gt;
&lt;td&gt;$1248.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total:&lt;/td&gt;
&lt;td&gt;$2496.00&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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