{"componentChunkName":"component---src-templates-post-js","path":"/create-view-a-listing-page","result":{"data":{"markdownRemark":{"html":"<p>In this chapter we will create the page that will allow users to view an individual listing.</p>\n<p>In the <code class=\"language-text\">pages</code> directory create a <code class=\"language-text\">ViewListing.js</code> file and add the following:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> React <span class=\"token keyword\">from</span> <span class=\"token string\">\"react\"</span>\n<span class=\"token keyword\">import</span> RedBlockButton <span class=\"token keyword\">from</span> <span class=\"token string\">\"../components/buttons/RedBlockButton\"</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> useQuery <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"@apollo/react-hooks\"</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> <span class=\"token constant\">GET_A_LISTING</span> <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"../graphql/Queries\"</span>\n<span class=\"token keyword\">import</span> activy <span class=\"token keyword\">from</span> <span class=\"token string\">\"../assets/trip_type.svg\"</span>\n<span class=\"token keyword\">import</span> amenities <span class=\"token keyword\">from</span> <span class=\"token string\">\"../assets/trip_activity.svg\"</span>\n<span class=\"token keyword\">import</span> LandingHeader <span class=\"token keyword\">from</span> <span class=\"token string\">\"../components/navs/LandingHeader\"</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Skeleton <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"antd\"</span>\n\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span>\n  HeadingOne<span class=\"token punctuation\">,</span>\n  HeadingTwo<span class=\"token punctuation\">,</span>\n  HeadingThree<span class=\"token punctuation\">,</span>\n  BodyOne<span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"../components/typography\"</span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">ViewListing</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">props</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> loading<span class=\"token punctuation\">,</span> data<span class=\"token punctuation\">,</span> error <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token function\">useQuery</span><span class=\"token punctuation\">(</span><span class=\"token constant\">GET_A_LISTING</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n    variables<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n      listingId<span class=\"token operator\">:</span> props<span class=\"token punctuation\">.</span>id<span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>loading<span class=\"token punctuation\">)</span> <span class=\"token keyword\">return</span> <span class=\"token operator\">&lt;</span>Skeleton <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">)</span> <span class=\"token keyword\">return</span> <span class=\"token operator\">&lt;</span>p className<span class=\"token operator\">=</span><span class=\"token string\">\"text-red\"</span><span class=\"token operator\">></span><span class=\"token punctuation\">{</span>error<span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>p<span class=\"token operator\">></span>\n\n  <span class=\"token keyword\">const</span> listing <span class=\"token operator\">=</span> data<span class=\"token punctuation\">.</span>getAListing\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>LandingHeader imgURL<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>listing<span class=\"token punctuation\">.</span>coverPhoto<span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>div className<span class=\"token operator\">=</span><span class=\"token string\">\"grid grid-cols-13 p-5 mt-10\"</span><span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>div className<span class=\"token operator\">=</span><span class=\"token string\">\"mr-16\"</span><span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span>HeadingOne className<span class=\"token operator\">=</span><span class=\"token string\">\"font-display  font-semibold text-3xl text-black\"</span><span class=\"token operator\">></span>\n            <span class=\"token punctuation\">{</span>listing<span class=\"token punctuation\">.</span>listingName<span class=\"token punctuation\">}</span>\n          <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>HeadingOne<span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span>HeadingTwo className<span class=\"token operator\">=</span><span class=\"token string\">\"font-display text-xl text-black mt-4 mb-8\"</span><span class=\"token operator\">></span>\n            <span class=\"token punctuation\">{</span>listing<span class=\"token punctuation\">.</span>listingLocation<span class=\"token punctuation\">}</span>\n          <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>HeadingTwo<span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span>HeadingThree className<span class=\"token operator\">=</span><span class=\"token string\">\"font-display font-bold text-xl text-center s:text-left mb-5 text-black \"</span><span class=\"token operator\">></span>\n            $ <span class=\"token punctuation\">{</span>listing<span class=\"token punctuation\">.</span>price<span class=\"token punctuation\">}</span>\n          <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>HeadingThree<span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span>BodyOne className<span class=\"token operator\">=</span><span class=\"token string\">\"font-display text-left text-black \"</span><span class=\"token operator\">></span>\n            <span class=\"token punctuation\">{</span>listing<span class=\"token punctuation\">.</span>listingDescription<span class=\"token punctuation\">}</span>\n          <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>BodyOne<span class=\"token operator\">></span>\n\n          <span class=\"token operator\">&lt;</span>HeadingThree className<span class=\"token operator\">=</span><span class=\"token string\">\"font-display text-2xl font-bold text-black mt-10\"</span><span class=\"token operator\">></span>\n            Trip ammenities\n          <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>HeadingThree<span class=\"token operator\">></span>\n\n          <span class=\"token operator\">&lt;</span>div className<span class=\"token operator\">=</span><span class=\"token string\">\"flex flex-col p-3\"</span> key<span class=\"token operator\">=</span><span class=\"token string\">\"types\"</span><span class=\"token operator\">></span>\n            <span class=\"token punctuation\">{</span>listing<span class=\"token punctuation\">.</span>listingType<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">t<span class=\"token punctuation\">,</span> index</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span>\n              <span class=\"token operator\">&lt;</span>div key<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>index<span class=\"token punctuation\">}</span> className<span class=\"token operator\">=</span><span class=\"token string\">\"flex flex-row\"</span><span class=\"token operator\">></span>\n                <span class=\"token operator\">&lt;</span>img src<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>activy<span class=\"token punctuation\">}</span> alt<span class=\"token operator\">=</span><span class=\"token string\">\"activity\"</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n                <span class=\"token operator\">&lt;</span>BodyOne className<span class=\"token operator\">=</span><span class=\"token string\">\"font-display ml-2 mt-2\"</span><span class=\"token operator\">></span><span class=\"token punctuation\">{</span>t<span class=\"token punctuation\">.</span>name<span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>BodyOne<span class=\"token operator\">></span>\n              <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\n            <span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span>\n          <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\n\n          <span class=\"token operator\">&lt;</span>HeadingThree className<span class=\"token operator\">=</span><span class=\"token string\">\"font-display text-2xl font-bold text-black  mt-10\"</span><span class=\"token operator\">></span>\n            Activites\n          <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>HeadingThree<span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span>div className<span class=\"token operator\">=</span><span class=\"token string\">\"flex flex-col p-3\"</span> key<span class=\"token operator\">=</span><span class=\"token string\">\"activies\"</span><span class=\"token operator\">></span>\n            <span class=\"token punctuation\">{</span>listing<span class=\"token punctuation\">.</span>listingActivities<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">a<span class=\"token punctuation\">,</span> index</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span>\n              <span class=\"token operator\">&lt;</span>div key<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>index<span class=\"token punctuation\">}</span> className<span class=\"token operator\">=</span><span class=\"token string\">\"flex flex-row\"</span><span class=\"token operator\">></span>\n                <span class=\"token operator\">&lt;</span>img src<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>amenities<span class=\"token punctuation\">}</span> alt<span class=\"token operator\">=</span><span class=\"token string\">\"amend\"</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n                <span class=\"token operator\">&lt;</span>BodyOne className<span class=\"token operator\">=</span><span class=\"token string\">\"font-display ml-2 mt-2\"</span><span class=\"token operator\">></span><span class=\"token punctuation\">{</span>a<span class=\"token punctuation\">.</span>name<span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>BodyOne<span class=\"token operator\">></span>\n              <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\n            <span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span>\n          <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>div className<span class=\"token operator\">=</span><span class=\"token string\">\"flex flex-col \"</span><span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span>div<span class=\"token operator\">></span>\n            <span class=\"token operator\">&lt;</span>RedBlockButton\n              onClick<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> props<span class=\"token punctuation\">.</span><span class=\"token function\">navigate</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">/booking/</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>props<span class=\"token punctuation\">.</span>id<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span>\n              className<span class=\"token operator\">=</span><span class=\"token string\">\" text-center s:pr-20 mb-10 mt-10\"</span>\n            <span class=\"token operator\">></span>\n              Book\n            <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>RedBlockButton<span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span>div<span class=\"token operator\">></span>\n            <span class=\"token operator\">&lt;</span>HeadingThree className<span class=\"token operator\">=</span><span class=\"token string\">\"font-display text-xl   text-black mt-10 mb-10\"</span><span class=\"token operator\">></span>\n              Your guide\n            <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>HeadingThree<span class=\"token operator\">></span>\n            <span class=\"token operator\">&lt;</span>img\n              src<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>listing<span class=\"token punctuation\">.</span>guide<span class=\"token punctuation\">.</span>Avatar<span class=\"token punctuation\">}</span>\n              alt<span class=\"token operator\">=</span><span class=\"token string\">\"guide\"</span>\n              className<span class=\"token operator\">=</span><span class=\"token string\">\"rounded-lg h-48\"</span>\n            <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span>div<span class=\"token operator\">></span>\n            <span class=\"token operator\">&lt;</span>HeadingThree className<span class=\"token operator\">=</span><span class=\"token string\">\"font-display text-xl   text-black mt-10\"</span><span class=\"token operator\">></span>\n              <span class=\"token punctuation\">{</span>listing<span class=\"token punctuation\">.</span>guide<span class=\"token punctuation\">.</span>Name<span class=\"token punctuation\">}</span>\n            <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>HeadingThree<span class=\"token operator\">></span>\n            <span class=\"token operator\">&lt;</span>BodyOne className<span class=\"token operator\">=</span><span class=\"token string\">\"font-display   text-black mt-5 \"</span><span class=\"token operator\">></span>\n              <span class=\"token punctuation\">{</span>listing<span class=\"token punctuation\">.</span>guide<span class=\"token punctuation\">.</span>Bio<span class=\"token punctuation\">}</span>\n            <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>BodyOne<span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span><span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> ViewListing</code></pre></div>\n<p>👁️ Like with the <code class=\"language-text\">getAllListings</code> query we are hit the <code class=\"language-text\">GET_A_LISTING</code> query however we are passing in the listingId as the variable which we are getting from the URL of this component.</p>\n<p>👁️ In our Return block we have basic markup with CSS Grid to display the content of the listing in a responsive manner. We also map over the activities and types with icons.</p>\n<p>Next up go into the <code class=\"language-text\">Queries.js</code> file and add the following schema doc:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">export</span> <span class=\"token keyword\">const</span> <span class=\"token constant\">GET_A_LISTING</span> <span class=\"token operator\">=</span> gql<span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">\n  query GetAListing($listingId: String!) {\n    getAListing(listingId: $listingId) {\n      coverPhoto\n      listingId\n      listingName\n      listingType {\n        name\n      }\n      listingLocation\n      listingActivities {\n        name\n      }\n      listingDescription\n      price\n      numberOfDays\n      guide {\n        Bio\n        Name\n        Avatar\n      }\n      specialType\n    }\n  }\n</span><span class=\"token template-punctuation string\">`</span></span></code></pre></div>\n<p>👁️ For this specific query we are specifing that the <code class=\"language-text\">listingId</code> is a string and we are querying all the fields from the <code class=\"language-text\">listing</code> Type</p>\n<p>Next go over to the <code class=\"language-text\">routes.js</code> file and add the following:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> React <span class=\"token keyword\">from</span> <span class=\"token string\">\"react\"</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Router <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"@reach/router\"</span>\n<span class=\"token keyword\">import</span> Home <span class=\"token keyword\">from</span> <span class=\"token string\">\"./pages/index\"</span>\n<span class=\"token keyword\">import</span> ViewListing <span class=\"token keyword\">from</span> <span class=\"token string\">\"./pages/ViewListing\"</span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">Routes</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> props <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token operator\">&lt;</span>Router<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>Home path<span class=\"token operator\">=</span><span class=\"token string\">\"/\"</span> props<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>props<span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>ViewListing path<span class=\"token operator\">=</span><span class=\"token string\">\"/listing/:id\"</span> props<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>props<span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Router<span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> Routes</code></pre></div>\n<p>👁️ All we doing here is making our <code class=\"language-text\">ViewListing</code> component accessabile on the <code class=\"language-text\">/listing/:id</code> route, where we will swap <code class=\"language-text\">:id</code> for the actual id of the listing from the server to enable us to query the API for the listing data.</p>\n<p>👁️ By passing down the props into the components we can pass down functions from Reach router and other utils so that it is accessible in other parts of the application.</p>\n<p>Now you should be able to view any listing.</p>\n<p><img src=\"/uploads/viewlisting.png\" alt=\"view-a-listing\"></p>","frontmatter":{"date":"July 20, 2020","path":"/create-view-a-listing-page","title":"Create View a Listing Page","postnumber":44}}},"pageContext":{"previous":{"node":{"frontmatter":{"path":"/setting-up-advanced-forms","postnumber":45}}},"next":{"node":{"frontmatter":{"path":"/create-all-listings-page","postnumber":43}}}}},"staticQueryHashes":["3207677222","3649515864","63159454"]}