<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Meg Hannon</title>
    <description>The latest articles on DEV Community by Meg Hannon (@megfh).</description>
    <link>https://dev.to/megfh</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F176294%2Fc38af9d5-7de9-4691-8ddc-e870cde39dcb.jpg</url>
      <title>DEV Community: Meg Hannon</title>
      <link>https://dev.to/megfh</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/megfh"/>
    <language>en</language>
    <item>
      <title>What I Learned From the #100DaysOfGatbsy Challenge</title>
      <dc:creator>Meg Hannon</dc:creator>
      <pubDate>Thu, 05 Aug 2021 02:06:38 +0000</pubDate>
      <link>https://dev.to/megfh/what-i-learned-from-the-100daysofgatbsy-challenge-4p70</link>
      <guid>https://dev.to/megfh/what-i-learned-from-the-100daysofgatbsy-challenge-4p70</guid>
      <description>&lt;p&gt;Earlier this year I worked my way through the #100DaysOfGatsby challenges. This year's project has been divided into sprints, with each sprint having a new set of features to implement. While I didn't keep up with the schedule exactly (and this blog post is very belated!), I really enjoyed having the project broken down into manageable chunks like this.&lt;/p&gt;

&lt;p&gt;I had played with Gatsby a bit previously, but this project really helped me to dive deeper and get comfortable with the Gatsby framework and the wonderful world of Gatsby plugins! In this post I will highlight some of the hiccups I encountered and things I learned along the way. &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://www.gatsbyjs.com/blog/100days-challenge-1" rel="noopener noreferrer"&gt;Challenge 1&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;The first challenge involved a few things to get a Proof of Concept site up and running: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use Gatsby’s Contentful plugin and connect to a test Contentful site&lt;/li&gt;
&lt;li&gt;Create the following pages: 

&lt;ul&gt;
&lt;li&gt;home &lt;/li&gt;
&lt;li&gt;about&lt;/li&gt;
&lt;li&gt;a collection of pages for every city &lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Build it on Gatsby Cloud and use their preview URL&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;The &lt;code&gt;npm init gatsby&lt;/code&gt; command makes setting up a new site easy, and prompts to choose your preferred CMS, styling tools and additional features. Per the challenge instructions, I selected Contentful as the CMS and configured a few additional plugins (“responsive images”, “sitemap”, and “metatags”). &lt;/p&gt;

&lt;p&gt;Since creating a page in Gatsby is as easy as exporting a React component from a page located in the src/pages directory, I created the &lt;code&gt;src/pages/about.js&lt;/code&gt; to create a route at /about. The "home" page is &lt;code&gt;src/pages/index.js&lt;/code&gt; which is automatically created by the &lt;code&gt;npm init gatsby&lt;/code&gt; command. To create the pages for each city, I had to learn something new!&lt;/p&gt;

&lt;p&gt;This was my first time using Gatsby's &lt;a href="https://www.gatsbyjs.com/docs/reference/routing/file-system-route-api/" rel="noopener noreferrer"&gt;File System Route API&lt;/a&gt;, which allows you to programmatically create pages from your GraphQL data, without touching the &lt;code&gt;gatsby-node.js&lt;/code&gt; file at all. &lt;/p&gt;

&lt;p&gt;For this case, I wanted to create pages for each city that audioC0RE operates in, nested under the &lt;code&gt;/location/&lt;/code&gt; route.&lt;br&gt;
First, the cities were created as a content type in &lt;a href="https://www.contentful.com/" rel="noopener noreferrer"&gt;Contentful&lt;/a&gt;: &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcpbj4c4xee8wjv2r0q1b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcpbj4c4xee8wjv2r0q1b.png" alt="contentful dashboard showing the city content type"&gt;&lt;/a&gt;&lt;br&gt;
Since the &lt;code&gt;gatsby-source-contentful&lt;/code&gt; plugin was already configured, after creating the content model, I could now see the contentfulCity type in the GraphiQL explorer: &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7rfyfl302qyrk6id77yf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7rfyfl302qyrk6id77yf.png" alt="contentfulCity type highlighted in the GraphiQL explorer sidebar"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So, to create the city pages, I created a new file, &lt;code&gt;src/pages/location/{contentfulCity.name}.js&lt;/code&gt;. At build time, Gatsby uses the content within the curly braces to generate GraphQL queries to retrieve the nodes that should be built for this collection (allContentfulCity), and create a page for each of them. In this case, the following query is generated:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="err"&gt;allContentfulCity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;nodes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside the &lt;code&gt;src/pages/location/{contentfulCity.name}.js&lt;/code&gt; component itself, I used the following query to get all the data needed for each page that is being created:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="k"&gt;query&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;contentfulCity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;eq&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;coordinates&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;lat&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;lon&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;skylineImage&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;gatsbyImageData&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And voila! 3 pages have been created for the 3 cities that are stored in Contentful: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;/location/toronto/&lt;/li&gt;
&lt;li&gt;/location/new-york/&lt;/li&gt;
&lt;li&gt;/location/san-fransisco/&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;a href="https://www.gatsbyjs.com/blog/challenge-2/" rel="noopener noreferrer"&gt;Challenge 2&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Challenge 2 involved actually getting the website up and running, styling with ChakraUI, adding a contact form with Formium, and adding a skyline image for each city page. &lt;/p&gt;

&lt;p&gt;Having never used ChakraUI before (and admittedly rusty on my frontend skills), I had to search for some inspiration. I found this fantastic &lt;a href="https://raptis.wtf/blog/build-a-landing-page-with-chakra-ui-part-1/" rel="noopener noreferrer"&gt;blog post&lt;/a&gt; from Jim Raptis, and used it to help me build the home page and header, with a few adjustments. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzkanhim0n33shp51aw6u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzkanhim0n33shp51aw6u.png" alt="audioC0RE landing page"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I wanted to have the header contain links to all cities, but was encountering an error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;Exported queries are only executed for Page components. It's possible you're
trying to create pages in your gatsby-node.js and that's failing for some
reason.

If the failing component(s) is a regular component and not intended to be a page
&lt;/span&gt;&lt;span class="gp"&gt;component, you generally want to use a &amp;lt;StaticQuery&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;https://gatsbyjs.org/docs/static-query&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;instead of exporting a page query.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This led me to discover Gatsby's &lt;a href="https://www.gatsbyjs.com/docs/how-to/querying-data/static-query/" rel="noopener noreferrer"&gt;&amp;lt;StaticQuery&amp;gt;&lt;/a&gt;! From the Gatsby docs: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;By using StaticQuery, you can colocate a component with its data. It is no longer required to, say, pass data down from Layout to Header.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's exactly what I needed it for! So I used the &lt;code&gt;&amp;lt;StaticQuery&amp;gt;&lt;/code&gt; to populate my header with the links to the cities:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;StaticQuery&lt;/span&gt; 
      &lt;span class="na"&gt;query&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;graphql&lt;/span&gt;&lt;span class="s2"&gt;`
        query AllCities {
          allContentfulCity {
            edges {
              node {
                name
                gatsbyPath(filePath: "/location/{contentfulCity.name}")
              }
            }
          }
        }
        `&lt;/span&gt;
      &lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="na"&gt;render&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;HeaderComponent&lt;/span&gt; &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;A Hiccup&lt;/strong&gt;: When building the dropdown menu for the cities, I was trying to use &lt;code&gt;ChevronDownIcon&lt;/code&gt; in my &amp;lt;HeaderComponent&amp;gt;, but I was importing it from &lt;code&gt;@chakra-ui/react&lt;/code&gt; instead of &lt;code&gt;@chakra-ui/icons&lt;/code&gt;, and the error message was a bit confusing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;Uncaught Error: Undefined component passed to createElement()

You likely forgot to export your component or might have mixed up default and named imports
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Lesson&lt;/em&gt;: always double check your imports!&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;a href="https://www.gatsbyjs.com/blog/100days-challenge-3/" rel="noopener noreferrer"&gt;Challenge 3&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Challenge 3 involved using Gatsby's new &lt;a href="https://www.gatsbyjs.com/plugins/gatsby-source-wordpress/" rel="noopener noreferrer"&gt;WordPress integration&lt;/a&gt; to add a blog to the site! &lt;/p&gt;

&lt;p&gt;This would involve setting up a &lt;code&gt;/blog&lt;/code&gt; page, and creating a new page for each blog post sourced from WordPress. The &lt;a href="https://github.com/gatsbyjs/gatsby/blob/master/packages/gatsby-source-wordpress/docs/tutorials/building-a-new-site-wordpress-and-gatsby.md#creating-pages-for-each-blog-post-and-linking-to-them" rel="noopener noreferrer"&gt;docs&lt;/a&gt; suggest using &lt;code&gt;gatsby-node.js&lt;/code&gt; and the &lt;code&gt;createPages&lt;/code&gt; API, but I had a hunch that this wasn't necessary - I could simply use the &lt;a href="https://www.gatsbyjs.com/docs/reference/routing/file-system-route-api/" rel="noopener noreferrer"&gt;File System Route API&lt;/a&gt;, as I had with the Contentful cities. &lt;/p&gt;

&lt;p&gt;First, I had to setup the &lt;code&gt;src/pages/blog&lt;/code&gt; page, which would list out all the posts, using the following query:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="k"&gt;query&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;wpPosts&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;allWpPost&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fields&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;edges&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="n"&gt;slug&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="n"&gt;excerpt&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This was used to create a grid of posts excerpts, linking to the actual blog post page:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;allWpPost&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;edges&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(({&lt;/span&gt;&lt;span class="na"&gt;node&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Box&lt;/span&gt; &lt;span class="na"&gt;m&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"10px"&lt;/span&gt; &lt;span class="na"&gt;p&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"10px"&lt;/span&gt; &lt;span class="na"&gt;grow&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt; &lt;span class="na"&gt;maxW&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"400px"&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;slug&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Link&lt;/span&gt; &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/blog/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;slug&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Heading&lt;/span&gt; &lt;span class="na"&gt;as&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"h4"&lt;/span&gt; &lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"lg"&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"primary.800"&lt;/span&gt; &lt;span class="na"&gt;mb&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"1.5"&lt;/span&gt; &lt;span class="na"&gt;textAlign&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"center"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Heading&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt; &lt;span class="na"&gt;dangerouslySetInnerHTML&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;__html&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;excerpt&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;isTruncated&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Link&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Box&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;))}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, I created the collection route &amp;amp; template for the actual blog post itself, at &lt;code&gt;src/pages/blog/{wpPost.slug}.js&lt;/code&gt;, which uses the following query:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="k"&gt;query&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;wpPost&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;eq&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;formatString&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"DD MMMM, YYYY"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;slug&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This would create a page for each blog post, which were already linked from the &lt;code&gt;/blog&lt;/code&gt; page! Fantastic! &lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;a href="https://www.gatsbyjs.com/blog/100days-challenge-4/" rel="noopener noreferrer"&gt;Challenge 4&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Challenge 4 involved setting up a Shopify e-commerce store to sell swag for the popular fictional startup, audioC0RE! &lt;/p&gt;

&lt;p&gt;So, I setup a Shopify developer account, installed the necessary plugin and configured everything according to the &lt;a href="https://github.com/gatsbyjs/gatsby-source-shopify" rel="noopener noreferrer"&gt;docs&lt;/a&gt;. Unfortunately, I encountered an error: &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgruto9tq2w7jrlbtx7ku.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgruto9tq2w7jrlbtx7ku.png" alt="alt text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hmm...that's not very helpful, is it? I searched everywhere, asked twitter and couldn't find anything! So, I opened an &lt;a href="https://github.com/gatsbyjs/gatsby-source-shopify/issues/108#event-4518155849" rel="noopener noreferrer"&gt;issue&lt;/a&gt; on Github! This was my first time opening an issue, so I was a little intimidated, but thankfully the maintainer was incredibly nice and helpful! After lots of back and forth, I eventually determined the source of the error: a typo 🤦&lt;/p&gt;

&lt;p&gt;I had trailing commas in my &lt;code&gt;.env&lt;/code&gt; file, which were causing the unauthenticated error because it was adding an extra character to the API key! I felt a little foolish for missing this, but ultimately I'm glad for it! I had a great first issue experience, and it resulted in some additional logging being added to the plugin, which will hopefully help other developers to debug their own issues faster! &lt;/p&gt;

&lt;p&gt;After getting that issue sorted out, setting up the &lt;code&gt;/shop&lt;/code&gt; page went smoothly. I was able to use the &lt;a href="https://www.gatsbyjs.com/docs/reference/routing/file-system-route-api/" rel="noopener noreferrer"&gt;File System Route API&lt;/a&gt; again, with a &lt;code&gt;src/pages/shop/{shopifyProduct.handle.}js&lt;/code&gt; to create the individual pages for each product, and had a listing of all products on the &lt;code&gt;/src/pages/shop.js&lt;/code&gt; page. &lt;/p&gt;

&lt;p&gt;I'll spare you the details once again, but if you want to see the code feel free to look through the &lt;a href="https://github.com/megfh/100daysofgatsby2021" rel="noopener noreferrer"&gt;repo&lt;/a&gt;!&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Ultimately, the #100DaysOfGatsby challenge was a great experience! I was able to add a new project to my resume, learn some new things, and I now feel more confident working with both React &amp;amp; Gatsby. &lt;/p&gt;

&lt;p&gt;I highly recommend anyone who is interested in learning Gatsby give this challenge a try! &lt;/p&gt;

</description>
      <category>100daysofgatsby</category>
      <category>gatsby</category>
      <category>react</category>
      <category>chakraui</category>
    </item>
    <item>
      <title>Advice for a solo developer?</title>
      <dc:creator>Meg Hannon</dc:creator>
      <pubDate>Mon, 08 Jun 2020 19:51:27 +0000</pubDate>
      <link>https://dev.to/megfh/advice-for-a-solo-developer-1bn6</link>
      <guid>https://dev.to/megfh/advice-for-a-solo-developer-1bn6</guid>
      <description>&lt;p&gt;After 1.5 years working on a small (2-3 dev) team, I am now the only developer and will likely be flying solo for a few months. &lt;/p&gt;

&lt;p&gt;This is going to force me out of my comfort zone, as I'll have to move from being primarily backend to fullstack. &lt;/p&gt;

&lt;p&gt;Any advice for how to thrive as a solo dev would be appreciated! :) &lt;/p&gt;

</description>
      <category>discuss</category>
    </item>
  </channel>
</rss>
