<?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:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Dev with DeVontae]]></title><description><![CDATA[I talk about React, AWS, Node, and Software IQ]]></description><link>https://devwithdevontae.substack.com</link><image><url>https://substackcdn.com/image/fetch/$s_!HtUb!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4400689f-210c-4a9f-bc88-ea77852073e0_256x256.png</url><title>Dev with DeVontae</title><link>https://devwithdevontae.substack.com</link></image><generator>Substack</generator><lastBuildDate>Sun, 24 May 2026 17:19:05 GMT</lastBuildDate><atom:link href="https://devwithdevontae.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[DeVontae Moore]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[devwithdevontae@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[devwithdevontae@substack.com]]></itunes:email><itunes:name><![CDATA[DeVontae Moore]]></itunes:name></itunes:owner><itunes:author><![CDATA[DeVontae Moore]]></itunes:author><googleplay:owner><![CDATA[devwithdevontae@substack.com]]></googleplay:owner><googleplay:email><![CDATA[devwithdevontae@substack.com]]></googleplay:email><googleplay:author><![CDATA[DeVontae Moore]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Chapter 1- Finding Good Clients]]></title><description><![CDATA[Free snippet to my e-book: The Software Developer&#8217;s Guide to Freelancing]]></description><link>https://devwithdevontae.substack.com/p/chapter-1-finding-good-clients</link><guid isPermaLink="false">https://devwithdevontae.substack.com/p/chapter-1-finding-good-clients</guid><dc:creator><![CDATA[DeVontae Moore]]></dc:creator><pubDate>Fri, 17 Apr 2026 17:13:55 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!2LnP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b19e18d-2748-4cdd-98cb-38205b6fc9f5_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2LnP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b19e18d-2748-4cdd-98cb-38205b6fc9f5_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2LnP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b19e18d-2748-4cdd-98cb-38205b6fc9f5_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!2LnP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b19e18d-2748-4cdd-98cb-38205b6fc9f5_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!2LnP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b19e18d-2748-4cdd-98cb-38205b6fc9f5_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!2LnP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b19e18d-2748-4cdd-98cb-38205b6fc9f5_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2LnP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b19e18d-2748-4cdd-98cb-38205b6fc9f5_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7b19e18d-2748-4cdd-98cb-38205b6fc9f5_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3904745,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://devwithdevontae.substack.com/i/194536465?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b19e18d-2748-4cdd-98cb-38205b6fc9f5_1536x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!2LnP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b19e18d-2748-4cdd-98cb-38205b6fc9f5_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!2LnP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b19e18d-2748-4cdd-98cb-38205b6fc9f5_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!2LnP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b19e18d-2748-4cdd-98cb-38205b6fc9f5_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!2LnP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b19e18d-2748-4cdd-98cb-38205b6fc9f5_1536x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>Announcements</strong></p><p>I know its been a while. Between fulfilling client obligations and meeting deadlines, its been hard to stay on the content marketing treadmill. But I&#8217;m back and by the grace of God, I will continue to stay on the content engine for the foreseeable future. With that being said, my current plan is to start a <a href="https://www.skool.com/">skool</a> community where I will pour most (if not all) of my paid content inside. The goal is to have <em>paid subscribers</em> who will have access to courses and products I create (think Netflix but for education). I also want this community to be a place for accountability. For example, a lot people know they should go to networking events but probably don&#8217;t! To start, I will start posting sections from an e-book I&#8217;m currently working on called <em><strong>The Software Developer&#8217;s Guide to Freelancing</strong></em>. This guide will have strategies and tactics for managing clients, communicating to clients and vetting clients as a Freelance Software Developer. So without further ado, here&#8217;s chapter one of the e-book.</p><h3>Chapter 1- Finding Good Clients</h3><p>Chapter one is not about pricing. It&#8217;s not about proposals. It&#8217;s not about contracts. It&#8217;s about discovery. And <em>not technical</em> discovery. It&#8217;s about discovering the client. Before you ever write a line of code, you need to understand <em><strong>who you are building for</strong></em>. The wrong client will waste your time, never pay you, scam you out of personal data, and have unreasonable expectations. The right client will respect you, take communication seriously, and pay you on time. The following sections will give you insight on what too look for in a good client and how to look for it in the wild!</p><p><strong>What to look for in clients</strong></p><p>In this section, I&#8217;m going to walk you through how I filter clients not based on theory, but patterns I&#8217;ve observed while working with real clients. Over time, I realized my best clients shared common traits. These were not random. They were patterns. Here were the patterns I noticed:</p><p><strong>1. Easy to communicate with</strong></p><p>One of the first serious clients I landed through LinkedIn was with a company called <strong><a href="https://www.linkedin.com/company/ghost-creativ/posts/?feedView=all">Ghost Creativ</a></strong><a href="https://www.linkedin.com/company/ghost-creativ/posts/?feedView=all">.</a> Ownership may have changed since then, but at the time they brought me in for a <strong>React and CSS project</strong>. As I recall this experience, what stands out is how professional and straightforward the interaction was.The owner reached out and asked simple, direct questions about my experience. Nothing complicated. Just clarity.</p><p>One of the first messages he sent was:</p><p>&#8220;Hi DeVontae! We have a short-term project that needs an expert front-end React developer (lots of CSS required). Are you open to a short-term project that may lead to more long-term work?&#8221;</p><p>We eventually continued the conversation and he told me he was about to meet with his lead developer and would follow up after their meeting. That was another positive signal. He wasn&#8217;t making decisions in isolation. There was an actual team involved. About thirty minutes later he messaged me again and asked if I was available for a Zoom call. The call included both him and his lead developer.</p><p>This interaction revealed a few things immediately:</p><ul><li><p>They had an existing technical team</p></li><li><p>They valued their developer&#8217;s opinion</p></li><li><p>They wanted to evaluate candidates collaboratively</p></li></ul><p>After the call, I eventually started work with the possibility of more contract work or  employment depending on how things went and whether they landed additional contracts.</p><p>He explained his goal clearly:</p><p>&#8220;My goal as the owner is to not have to do any development by the end of quarter three. If you can fill the development role that I&#8217;ve been filling, that would be fantastic.&#8221;</p><p>He was honest about the situation, honest about expectations, and honest about what success looked like. Looking back, the interaction checked many boxes that I now recognize as signs of a healthy client relationship.</p><p><strong>2. They Were Willing to Show Their Face</strong></p><p>Another healthy pattern of good clients was being &#8220;physically transparent&#8221;. If someone refuses to get on camera during meetings or discovery calls, that&#8217;s a red flag in my opinion. Some deals may include thousands to hundreds of thousands of dollars. And not being able to &#8220;see&#8221; who you&#8217;re doing business with goes against most cultural norms. Perhaps A.I. will change this. But I truly believe one of the differences between most scam artist and legit clients is physical visibility. When someone is &#8220;physically&#8221; transparent with the whole process, its a green flag on the journey to finding your ideal client. My best clients were comfortable hopping on Zoom, showing their face, and speaking openly about their business. Below are a couple reasons why being physical visible is important in the client vetting process.</p><p><strong>It builds trust</strong></p><p>I don&#8217;t remember every detail of the convo with Ghost Creative but I remember how I felt. I felt comfortable. Why? Maybe because the owner was a fellow Christian who shared the same faith as me? I believe that could of played a role. But I think I felt comfortable because there was a process. They explained what would happen next. I would meet with the lead developer. I went through onboarding. There was structure. There was a system. And I wasn&#8217;t just talking to a name on the internet. I was talking to real people. Seeing their faces mattered more than I realized at the time. It felt real. There&#8217;s something psychologically grounding about seeing someone speak about their business. You can hear conviction in their voice. You can see whether they&#8217;re prepared. You can observe whether they take the interaction seriously. Contrast that with another experience I had.</p><p>Someone once reached out to me about a job opportunity. We scheduled a call. The camera never came on. Everything felt off. Maybe it wasn&#8217;t a scam. But the unwillingness to show their face created doubt and didn&#8217;t pursue the role.</p><p><strong>It confirms identity</strong>.</p><p>Freelancing today isn&#8217;t what it was ten years ago. AI avatars exist. Stolen branding exists. Fake domains exist. Seeing someone live forces alignment between:</p><ul><li><p>Their LinkedIn presence</p></li><li><p>Their company website</p></li><li><p>Their online content</p></li></ul><p>It doesn&#8217;t eliminate risk. But it reduces anonymity. And reduced anonymity increases accountability. It shows seriousness. You are entering a business relationship. Transparency should go both ways. And that transparency sets the tone for everything that follows.</p><p><strong>3. They Were Flexible With Payments (Without Asking for Sensitive Info)</strong></p><p>My best clients were flexible. At the time of this writing I&#8217;m working with a client on an app that collects data for Superintendents. She was willing to send a check, use Venmo, Cash app and Zelle. We had issues with Zelle so we agreed upon Venmo. This is the type of flexibility you want. In this new A.I. era it doesn&#8217;t make sense to give strangers access to personal accounts. I personally wouldn&#8217;t give personal access to checking accounts unless I was doing work as a contractor for a legit company or going through a recruiting agency were giving that info is standard procedure. If someone makes sensitive payment info required early in talks and/or complicated or invasive, that&#8217;s not friction, it&#8217;s a warning that you might be working a with a difficult client at best and a scammer at worst.</p><p>Serious clients don&#8217;t ask for:</p><ul><li><p>Your bank login right away</p></li><li><p>Personal identification documents unrelated to contract work right away</p></li><li><p>Weird payment structures</p></li><li><p>&#8220;Trial work&#8221; without payment</p></li></ul><p><strong>4. They Were Friendly</strong></p><p>This one seems small. It isn&#8217;t. If someone is rigid, dismissive, or aggressive before you even start working, that behavior will most likely multiply once money is involved.</p><p>Good clients:</p><ul><li><p>Respect your time</p></li><li><p>Ask thoughtful questions</p></li><li><p>Listen</p></li><li><p>Collaborate</p></li></ul><p>Freelancing is a partnership, not servitude. You don&#8217;t work <em>for</em> them! You work <em>with</em> them as a technical partner. Remember, you&#8217;re not an employee. You&#8217;re a business owner. So own your work, own your decisions, and own your mental health by avoiding clients who are difficult to get along with.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://devwithdevontae.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Dev with DeVontae! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><p><strong>5. They Were Willing to Teach and Were Patient</strong></p><p>Some of my best clients didn&#8217;t just hire me. They taught me. Before I worked at <a href="https://northbuilt.com/">North Built </a>as a full time React developer, I worked with them as a freelancer. And during that time, I went through a PR review with their senior engineers and learned one of my first lessons as a junior: <strong>Don&#8217;t push console logs into production</strong>. I learned many things along the way from them and other clients. A client who is willing to invest time into helping you understand their world is probably invested in your long term success and not just quick results.</p><p><strong>6. They Were U.S.-Based (For My Situation)</strong></p><p>For me personally, U.S.based clients simplified:</p><ul><li><p>Time zones</p></li><li><p>Contracts</p></li><li><p>Payment systems</p></li></ul><p>I also preferred to have U.S. based clients to avoid the friction that sometimes comes from different cultures. For example language! If the clients second language is English, it could be extremely difficult to get in alignment with their needs and problems if I don&#8217;t understand them and they don&#8217;t understand me. This was a decision I made and one you will need to make for yourself.</p><p><strong>Where I Found My Best Clients</strong></p><p>Now that you know what to look for in a client, you&#8217;re probably wondering: </p><p><strong>&#8220;How do I actually vet these types of clients?&#8221;</strong></p><p><strong>LinkedIn</strong></p><p>One of the best ways to vet a client is to go to a source (or multiple sources) where they have to be visible to be taken serious. LinkedIn has been my go to source since I started freelancing and doing contract work in 2021. I use LinkedIn as my primary sourcing platform for one main reason: Visibility!</p><p>On LinkedIn, serious business owners have to invest time, energy and/or money to gain visibility and to build authority. They post updates. They maintain company pages. They interact with others publicly. That visibility matters. Why? Because visibility takes time!</p><p>A scammer probably won&#8217;t build a fully professional presence and build an audience base with 10k connections when they can create a quick half baked page to quickly scam someone out of their funds. A bad client who lacks patient will probably forsake a digital footprint. But a serious operator? They leave trails. And the next section will discuss these &#8220;trails&#8221;.</p><p>LinkedIn makes it easy to vet someone before you ever hop on a call. Here a few details too look for:</p><p><strong>Does the client have an online reputation?</strong></p><p>Remember the patterns I mentioned earlier and how I said my best clients were easy to get along with? One way to vet this friendliness is to see how they interact with other people in the comment sections. Are their responses coarse and in your face? Or are they reasonable and gentle even when responding to harsh comments. They don&#8217;t have to be a push over but they shouldn&#8217;t be a jerk neither.</p><p><strong>Do they market their services?</strong></p><p>Remember I said showing your face is a green flag because it means the client is transparent. You can vet how transparent a client is on LinkedIn by looking through their post. Do you see a lot videos of them marketing their brand and services. Videos with client testimonials? Or links to Youtube videos where they are visibly recognized. If so, this a strong indicator the client is legit.</p><p><strong>What part of the world do they do business in?</strong></p><p>Remember how I said, I filter clients to U.S. based only! You can vet this on LinkedIn by looking at a users profile. It will display their vocational activities and business activities according to were they reside or have resided.</p><p>The platform itself creates friction. It requires effort to build a brand and be taken serious on LinkedIn. That filters out a lot of noise automatically. And the main benefit that stems from this friction is professional transparency. And in freelancing, transparency equals knowledge about <em><strong>who you are building for</strong></em> .</p><p><strong>Note</strong></p><p>Could you find clients on other platforms? Yes. Could a scammer with a lot of patience and wit still hustle someone out of their money on LinkedIn? Yes! There will always be inherit risk. But the goal is to reduce said risk as much as possible while placing safe guards up (i.e. not giving access to personal accounts) in the event you encounter a scammer or unreasonable client. </p><h4>I need your feedback</h4><p>What questions do you want answered as someone thinking about freelancing/contracting?</p><p>What did you like about the article?</p><p>What are your goals?</p><p>Leave a comment with these answers or connect with on <a href="https://www.linkedin.com/in/devontaemoore-react-developer/">LinkedIn</a> and/or <a href="https://x.com/DevwithDeVontae">X</a></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://devwithdevontae.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://devwithdevontae.substack.com/subscribe?"><span>Subscribe now</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[Surviving as an Agency developer]]></title><description><![CDATA[hint: I rely on basic Software principles]]></description><link>https://devwithdevontae.substack.com/p/surviving-as-an-agency-developer</link><guid isPermaLink="false">https://devwithdevontae.substack.com/p/surviving-as-an-agency-developer</guid><dc:creator><![CDATA[DeVontae Moore]]></dc:creator><pubDate>Tue, 09 Sep 2025 12:02:59 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!vjrx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdae5eabf-cd42-42fe-89ff-6b8115879981_1280x960.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vjrx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdae5eabf-cd42-42fe-89ff-6b8115879981_1280x960.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vjrx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdae5eabf-cd42-42fe-89ff-6b8115879981_1280x960.jpeg 424w, https://substackcdn.com/image/fetch/$s_!vjrx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdae5eabf-cd42-42fe-89ff-6b8115879981_1280x960.jpeg 848w, https://substackcdn.com/image/fetch/$s_!vjrx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdae5eabf-cd42-42fe-89ff-6b8115879981_1280x960.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!vjrx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdae5eabf-cd42-42fe-89ff-6b8115879981_1280x960.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vjrx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdae5eabf-cd42-42fe-89ff-6b8115879981_1280x960.jpeg" width="1280" height="960" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dae5eabf-cd42-42fe-89ff-6b8115879981_1280x960.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:960,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:192133,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://devwithdevontae.substack.com/i/172667009?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdae5eabf-cd42-42fe-89ff-6b8115879981_1280x960.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!vjrx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdae5eabf-cd42-42fe-89ff-6b8115879981_1280x960.jpeg 424w, https://substackcdn.com/image/fetch/$s_!vjrx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdae5eabf-cd42-42fe-89ff-6b8115879981_1280x960.jpeg 848w, https://substackcdn.com/image/fetch/$s_!vjrx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdae5eabf-cd42-42fe-89ff-6b8115879981_1280x960.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!vjrx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdae5eabf-cd42-42fe-89ff-6b8115879981_1280x960.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>I&#8217;ve spent most of my career as an &#8220;Agency&#8221; developer. In the agency world, developers tend to be multi client facing positions. These roles require soft skills and context switching into new frameworks and languages. In this article I share how I&#8217;ve survived these roles by learning and applying the basics of Software Engineering and roadblocks along the way.</p><h3>D.R.Y. To the Rescue: From React to Angular</h3><p>In a agency environment, its not uncommon to be in a Vue codebase one day and switch to React the next. This happened to me with a client who needed help with their Angular application. My expertise was in React, and I knew nothing about Angular. Yet, thanks to the fundamentals I'd learned from senior engineers (and help from chatGPT), I was able to navigate the project with confidence.</p><p>The feature I needed to build entailed a new payment processing system. After some discovery and tinkering, I recognized the code I was using would need to be in multiple places across the app. As a junior developer, I probably would had copied and pasted the code making the codebase a nightmare to maintain. But I had learned a key fundamental principle: <strong><a href="https://www.geeksforgeeks.org/software-engineering/dont-repeat-yourselfdry-in-software-development/">Don't Repeat Yourself</a></strong><a href="https://www.geeksforgeeks.org/software-engineering/dont-repeat-yourselfdry-in-software-development/"> </a>(DRY) from senior engineers. This principle guided me to look for a better solution, even in an unfamiliar framework. After some research, I discovered <strong><a href="https://angular.dev/tutorials/first-app/09-services">Angular services</a></strong>, which are perfect for sharing business logic and data across an application. By applying the fundamental principle of DRY, I was able to find the right tool for the job in Angular, creating a more maintainable and efficient codebase.</p><div><hr></div><h3>From Node to Laravel: Navigating the Backend</h3><p>My client's project wasn't just in Angular; the backend was built with <strong><a href="https://laravel.com/">Laravel</a></strong>, a PHP framework. My experience was with Node.js and Express.js. So I was again stepping into unfamiliar territory. However, my understanding of back-end fundamentals helped bridge the gap. For example, I noticed the way Laravel handles routes is similar to how Express.js does it. For example, both frameworks use a similar pattern of mapping HTTP methods (like get, post, etc.) to specific controller functions. I was also able to quickly understand how the codebase was structured, with separations between business logic, validation, and services. </p><h3>When Lack of Fundamentals hurt: My Angular Roadblocks</h3><p>While my foundational knowledge of Software principles has helped me with various clients, I&#8217;ve learned you still need knowledge specific to a tool. For instance, when I working with the angular client, I was dealing with a skills issue with <strong><a href="https://blog.angular-university.io/rxjs-switchmap-operator/">RxJS operators like switchMap</a></strong>. I was able to work through this by the grace of God and a lot of grit but it was a struggle. If I had known Angular basics like reusable templates and the core concepts of RxJS, I could have solved problems much faster. This experience taught me that while foundational software principles are crucial, a working knowledge of a framework's fundamentals is what really unlocks efficient problem-solving. But no worries, I was able to meet my deadline despite the obstacles with the help of tools like ChatGPT and online resources.</p><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://devwithdevontae.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://devwithdevontae.substack.com/subscribe?"><span>Subscribe now</span></a></p><h3></h3>]]></content:encoded></item><item><title><![CDATA[AWS vs Supabase vs Firebase]]></title><description><![CDATA[Battle of the backends]]></description><link>https://devwithdevontae.substack.com/p/aws-vs-supabase-vs-firebase</link><guid isPermaLink="false">https://devwithdevontae.substack.com/p/aws-vs-supabase-vs-firebase</guid><dc:creator><![CDATA[DeVontae Moore]]></dc:creator><pubDate>Tue, 02 Sep 2025 14:29:17 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!0b3n!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e3d4394-cd44-438a-979c-ac55d2df0f2c_1280x1119.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0b3n!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e3d4394-cd44-438a-979c-ac55d2df0f2c_1280x1119.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0b3n!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e3d4394-cd44-438a-979c-ac55d2df0f2c_1280x1119.png 424w, https://substackcdn.com/image/fetch/$s_!0b3n!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e3d4394-cd44-438a-979c-ac55d2df0f2c_1280x1119.png 848w, https://substackcdn.com/image/fetch/$s_!0b3n!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e3d4394-cd44-438a-979c-ac55d2df0f2c_1280x1119.png 1272w, https://substackcdn.com/image/fetch/$s_!0b3n!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e3d4394-cd44-438a-979c-ac55d2df0f2c_1280x1119.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0b3n!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e3d4394-cd44-438a-979c-ac55d2df0f2c_1280x1119.png" width="1280" height="1119" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5e3d4394-cd44-438a-979c-ac55d2df0f2c_1280x1119.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1119,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:69781,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://devwithdevontae.substack.com/i/172334355?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e3d4394-cd44-438a-979c-ac55d2df0f2c_1280x1119.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!0b3n!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e3d4394-cd44-438a-979c-ac55d2df0f2c_1280x1119.png 424w, https://substackcdn.com/image/fetch/$s_!0b3n!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e3d4394-cd44-438a-979c-ac55d2df0f2c_1280x1119.png 848w, https://substackcdn.com/image/fetch/$s_!0b3n!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e3d4394-cd44-438a-979c-ac55d2df0f2c_1280x1119.png 1272w, https://substackcdn.com/image/fetch/$s_!0b3n!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e3d4394-cd44-438a-979c-ac55d2df0f2c_1280x1119.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Image by <a href="https://pixabay.com/users/mcmurryjulie-2375405/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=1895779">mcmurryjulie</a></p><h2>Intro</h2><p>Over the past few years, I&#8217;ve had the chance to work with Firebase, Supabase, and most recently, AWS and each has shaped my growth as a engineer in different ways. As a freelancer and full time employee, Firebase was the status quo for delivering fast, scalable apps for clients who probably didn&#8217;t have the biggest budget. I also experimented with Supabase to build React Native projects on the side with the intent of gaining database design skills. And now, I&#8217;m diving into AWS, sharpening my cloud fundamentals so I can bring more value to my current and future clients. Each platform has taught me lessons, sparked frustrations, and ultimately helped me form opinions about why and when you should use each tool.</p><h2>Firebase: For Engineers who don&#8217;t like backend</h2><p>I recommend that most developers, especially those new to backend work, start with Firebase. I say this as someone who&#8217;s used it in both freelance and full-time roles to successfully build web and React Native apps. Firebase takes away a lot of the complexity and lets you focus on shipping.</p><p>For example, you don&#8217;t need to stress over database design principles. In fact, Firebase breaks certain normalization rules like <a href="https://www.youtube.com/watch?v=lW7DWV2jST0&amp;list=WL&amp;index=34">duplicating data</a>. This simplicity makes it approachable for those who don&#8217;t want to live and die by traditional database normalization rules.</p><p>Authentication is another big win. With Firebase, spinning up auth is as simple as setting up a listener and calling a few functions. No need to roll your own auth. On top of that, Firebase has been expanding with features like SQL support, even though it&#8217;s historically been a NoSQL service. Add in the growing opportunities to integrate AI tools, and you&#8217;ve got a platform that continues to evolve without overwhelming beginners.</p><h2>Supabase: The Sweet Spot for Database Folks</h2><p>Supabase is perfect for engineers who already have a background in database design and want more control without jumping into the deep waters of AWS.</p><p>Like Firebase, Supabase gives you auth and database calls right out of the box. But unlike Firebase, it doesn&#8217;t hold your hand. You need to understand schemas, relationships, and SQL fundamentals to really make the most of it. If you&#8217;ve already spent time designing databases or have experience with backend features like JWT tokens, Supabase should feel natural.</p><p>It sits nicely in the middle ground: lightweight enough for solo developers and small teams, but structured enough that you can flex your backend knowledge. For engineers who like the idea of scaling their skills without immediately going full enterprise, Supabase is the sweet spot.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://devwithdevontae.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://devwithdevontae.substack.com/subscribe?"><span>Subscribe now</span></a></p><p></p><h2>AWS: The Cloud Giant&#8217;s Playground</h2><p>And then there&#8217;s AWS. AWS isn&#8217;t for the faint of heart. Unlike Firebase or Supabase, AWS isn&#8217;t a platform you can just poke around in until things click. To succeed here, you need at least a foundation in networking fundamentals and <a href="https://devwithdevontae.substack.com/p/10-essential-aws-tips-every-beginner">AWS basics</a>.</p><p>AWS has a dizzying number of services, and the learning curve is steep. Tinkering aimlessly will only leave you frustrated and potentially leave your application unsafe and/or broken. The smarter path is to invest in a solid course or structured training, then apply those fundamentals repeatedly across projects. Once you get comfortable, AWS opens up possibilities outside of BaaS.</p><p>With this in mind, context matters. If you&#8217;re building for an individual client or a small startup, I would consider Firebase or Supabase. They&#8217;ll let you move fast and deliver value without over engineering. But for clients operating at massive scale or those already locked into AWS services, having AWS skills in your toolkit is an advantage. </p><h2>Closing Thoughts</h2><p>Each of these platforms:Firebase, Supabase, AWS has its place. Firebase lowers the barrier of entry and makes app development accessible. Supabase bridges the gap by giving developers more backend control while keeping things approachable. AWS is the heavyweight, demanding serious investment but rewarding you with in demand skills that are <a href="https://www.spanglobalservices.com/blog/top-fortune-500-companies-using-aws-in-usa/">utilized in fortune 500 companies</a>. So which one have you learned or plan to learn in the future. Leave a comment.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://devwithdevontae.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://devwithdevontae.substack.com/subscribe?"><span>Subscribe now</span></a></p><p></p><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[Why Content Creators Shouldn’t Use WordPress]]></title><description><![CDATA[The double edged sword when using Wordpress]]></description><link>https://devwithdevontae.substack.com/p/why-content-creators-shouldnt-use</link><guid isPermaLink="false">https://devwithdevontae.substack.com/p/why-content-creators-shouldnt-use</guid><dc:creator><![CDATA[DeVontae Moore]]></dc:creator><pubDate>Tue, 26 Aug 2025 19:32:56 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Enfs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc009cd0-b454-4faf-9d0b-54c25cadd722_1280x854.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Enfs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc009cd0-b454-4faf-9d0b-54c25cadd722_1280x854.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Enfs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc009cd0-b454-4faf-9d0b-54c25cadd722_1280x854.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Enfs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc009cd0-b454-4faf-9d0b-54c25cadd722_1280x854.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Enfs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc009cd0-b454-4faf-9d0b-54c25cadd722_1280x854.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Enfs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc009cd0-b454-4faf-9d0b-54c25cadd722_1280x854.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Enfs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc009cd0-b454-4faf-9d0b-54c25cadd722_1280x854.jpeg" width="1280" height="854" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dc009cd0-b454-4faf-9d0b-54c25cadd722_1280x854.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:854,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:146436,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://devwithdevontae.substack.com/i/171752624?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc009cd0-b454-4faf-9d0b-54c25cadd722_1280x854.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Enfs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc009cd0-b454-4faf-9d0b-54c25cadd722_1280x854.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Enfs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc009cd0-b454-4faf-9d0b-54c25cadd722_1280x854.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Enfs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc009cd0-b454-4faf-9d0b-54c25cadd722_1280x854.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Enfs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc009cd0-b454-4faf-9d0b-54c25cadd722_1280x854.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Image by <a href="https://pixabay.com/users/innovalabs-22783312/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=6521720">Innova Labs</a> from <a href="https://pixabay.com//?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=6521720">Pixabay</a></p><h2>Introduction</h2><p>I&#8217;m currently working with a client who relies heavily on WordPress for their website. Over the past few months I&#8217;ve been building new UI features, solving bugs related to <a href="https://www.kadencewp.com/">Kadence,</a> and fixing user experiences with php code. In doing so, I&#8217;ve had a front row seat to the decisions made with WordPress and its ecosystem of third party tools. And here&#8217;s something I&#8217;ve noticed: many of these decisions while convenient in the short term, have long term consequences for performance, maintainability, and user experience.</p><p>What I&#8217;ve seen firsthand is that WordPress often allows non-technical users to build, but it doesn&#8217;t necessarily guide them toward building correctly. This distinction is important because small decisions (like choosing a plugin, adding a block, or embedding an iframe) can snowball into performance bottlenecks, security vulnerabilities, and frustrating user experiences.</p><p>Let&#8217;s dig into why content creators, without a developer (or developers mindset), shouldn&#8217;t be using WordPress as their go to platform.</p><h2>WordPress Requires a Developer&#8217;s Mindset</h2><p>On the surface, WordPress seems simple. Drag-and-drop page builders, third-party themes like Kadence, and editors like Gutenberg make it possible to create websites without touching a single line of code. But here&#8217;s the catch, building a site isn&#8217;t the same as building it well.</p><p>Take something simple like a button. A software engineer knows that a button should:</p><ul><li><p>Change the cursor to a pointer on hover.</p></li><li><p>Be disabled after the user clicks it to prevent duplicate actions.</p></li><li><p>Provide clear feedback (i.e. spinner) that something is happening in the background if a request is being made.</p></li></ul><p>These may sound like minor details, but they&#8217;re what separate a seasoned engineer from a junior engineer. And a frustrating user experience from a smooth one. WordPress doesn&#8217;t enforce these practices, it leaves them up to the builder. And unless you&#8217;re thinking like a developer, these best practices are often overlooked.</p><p>For content creators, this means they might be able to build a page, but they may unknowingly be leaving their users with clunky, confusing, or even broken experiences.</p><h2>Too Many Plugins</h2><p>Plugins are one of WordPress&#8217;s greatest strength and one of its biggest weaknesses. They offer convenience by letting you add functionality with just a few clicks, but that convenience comes with a tradeoffs:</p><ul><li><p>Every plugin is another piece of code that could slow down your site.</p></li><li><p>Some plugins introduce security vulnerabilities that put users at risk.</p></li><li><p>Not all plugins are maintained, leaving your site vulnerable.</p></li></ul><p>I recently removed a file manager plugin from a client&#8217;s site because it posed a security threat and it wasn&#8217;t necessary. In software development, we have a principle called <strong>YAGNI</strong>: <em>You Aren&#8217;t Gonna Need It.</em> Installing tools &#8220;just in case&#8221; creates more problems than it solves. But if you&#8217;re a content creator without technical knowledge, it&#8217;s easy to assume &#8220;there must be a plugin for that&#8221; without considering whether you really need it or whether it could expose your site to risk.</p><div><hr></div><h2>One Click Could Mean Disaster</h2><p>WordPress makes it dangerously easy to make bad decisions with a single click (or lack thereof). I&#8217;ve seen this firsthand while helping a client improve their web performance.</p><p>Their homepage was filled with embedded iframes for Vimeo videos. On the surface, it seemed like a simple way to showcase video content. But behind the scenes, this meant that multiple heavy files were being downloaded the moment someone landed on the site which hurt performance.</p><p>This wasn&#8217;t a malicious decision. It was a decision made without realizing the consequences. A trained developer would have considered alternatives such as lazy loading to balance performance with user experience. </p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://devwithdevontae.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://devwithdevontae.substack.com/subscribe?"><span>Subscribe now</span></a></p><p></p><h2>What Content Creators Should Do Instead</h2><p>If you&#8217;re a content creator and you choose to use WordPress, the best move you can make is to partner with an experienced development team. Platforms like WordPress are powerful, but they require a developer&#8217;s touch to truly shine.</p><p>Agencies like <strong><a href="https://www.borodevagency.com/">Boro Dev Agency</a></strong> specialize in bridging the gap between creativity and technical execution by utilizing seasoned developers like <a href="https://www.linkedin.com/in/devontaemoore-react-developer/">myself</a> (I&#8217;m currently a lead engineer at Boro Dev Agency) to handle the technical load. </p><p>By collaborating with developers who understand the technical side, content creators can lean into their strengths while knowing the user experience and site performance is taken care of. The result is a website that not only looks good but also works seamlessly for every visitor.</p>]]></content:encoded></item><item><title><![CDATA[Simple 3 method system for vetting clients]]></title><description><![CDATA[In this economy its time to think outside the box]]></description><link>https://devwithdevontae.substack.com/p/simple-3-method-system-for-vetting</link><guid isPermaLink="false">https://devwithdevontae.substack.com/p/simple-3-method-system-for-vetting</guid><dc:creator><![CDATA[DeVontae Moore]]></dc:creator><pubDate>Tue, 26 Aug 2025 13:03:02 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!CeeC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faeacbeb0-f5cb-43a6-a2fa-035e139b010d_1280x853.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!CeeC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faeacbeb0-f5cb-43a6-a2fa-035e139b010d_1280x853.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!CeeC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faeacbeb0-f5cb-43a6-a2fa-035e139b010d_1280x853.jpeg 424w, https://substackcdn.com/image/fetch/$s_!CeeC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faeacbeb0-f5cb-43a6-a2fa-035e139b010d_1280x853.jpeg 848w, https://substackcdn.com/image/fetch/$s_!CeeC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faeacbeb0-f5cb-43a6-a2fa-035e139b010d_1280x853.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!CeeC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faeacbeb0-f5cb-43a6-a2fa-035e139b010d_1280x853.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!CeeC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faeacbeb0-f5cb-43a6-a2fa-035e139b010d_1280x853.jpeg" width="1280" height="853" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/aeacbeb0-f5cb-43a6-a2fa-035e139b010d_1280x853.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:853,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:122106,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://devwithdevontae.substack.com/i/171682406?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faeacbeb0-f5cb-43a6-a2fa-035e139b010d_1280x853.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!CeeC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faeacbeb0-f5cb-43a6-a2fa-035e139b010d_1280x853.jpeg 424w, https://substackcdn.com/image/fetch/$s_!CeeC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faeacbeb0-f5cb-43a6-a2fa-035e139b010d_1280x853.jpeg 848w, https://substackcdn.com/image/fetch/$s_!CeeC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faeacbeb0-f5cb-43a6-a2fa-035e139b010d_1280x853.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!CeeC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faeacbeb0-f5cb-43a6-a2fa-035e139b010d_1280x853.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Image by <a href="https://pixabay.com/users/stocksnap-894430/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=923188">StockSnap</a> from <a href="https://pixabay.com//?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=923188">Pixabay</a></p><p>The economy is tough right now, but that doesn&#8217;t mean opportunities are not available. Especially for those with even a twinkling of an entrepreneurial spirit. As a former freelancer developer and current contractor, I&#8217;ve experienced this firsthand. Over the years, I&#8217;ve worked with a variety of clients via LinkedIn and I&#8217;ve learned a thing or two about project management, proposal writing, and client relations. One thing I&#8217;ve realized is that successfully securing clients isn&#8217;t just about skill. It&#8217;s about having a system for vetting potential prospects. Recently I&#8217;ve developed a simple three method system that will help identify the right clients, avoid pitfalls, and set up projects for success.</p><h2>1. Discovery</h2><p>The first phase is <em><strong>Discovery</strong></em>. This is where you truly understand what the client needs and identify their biggest pain points. It&#8217;s not about negotiating price at this stage; it&#8217;s about uncovering their vision and full desires for a project.</p><p>For example, during discovery, I you can ask questions to understand not just what the client wants to build, but why they want it. What problems are they trying to solve? What goals are they trying to achieve? This phase allows you to map out the scope of the project and understand the real value you can provide.</p><p>Price may come into play during this phase but I wouldn&#8217;t disclose any concrete prices until you gain a thorough understanding of the client&#8217;s needs. Rushing into numbers too soon can lead to misunderstandings or projects that are misaligned from the start.</p><h2>2. Research</h2><p>Once discovery is complete, it&#8217;s time for <em><strong>Research</strong></em>. This phase involves taking everything you&#8217;ve learned and exploring the best ways to deliver a solution. The goal is to find practical, efficient, and cost-effective approaches.</p><p>For instance:</p><ul><li><p>If a client wants a content platform but doesn&#8217;t write code, technologies like WordPress or another no-code solution may be ideal.</p></li><li><p>If the client wants a custom app but has a tight budget, using Firebase for backend infrastructure could be a better tradeoff than deploying an AWS architecture, which may require more time and expense.</p></li></ul><p>The research phase is about identifying options that balance your client&#8217;s goals with practical constraints like budget, timeline, and your own expertise. This ensures you can present a thoughtful solution rather than a generic one.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://devwithdevontae.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://devwithdevontae.substack.com/subscribe?"><span>Subscribe now</span></a></p><p></p><h2>3. Proposal</h2><p>The final phase is <em><strong>Proposal</strong></em>. After discovery and research, you&#8217;re ready to present your solutions and pricing. This is where your previous work pays off.</p><p>Key points to remember in this phase:</p><ul><li><p><strong>Provide options:</strong> Avoid rigid pricing that might turn away a potential client. Offer multiple solutions with different tradeoffs so the client can choose what aligns with their priorities.</p></li><li><p><strong>Set fair prices:</strong> Your pricing should respect your time and skills while remaining reasonable for the client.</p></li><li><p><strong>Stay realistic:</strong> Don&#8217;t take on work that pushes you outside your expertise, especially under tight budgets or deadlines. For example, if you&#8217;ve never deployed AWS in production, don&#8217;t &#8220;practice&#8221; with your first client.</p></li><li><p><strong>Be strategic:</strong> Sometimes it makes sense to take a small pay cut if there&#8217;s a clear opportunity for bigger projects down the road. Always weigh immediate compensation against long term growth and relationships.</p></li></ul><p>I hope the <strong>Discovery &#8594; Research &#8594; Proposal</strong> framework will make client vetting much simpler for you. If executed correctly, it should afford you the opportunity to align your skills, time, and business goals with your clients while avoiding projects that could be a mismatch. If you found value in this post share with your network and/or give me a shout on <a href="https://www.linkedin.com/in/devontaemoore-react-developer/">LinkedIn</a> and tell me what you thought of the article.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://devwithdevontae.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://devwithdevontae.substack.com/subscribe?"><span>Subscribe now</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[10 Essential AWS Tips Every Beginner Should Know]]></title><description><![CDATA[From React Developer to the Cloud]]></description><link>https://devwithdevontae.substack.com/p/10-essential-aws-tips-every-beginner</link><guid isPermaLink="false">https://devwithdevontae.substack.com/p/10-essential-aws-tips-every-beginner</guid><dc:creator><![CDATA[DeVontae Moore]]></dc:creator><pubDate>Tue, 19 Aug 2025 12:03:27 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!djCF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb427d95-00e1-4086-b124-bccf61e99332_1280x639.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!djCF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb427d95-00e1-4086-b124-bccf61e99332_1280x639.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!djCF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb427d95-00e1-4086-b124-bccf61e99332_1280x639.png 424w, https://substackcdn.com/image/fetch/$s_!djCF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb427d95-00e1-4086-b124-bccf61e99332_1280x639.png 848w, https://substackcdn.com/image/fetch/$s_!djCF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb427d95-00e1-4086-b124-bccf61e99332_1280x639.png 1272w, https://substackcdn.com/image/fetch/$s_!djCF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb427d95-00e1-4086-b124-bccf61e99332_1280x639.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!djCF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb427d95-00e1-4086-b124-bccf61e99332_1280x639.png" width="1280" height="639" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fb427d95-00e1-4086-b124-bccf61e99332_1280x639.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:639,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1380940,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://devwithdevontae.substack.com/i/171195533?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb427d95-00e1-4086-b124-bccf61e99332_1280x639.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!djCF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb427d95-00e1-4086-b124-bccf61e99332_1280x639.png 424w, https://substackcdn.com/image/fetch/$s_!djCF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb427d95-00e1-4086-b124-bccf61e99332_1280x639.png 848w, https://substackcdn.com/image/fetch/$s_!djCF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb427d95-00e1-4086-b124-bccf61e99332_1280x639.png 1272w, https://substackcdn.com/image/fetch/$s_!djCF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb427d95-00e1-4086-b124-bccf61e99332_1280x639.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Getting started with AWS (Amazon Web Services) can feel overwhelming. With so many services and concepts, it&#8217;s easy to get lost. However, you don&#8217;t need to learn everything at once. By understanding the fundamentals, you&#8217;ll build a solid foundation that makes the rest of AWS much easier to navigate.</p><p>I know this firsthand. My background is in JavaScript and React development, but recently I started transitioning into cloud development. The shift began when my current role gave me the opportunity to set up a CI/CD pipeline using Docker and AWS EKS (Elastic Kubernetes Service). Although the full pipeline was put on hold, it  sparked a fire that I continue to flame.</p><p>The tips I&#8217;m sharing below come from research and some from experience.  My goal is to save you time, help you avoid common pitfalls, and give you practical steps you can use to start building confidently in AWS.</p><h3>Think of Your AWS Account as a &#8220;Container&#8221;</h3><p>I learned this tip from an <a href="https://learn.cantrill.io/">Adrian Cantrill course</a>. You can think of an AWS account like a container for everything you do in AWS. And two main components of this container are  <em><strong>identities and resources</strong></em><strong>. </strong>Identities represent users (i.e. developers, admin personnel, hr,&#8230;) who have access to your AWS account with certain permissions. <a href="https://docs.aws.amazon.com/ARG/latest/userguide/resource-groups.html#resource-groups-intro">Resources</a> in AWS are things like EC2 instances, S3 buckets, or CloudFormation stacks which provide business value to a company. I appreciate this tip because it affords you the ability to think of AWS from a high level. This high level thinking is necessary when conceptualizing how things work or solving system level problems.<br></p><h3>Don&#8217;t assume because you&#8217;re not using an service, you wont be charged</h3><p>I was under the impression that as long as I turned a service off (i.e. EC2 server) I wouldn&#8217;t be charged because AWS is pay as you go. Unfortunately, this isn&#8217;t the case. Yes, AWS is pay as you go. But what does &#8220;go&#8221; mean in AWS? In AWS if a service like EC2 still has &#8220;Resources&#8221; available like Elastic IP addresses and Amazon Elastic Block Store (Amazon EBS) volumes, then you are still &#8220;going&#8221; and will continue to rack up charges. Here&#8217;s what amazon&#8217;s<a href="https://repost.aws/knowledge-center/ec2-billing-terminated"> knowledge center</a> says:</p><p>&#8221;<em>Stopped instances don't incur charges, but Elastic IP addresses or EBS volumes attached to those instances do</em>&#8221;</p><h3>Use plus addressing for multiple accounts</h3><p>Its important to understand that emails are what make AWS accounts unique. While multiple accounts can share the same credit card info, emails must be different. To overcame this hurdle, you use an email technique known as <a href="https://gmail.googleblog.com/2008/03/2-hidden-ways-to-get-more-from-your.html">plus addressing</a> or sub addressing were you add a plus after your email. Heres an example from a google blog:</p><p><em>If your name was hikingfan@gmail.com, you could send mail to hikingfan+friends@gmail.com or hikingfan+mailinglists@gmail.com. </em></p><p>Keep in mind the second account will be bumped up to the paid plan which means you will need to add billing alerts and be cautious about your usage.</p><h3>Protect your accounts with MFA</h3><p>When you first start building with AWS, you may be tempted to whip up VPC&#8217;s with EC2&#8217;s and add S3 buckets to deploy the next billion dollar SAAS product. But what good is your product if someone can easily hack into your account and shut down your whole business. There&#8217;s a proverb that goes, &#8220;&#8230;<a href="https://biblehub.com/hebrew/213.htm">and he who hurries</a> <a href="https://biblehub.com/hebrew/7272.htm">his footsteps</a> <a href="https://biblehub.com/hebrew/2398.htm">misses the mark.</a> When you rush the process and ignore best practices like setting up an MFA for your IAM users, you miss the mark of securing your app from fraud and nefarious individuals.</p><h3> Use Multiple Accounts for Safety and Organization</h3><p>AWS accounts are decoupled. In other words, a mistake in one account shouldn&#8217;t affect others. That&#8217;s why its a good idea to use multiple accounts for dev, staging, and production. If a hacker gets access to one, you can utilize the others and possible keep your app running in the mean time. This principle avoids having a single point of failure which is a common systems technique.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://devwithdevontae.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://devwithdevontae.substack.com/subscribe?"><span>Subscribe now</span></a></p><p></p><h3>Embrace IAM (Identity and Access Management) Early</h3><p>IAM is AWS&#8217;s way of controlling who can do what in your AWS accountant. It helps you avoid accidents by limiting permissions. For example, if a team member only needs access to the billing info of your account, no need to give them access to an EC2 instance. This is known as giving a user least privileges to avoid &#8220;accidents&#8221; or fraud. Its also best practice to avoid using the root user which has unrestricted access to your account. Instead, use the root user to create an IAM user with admin privileges (less permissions than root) and give this access to trusted senior AWS cloud engineers.</p><h3>Understand IAM Identities: Users, Groups, and Roles</h3><ul><li><p><strong>Users</strong>: Individual people or applications (e.g., a developer or a backup app).</p></li><li><p><strong>Groups</strong>: Collections of users who share the same policies (e.g., all developers).</p></li><li><p><strong>Roles</strong>: Temporary access for AWS services or external entities (e.g., EC2 accessing S3).</p><p></p></li></ul><h3>Take Advantage of the Free Tier but understand the details</h3><p>AWS offers a free tier with limited monthly usage of services like EC2, S3, and Lambda. This is a great way to experiment without worrying about costs. But its also important to understand the details around the free tier. For instance, your free tier will end after 6 months or if you&#8217;ve depleted your $100 credits. So if you&#8217;re using AWS with a course like I&#8217;m currently doing, make you are diligently studying your course before your credits or 6 months runs out.</p><h3>Take your time when learning</h3><p>I have to remind myself of this because I&#8217;m ready to build apps that can scale millions of users. At the same time, I know that I want to be a highly skilled engineer in the cloud and not an hobbyist. And this means a mastery of the fundamentals.</p><h3>Use multiple sources if you&#8217;re trying to obtain an certificate</h3><p>I did a bit of research and a common theme I found from this <a href="https://www.reddit.com/r/AWSCertifications/comments/193af5i/did_anyone_else_find_adrian_cantrills_course_to/">reddit thread</a> is you shouldn&#8217;t rely on a single resource to pass an exam. Most of the strategies included taking an online course and taking a practice exam at <a href="https://tutorialsdojo.com/">tutorial dojo</a> also knowns as TD.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://devwithdevontae.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://devwithdevontae.substack.com/subscribe?"><span>Subscribe now</span></a></p><p></p><p><strong>Hope you enjoyed these tips. If you found value in this content I encourage you do the one or more of the following</strong>:</p><ol><li><p>Share with your community</p></li><li><p>Leave a comment</p></li><li><p>Subscribe for more</p></li></ol>]]></content:encoded></item><item><title><![CDATA[Why Learning Google Analytics is Worth Your Time as a Developer]]></title><description><![CDATA[When your tech skills meet marketing]]></description><link>https://devwithdevontae.substack.com/p/why-learning-ga4-is-worth-your-time</link><guid isPermaLink="false">https://devwithdevontae.substack.com/p/why-learning-ga4-is-worth-your-time</guid><dc:creator><![CDATA[DeVontae Moore]]></dc:creator><pubDate>Wed, 13 Aug 2025 16:55:22 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!1EPF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43a16899-a01d-406b-a181-85639571f4f9_1280x854.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1EPF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43a16899-a01d-406b-a181-85639571f4f9_1280x854.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1EPF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43a16899-a01d-406b-a181-85639571f4f9_1280x854.jpeg 424w, https://substackcdn.com/image/fetch/$s_!1EPF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43a16899-a01d-406b-a181-85639571f4f9_1280x854.jpeg 848w, https://substackcdn.com/image/fetch/$s_!1EPF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43a16899-a01d-406b-a181-85639571f4f9_1280x854.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!1EPF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43a16899-a01d-406b-a181-85639571f4f9_1280x854.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1EPF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43a16899-a01d-406b-a181-85639571f4f9_1280x854.jpeg" width="1280" height="854" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/43a16899-a01d-406b-a181-85639571f4f9_1280x854.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:854,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:122219,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://devwithdevontae.substack.com/i/170877821?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43a16899-a01d-406b-a181-85639571f4f9_1280x854.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!1EPF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43a16899-a01d-406b-a181-85639571f4f9_1280x854.jpeg 424w, https://substackcdn.com/image/fetch/$s_!1EPF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43a16899-a01d-406b-a181-85639571f4f9_1280x854.jpeg 848w, https://substackcdn.com/image/fetch/$s_!1EPF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43a16899-a01d-406b-a181-85639571f4f9_1280x854.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!1EPF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43a16899-a01d-406b-a181-85639571f4f9_1280x854.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Image by <a href="https://pixabay.com/users/asphotohrapy-1546875/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=1433427">AS Photograpy</a> from <a href="https://pixabay.com//?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=1433427">Pixabay</a></p><p>If you're going to build forms, you might as well go a step further and connect them to a Google Analytics 4 (GA4) account  and learn the fundamentals of GA4 while you&#8217;re at it.</p><p>I recently had a real world example of this while working with <strong><a href="https://ninjaforms.com/?sscid=CjwKCAjw7_DEBhAeEiwAWKiCCxeaupArzcwmbJyMv1HiD61YsmBZWlDKFGMCmn5oogecxqa-E9MFCRoC7scQAvD_BwE&amp;gad_source=1&amp;gad_campaignid=21662461420&amp;gbraid=0AAAAA-LFry5HuEn6up0Rj6Dj9Jlh7_0bY&amp;gclid=CjwKCAjw7_DEBhAeEiwAWKiCCxeaupArzcwmbJyMv1HiD61YsmBZWlDKFGMCmn5oogecxqa-E9MFCRoC7scQAvD_BwE">Ninja Forms</a></strong> in WordPress. I set up a form that didn&#8217;t just collect data, but actually tied into a <strong>Google <a href="https://tagmanager.google.com/">Tag Manager (GTM)</a></strong> custom tag that hooked into the a <strong>GA4 account</strong>. The whole process gave me a deeper appreciation for the overlap between development skills and marketing analytics.</p><p>Here&#8217;s what happened and why you should care.</p><h2>The Real-World Example: Ninja Forms + GTM + GA4</h2><p>I had a client using Ninja Forms on their WordPress site, and they wanted to track/verify specific form submissions in GA4. As part of the discovery process, I created a custom tag in GTM instead of relying on an built-in integration:</p><ul><li><p><strong>Step 1:</strong> In GTM, I created a new tag for the specific form submission event.</p></li><li><p><strong>Step 2:</strong> I connected it to the right GA4 account by entering the <strong>measurement ID</strong> (double-check this using the wrong one means your data could end up in someone else&#8217;s property).</p></li><li><p><strong>Step 3:</strong> I tested the entire setup with <strong>Tag Assistant</strong> for debugging. This made it easy to see whether my tags were firing properly and sending the event data to GA4 in real time.</p></li></ul><p>Once it was working, my form submission triggered an event in GA4. </p><h2>Why Learning GA4 Matters</h2><h3>1. Added business value</h3><p>The economy for engineers isn&#8217;t exactly sunshine and rainbows right now. The last thing we need is to bury ourselves in another shiny new JavaScript framework with little business impact. Learning GA4, specifically <strong><a href="https://support.google.com/analytics/answer/9267568?hl=en">events</a></strong><a href="https://support.google.com/analytics/answer/9267568?hl=en"> and </a><strong><a href="https://support.google.com/analytics/answer/9267568?hl=en">key events</a></strong> helps you complement your tech skills with business insights. That makes you harder to replace and more valuable to any team.</p><h3>2. Diversified skills</h3><p>If all you know are traditional development skills, you&#8217;re playing a risky game in today&#8217;s and tomorrow&#8217;s market. Adding analytics skill and knowledge spreads your skill set out and can open unexpected opportunities.</p><h3>3. Easy crossover from coding</h3><p>GA4 and GTM concepts often overlap with software development practices. For example, naming conventions in coding apply here too: naming an event <code>"event_a"</code> is as unhelpful as calling a variable <code>const x</code>. Good naming makes your data instantly understandable, and developers can pick this up quickly.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://devwithdevontae.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://devwithdevontae.substack.com/subscribe?"><span>Subscribe now</span></a></p><p></p><h2>Quick Tips for GA4 + GTM Success</h2><p>These are lessons I learned while working with Ninja Forms and GTM:</p><ol><li><p><strong>Use incognito mode for testing</strong> &#8211; This might alleviate some pain points when trying to view events in GA4.</p></li><li><p><strong>Check for no-code solutions first</strong> &#8211; Form plugins like Ninja Forms have built-in GTM or GA4 integrations. If not, you can still inject custom JavaScript in your tags.</p></li><li><p><strong>Verify your measurement ID</strong> &#8211; Using the wrong one can send your data to another GA4 account entirely. </p></li></ol><div><hr></div><h2>Final Thoughts</h2><p>Learning GA4 is one of those small but powerful moves that makes you more valuable. And as my Ninja Forms + GTM project showed me, the skills you already have as a developer make this fairly easy to pick up.</p><p>So&#8230; how are you leveling up your skills in this crazy market?</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://devwithdevontae.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Dev with DeVontae! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[My Honest Opinion of Cursor]]></title><description><![CDATA[I've been hearing about Cursor for a while from fellow A.I.]]></description><link>https://devwithdevontae.substack.com/p/my-honest-opinion-of-cursor</link><guid isPermaLink="false">https://devwithdevontae.substack.com/p/my-honest-opinion-of-cursor</guid><dc:creator><![CDATA[DeVontae Moore]]></dc:creator><pubDate>Wed, 02 Apr 2025 18:29:44 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!pPDH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12bec616-f9d8-4a45-904e-b081aed9dcd9_2121x1414.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pPDH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12bec616-f9d8-4a45-904e-b081aed9dcd9_2121x1414.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pPDH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12bec616-f9d8-4a45-904e-b081aed9dcd9_2121x1414.webp 424w, https://substackcdn.com/image/fetch/$s_!pPDH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12bec616-f9d8-4a45-904e-b081aed9dcd9_2121x1414.webp 848w, https://substackcdn.com/image/fetch/$s_!pPDH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12bec616-f9d8-4a45-904e-b081aed9dcd9_2121x1414.webp 1272w, https://substackcdn.com/image/fetch/$s_!pPDH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12bec616-f9d8-4a45-904e-b081aed9dcd9_2121x1414.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pPDH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12bec616-f9d8-4a45-904e-b081aed9dcd9_2121x1414.webp" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/12bec616-f9d8-4a45-904e-b081aed9dcd9_2121x1414.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:167564,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://devwithdevontae.substack.com/i/160429278?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12bec616-f9d8-4a45-904e-b081aed9dcd9_2121x1414.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!pPDH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12bec616-f9d8-4a45-904e-b081aed9dcd9_2121x1414.webp 424w, https://substackcdn.com/image/fetch/$s_!pPDH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12bec616-f9d8-4a45-904e-b081aed9dcd9_2121x1414.webp 848w, https://substackcdn.com/image/fetch/$s_!pPDH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12bec616-f9d8-4a45-904e-b081aed9dcd9_2121x1414.webp 1272w, https://substackcdn.com/image/fetch/$s_!pPDH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12bec616-f9d8-4a45-904e-b081aed9dcd9_2121x1414.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I've been hearing about Cursor for a while from fellow A.I. enthusiasts like <a href="https://www.linkedin.com/in/willhblackburn/">Will Blackburn</a>, and I finally decided to give it a try for a React Native side project. After diving into it, here are my initial thoughts and lessons I learned.</p><h2>How I got started with cursor</h2><h5>Download and Installation</h5><p>The process began with a slow download from the <a href="https://www.cursor.com/">Cursor website.</a> Likely a consequence of being at a busy coffee shop during peak hours. Once downloaded, I placed the Cursor installer in my Applications folder and launched it with the familiar macOS shortcut (Command + Space). The installation was straightforward, setting the stage for exploring its features.</p><h5>Launching Cursor from the Terminal</h5><p>After watching various tutorials and noticing how they were manually uploading projects inside cursor, I wondered if I could open a project via a terminal command like I usually do with VS code. After launching cursor I found my answer after noticing the option to install the cursor command in my path variable.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NIqu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a062909-0bba-47e7-869e-b2f8150628e5_1008x1310.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NIqu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a062909-0bba-47e7-869e-b2f8150628e5_1008x1310.png 424w, https://substackcdn.com/image/fetch/$s_!NIqu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a062909-0bba-47e7-869e-b2f8150628e5_1008x1310.png 848w, https://substackcdn.com/image/fetch/$s_!NIqu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a062909-0bba-47e7-869e-b2f8150628e5_1008x1310.png 1272w, https://substackcdn.com/image/fetch/$s_!NIqu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a062909-0bba-47e7-869e-b2f8150628e5_1008x1310.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NIqu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a062909-0bba-47e7-869e-b2f8150628e5_1008x1310.png" width="494" height="642.0039682539683" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8a062909-0bba-47e7-869e-b2f8150628e5_1008x1310.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1310,&quot;width&quot;:1008,&quot;resizeWidth&quot;:494,&quot;bytes&quot;:119885,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://devwithdevontae.substack.com/i/160429278?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a062909-0bba-47e7-869e-b2f8150628e5_1008x1310.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!NIqu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a062909-0bba-47e7-869e-b2f8150628e5_1008x1310.png 424w, https://substackcdn.com/image/fetch/$s_!NIqu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a062909-0bba-47e7-869e-b2f8150628e5_1008x1310.png 848w, https://substackcdn.com/image/fetch/$s_!NIqu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a062909-0bba-47e7-869e-b2f8150628e5_1008x1310.png 1272w, https://substackcdn.com/image/fetch/$s_!NIqu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a062909-0bba-47e7-869e-b2f8150628e5_1008x1310.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>If you decide you don&#8217;t want to install the cursor command in your path variable during setup, no worries! You can use the Command Palette (Shift + Command + P + type shell) within Cursor to run the shell command installation at a later time.</p><h4>&#128640;Dev knowledge</h4><p><em>The purpose of adding the cursor executable to your path is so you can save time. With the cursor executable in your path variable, you can simply type &#8216;cursor&#8217; instead of  /usr/local/bin/cursor in your terminal</em></p><h4>&#128640;Dev tip</h4><p><em>You can use the <a href="https://linux.die.net/man/1/which">which command</a> to verify if the proper path to execute the cursor command has been added to your path variable. Or test it out with a project</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://devwithdevontae.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://devwithdevontae.substack.com/subscribe?"><span>Subscribe now</span></a></p><p></p><h2>Cursor sees all</h2><p>One of Cursor&#8217;s standout features is its ability to semantically index your entire codebase. This means it can answer questions using the full context of your code and potentially help write better code by referencing existing implementations. Below are my current thoughts on this feature.</p><ul><li><p><strong>Amazing Potential:</strong><br>I suspect most humans can&#8217;t keep the entire context of a large codebase in their mind. This means as your code base grows, cursor should be able to see edge cases and avoid them by making adjustments in your code. This is a potentially game changer.</p></li><li><p><strong>Potential Pitfalls:</strong><br>If your codebase is messy or if modifications aren&#8217;t carefully managed, the results could be confusing or even detrimental. Fortunately, Cursor includes <a href="https://docs.cursor.com/chat/overview#checkpoints">checkpoints</a>, so you can revert to previous states if something goes wrong.</p></li></ul><h2>Security and File Management Concerns</h2><p><strong>Handling Sensitive Files</strong><br>According to their docs:</p><blockquote><p><em>While a <strong>.cursorignore</strong> file can prevent files from being indexed, <strong>those files may still be included in AI requests</strong>, such as if you recently viewed a file and then ask a question in the chat. We are considering adding a <strong>.cursorban</strong> file to address the use case of wanting to block files from being sent up in any request</em></p></blockquote><p>For medium to large companies, this is critical since security should be paramount. Since I'm working on a side project with minimal security concerns, I&#8217;m comfortable moving forward with Cursor as it stands. However, organizations with more stringent security needs should watch for updates addressing this file exposure issue.</p><h3><br>Final Thoughts</h3><p>Overall, my experience with Cursor has been positive. It&#8217;s a promising tool that could revolutionize how we interact with and understand our codebases. While the potential security and file management issues are something to be aware of, the benefits of semantic indexing and easy integration with your development environment make it a compelling choice for developers. I&#8217;m excited to see how Cursor evolves and whether it can become a staple in both small projects and enterprise environments.</p><p>What do you think? </p><p>Have you had similar experiences with Cursor, or do you have any concerns about its features? </p><p>Let&#8217;s discuss!</p>]]></content:encoded></item><item><title><![CDATA[Why Software Engineers Will Be Prompt Engineers?]]></title><description><![CDATA[Image by kiquebg from Pixabay]]></description><link>https://devwithdevontae.substack.com/p/why-software-engineers-will-be-prompt</link><guid isPermaLink="false">https://devwithdevontae.substack.com/p/why-software-engineers-will-be-prompt</guid><dc:creator><![CDATA[DeVontae Moore]]></dc:creator><pubDate>Mon, 16 Sep 2024 15:12:41 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!NdI4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ed0a200-5ff0-4105-8cae-54ed997c80c4_1280x854.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NdI4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ed0a200-5ff0-4105-8cae-54ed997c80c4_1280x854.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NdI4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ed0a200-5ff0-4105-8cae-54ed997c80c4_1280x854.jpeg 424w, https://substackcdn.com/image/fetch/$s_!NdI4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ed0a200-5ff0-4105-8cae-54ed997c80c4_1280x854.jpeg 848w, https://substackcdn.com/image/fetch/$s_!NdI4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ed0a200-5ff0-4105-8cae-54ed997c80c4_1280x854.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!NdI4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ed0a200-5ff0-4105-8cae-54ed997c80c4_1280x854.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NdI4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ed0a200-5ff0-4105-8cae-54ed997c80c4_1280x854.jpeg" width="1280" height="854" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5ed0a200-5ff0-4105-8cae-54ed997c80c4_1280x854.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:854,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:176201,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!NdI4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ed0a200-5ff0-4105-8cae-54ed997c80c4_1280x854.jpeg 424w, https://substackcdn.com/image/fetch/$s_!NdI4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ed0a200-5ff0-4105-8cae-54ed997c80c4_1280x854.jpeg 848w, https://substackcdn.com/image/fetch/$s_!NdI4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ed0a200-5ff0-4105-8cae-54ed997c80c4_1280x854.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!NdI4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ed0a200-5ff0-4105-8cae-54ed997c80c4_1280x854.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Image by <a href="https://pixabay.com/users/kiquebg-5133331/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=4256272">kiquebg</a> from <a href="https://pixabay.com//?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=4256272">Pixabay</a></p><p>The future of software engineering is evolving, and AI is at the center of this change. The role of the software engineer is not what it used to be, and soon, software engineers will evolve into prompt engineers. Why? Because the tools are changing and businesses are desiring (and perhaps demanding in some cases) more efficiency. In this article, I give three reasons why Software Engineers will become prompt engineers.</p><h3>Good Prompts Are Based on Understanding</h3><p>Prompt engineering isn&#8217;t just about throwing words at an AI tool and hoping it spits out something useful. Good prompts are grounded in a solid understanding of the problem at hand.</p><h5><strong>It&#8217;s all about understanding</strong></h5><p>Writing an effective prompt requires you to fully understand the problem, the concept, or the technique you&#8217;re working with. A well-crafted prompt can be just as effective as building a solution from scratch. For example, when I was tinkering with <a href="https://supabase.com/docs">Supabase&#8217;s </a>SQL editor to create a trigger function, I needed to make sure I understood the fundamental components of a trigger function. Had I not had this understanding, my prompt might had rendered a useless solution.</p><h5><strong>Prompt engineering in interviews</strong></h5><p>As prompt engineering becomes more mainstream, we may even see it become part of the hiring process. Instead of asking candidates to build entire projects from scratch, companies might test their understanding through effective prompts. Understanding how to guide AI will soon be just as important as understanding how to write code. And that shift might change how software engineers are evaluated in interviews.</p><h3>Everyday Tools Are Implementing AI Editors</h3><p>It&#8217;s no secret that AI is being integrated into the tools developers use every day. These tools are getting smarter, and they&#8217;re making the development process faster and easier, pushing prompt engineering to the forefront.</p><h5>Tools like Cursor AI and Supabase&#8217;s SQL Editor are leading the charge</h5><p>These tools streamline code completion, debugging, and even database object generation. They&#8217;re designed to take the heavy lifting out of the development process and give developers more time to focus on higher-level tasks.</p><p>When tools like these are widely used by the development community, it&#8217;s a clear sign that things are shifting. What was once a niche skill is now becoming a standard practice in software engineering. As more tools adopt AI features, developers will naturally gravitate toward mastering prompt engineering.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://devwithdevontae.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://devwithdevontae.substack.com/subscribe?"><span>Subscribe now</span></a></p><p></p><h3>It Makes Business Sense</h3><p>Businesses run on efficiency, and nothing drives efficiency like AI. The adoption of prompt engineering isn&#8217;t just a trend&#8212;it&#8217;s a smart business move.</p><h5>The efficiency drives profits</h5><p>The goal of any business is to be profitable, and one of the most effective ways to increase profitability is through efficiency. Prompt engineering allows developers to complete tasks in half the time, reducing costs and increasing output. Businesses are going to expect, if not demand, their engineers to integrate prompt engineering into their workflow because it gets results.</p><h5>Faster results mean more value</h5><p>When engineers can use AI to cut development time in half, they add tremendous value to the company. More can be accomplished in less time, and the business benefits by getting products to market faster, reducing development costs, and boosting overall profitability. In short, prompt engineering isn't just a skill&#8212;it&#8217;s a business strategy.</p><h3>Conclusion</h3><p>Software engineering is evolving into prompt engineering. Everyday tools like Cursor and ChatGPT are making prompt engineering an essential skill. The future of software engineering isn&#8217;t just about writing code anymore&#8212;it&#8217;s about knowing how to ask AI to do it for you.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://devwithdevontae.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Dev with DeVontae! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><h3></h3>]]></content:encoded></item><item><title><![CDATA[Why is setting up React Native projects in Expo so hard?]]></title><description><![CDATA[Image by Petra from Pixabay]]></description><link>https://devwithdevontae.substack.com/p/why-is-setting-up-react-native-projects</link><guid isPermaLink="false">https://devwithdevontae.substack.com/p/why-is-setting-up-react-native-projects</guid><dc:creator><![CDATA[DeVontae Moore]]></dc:creator><pubDate>Mon, 09 Sep 2024 19:56:59 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!XpHB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30a1933f-a087-4af2-91b0-e021c442f1a9_1280x720.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XpHB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30a1933f-a087-4af2-91b0-e021c442f1a9_1280x720.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XpHB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30a1933f-a087-4af2-91b0-e021c442f1a9_1280x720.png 424w, https://substackcdn.com/image/fetch/$s_!XpHB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30a1933f-a087-4af2-91b0-e021c442f1a9_1280x720.png 848w, https://substackcdn.com/image/fetch/$s_!XpHB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30a1933f-a087-4af2-91b0-e021c442f1a9_1280x720.png 1272w, https://substackcdn.com/image/fetch/$s_!XpHB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30a1933f-a087-4af2-91b0-e021c442f1a9_1280x720.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XpHB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30a1933f-a087-4af2-91b0-e021c442f1a9_1280x720.png" width="1280" height="720" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/30a1933f-a087-4af2-91b0-e021c442f1a9_1280x720.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:720,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:39879,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!XpHB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30a1933f-a087-4af2-91b0-e021c442f1a9_1280x720.png 424w, https://substackcdn.com/image/fetch/$s_!XpHB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30a1933f-a087-4af2-91b0-e021c442f1a9_1280x720.png 848w, https://substackcdn.com/image/fetch/$s_!XpHB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30a1933f-a087-4af2-91b0-e021c442f1a9_1280x720.png 1272w, https://substackcdn.com/image/fetch/$s_!XpHB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30a1933f-a087-4af2-91b0-e021c442f1a9_1280x720.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Image by <a href="https://pixabay.com/users/ptra-359668/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=3214756">Petra</a> from <a href="https://pixabay.com//?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=3214756">Pixabay</a></p><p>To answer the title of my post, &#8220;because there are a multitude of options&#8221;. The Expo Framework is one of my favorite frameworks for building universal apps. But that doesn&#8217;t mean its without pain points. And one of its pain points is the various ways or &#8220;builds&#8221; you can use when creating React Native apps. In this article, I aim to bring structure to the chaos of setting up projects with React Native Expo. Lets start with <a href="https://docs.expo.dev/get-started/set-up-your-environment/#where-would-you-like-to-develop">where you can build your app</a>.</p><h3>iOS simulator/device vs Android emulator/device</h3><p>Expo is a robust <a href="https://expo.dev/">framework</a> for building cross-platform mobile and web applications. When developing with Expo, you have four environments to run/test your application: the <em>iOS simulator</em>, <em>Android emulator</em>, <em>iOS device</em>, and <em>Android device</em>. Each of these options has its own set of pros and cons. For example, if you don&#8217;t own an iOS device you can still test your app with an iOS simulator. However, certain features can&#8217;t be properly tested when working on a iOS simulator. I ran into this issue while developing an app called <a href="https://www.gigbossapp.com/">GigBoss</a> for a <a href="https://www.linkedin.com/in/devontaemoore-react-developer/details/recommendations/?detailScreenTabIndex=0">former employer</a>. One of the features in GigBoss allowed users to tap on a phone number and link it to the native phone app. Unfortunately, this feature couldn&#8217;t be tested on a simulator because it didn&#8217;t have access to the native system. For a step by step process on setting up different environments for your React Native app, <a href="https://docs.expo.dev/get-started/set-up-your-environment">click here</a>. After you decide where your app will run, its time to decide how you will build it.</p><h3>Expo Go</h3><p>After you decided <em>where</em> you want to develop (i.e. android device) your <br>Expo app, the question becomes <a href="https://docs.expo.dev/get-started/set-up-your-environment/?platform=android&amp;device=simulated#how-would-you-like-to-develop">how will you do it </a>. One option is to implement <a href="https://expo.dev/go">Expo Go</a>. Expo Go is a &#8220;sandbox&#8221; environment for building React Native apps. If you&#8217;re building your app in an iOS simulator or Android Emulator, run the command <em><strong>npx expo start</strong></em> within the <em><strong><a href="https://docs.expo.dev/more/expo-cli/">Expo CLI</a></strong></em>. After running this command, Expo Go will be installed automatically on your virtual devices.</p><h5>Pros of Expo Go </h5><p>Expo Go is great for getting up and running with a local environment. If you&#8217;re curious about React Native and want to start tinkering with no fuss, Expo Go is a good starting part.</p><h5>Cons of Expo Go </h5><p>Expo Go is great for enthusiast who want to develop quickly because it hides native directories and the ability to modify files in native directories. But this comes with less flexibility. For example, if you want to use the <a href="https://docs.expo.dev/versions/latest/sdk/camer">expo-camera librar</a>y, you need to use config plugins or configure native files. However, in an Expo Go environment, you don&#8217;t have access to these native files. As a result, you won&#8217;t be able to install the expo-camera package and will need to find a suitable alternative. One way around this limitation is implement a local build in Expo.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://devwithdevontae.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://devwithdevontae.substack.com/subscribe?"><span>Subscribe now</span></a></p><p></p><h3>Expo Local Build</h3><p>One way to work around the limitations of Expo Go is by creating a <a href="https://docs.expo.dev/guides/local-app-development/#local-app-compilation">local build</a> (also known as a debug build). A local Expo build gives developers greater flexibility and control by providing access to native directories and files. If you want to use the expo-camera library mentioned earlier, you would need to run the following command in the Expo CLI: <em><strong>npx expo run:ios</strong></em> (<em><strong>or npx expo run:android for Android</strong></em>). Once this command is executed, the iOS and Android directories will become available, allowing you to use the expo-camera package.</p><h5>Pros of Expo local build</h5><p>Affords you the ability to use more third party packages for more robust app experiences</p><h5>Cons of Expo local build</h5><p>With greater control comes greater complexity and more opportunities for bugs and errors </p><h3>Expo Local Build + expo-dev-client = development build</h3><p>I mentioned earlier that a local build is also considered a &#8220;debug&#8221; build. When you combine this build with the expo-dev-client package, Expo considers this a <a href="https://docs.expo.dev/develop/development-builds/introduction/">development build</a>. Like a local build, a development build affords you access to native iOS and Android  directories. However, there are cases when you will need to use a development build over a local build. A prime example of this is when you&#8217;re using a third party auth service like <a href="https://docs.expo.dev/guides/authentication/">Facebook login</a>. When testing a third party auth system with Expo, its <a href="https://docs.expo.dev/develop/authentication/">instructed that you use a development build</a>. According to Expo&#8217;s docs, you can create development builds <a href="https://docs.expo.dev/develop/development-builds/create-a-build/">remotely</a>, <a href="https://docs.expo.dev/guides/local-app-development/#local-builds-with-expo-dev-client">locally</a>, or within your <a href="https://docs.expo.dev/build-reference/local-builds/">own infrastructure</a>. </p><h5>Pros of Expo development build</h5><p>Greater feature flexibility (i.e testing Auth services) beyond a local build</p><h5>Cons of Expo development build</h5><p>A bit confusing and added complexity</p><h3>Expo Snack</h3><p>If you&#8217;re a web developer and you simply want to test the waters of React Native (ie. the fundamentals) I would start here. I believe a lot of devs are naturally curious about React Native because its a great accompaniment to their established React skills. But sometimes its important to &#8220;test drive&#8221; new tools before you go all in. Expo snack is perfect for this scenario.</p><h5>Pros of Expo Snack</h5><p>Great for testing and/or practicing in the browser</p><h5>Cons of Expo Snack</h5><p>Not suitable for production apps</p><h3>Recap</h3><ol><li><p>Start with <em><strong>Expo Snack</strong></em> if you just want to go on a test drive</p></li><li><p>Venture off with <em><strong>Expo Go </strong></em>if you want to set up something locally and tinker without a lot of fuss</p></li><li><p>Create a <em><strong>local build </strong></em>when you want greater flexibility with your features</p></li><li><p>Create a <em><strong>development build</strong></em> for scenarios where its required like using a third party auth service</p></li></ol><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://devwithdevontae.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Dev with DeVontae! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://devwithdevontae.substack.com/p/why-is-setting-up-react-native-projects?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://devwithdevontae.substack.com/p/why-is-setting-up-react-native-projects?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;8237ab1b-b8f1-4496-93f1-b5bbcd7aa957&quot;,&quot;caption&quot;:&quot;Image by RealToughCandy.com&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;React vs React Native Pt1&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:131224638,&quot;name&quot;:&quot;DeVontae Moore&quot;,&quot;bio&quot;:&quot;I'm a Software Engineer who loves to learn from his experiences and observations for the benefit of others.My current focus is React Native and typescript. &quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8578cabc-3adf-4971-be36-e0f2f2c17096_192x200.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2023-07-20T17:43:56.442Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd928f182-034e-41a1-b04c-3a63f97b8609_6000x4000.jpeg&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://devwithdevontae.substack.com/p/react-vs-react-native&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:135303787,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;Dev with DeVontae&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4400689f-210c-4a9f-bc88-ea77852073e0_256x256.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div>]]></content:encoded></item><item><title><![CDATA[The Ever-Changing World of Software Development]]></title><description><![CDATA[From Server components to Firebase adopting SQL]]></description><link>https://devwithdevontae.substack.com/p/the-ever-changing-world-of-software</link><guid isPermaLink="false">https://devwithdevontae.substack.com/p/the-ever-changing-world-of-software</guid><dc:creator><![CDATA[DeVontae Moore]]></dc:creator><pubDate>Sat, 25 May 2024 20:10:47 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ZNl1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc98fdf97-6e30-4f60-b928-352706c128f5_1280x853.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZNl1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc98fdf97-6e30-4f60-b928-352706c128f5_1280x853.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZNl1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc98fdf97-6e30-4f60-b928-352706c128f5_1280x853.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ZNl1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc98fdf97-6e30-4f60-b928-352706c128f5_1280x853.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ZNl1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc98fdf97-6e30-4f60-b928-352706c128f5_1280x853.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ZNl1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc98fdf97-6e30-4f60-b928-352706c128f5_1280x853.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZNl1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc98fdf97-6e30-4f60-b928-352706c128f5_1280x853.jpeg" width="1280" height="853" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c98fdf97-6e30-4f60-b928-352706c128f5_1280x853.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:853,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:93171,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ZNl1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc98fdf97-6e30-4f60-b928-352706c128f5_1280x853.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ZNl1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc98fdf97-6e30-4f60-b928-352706c128f5_1280x853.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ZNl1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc98fdf97-6e30-4f60-b928-352706c128f5_1280x853.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ZNl1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc98fdf97-6e30-4f60-b928-352706c128f5_1280x853.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Image by <a href="https://pixabay.com/users/cdubby-20732436/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=7014643">Christopher White</a> from <a href="https://pixabay.com//?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=7014643">Pixabay</a></p><p>The world of software development is on fire at the time of this writing. Between React Server Components,  Firebase adopting SQL and Open A.I. creating faster and cost affordable A.I. tools, it's clear that staying relevant in this field requires continuous learning and adaptation. But how do you navigate the latest trends? Do you forsake whatever path you&#8217;re on and go all in on the latest tech? Or do you ignore the current landscape and hope your current skills will suffice for the foreseeable future? The aim of this article is to give you practical tactics to navigate the latest trends and any trends that might come down the pipeline in the future.</p><h3><strong>Tips for Navigating the Change</strong></h3><p>While it&#8217;s exciting to see such rapid advancements, it&#8217;s essential to approach these changes thoughtfully. Here are some tips to help you stay balanced and strategic in your learning journey:</p><h4>Don&#8217;t Be Too Hasty</h4><p>Not every company will abandon their current tech stack in favor of the latest and greatest technologies overnight. Legacy code is still prevalent, and many businesses will continue to rely on it for years to come before they&#8217;re forced to change. The slow adoption of some companies means more time for you to gradually build new skills. Think of learning new technologies as an investment&#8212;one that will pay off in the future. When you have a long term mindset, being hasty becomes less tempting. </p><h4><strong>Don't Be Too Relaxed</strong></h4><p>While some companies will adopt new tech at a snail-like pace, it is very probable that other companies will be early adopters of new tech. Because of this, I encourage you to start learning new skills as soon as you can. And because years of experience has a high currency in the world of tech, the sooner the better. </p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://devwithdevontae.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://devwithdevontae.substack.com/subscribe?"><span>Subscribe now</span></a></p><p></p><h4><strong>Master the Basics First</strong></h4><p>Though it&#8217;s tempting to jump on the AI bandwagon or dive into the latest React features, I wouldn&#8217;t encourage this practice unless you&#8217;ve studied the basics. Without a solid foundation in coding principles and problem-solving skills, you&#8217;ll be building Software on shaky ground. With this in mind, before you decide to go all in on the latest trends, I would verify that you&#8217;ve done the following:</p><ol><li><p>Developed mastery with a programming language</p></li><li><p>Understand coding principles like S.O.L.I.D and DRY</p></li><li><p>Have strong fundamentals ahead of any updates to frameworks, API&#8217;s, and services you want to use (i.e. understanding React state before utilizing Server Components)</p></li></ol><h4><strong>Find a Niche path</strong></h4><p>Given the plethora of new technologies and tools, it can be overwhelming to decide where to focus your efforts. Today, you might come across information about server actions in react or how Firebase is adopting adding SQL. Instead of trying to learn everything at once, focus on the tech that aligns with your interests and career goals. For example, if you&#8217;re goal is to be a front end specialist, being concerned with how Firebase is evolving may not make the most sense. But if you&#8217;re a Full Stack developer that uses React and Firebase, learning both would be a reasonable decision.</p><h3><strong>Conclusion</strong></h3><p>The world of software development is exciting and full of opportunities. By balancing your approach to learning you can navigate this ever-changing landscape effectively. Embrace the change, invest in your skills, and prepare yourself for the future of development.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://devwithdevontae.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Dev with DeVontae! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[HOW to consistently post on LinkedIn as a Software Engineer ]]></title><description><![CDATA[Systems I've learned from Justin Welsh and Matt Gray]]></description><link>https://devwithdevontae.substack.com/p/how-to-consistently-post-on-linkedin</link><guid isPermaLink="false">https://devwithdevontae.substack.com/p/how-to-consistently-post-on-linkedin</guid><dc:creator><![CDATA[DeVontae Moore]]></dc:creator><pubDate>Mon, 29 Apr 2024 20:50:02 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ibeJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8fe5a37-9301-48b9-9b8b-5e4ced2927c3_1280x757.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ibeJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8fe5a37-9301-48b9-9b8b-5e4ced2927c3_1280x757.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ibeJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8fe5a37-9301-48b9-9b8b-5e4ced2927c3_1280x757.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ibeJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8fe5a37-9301-48b9-9b8b-5e4ced2927c3_1280x757.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ibeJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8fe5a37-9301-48b9-9b8b-5e4ced2927c3_1280x757.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ibeJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8fe5a37-9301-48b9-9b8b-5e4ced2927c3_1280x757.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ibeJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8fe5a37-9301-48b9-9b8b-5e4ced2927c3_1280x757.jpeg" width="1280" height="757" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c8fe5a37-9301-48b9-9b8b-5e4ced2927c3_1280x757.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:757,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:139017,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ibeJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8fe5a37-9301-48b9-9b8b-5e4ced2927c3_1280x757.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ibeJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8fe5a37-9301-48b9-9b8b-5e4ced2927c3_1280x757.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ibeJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8fe5a37-9301-48b9-9b8b-5e4ced2927c3_1280x757.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ibeJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8fe5a37-9301-48b9-9b8b-5e4ced2927c3_1280x757.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Image by <a href="https://pixabay.com/users/startupstockphotos-690514/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=593333">StartupStockPhotos</a> from <a href="https://pixabay.com//?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=593333">Pixabay</a></p><p>Have you ever been told that you should post more on LinkedIn? Perhaps you were told this advice in order to build a brand and/or secure a full time job. Perhaps you were told this so you could grow your audience to secure more clients. Regardless of why you were told this advice, there remains a problem:</p><p><em><strong>Telling someone what to do, isn&#8217;t the same as guiding them on HOW TO DO IT.</strong></em></p><p>In this article, I aim to address this gap by sharing practical strategies for posting more consistently on LinkedIn. And it all starts with two things: </p><ol><li><p><em>Setting aside a time to create your content</em> (i.e. Saturday mornings at 10am)</p></li><li><p><em>Organizing your content into categories that inspire and spark ideas.</em> </p></li></ol><p>The majority of this article will focus on categories you can use to spark ideas that will help you post more consistently on LinkedIn.</p><h3>Categories</h3><p>The content categories I will present, which you may have encountered online but never considered structuring into a system, have been instrumental in building my audience. These categories are a blend of concepts I've learned from <a href="https://www.youtube.com/watch?v=SkR3XB6Bvq8&amp;t=733s">Justin Welsh </a>and <a href="https://www.youtube.com/watch?v=0U_7KTXvWVY">Matt Gray</a>. One way to apply these categories is by setting them in a spreadsheet and writing down various post titles that come to mind. For example, in the <em>tips and tricks</em> category (I discuss this category next) you could write the following:</p><ol><li><p>How to convert any value in javascript to a boolean</p></li><li><p>How to use the null coalescing operator in javascript</p></li></ol><p>Regardless of how you use these categories, the goal is for them to organize your creative thinking instead of trying to curate ideas from scratch. The remaining of the article will focus on the different categories that can help you create consistently on platforms like LinkedIn.</p><h3>Tips and Tricks</h3><p>As a Software Engineer who regularly engages on social media platforms like LinkedIn, you&#8217;ve probably come across a post showing you how to do some nifty thing in Javascript or a popular framework like React. Tips and tricks are a great way to build authority and demonstrate your technical ability. Next time you're looking for inspiration for your LinkedIn posts, consider highlighting those small yet invaluable  skills that could benefit your audience.</p><p><em>If you don&#8217;t know any tips and tricks, I encourage you to learn some and share with your audience. By doing this, you&#8217;ll continue to grow your craft and build your brand</em></p><h3><strong>Lessons</strong></h3><p>If you&#8217;re struggling to find ideas for your LinkedIn post as a Software Engineer, think about the lessons you&#8217;ve learned along the way that can help someone else in their tech journey. Did you spend way too much on a bootcamp when you could of took a more affordable online course? Did you get a degree when you could of went to a bootcamp? Whatever the lesson, be willing to be vulnerable and share with your audience for their benefit. Here&#8217;s a personal lesson:</p><p><em>As I look back on my journey, one big lesson sticks out to me: I should of started small by building simple landing pages. Had I done this, I would had been prepared for entry level jobs that only required basic html and css skills. </em></p><p>When my audience hears this, they will value their small wins and not be overwhelmed with all there is to know in the tech industry.</p><h3>Playbooks</h3><p>When I think of <em>playbooks</em>, I think of what actions and strategies did someone use to drive their desired results. As a Software Engineer, you can talk about study habits, sleep routines, or any habit that drove any victories you&#8217;ve achieved. You can also observe and discuss someone else&#8217;s playbook in your post and how you plan on using their tactics</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://devwithdevontae.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://devwithdevontae.substack.com/subscribe?"><span>Subscribe now</span></a></p><p></p><h3>List</h3><p>The idea behind list or listicles, a term I learned from <a href="https://www.youtube.com/watch?v=D_12KNeS07k&amp;t=505s">Justin Welsh</a>, is to give your audience a list of things that could be beneficial for them. For example, you could list 7 courses you took that helped you level up as a Software Engineer. Or a list of &#8220;go to&#8221; Node packages you use in every project. You could even list new javascript features like <a href="https://tc39.es/proposal-temporal/docs/">temporal</a> that may be introduced in the Javascript ecosystem.</p><h3>Personal stories</h3><p>By personal stories, I don&#8217;t mean <em>Situationships</em> or seasons in your life that include &#8220;juicy details&#8221;. I mean personal stories that reflect your journey as a Software Engineer. Personal stories are a great way to connect with your audience, future clients, and/or employers. In a world were A.I is ever increasing, I believe personal stories, based in truth, will gain tremendous value. An example of a personal story, as a Software Engineer, could be the hardship of trying to find your first job and how you managed to stay positive and resilient through the process. Or it could be how you weren&#8217;t resilient and how you plan to be going forward. I&#8217;m persuaded the more vulnerable we are as humans, the more we connect with each other.</p><h3>Tradeoffs </h3><p>As a Software Engineer, recognizing tradeoffs is crucial to writing good code. Recognizing tradeoffs is also a good way to spark ideas for post to provide value to your audience. An example of a tradeoff post could be the tradeoffs between Next.js and Remix. Or the tradeoffs between using Zustand and Redux.</p><h3>Observations</h3><p>The Observation post should focus on trends or patterns you&#8217;ve observed in the tech industry. For example, I&#8217;ve noticed from being in the industry as a full time and contractor, that React Native and Firebase is a <em>go to</em> stack among engineering teams. Making your audience aware of this can provide value in streamlining what technologies they should focus on.</p><h3>Contrarian </h3><p>The Contrarian post is focused on challenging established ideas and providing a new perspective. For example, using the <a href="https://react.dev/learn/passing-data-deeply-with-context#use-cases-for-context">Context API</a> as a global state manager is a an accepted practice. But based on research, I would challenge this idea and say it shouldn&#8217;t be used for global state. Instead, it should be used to avoid prop drilling per Reacts docs. </p><p><em>The contrarian post isn&#8217;t for the faint of heart. Be ready for push back with this one.</em></p><h3>Past vs Present</h3><p>The past vs present post can take on various forms but the heart behind it is this: Communicating with your audience how something (i.e tech market, frameworks, languages,&#8230;) used to be one way and how its changed. For example, maybe you believed Redux wasn&#8217;t the way to go at some point in time. But since <a href="https://redux-toolkit.js.org/rtk-query/overview">RTK</a> has streamlined the process, you now think Redux is a viable competitor in the world of state management. Maybe you use to think React Query was necessary. But with Server Components popping up, you&#8217;re thinking differently. Whatever the case, the Past vs Present post is a good way to provide your audience with a Birds Eye view on the ever changing landscape in tech.</p><h3>Word of encouragement</h3><p>These categories will most likely serve you best when you do the following:</p><ol><li><p>Schedule a time to write</p></li><li><p>Start small (i.e 5 LinkedIn post a week)</p></li><li><p>Be authentic </p></li></ol><h3>Tell me about your results</h3><p>If you decide to use these categories to curate LinkedIn post, <a href="https://www.linkedin.com/in/devontaemoore-react-developer/">tell me how it goes</a>.</p><p>&#9996;&#127998;</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://devwithdevontae.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Dev with DeVontae! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[I Would Only Join a Bootcamp If...]]></title><description><![CDATA[Practical advice on how to decipher between a bootcamp that will help you or simply take your money]]></description><link>https://devwithdevontae.substack.com/p/i-would-only-join-a-bootcamp-if</link><guid isPermaLink="false">https://devwithdevontae.substack.com/p/i-would-only-join-a-bootcamp-if</guid><dc:creator><![CDATA[DeVontae Moore]]></dc:creator><pubDate>Sat, 20 Apr 2024 19:39:28 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!C6sn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22d15bcc-8bce-4a6c-bc16-bcff6e8413c3_1280x853.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!C6sn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22d15bcc-8bce-4a6c-bc16-bcff6e8413c3_1280x853.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!C6sn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22d15bcc-8bce-4a6c-bc16-bcff6e8413c3_1280x853.jpeg 424w, https://substackcdn.com/image/fetch/$s_!C6sn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22d15bcc-8bce-4a6c-bc16-bcff6e8413c3_1280x853.jpeg 848w, https://substackcdn.com/image/fetch/$s_!C6sn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22d15bcc-8bce-4a6c-bc16-bcff6e8413c3_1280x853.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!C6sn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22d15bcc-8bce-4a6c-bc16-bcff6e8413c3_1280x853.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!C6sn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22d15bcc-8bce-4a6c-bc16-bcff6e8413c3_1280x853.jpeg" width="1280" height="853" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/22d15bcc-8bce-4a6c-bc16-bcff6e8413c3_1280x853.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:853,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:180986,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!C6sn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22d15bcc-8bce-4a6c-bc16-bcff6e8413c3_1280x853.jpeg 424w, https://substackcdn.com/image/fetch/$s_!C6sn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22d15bcc-8bce-4a6c-bc16-bcff6e8413c3_1280x853.jpeg 848w, https://substackcdn.com/image/fetch/$s_!C6sn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22d15bcc-8bce-4a6c-bc16-bcff6e8413c3_1280x853.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!C6sn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22d15bcc-8bce-4a6c-bc16-bcff6e8413c3_1280x853.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Image by <a href="https://pixabay.com/users/startupstockphotos-690514/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=594125">StartupStockPhotos</a> from <a href="https://pixabay.com//?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=594125">Pixabay</a></p><p>Deciding to invest time and resources into a coding bootcamp is a monumental choice for anyone aspiring to break into the tech industry. It&#8217;s not uncommon for a junior dev to ask, &#8220;Should I join a bootcamp or go university?&#8221; At the end of the day, I can&#8217;t answer this question directly for anyone. But what I can do is share what I would look for based on past experiences in the tech industry. And based on this insight, I hope it will help you make an informed decision on whether a bootcamp is worth your time, energy and money. In light of this, I would only join a bootcamp if&#8230;</p><h4><strong>They set reasonable expectations </strong></h4><p>There are a lot of bootcamp marketing that suggest you can get a full time job with 6 months experience. Based on my own observations and personal experience, this is highly unlikely. It took me a year and some change before I landed a full time job in tech. And this time frame seems to be the norm as of this writing. If a bootcamp is &#8220;selling you the dream&#8221;, I would consider this a red flag. If they&#8217;re setting reasonable expectations and willing to share journey&#8217;s similar to mine, they might be worth your time.</p><h4><strong>Its taught by at least one Senior Engineer</strong></h4><p>The opportunity to learn from senior engineers is invaluable. Their guidance through code reviews and insights into modern coding practices, such as the D.R.Y. principle and clean code, is fundamental. The mentorship from those who've navigated the tech landscape is vital to your professional development. I speak with confidence about these things because I&#8217;ve personally been trained by senior engineers and have seen how their mentorship and guidance can excel the learning process. With this in mind, I highly encourage  you to consider a bootcamp where you will receive extensive training from senior engineers or engineers with more experience than you (i.e a mid level engineer).</p><h4><strong>It Includes comprehensive coverage on software design principles</strong></h4><p>In an industry often dazzled by the latest and greatest frameworks and languages, the timeless principles of software design can get lost in the noise. If a bootcamp emphasizes foundational concepts like D.R.Y. and Orthogonality, they will equip you with the skill set to build resilient and scalable code regardless of the tech stack you&#8217;re engaged in. I learned these principles from a previous <a href="https://devwithdevontae.substack.com/p/3-things-i-learned-from-losing-my">employer</a> and it completely changed my approach to code. </p><h4><strong>They teach modern frameworks</strong></h4><p>The tech industry is ever-evolving, and so are its tools. A bootcamp should not only introduce you to Software design principles but also ensure you&#8217;re comfortable using contemporary frameworks. These are the tools you&#8217;ll likely encounter in today&#8217;s tech environment and familiarity with them can significantly ease your transition into the workforce. With this in consideration, I encourage you to consider bootcamps that stay up to date with the latest technologies. If you&#8217;re considering a bootcamp as of this writing, I would check and see if they teach one or more of the following: React, Next.js, React Native,Tailwind, and/or Express.js. </p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://devwithdevontae.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://devwithdevontae.substack.com/subscribe?"><span>Subscribe now</span></a></p><p></p><h4><strong>Code reviews are given by Senior Engineers</strong></h4><p>Earlier I mentioned that I wouldn&#8217;t a join a bootcamp unless it was taught by senior engineers. But as the saying goes, there&#8217;s more to the story. Reflecting on my journey, the constructive feedback from code reviews conducted by seasoned engineers was a cornerstone of my growth. As highlighted by the wisdom in Proverbs 16:20, "Those who listen to instruction will prosper." Engaging in this iterative process of review and improvement is crucial for honing your coding skills.</p><h4><strong>Cloud training is part of the curriculum</strong></h4><p>As the industry leans more towards backend and deployment skills, understanding cloud services is becoming vital. A bootcamp that includes cloud training acknowledges the shifting landscape of tech and will prepare you for the challenges and opportunities that occur in deploying and managing applications at scale.</p><h4><strong>Database management skills are taught</strong></h4><p>Data is often described as the <a href="https://www.youtube.com/watch?v=QGv02fDcdg4">new oil</a>. If this is true, becoming skilled in creating and querying databases will be to your advantage. A forward thinking bootcamp will cover the fundamentals of database management and design, as they teach you the critical role data plays in technology.</p><h4><strong>Word of caution</strong></h4><p>The following list isn&#8217;t meant to say, &#8220;If a bootcamp doesn&#8217;t meet ALL these requirements, avoid them&#8221;. Instead, it should be a guideline for you to determine what value you will gain from a bootcamp and is it worth the cost of admission. I believe there are a lot of bootcamps whose main intent is to capitalize on the gold rush known as &#8220;breaking into tech&#8221;, instead of honestly communicating to career changers about the realities of the industry and the necessary skills that are required. This article is an attempt to engage in the honest conversation.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://devwithdevontae.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Dev with DeVontae! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[How to use typescript with Cloud Firestore functions and React ]]></title><description><![CDATA[typescript + firebase + React = &#128293;]]></description><link>https://devwithdevontae.substack.com/p/how-to-use-typescript-with-cloud</link><guid isPermaLink="false">https://devwithdevontae.substack.com/p/how-to-use-typescript-with-cloud</guid><dc:creator><![CDATA[DeVontae Moore]]></dc:creator><pubDate>Sun, 26 Nov 2023 11:58:37 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!tw43!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e5b4686-46ca-4183-8bc9-6c6aeb5b28ab_1280x960.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tw43!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e5b4686-46ca-4183-8bc9-6c6aeb5b28ab_1280x960.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tw43!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e5b4686-46ca-4183-8bc9-6c6aeb5b28ab_1280x960.jpeg 424w, https://substackcdn.com/image/fetch/$s_!tw43!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e5b4686-46ca-4183-8bc9-6c6aeb5b28ab_1280x960.jpeg 848w, https://substackcdn.com/image/fetch/$s_!tw43!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e5b4686-46ca-4183-8bc9-6c6aeb5b28ab_1280x960.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!tw43!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e5b4686-46ca-4183-8bc9-6c6aeb5b28ab_1280x960.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tw43!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e5b4686-46ca-4183-8bc9-6c6aeb5b28ab_1280x960.jpeg" width="1280" height="960" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9e5b4686-46ca-4183-8bc9-6c6aeb5b28ab_1280x960.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:960,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:364885,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!tw43!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e5b4686-46ca-4183-8bc9-6c6aeb5b28ab_1280x960.jpeg 424w, https://substackcdn.com/image/fetch/$s_!tw43!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e5b4686-46ca-4183-8bc9-6c6aeb5b28ab_1280x960.jpeg 848w, https://substackcdn.com/image/fetch/$s_!tw43!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e5b4686-46ca-4183-8bc9-6c6aeb5b28ab_1280x960.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!tw43!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e5b4686-46ca-4183-8bc9-6c6aeb5b28ab_1280x960.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Image by <a href="https://pixabay.com/users/lumenbrite-2478906/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=2167299">lumenbrite</a> from <a href="https://pixabay.com//?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=2167299">Pixabay</a></p><p><strong>prerequisites: Basic understanding of React and Typescript</strong></p><p>Currently, typescript is all the rage and is certainly becoming a mandatory skill javascript developers should know. In this article, you will learn about <em>type inference</em>, <em>constrained generics</em>, <em>iterating over keys from a type</em> and more. I will also demonstrate how these tools work in the context of a React/React Native project that is using Firebase as a backend. The examples I use will be based on a few observations and issues I came across while working on a personal project.</p><h3>The issue at hand</h3><p>While working on a React Native app for my portfolio, I stumbled across a typing issue while implementing a feature that allows a user to update their account information. In order to implement this feature, I used the <a href="https://firebase.google.com/docs/firestore/manage-data/add-data#update-data">updateDoc</a> method given to us from Firebase. The beauty of this method is it allows developers to update some parts of a document without overriding the whole document. The example below will demonstrate what our function will look like without types. It&#8217;s part of an <a href="https://devwithdevontae.substack.com/p/how-to-use-rtk-query-with-firebase">api service layer.</a></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0Cyt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b2a4ee4-0c20-4989-bce0-447930916de2_1840x578.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0Cyt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b2a4ee4-0c20-4989-bce0-447930916de2_1840x578.png 424w, https://substackcdn.com/image/fetch/$s_!0Cyt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b2a4ee4-0c20-4989-bce0-447930916de2_1840x578.png 848w, https://substackcdn.com/image/fetch/$s_!0Cyt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b2a4ee4-0c20-4989-bce0-447930916de2_1840x578.png 1272w, https://substackcdn.com/image/fetch/$s_!0Cyt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b2a4ee4-0c20-4989-bce0-447930916de2_1840x578.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0Cyt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b2a4ee4-0c20-4989-bce0-447930916de2_1840x578.png" width="1456" height="457" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9b2a4ee4-0c20-4989-bce0-447930916de2_1840x578.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:457,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:320920,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!0Cyt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b2a4ee4-0c20-4989-bce0-447930916de2_1840x578.png 424w, https://substackcdn.com/image/fetch/$s_!0Cyt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b2a4ee4-0c20-4989-bce0-447930916de2_1840x578.png 848w, https://substackcdn.com/image/fetch/$s_!0Cyt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b2a4ee4-0c20-4989-bce0-447930916de2_1840x578.png 1272w, https://substackcdn.com/image/fetch/$s_!0Cyt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b2a4ee4-0c20-4989-bce0-447930916de2_1840x578.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The code below will display the state being passed to the <em><strong>updatedInfo</strong></em> argument.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!N6Lc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33fc6672-7fee-4d8f-9a69-8a37f72c7b70_1840x578.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!N6Lc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33fc6672-7fee-4d8f-9a69-8a37f72c7b70_1840x578.png 424w, https://substackcdn.com/image/fetch/$s_!N6Lc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33fc6672-7fee-4d8f-9a69-8a37f72c7b70_1840x578.png 848w, https://substackcdn.com/image/fetch/$s_!N6Lc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33fc6672-7fee-4d8f-9a69-8a37f72c7b70_1840x578.png 1272w, https://substackcdn.com/image/fetch/$s_!N6Lc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33fc6672-7fee-4d8f-9a69-8a37f72c7b70_1840x578.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!N6Lc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33fc6672-7fee-4d8f-9a69-8a37f72c7b70_1840x578.png" width="1456" height="457" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/33fc6672-7fee-4d8f-9a69-8a37f72c7b70_1840x578.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:457,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:301220,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!N6Lc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33fc6672-7fee-4d8f-9a69-8a37f72c7b70_1840x578.png 424w, https://substackcdn.com/image/fetch/$s_!N6Lc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33fc6672-7fee-4d8f-9a69-8a37f72c7b70_1840x578.png 848w, https://substackcdn.com/image/fetch/$s_!N6Lc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33fc6672-7fee-4d8f-9a69-8a37f72c7b70_1840x578.png 1272w, https://substackcdn.com/image/fetch/$s_!N6Lc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33fc6672-7fee-4d8f-9a69-8a37f72c7b70_1840x578.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>When I decided to type my <em><strong>updateUser</strong></em> function, I utilized standard typing practices:</p><ol><li><p>I made <em><strong>id</strong></em><strong> </strong>a string type</p></li><li><p>I made the <em><strong>return type</strong></em> a Promise&lt;void&gt;</p></li><li><p>And I wanted to make sure any values passed to updatedInfo matched my <em><strong>User type</strong></em></p></li></ol><p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wGCy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48bd5035-d5c2-4064-a23d-761519dfe791_1840x578.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wGCy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48bd5035-d5c2-4064-a23d-761519dfe791_1840x578.png 424w, https://substackcdn.com/image/fetch/$s_!wGCy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48bd5035-d5c2-4064-a23d-761519dfe791_1840x578.png 848w, https://substackcdn.com/image/fetch/$s_!wGCy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48bd5035-d5c2-4064-a23d-761519dfe791_1840x578.png 1272w, https://substackcdn.com/image/fetch/$s_!wGCy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48bd5035-d5c2-4064-a23d-761519dfe791_1840x578.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wGCy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48bd5035-d5c2-4064-a23d-761519dfe791_1840x578.png" width="1456" height="457" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/48bd5035-d5c2-4064-a23d-761519dfe791_1840x578.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:457,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:330737,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!wGCy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48bd5035-d5c2-4064-a23d-761519dfe791_1840x578.png 424w, https://substackcdn.com/image/fetch/$s_!wGCy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48bd5035-d5c2-4064-a23d-761519dfe791_1840x578.png 848w, https://substackcdn.com/image/fetch/$s_!wGCy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48bd5035-d5c2-4064-a23d-761519dfe791_1840x578.png 1272w, https://substackcdn.com/image/fetch/$s_!wGCy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48bd5035-d5c2-4064-a23d-761519dfe791_1840x578.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The obstacle appeared when I decided to type updatedInfo with my <em><strong>User type</strong></em>. When I tried to do this, I received the following error:</p><blockquote><p>Argument of type 'User' is not assignable to parameter of type '{ [x: string]: any; }</p></blockquote><p>I could of used the type <em><strong>unknown</strong>, </em>but<em> </em>upon further investigation, I learned I could create a <a href="https://www.typescriptlang.org/docs/handbook/2/mapped-types.html#handbook-content">type on the fly</a> by iterating over the keys from my User type.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!G0gi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4024a2a-6051-4b4f-a6e1-6e2aa7119439_1840x624.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!G0gi!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4024a2a-6051-4b4f-a6e1-6e2aa7119439_1840x624.png 424w, https://substackcdn.com/image/fetch/$s_!G0gi!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4024a2a-6051-4b4f-a6e1-6e2aa7119439_1840x624.png 848w, https://substackcdn.com/image/fetch/$s_!G0gi!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4024a2a-6051-4b4f-a6e1-6e2aa7119439_1840x624.png 1272w, https://substackcdn.com/image/fetch/$s_!G0gi!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4024a2a-6051-4b4f-a6e1-6e2aa7119439_1840x624.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!G0gi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4024a2a-6051-4b4f-a6e1-6e2aa7119439_1840x624.png" width="1456" height="494" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d4024a2a-6051-4b4f-a6e1-6e2aa7119439_1840x624.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:494,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:353279,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!G0gi!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4024a2a-6051-4b4f-a6e1-6e2aa7119439_1840x624.png 424w, https://substackcdn.com/image/fetch/$s_!G0gi!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4024a2a-6051-4b4f-a6e1-6e2aa7119439_1840x624.png 848w, https://substackcdn.com/image/fetch/$s_!G0gi!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4024a2a-6051-4b4f-a6e1-6e2aa7119439_1840x624.png 1272w, https://substackcdn.com/image/fetch/$s_!G0gi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4024a2a-6051-4b4f-a6e1-6e2aa7119439_1840x624.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The <em><strong>keyof  User </strong></em>syntax will return a union of <em><strong>key values</strong></em> from my User type for typescript to iterate over. After iterating over the User keys, the updatedInfo argument will have a type equal to the original User type as shown below. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VRCM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F049a6688-37b2-4d2f-bb4a-19e061c3c89c_1840x714.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VRCM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F049a6688-37b2-4d2f-bb4a-19e061c3c89c_1840x714.png 424w, https://substackcdn.com/image/fetch/$s_!VRCM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F049a6688-37b2-4d2f-bb4a-19e061c3c89c_1840x714.png 848w, https://substackcdn.com/image/fetch/$s_!VRCM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F049a6688-37b2-4d2f-bb4a-19e061c3c89c_1840x714.png 1272w, https://substackcdn.com/image/fetch/$s_!VRCM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F049a6688-37b2-4d2f-bb4a-19e061c3c89c_1840x714.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VRCM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F049a6688-37b2-4d2f-bb4a-19e061c3c89c_1840x714.png" width="1456" height="565" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/049a6688-37b2-4d2f-bb4a-19e061c3c89c_1840x714.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:565,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:352958,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!VRCM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F049a6688-37b2-4d2f-bb4a-19e061c3c89c_1840x714.png 424w, https://substackcdn.com/image/fetch/$s_!VRCM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F049a6688-37b2-4d2f-bb4a-19e061c3c89c_1840x714.png 848w, https://substackcdn.com/image/fetch/$s_!VRCM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F049a6688-37b2-4d2f-bb4a-19e061c3c89c_1840x714.png 1272w, https://substackcdn.com/image/fetch/$s_!VRCM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F049a6688-37b2-4d2f-bb4a-19e061c3c89c_1840x714.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Now typescript is happy and we&#8217;re completely type safe.</p><p></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://devwithdevontae.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://devwithdevontae.substack.com/subscribe?"><span>Subscribe now</span></a></p><h3>Type inference</h3><p>lets say we didn&#8217;t implement a <em><strong>User type</strong></em> explicitly on our <a href="https://react.dev/learn/managing-state">local react state</a>. Instead, we decided to go with <a href="https://www.typescriptlang.org/docs/handbook/type-inference.html">type inference</a> by <em>only </em>setting an initial value as seen below. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8QDX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7f05728-d032-4f30-979b-488b81c0fed3_1840x668.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8QDX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7f05728-d032-4f30-979b-488b81c0fed3_1840x668.png 424w, https://substackcdn.com/image/fetch/$s_!8QDX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7f05728-d032-4f30-979b-488b81c0fed3_1840x668.png 848w, https://substackcdn.com/image/fetch/$s_!8QDX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7f05728-d032-4f30-979b-488b81c0fed3_1840x668.png 1272w, https://substackcdn.com/image/fetch/$s_!8QDX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7f05728-d032-4f30-979b-488b81c0fed3_1840x668.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8QDX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7f05728-d032-4f30-979b-488b81c0fed3_1840x668.png" width="1456" height="529" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a7f05728-d032-4f30-979b-488b81c0fed3_1840x668.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:529,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:331807,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!8QDX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7f05728-d032-4f30-979b-488b81c0fed3_1840x668.png 424w, https://substackcdn.com/image/fetch/$s_!8QDX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7f05728-d032-4f30-979b-488b81c0fed3_1840x668.png 848w, https://substackcdn.com/image/fetch/$s_!8QDX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7f05728-d032-4f30-979b-488b81c0fed3_1840x668.png 1272w, https://substackcdn.com/image/fetch/$s_!8QDX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7f05728-d032-4f30-979b-488b81c0fed3_1840x668.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>There&#8217;s a drawback to this approach. If I add a value to my state object (i.e.password), typescript wouldn&#8217;t throw an error with the current implementation. To remedy this situation, you can use generic constraints on the <em><strong>updateUser </strong></em>function. By adding a generic constraint (example below), we make it &#8220;mandatory&#8221; for the object being passed to the <em>updatedInfo </em>argument to possess the same keys as my <em><strong>User type</strong></em>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_GHN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa9c7c08-8a44-4aa4-a14c-c12c0532324a_1840x848.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_GHN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa9c7c08-8a44-4aa4-a14c-c12c0532324a_1840x848.png 424w, https://substackcdn.com/image/fetch/$s_!_GHN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa9c7c08-8a44-4aa4-a14c-c12c0532324a_1840x848.png 848w, https://substackcdn.com/image/fetch/$s_!_GHN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa9c7c08-8a44-4aa4-a14c-c12c0532324a_1840x848.png 1272w, https://substackcdn.com/image/fetch/$s_!_GHN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa9c7c08-8a44-4aa4-a14c-c12c0532324a_1840x848.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_GHN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa9c7c08-8a44-4aa4-a14c-c12c0532324a_1840x848.png" width="1456" height="671" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fa9c7c08-8a44-4aa4-a14c-c12c0532324a_1840x848.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:671,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:440921,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!_GHN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa9c7c08-8a44-4aa4-a14c-c12c0532324a_1840x848.png 424w, https://substackcdn.com/image/fetch/$s_!_GHN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa9c7c08-8a44-4aa4-a14c-c12c0532324a_1840x848.png 848w, https://substackcdn.com/image/fetch/$s_!_GHN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa9c7c08-8a44-4aa4-a14c-c12c0532324a_1840x848.png 1272w, https://substackcdn.com/image/fetch/$s_!_GHN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa9c7c08-8a44-4aa4-a14c-c12c0532324a_1840x848.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>By adding <em><strong>extends</strong></em> after the generic T, I&#8217;m telling typescript that the value of T must be constrained to a certain type. In this example, our generic is constrained to a union of key values given to us via <em><strong>keyof User</strong></em>. Now if I try to add something to my React state that doesn&#8217;t match my User model (as demonstrated below), I will receive a typescript error.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JpJ0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4eee2249-380f-457a-8a06-a2ec1ab14f4d_1840x668.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JpJ0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4eee2249-380f-457a-8a06-a2ec1ab14f4d_1840x668.png 424w, https://substackcdn.com/image/fetch/$s_!JpJ0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4eee2249-380f-457a-8a06-a2ec1ab14f4d_1840x668.png 848w, https://substackcdn.com/image/fetch/$s_!JpJ0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4eee2249-380f-457a-8a06-a2ec1ab14f4d_1840x668.png 1272w, https://substackcdn.com/image/fetch/$s_!JpJ0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4eee2249-380f-457a-8a06-a2ec1ab14f4d_1840x668.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JpJ0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4eee2249-380f-457a-8a06-a2ec1ab14f4d_1840x668.png" width="1456" height="529" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4eee2249-380f-457a-8a06-a2ec1ab14f4d_1840x668.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:529,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:337275,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!JpJ0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4eee2249-380f-457a-8a06-a2ec1ab14f4d_1840x668.png 424w, https://substackcdn.com/image/fetch/$s_!JpJ0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4eee2249-380f-457a-8a06-a2ec1ab14f4d_1840x668.png 848w, https://substackcdn.com/image/fetch/$s_!JpJ0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4eee2249-380f-457a-8a06-a2ec1ab14f4d_1840x668.png 1272w, https://substackcdn.com/image/fetch/$s_!JpJ0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4eee2249-380f-457a-8a06-a2ec1ab14f4d_1840x668.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>A quick note on type inference vs explicit types</h3><p>As developers, one of the biggest obstacles we will face throughout our career is Company A will use certain standards and practices that Company B wont. This is why I decided to demonstrate two different scenarios and solutions concerning our typing issue. The goal of this article isn&#8217;t to make a claim that one is better than the other but to show the nuance approaches to typescript and React. I hope you learned something new. And if you found value from this post, share, comment, or subscribe to my newsletter.</p><p></p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://devwithdevontae.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Dev with DeVontae! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;c4c7d4cb-a41b-4aef-a50d-266ba7d64333&quot;,&quot;caption&quot;:&quot;Image by Pexels from Pixabay Prerequisite: Basic familiarity with Firebase concepts like collections, documents, and queries In this two part series, you will learn how to implement RTK query in a React Native project backed by Firebase. Part one will teach you how to build an API layer when building mobile/web apps and why you need one. In part two of th&#8230;&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;How to use RTK query with Firebase and React Native pt1&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:131224638,&quot;name&quot;:&quot;DeVontae Moore&quot;,&quot;bio&quot;:&quot;I'm a Software Engineer who loves to learn from his experiences and observations for the benefit of others.My current focus is React Native and typescript. &quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8578cabc-3adf-4971-be36-e0f2f2c17096_192x200.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2023-08-31T17:34:48.338Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f095180-efa5-40d1-9eb3-30de29fe2f76_1280x853.jpeg&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://devwithdevontae.substack.com/p/how-to-use-rtk-query-with-firebase&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:136557813,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;Dev with DeVontae&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4400689f-210c-4a9f-bc88-ea77852073e0_256x256.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div>]]></content:encoded></item><item><title><![CDATA[How to use RTK query with Firebase and React Native pt2]]></title><description><![CDATA[RTK query + Firebase + React Native = &#128293;]]></description><link>https://devwithdevontae.substack.com/p/how-to-use-rtk-query-with-firebase-9cc</link><guid isPermaLink="false">https://devwithdevontae.substack.com/p/how-to-use-rtk-query-with-firebase-9cc</guid><dc:creator><![CDATA[DeVontae Moore]]></dc:creator><pubDate>Tue, 12 Sep 2023 17:03:26 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!lKtT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8304023e-39fd-4c63-8909-c3e30da838ca_1280x743.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lKtT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8304023e-39fd-4c63-8909-c3e30da838ca_1280x743.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lKtT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8304023e-39fd-4c63-8909-c3e30da838ca_1280x743.jpeg 424w, https://substackcdn.com/image/fetch/$s_!lKtT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8304023e-39fd-4c63-8909-c3e30da838ca_1280x743.jpeg 848w, https://substackcdn.com/image/fetch/$s_!lKtT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8304023e-39fd-4c63-8909-c3e30da838ca_1280x743.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!lKtT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8304023e-39fd-4c63-8909-c3e30da838ca_1280x743.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lKtT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8304023e-39fd-4c63-8909-c3e30da838ca_1280x743.jpeg" width="1280" height="743" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8304023e-39fd-4c63-8909-c3e30da838ca_1280x743.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:743,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:43470,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!lKtT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8304023e-39fd-4c63-8909-c3e30da838ca_1280x743.jpeg 424w, https://substackcdn.com/image/fetch/$s_!lKtT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8304023e-39fd-4c63-8909-c3e30da838ca_1280x743.jpeg 848w, https://substackcdn.com/image/fetch/$s_!lKtT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8304023e-39fd-4c63-8909-c3e30da838ca_1280x743.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!lKtT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8304023e-39fd-4c63-8909-c3e30da838ca_1280x743.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Image by <a href="https://pixabay.com/users/mohamed_hassan-5229782/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=3967926">Mohamed Hassan</a> from <a href="https://pixabay.com//?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=3967926">Pixabay</a></p><p>In the first installment of our series on <a href="https://devwithdevontae.substack.com/p/how-to-use-rtk-query-with-firebase">RTK Query and Firebase</a>, we laid the foundation by establishing an API layer and learning about its advantages. In part two, you will learn how to leverage the API layer with RTK Query and gain benefits  such as <a href="https://redux-toolkit.js.org/rtk-query/usage/cache-behavior">avoiding unnecessary calls to our Firebase database</a> when the data hasn&#8217;t changed.</p><h4>What is RTK query</h4><p>Similar to <a href="https://tanstack.com/query/v3/docs/react/guides/does-this-replace-client-state">React Query</a>, RTK query is a data fetching and caching tool. When you request data with Firestore functions, RTK query is responsible for executing the request, providing the results from the request, and the current state of your request (i.e, isLoading, isError, isSuccess). These request are given via the API layer created in <a href="https://devwithdevontae.substack.com/i/136557813/why-you-should-create-an-api-layer">part one of this series</a>. The rest of the series will focus on implementing our Firebase API layer with RTK query so you will gain the benefits of <a href="https://redux-toolkit.js.org/rtk-query/usage/cache-behavior">caching</a> and <a href="https://redux-toolkit.js.org/rtk-query/usage/automated-refetching">invalidation</a>.</p><h4>How to implement RTK query</h4><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!78JA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdeb386af-f618-45ec-8c2f-106c24c14529_1630x496.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!78JA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdeb386af-f618-45ec-8c2f-106c24c14529_1630x496.png 424w, https://substackcdn.com/image/fetch/$s_!78JA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdeb386af-f618-45ec-8c2f-106c24c14529_1630x496.png 848w, https://substackcdn.com/image/fetch/$s_!78JA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdeb386af-f618-45ec-8c2f-106c24c14529_1630x496.png 1272w, https://substackcdn.com/image/fetch/$s_!78JA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdeb386af-f618-45ec-8c2f-106c24c14529_1630x496.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!78JA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdeb386af-f618-45ec-8c2f-106c24c14529_1630x496.png" width="1456" height="443" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/deb386af-f618-45ec-8c2f-106c24c14529_1630x496.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:443,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:236884,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!78JA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdeb386af-f618-45ec-8c2f-106c24c14529_1630x496.png 424w, https://substackcdn.com/image/fetch/$s_!78JA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdeb386af-f618-45ec-8c2f-106c24c14529_1630x496.png 848w, https://substackcdn.com/image/fetch/$s_!78JA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdeb386af-f618-45ec-8c2f-106c24c14529_1630x496.png 1272w, https://substackcdn.com/image/fetch/$s_!78JA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdeb386af-f618-45ec-8c2f-106c24c14529_1630x496.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Lets start by examining the variable name <strong>menuItemsApiSlice</strong> from the code example above. The <em>slice</em> suffix is a naming convention you'll often encounter when working with <em>RTK and RTK query</em>. This convention is employed because it signifies a distinct portion (<em>or slice</em>) of your overall state store. In our current example, it represents the part of our store that deals with <em>menuItems</em>. Setting up a store is beyond the scope of this tutorial. Instead, I'll illustrate how to integrate RTK query using the <a href="https://redux-toolkit.js.org/rtk-query/api/ApiProvider">API Provider</a> near the end of the lesson.</p><p>Another crucial aspect to highlight is the <strong>createApi function</strong>. As its name suggests, this function plays a pivotal role in crafting our API. It takes an object as its argument were each property assumes responsibility for managing your request to a backend server. The details of each property will be explored in the upcoming sections.</p><h4><strong>baseQuery</strong></h4><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kMSi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb12040e5-dc76-4bc0-b6f1-f37eb413b3f7_1630x534.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kMSi!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb12040e5-dc76-4bc0-b6f1-f37eb413b3f7_1630x534.png 424w, https://substackcdn.com/image/fetch/$s_!kMSi!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb12040e5-dc76-4bc0-b6f1-f37eb413b3f7_1630x534.png 848w, https://substackcdn.com/image/fetch/$s_!kMSi!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb12040e5-dc76-4bc0-b6f1-f37eb413b3f7_1630x534.png 1272w, https://substackcdn.com/image/fetch/$s_!kMSi!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb12040e5-dc76-4bc0-b6f1-f37eb413b3f7_1630x534.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kMSi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb12040e5-dc76-4bc0-b6f1-f37eb413b3f7_1630x534.png" width="1456" height="477" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b12040e5-dc76-4bc0-b6f1-f37eb413b3f7_1630x534.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:477,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:266388,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!kMSi!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb12040e5-dc76-4bc0-b6f1-f37eb413b3f7_1630x534.png 424w, https://substackcdn.com/image/fetch/$s_!kMSi!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb12040e5-dc76-4bc0-b6f1-f37eb413b3f7_1630x534.png 848w, https://substackcdn.com/image/fetch/$s_!kMSi!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb12040e5-dc76-4bc0-b6f1-f37eb413b3f7_1630x534.png 1272w, https://substackcdn.com/image/fetch/$s_!kMSi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb12040e5-dc76-4bc0-b6f1-f37eb413b3f7_1630x534.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The <strong>baseQuery</strong> property is responsible for setting the root url of all your API request. Because we will be using Firebase, the <strong>fakeBaseQuery </strong>method is called. This is an alternative that RTK query gives us when we don&#8217;t have a traditional url like this: <strong>https://pokeapi.co/api/v2/</strong></p><p>If we were using a traditional url like the one above, our <em>baseQuery</em> property would accept a <strong>fetchBaseQuery</strong> method, which accepts an object with the property <strong>baseUrl,</strong>  instead of the <em>fakeBaseQuery<strong>. </strong></em></p><h4><strong>fetchBaseQuery Example</strong></h4><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Z_rg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84295bc9-3b54-4337-9fc3-c2fff67dd115_1630x534.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Z_rg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84295bc9-3b54-4337-9fc3-c2fff67dd115_1630x534.png 424w, https://substackcdn.com/image/fetch/$s_!Z_rg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84295bc9-3b54-4337-9fc3-c2fff67dd115_1630x534.png 848w, https://substackcdn.com/image/fetch/$s_!Z_rg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84295bc9-3b54-4337-9fc3-c2fff67dd115_1630x534.png 1272w, https://substackcdn.com/image/fetch/$s_!Z_rg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84295bc9-3b54-4337-9fc3-c2fff67dd115_1630x534.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Z_rg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84295bc9-3b54-4337-9fc3-c2fff67dd115_1630x534.png" width="1456" height="477" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/84295bc9-3b54-4337-9fc3-c2fff67dd115_1630x534.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:477,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:278636,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Z_rg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84295bc9-3b54-4337-9fc3-c2fff67dd115_1630x534.png 424w, https://substackcdn.com/image/fetch/$s_!Z_rg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84295bc9-3b54-4337-9fc3-c2fff67dd115_1630x534.png 848w, https://substackcdn.com/image/fetch/$s_!Z_rg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84295bc9-3b54-4337-9fc3-c2fff67dd115_1630x534.png 1272w, https://substackcdn.com/image/fetch/$s_!Z_rg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84295bc9-3b54-4337-9fc3-c2fff67dd115_1630x534.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h4>endpoints</h4><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2p9U!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41fa67e3-b64c-449f-a673-fdb6ae9463f1_1504x1748.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2p9U!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41fa67e3-b64c-449f-a673-fdb6ae9463f1_1504x1748.png 424w, https://substackcdn.com/image/fetch/$s_!2p9U!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41fa67e3-b64c-449f-a673-fdb6ae9463f1_1504x1748.png 848w, https://substackcdn.com/image/fetch/$s_!2p9U!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41fa67e3-b64c-449f-a673-fdb6ae9463f1_1504x1748.png 1272w, https://substackcdn.com/image/fetch/$s_!2p9U!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41fa67e3-b64c-449f-a673-fdb6ae9463f1_1504x1748.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2p9U!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41fa67e3-b64c-449f-a673-fdb6ae9463f1_1504x1748.png" width="1456" height="1692" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/41fa67e3-b64c-449f-a673-fdb6ae9463f1_1504x1748.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1692,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:746768,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!2p9U!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41fa67e3-b64c-449f-a673-fdb6ae9463f1_1504x1748.png 424w, https://substackcdn.com/image/fetch/$s_!2p9U!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41fa67e3-b64c-449f-a673-fdb6ae9463f1_1504x1748.png 848w, https://substackcdn.com/image/fetch/$s_!2p9U!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41fa67e3-b64c-449f-a673-fdb6ae9463f1_1504x1748.png 1272w, https://substackcdn.com/image/fetch/$s_!2p9U!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41fa67e3-b64c-449f-a673-fdb6ae9463f1_1504x1748.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>There&#8217;s plenty to cover in this code example. Lets take it one step at a time by starting with the <em>endpoints property</em>.</p><h5>endpoints</h5><p>This <strong>createApi</strong> function is responsible for creating your queries that will make calls to a backend server. How does it do this? By using a function (<em>assigned to the endpoints property</em>) that receives a <em>builder object</em> as an argument and returns an object that uses the properties from the builder object (i.e, builder.query) to make queries. All of this is demonstrated in the code above where <em>fetchMenuItems</em><strong> </strong>is using the <em><strong>builder.query</strong></em> method to make an api call to our Firestore database. At this point, we have officially connected our <a href="https://devwithdevontae.substack.com/i/136557813/firebase-api-layer">api layer created in pt</a>1 of this series, to RTK query. Lets now dive deeper in understanding the <em><strong>builder.query</strong></em><strong> </strong>method</p><h5>builder.query</h5><p>Currently our <strong>fetchMenuItems</strong> query is assigned the <strong>builder.query </strong>method. This method accepts an object as its value and is responsible for making <em>read request</em> to our database. The <strong>builder.query</strong> method expects two types. The first is a return type, while the second is a type parameter<strong>. </strong>The former represents the value the function assigned to <em>queryFn </em>should return. The latter represents the value this same function should receive as an argument<em>.</em> If you go back to <a href="https://devwithdevontae.substack.com/i/136557813/firebase-api-layer">part one of this series</a>, you will see we&#8217;re returning the exact shape our queryFn function expects.</p><p>Its also worth mentioning that the builder object also contains a mutation property (i.e, <strong>builder.mutation</strong>) for making <a href="https://redux-toolkit.js.org/rtk-query/usage/mutations">mutations</a> (<em>updates or deletes</em>) to the Firestore database. You will learn later how mutation queries can <a href="https://redux-toolkit.js.org/rtk-query/usage/automated-refetching#invalidating-tags">invalidate</a> data that was previously fetched.</p><h5>queryFn</h5><p>In the last section, you learned the return type and type parameter(s) our builder.query expects. Both are managed by the function given to the <em>queryFn property</em>. Because we passed void as the second type to our <strong>builder.query</strong> method, we don&#8217;t pass anything to our queryFn function. However, since we explicitly typed our return type to be an object with the properties <em>payload </em>and <em>lastDocument</em>, we must make sure our data property returns this exact object. </p><p>The reason I&#8217;m returning an object with the data property is because I&#8217;m using queryFn instead of <a href="https://redux-toolkit.js.org/rtk-query/api/createApi#query">query</a>. <strong>If I were using the fetchBaseQuery, mentioned earlier in the tutorial, I would had used the query property and wouldn&#8217;t need to return a data object.</strong>And if you didn&#8217;t return the appropriate object, you might receive the following error message below.</p><blockquote><p><em><strong>queryFn</strong></em><strong> did not return anything. It needs to return an object with either the shape `{ data: &lt;value&gt; }` or `{ error: &lt;value&gt; }` </strong></p></blockquote><p></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://devwithdevontae.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://devwithdevontae.substack.com/subscribe?"><span>Subscribe now</span></a></p><h4>tagTypes, providesTags, invalidatesTags</h4><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!65I0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f428659-ffb9-4964-b1c9-ef42f2a89e51_1504x1748.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!65I0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f428659-ffb9-4964-b1c9-ef42f2a89e51_1504x1748.png 424w, https://substackcdn.com/image/fetch/$s_!65I0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f428659-ffb9-4964-b1c9-ef42f2a89e51_1504x1748.png 848w, https://substackcdn.com/image/fetch/$s_!65I0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f428659-ffb9-4964-b1c9-ef42f2a89e51_1504x1748.png 1272w, https://substackcdn.com/image/fetch/$s_!65I0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f428659-ffb9-4964-b1c9-ef42f2a89e51_1504x1748.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!65I0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f428659-ffb9-4964-b1c9-ef42f2a89e51_1504x1748.png" width="1456" height="1692" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4f428659-ffb9-4964-b1c9-ef42f2a89e51_1504x1748.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1692,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:766239,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!65I0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f428659-ffb9-4964-b1c9-ef42f2a89e51_1504x1748.png 424w, https://substackcdn.com/image/fetch/$s_!65I0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f428659-ffb9-4964-b1c9-ef42f2a89e51_1504x1748.png 848w, https://substackcdn.com/image/fetch/$s_!65I0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f428659-ffb9-4964-b1c9-ef42f2a89e51_1504x1748.png 1272w, https://substackcdn.com/image/fetch/$s_!65I0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f428659-ffb9-4964-b1c9-ef42f2a89e51_1504x1748.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>So far you have the knowledge and skills and to read data from a Firestore database with RTK query via an API layer. But what happens if you decided to make a mutation to data that was previously read from the database? How does RTK query handle this scenario? The answer is &#8220;tags&#8221;. </p><p>In the code example above, you will notice our code introduces the <strong>tagTypes</strong> and <strong>providesTags</strong> properties. The <em>tagTypes</em> property allows you the ability to <a href="https://redux-toolkit.js.org/rtk-query/usage/automated-refetching#invalidating-tags">invalidate </a>data. And the <em>provideTags</em> properties allows you to <a href="https://redux-toolkit.js.org/rtk-query/usage/automated-refetching#providing-tags">provide tags</a> to a specific query so it will respond to invalidation. Lets break this down with the following example:</p><p>Lets say you mutate your Firestore database and this effects data that was previously read from your database. Because you created a tag (MenuItems) via <em>tagTypes</em> and provided that tag via <em>providesTags</em> to <strong>fetchMenuItems</strong><em>, fetchMenuItems would refetch the new data</em>. How can you make sure this process happens? By adding an <em>invalidatesTags with the same value as the providesTags property</em> <em>to a mutation query</em>. Below is an example of a <em>query mutation</em> that would trigger <em>fetchMenuItems</em> to get called again.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Jrih!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44624ecc-150e-4103-9c0d-8adfc27d22ff_1430x1658.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Jrih!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44624ecc-150e-4103-9c0d-8adfc27d22ff_1430x1658.png 424w, https://substackcdn.com/image/fetch/$s_!Jrih!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44624ecc-150e-4103-9c0d-8adfc27d22ff_1430x1658.png 848w, https://substackcdn.com/image/fetch/$s_!Jrih!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44624ecc-150e-4103-9c0d-8adfc27d22ff_1430x1658.png 1272w, https://substackcdn.com/image/fetch/$s_!Jrih!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44624ecc-150e-4103-9c0d-8adfc27d22ff_1430x1658.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Jrih!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44624ecc-150e-4103-9c0d-8adfc27d22ff_1430x1658.png" width="1430" height="1658" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/44624ecc-150e-4103-9c0d-8adfc27d22ff_1430x1658.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1658,&quot;width&quot;:1430,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:714167,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Jrih!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44624ecc-150e-4103-9c0d-8adfc27d22ff_1430x1658.png 424w, https://substackcdn.com/image/fetch/$s_!Jrih!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44624ecc-150e-4103-9c0d-8adfc27d22ff_1430x1658.png 848w, https://substackcdn.com/image/fetch/$s_!Jrih!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44624ecc-150e-4103-9c0d-8adfc27d22ff_1430x1658.png 1272w, https://substackcdn.com/image/fetch/$s_!Jrih!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44624ecc-150e-4103-9c0d-8adfc27d22ff_1430x1658.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h4>How to use queries with custom hooks</h4><p>Since our queries are established, we can implement them in our code base via hooks. <a href="https://redux-toolkit.js.org/rtk-query/api/created-api/hooks#hooks-overview">RTK will automatically generate this hooks</a> from the createApi method if you import them from @reduxjs/toolkit/query/react. Below is an example of the custom hook RTK query will automatically create behind the scenes for us.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!M3NQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb268de05-0b35-4860-9c55-e01215326a73_1660x496.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!M3NQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb268de05-0b35-4860-9c55-e01215326a73_1660x496.png 424w, https://substackcdn.com/image/fetch/$s_!M3NQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb268de05-0b35-4860-9c55-e01215326a73_1660x496.png 848w, https://substackcdn.com/image/fetch/$s_!M3NQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb268de05-0b35-4860-9c55-e01215326a73_1660x496.png 1272w, https://substackcdn.com/image/fetch/$s_!M3NQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb268de05-0b35-4860-9c55-e01215326a73_1660x496.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!M3NQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb268de05-0b35-4860-9c55-e01215326a73_1660x496.png" width="1456" height="435" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b268de05-0b35-4860-9c55-e01215326a73_1660x496.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:435,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:245468,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!M3NQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb268de05-0b35-4860-9c55-e01215326a73_1660x496.png 424w, https://substackcdn.com/image/fetch/$s_!M3NQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb268de05-0b35-4860-9c55-e01215326a73_1660x496.png 848w, https://substackcdn.com/image/fetch/$s_!M3NQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb268de05-0b35-4860-9c55-e01215326a73_1660x496.png 1272w, https://substackcdn.com/image/fetch/$s_!M3NQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb268de05-0b35-4860-9c55-e01215326a73_1660x496.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Here&#8217;s an example of the hook being used in a React component. Notice it provides the <a href="https://redux-toolkit.js.org/rtk-query/usage/queries#frequently-used-query-hook-return-values">status and results </a>of our network request with the following values: <strong>data</strong>, <strong>isError</strong>, <strong>isLoading</strong>. <strong>Refetch</strong> is used to force a refetch. I&#8217;ve used this feature in a React Native project when the users internet is disconnected and they need to refresh the screen.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_beT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f380d06-e024-484f-8e38-184d114e770f_1660x624.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_beT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f380d06-e024-484f-8e38-184d114e770f_1660x624.png 424w, https://substackcdn.com/image/fetch/$s_!_beT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f380d06-e024-484f-8e38-184d114e770f_1660x624.png 848w, https://substackcdn.com/image/fetch/$s_!_beT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f380d06-e024-484f-8e38-184d114e770f_1660x624.png 1272w, https://substackcdn.com/image/fetch/$s_!_beT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f380d06-e024-484f-8e38-184d114e770f_1660x624.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_beT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f380d06-e024-484f-8e38-184d114e770f_1660x624.png" width="1456" height="547" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8f380d06-e024-484f-8e38-184d114e770f_1660x624.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:547,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:315569,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!_beT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f380d06-e024-484f-8e38-184d114e770f_1660x624.png 424w, https://substackcdn.com/image/fetch/$s_!_beT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f380d06-e024-484f-8e38-184d114e770f_1660x624.png 848w, https://substackcdn.com/image/fetch/$s_!_beT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f380d06-e024-484f-8e38-184d114e770f_1660x624.png 1272w, https://substackcdn.com/image/fetch/$s_!_beT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f380d06-e024-484f-8e38-184d114e770f_1660x624.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h4>How to use RTK query with an API provider</h4><p>We have our API Layer integrated with RTK query and we have custom hooks that allow us to make API request in our React components. However, none of the functionality we&#8217;ve implemented will be useful until we incorporate an <a href="https://redux-toolkit.js.org/rtk-query/api/ApiProvider">API Provider</a> (or a store if you choose) with our <em>menuItemsApiSlice as an api value</em> in our <strong>App.tsx</strong> file.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!iRNv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7501dc3-03d3-4ad0-bb8b-6b2eaec112d9_1832x804.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!iRNv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7501dc3-03d3-4ad0-bb8b-6b2eaec112d9_1832x804.png 424w, https://substackcdn.com/image/fetch/$s_!iRNv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7501dc3-03d3-4ad0-bb8b-6b2eaec112d9_1832x804.png 848w, https://substackcdn.com/image/fetch/$s_!iRNv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7501dc3-03d3-4ad0-bb8b-6b2eaec112d9_1832x804.png 1272w, https://substackcdn.com/image/fetch/$s_!iRNv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7501dc3-03d3-4ad0-bb8b-6b2eaec112d9_1832x804.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!iRNv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7501dc3-03d3-4ad0-bb8b-6b2eaec112d9_1832x804.png" width="1456" height="639" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f7501dc3-03d3-4ad0-bb8b-6b2eaec112d9_1832x804.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:639,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:424511,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!iRNv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7501dc3-03d3-4ad0-bb8b-6b2eaec112d9_1832x804.png 424w, https://substackcdn.com/image/fetch/$s_!iRNv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7501dc3-03d3-4ad0-bb8b-6b2eaec112d9_1832x804.png 848w, https://substackcdn.com/image/fetch/$s_!iRNv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7501dc3-03d3-4ad0-bb8b-6b2eaec112d9_1832x804.png 1272w, https://substackcdn.com/image/fetch/$s_!iRNv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7501dc3-03d3-4ad0-bb8b-6b2eaec112d9_1832x804.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>This concludes today lesson. I hope you learned something new. If you have questions regarding this article, feel free to reach out to me on <a href="https://www.linkedin.com/in/devontaemoore-react-developer/">LinkedIn</a>.</p><p></p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://devwithdevontae.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Dev with DeVontae! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[How to use RTK query with Firebase and React Native pt1]]></title><description><![CDATA[RTK query + Firebase + React Native = &#128293;]]></description><link>https://devwithdevontae.substack.com/p/how-to-use-rtk-query-with-firebase</link><guid isPermaLink="false">https://devwithdevontae.substack.com/p/how-to-use-rtk-query-with-firebase</guid><dc:creator><![CDATA[DeVontae Moore]]></dc:creator><pubDate>Thu, 31 Aug 2023 17:34:48 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!kjYo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f095180-efa5-40d1-9eb3-30de29fe2f76_1280x853.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kjYo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f095180-efa5-40d1-9eb3-30de29fe2f76_1280x853.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kjYo!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f095180-efa5-40d1-9eb3-30de29fe2f76_1280x853.jpeg 424w, https://substackcdn.com/image/fetch/$s_!kjYo!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f095180-efa5-40d1-9eb3-30de29fe2f76_1280x853.jpeg 848w, https://substackcdn.com/image/fetch/$s_!kjYo!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f095180-efa5-40d1-9eb3-30de29fe2f76_1280x853.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!kjYo!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f095180-efa5-40d1-9eb3-30de29fe2f76_1280x853.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kjYo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f095180-efa5-40d1-9eb3-30de29fe2f76_1280x853.jpeg" width="1280" height="853" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3f095180-efa5-40d1-9eb3-30de29fe2f76_1280x853.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:853,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:164324,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!kjYo!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f095180-efa5-40d1-9eb3-30de29fe2f76_1280x853.jpeg 424w, https://substackcdn.com/image/fetch/$s_!kjYo!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f095180-efa5-40d1-9eb3-30de29fe2f76_1280x853.jpeg 848w, https://substackcdn.com/image/fetch/$s_!kjYo!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f095180-efa5-40d1-9eb3-30de29fe2f76_1280x853.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!kjYo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f095180-efa5-40d1-9eb3-30de29fe2f76_1280x853.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Image by <a href="https://pixabay.com/users/pexels-2286921/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=1839876">Pexels</a> from <a href="https://pixabay.com//?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=1839876">Pixabay</a></p><p><strong>Prerequisite</strong>: Basic familiarity with Firebase concepts like collections, documents, and queries</p><p>In this two part series, you will learn how to implement RTK query in a React Native project backed by Firebase. Part one will teach you how to build an API layer when building mobile/web apps and why you need one. In part two of this series, you will learn how to implement an API layer with RTK query. Both parts will focus on retrieving data from firestore, rather than altering it.</p><p>If you want to follow along in your own sandbox, import the <a href="https://www.npmjs.com/package/@reduxjs/toolkit">@reduxjs/toolkit package</a>. You&#8217;ll also need a Firebase backend connected. If you&#8217;re not familiar with setting up a Firebase project with React Native, you can check out a previous article I wrote <a href="https://devwithdevontae.substack.com/p/these-two-packages-will-connect-firebase">here</a>. Or watch this<a href="https://www.youtube.com/watch?v=TwxdOFcEah4"> video</a> starting around the 5 minute mark.</p><h3>Why you should create an API layer</h3><p>A very common practice in React is to use an useEffect hook to make API calls in a React component as demonstrated below.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Aee-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7bcfae9-ef6f-4b17-b89b-806430264c2d_1544x990.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Aee-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7bcfae9-ef6f-4b17-b89b-806430264c2d_1544x990.png 424w, https://substackcdn.com/image/fetch/$s_!Aee-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7bcfae9-ef6f-4b17-b89b-806430264c2d_1544x990.png 848w, https://substackcdn.com/image/fetch/$s_!Aee-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7bcfae9-ef6f-4b17-b89b-806430264c2d_1544x990.png 1272w, https://substackcdn.com/image/fetch/$s_!Aee-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7bcfae9-ef6f-4b17-b89b-806430264c2d_1544x990.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Aee-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7bcfae9-ef6f-4b17-b89b-806430264c2d_1544x990.png" width="1456" height="934" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a7bcfae9-ef6f-4b17-b89b-806430264c2d_1544x990.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:934,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:399353,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Aee-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7bcfae9-ef6f-4b17-b89b-806430264c2d_1544x990.png 424w, https://substackcdn.com/image/fetch/$s_!Aee-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7bcfae9-ef6f-4b17-b89b-806430264c2d_1544x990.png 848w, https://substackcdn.com/image/fetch/$s_!Aee-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7bcfae9-ef6f-4b17-b89b-806430264c2d_1544x990.png 1272w, https://substackcdn.com/image/fetch/$s_!Aee-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7bcfae9-ef6f-4b17-b89b-806430264c2d_1544x990.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>While this approach can work well with smaller applications, it will start to become a headache if you try to scale it across multiple components. What if you&#8217;re lead engineer decides to use Axios instead of fetch? You would need to update many components to accommodate such a decision. Such an event, would expose your design decision as being <strong>complex</strong>.</p><p>In his e-book, <a href="https://milkov.tech/assets/psd.pdf">&#8221;A philosophy of Software design&#8221;</a>,   John Ousterhout states <em>change amplification</em> as a symptom of complexity.</p><div class="pullquote"><p>The first symptom of complexity is that a <strong>seemingly simple change requires code modifications in many different places</strong>.</p></div><p>When you couple API calls to React components, you increase complexity within your code base as it grows because a simple change will require modifications in many different places. So how can you make your code less complex?</p><p>In his book, <a href="https://theroadtoenterprise.com/">&#8220;React, The Road To Enterprise&#8221;</a>, Thomas Findlay encourages developers to separate their API code from the rest of their code for the following benefits:</p><h5>Adaptability </h5><p>I will demonstrate how to create an API layer with Firebase. But what if you&#8217;re in a situation where the team lead decides to transition from Firebase to <a href="https://supabase.com/">Supabase</a>? Or what if your team hires a .NET developer and decides to build a custom made API? If you&#8217;ve created an API layer, it will be easier to adapt to these changes.</p><p><strong>standardisation </strong></p><p>When you create a separate API layer, you can avoid the temptation to use fetch in one part of your app and Axios in another. In other words, an API layer creates a path that future developers or you future self wont have to guess about.</p><p></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://devwithdevontae.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://devwithdevontae.substack.com/subscribe?"><span>Subscribe now</span></a></p><h3>Firebase API layer</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!aXIf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b488101-dc00-4445-97e7-999dc41e546d_1776x1658.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aXIf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b488101-dc00-4445-97e7-999dc41e546d_1776x1658.png 424w, https://substackcdn.com/image/fetch/$s_!aXIf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b488101-dc00-4445-97e7-999dc41e546d_1776x1658.png 848w, https://substackcdn.com/image/fetch/$s_!aXIf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b488101-dc00-4445-97e7-999dc41e546d_1776x1658.png 1272w, https://substackcdn.com/image/fetch/$s_!aXIf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b488101-dc00-4445-97e7-999dc41e546d_1776x1658.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aXIf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b488101-dc00-4445-97e7-999dc41e546d_1776x1658.png" width="1456" height="1359" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1b488101-dc00-4445-97e7-999dc41e546d_1776x1658.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1359,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:795339,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!aXIf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b488101-dc00-4445-97e7-999dc41e546d_1776x1658.png 424w, https://substackcdn.com/image/fetch/$s_!aXIf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b488101-dc00-4445-97e7-999dc41e546d_1776x1658.png 848w, https://substackcdn.com/image/fetch/$s_!aXIf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b488101-dc00-4445-97e7-999dc41e546d_1776x1658.png 1272w, https://substackcdn.com/image/fetch/$s_!aXIf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b488101-dc00-4445-97e7-999dc41e546d_1776x1658.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Lets break this code down. The first thing to notice is the file path. By creating an API directory and placing all of our code that hits &#8220;endpoints&#8221; on our backend, we create a layer between React Native and our backend. </p><p>Another point to notice is the <strong>menuItemsApi</strong> file holds code related to all menuItem features. Right now it only holds code to <em>getMenuItems</em> but in the future if I wanted a feature that allowed a user to <em>add menu items</em>, I would put it in the <strong>menuItemsApi</strong> file<strong>. </strong></p><p>Finally, if I decided to go with <a href="https://supabase.com/docs/guides/database/functions">Database functions from Supabase</a>,  I would replace my code in this directory instead of trying to update multiple parts of my app.</p><p><em>If you&#8217;re familiar with Firebase V9, you can skip the following section</em>. <em>If not, continue reading to understand the rest of the code in menuItemsApi.</em></p><h5><strong>Firebase V9 methods</strong></h5><p><strong>query</strong> - The query method, as the name suggest, is meant to query our database according to parameters a developer will set. Right now its querying my menu items collection according to the genre field. It will also limit my request to 3 documents per request.</p><p><strong>menuItemsRef </strong>- This variable represents the collection or data I want to query. Behind the scenes it looks like this:</p><p><strong>const menuItemsRef = collection(db, "Menu Items");</strong></p><p>The code above is telling firebase to allow us access to the Menu Items collection in our database</p><p><strong>orderBy - </strong>The orderBy method is responsible for how our returned documents will be sorted. By placing &#8220;genre&#8221; as an argument to the orderBy method, I&#8217;m telling Firebase to send me menu items in alphabetical order according to their genre. For example, my current database has menu items with the following genre: Burgers, BBQ, and Asian Food. With my current query and orderBy method, Firebase would return my documents in this order: <strong>Asian Food, BBQ, Burgers</strong></p><p><strong>limit </strong>- This method is responsible for limiting the amount of documents a query will return. My current example will return 3 documents at a time.</p><p><strong>getDocs - </strong>Opposite of <strong><a href="https://firebase.google.com/docs/firestore/query-data/get-data">getDoc</a></strong> which returns a single document, getDocs returns multiple documents and is appropriate when making queries without knowing the results in advance.</p><p><strong>lastDocument - </strong>This variable is holding the last item&#8217;s genre from the results of getDocs. This is the beginning of the process for creating pagination with <a href="https://firebase.google.com/docs/firestore/query-data/query-cursors">cursors</a>. <em>Pagination is beyond the scope of this article.</em></p><p><strong>payload</strong> -  This variable will receive the results from our getDocs request and with lastDocument will be given to RTK query to manage our request and server state. This will be demonstrated in part two of this series.</p><h3><strong>Updated useEffect example</strong></h3><p>If we revisit our previous useEffect example, we will see our code is more <a href="https://dmitripavlutin.com/orthogonal-react-components/">Orthogonal </a> or decoupled.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xbY5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25cb3f8c-1081-4290-9807-ff4f8f875497_1544x1036.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xbY5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25cb3f8c-1081-4290-9807-ff4f8f875497_1544x1036.png 424w, https://substackcdn.com/image/fetch/$s_!xbY5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25cb3f8c-1081-4290-9807-ff4f8f875497_1544x1036.png 848w, https://substackcdn.com/image/fetch/$s_!xbY5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25cb3f8c-1081-4290-9807-ff4f8f875497_1544x1036.png 1272w, https://substackcdn.com/image/fetch/$s_!xbY5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25cb3f8c-1081-4290-9807-ff4f8f875497_1544x1036.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xbY5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25cb3f8c-1081-4290-9807-ff4f8f875497_1544x1036.png" width="1456" height="977" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/25cb3f8c-1081-4290-9807-ff4f8f875497_1544x1036.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:977,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:399172,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!xbY5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25cb3f8c-1081-4290-9807-ff4f8f875497_1544x1036.png 424w, https://substackcdn.com/image/fetch/$s_!xbY5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25cb3f8c-1081-4290-9807-ff4f8f875497_1544x1036.png 848w, https://substackcdn.com/image/fetch/$s_!xbY5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25cb3f8c-1081-4290-9807-ff4f8f875497_1544x1036.png 1272w, https://substackcdn.com/image/fetch/$s_!xbY5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25cb3f8c-1081-4290-9807-ff4f8f875497_1544x1036.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Now if we decided to use Axios, Supabase, or something other database technology, we would only need to change the code in our API directory and not throughout the whole app. In part two, you will learn how to implement our API ayer in RTK query where you will gain the benefits of caching and network state management.</p><p></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://devwithdevontae.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://devwithdevontae.substack.com/subscribe?"><span>Subscribe now</span></a></p><h3>Ways to support my newsletter</h3><p>&#128421; If you believe this content is valuable, share it on social media</p><p>&#127908; If you believe I would be a good fit for a podcast, let your favorite podcaster know</p><h3>Connect with me</h3><p>Connect with me on <a href="https://www.linkedin.com/in/devontaemoore-react-developer/">LinkedIn!</a></p><p>Connect with me on <a href="https://twitter.com/DevwithDeVontae">Twitter!</a></p><h3>Related Articles:</h3><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;73c2df1e-7986-48ea-bdeb-9289e90bb349&quot;,&quot;caption&quot;:&quot;Image by RealToughCandy.com A common question I get from experienced React developers interested in React Native is, what are some of the differences between React and React Native. I will explain some core differences in today&#8217;s article. This will not be an exhaustive list but it will be a great starting point for those interested in learning about Reac&#8230;&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;React vs React Native Pt1&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:131224638,&quot;name&quot;:&quot;DeVontae Moore&quot;,&quot;bio&quot;:&quot;I'm a Software Engineer who loves to learn from his experiences and observations for the benefit of others.My current focus is React Native and typescript. &quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8578cabc-3adf-4971-be36-e0f2f2c17096_192x200.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2023-07-20T17:43:56.442Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd928f182-034e-41a1-b04c-3a63f97b8609_6000x4000.jpeg&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://devwithdevontae.substack.com/p/react-vs-react-native&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:135303787,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;Dev with DeVontae&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4400689f-210c-4a9f-bc88-ea77852073e0_256x256.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[React vs React Native pt2]]></title><description><![CDATA[Navigation, Text Input, and more]]></description><link>https://devwithdevontae.substack.com/p/react-vs-react-native-pt2</link><guid isPermaLink="false">https://devwithdevontae.substack.com/p/react-vs-react-native-pt2</guid><dc:creator><![CDATA[DeVontae Moore]]></dc:creator><pubDate>Thu, 27 Jul 2023 20:44:29 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!dujD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ee9cc6a-8a42-4ea9-a22a-c41ca66d7b6e_1280x1280.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dujD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ee9cc6a-8a42-4ea9-a22a-c41ca66d7b6e_1280x1280.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dujD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ee9cc6a-8a42-4ea9-a22a-c41ca66d7b6e_1280x1280.png 424w, https://substackcdn.com/image/fetch/$s_!dujD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ee9cc6a-8a42-4ea9-a22a-c41ca66d7b6e_1280x1280.png 848w, https://substackcdn.com/image/fetch/$s_!dujD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ee9cc6a-8a42-4ea9-a22a-c41ca66d7b6e_1280x1280.png 1272w, https://substackcdn.com/image/fetch/$s_!dujD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ee9cc6a-8a42-4ea9-a22a-c41ca66d7b6e_1280x1280.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dujD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ee9cc6a-8a42-4ea9-a22a-c41ca66d7b6e_1280x1280.png" width="1280" height="1280" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9ee9cc6a-8a42-4ea9-a22a-c41ca66d7b6e_1280x1280.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1280,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:143879,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!dujD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ee9cc6a-8a42-4ea9-a22a-c41ca66d7b6e_1280x1280.png 424w, https://substackcdn.com/image/fetch/$s_!dujD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ee9cc6a-8a42-4ea9-a22a-c41ca66d7b6e_1280x1280.png 848w, https://substackcdn.com/image/fetch/$s_!dujD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ee9cc6a-8a42-4ea9-a22a-c41ca66d7b6e_1280x1280.png 1272w, https://substackcdn.com/image/fetch/$s_!dujD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ee9cc6a-8a42-4ea9-a22a-c41ca66d7b6e_1280x1280.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Image by <a href="https://pixabay.com/users/memed_nurrohmad-3307648/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=1674878">Memed_Nurrohmad</a> from <a href="https://pixabay.com//?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=1674878">Pixabay</a></p><p>In <a href="https://devwithdevontae.substack.com/p/react-vs-react-native">part 1 of React vs React Native</a>, I discussed basic React Native components such as  View, Button, and Pressable. You also learned and how to style these components with the Style Sheet object. In today&#8217;s article, you will learn other foundational components needed in most React Native projects. If you desire to follow along with the code examples, click <a href="https://snack.expo.dev/@codewithtae/react-native-fundamentals?platform=ios">here</a>!</p><h3><strong>SafeAreaView</strong></h3><p>The <strong><a href="https://reactnative.dev/docs/safeareaview">SafeAreView</a></strong> is like a special &#8220;div&#8221;. It prevents your Components from interfering with the status bar area. This is the area where the time and wifi icon are located.&nbsp;</p><pre><code> return (
    &lt;SafeAreaView style={styles.container}&gt;
     //...
    &lt;/SafeAreaView&gt;
  );</code></pre><h4>caveats</h4><p>Though the <strong>SafeAreaView</strong> is a popular and easy solution for preventing interference with the Status bar area, it isn&#8217;t supported on all devices. </p><p>According to the React Navigation docs</p><blockquote><p>While React Native exports a SafeAreaView component, this component <em><strong>only supports iOS 10+ with no support for older iOS versions or Android</strong>.</em> In addition, it also has some issues, i.e. <em><strong>if a screen containing safe area is animating, it causes jumpy behavior.</strong></em></p></blockquote><p></p><h5>SafeAreaView alternative</h5><p>If you need consistent layout design across many devices and without any animation hiccups, consider using the <strong><a href="https://github.com/th3rdwave/react-native-safe-area-context#usesafeareainsets">useSafeAreaInsets</a></strong> hook given by the <strong><a href="https://github.com/th3rdwave/react-native-safe-area-context">react-native-safe-area-context library</a></strong> Full implementation of this hook is beyond the scope of this article but you can play around with the code <strong><a href="https://snack.expo.dev/@codewithtae/upgrading-from-5.x-%7C-react-navigation?platform=ios">here</a></strong>!</p><h3>TextInput</h3><p>The <a href="https://reactnative.dev/docs/textinput">TextInput</a> component is similar to the input element found in a traditional React app but with a few caveats. For instance, instead of using <strong>onChange</strong> to handle state, it uses<strong> onChangeText</strong> which accepts a string instead of an object.</p><pre><code> return (
    &lt;SafeAreaView&gt;
      &lt;TextInput
        style={styles.input}
        onChangeText={onChangeNumber}
        value={number}
        placeholder="placeholder"
        keyboardType="numeric"
      /&gt;
    &lt;/SafeAreaView&gt;
  );</code></pre><p></p><h4>caveats</h4><p>In a conventional React application, attributes such as input, name, id, and type are considered standard. However, React Native inputs diverge from this system. The following list are props worth knowing when using React Native&#8217;s TextInput.</p><p><strong>keyboardType</strong></p><p>This <strong><a href="https://reactnative.dev/docs/textinput#keyboardtype">prop</a></strong> receives values like, <strong>numeric</strong>, <strong>email-address</strong>, and <strong>phone-pad. </strong></p><p><strong>onSubmitEditing</strong></p><p>This<strong> <a href="https://reactnative.dev/docs/textinput#onsubmitediting">prop&#8217;s </a></strong>function is called when the user hits submit on their device. When <strong><a href="https://devwithdevontae.substack.com/p/how-to-use-the-useref-hook-with-forwardref">combined with a ref</a>, </strong>it can focus the next input after a user has submitted a value.</p><p><strong>blurOnSubmit</strong></p><p>This <strong><a href="https://reactnative.dev/docs/textinput#bluronsubmit">prop </a></strong>is used to keep the keyboard from flickering when transitioning from one input to the next. </p><p></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://devwithdevontae.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://devwithdevontae.substack.com/subscribe?"><span>Subscribe now</span></a></p><h3>Navigation</h3><p>The following code uses<strong> <a href="https://reactnavigation.org/docs/getting-started/">React Navigation</a> </strong>to navigate between screens. The <strong><a href="https://reactnavigation.org/docs/navigation-container/">Navigation container</a></strong> is a mandatory wrapper to implement navigation in a React Native project. You can think of the Navigation container as a <strong><a href="https://reactrouter.com/en/main/router-components/browser-router">BrowserRouter</a> </strong>. Inside the Navigation container is another React component known as a <strong><a href="https://reactnavigation.org/docs/stack-navigator/">Stack Navigator</a></strong>. The Stack Navigator is a mandatory wrapper for Stack Navigation, or navigation between to different screens.The <strong><a href="https://reactnavigation.org/docs/screen-options/">options prop</a></strong> allows developers to configure the header bar of a React Native project. <br><br><strong><a href="https://snack.expo.dev/@codewithtae/dry-navigation">React Native sandbox</a></strong></p><pre><code>import { View,Text,Pressable,StyleSheet } from 'react-native';
import { NavigationContainer } from '@react-navigation/native';
import { createNativeStackNavigator } from '@react-navigation/native-stack';

function HomeScreen({navigation}) {
  return (
    &lt;View style={styles.view}&gt;
    &lt;Pressable 
      style={styles.btn} 
      onPress={()=&gt;navigation.navigate("Screen1")}
    &gt;
      &lt;Text&gt;Go to Screen1&lt;/Text&gt;
    &lt;/Pressable&gt;
    &lt;/View&gt;
  );
}
function Screen1({navigation}) {
  return (
    &lt;View style={styles.view}&gt;
     &lt;Pressable 
       style={styles.btn} 
       onPress={()=&gt;navigation.navigate("Screen2")}
      &gt;
        &lt;Text&gt;Go to Screen2&lt;/Text&gt;
      &lt;/Pressable&gt;
    &lt;/View&gt;
  );
}
function Screen2({navigation}) {
  return (
    &lt;View style={styles.view}&gt;
      &lt;Pressable  
        style={styles.btn}  
        onPress={()=&gt;navigation.navigate("Home")}
       &gt;
        &lt;Text&gt;Go To Home Screen&lt;/Text&gt;
      &lt;/Pressable&gt;
    &lt;/View&gt;
  );
}

const styles = StyleSheet.create({
  btn:{
    borderWidth:1,
    height:40,
    borderColor:'#f4511e',
    padding:10,
    width:"80%",
    alignItems:"center"
  },
  view:{
    flex: 1, 
    alignItems: 'center', 
    justifyContent: 'center' 
  }
})

const Stack = createNativeStackNavigator();

function App() {
  return (
    &lt;NavigationContainer&gt;
      &lt;Stack.Navigator
        screenOptions={{ 
            headerStyle: {
              backgroundColor: '#f4511e',
            },
            headerTintColor: '#fff', 
          }}
      &gt;
        &lt;Stack.Screen
          name="Home"
          component={HomeScreen}
          options={{
            title:"Home"
          }}
        /&gt;
        &lt;Stack.Screen
          name="Screen1"
          component={Screen1}
          options={{
            title:"Screen1"
          }}
        /&gt;
        &lt;Stack.Screen
          name="Screen2"
          component={Screen2}
           options={{
             title:"Screen2"
           }}
        /&gt;
      &lt;/Stack.Navigator&gt;
    &lt;/NavigationContainer&gt;
  );
}

export default App;


</code></pre><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://devwithdevontae.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Dev with DeVontae! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>This concludes today&#8217;s lesson. If you have questions, don&#8217;t be afraid to message me on <strong><a href="https://twitter.com/DevwithDeVontae">twitter</a></strong> or <strong><a href="https://www.linkedin.com/in/devontaemoore-react-developer/">LinkedIn</a>. </strong></p><h3>Ways to support my newsletter</h3><p>&#128421; If you believe this content is valuable, share it on social media</p><p>&#127908; If you believe I would be a good fit for a podcast, let your favorite podcaster know or invite me on</p><h3>Connect with me</h3><p>Connect with me on <a href="https://www.linkedin.com/in/devontaemoore-react-developer/">LinkedIn!</a></p><p>Connect with me on <a href="https://twitter.com/DevwithDeVontae">Twitter!</a></p>]]></content:encoded></item><item><title><![CDATA[React vs React Native Pt1]]></title><description><![CDATA[A React Native intro for React developers]]></description><link>https://devwithdevontae.substack.com/p/react-vs-react-native</link><guid isPermaLink="false">https://devwithdevontae.substack.com/p/react-vs-react-native</guid><dc:creator><![CDATA[DeVontae Moore]]></dc:creator><pubDate>Thu, 20 Jul 2023 17:43:56 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!SqPb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd928f182-034e-41a1-b04c-3a63f97b8609_6000x4000.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SqPb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd928f182-034e-41a1-b04c-3a63f97b8609_6000x4000.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SqPb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd928f182-034e-41a1-b04c-3a63f97b8609_6000x4000.jpeg 424w, https://substackcdn.com/image/fetch/$s_!SqPb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd928f182-034e-41a1-b04c-3a63f97b8609_6000x4000.jpeg 848w, https://substackcdn.com/image/fetch/$s_!SqPb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd928f182-034e-41a1-b04c-3a63f97b8609_6000x4000.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!SqPb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd928f182-034e-41a1-b04c-3a63f97b8609_6000x4000.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SqPb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd928f182-034e-41a1-b04c-3a63f97b8609_6000x4000.jpeg" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d928f182-034e-41a1-b04c-3a63f97b8609_6000x4000.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1226367,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!SqPb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd928f182-034e-41a1-b04c-3a63f97b8609_6000x4000.jpeg 424w, https://substackcdn.com/image/fetch/$s_!SqPb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd928f182-034e-41a1-b04c-3a63f97b8609_6000x4000.jpeg 848w, https://substackcdn.com/image/fetch/$s_!SqPb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd928f182-034e-41a1-b04c-3a63f97b8609_6000x4000.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!SqPb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd928f182-034e-41a1-b04c-3a63f97b8609_6000x4000.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Image by <a href="http://RealToughCandy.com">RealToughCandy.com</a></p><p>A common question I get from experienced React developers interested in React Native is, what are some of the differences between React and React Native. I will explain some core differences in today&#8217;s article. This will not be an exhaustive list but it will be a great starting point for those interested in learning about React Native. You can follow along with the React Native examples by copying and pasting code in a tool called Expo snack found <a href="https://snack.expo.dev/?platform=ios">here</a>!</p><p></p><h3>View vs div</h3><p>A <strong>div </strong>element is a common component in a traditional React project. It&#8217;s main purpose is to control &#8220;where&#8221; its children will reside. The same is true for React Native&#8217;s <strong><a href="https://reactnative.dev/docs/view">View component</a></strong>. It&#8217;s main responsibility is acting as a &#8220;layout&#8221; component that will control where and when (if there&#8217;s conditional rendering) a component will be seen. The following code will place a <strong><a href="https://reactnative.dev/docs/text">Text component</a></strong> (we&#8217;ll discuss in the next section) in the center of the screen.</p><p></p><pre><code>import { Text, View, StyleSheet } from 'react-native';
import Constants from 'expo-constants';



export default function App() {
  return (
    &lt;View style={styles.container}&gt;
      &lt;Text style={styles.paragraph}&gt;
        Center of page
      &lt;/Text&gt;
    &lt;/View&gt;
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    paddingTop: Constants.statusBarHeight,
    backgroundColor: '#ecf0f1',
    padding: 8,
  },
  paragraph: {
    margin: 24,
    fontSize: 18,
    fontWeight: 'bold',
    textAlign: 'center',
  },
});</code></pre><h5>Caveats</h5><p>Though the div and View component share similarities, there are some key differences worth noticing:</p><p><strong>Syntax</strong></p><p>The first thing to consider is syntax. React Native components start with capital letters. This isn&#8217;t a big deal but you may have to retrain your brain when context switching between a React and React Native project.</p><p><strong>onclick vs onPress</strong></p><p>If you ever needed to make a div component clickable for some reason, you would simply add an onclick handler to take care of your needs. To make components clickable in a React Native project, you would pass a function to the <a href="https://reactnative.dev/docs/text#onpress">onPress</a> prop. However, this prop isn&#8217;t available on a View component. </p><p>If you need a clickable container component in a React Native project, you can use the Pressable component as seen in the code below. </p><pre><code>import {useState} from "react";
import { Text, View, StyleSheet,Pressable } from 'react-native';
import Constants from 'expo-constants';



export default function App() {
  const[textColor,setTextColor] = useState("red")
  
  const handlePress = ()=&gt;{
    setTextColor("blue")
  }
  
  return (
    &lt;View style={styles.container}&gt;
      &lt;Pressable onPress={handlePress} style={styles.btn} &gt;
        &lt;Text style={[styles.paragraph,{color:textColor}]}&gt;
         Click
        &lt;/Text&gt;
      &lt;/Pressable&gt;
    &lt;/View&gt;
  );
}

const styles = StyleSheet.create({
  btn:{
    border:"blue",
    borderWidth:1,
  
  },
  container: {
    flex: 1,
    justifyContent: 'center',
    paddingTop: Constants.statusBarHeight,
    backgroundColor: '#ecf0f1',
    padding: 8,
   
},
  paragraph: {
    margin: 24,
    fontSize: 18,
    fontWeight: 'bold',
    textAlign: 'center',
  },
});</code></pre><p>In the code above, I created a custom button via the Pressable component. When the user clicks on the button, it will change the color of the text. You can copy and paste the code <a href="https://snack.expo.dev/?platform=ios">here</a> to test it out.</p><h3>Text vs h1,h2,h3&#8230;..</h3><p>In React Native, the Text component is responsible for all things copy in your mobile app. To simulate the same feel you would get in a traditional React app, you can combine a design theme in your project and utilize that to create various text sizes. You can learn more <a href="https://shopify.engineering/5-ways-to-improve-your-react-native-styling-workflow">here</a>! But for now, remember the Text component is responsible for ALL of your text needs. The code below will demonstrate how you can adjust a Text Component&#8217;s fontSize. </p><pre><code>import {useState} from "react";
import { Text, View, StyleSheet,Pressable } from 'react-native';
import Constants from 'expo-constants';



export default function App() {
  const[textColor,setTextColor] = useState("red")
  
  const handlePress = ()=&gt;{
    setTextColor("blue")
  }
  
  return (
    &lt;View style={styles.container}&gt;
      &lt;Pressable onPress={handlePress} style={styles.btn} &gt;
        &lt;Text style={[styles.text,{color:textColor}]}&gt;
         Click
        &lt;/Text&gt;
      &lt;/Pressable&gt;
      
      &lt;Pressable style={styles.btn} &gt;
        &lt;Text style={[styles.text,styles.h1]}&gt;
         Click
        &lt;/Text&gt;
      &lt;/Pressable&gt;
    
      &lt;Pressable style={styles.btn} &gt;
        &lt;Text style={[styles.text,styles.h2]}&gt;
         Click
        &lt;/Text&gt;
      &lt;/Pressable&gt;
    &lt;/View&gt;
  );
}

const styles = StyleSheet.create({
  btn:{
    border:"blue",
    borderWidth:1,
    marginTop:10
  },
  container: {
    flex: 1,
    justifyContent: 'center',
    paddingTop: Constants.statusBarHeight,
    backgroundColor: '#ecf0f1',
    padding: 8,
   
},
  text: {
    margin: 24,
    fontWeight: 'bold',
    textAlign: 'center',
  },
 
  h1:{
    fontSize:40
  },
  h2:{
    fontSize:30
  },
});</code></pre><p></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://devwithdevontae.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://devwithdevontae.substack.com/subscribe?"><span>Subscribe now</span></a></p><h3>Button vs button</h3><p>React Native&#8217;s <strong><a href="https://reactnative.dev/docs/button">Button component</a></strong> is very similar to a standard button in a React project but with a few twist. First, instead of calling an onclick handler, you call <em><strong>onPress</strong></em>. Also, when you use the Button component in React Native, your telling each OS to use their standard button style. In other words, your design wont be consistent across the iOS platform and Android platform. </p><p>To remedy this situation, you can create a custom button via the<a href="https://reactnative.dev/docs/pressable"> </a><strong><a href="https://reactnative.dev/docs/pressable">Pressable</a></strong> component which I discussed earlier. This will maintain a consistent layout and experience for the user. The code below will demonstrate the differences between creating a custom button with a <strong>Pressable </strong>component and using the Button component. If you copy and paste the code in the expo snack environment and change platforms, you will notice the <strong>Pressable </strong>components stay the same across Android and iOS, while the button component looks different on each platform.</p><pre><code>import {useState} from "react";
import { Text, View, StyleSheet,Pressable,Button } from 'react-native';
import Constants from 'expo-constants';



export default function App() {
  const[textColor,setTextColor] = useState("red")
  
  const handlePress = ()=&gt;{
    setTextColor("blue")
  }
  
  return (
    &lt;View style={styles.container}&gt;
      &lt;Pressable onPress={handlePress} style={styles.btn} &gt;
        &lt;Text style={[styles.text,{color:textColor}]}&gt;
         Click
        &lt;/Text&gt;
      &lt;/Pressable&gt;
      
      &lt;Pressable style={styles.btn} &gt;
        &lt;Text style={[styles.text,styles.h1]}&gt;
         Click
        &lt;/Text&gt;
      &lt;/Pressable&gt;
    
      &lt;Pressable style={styles.btn} &gt;
        &lt;Text style={[styles.text,styles.h2]}&gt;
         Click
        &lt;/Text&gt;
      &lt;/Pressable&gt;

      &lt;Button title="button" onPress={()=&gt;console.log("btn clicked!!!")}/&gt;
    &lt;/View&gt;
  );
}

const styles = StyleSheet.create({
  btn:{
    border:"blue",
    borderWidth:1,
    marginTop:10
  
  },
  container: {
    flex: 1,
    justifyContent: 'center',
    paddingTop: Constants.statusBarHeight,
    backgroundColor: '#ecf0f1',
    padding: 8,
   
},
  text: {
    margin: 24,
    fontWeight: 'bold',
    textAlign: 'center',
  },
  
 h1:{
    fontSize:40
  },
  h2:{
    fontSize:30
  },
});</code></pre><h3>StyleSheet object vs the world of css</h3><p>Bootstrap, Tailwind, and CSS modules are all ways to do CSS in traditional React apps. However, in React Native the <strong><a href="https://reactnative.dev/docs/stylesheet">StyleSheet object</a> </strong> allows you to apply styling to your components with Javascript when you call its <em><strong>create method</strong></em>. It&#8217;s essentially a CSS abstraction that allows you to use common terminology like <em>fontSize</em> and <em>backgroundColor</em>. </p><p>To implement a style from the StyleSheet object, you must use the style prop on your component. The variable named <strong>styles </strong>can be called whatever you want but the React Native convention is to call it &#8220;styles&#8221;</p><pre><code><strong>The Text component style property is accepting an array of styles to combine multiple style objects</strong>
 
&lt;Pressable onPress={handlePress} style={styles.btn}&gt;
    &lt;Text <strong>style</strong>={[styles.text,styles.h1]}&gt;
         Click
     &lt;/Text&gt;
 &lt;/Pressable&gt;

const <strong>styles</strong> = StyleSheet.create({
 //...
  text: {
    margin: 24,
    fontWeight: 'bold',
    textAlign: 'center',
  },
 
  h1:{
    fontSize:40
  },
  h2:{
    fontSize:30
  },
});</code></pre><p></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://devwithdevontae.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://devwithdevontae.substack.com/subscribe?"><span>Subscribe now</span></a></p><p>Alternatively, you can use a third party package like <a href="https://blog.logrocket.com/using-styled-components-with-react-native/">styled components</a> if you&#8217;re not a fan of the StyleSheet object .</p><h5>applying multiple styles</h5><p>You may have noticed that some of components have an array of styles in their style prop.</p><pre><code>  &lt;Text style={[styles.text,styles.h1]}&gt;
      Text goes here
  &lt;/Text&gt;

 const styles = StyleSheet.create({
   //...
  text: {
    margin: 24,
    fontWeight: 'bold',
    textAlign: 'center',
  },
 
  h1:{
    fontSize:40
  },
  h2:{
    fontSize:30
  },
});</code></pre><p>When you want a component to &#8220;inherit&#8221; multiple styles from a StyleSheet Object, you can use an array to combine your styles. One thing to keep in mind is the last property in an array of styles will override all other properties. In other words, if the first property in the array has a <em>fontSize</em> of 10 and the last one has a <em>fontSize</em> of 20, that components <em>fontSize</em> will be set to 20</p><pre><code><strong>The fontSize on this Text component will be 40 since styles.h1 takes precedence over styles.text</strong>

  &lt;Text style={[styles.text,styles.h1]}&gt;
     Text goes here
  &lt;/Text&gt;

 const styles = StyleSheet.create({
   //...
  text: {
    fontsize:10
    margin: 24,
    fontWeight: 'bold',
    textAlign: 'center',
  },
  
  h1:{
    fontSize:40
  },
  h2:{
    fontSize:30
  },
});

</code></pre><p>This concludes today&#8217;s lesson. If you learned something, consider subscribing and sharing this article with the rest of the dev community.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://devwithdevontae.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://devwithdevontae.substack.com/subscribe?"><span>Subscribe now</span></a></p><h3>Ways to support my newsletter</h3><p>&#128421; If you believe this content is valuable, share it on social media</p><p>&#127908; If you believe I would be a good fit for a podcast, let your favorite podcaster know</p><h3>Connect with me</h3><p>Connect with me on <a href="https://www.linkedin.com/in/devontaemoore-react-developer/">LinkedIn!</a></p><p>Connect with me on <a href="https://twitter.com/DevwithDeVontae">Twitter!</a></p><h3>Related Article</h3><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;66be3d90-d072-40c1-9212-7cfca89df7f4&quot;,&quot;caption&quot;:&quot;Image by Pexels from Pixabay Within this article, you will discover two approaches to seamlessly integrate Firebase into your expo project. If you are not yet familiar with expo, I encourage you to click here for further insights. While both paths offer their merits, it's important to note that they come with their own drawbacks. However, before delving &#8230;&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;These two packages will connect Firebase to your React Native Expo App&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:131224638,&quot;name&quot;:&quot;DeVontae Moore&quot;,&quot;bio&quot;:&quot;I'm a Software Engineer who loves to learn from his experiences and observations for the benefit of others.My current focus is React Native and typescript. &quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8578cabc-3adf-4971-be36-e0f2f2c17096_192x200.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2023-06-22T19:04:02.735Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d5fe3f0-84d3-43ba-93d3-917962a25795_1280x853.jpeg&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://devwithdevontae.substack.com/p/these-two-packages-will-connect-firebase&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:128977171,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;Dev with DeVontae&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4400689f-210c-4a9f-bc88-ea77852073e0_256x256.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p></p>]]></content:encoded></item><item><title><![CDATA[How to dynamically change css with styled components]]></title><description><![CDATA[Styled components + React = &#128293;]]></description><link>https://devwithdevontae.substack.com/p/how-to-dynamically-change-css-with</link><guid isPermaLink="false">https://devwithdevontae.substack.com/p/how-to-dynamically-change-css-with</guid><dc:creator><![CDATA[DeVontae Moore]]></dc:creator><pubDate>Thu, 29 Jun 2023 16:09:41 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!aput!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc858b475-e2b5-4ce4-a67f-65875af05040_1280x720.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!aput!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc858b475-e2b5-4ce4-a67f-65875af05040_1280x720.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aput!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc858b475-e2b5-4ce4-a67f-65875af05040_1280x720.png 424w, https://substackcdn.com/image/fetch/$s_!aput!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc858b475-e2b5-4ce4-a67f-65875af05040_1280x720.png 848w, https://substackcdn.com/image/fetch/$s_!aput!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc858b475-e2b5-4ce4-a67f-65875af05040_1280x720.png 1272w, https://substackcdn.com/image/fetch/$s_!aput!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc858b475-e2b5-4ce4-a67f-65875af05040_1280x720.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aput!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc858b475-e2b5-4ce4-a67f-65875af05040_1280x720.png" width="1280" height="720" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c858b475-e2b5-4ce4-a67f-65875af05040_1280x720.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:720,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:24722,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!aput!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc858b475-e2b5-4ce4-a67f-65875af05040_1280x720.png 424w, https://substackcdn.com/image/fetch/$s_!aput!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc858b475-e2b5-4ce4-a67f-65875af05040_1280x720.png 848w, https://substackcdn.com/image/fetch/$s_!aput!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc858b475-e2b5-4ce4-a67f-65875af05040_1280x720.png 1272w, https://substackcdn.com/image/fetch/$s_!aput!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc858b475-e2b5-4ce4-a67f-65875af05040_1280x720.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Image by <a href="https://pixabay.com/users/krzysztof-m-1363864/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=3201149">krzysztof-m</a> from <a href="https://pixabay.com//?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=3201149">Pixabay</a></p><p>One way to dynamically change css properties with styled components is to insert a custom prop into your React component and access said property using the dollar sign and curly braces commonly used for template literals.&nbsp;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ulX4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa8a8728-fa90-49b9-a698-e1f18e4c76f1_1440x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ulX4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa8a8728-fa90-49b9-a698-e1f18e4c76f1_1440x900.png 424w, https://substackcdn.com/image/fetch/$s_!ulX4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa8a8728-fa90-49b9-a698-e1f18e4c76f1_1440x900.png 848w, https://substackcdn.com/image/fetch/$s_!ulX4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa8a8728-fa90-49b9-a698-e1f18e4c76f1_1440x900.png 1272w, https://substackcdn.com/image/fetch/$s_!ulX4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa8a8728-fa90-49b9-a698-e1f18e4c76f1_1440x900.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ulX4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa8a8728-fa90-49b9-a698-e1f18e4c76f1_1440x900.png" width="1440" height="900" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fa8a8728-fa90-49b9-a698-e1f18e4c76f1_1440x900.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:900,&quot;width&quot;:1440,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;No alt text provided for this image&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="No alt text provided for this image" title="No alt text provided for this image" srcset="https://substackcdn.com/image/fetch/$s_!ulX4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa8a8728-fa90-49b9-a698-e1f18e4c76f1_1440x900.png 424w, https://substackcdn.com/image/fetch/$s_!ulX4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa8a8728-fa90-49b9-a698-e1f18e4c76f1_1440x900.png 848w, https://substackcdn.com/image/fetch/$s_!ulX4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa8a8728-fa90-49b9-a698-e1f18e4c76f1_1440x900.png 1272w, https://substackcdn.com/image/fetch/$s_!ulX4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa8a8728-fa90-49b9-a698-e1f18e4c76f1_1440x900.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Our current example is testing to see if our use pointer prop is true. If it is, the cursor property will be set to pointer. If it is not, it will be set to grab.</p><p>Here's the component with the prop titled usePointer</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NuDl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67922a29-8810-4cfb-a64d-b987f4bcf9be_1440x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NuDl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67922a29-8810-4cfb-a64d-b987f4bcf9be_1440x900.png 424w, https://substackcdn.com/image/fetch/$s_!NuDl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67922a29-8810-4cfb-a64d-b987f4bcf9be_1440x900.png 848w, https://substackcdn.com/image/fetch/$s_!NuDl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67922a29-8810-4cfb-a64d-b987f4bcf9be_1440x900.png 1272w, https://substackcdn.com/image/fetch/$s_!NuDl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67922a29-8810-4cfb-a64d-b987f4bcf9be_1440x900.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NuDl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67922a29-8810-4cfb-a64d-b987f4bcf9be_1440x900.png" width="1440" height="900" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/67922a29-8810-4cfb-a64d-b987f4bcf9be_1440x900.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:900,&quot;width&quot;:1440,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;No alt text provided for this image&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="No alt text provided for this image" title="No alt text provided for this image" srcset="https://substackcdn.com/image/fetch/$s_!NuDl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67922a29-8810-4cfb-a64d-b987f4bcf9be_1440x900.png 424w, https://substackcdn.com/image/fetch/$s_!NuDl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67922a29-8810-4cfb-a64d-b987f4bcf9be_1440x900.png 848w, https://substackcdn.com/image/fetch/$s_!NuDl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67922a29-8810-4cfb-a64d-b987f4bcf9be_1440x900.png 1272w, https://substackcdn.com/image/fetch/$s_!NuDl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67922a29-8810-4cfb-a64d-b987f4bcf9be_1440x900.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://devwithdevontae.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://devwithdevontae.substack.com/subscribe?"><span>Subscribe now</span></a></p><p>Our first example allowed us to change one css property in one go. What if we wanted to change multiple css properties. How would we accomplish such a task? The answer lies in a helper given to us by the styled components library called &#8216;css&#8217;.&nbsp;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!C1eu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc734d6e1-d8e7-400c-8c32-ecc97521fa0c_1440x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!C1eu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc734d6e1-d8e7-400c-8c32-ecc97521fa0c_1440x900.png 424w, https://substackcdn.com/image/fetch/$s_!C1eu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc734d6e1-d8e7-400c-8c32-ecc97521fa0c_1440x900.png 848w, https://substackcdn.com/image/fetch/$s_!C1eu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc734d6e1-d8e7-400c-8c32-ecc97521fa0c_1440x900.png 1272w, https://substackcdn.com/image/fetch/$s_!C1eu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc734d6e1-d8e7-400c-8c32-ecc97521fa0c_1440x900.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!C1eu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc734d6e1-d8e7-400c-8c32-ecc97521fa0c_1440x900.png" width="1440" height="900" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c734d6e1-d8e7-400c-8c32-ecc97521fa0c_1440x900.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:900,&quot;width&quot;:1440,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;No alt text provided for this image&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="No alt text provided for this image" title="No alt text provided for this image" srcset="https://substackcdn.com/image/fetch/$s_!C1eu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc734d6e1-d8e7-400c-8c32-ecc97521fa0c_1440x900.png 424w, https://substackcdn.com/image/fetch/$s_!C1eu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc734d6e1-d8e7-400c-8c32-ecc97521fa0c_1440x900.png 848w, https://substackcdn.com/image/fetch/$s_!C1eu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc734d6e1-d8e7-400c-8c32-ecc97521fa0c_1440x900.png 1272w, https://substackcdn.com/image/fetch/$s_!C1eu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc734d6e1-d8e7-400c-8c32-ecc97521fa0c_1440x900.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Our current example is validating two props: props.changeColor and props.changeBorder. Both are given to our original Button component and controlled by state using React hooks. If we click said button we will see our Buttons css dynamically change.</p><p>Here's component using the props changeColor and and changeBorder</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lZrr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7e85ab5-43bd-4ca1-af1c-5086dc9b36d8_1440x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lZrr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7e85ab5-43bd-4ca1-af1c-5086dc9b36d8_1440x900.png 424w, https://substackcdn.com/image/fetch/$s_!lZrr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7e85ab5-43bd-4ca1-af1c-5086dc9b36d8_1440x900.png 848w, https://substackcdn.com/image/fetch/$s_!lZrr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7e85ab5-43bd-4ca1-af1c-5086dc9b36d8_1440x900.png 1272w, https://substackcdn.com/image/fetch/$s_!lZrr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7e85ab5-43bd-4ca1-af1c-5086dc9b36d8_1440x900.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lZrr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7e85ab5-43bd-4ca1-af1c-5086dc9b36d8_1440x900.png" width="1440" height="900" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b7e85ab5-43bd-4ca1-af1c-5086dc9b36d8_1440x900.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:900,&quot;width&quot;:1440,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;No alt text provided for this image&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="No alt text provided for this image" title="No alt text provided for this image" srcset="https://substackcdn.com/image/fetch/$s_!lZrr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7e85ab5-43bd-4ca1-af1c-5086dc9b36d8_1440x900.png 424w, https://substackcdn.com/image/fetch/$s_!lZrr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7e85ab5-43bd-4ca1-af1c-5086dc9b36d8_1440x900.png 848w, https://substackcdn.com/image/fetch/$s_!lZrr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7e85ab5-43bd-4ca1-af1c-5086dc9b36d8_1440x900.png 1272w, https://substackcdn.com/image/fetch/$s_!lZrr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7e85ab5-43bd-4ca1-af1c-5086dc9b36d8_1440x900.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://devwithdevontae.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Dev with DeVontae! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><h3>Ways to support my newsletter</h3><p>&#128421; If you believe this content is valuable, share it on social media</p><p>&#127908; If you believe I would be a good fit for a podcast, let your favorite podcaster know</p><h3>Connect with me</h3><p>Connect with me on <a href="https://www.linkedin.com/in/devontaemoore-react-developer/">LinkedIn!</a></p><p>Connect with me on <a href="https://twitter.com/DevwithDeVontae">Twitter!</a></p>]]></content:encoded></item><item><title><![CDATA[These two packages will connect Firebase to your React Native Expo App]]></title><description><![CDATA[Expo + Firebase = &#128293;&#128293;&#128293;]]></description><link>https://devwithdevontae.substack.com/p/these-two-packages-will-connect-firebase</link><guid isPermaLink="false">https://devwithdevontae.substack.com/p/these-two-packages-will-connect-firebase</guid><dc:creator><![CDATA[DeVontae Moore]]></dc:creator><pubDate>Thu, 22 Jun 2023 19:04:02 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!yMzB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d5fe3f0-84d3-43ba-93d3-917962a25795_1280x853.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yMzB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d5fe3f0-84d3-43ba-93d3-917962a25795_1280x853.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yMzB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d5fe3f0-84d3-43ba-93d3-917962a25795_1280x853.jpeg 424w, https://substackcdn.com/image/fetch/$s_!yMzB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d5fe3f0-84d3-43ba-93d3-917962a25795_1280x853.jpeg 848w, https://substackcdn.com/image/fetch/$s_!yMzB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d5fe3f0-84d3-43ba-93d3-917962a25795_1280x853.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!yMzB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d5fe3f0-84d3-43ba-93d3-917962a25795_1280x853.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yMzB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d5fe3f0-84d3-43ba-93d3-917962a25795_1280x853.jpeg" width="1280" height="853" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6d5fe3f0-84d3-43ba-93d3-917962a25795_1280x853.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:853,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:132856,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!yMzB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d5fe3f0-84d3-43ba-93d3-917962a25795_1280x853.jpeg 424w, https://substackcdn.com/image/fetch/$s_!yMzB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d5fe3f0-84d3-43ba-93d3-917962a25795_1280x853.jpeg 848w, https://substackcdn.com/image/fetch/$s_!yMzB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d5fe3f0-84d3-43ba-93d3-917962a25795_1280x853.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!yMzB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d5fe3f0-84d3-43ba-93d3-917962a25795_1280x853.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Image by <a href="https://pixabay.com/users/pexels-2286921/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=1868708">Pexels</a> from <a href="https://pixabay.com//?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=1868708">Pixabay</a></p><p>Within this article, you will discover two approaches to seamlessly integrate Firebase into your expo project. If you are not yet familiar with expo, I encourage you to <a href="https://expo.dev/">click here </a>for further insights. While both paths offer their merits, it's important to note that they come with their own drawbacks. However, before delving into these paths, let's first explore the compelling reasons why learning Firebase is a valuable pursuit.</p><h3>Why learn Firebase </h3><h5>It&#8217;s ubiquitous</h5><p>Whether I was working on freelance projects, contract work, or a full time position, I  found myself interacting with a Firebase backend. Because of its great adoption amongst businesses, I believe its a safe bet for anyone wanting to dip their toe in the world of backend technologies.</p><h5>A.I. focused</h5><p>I believe that the era of A.I. has firmly taken root and is here to stay. Companies and individuals who embrace A.I.-centric technologies will undoubtedly have an advantage over those who don&#8217;t. Firebase serves as a prime illustration of forward-thinking companies that have integrated a <a href="https://firebase.google.com/docs/ml">Machine Learning service</a> into their array of backend technologies. If you aspire to enhance your skill set with A.I.-focused technology, delving into Firebase could prove to be a rewarding endeavor.</p><h5>A plethora of learning material</h5><p>When it comes to acquiring new knowledge, the availability of learning resources plays a pivotal role. In my personal experience, Firebase stands out for its wealth of resources catering to diverse learning preferences. Its documentation provides first-class examples and engaging videos for visual learners, while a plethora of YouTube videos and articles cater to your desire for further exploration.</p><p></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://devwithdevontae.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://devwithdevontae.substack.com/subscribe?"><span>Subscribe now</span></a></p><p></p><h3>How to connect Firebase to your Expo projects</h3><h5>Firebase JS SDK</h5><p>If you want to get started with firebase services like cloud Firestore, you can use the <a href="https://docs.expo.dev/guides/using-firebase/#using-firebase-js-sdk">Firebase JS SDK</a> in your expo project. This SDK is perfect if you wish to use the <a href="https://expo.dev/client">expo go app </a>for your React Native project. </p><h5>Firebase JS SDK caveats</h5><p>If you're new to the React Native ecosystem, it's important to understand that there are two prevalent approaches for building React Native apps: <a href="https://docs.expo.dev/more/expo-cli/">Expo CLI</a> and<a href="https://reactnative.dev/docs/environment-setup?guide=native"> React Native CLI</a>. Within the Expo CLI, there are various methods to interact with your React Native app, with one of them being the Expo Go app. Expo Go provides a quick and convenient way to kickstart your development journey while sparing you the complexities associated with custom native code typically encountered in the Expo Bare Workflow or React Native CLI Workflow. However, it's worth noting that opting for Expo Go means foregoing access to essential Firebase features such as Analytics, Dynamic Links, and Crashlytics. These powerful tools require the management of native code, which is not accessible within the Expo Go app.</p><h5>React Native Firebase</h5><p>If Firebase tools like Analytics, Dynamic Links, and Crashlytics is a must, than you will need to use the <a href="https://docs.expo.dev/guides/using-firebase/#using-react-native-firebase">React Native Firebase package</a> in replace of the Firebase JS SDK.</p><h5>React Native Firebase caveats</h5><p>If you decide React Native Firebase is best for your needs, than you will carry the burden of managing native android and iOS code. If you&#8217;re using the managed expo workflow and you want to use React Native Firebase, you&#8217;ll need to create a <a href="https://docs.expo.dev/develop/development-builds/create-a-build/?redirected">development build</a> or use the expo run command expo run:[ios|android] for either iOS or Android. If you want detailed instructions on how to use the React Native Firebase package, use the <a href="https://docs.expo.dev/guides/using-firebase/#install-and-initialize-react-native-firebase">expo docs</a> and the <a href="https://rnfirebase.io/#expo">React Native Firebase docs</a>.</p><p></p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://devwithdevontae.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Dev with DeVontae! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h4><br>Ways to support my newsletter</h4><p>&#128421; If you believe this content is valuable, share it on social media</p><p>&#127908; If you believe I would be a good fit for a podcast, let your favorite podcaster know</p><h3>Connect with me</h3><p>Connect with me on <a href="https://www.linkedin.com/in/devontaemoore-react-developer/">LinkedIn!</a></p><p>Connect with me on <a href="https://twitter.com/DevwithDeVontae">Twitter!</a></p>]]></content:encoded></item></channel></rss>