<?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: Noble Okechi</title>
    <description>The latest articles on DEV Community by Noble Okechi (@nobleokechi).</description>
    <link>https://dev.to/nobleokechi</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%2F919953%2F7ec0bbf4-f351-4122-ac4a-c8a5347a85f6.jpeg</url>
      <title>DEV Community: Noble Okechi</title>
      <link>https://dev.to/nobleokechi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nobleokechi"/>
    <language>en</language>
    <item>
      <title>🚀 Setting Up CI/CD on Vercel with GitHub Actions (Without a Vercel Pro Plan)</title>
      <dc:creator>Noble Okechi</dc:creator>
      <pubDate>Tue, 29 Jul 2025 04:28:41 +0000</pubDate>
      <link>https://dev.to/nobleokechi/setting-up-cicd-on-vercel-with-github-actions-without-a-vercel-pro-plan-5453</link>
      <guid>https://dev.to/nobleokechi/setting-up-cicd-on-vercel-with-github-actions-without-a-vercel-pro-plan-5453</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Setting up Continuous Integration and Continuous Deployment (CI/CD) is a must-have for modern development teams. While Vercel offers built-in GitHub integration, its &lt;strong&gt;team collaboration features are gated behind a paid Pro plan&lt;/strong&gt;. This becomes a blocker when multiple developers need to deploy but aren’t part of the paid team.&lt;/p&gt;

&lt;p&gt;In this guide, I’ll show you how to &lt;strong&gt;bypass that limitation&lt;/strong&gt; and set up a working &lt;strong&gt;CI/CD pipeline using GitHub Actions and the Vercel CLI&lt;/strong&gt; — all &lt;strong&gt;without needing to pay for Vercel Pro&lt;/strong&gt; or add developers to your Vercel team.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Not Just Use Vercel Teams?
&lt;/h2&gt;

&lt;p&gt;If a non-member tries to deploy to a Vercel team project, they'll see this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@yourgitusername is attempting to deploy a commit to the Team Name' projects team on Vercel, but is not a member of this team.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This error means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The developer is not part of the Vercel team&lt;/li&gt;
&lt;li&gt;The team requires a Pro plan ($20/user/month) to add members&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Solution: Use GitHub Actions + Vercel CLI
&lt;/h2&gt;

&lt;p&gt;Instead of relying on Vercel’s GitHub integration, we use GitHub Actions to automate deployments via the Vercel CLI, authenticated with a token.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What You’ll Need:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A GitHub repo connected to your project&lt;/li&gt;
&lt;li&gt;A Vercel account (personal or team)&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;Vercel token&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Your &lt;strong&gt;Vercel Org ID&lt;/strong&gt; and &lt;strong&gt;Project ID&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Environment variables passed from GitHub Secrets&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step-by-Step Guide
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Generate a Vercel Token&lt;/strong&gt;&lt;br&gt;
Go to: &lt;code&gt;https://vercel.com/account/tokens&lt;/code&gt;&lt;br&gt;
Click "Create Token" and copy it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Get Your Org &amp;amp; Project IDs&lt;/strong&gt;&lt;br&gt;
Run this in your local terminal:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

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

&lt;/div&gt;



&lt;p&gt;Check the &lt;code&gt;.vercel/project.json&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "orgId": "your-vercel-org-id",
  "projectId": "your-vercel-project-id"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Alternative: Use Vercel Dashboard → Network Tab → Inspect project requests.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Add Secrets to GitHub&lt;/strong&gt;
Go to your GitHub repo → Settings → Secrets → Actions → New Repository Secret.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Add:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;VERCEL_TOKEN&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;VERCEL_ORG_ID&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;VERCEL_PROJECT_ID&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;And your required &lt;strong&gt;environment variables&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Create the GitHub Actions Workflow&lt;/strong&gt;
Create &lt;code&gt;.github/workflows/deploy.yml&lt;/code&gt; in your repo:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name: Deploy to Vercel

on:
  push:
    branches:
      - main // your deployment branch

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v3

      - name: Install Bun (if using bun.lock)
        run: |
          curl -fsSL https://bun.sh/install | bash
          echo "$HOME/.bun/bin" &amp;gt;&amp;gt; $GITHUB_PATH

      - name: Install Vercel CLI
        run: npm install -g vercel

      - name: Deploy to Vercel
        env:
          VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}
          VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
          VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}
        run: |
          vercel pull --yes --environment=production --token=$VERCEL_TOKEN
          vercel build --token=$VERCEL_TOKEN
          vercel deploy --prod --token=$VERCEL_TOKEN

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Common Errors &amp;amp; Fixes
&lt;/h2&gt;

&lt;p&gt;❌ &lt;code&gt;spawn bun ENOENT&lt;/code&gt;&lt;br&gt;
You're using bun.lock but bun isn't installed.&lt;br&gt;
Fix: Add a step to install Bun in the workflow, or delete the lock file and switch to &lt;code&gt;npm&lt;/code&gt; or &lt;code&gt;yarn&lt;/code&gt;. A command to install bun is added to the &lt;code&gt;yml&lt;/code&gt; file above.&lt;/p&gt;

&lt;p&gt;❌ &lt;code&gt;Invalid environment variables&lt;/code&gt;&lt;br&gt;
Your app expects env vars at build time, but they’re missing.&lt;br&gt;
Fix: Add them as GitHub secrets and pass them explicitly in &lt;code&gt;env:&lt;/code&gt; section.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Result&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub Actions handling CI/CD&lt;/li&gt;
&lt;li&gt;Vercel builds and deploys on push&lt;/li&gt;
&lt;li&gt;No team member restrictions&lt;/li&gt;
&lt;li&gt;No need to upgrade to Vercel Pro&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;With this setup, you're no longer limited by Vercel's team billing system. You get &lt;strong&gt;full control over deployment, secure CI&lt;/strong&gt;, and &lt;strong&gt;cost-effective collaboration&lt;/strong&gt;, all powered by &lt;strong&gt;GitHub Actions + Vercel CLI&lt;/strong&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Medusa for Developers: A breakdown</title>
      <dc:creator>Noble Okechi</dc:creator>
      <pubDate>Tue, 18 Apr 2023 06:12:51 +0000</pubDate>
      <link>https://dev.to/nobleokechi/medusa-for-developers-a-breakdown-2c40</link>
      <guid>https://dev.to/nobleokechi/medusa-for-developers-a-breakdown-2c40</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://medusajs.com/"&gt;Medusa&lt;/a&gt; is a collection of commerce tools and modules for developers, which are basically used for building unique e-commerce platforms.&lt;/p&gt;

&lt;p&gt;It is an open-source commerce engine for digital commerce building blocks. Medusa’s building blocks eliminate the need to build core commerce logic from scratch and enable you to focus on the customization that moves the needle. All modules are open source and freely available on npm, so you always control your commerce stack.&lt;/p&gt;

&lt;p&gt;Medusa equips developers with the necessary building blocks to develop a dynamic commerce store. The developers are empowered with complete control over their technology stack and the logical operation behind the commerce futures.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Prerequisites&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Medusa commerce engine requires &lt;a href="https://nodejs.org/en/"&gt;Node.js&lt;/a&gt; v14.8+ running on your local computer, for you to start development.&lt;/p&gt;

&lt;h2&gt;
  
  
  Medusa Toolkits
&lt;/h2&gt;

&lt;p&gt;Medusa commerce engine has well-documented Toolkits which are listed below:&lt;/p&gt;

&lt;h3&gt;
  
  
  Medusa Backend
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://docs.medusajs.com/development/backend/install"&gt;Medusa Backend&lt;/a&gt; is the core commerce engine for Medusa. It is a comprehensive platform for managing all aspects of a commerce store, from product management to order processing and fulfillment. It is designed to provide businesses with a flexible and scalable solution for managing their commerce operations.&lt;/p&gt;

&lt;p&gt;Medusa Backend is a Node.js-based open-source codebase that comprises logic, modules, endpoints, services, subscribers, entities, and plugins behind the Medusa commerce engine.&lt;/p&gt;

&lt;p&gt;It offers a range of features, including inventory management, order management, customer management, and payment processing. It also provides powerful reporting tools that give businesses insight into their performance and help them make informed decisions.&lt;/p&gt;

&lt;p&gt;Creating a Medusa Backend project is very easy as it can be handled with just two commands.&lt;/p&gt;

&lt;p&gt;First, install the Medusa CLI tools which enable your local machine to run Medusa;&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="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;install&lt;/span&gt; &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;medusajs&lt;/span&gt;&lt;span class="sr"&gt;/medusa-cli -&lt;/span&gt;&lt;span class="err"&gt;g
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note, this command uses both &lt;code&gt;npm&lt;/code&gt; or &lt;code&gt;Yarn&lt;/code&gt;, see &lt;a href="https://docs.medusajs.com/development/backend/install"&gt;documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Lastly, create a new Medusa Project;&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="nx"&gt;medusa&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;my&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;medusa&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;store&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;seed&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To test your project and learn more on Medusa Backend, see &lt;a href="https://docs.medusajs.com/development/backend/install"&gt;documentations&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Medusa Admin
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://docs.medusajs.com/admin/quickstart"&gt;Medusa Admin&lt;/a&gt; is a powerful and intuitive platform for managing and maintaining a commerce store's back-end operations. It provides a merchant with comprehensive set of tools for managing orders, inventory, customers, and other essential commerce functions.&lt;/p&gt;

&lt;p&gt;It offers a range of features, including an intuitive dashboard, powerful reporting tools, and customizable workflows for managing orders and inventory. It also provides extensive customer management functionality, including tools for managing customer data and communicating with customers.&lt;/p&gt;

&lt;p&gt;Medusa Admin depends on Medusa Backend to function, i.e it works with Medusa Backend through APIs.&lt;/p&gt;

&lt;p&gt;Medusa Admin is a React.js frontend project that communicates data with Medusa Backend through APIs. The platform is designed to be user-friendly, with an intuitive interface that makes it easy for merchants to manage their commerce operations.&lt;/p&gt;

&lt;p&gt;You can install Medusa Admin with the single command  below;&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="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;install&lt;/span&gt; &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;medusajs&lt;/span&gt;&lt;span class="sr"&gt;/admi&lt;/span&gt;&lt;span class="err"&gt;n
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To learn more about Medusa Admin, visit the &lt;a href="https://docs.medusajs.com/starters/nextjs-medusa-starter"&gt;documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Medusa Storefront
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://docs.medusajs.com/starters/nextjs-medusa-starter"&gt;Medusa Storefront&lt;/a&gt; is a Next.js open-source project. It is a comprehensive platform that enables businesses to create engaging and immersive commerce storefronts that offer customers a seamless shopping experience. The Storefront is built on top of Medusa's Backend, making it easy for developers to create customized and powerful online stores.&lt;/p&gt;

&lt;p&gt;Medusa Storefront offers a wide range of features, including product browsing, cart management, checkout, and payment processing. It also provides powerful tools for customizing the look and feel of storefronts, allowing developers to create unique and engaging shopping experiences that reflect around the brand and values of their customers.&lt;/p&gt;

&lt;p&gt;Creating a Medusa Storefront can be done with a single command;&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="nx"&gt;npx&lt;/span&gt; &lt;span class="nx"&gt;create&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt; &lt;span class="nx"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;//github.com/medusajs/nextjs-starter-medusa my-medusa-storefront&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To learn more about Medusa Storefront, visit the &lt;a href="https://docs.medusajs.com/starters/nextjs-medusa-starter"&gt;documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Medusa Javascript Client
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://docs.medusajs.com/js-client/overview"&gt;Medusa JavaScript Client&lt;/a&gt; is a powerful tool that enables developers to integrate Medusa's commerce functionality into their web applications seamlessly. By leveraging the client library, developers can create dynamic and interactive storefronts that offer customers a rich and engaging shopping experience.&lt;/p&gt;

&lt;p&gt;It supports a wide range of functionality, including product browsing, cart management, checkout, and payment processing. It also offers flexible APIs that developers can use to customize and extend the client's functionality to meet their specific needs.&lt;/p&gt;

&lt;p&gt;With its ease of use, clear documentation, and straightforward APIs, developers can quickly get up and running with the client library, allowing them to focus on creating great storefront experiences.&lt;/p&gt;

&lt;p&gt;To install the Medusa Javascript Client run the following command:&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="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;install&lt;/span&gt; &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;medusajs&lt;/span&gt;&lt;span class="sr"&gt;/medusa-j&lt;/span&gt;&lt;span class="err"&gt;s
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To learn more about Medusa Javascript Client, visit the &lt;a href="https://docs.medusajs.com/js-client/overview"&gt;documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Medusa React
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/package/medusa-react"&gt;Medusa React&lt;/a&gt; is a React library that provides a set of utilities and hooks for interacting seamlessly with the Medusa backend. It is a collection of React components that make it easy for developers to integrate Medusa's commerce functionality into their web applications. With the Medusa React library, developers can quickly build dynamic and responsive storefronts that offer customers a seamless shopping experience.&lt;/p&gt;

&lt;p&gt;The Medusa React library includes a range of pre-built components. These components are highly customizable and can be easily integrated into any React-based web application.&lt;/p&gt;

&lt;p&gt;To install Medusa React run the command below in the directory holding your React-based storefront or admin dashboard:&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="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;install&lt;/span&gt; &lt;span class="nx"&gt;medusa&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;react&lt;/span&gt; &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;tanstack&lt;/span&gt;&lt;span class="sr"&gt;/react-query @medusajs/m&lt;/span&gt;&lt;span class="nx"&gt;edus&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To learn more about Medusa React, visit the &lt;a href="https://docs.medusajs.com/js-client/overview"&gt;documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Medusa CLI
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://docs.medusajs.com/cli/reference"&gt;Medusa CLI&lt;/a&gt; (Command Line Interface) is a powerful and flexible tool that enables you to perform important commands while developing with Medusa. The CLI provides developers and system administrators with a range of tools for automating tasks and managing commerce operations from the terminal.&lt;/p&gt;

&lt;p&gt;Medusa CLI is built on top of the Medusa JavaScript client, making it easy to integrate with other Medusa tools and modules. This integration enables developers to create end-to-end commerce solutions that provide a seamless experience for commerce and simplify operations for businesses.&lt;/p&gt;

&lt;p&gt;Medusa CLI can be installed with the command below:&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="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;install&lt;/span&gt; &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;medusajs&lt;/span&gt;&lt;span class="sr"&gt;/medusa-cli -&lt;/span&gt;&lt;span class="err"&gt;g
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To learn more about Medusa CLI, visit the &lt;a href="https://docs.medusajs.com/cli/reference"&gt;documentation&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;Medusa is a robust e-commerce platform designed to provide developers with the flexibility and tools they need to create powerful and unique commerce experiences. With a range of tools and modules available, Medusa offers developers the essential building blocks they need to create custom storefronts, back-end operations, and APIs.&lt;/p&gt;

&lt;p&gt;Medusa is built on top of modern web technologies, including Node.js, React, and GraphQL,  making it easy for developers to understand and integrate with other systems. The platform also supports a range of payment gateways, shipping carriers, and tax services, providing businesses with the flexibility they need to operate in different markets and regions.&lt;/p&gt;

&lt;p&gt;Medusa's modular architecture allows developers to mix and match different components to create custom commerce experiences tailored to their specific needs. Additionally, its open-source nature means that developers can contribute to the platform's ongoing development and improvement.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>medusa</category>
      <category>developers</category>
      <category>react</category>
    </item>
    <item>
      <title>How I Built Ecommerce store with Next.js + Medusa + Stripe + Vercel</title>
      <dc:creator>Noble Okechi</dc:creator>
      <pubDate>Mon, 13 Feb 2023 12:56:03 +0000</pubDate>
      <link>https://dev.to/nobleokechi/how-i-built-ecommerce-store-with-nextjs-medusa-stripe-k5d</link>
      <guid>https://dev.to/nobleokechi/how-i-built-ecommerce-store-with-nextjs-medusa-stripe-k5d</guid>
      <description>&lt;p&gt;When it comes to setting up an online store, finding the right hosting provider is essential. A reliable host can ensure that your website stays up and running, even during periods of high traffic. &lt;a href="https://vercel.com/"&gt;Vercel&lt;/a&gt; is a hosting provider optimized for performance and scalability; it's a great choice for ecommerce storefronts.&lt;/p&gt;

&lt;p&gt;Having a good host, however, is only half the battle; you also need a flexible ecommerce engine that can be customized to suit your needs, and this is where you need Medusa. Medusa is a composable ecommerce engine that offers many out-of-the-box features. It allows developers to choose any frontend stack and tailor the storefront as they wish.&lt;/p&gt;

&lt;p&gt;In this tutorial, you will learn how to build a complete commerce site using Next.js,  Medusa, and  Stripe, and deploy the site using Vercel.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Vercel?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://vercel.com/docs/concepts/get-started"&gt;Vercel&lt;/a&gt; is a cloud platform that enables developers to easily build and deploy modern web projects built with frameworks like Next.js, Svelte, React.js, Nuxt.js, and more. With Vercel, you can host static sites and serverless functions. You can take advantage of the exciting features, such as automatic HTTPS, global CDN, Vercel CLI, and atomic deployments. &lt;/p&gt;

&lt;p&gt;Vercel integrates with Git, i.e. it can connect to your Git repository and automatically deploy your code when changes are made to it. This is known as "continuous integration and deployment" (CI/CD). &lt;/p&gt;

&lt;p&gt;Hence, you can easily deploy your projects without having to worry about managing infrastructure. Whether you're a beginner or an experienced developer, Vercel provides a seamless developer experience that allows you to focus on building great products.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why use Vercel?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Easy Deployment and Hosting: Vercel makes it simple to deploy and host web projects with its intuitive interface and one-click setup.&lt;/li&gt;
&lt;li&gt;Integration with Popular Frameworks and Tools: Vercel supports a many popular frameworks and tools, including React, Angular, Vue, Next.js, and more, making it a versatile option for a variety of web projects.&lt;/li&gt;
&lt;li&gt;Automatic HTTPS and Global CDN: Vercel automatically provisions and renews SSL certificates for your domain and distributes your project's files to a global CDN, which helps to improve the performance and security of your website.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What is Next.js?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://nextjs.org/docs/getting-started"&gt;Next.js&lt;/a&gt; is a popular open source JavaScript framework for building server-rendered and statically-generated web applications. It is based on React, a JavaScript library for building user interfaces. It is designed to make it easy for developers to create fast, scalable web applications that are optimized for performance.&lt;/p&gt;

&lt;p&gt;Next.js provides features and tools for building and deploying web applications, including server-side rendering, automatic code splitting, incremental static regeneration, data fetching, and support for static and dynamic routes. &lt;/p&gt;

&lt;p&gt;It is SEO-friendly and widely used by developers to build modern web applications. It is known for its simplicity and ease of use.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why use Next.js?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Server Rendering: Next.js is a framework for building server-rendered React applications. This means that the initial render of a Next.js application is done on the server, which can improve the performance and SEO of your website.&lt;/li&gt;
&lt;li&gt;Automatic Code Splitting: Next.js automatically splits your code into small chunks, which helps to reduce the initial load time of your website and improve the user experience.&lt;/li&gt;
&lt;li&gt;Hot Code Reloading: Next.js supports hot code reloading, which allows you to see changes in your code without having to manually refresh the page.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What is Medusa?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/medusajs/medusa"&gt;Medusa&lt;/a&gt; is an open source, &lt;a href="https://medusajs.com/blog/nodejs-ecommerce-backend/"&gt;Node.js-based&lt;/a&gt;, composable commerce engine. It has an amazing developer experience and endless customization options for ecommerce businesses looking to scale.&lt;/p&gt;

&lt;p&gt;Medusa has three components: Medusa Server, Medusa Admin, and Medusa Storefront. The Medusa server can be integrated with any &lt;a href="https://medusajs.com/blog/which-frontend-framework-you-should-pick-for-your-ecommerce-storefront/"&gt;frontend&lt;/a&gt; technology of your choice, thereby making it easy for developers to use different frontend technology while building their online stores.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ygDQ6341--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4s0uuuwas2l139srmd5c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ygDQ6341--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4s0uuuwas2l139srmd5c.png" alt="Image description" width="880" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Medusa has essential ecommerce features such as an admin dashboard, a multi-payment option, manual orders, &lt;a href="https://medusajs.com/blog/multi-currency-ecommerce/"&gt;multi-currency support&lt;/a&gt;, a shopping cart, products and image optimization, an SEO-friendly interface, and more.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why use Medusa?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Accessible Codebase: As an open source commerce engine, Medusa has all its codebase available on its official GitHub Repository, making it more accessible for developers.&lt;/li&gt;
&lt;li&gt;Headless Architecture: Medusa is based on Node.js and separates the frontend from the backend. It also separates the admin panel from the backend. Making changes in one part, either backend, admin, or storefront doesn’t affect the other. This will help developers know where to focus when fixing a bug.&lt;/li&gt;
&lt;li&gt;Strong Community Support: Medusa provides 24/7 community support through its Discord channel.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What is Stripe?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://stripe.com/payments"&gt;Stripe&lt;/a&gt; is a payment processing platform that provides a simple, secure way for businesses to accept payments online. It offers a range of tools and services for processing transactions, including support for credit and debit card payments and other forms of payment such as Apple Pay and Google Pay. &lt;/p&gt;

&lt;p&gt;Stripe provides a comprehensive set of APIs and libraries that make it easy for developers to integrate its payment processing capabilities into their websites and applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why use Stripe?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Secure Payments: Stripe uses industry-standard security measures to ensure that all transactions are secure and compliant with regulations.&lt;/li&gt;
&lt;li&gt;Scalability: Stripe can handle large numbers of transactions and can easily scale to meet the needs of growing businesses.&lt;/li&gt;
&lt;li&gt;Robust Feature Set: Stripe offers a variety of features, including subscriptions, recurring payments, and fraud detection, which can help businesses streamline their payment process.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before starting this tutorial, ensure you have the following ready:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://nodejs.org/en/"&gt;Node.js&lt;/a&gt; (v14 or later)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dashboard.stripe.com/register"&gt;Stripe&lt;/a&gt; account (with API keys ready)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://git-scm.com/download/win"&gt;Git&lt;/a&gt; installation&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://vercel.com/signup"&gt;Vercel&lt;/a&gt; account&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Creating a Medusa Project
&lt;/h2&gt;

&lt;p&gt;A Medusa project is composed of the server, storefront, and admin. All these will be installed using a single command line.&lt;/p&gt;

&lt;p&gt;In your terminal, run the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx create-medusa-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;While the above command is running, you’ll be asked to enter the name of the directory you want the project to be installed. You can either leave the default value &lt;code&gt;my-medusa-store&lt;/code&gt; or enter a new name.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JkCNx15i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hu6lo5wekymy5e25on9q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JkCNx15i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hu6lo5wekymy5e25on9q.png" alt="Image description" width="786" height="108"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, choose the Medusa server starter. The Medusa server is created from a starter template. By default, it is created from the &lt;code&gt;medusa-starter-default&lt;/code&gt; template. So choose &lt;code&gt;medusa-starter-default&lt;/code&gt; to enable you to follow up with this project.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---Af6itlU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rh6kd0okm55y6srha5lx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---Af6itlU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rh6kd0okm55y6srha5lx.png" alt="Image description" width="786" height="187"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Doing this will install the server under the directory &lt;code&gt;my-medusa-store/backend&lt;/code&gt;. It will also create an SQLite database inside that directory with demo data seeded into it.&lt;/p&gt;

&lt;p&gt;After choosing the Medusa starter, the next prompt will ask you to choose the storefront starter. Choose Next.js Starter which is what you will use for this project storefront.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wnrVfztm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v9fh4wux0w3wdndhnkr2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wnrVfztm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v9fh4wux0w3wdndhnkr2.png" alt="Image description" width="736" height="207"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you are successfully done with the above, you can follow the code block below to navigate around your store server, admin, and storefront:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;## Medusa API&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;my-medusa-store/backend
medusa develop

&lt;span class="c"&gt;## Medusa Store Admin&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;my-medusa-store/admin
npm start

&lt;span class="c"&gt;## Medusa Storefront&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;my-medusa-store/storefront
npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Note: Each folder (backend, admin, and storefront) has its own Git history.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Install and Configure Stripe Medusa Plugin in Medusa Backend
&lt;/h2&gt;

&lt;p&gt;The &lt;em&gt;Stripe Medusa plugin will&lt;/em&gt; enable Stripe payment to work on this project and also create a channel for your project to communicate with Stripe APIs.&lt;/p&gt;

&lt;p&gt;Before you start, navigate to your &lt;code&gt;backend&lt;/code&gt; directory using the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;my-medusa-store/backend
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the root of your backend, run the following command to install the Stripe plugin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;medusa-payment-stripe
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, you need to add  STRIPE API KEY and STRIPE WEBHOOK SECRET to your &lt;code&gt;.env&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;STRIPE_API_KEY=example_API_key_xxxxx
STRIPE_WEBHOOK_SECRET=example_WEBHOOK_key_xxxxx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the above, replace &lt;code&gt;example_API_key_xxxxx&lt;/code&gt; and &lt;code&gt;example_WEBHOOK_key_xxxxx&lt;/code&gt;  with the keys gotten from your &lt;a href="https://dashboard.stripe.com/test/apikeys"&gt;Stripe dashboard&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: Stripe webhook secret is not necessary to add in development. You can skip it if you wish.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Next, you need to add configurations for your Stripe plugin. In &lt;code&gt;medusa-config.js&lt;/code&gt;, add the following at the end of the &lt;code&gt;plugins&lt;/code&gt; array:&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;plugins&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="c1"&gt;// ...&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`medusa-payment-stripe`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;api_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;STRIPE_API_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;webhook_secret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;STRIPE_WEBHOOK_SECRET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Test Medusa Server
&lt;/h3&gt;

&lt;p&gt;If you’ve completed the above processes, start your store server with the command below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;medusa develop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can navigate to &lt;code&gt;localhost:9000/store/products/&lt;/code&gt; to see available products in your store.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---xichHLk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hzgkmzrp1wjhqifmh8db.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---xichHLk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hzgkmzrp1wjhqifmh8db.png" alt="Image description" width="747" height="580"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The image you see above represents a sample response containing your store products. You should see something similar. &lt;/p&gt;

&lt;h3&gt;
  
  
  Enable Stripe Payment Provider in a Region
&lt;/h3&gt;

&lt;p&gt;Regions in Medusa are used to manage the markets where you will operate within. You can manage and add multiple countries in a region. You can also manage shipping options and payment providers.&lt;/p&gt;

&lt;p&gt;Before you start, navigate to your &lt;code&gt;admin&lt;/code&gt; directory and start your admin using the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;my-medusa-store/admin
npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ensure your &lt;em&gt;backend server&lt;/em&gt; is still running, then &lt;code&gt;localhost:7000&lt;/code&gt; on your browser to access your admin page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--f9046WS1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hi3mwgh2n1hspmvivan6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--f9046WS1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hi3mwgh2n1hspmvivan6.png" alt="Image description" width="880" height="528"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you completed the steps above successfully, then you should a page similar to the image above.&lt;/p&gt;

&lt;p&gt;Medusa seeded your database with a demo admin that you can log in with. The email is &lt;code&gt;admin@medusa-test.com&lt;/code&gt;, and the password is &lt;code&gt;supersecret&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If you log in with the demo admin login details, you will have access to your admin dashboard.&lt;/p&gt;

&lt;p&gt;The next step is to add Stripe Payment to your Regions, simply follow the steps below:&lt;/p&gt;

&lt;p&gt;Go to &lt;em&gt;Settings → Regions&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NkZYxI99--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hp4r2atakeqxcrw504c2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NkZYxI99--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hp4r2atakeqxcrw504c2.png" alt="Image description" width="880" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on the region you want to edit from the &lt;em&gt;Regions&lt;/em&gt; section.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--u72gOC2e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5k1m8uk5olh4xznxa2pr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--u72gOC2e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5k1m8uk5olh4xznxa2pr.png" alt="Image description" width="880" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on the three-dot icon at the top right of the selected region and click on &lt;em&gt;Edit Region Details&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eAH_ClGs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4cdg22hd5n73c3r0gfxo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eAH_ClGs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4cdg22hd5n73c3r0gfxo.png" alt="Image description" width="880" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select Stripe as the payment provider.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HhKukAlo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8q51gn7l0ljdyiermxv5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HhKukAlo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8q51gn7l0ljdyiermxv5.png" alt="Image description" width="880" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once done with step 4, you can click on the &lt;em&gt;Save and close&lt;/em&gt; button to save.&lt;/p&gt;

&lt;p&gt;Repeat these steps to add Stripe Payment to other regions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test Next.js Storefront
&lt;/h2&gt;

&lt;p&gt;Before testing, switch to the &lt;em&gt;storefront&lt;/em&gt; directory and rename the template environment variable file to use environment variables in development:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;my-medusa-store/storefront
&lt;span class="nb"&gt;mv&lt;/span&gt; .env.template .env.local
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, add Stripe public key to your Next.js storefront.&lt;/p&gt;

&lt;p&gt;In your &lt;code&gt;.env.local&lt;/code&gt; file (or the file you’re using for your environment variables), add the following variable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NEXT_PUBLIC_STRIPE_KEY=&amp;lt;YOUR_PUBLISHABLE_KEY&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make sure to replace &lt;code&gt;&amp;lt;YOUR_PUBLISHABLE_KEY&amp;gt;&lt;/code&gt; with your &lt;a href="https://dashboard.stripe.com/test/apikeys"&gt;Stripe Publishable Key&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Lastly, ensure your Medusa server is running, then run the command below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After a few seconds of running the above command, navigate to &lt;code&gt;localhost:8000&lt;/code&gt; on your browser to see your Next.js ecommerce storefront homepage.&lt;/p&gt;

&lt;p&gt;Scroll down to select a product from the featured products on the homepage.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VRRU2xxA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bc1ckr431c7gcca4iolr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VRRU2xxA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bc1ckr431c7gcca4iolr.png" alt="Image description" width="880" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on a product to view the single product **page where you can add items to your cart.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5g1s8Er0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xhtb89zp0jh2drztu1fn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5g1s8Er0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xhtb89zp0jh2drztu1fn.png" alt="Image description" width="880" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you click on &lt;em&gt;My Bag&lt;/em&gt; at the top right of your store, you will view the cart review page of your store.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--b8Tb745m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hpkk54e0zk7a77trtwcs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--b8Tb745m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hpkk54e0zk7a77trtwcs.png" alt="Image description" width="880" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on &lt;em&gt;GO TO CHECKOUT&lt;/em&gt; to see your &lt;em&gt;Checkout&lt;/em&gt; page, where you will be asked to input your delivery information.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--k2ZXIXSh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/974r7si86o067ybnowhd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--k2ZXIXSh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/974r7si86o067ybnowhd.png" alt="Image description" width="880" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After a successful payment, you’ll see the &lt;em&gt;Order Receipt&lt;/em&gt; Page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TTRAnbmU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r4l97rtgay4fbjs9ye9m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TTRAnbmU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r4l97rtgay4fbjs9ye9m.png" alt="Image description" width="880" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Deployment to Vercel
&lt;/h2&gt;

&lt;p&gt;After testing your store, the next thing is to deploy your store backend, admin, and storefront using Vercel.&lt;/p&gt;

&lt;h3&gt;
  
  
  Deploying Medusa Backend
&lt;/h3&gt;

&lt;p&gt;Medusa has already provided different clear documentation on how to host Medusa Server in different hosting servers.&lt;/p&gt;

&lt;p&gt;You check &lt;a href="https://docs.medusajs.com/deployments/server/"&gt;Medusa Server Deployment Guide&lt;/a&gt; to deploy your backend to any server of your choice. &lt;/p&gt;

&lt;h3&gt;
  
  
  Deploying Medusa Admin Panel
&lt;/h3&gt;

&lt;p&gt;You can easily deploy your Medusa Admin on Netlify by following Medusa &lt;a href="https://docs.medusajs.com/deployments/admin/deploying-on-netlify"&gt;Admin Deployment Guide&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Deploying Next.js Storefront
&lt;/h3&gt;

&lt;p&gt;In deploying your Next.js Storefront, you will handle this using Vercel.&lt;/p&gt;

&lt;p&gt;Deploying Next.js storefront in Vercel can be done using &lt;a href="https://vercel.com/guides/deploying-nextjs-with-vercel#vercel-cli"&gt;Vercel CLI&lt;/a&gt; or &lt;a href="https://vercel.com/guides/deploying-nextjs-with-vercel#vercel-for-git"&gt;Vercel for Git&lt;/a&gt;. For this tutorial, you can deploy using Vercel for Git, using the steps below as a guide.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: You should have the backend URL ready because it will be needed.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Push your storefront project to a GitHub repository.&lt;/p&gt;

&lt;p&gt;On your Vercel dashboard, click on the &lt;em&gt;import&lt;/em&gt; button to import a new project.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LqthhT1f--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wx5gq1dxxii7bp0qtcrc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LqthhT1f--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wx5gq1dxxii7bp0qtcrc.png" alt="Image description" width="880" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enter the name of your project in the &lt;em&gt;Project Name&lt;/em&gt; field.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hurYwidl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0ijicod92t7buba3xtmi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hurYwidl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0ijicod92t7buba3xtmi.png" alt="Image description" width="880" height="387"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Add the environment variables: &lt;code&gt;NEXT_PUBLIC_MEDUSA_BACKEND_URL&lt;/code&gt; and &lt;code&gt;NEXT_PUBLIC_STRIPE_KEY&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uWX_XKdn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pym1iavvb2k70uz279f8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uWX_XKdn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pym1iavvb2k70uz279f8.png" alt="Image description" width="811" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When configuring your environment variable, ensure you set the backend URL with your production server (for example:  &lt;a href="https://my-medusa-server.com"&gt;https://my-medusa-server.com&lt;/a&gt;) and your live Stripe public key.&lt;/p&gt;

&lt;p&gt;Click on &lt;em&gt;deploy&lt;/em&gt; to start the deployment process.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--coOiT09K--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lbd34thnvxw291ec2ljo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--coOiT09K--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lbd34thnvxw291ec2ljo.png" alt="Image description" width="880" height="346"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once the deployment process is completed, your storefront is ready. You can visit the domain link to view your storefront.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: Before testing, ensure you update your server’s &lt;code&gt;STORE_CORS&lt;/code&gt; environment variable with the new Vercel URL to avoid CORS issues. You can check &lt;a href="https://docs.medusajs.com/usage/configurations#storefront-cors"&gt;CORS configurations&lt;/a&gt; on Medusa documentation.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;In this tutorial, you learned how to build a Vercel ecommerce site using Next.js, Medusa,  and Stripe. You’ve gone through the steps of setting up Medusa Server, Medusa Admin, and Medusa Next.js Storefront.&lt;/p&gt;

&lt;p&gt;You can also add various features to your store, like &lt;a href="https://docs.medusajs.com/add-plugins/algolia"&gt;Algolia&lt;/a&gt; search engine service, &lt;a href="https://docs.medusajs.com/add-plugins/mailchimp"&gt;Mailchimp&lt;/a&gt; email marketing service for newsletters, &lt;a href="https://docs.medusajs.com/add-plugins/segment"&gt;Segment&lt;/a&gt; data platform for collecting analytics, and many more.&lt;/p&gt;

&lt;p&gt;You can learn more about Medusa commerce engine from &lt;a href="https://docs.medusajs.com/introduction"&gt;Medusa’s Documentation&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Should you have any issues or questions related to Medusa, then feel free to reach out to the Medusa team via &lt;a href="https://discord.gg/medusajs"&gt;Discord&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>vercel</category>
      <category>nextjs</category>
      <category>stripe</category>
      <category>javascript</category>
    </item>
    <item>
      <title>How I Built a Food Ecommerce Restaurant with Next.js, Paystack and Medusa</title>
      <dc:creator>Noble Okechi</dc:creator>
      <pubDate>Thu, 05 Jan 2023 14:21:41 +0000</pubDate>
      <link>https://dev.to/medusajs/how-i-built-a-food-ecommerce-restaurant-with-nextjs-paystack-and-medusa-2oh0</link>
      <guid>https://dev.to/medusajs/how-i-built-a-food-ecommerce-restaurant-with-nextjs-paystack-and-medusa-2oh0</guid>
      <description>&lt;p&gt;Food restaurants remain one of the best lucrative businesses around the world. They get patronage on a daily basis without being much affected by a country's economy because people depend on food for survival.&lt;/p&gt;

&lt;p&gt;Creating an avenue for your food restaurant to sell online helps your business reach a wide range of people who won’t be available to buy in your physical shop and increases your daily sales&lt;/p&gt;

&lt;p&gt;In this tutorial, you will learn how to build a complete food ecommerce restaurant using &lt;a href="https://medusajs.com/" rel="noopener noreferrer"&gt;Medusa&lt;/a&gt; ecommerce engine with &lt;a href="https://paystack.com/" rel="noopener noreferrer"&gt;Paystack&lt;/a&gt; integration.&lt;/p&gt;

&lt;p&gt;The full code for this project is on this &lt;a href="https://github.com/noblefresh/food-restaurant-storefront" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="/images/Video_221219012504(1).gif" class="article-body-image-wrapper"&gt;&lt;img src="/images/Video_221219012504(1).gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Medusa?
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/medusajs" rel="noopener noreferrer"&gt;
        medusajs
      &lt;/a&gt; / &lt;a href="https://github.com/medusajs/medusa" rel="noopener noreferrer"&gt;
        medusa
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      The world's most flexible commerce platform.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;
  &lt;a href="https://www.medusajs.com" rel="nofollow noopener noreferrer"&gt;
  
    
    
    &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F59018053%2F229103726-e5b529a3-9b3f-4970-8a1f-c6af37f087bf.svg" class="article-body-image-wrapper"&gt;&lt;img alt="Medusa logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F59018053%2F229103726-e5b529a3-9b3f-4970-8a1f-c6af37f087bf.svg"&gt;&lt;/a&gt;
    
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;
  Medusa
&lt;/h1&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;
  &lt;a href="https://docs.medusajs.com" rel="nofollow noopener noreferrer"&gt;Documentation&lt;/a&gt; |
  &lt;a href="https://www.medusajs.com" rel="nofollow noopener noreferrer"&gt;Website&lt;/a&gt;
&lt;/h4&gt;
&lt;/div&gt;

&lt;p&gt;
  Building blocks for digital commerce
&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://github.com/medusajs/medusa/blob/develop/LICENSE" rel="noopener noreferrer"&gt;
    &lt;img src="https://camo.githubusercontent.com/6581c31c16c1b13ddc2efb92e2ad69a93ddc4a92fd871ff15d401c4c6c9155a4/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d626c75652e737667" alt="Medusa is released under the MIT license."&gt;
  &lt;/a&gt;
  &lt;a href="https://github.com/medusajs/medusa/blob/develop/CONTRIBUTING.md" rel="noopener noreferrer"&gt;
    &lt;img src="https://camo.githubusercontent.com/11c502cb0edd6eac274e462c7a70981ee26fde99043dba967b732d371efa2b87/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5052732d77656c636f6d652d627269676874677265656e2e7376673f7374796c653d666c6174" alt="PRs welcome!"&gt;
  &lt;/a&gt;
 &lt;/p&gt;
&lt;p&gt;
  &lt;a href="https://twitter.com/intent/follow?screen_name=medusajs" rel="nofollow noopener noreferrer"&gt;
    &lt;img src="https://camo.githubusercontent.com/6c164f14e4a24c801d3396eff84dbc5a7d8a3a6458b1c09ebbaaa0006d244a8c/68747470733a2f2f696d672e736869656c64732e696f2f747769747465722f666f6c6c6f772f6d65647573616a732e7376673f6c6162656c3d466f6c6c6f77253230406d65647573616a73" alt="Follow @medusajs"&gt;
  &lt;/a&gt;&lt;a href="https://discord.gg/medusajs" rel="nofollow noopener noreferrer"&gt;
    &lt;img src="https://camo.githubusercontent.com/4921ed6603bc6780b3892f60abb1cd1143568cf1595701546c32f7a2619d9daf/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f636861742d6f6e253230646973636f72642d3732383944412e737667" alt="Discord Chat"&gt;
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Getting Started&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;Visit the &lt;a href="https://docs.medusajs.com/learn" rel="nofollow noopener noreferrer"&gt;Documentation&lt;/a&gt; to set up a Medusa application.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What is Medusa&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;Medusa is an ecommerce platform with a built-in framework for customization that allows you to build custom commerce applications without reinventing core commerce logic. The framework and modules can be used to build advanced B2B or DTC ecommerce stores, marketplaces, PoS systems, service businesses, or any product that needs foundational commerce primitives. All commerce modules are open-source and freely available on npm.&lt;/p&gt;

&lt;p&gt;Learn more about &lt;a href="https://docs.medusajs.com/learn/advanced-development/architecture/overview" rel="nofollow noopener noreferrer"&gt;Medusa’s architecture&lt;/a&gt; and &lt;a href="https://docs.medusajs.com/resources/commerce-modules" rel="nofollow noopener noreferrer"&gt;commerce modules&lt;/a&gt; in the Docs.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Upgrades &amp;amp; Integrations&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;Follow the &lt;a href="https://github.com/medusajs/medusa/releases" rel="noopener noreferrer"&gt;Release Notes&lt;/a&gt; to keep your Medusa project up-to-date.&lt;/p&gt;

&lt;p&gt;Check out all &lt;a href="https://docs.medusajs.com/resources/integrations" rel="nofollow noopener noreferrer"&gt;available Medusa integrations&lt;/a&gt;.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Community &amp;amp; Contributions&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;The community and core team are available in &lt;a href="https://github.com/medusajs/medusa/discussions" rel="noopener noreferrer"&gt;GitHub Discussions&lt;/a&gt;, where you can ask for support, discuss roadmap, and share ideas.&lt;/p&gt;

&lt;p&gt;Our &lt;a href="https://github.com/medusajs/medusa/blob/develop/CONTRIBUTING.md" rel="noopener noreferrer"&gt;Contribution Guide&lt;/a&gt; describes how to contribute to the…&lt;/p&gt;
&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/medusajs/medusa" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;&lt;a href="https://medusajs.com/" rel="noopener noreferrer"&gt;Medusa&lt;/a&gt; provides bespoke commerce infrastructure for developers. Its composable commerce engine addresses the challenges of existing ecommerce platforms which APIs offer bad developer experiences, extension capabilities are insufficient, and results are hacky and hard to maintain.&lt;/p&gt;

&lt;p&gt;The solutions ships as a headless backend with a comprehensive feature set covering core elements related to order, product, and customer handling. In addition, it provides advanced features related to promotions, multi-currency handling, RMA flows, customer group handling and much more. For a comprehensive overview of the solutions and integrations, see &lt;a href="https://docs.medusajs.com/" rel="noopener noreferrer"&gt;Medusa’s documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://github.com/medusajs/medusa" rel="noopener noreferrer"&gt;If you like this tutorial, please give Medusa a 🌟 on GitHub&lt;/a&gt;
&lt;/h3&gt;

&lt;h2&gt;
  
  
  What is Next.js?
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/vercel" rel="noopener noreferrer"&gt;
        vercel
      &lt;/a&gt; / &lt;a href="https://github.com/vercel/next.js" rel="noopener noreferrer"&gt;
        next.js
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      The React Framework
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div&gt;
  &lt;a href="https://nextjs.org" rel="nofollow noopener noreferrer"&gt;
    
      
      &lt;img alt="Next.js logo" src="https://camo.githubusercontent.com/26d06a6572aa5d9ecdb699add71d40e57aefe8244c6306ba58a70aee6ad5123c/68747470733a2f2f6173736574732e76657263656c2e636f6d2f696d6167652f75706c6f61642f76313636323133303535392f6e6578746a732f49636f6e5f6c696768745f6261636b67726f756e642e706e67" height="128"&gt;
    
  &lt;/a&gt;
  &lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Next.js&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://vercel.com" rel="nofollow noopener noreferrer"&gt;&lt;img alt="Vercel logo" src="https://camo.githubusercontent.com/a7ee01bcc96a6e07e392a87f7e3202faa847efd0bc129e66f716ea98d9302ced/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4d414445253230425925323056657263656c2d3030303030302e7376673f7374796c653d666f722d7468652d6261646765266c6f676f3d56657263656c266c6162656c436f6c6f723d303030"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/next" rel="nofollow noopener noreferrer"&gt;&lt;img alt="NPM version" src="https://camo.githubusercontent.com/60dcf9db176916c5e18b23978eb6d1c0282a88ed3d9632568c6b953f868b3b6f/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f6e6578742e7376673f7374796c653d666f722d7468652d6261646765266c6162656c436f6c6f723d303030303030"&gt;&lt;/a&gt;
&lt;a href="https://github.com/vercel/next.js/blob/canary/license.md" rel="noopener noreferrer"&gt;&lt;img alt="License" src="https://camo.githubusercontent.com/34bfded824851462f4cbaf614527b184b1872b41e35a6414ecbff72ecbe1e25a/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f6c2f6e6578742e7376673f7374796c653d666f722d7468652d6261646765266c6162656c436f6c6f723d303030303030"&gt;&lt;/a&gt;
&lt;a href="https://github.com/vercel/next.js/discussions" rel="noopener noreferrer"&gt;&lt;img alt="Join the community on GitHub" src="https://camo.githubusercontent.com/84f18bb62460515b8c657f349c87d7f8a85b6044b58e73495f4dbe79588f59c5/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4a6f696e253230746865253230636f6d6d756e6974792d626c756576696f6c65742e7376673f7374796c653d666f722d7468652d6261646765266c6f676f3d4e6578742e6a73266c6162656c436f6c6f723d303030303030266c6f676f57696474683d3230"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Getting Started&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Used by some of the world's largest companies, Next.js enables you to create full-stack web applications by extending the latest React features, and integrating powerful Rust-based JavaScript tooling for the fastest builds.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Visit our &lt;a href="https://nextjs.org/learn" rel="nofollow noopener noreferrer"&gt;Learn Next.js&lt;/a&gt; course to get started with Next.js.&lt;/li&gt;
&lt;li&gt;Visit the &lt;a href="https://nextjs.org/showcase" rel="nofollow noopener noreferrer"&gt;Next.js Showcase&lt;/a&gt; to see more sites built with Next.js.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Documentation&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Visit &lt;a href="https://nextjs.org/docs" rel="nofollow noopener noreferrer"&gt;https://nextjs.org/docs&lt;/a&gt; to view the full documentation.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Community&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;The Next.js community can be found on &lt;a href="https://github.com/vercel/next.js/discussions" rel="noopener noreferrer"&gt;GitHub Discussions&lt;/a&gt; where you can ask questions, voice ideas, and share your projects with other people.&lt;/p&gt;
&lt;p&gt;To chat with other community members you can join the Next.js &lt;a href="https://nextjs.org/discord" rel="nofollow noopener noreferrer"&gt;Discord&lt;/a&gt; server.&lt;/p&gt;
&lt;p&gt;Do note that our &lt;a href="https://github.com/vercel/next.js/blob/canary/CODE_OF_CONDUCT.md" rel="noopener noreferrer"&gt;Code of Conduct&lt;/a&gt; applies to all Next.js community channels. Users are &lt;strong&gt;highly encouraged&lt;/strong&gt; to read and adhere to it to avoid repercussions.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Contributing&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Contributions to Next.js are welcome and highly appreciated. However, before you jump right into it, we would like you to review our…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/vercel/next.js" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;a href="https://nextjs.org/" rel="noopener noreferrer"&gt;Next.js&lt;/a&gt; is a JavaScript open source framework for building superfast and extremely user-friendly frontend websites using React. It is a server-rendered, lightweight, and flexible React framework that requires little or no configuration during usage.&lt;/p&gt;

&lt;p&gt;Using Medusa commerce engine to build your online stores gives you the opportunity to work with Medusa Next.js storefront starter, which can be easily installed through CLI commands.&lt;/p&gt;

&lt;p&gt;Medusa Next.js storefront is a 100% ready-to-use Medusa storefront template. It comes with all ecommerce storefront features such as product display, featured products, shopping cart, checking out, multiple payment processing, and more.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Paystack?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://paystack.com" rel="noopener noreferrer"&gt;Paystack&lt;/a&gt; is the #1 African payment gateway that helps businesses to accept online payments through their ecommerce stores, websites, and applications. Paystack provides other services such as point-of-sale (PoS), payment through an invoice, and more.&lt;/p&gt;

&lt;p&gt;The integration between Medusa and Paystack can be achieved using a &lt;a href="https://github.com/a11rew/medusa-payment-paystack" rel="noopener noreferrer"&gt;community plugin&lt;/a&gt;, which you’ll learn in this tutorial.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Prerequisites&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Before you start, be sure you have the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://nodejs.org" rel="noopener noreferrer"&gt;Node.js&lt;/a&gt; (version 14 or above)&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://paystack.com/" rel="noopener noreferrer"&gt;Paystack&lt;/a&gt; Account with API Secret and Public Key&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Set up Your Food Restaurant Ecommerce with Medusa
&lt;/h2&gt;

&lt;p&gt;To start building with Medusa, follow these simple steps below:&lt;/p&gt;

&lt;h3&gt;
  
  
  Install Medusa CLI
&lt;/h3&gt;

&lt;p&gt;Medusa CLI tool can be installed either using &lt;code&gt;npm&lt;/code&gt; or &lt;code&gt;yarn&lt;/code&gt;, but this tutorial is based on &lt;code&gt;npm&lt;/code&gt;. Use the command below to install Medusa CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install @medusajs/medusa-cli -g
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Creating Your New Food Restaurant Store Server
&lt;/h3&gt;

&lt;p&gt;The command below will create a new Medusa store for you:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;medusa new my-food-restaurant --seed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;my-food-restaurant&lt;/code&gt; will be your project name, but you can change this to your preferred choice of name.&lt;/p&gt;

&lt;p&gt;Switch to the project directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd my-food-restaurant
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Installing Paystack Medusa Plugin
&lt;/h3&gt;

&lt;p&gt;In the root of your project, &lt;code&gt;my-food-restaurant&lt;/code&gt;, run this command to install Medusa Paystack plugin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install medusa-payment-paystack
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, you need to configure your Paystack plugin in your project. To do this, first, add  PAYSTACK SECRET KEY to your &lt;code&gt;.env&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PAYSTACK_SECRET_KEY=example_key_xxxxx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the above, replace &lt;code&gt;example_key_xxxxx&lt;/code&gt; with the secret key gotten from your &lt;a href="https://dashboard.paystack.com/#/settings/developer" rel="noopener noreferrer"&gt;Paystack API Key&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In &lt;code&gt;medusa-config.js&lt;/code&gt;, add the following at the end of the &lt;code&gt;plugins&lt;/code&gt;array:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    resolve: `medusa-payment-paystack`,
    options: {
      secret_key: process.env.PAYSTACK_SECRET_KEY,
    },
  },
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above code snippet adds Medusa Paystack plugin to your project configurations.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Installing MinIO Medusa Plugin&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Managing images in Medusa requires a file service plugin for uploading images of products. Medusa provides different options for handling image upload for products, but this tutorial will focus only on using &lt;a href="https://docs.medusajs.com/add-plugins/minio/" rel="noopener noreferrer"&gt;MinIO&lt;/a&gt; file service plugin.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://min.io/docs/minio/linux/index.html" rel="noopener noreferrer"&gt;MinIO&lt;/a&gt; is a high-performance open source object storage solution that provides S3 storage functionality. You can follow &lt;a href="https://docs.medusajs.com/add-plugins/minio" rel="noopener noreferrer"&gt;this documentation&lt;/a&gt; to learn how to install it and create a bucket.&lt;/p&gt;

&lt;p&gt;Install MinIO plugin in the Medusa server directory with the command below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install medusa-file-minio
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, add the following block of code to your &lt;code&gt;.env&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MINIO_ENDPOINT=&amp;lt;ENDPOINT&amp;gt;
MINIO_BUCKET=&amp;lt;BUCKET&amp;gt;
MINIO_ACCESS_KEY=&amp;lt;ACCESS_KEY&amp;gt;
MINIO_SECRET_KEY=&amp;lt;SECRET_KEY&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note: &lt;code&gt;&amp;lt;ENDPOINT&amp;gt;&lt;/code&gt; is the URL of your MinIO server, &lt;code&gt;&amp;lt;BUCKET&amp;gt;&lt;/code&gt; is the name of the bucket you created earlier, and &lt;code&gt;&amp;lt;ACCESS_KEY&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;SECRET_KEY&amp;gt;&lt;/code&gt; are the keys you generated in the previous section.&lt;/p&gt;

&lt;p&gt;Finally, in &lt;code&gt;medusa-config.js&lt;/code&gt;, add the following at the end of the &lt;code&gt;plugins&lt;/code&gt;array:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    resolve: `medusa-file-minio`,
    options: {
        endpoint: process.env.MINIO_ENDPOINT,
        bucket: process.env.MINIO_BUCKET,
        access_key_id: process.env.MINIO_ACCESS_KEY,
        secret_access_key: process.env.MINIO_SECRET_KEY,
    },
  },
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you’ve completed the above processes, start your store server with the command below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;medusa develop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can navigate to &lt;code&gt;localhost:9000/store/products/&lt;/code&gt; to see available products in your store.&lt;/p&gt;

&lt;h3&gt;
  
  
  Creating Medusa Admin for your Food Restaurant
&lt;/h3&gt;

&lt;p&gt;To set up your Medusa Admin, follow the steps below.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Clone the Medusa Admin repository and change to the newly created folder:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/medusajs/admin medusa-admin
cd medusa-admin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt; Run the command below to install all necessary dependencies:
&lt;/li&gt;
&lt;/ol&gt;

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

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt; Test it:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;(Note: Ensure your Medusa store server is running before testing your admin.)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By default, Medusa Admin runs on port &lt;code&gt;7000&lt;/code&gt;. You can go to &lt;code&gt;localhost:7000&lt;/code&gt; on your browser to access your admin page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fpqyvtimgmt1tai1zes56.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fpqyvtimgmt1tai1zes56.png" alt="Image description" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Medusa Server comes with admin login details, which are &lt;code&gt;admin@medusa-test.com&lt;/code&gt; as the email address and &lt;code&gt;supersecret&lt;/code&gt; as the password. This demo data is a result of &lt;code&gt;--seed&lt;/code&gt; added while creating your store server.&lt;/p&gt;

&lt;p&gt;You can visit the &lt;a href="https://docs.medusajs.com/user-guide/" rel="noopener noreferrer"&gt;User Guide&lt;/a&gt; to learn more about Medusa Admin.&lt;/p&gt;

&lt;h3&gt;
  
  
  Adding Paystack Payment Provider to your Regions
&lt;/h3&gt;

&lt;p&gt;Food restaurants could be inter-state or international businesses, which means your store should be focused on selling products to a particular country.&lt;/p&gt;

&lt;p&gt;This tutorial will be focused on using the Nigerian currency since it’s one of the Paystack-supported countries.&lt;/p&gt;

&lt;p&gt;If you are not selling to Paystack-supported African countries, you can easily integrate &lt;a href="https://docs.medusajs.com/add-plugins/stripe" rel="noopener noreferrer"&gt;Medusa Stripe Payment Plugin&lt;/a&gt; in your store.&lt;/p&gt;

&lt;p&gt;To add Paystack to your regions, follow the steps below to set your store currency;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Go to &lt;em&gt;Settings ⇒ Currencies.&lt;/em&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F7pimmqra39duiykxqhm1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F7pimmqra39duiykxqhm1.png" alt="Image description" width="800" height="374"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2. Click on the &lt;em&gt;Edit currencies&lt;/em&gt; button in the &lt;em&gt;Store Currencies&lt;/em&gt; section.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fsul869rq1oltrj8tzqnz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fsul869rq1oltrj8tzqnz.png" alt="Image description" width="800" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3. In the new window that opens, click on the &lt;em&gt;Add Currencies&lt;/em&gt; button and select all the currencies you want to add.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fhflm1xjj7dmje986xxzo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fhflm1xjj7dmje986xxzo.png" alt="Image description" width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4. Click on the &lt;em&gt;Save and close&lt;/em&gt; button.&lt;/p&gt;

&lt;p&gt;Note: Set your default currency to Nigerian Naira after the 4th step.&lt;/p&gt;

&lt;p&gt;You can learn more about how to &lt;a href="https://docs.medusajs.com/user-guide/settings/currencies/" rel="noopener noreferrer"&gt;manage currencies&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Adding Paystack to your Region:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Go to &lt;em&gt;Settings ⇒ Regions&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fhba3ufp46o5kivgqzh5h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fhba3ufp46o5kivgqzh5h.png" alt="Image description" width="800" height="381"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2. Click on the plus icon at the top right of the &lt;em&gt;Regions&lt;/em&gt; section .&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Ftpy21cmt353c7opzq1cu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Ftpy21cmt353c7opzq1cu.png" alt="Image description" width="800" height="373"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3. In the form that opens, enter the Regions details. It is required to enter a title, choose a currency, enter a tax rate, and choose at least one country where your restaurant is based, payment provider (select Paystack), and fulfillment provider.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fww06qqkfcyvnkmtcxvh1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fww06qqkfcyvnkmtcxvh1.png" alt="Image description" width="800" height="464"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once done, click on the &lt;em&gt;Create region&lt;/em&gt; button at the top-right side.&lt;/p&gt;

&lt;p&gt;Learn more about &lt;a href="https://docs.medusajs.com/user-guide/regions/manage" rel="noopener noreferrer"&gt;Regions&lt;/a&gt; from Medusa User Guide.&lt;/p&gt;

&lt;h3&gt;
  
  
  Adding Food Products to your Admin
&lt;/h3&gt;

&lt;p&gt;Medusa Admin supports product management which includes adding new products, editing, publishing, unpublishing, duplicating, and deleting products.&lt;/p&gt;

&lt;p&gt;By default, the Medusa store server comes with a few products. You’ll delete them and add new products according to your restaurant's food menu.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fszwphl0gyvs4hekc812u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fszwphl0gyvs4hekc812u.png" alt="Image description" width="800" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Visit &lt;a href="https://docs.medusajs.com/user-guide/products/manage" rel="noopener noreferrer"&gt;Medusa Products Overview&lt;/a&gt; for a complete user guide on how to manage products in your store.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating Medusa Next.js Storefront
&lt;/h2&gt;

&lt;p&gt;In this tutorial, you will use the &lt;a href="https://github.com/medusajs/nextjs-starter-medusa" rel="noopener noreferrer"&gt;Medusa Next.js Storefront Template&lt;/a&gt; to build your storefront.&lt;/p&gt;

&lt;p&gt;Medusa Next.js Storefront Template already has every feature you may need in your storefront in it; this helps to quicken your development process when you choose to work with Medusa as your commerce engine.&lt;/p&gt;

&lt;p&gt;The steps below will help you create your food restaurant Storefront:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Run the command below to create a new Next.js starter project:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx create-next-app -e https://github.com/medusajs/nextjs-starter-medusa food-restaurant-storefront
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;food-restaurant-storefront&lt;/code&gt; represents the name of your project; you can rename it as you wish.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Switch to the newly created directory &lt;code&gt;food-restaurant-storefront&lt;/code&gt; and rename the template environment variable file to use environment variables in development:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd food-restaurant-storefront
mv .env.template .env.local
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;Customizing Your Storefront&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Since you have successfully created your food restaurant storefront, you can customize your storefront to your taste.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You can find all images used for this project in the &lt;a href="https://github.com/noblefresh/food-restaurant-storefront/tree/master/public" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Modify Your Homepage Banner: To do so, locate &lt;code&gt;src/modules/home/components/hero/index.tsx&lt;/code&gt; and replace its contents with the code below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import UnderlineLink from "@modules/common/components/underline-link"
import Image from "next/image"

const Hero = () =&amp;gt; {
  return (
    &amp;lt;div className="h-[90vh] w-full relative"&amp;gt;
      &amp;lt;div className="text-white absolute inset-0 z-10 flex flex-col justify-center items-center text-center small:text-left small:justify-end small:items-start small:p-32"&amp;gt;
        &amp;lt;h1 className="text-2xl-semi mb-4 drop-shadow-md shadow-black"&amp;gt;
          Easy Life Food Restaurant
        &amp;lt;/h1&amp;gt;
        &amp;lt;p className="text-base-regular max-w-[32rem] mb-6 drop-shadow-md shadow-black"&amp;gt;
          Eat heathy and Live heathy | We sale morethan just foods
        &amp;lt;/p&amp;gt;
        &amp;lt;UnderlineLink href="/store"&amp;gt;Food Menu&amp;lt;/UnderlineLink&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;Image
        src="/h2-slide.jpg"
        layout="fill"
        loading="eager"
        priority={true}
        quality={90}
        objectFit="cover"
        alt="homepage banner"
        className="absolute inset-0"
        draggable="false"
      /&amp;gt;
    &amp;lt;/div&amp;gt;
  )
}

export default Hero
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above code block will change the banner image and change the text.&lt;/p&gt;

&lt;p&gt;Secondly, modify your Featured Product section. To do so, locate &lt;code&gt;src/modules/home/components/featured-products/index.tsx&lt;/code&gt; and replace its contents with the code below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { useFeaturedProductsQuery } from "@lib/hooks/use-layout-data"
import UnderlineLink from "@modules/common/components/underline-link"
import ProductPreview from "@modules/products/components/product-preview"
import SkeletonProductPreview from "@modules/skeletons/components/skeleton-product-preview"

const FeaturedProducts = () =&amp;gt; {
  const { data } = useFeaturedProductsQuery()

  return (
    &amp;lt;div className="py-12"&amp;gt;
      &amp;lt;div className="content-container py-12"&amp;gt;
        &amp;lt;div className="flex flex-col items-center text-center mb-16"&amp;gt;
          &amp;lt;span className="text-base-regular text-gray-600 mb-6"&amp;gt;
            Enjoy More on
          &amp;lt;/span&amp;gt;
          &amp;lt;p className="text-2xl-regular text-gray-900 max-w-lg mb-4"&amp;gt;
            Our Today's Food Menu
          &amp;lt;/p&amp;gt;
          &amp;lt;UnderlineLink href="/store"&amp;gt;Food products&amp;lt;/UnderlineLink&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;ul className="grid grid-cols-2 small:grid-cols-4 gap-x-4 gap-y-8"&amp;gt;
          {data
            ? data.map((product) =&amp;gt; (
                &amp;lt;li key={product.id}&amp;gt;
                  &amp;lt;ProductPreview {...product} /&amp;gt;
                &amp;lt;/li&amp;gt;
              ))
            : Array.from(Array(4).keys()).map((i) =&amp;gt; (
                &amp;lt;li key={i}&amp;gt;
                  &amp;lt;SkeletonProductPreview /&amp;gt;
                &amp;lt;/li&amp;gt;
              ))}
        &amp;lt;/ul&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  )
}

export default FeaturedProducts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above code snippet will change the default texts to match what you are building the store for.&lt;/p&gt;

&lt;p&gt;Third, modify your part of the footer section. To do so, locate your &lt;code&gt;src/modules/**layout**/components/footer-cta/index.tsx&lt;/code&gt; and replace its content with the code below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import UnderlineLink from "@modules/common/components/underline-link"
import Image from "next/image"

const FooterCTA = () =&amp;gt; {
  return (
    &amp;lt;div className="bg-gray-800 w-full"&amp;gt;
      &amp;lt;div className="content-container flex flex-col-reverse gap-y-8 small:flex-row small:items-center justify-between py-16 relative"&amp;gt;
        &amp;lt;div&amp;gt;
          &amp;lt;h3 className="text-3xl-semi text-white"&amp;gt;Flavourful Flame&amp;lt;/h3&amp;gt;
          &amp;lt;h3 className="text-2xl text-white"&amp;gt;Grilled Chicken&amp;lt;/h3&amp;gt;
          &amp;lt;p className="text-white"&amp;gt;Marinated for 24 hours in our herb-infused traditional marinade, the perfectly grilled chicken on your plate is the healthiest and tastiest in town!&amp;lt;/p&amp;gt;
          &amp;lt;div className="mt-6 text-white"&amp;gt;
            &amp;lt;UnderlineLink href="/store"&amp;gt;Order Now&amp;lt;/UnderlineLink&amp;gt;
          &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;

        &amp;lt;div className="relative w-full aspect-square small:w-[35%] small:aspect-[28/36]"&amp;gt;
          &amp;lt;Image
            src="/more.jpg"
            alt=""
            layout="fill"
            objectFit="cover"
            className="absolute inset-0"
          /&amp;gt;
        &amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  )
}

export default FooterCTA
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above code block will change the background image and text.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Enable Paystack Payment&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;To enable using Paystack to accept payments from your storefront, you follow the steps below accordingly:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Install the React Paystack library:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install react-paystack
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once the library is installed successfully, it will add the react Paystack package to your storefront project.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Add  the Paystack public key to your &lt;code&gt;.env.local&lt;/code&gt; file:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NEXT_PUBLIC_PAYSTACK_PUBLIC_KEY=pk_test_xxxxxx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On the above, replace &lt;code&gt;pk_test_xxxxxx&lt;/code&gt; with the secret key gotten from your &lt;a href="https://dashboard.paystack.com/#/settings/developer" rel="noopener noreferrer"&gt;Paystack API Key&lt;/a&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Modify your payment buttons by adding the block of code below into your &lt;code&gt;src/modules/checkout/components/payment-button/index.tsx&lt;/code&gt; file:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import clsx from "clsx"
import { PaystackButton } from "react-paystack"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above code will import your Paystack button from &lt;code&gt;react-payment&lt;/code&gt; library, and &lt;code&gt;clsx&lt;/code&gt; library for Paytsack button styling.&lt;/p&gt;

&lt;p&gt;Next, add &lt;code&gt;PaystackPaymentButton&lt;/code&gt; among the switch case for the payment session:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;case "paystack":
      return (
        &amp;lt;PaystackPaymentButton notReady={notReady} session={paymentSession} /&amp;gt;
      )
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, add the block of code before your last line of code on this same file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const PAYSTACK_PUBLIC_KEY = process.env.NEXT_PUBLIC_PAYSTACK_PUBLIC_KEY || ""

const PaystackPaymentButton = ({
  session,
  notReady,
}: {
  session: PaymentSession
  notReady: boolean
}) =&amp;gt; {
  const { cart } = useCart()
  const { onPaymentCompleted } = useCheckout()

  const txRef = String(session.data?.paystackTxRef)
  const total = cart?.total || 0
  const email = cart?.email || ""
  const currency =
    cart?.region.currency_code.toUpperCase() // Update this to your currency

  return (
    &amp;lt;PaystackButton
      amount={total}
      publicKey={PAYSTACK_PUBLIC_KEY}
      email={email}
      currency={currency}
      reference={txRef}
      text="Pay with Paystack"
      onSuccess={onPaymentCompleted}
      className={clsx(
        "w-full uppercase flex items-center justify-center min-h-[50px] px-5 py-[10px] text-small-regular border transition-colors duration-200 disabled:opacity-50",
        "text-white bg-[#3bb75e] border-[#3bb75e] hover:bg-white hover:text-[#3bb75e] disabled:hover:bg-gray-900 disabled:hover:text-white"
      )}
    /&amp;gt;
  )
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above code block will add Paystack button as part of the payment option for your storefront.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;PaystackButton&lt;/code&gt; triggers the checkout payment button to process the payment whenever it’s clicked on your storefront.&lt;/p&gt;

&lt;p&gt;To be sure you got the above two code blocks correctly, you can make a reference &lt;a href="https://github.com/noblefresh/food-restaurant-storefront/blob/master/src/modules/checkout/components/payment-button/index.tsx" rel="noopener noreferrer"&gt;&lt;strong&gt;here&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Modify your payment container by adding the code block as part of the &lt;code&gt;PaymentInfoMap&lt;/code&gt; collection.  Here is the file path &lt;code&gt;src/modules/checkout/component/payment-container/index.tsx&lt;/code&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;paystack: {
    title: "Paystack",
    description: "Secure payment with Paystack",
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above code makes it possible for Paystack to appear as part of the payment option in your storefront.&lt;/p&gt;

&lt;p&gt;To be sure you got the above code block correctly, you can make a reference &lt;a href="https://github.com/noblefresh/food-restaurant-storefront/blob/master/src/modules/checkout/components/payment-container/index.tsx" rel="noopener noreferrer"&gt;&lt;strong&gt;here&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Test your Storefront
&lt;/h2&gt;

&lt;p&gt;Ensure your Medusa Server is running, then run this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you navigate to &lt;code&gt;localhost:8000&lt;/code&gt;, you’ll see your storefront homepage.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F8oaxtwvrq8ckjahhxory.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F8oaxtwvrq8ckjahhxory.png" alt="Image description" width="800" height="367"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you click on &lt;em&gt;Food Menu&lt;/em&gt; you’ll see all foods populated from your Medusa Server.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Faq2jfckfxjwg8jc0eq5o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Faq2jfckfxjwg8jc0eq5o.png" alt="Image description" width="800" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you click on any of the food items, you’ll see the single product page and an &lt;em&gt;Add to cart&lt;/em&gt; option.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fvgv31ti8hr6yuflp9dcl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fvgv31ti8hr6yuflp9dcl.png" alt="Image description" width="800" height="377"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you click on &lt;em&gt;My Bag&lt;/em&gt; after adding an item to the cart, you should see the &lt;em&gt;Shopping Bag&lt;/em&gt; page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F01zfs6fgem2c7a66se17.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F01zfs6fgem2c7a66se17.png" alt="Image description" width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you click on &lt;em&gt;GO TO CHECKOUT&lt;/em&gt;, you’ll see your &lt;em&gt;Checkout&lt;/em&gt; Page, where you will provide your delivery information.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fja7ayvx0o0co32h4hxk8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fja7ayvx0o0co32h4hxk8.png" alt="Image description" width="800" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you click on “PAY WITH PAYSTACK” you’ll see the Paystack Payment pop-up:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fyecodfe629ckdeyoih7s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fyecodfe629ckdeyoih7s.png" alt="Image description" width="800" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you select &lt;em&gt;Success&lt;/em&gt; and click on the &lt;em&gt;Pay&lt;/em&gt; button, your payment will be processed and you’ll see the &lt;em&gt;Order Receipt&lt;/em&gt; Page;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fy4lbc8mbxam3d7wtx7hb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fy4lbc8mbxam3d7wtx7hb.png" alt="Image description" width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can confirm the orders from your Medusa Admin panel for this project.&lt;/p&gt;

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

&lt;p&gt;In this tutorial, you have learned how to use the Medusa commerce engine as your ecommerce store for food restaurants, working with Medusa’s Next.js Storefront Template and Integrating Paystack payment gateway into Medusa.&lt;/p&gt;

&lt;p&gt;You can learn more about building awesome ecommerce stores with Medusa; check out &lt;a href="https://docs.medusajs.com/" rel="noopener noreferrer"&gt;Medusa’s Documentation&lt;/a&gt; for more guides.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Should you have any issues or questions related to Medusa, then feel free to reach out to the Medusa team via &lt;a href="https://discord.gg/medusajs" rel="noopener noreferrer"&gt;Discord&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
    </item>
    <item>
      <title>An Introduction to RedwoodJS</title>
      <dc:creator>Noble Okechi</dc:creator>
      <pubDate>Mon, 12 Dec 2022 01:16:20 +0000</pubDate>
      <link>https://dev.to/nobleokechi/an-introduction-to-redwoodjs-5245</link>
      <guid>https://dev.to/nobleokechi/an-introduction-to-redwoodjs-5245</guid>
      <description>&lt;p&gt;RedwoodJS is a full-stack serverless web application framework to help developers build their front-end and back-end with one single codebase. This framework provides the mechanism to build JAMstack applications very fast.&lt;br&gt;
The front end is a React application, while the back end is a GraphQL server. RedwoodJS features an end-to-end development workflow that weaves together the best parts of React, GraphQL, Prisma, TypeScript, Jest, and Storybook.&lt;br&gt;
In this tutorial, you'll learn how to build a Todo App with RedwoodJS.&lt;/p&gt;
&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before you start this tutorial, ensure you have;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://nodejs.org/en/download/"&gt;Node.js&lt;/a&gt; v 14.19.x or &amp;lt;=16.x&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://yarnpkg.com/"&gt;Yarn&lt;/a&gt; v 1.15 or later&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Setting Up RedwoodJS
&lt;/h2&gt;

&lt;p&gt;To setup a new Redwood.js project on your computer, you can follow any of these steps below&lt;/p&gt;
&lt;h3&gt;
  
  
  Creating a new Project using RedwoodJS CLI
&lt;/h3&gt;

&lt;p&gt;You will run the command below to install a new project from your terminal.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn create redwood-app my-redwood-project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;my-redwood-project&lt;/code&gt; will represent your project name on the above command, which you can also change to a preferred name.&lt;br&gt;
Then change into that directory and start the development server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd my-redwood-project
yarn redwood dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Creating a new RedwoodJS starter project
&lt;/h3&gt;

&lt;p&gt;Another easy method to create a new RedwoodJS project is by cloning RedwoodJS Starter Project.&lt;br&gt;
You can achieve that by visiting &lt;a href="https://github.com/redwoodjs/redwood-starter"&gt;RedwoodJS Starter Repository&lt;/a&gt;.&lt;br&gt;
If you completed any of the above process successfully, your browser should automatically open to &lt;a href="http://localhost:8910/"&gt;http://localhost:8910&lt;/a&gt; where you'll see the Welcome Page, which links out to a ton of great resources:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_wH4oJxl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/IpfFhej.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_wH4oJxl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/IpfFhej.png" alt="https://i.imgur.com/IpfFhej.png" width="880" height="418"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Working with RedwoodJS
&lt;/h2&gt;

&lt;p&gt;In this tutorial, you will learn how to build a Todo App with RedwoodJS, which you will cover some of the basic features of this framework.&lt;/p&gt;
&lt;h3&gt;
  
  
  Redwood File Structure
&lt;/h3&gt;

&lt;p&gt;RedwoodJS file structure is classified into Backend and Frontend, which entirely makes up a full-stack development tool.&lt;br&gt;
This is what the RedwoodJS file structure looks below;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;├── api
│ ├── db
│ │ └── schema.prisma
│ ├── dist
│ ├── src
│ │ ├── directives
│ │ │ ├── requireAuth
│ │ │ └── skipAuth
│ │ ├── functions
│ │ │ └── graphql.js
│ │ ├── graphql
│ │ ├── lib
│ │ │ ├── auth.js
│ │ │ ├── db.js
│ │ │ └── logger.js
│ │ └── services
│ └── types
│
├── scripts
│ └── seed.js
│
└── web
 ├── public
 │ ├── favicon.png
 │ ├── README.md
 │ └── robots.txt
 └── src
 ├── components
 ├── layouts
 ├── pages
 │ ├── FatalErrorPage
 │ │ └── FatalErrorPage.js
 │ └── NotFoundPage
 │ └── NotFoundPage.js
 ├── App.js
 ├── index.css
 ├── index.html
 └── Routes.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the above file structure, RedwoodJS has three directories, &lt;code&gt;API&lt;/code&gt;, &lt;code&gt;scripts&lt;/code&gt; and &lt;code&gt;web&lt;/code&gt;. Redwood separates the backend (API) and frontend (web) concerns into their own paths in it code-base.&lt;br&gt;
The&lt;code&gt;scripts&lt;/code&gt; folder holds any Node.js scripts you may need to run from your command line that aren't directly related to the API or web sides.&lt;br&gt;
The &lt;code&gt;seed.js&lt;/code&gt;is your database seeder file, it is used to populate your database with data that needs to exist for your app to run effectively.&lt;/p&gt;
&lt;h3&gt;
  
  
  Creating Pages
&lt;/h3&gt;

&lt;p&gt;In this tutorial, you will create a page which will serve as your home page for this Todo App.&lt;br&gt;
RedwoodJS has a command line tool which is used to generate web pages, which makes it unique from some other frameworks.&lt;br&gt;
Use this command to generate your home page.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn redwood generate page home /
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command will create a new page folder named 'HomePage'. This is the path to your newly generated home page &lt;code&gt;web/src/pages/HomePage/HomePage.js&lt;/code&gt;&lt;br&gt;
If your page generated successfully, then you should have same screen as shown below on your browser.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ykIiMtcr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/mqx0fYB.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ykIiMtcr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/mqx0fYB.png" alt="https://i.imgur.com/mqx0fYB.png" width="880" height="219"&gt;&lt;/a&gt;&lt;br&gt;
Now, you successfully created a home page for this project, you will revisit the HomePage.js later to write some script as you build along.&lt;/p&gt;
&lt;h2&gt;
  
  
  Creating the Database Schema
&lt;/h2&gt;

&lt;p&gt;Before you continue with creating a database schema for this project, you will first decide the data you need for this project (i.e the fields).&lt;br&gt;
You will create a table called todo which will take the following fields.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;id&lt;/code&gt; a unique identifier for this todo app (it will be auto-incremented)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;body&lt;/code&gt; a string data type, which will contain the actual content for each todo&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;status&lt;/code&gt; a string data type with a default value off, it will be used to know when a todo is marked or not.
RedwoodJS uses &lt;a href="https://www.prisma.io/"&gt;Prisma&lt;/a&gt; to talk to the database. Prisma has another library called &lt;a href="https://www.prisma.io/docs/concepts/components/prisma-migrate"&gt;Migrate&lt;/a&gt; that lets you update the database's schema in a predictable way and snapshot each of those changes. Each change is called a migration and Migrate will create one when we make changes to our schema.
Now, you can define the data structure for this project. &lt;code&gt;Open api/db/schema.prisma&lt;/code&gt;, remove the &lt;code&gt;model UserExample&lt;/code&gt; and add the Todo model below.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;model Todo {
 id Int @id @default(autoincrement())
 body String
 status String @default("off")
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Now you will need to snapshot the schema changes as a migration, run this command for that:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;You'll be prompted to give this migration a name.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sBIKzvhv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/o62IgID.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sBIKzvhv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/o62IgID.png" alt="https://i.imgur.com/o62IgID.png" width="653" height="227"&gt;&lt;/a&gt;&lt;br&gt;
In the case of this project, use Todo.&lt;br&gt;
Note, for other projects,use something that best describes what your database model does.&lt;br&gt;
You can learn more about Redwood &lt;a href="https://redwoodjs.com/docs/tutorial/chapter2/getting-dynamic"&gt;Database Schema&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Creating an SDL &amp;amp; Service
&lt;/h2&gt;

&lt;p&gt;Now you'll create the GraphQL interface to access the Todo table. You can do that with this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn rw g sdl Todo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will create a few new files under the api directory:&lt;br&gt;
&lt;code&gt;api/src/graphql/todos.sdl.js&lt;/code&gt;: defines the GraphQL schema in GraphQL's schema definition language&lt;br&gt;
&lt;code&gt;api/src/services/todos/todos.js&lt;/code&gt;: contains your app's business logic (also creates associated test files)&lt;br&gt;
Now you will need to define a Mutation types for this Todo model.&lt;br&gt;
Open up &lt;code&gt;api/src/graphql/todos.sdl.js&lt;/code&gt; and define the Mutation as shown below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;type Mutation {
 createTodo(body: String!): Todo @skipAuth
 updateTodoStatus(id: Int!, status: String!): Todo @skipAuth
 renameTodo(id: Int!, body: String!): Todo @skipAuth
 }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can a see a complete code for this file below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export const schema = gql`
 type Todo {
 id: Int!
 body: String!
 status: String!
 }
type Query {
 todos: [Todo!]! @requireAuth
 }
input CreateTodoInput {
 body: String!
 status: String!
 }
input UpdateTodoInput {
 body: String
 status: String
 }
type Mutation {
 createTodo(body: String!): Todo @skipAuth
 updateTodoStatus(id: Int!, status: String!): Todo @skipAuth
 renameTodo(id: Int!, body: String!): Todo @skipAuth
 }
`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To complete the SDL and Service, you'll open &lt;code&gt;api/src/services/todos/todos.js&lt;/code&gt; and write this block of code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { db } from 'src/lib/db'
export const todos = () =&amp;gt; db.todo.findMany()
export const createTodo = ({ body }) =&amp;gt; db.todo.create({ data: { body } })
export const updateTodoStatus = ({ id, status }) =&amp;gt;
 db.todo.update({
 data: { status },
 where: { id },
 })
export const renameTodo = ({ id, body }) =&amp;gt;
 db.todo.update({
 data: { body },
 where: { id },
 })
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Creating Components
&lt;/h2&gt;

&lt;p&gt;Components are independent and reusable bits of code that serve the same purpose as JavaScript functions, but work in isolation and return HTML.&lt;br&gt;
In this project, you will create a few component, these components will ensure a proper flow of data within this app.&lt;/p&gt;
&lt;h3&gt;
  
  
  Creating a AddTodoForm Component
&lt;/h3&gt;

&lt;p&gt;RedwoodJS has command line tool that generates a component.&lt;br&gt;
Now, you will run this command below to create a component called AddTodoForm.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn rw g component AddTodoForm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After running the above command, you can locate your component in &lt;code&gt;web/src/components/AddTodoForm&lt;/code&gt;.&lt;br&gt;
Now, open your &lt;code&gt;AddTodoForm.js&lt;/code&gt; and write this block of code inside.&lt;br&gt;
This is the file path &lt;code&gt;web/src/components/AddTodoForm/AddTodoForm.js&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import styled from 'styled-components'
import { useState } from 'react'
import Check from 'src/components/Check'
const AddTodoForm = ({ submitTodo }) =&amp;gt; {
 const [todoText, setTodoText] = useState('')
const handleSubmit = (event) =&amp;gt; {
 submitTodo(todoText)
 setTodoText('')
 event.preventDefault()
 }
const handleChange = (event) =&amp;gt; {
 setTodoText(event.target.value)
 }
return (
 &amp;lt;SC.Form onSubmit={handleSubmit}&amp;gt;
 &amp;lt;Check type="plus" /&amp;gt;
 &amp;lt;SC.Body&amp;gt;
 &amp;lt;SC.Input
 type="text"
 value={todoText}
 placeholder="What to do"
 onChange={handleChange}
 /&amp;gt;
 &amp;lt;SC.Button type="submit" value="Add Todo" /&amp;gt;
 &amp;lt;/SC.Body&amp;gt;
 &amp;lt;/SC.Form&amp;gt;
 )
}
const SC = {}
SC.Form = styled.form`
 display: flex;
 align-items: center;
`
SC.Body = styled.div`
 border-top: 1px solid #efefef;
 border-bottom: 1px solid #efefef;
 width: 100%;
`
SC.Input = styled.input`
 border: none;
 font-size: 18px;
 font-family: 'Inconsolata', monospace;
 padding: 10px 0;
 width: 75%;
::placeholder {
 color: #e1e1e1;
 }
`
SC.Button = styled.input`
 float: right;
 margin-top: 5px;
 border-radius: 6px;
 background-color: #8000ff;
 padding: 5px 15px;
 color: white;
 border: 0;
 font-size: 18px;
 font-family: 'Inconsolata', monospace;
:hover {
 background-color: black;
 cursor: pointer;
 }
`
export default AddTodoForm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;styled&lt;/code&gt; was imported from RedwoodJS &lt;code&gt;styled-components&lt;/code&gt; which you used for styling of Form, Body, Input and Button.&lt;br&gt;
&lt;code&gt;useState&lt;/code&gt; was imported from react library for state management within this project.&lt;br&gt;
&lt;code&gt;Check&lt;/code&gt; was imported from Check Component, which will created before this component.&lt;br&gt;
&lt;code&gt;const AddTodoForm&lt;/code&gt; function, is used to handle the submit event of this project, in which this component will be called on the next component for processing.&lt;/p&gt;
&lt;h3&gt;
  
  
  Creating a SaveTodo Component
&lt;/h3&gt;

&lt;p&gt;This component handle data saving communication between your &lt;code&gt;Form&lt;/code&gt; and &lt;code&gt;Database&lt;/code&gt;.&lt;br&gt;
Run this command to create the component:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn rw g component SaveTodo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you have created this component successfully, locate the path &lt;code&gt;web/src/components/SaveTodo/SaveTodo.js&lt;/code&gt; and write the below code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { useMutation } from '@redwoodjs/web'
import AddTodoForm from 'src/components/AddTodoForm'
import { QUERY as TODOS } from 'src/components/TodoListCell'
const CREATE_TODO = gql`
 mutation SaveTodo_CreateTodo($body: String!) {
 createTodo(body: $body) {
 id
 __typename
 body
 status
 }
 }
`
const SaveTodo = () =&amp;gt; {
 const [createTodo] = useMutation(CREATE_TODO, {
 update: (cache, { data: { createTodo } }) =&amp;gt; {
 const { todos } = cache.readQuery({ query: TODOS })
 cache.writeQuery({
 query: TODOS,
 data: { todos: todos.concat([createTodo]) },
 })
 },
 })
const submitTodo = (body) =&amp;gt; {
 createTodo({
 variables: { body },
 optimisticResponse: {
 __typename: 'Mutation',
 createTodo: { __typename: 'Todo', id: 0, body, status: 'loading' },
 },
 })
 }
return &amp;lt;AddTodoForm submitTodo={submitTodo} /&amp;gt;
}
export default SaveTodo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;useMutation&lt;/code&gt; is a RedwoodJS hook, which allow you to execute the mutation when we're ready.&lt;br&gt;
&lt;code&gt;__typename&lt;/code&gt; is required here in order for optimistic responses to function properly.&lt;br&gt;
&lt;code&gt;const SaveTodo&lt;/code&gt; adds the data into the Todo database model and trigger a re-render of any affected components, so we don't need to do anything but update the cache.&lt;br&gt;
The above code block summerizes saving data in RedwoodJS, you can learn more about &lt;a href="https://redwoodjs.com/docs/tutorial/chapter3/saving-data"&gt;Saving Data&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Modify HomePage
&lt;/h3&gt;

&lt;p&gt;You hae successfully completed your SaveTodo component, which add every TODO into the database.&lt;br&gt;
It's time for you to modify the HomePage and add the SaveTodo component inside.&lt;br&gt;
Open &lt;code&gt;web/src/pages/HomePage/HomePage.js&lt;/code&gt; path and write this code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import styled from 'styled-components'
import { MetaTags } from '@redwoodjs/web'
import SaveTodo from 'src/components/SaveTodo'
const HomePage = () =&amp;gt; {
 return (
 &amp;lt;&amp;gt;
 &amp;lt;MetaTags title="Todos" description="Your list of todo items" /&amp;gt;
&amp;lt;SC.Wrapper&amp;gt;
 &amp;lt;SC.Title&amp;gt;Todo List&amp;lt;/SC.Title&amp;gt;
 &amp;lt;SaveTodo /&amp;gt;
 &amp;lt;/SC.Wrapper&amp;gt;
 &amp;lt;/&amp;gt;
 )
}
const SC = {}
SC.Wrapper = styled.div`
 width: 600px;
 margin: 0 auto;
`
SC.Title = styled.h1`
 font-size: 24px;
 font-weight: bold;
 margin-top: 100px;
`
export default HomePage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the above block, you have imported &lt;code&gt;SaveTodo&lt;/code&gt; for adding new Todos.&lt;br&gt;
Now check your browser to see if you will get same result as the screenshot below.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RUTybDBU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/shH7qin.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RUTybDBU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/shH7qin.png" alt="https://i.imgur.com/shH7qin.png" width="880" height="439"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Creating Check Component
&lt;/h3&gt;

&lt;p&gt;This component will be used for improving users experience in this project.&lt;br&gt;
You will create a new component called Check with the commands below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn rw g component Check
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you complete the above command, locate the path &lt;code&gt;web/src/components/Check/Check.js&lt;/code&gt; and write the below code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import styled from 'styled-components'
import IconOn from './on.svg'
import IconOff from './off.svg'
import IconPlus from './plus.svg'
import IconLoading from './loading.svg'
const map = {
 on: &amp;lt;IconOn /&amp;gt;,
 off: &amp;lt;IconOff /&amp;gt;,
 plus: &amp;lt;IconPlus /&amp;gt;,
 loading: &amp;lt;IconLoading /&amp;gt;,
}
const Check = ({ type }) =&amp;gt; {
 return &amp;lt;SC.Icon&amp;gt;{map[type]}&amp;lt;/SC.Icon&amp;gt;
}
const SC = {}
SC.Icon = styled.div`
 margin-right: 15px;
`
export default Check
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the above code block, you imported some svg files which has not been created yet.&lt;br&gt;
In your &lt;code&gt;web/src/components/Check&lt;/code&gt; folder, create the following svg files and write the svg codes inside.&lt;br&gt;
&lt;code&gt;loading.svg&lt;/code&gt; this is svg code for this file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="&amp;lt;http://www.w3.org/2000/svg&amp;gt;"&amp;gt;
&amp;lt;circle cx="10" cy="10" r="9" fill="white" stroke="#8000FF" stroke-width="2"/&amp;gt;
&amp;lt;circle cx="10" cy="10" r="4" fill="#8000FF"/&amp;gt;
&amp;lt;/svg&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;off.svg&lt;/code&gt; this is the svg code for this file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="&amp;lt;http://www.w3.org/2000/svg&amp;gt;"&amp;gt;
&amp;lt;circle cx="10" cy="10" r="9" fill="white" stroke="#8000FF" stroke-width="2"/&amp;gt;
&amp;lt;/svg&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;on.svg&lt;/code&gt; this is the svg code for this file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="&amp;lt;http://www.w3.org/2000/svg&amp;gt;"&amp;gt;
&amp;lt;circle cx="10" cy="10" r="9" fill="#8000FF" stroke="#8000FF" stroke-width="2"/&amp;gt;
&amp;lt;/svg&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;plus.svg this is svg code for this file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="&amp;lt;http://www.w3.org/2000/svg&amp;gt;"&amp;gt;
&amp;lt;path d="M10 0.3125C4.64844 0.3125 0.3125 4.64844 0.3125 10C0.3125 15.3516 4.64844 19.6875 10 19.6875C15.3516 19.6875 19.6875 15.3516 19.6875 10C19.6875 4.64844 15.3516 0.3125 10 0.3125ZM15.625 11.0938C15.625 11.3516 15.4141 11.5625 15.1563 11.5625H11.5625V15.1563C11.5625 15.4141 11.3516 15.625 11.0938 15.625H8.90625C8.64844 15.625 8.4375 15.4141 8.4375 15.1563V11.5625H4.84375C4.58594 11.5625 4.375 11.3516 4.375 11.0938V8.90625C4.375 8.64844 4.58594 8.4375 4.84375 8.4375H8.4375V4.84375C8.4375 4.58594 8.64844 4.375 8.90625 4.375H11.0938C11.3516 4.375 11.5625 4.58594 11.5625 4.84375V8.4375H15.1563C15.4141 8.4375 15.625 8.64844 15.625 8.90625V11.0938Z" fill="#8000FF"/&amp;gt;
&amp;lt;/svg&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, if you've created the above svg files inside the &lt;code&gt;web/src/components/Check&lt;/code&gt; path, your &lt;code&gt;Check&lt;/code&gt; folder should look the image snapshot below.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xqRBvdax--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/owsSDDJ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xqRBvdax--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/owsSDDJ.png" alt="https://i.imgur.com/owsSDDJ.png" width="256" height="175"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Creating TodoItem Component
&lt;/h3&gt;

&lt;p&gt;You will create a TodoItem Component using this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn rw g component TodoItem
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Locate the path &lt;code&gt;web/src/components/TodoItem/TodoItem.js&lt;/code&gt; and write the below code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import styled from 'styled-components'
import Check from 'src/components/Check'
const TodoItem = ({ id, body, status, onClickCheck }) =&amp;gt; {
 const handleCheck = () =&amp;gt; {
 const newStatus = status === 'off' ? 'on' : 'off'
 onClickCheck(id, newStatus)
 }
return (
 &amp;lt;SC.Item&amp;gt;
 &amp;lt;SC.Target onClick={handleCheck}&amp;gt;
 &amp;lt;Check type={status} /&amp;gt;
 &amp;lt;/SC.Target&amp;gt;
 &amp;lt;SC.Body&amp;gt;{status === 'on' ? &amp;lt;s&amp;gt;{body}&amp;lt;/s&amp;gt; : body}&amp;lt;/SC.Body&amp;gt;
 &amp;lt;/SC.Item&amp;gt;
 )
}
const SC = {}
SC.Item = styled.li`
 display: flex;
 align-items: center;
 list-style: none;
`
SC.Target = styled.div`
 cursor: pointer;
`
SC.Body = styled.div`
 list-style: none;
 font-size: 18px;
 border-top: 1px solid #efefef;
 padding: 10px 0;
 width: 100%;
`
export default TodoItem
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above block of the code is returning an item list of TODOS, considering the status of every todos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Working with RedwoodJS Cell
&lt;/h2&gt;

&lt;p&gt;Cells are a declarative approach to data fetching and one of Redwood's signature modes of abstraction. By providing conventions around data fetching, Redwood can get in between the request and the response to do things like query optimization and more, all without you ever having to change your code.&lt;br&gt;
RedwoodJS Cell are used to execute a GraphQL query and manage its lifecycle. The idea is that, by exporting named constants that declare what you want your UI to look like throughout a query's lifecycle, RedwoodJS can assemble these into a component template at build-time using a Babel plugin. All without you having to write a single line of imperative code.&lt;br&gt;
You can generate a Cell with RedwoodJS Cell generator. Run this command to generate a TodoListCell:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn rw generate cell TodoList
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you've completed the above command, open up &lt;code&gt;web/src/components/TodoListCell/TodoListCell.js&lt;/code&gt; and write the below code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import styled from 'styled-components'
import TodoItem from 'src/components/TodoItem'
import { useMutation } from '@redwoodjs/web'
export const QUERY = gql`
 query TODOS {
 todos {
 id
 body
 status
 }
 }
`
const UPDATE_TODO_STATUS = gql`
 mutation TodoListCell_CheckTodo($id: Int!, $status: String!) {
 updateTodoStatus(id: $id, status: $status) {
 id
 __typename
 status
 }
 }
`
export const Loading = () =&amp;gt; &amp;lt;div&amp;gt;Loading…&amp;lt;/div&amp;gt;
export const Empty = () =&amp;gt; &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;
export const Failure = () =&amp;gt; &amp;lt;div&amp;gt;Oh no&amp;lt;/div&amp;gt;
export const Success = ({ todos }) =&amp;gt; {
 const [updateTodoStatus] = useMutation(UPDATE_TODO_STATUS)
const handleCheckClick = (id, status) =&amp;gt; {
 updateTodoStatus({
 variables: { id, status },
 optimisticResponse: {
 __typename: 'Mutation',
 updateTodoStatus: { __typename: 'Todo', id, status: 'loading' },
 },
 })
 }
const list = todos.map((todo) =&amp;gt; (
 &amp;lt;TodoItem key={todo.id} {…todo} onClickCheck={handleCheckClick} /&amp;gt;
 ))
return &amp;lt;SC.List&amp;gt;{list}&amp;lt;/SC.List&amp;gt;
}
export const beforeQuery = (props) =&amp;gt; ({
 variables: props,
})
const SC = {}
SC.List = styled.ul`
 padding: 0;
`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the above code block, you all TODOS using RedwoodJS GraphQL query and mapped these todos into the TodoItem created above, which will be imported on the HomePage.js.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Ready for Testing
&lt;/h2&gt;

&lt;p&gt;Before you test this project, there are few things you need to do.&lt;/p&gt;

&lt;h3&gt;
  
  
  Modifying HomePage
&lt;/h3&gt;

&lt;p&gt;First, is modifying your Homepage by importing some of the components you created.&lt;br&gt;
Open &lt;code&gt;web/src/pages/HomePage/HomePage.js&lt;/code&gt; path and write this code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import styled from 'styled-components'
import { MetaTags } from '@redwoodjs/web'
import SaveTodo from 'src/components/SaveTodo'
import TodoListCell from 'src/components/TodoListCell'
const HomePage = () =&amp;gt; {
 return (
 &amp;lt;&amp;gt;
 &amp;lt;MetaTags title="Todos" description="Your list of todo items" /&amp;gt;
&amp;lt;SC.Wrapper&amp;gt;
 &amp;lt;SC.Title&amp;gt;Todo List&amp;lt;/SC.Title&amp;gt;
 &amp;lt;TodoListCell /&amp;gt;
 &amp;lt;SaveTodo /&amp;gt;
 &amp;lt;/SC.Wrapper&amp;gt;
 &amp;lt;/&amp;gt;
 )
}
const SC = {}
SC.Wrapper = styled.div`
 width: 600px;
 margin: 0 auto;
`
SC.Title = styled.h1`
 font-size: 24px;
 font-weight: bold;
 margin-top: 100px;
`
export default HomePage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the above block, you have imported &lt;code&gt;TodoListCell&lt;/code&gt; for displaying Todos from database and &lt;code&gt;SaveTodo&lt;/code&gt; for adding new Todos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fixing styled-components in RedwoodJS
&lt;/h3&gt;

&lt;p&gt;For you to avoid styled-components error in all the components where you imported it, add &lt;code&gt;styled-components&lt;/code&gt; package to your &lt;code&gt;web/package.json&lt;/code&gt;.&lt;br&gt;
Open up &lt;code&gt;web/package.json&lt;/code&gt; and add this code among the dependencies.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"styled-components": "⁵.3.3"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above code will fix styled-components error.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test your Todo App
&lt;/h2&gt;

&lt;p&gt;Now you have completed this project, restart your RedwoodJS server with any of the commands below:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;or&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Here the output of this project:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7OIESqGN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://i.imgur.com/qF3amWw.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7OIESqGN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://i.imgur.com/qF3amWw.gif" alt="https://i.imgur.com/qF3amWw.gif" width="600" height="285"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;In this tutorial, you've known what RedwoodJS is about and why you need RedwoodJS for your startups. You've learnt how about RedwoodJS page generate tool, RedwoodJS Database Schema, RedwoodJS SDL and Service, RedwoodJS Components and, also how to work with RedwoodJS Cell.&lt;/p&gt;

&lt;p&gt;You can learn more about RedwoodJS from its &lt;a href="https://redwoodjs.com/docs/introduction"&gt;tutorial documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can clone this project from this GitHub repository &lt;a href="https://github.com/noblefresh/todo-app-with-redwoodjs"&gt;https://github.com/noblefresh/todo-app-with-redwoodjs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A TIP FROM THE EDITOR: Some time ago, we introduced RedwoodJS; check it out at RedwoodJS, a new framework.&lt;/p&gt;




&lt;p&gt;Originally published at &lt;a href="https://blog.openreplay.com"&gt;https://blog.openreplay.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>redwoodjs</category>
      <category>jamstack</category>
    </item>
    <item>
      <title>How I Built a Vue.js Ecommerce Store with a Node.js Backend</title>
      <dc:creator>Noble Okechi</dc:creator>
      <pubDate>Wed, 07 Dec 2022 15:19:44 +0000</pubDate>
      <link>https://dev.to/medusajs/how-i-created-a-vuejs-ecommerce-store-with-medusa-plf</link>
      <guid>https://dev.to/medusajs/how-i-created-a-vuejs-ecommerce-store-with-medusa-plf</guid>
      <description>&lt;p&gt;Ecommerce is no small undertaking. Aside from building a great customer experience on the frontend, you’ll also need to have the right setup to handle all cart, customer and order data, product information, etc…&lt;/p&gt;

&lt;p&gt;In this tutorial, you’ll get a sneak peek into how it can be done!&lt;/p&gt;

&lt;p&gt;In this tutorial, you’ll get set up with the necessary prerequisites for a great ecommerce experience. &lt;a href="https://vuejs.org/" rel="noopener noreferrer"&gt;Vue.js&lt;/a&gt; is a great choice for a frontend framework because it’s open source, it has a component-based architecture, and it is reactive.&lt;/p&gt;

&lt;p&gt;For the backend, you’ll learn how to use &lt;a href="https://medusajs.com/" rel="noopener noreferrer"&gt;Medusa&lt;/a&gt;, an open source Node.js commerce engine that ships with all necessary ecommerce functionality including an easily navigatable admin system.&lt;/p&gt;

&lt;p&gt;The full code for this Vue.js project is located in &lt;a href="https://github.com/noblefresh/vuejs-ecommerce" rel="noopener noreferrer"&gt;this GitHub repo&lt;/a&gt;. Below is a quick sneak peek of the final result.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fjx9cvg9xn7zwd7yib4wb.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fjx9cvg9xn7zwd7yib4wb.gif" alt="Image description" width="800" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What is Vue.js
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/vuejs/vue" rel="noopener noreferrer"&gt;Vue.js&lt;/a&gt; is an open source progressive JavaScript framework. It can be used to build a variety of types of apps, including websites, mobile apps, or desktop apps. This can be done by using Vue.js along with other platforms like Electron or Ionic.&lt;/p&gt;

&lt;p&gt;Vue.js has been rising in popularity since it was first released due to its many advantages. It is easy to learn and use, with concise documentation and a smooth learning curve. It also has a tiny size, a reactive system, and a component-based, reusable architecture.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is Medusa
&lt;/h3&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/medusajs" rel="noopener noreferrer"&gt;
        medusajs
      &lt;/a&gt; / &lt;a href="https://github.com/medusajs/medusa" rel="noopener noreferrer"&gt;
        medusa
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      The world's most flexible commerce platform.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;
  &lt;a href="https://www.medusajs.com" rel="nofollow noopener noreferrer"&gt;
  
    
    
    &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F59018053%2F229103726-e5b529a3-9b3f-4970-8a1f-c6af37f087bf.svg" class="article-body-image-wrapper"&gt;&lt;img alt="Medusa logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F59018053%2F229103726-e5b529a3-9b3f-4970-8a1f-c6af37f087bf.svg"&gt;&lt;/a&gt;
    
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;
  Medusa
&lt;/h1&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;
  &lt;a href="https://docs.medusajs.com" rel="nofollow noopener noreferrer"&gt;Documentation&lt;/a&gt; |
  &lt;a href="https://www.medusajs.com" rel="nofollow noopener noreferrer"&gt;Website&lt;/a&gt;
&lt;/h4&gt;
&lt;/div&gt;

&lt;p&gt;
  Building blocks for digital commerce
&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://github.com/medusajs/medusa/blob/develop/LICENSE" rel="noopener noreferrer"&gt;
    &lt;img src="https://camo.githubusercontent.com/6581c31c16c1b13ddc2efb92e2ad69a93ddc4a92fd871ff15d401c4c6c9155a4/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d626c75652e737667" alt="Medusa is released under the MIT license."&gt;
  &lt;/a&gt;
  &lt;a href="https://github.com/medusajs/medusa/blob/develop/CONTRIBUTING.md" rel="noopener noreferrer"&gt;
    &lt;img src="https://camo.githubusercontent.com/11c502cb0edd6eac274e462c7a70981ee26fde99043dba967b732d371efa2b87/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5052732d77656c636f6d652d627269676874677265656e2e7376673f7374796c653d666c6174" alt="PRs welcome!"&gt;
  &lt;/a&gt;
 &lt;/p&gt;
&lt;p&gt;
  &lt;a href="https://twitter.com/intent/follow?screen_name=medusajs" rel="nofollow noopener noreferrer"&gt;
    &lt;img src="https://camo.githubusercontent.com/6c164f14e4a24c801d3396eff84dbc5a7d8a3a6458b1c09ebbaaa0006d244a8c/68747470733a2f2f696d672e736869656c64732e696f2f747769747465722f666f6c6c6f772f6d65647573616a732e7376673f6c6162656c3d466f6c6c6f77253230406d65647573616a73" alt="Follow @medusajs"&gt;
  &lt;/a&gt;&lt;a href="https://discord.gg/medusajs" rel="nofollow noopener noreferrer"&gt;
    &lt;img src="https://camo.githubusercontent.com/4921ed6603bc6780b3892f60abb1cd1143568cf1595701546c32f7a2619d9daf/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f636861742d6f6e253230646973636f72642d3732383944412e737667" alt="Discord Chat"&gt;
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Getting Started&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;Visit the &lt;a href="https://docs.medusajs.com/learn" rel="nofollow noopener noreferrer"&gt;Documentation&lt;/a&gt; to set up a Medusa application.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What is Medusa&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;Medusa is an ecommerce platform with a built-in framework for customization that allows you to build custom commerce applications without reinventing core commerce logic. The framework and modules can be used to build advanced B2B or DTC ecommerce stores, marketplaces, PoS systems, service businesses, or any product that needs foundational commerce primitives. All commerce modules are open-source and freely available on npm.&lt;/p&gt;

&lt;p&gt;Learn more about &lt;a href="https://docs.medusajs.com/learn/advanced-development/architecture/overview" rel="nofollow noopener noreferrer"&gt;Medusa’s architecture&lt;/a&gt; and &lt;a href="https://docs.medusajs.com/resources/commerce-modules" rel="nofollow noopener noreferrer"&gt;commerce modules&lt;/a&gt; in the Docs.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Upgrades &amp;amp; Integrations&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;Follow the &lt;a href="https://github.com/medusajs/medusa/releases" rel="noopener noreferrer"&gt;Release Notes&lt;/a&gt; to keep your Medusa project up-to-date.&lt;/p&gt;

&lt;p&gt;Check out all &lt;a href="https://docs.medusajs.com/resources/integrations" rel="nofollow noopener noreferrer"&gt;available Medusa integrations&lt;/a&gt;.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Community &amp;amp; Contributions&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;The community and core team are available in &lt;a href="https://github.com/medusajs/medusa/discussions" rel="noopener noreferrer"&gt;GitHub Discussions&lt;/a&gt;, where you can ask for support, discuss roadmap, and share ideas.&lt;/p&gt;

&lt;p&gt;Our &lt;a href="https://github.com/medusajs/medusa/blob/develop/CONTRIBUTING.md" rel="noopener noreferrer"&gt;Contribution Guide&lt;/a&gt; describes how to contribute to the…&lt;/p&gt;
&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/medusajs/medusa" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;&lt;a href="https://github.com/medusajs/medusa" rel="noopener noreferrer"&gt;Medusa&lt;/a&gt; is the #1 open source, Node.js commerce platform on GitHub. Its composable and headless architecture allows it to be incorporated with any tech stack to build cross-platform ecommerce stores, ranging from web to android and iOS applications.&lt;/p&gt;

&lt;p&gt;Medusa allows developers to build scalable and maintainable ecommerce stores. It ships with many advanced ecommerce features such as an admin store dashboard, product configurations, manual orders, multi-currency support, and much more. Likewise, it easily integrates with different &lt;a href="https://medusajs.com/blog/build-a-video-game-store-with-medusa-next-js-stripe-algolia/" rel="noopener noreferrer"&gt;payment&lt;/a&gt;, &lt;a href="https://medusajs.com/blog/ecommerce-storefront-medusa-strapi-remix/" rel="noopener noreferrer"&gt;CMS&lt;/a&gt;, and shipping options.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Please star if you like the tool 🌟&lt;/em&gt;
&lt;/h3&gt;




&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before you start, be sure you have &lt;a href="https://nodejs.org" rel="noopener noreferrer"&gt;Node.js&lt;/a&gt; version 14 or above.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create a Server with Medusa Commerce Engine
&lt;/h2&gt;

&lt;p&gt;To set up the Medusa server on your local machine, follow the steps outlined in the sections below.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Install Medusa CLI Tool&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Medusa CLI can be installed using &lt;code&gt;npm&lt;/code&gt; or &lt;code&gt;yarn&lt;/code&gt;, but this tutorial uses &lt;code&gt;npm&lt;/code&gt;. Run the following command to install the Medusa CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @medusajs/medusa-cli &lt;span class="nt"&gt;-g&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Create a New Medusa Store Server
&lt;/h3&gt;

&lt;p&gt;To create a new Medusa store server, run the command below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;medusa new my-medusa-store &lt;span class="nt"&gt;--seed&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note: &lt;code&gt;my-medusa-store&lt;/code&gt; represents the project name; you can change yours to your preferred project name.&lt;/p&gt;

&lt;p&gt;If you created a new Medusa project successfully, you should get a result similar to the screenshot below. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fzxersu5i87k9o9b9zojj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fzxersu5i87k9o9b9zojj.png" alt="Image description" width="662" height="196"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Test Your Medusa Server
&lt;/h3&gt;

&lt;p&gt;To test your Medusa server, change to the newly created directory and run the &lt;code&gt;develop&lt;/code&gt; command using Medusa’s CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;my-medusa-store
medusa develop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can test it by sending a request to &lt;code&gt;localhost:9000/store/products/&lt;/code&gt; which lists the available products in your store.&lt;/p&gt;

&lt;h2&gt;
  
  
  Medusa Admin Installation
&lt;/h2&gt;

&lt;p&gt;To set up your Medusa Admin, follow the steps below.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Clone the Medusa Admin repository:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/medusajs/admin medusa-admin
&lt;span class="nb"&gt;cd &lt;/span&gt;medusa-admin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Run the command below to install all necessary dependencies:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Test it:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By default, Medusa Admin runs on port &lt;code&gt;7000&lt;/code&gt;. You can go to &lt;code&gt;localhost:7000&lt;/code&gt; on your browser to access your admin page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fjmv7iwl3q8ejbieanr1g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fjmv7iwl3q8ejbieanr1g.png" alt="Image description" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Since you included the &lt;code&gt;--seed&lt;/code&gt; option while installing the Medusa server, a dummy admin user has been created. The email is &lt;code&gt;admin@medusa-test.com&lt;/code&gt;, and the password is &lt;code&gt;supersecret&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;With the Medusa Admin, you can create new products and collections for your store. You can also edit, unpublish, duplicate and delete products from the admin.&lt;/p&gt;

&lt;p&gt;You can visit the &lt;a href="https://docs.medusajs.com/user-guide/" rel="noopener noreferrer"&gt;User Guide&lt;/a&gt; to learn more about Medusa Admin.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Frujceiqkc68aqoun9hvv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Frujceiqkc68aqoun9hvv.png" alt="Image description" width="800" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Create a New Vue.js Project
&lt;/h2&gt;

&lt;p&gt;The next thing is to create and set up a new Vue.js project for the ecommerce project. You can run this command to set up a new Vue.js project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm init vue@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command will install and execute &lt;a href="https://github.com/vuejs/create-vue" rel="noopener noreferrer"&gt;create-vue&lt;/a&gt;, the official Vue project scaffolding tool. You will be presented with prompts for a number of optional features such as TypeScript and testing support.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fybo66mucdrcpwchvw585.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fybo66mucdrcpwchvw585.png" alt="Image description" width="594" height="275"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ensure you choose the same option as the ones in the above screenshot.&lt;/p&gt;

&lt;p&gt;Once the project is created, use the following commands to install the necessary dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;vuejs-ecommerce
npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Tailwind CSS Installation
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://tailwindcss.com/" rel="noopener noreferrer"&gt;Tailwind CSS&lt;/a&gt; is a CSS framework that allows you to effortlessly style your ecommerce storefront. In this tutorial, you’ll use Tailwind CSS in your Vue.js ecommerce storefront.&lt;/p&gt;

&lt;p&gt;In the &lt;code&gt;vuejs-ecommerce&lt;/code&gt; directory, run the following command to install Tailwind CSS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-D&lt;/span&gt; tailwindcss postcss autoprefixer
npx tailwindcss init &lt;span class="nt"&gt;-p&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above command will generate both the &lt;code&gt;tailwind.config.js&lt;/code&gt; and &lt;code&gt;postcss.config.js&lt;/code&gt; files in your Vue.js project.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Configure Your Template Paths&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;In your &lt;code&gt;tailwind.config.js&lt;/code&gt;file, replace the &lt;code&gt;content&lt;/code&gt; array with the following snippet:&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="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./index.html&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./src/**/*.{js,ts,jsx,tsx,vue}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Add the Tailwind Directives to your CSS&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Go to &lt;code&gt;src/assets/main.css&lt;/code&gt; and replace the entire code with the snippet below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@tailwind&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@tailwind&lt;/span&gt; &lt;span class="n"&gt;components&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@tailwind&lt;/span&gt; &lt;span class="n"&gt;utilities&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;base&lt;/code&gt;layer handles things like reset rules or default styles applied to plain HTML elements.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;components&lt;/code&gt; layer handles class-based styles that you want to be able to override with utilities.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;utilities&lt;/code&gt; layer handles small, single-purpose classes that should always take precedence over any other styles.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can visit &lt;a href="https://tailwindcss.com/docs/guides/vite#vue" rel="noopener noreferrer"&gt;Tailwind CSS documentation&lt;/a&gt; to learn more.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Integrate Vue.js Ecommerce Storefront with Medusa&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;In this section, you’ll prepare to integrate the Vue.js ecommerce storefront with the Medusa server to interact with APIs later on.&lt;/p&gt;

&lt;h3&gt;
  
  
  Create a Base URL Environment Variable
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;baseURL&lt;/code&gt; environment variable is the URL of your Medusa server. Create a &lt;code&gt;.env&lt;/code&gt; file in the &lt;code&gt;vuejs-ecommerce&lt;/code&gt; directory with the following content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;VITE_baseUrl=http://localhost:9000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note: If for any reason, you changed the default port number of your Medusa Server, you must change the &lt;code&gt;9000&lt;/code&gt; to your port number here.&lt;/p&gt;

&lt;h3&gt;
  
  
  Install Axios in the Vue.js Project
&lt;/h3&gt;

&lt;p&gt;You’ll use &lt;a href="https://github.com/axios/axios" rel="noopener noreferrer"&gt;Axios&lt;/a&gt; to send requests to your Medusa server. You can install Axios by running the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i axios
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now that Axios is installed, the next step is integrating Medusa API into your project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating Components for Your Vue.js Project
&lt;/h2&gt;

&lt;p&gt;In this section, you will create components such as &lt;code&gt;Header&lt;/code&gt;, &lt;code&gt;Footer&lt;/code&gt;, and &lt;code&gt;Products&lt;/code&gt; components. These components will be used on different pages of your storefront.&lt;/p&gt;

&lt;p&gt;In some components images are used to implement a better design for the storefront. You can find all images used for this project in the &lt;a href="https://github.com/noblefresh/vuejs-ecommerce/tree/master/src/images" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Page Header Component
&lt;/h3&gt;

&lt;p&gt;Create the file &lt;code&gt;src/components/PageHeader.vue&lt;/code&gt; and add the following code to it:&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="nt"&gt;template&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="nt"&gt;div&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"fixed z-50 bg-white topNav w-full top-0 p-3 md:bg-opacity-0"&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"max-w-6xl relative flex mx-auto flex-col md:flex-row"&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="nt"&gt;a&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"md:hidden absolute top-1 right-14"&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"relative"&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="nt"&gt;img&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/src/images/icon.png"&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"bottom-1 cursor-pointer relative"&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"absolute px-1  bg-red-500 -top-1 -right-1 rounded-full border-2 border-white text-white"&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"cart2"&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"font-size: 10px"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;a&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"absolute h-10 flex justify-center bars items-center w-10 text-white right-1 -top-2 rounded-lg shadow-lg md:hidden cursor-pointer border-2 border-white bg-red-500"&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="nt"&gt;i&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"fa fa-bars"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;i&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="nt"&gt;div&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"flex-grow font-bold text-lg"&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="nt"&gt;router&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="na"&gt;link&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"{ name: 'home'}"&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="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Noble's Shop&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&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="nt"&gt;router&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="na"&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="nt"&gt;div&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"menu hidden md:flex flex-col md:flex-row mt-5 md:mt-0 gap-16"&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"flex flex-col md:flex-row gap-12 capitalize"&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&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="nt"&gt;router&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="na"&gt;link&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"{ name: 'home'}"&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="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-red-400 font-bold border-b border-red-400"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;home&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&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="nt"&gt;router&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="na"&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="nt"&gt;div&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&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="nt"&gt;router&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="na"&gt;link&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"{ name: 'products'}"&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="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;products&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&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="nt"&gt;router&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="na"&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="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"flex gap-12"&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="nt"&gt;a&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"#"&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"hidden md:block"&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"relative"&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="nt"&gt;img&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/src/images/icon.png"&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"bottom-1 cursor-pointer relative"&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;v-if&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"productId.length &amp;gt; 0"&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"absolute px-1  bg-red-500 -top-1 -right-1 rounded-full border-2 border-white text-white"&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"cart"&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"font-size: 10px"&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;{&lt;/span&gt;&lt;span class="nx"&gt;productId&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;a&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="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;template&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="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
export default &lt;span class="si"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;
        &lt;span class="nl"&gt;productId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;Array&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="si"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&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;The above code block covers the header page of this project. It includes the page routes, website name, and shopping cart icon.&lt;/p&gt;

&lt;p&gt;This component will be added later in &lt;code&gt;src/App.vue&lt;/code&gt; of this project to add a header on every page of this storefront.&lt;/p&gt;

&lt;h3&gt;
  
  
  Footer Component
&lt;/h3&gt;

&lt;p&gt;Create the file &lt;code&gt;src/components/FooterComponent.vue&lt;/code&gt; with the following content:&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="nt"&gt;template&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="nt"&gt;div&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"bg-purple-300 py-32 px-4 gap-y-20 justify-center items-center"&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"font-extrabold text-4xl text-center space-y-3"&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Join Our Wait List And Get&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-red-custom"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Discount Up to 50%&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"py-1 flex relative max-w-xl mx-auto"&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="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Enter Your Email Here"&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-sm border w-full pr-52 focus:ring-red-400 focus:border-red-400 relative px-5 placeholder-gray-400 py-6 -right-1 border-red-400 rounded-lg flex-grow"&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="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"bg-btn-color absolute text-base -right-1 uppercase rounded-lg z-10 text-white px-16 py-6 bg-opacity-25"&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"top: 5px"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                            sign in
                        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&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="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"bg-purple-800 py-32 PX-4"&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"max-w-6xl gap-6 mx-auto grid grid-cols-1 md:grid-cols-9"&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"md:col-span-3 py-3 space-y-4"&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-2xl font-bold text-gray-100"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Noble's Shop&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-gray-300 w-60 pr-0"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;We sell only but quality and first grade Hoddies, Joggers, Shorts and lot more.&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"md:col-span-2 py-3 space-y-4"&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-2xl font-bold text-gray-100"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Information&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-gray-300 w-60 space-y-2 pr-0"&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;About Us&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;More Search&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Online Order&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Support&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"md:col-span-2 py-3 space-y-4"&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-2xl font-bold text-gray-100"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Our Services&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-gray-300 w-60 space-y-2 pr-0"&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Clothing&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Fashion&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Design&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Privacy&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"md:col-span-2 py-3 space-y-4"&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-2xl font-bold text-gray-100"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Contact Us&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-gray-300 w-60 space-y-2 pr-0"&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;+234 098-897-8888&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;info@domain-name.com&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Terms &lt;span class="err"&gt;&amp;amp;&lt;/span&gt; Condition&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;template&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;In the above component, you covered everything about the footer page of this ecommerce app. You’ll use it later across your pages where you want to add a footer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Products Component
&lt;/h3&gt;

&lt;p&gt;Create the file &lt;code&gt;src/components/Products.vue&lt;/code&gt; with the following content:&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="nt"&gt;template&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="nt"&gt;div&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"py-28"&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"max-w-6xl mx-auto py-4 space-y-5"&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"flex"&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"flex-grow text-4xl font-extrabold"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Special Qualities For You&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"grid gap-20 grid-cols-1 md:grid-cols-2 lg:grid-cols-3 px-3"&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;v-for&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"(products, i) in fetchData"&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"i"&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"rounded-lg shadow-xl"&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&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="nt"&gt;router&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="na"&gt;link&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"{ name: 'single-product', params: { id: products.id }}"&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;" bg-white w-full flex justify-center items-center"&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="nt"&gt;img&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"products.thumbnail"&lt;/span&gt; &lt;span class="na"&gt;alt&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt; &lt;span class="na"&gt;srcset&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&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="nt"&gt;div&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"bg-purple-100 py-8 relative font-bold text-xl w-full flex flex-col justify-center px-6"&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&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;{&lt;/span&gt; &lt;span class="nx"&gt;products&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                                &lt;span class="ni"&gt;&amp;amp;euro;&lt;/span&gt; &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;products&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;variants&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;prices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                            &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;router&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="na"&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="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;template&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="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
import axios from 'axios'
import &lt;span class="si"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;RouterLink&lt;/span&gt; &lt;span class="si"&gt;}&lt;/span&gt; from 'vue-router';

export default (&lt;span class="si"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;data&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;fetchData&lt;/span&gt;&lt;span class="p"&gt;:[]&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="nf"&gt;mounted&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
        &lt;span class="c1"&gt;// calling the fetchProducts method when the page has loaded&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fetchProducts&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="nx"&gt;methods&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;
        &lt;span class="nf"&gt;fetchProducts&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
            &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;VITE_baseUrl&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/store/products`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fetchData&lt;/span&gt; &lt;span class="o"&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;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;products&lt;/span&gt;
                &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;products&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="si"&gt;}&lt;/span&gt;
})
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&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;The product component is where the products are fetched using Medusa’s APIs. &lt;code&gt;fetchProducts&lt;/code&gt; method is used to fetch products from the Medusa Server. Notice how you use the &lt;code&gt;baseURL&lt;/code&gt; defined in the &lt;code&gt;.env&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;In addition, the Vue router is being used to route each selected product to a single product page which you’ll add later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating Vue.js Router File for Routing Pages
&lt;/h2&gt;

&lt;p&gt;The next thing to do is to create a router file for routing our pages. By default, a route file is always generated when creating the vue.js project. Find the &lt;code&gt;src/router/index.js&lt;/code&gt; file and replace the code inside with the below content:&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createRouter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;createWebHistory&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;vue-router&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;HomeView&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../views/HomeView.vue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;SingleProductView&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../views/SingleProductView.vue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;ProductView&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../views/ProductView.vue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createRouter&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;history&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;createWebHistory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;BASE_URL&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;routes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;home&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;component&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;HomeView&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/products&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;products&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;component&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ProductView&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/single-product/:id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;single-product&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;component&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;SingleProductView&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;router&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the above component, you specified all your routes, including the route path, name, and components. The routes you added are for the homepage, products page, and single product page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create Storefront Pages
&lt;/h2&gt;

&lt;p&gt;In this section, you’ll create pages for your storefront. Before you start creating these pages, go to &lt;code&gt;src/App.vue&lt;/code&gt; and replace the code with the following:&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="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
import &lt;span class="si"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;RouterLink&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;RouterView&lt;/span&gt; &lt;span class="si"&gt;}&lt;/span&gt; from 'vue-router'
import PageHeader from './components/PageHeader.vue'

&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&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="nt"&gt;template&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="nt"&gt;header&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="nt"&gt;page&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="na"&gt;header&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="na"&gt;productId&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"products"&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="nt"&gt;header&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;RouterView&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;addp&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"addP($event)"&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"fixed top-12 bg-green-600 text-white z-50 border text-md uppercase shadow-lg py-1 px-4 rounded-lg transistion-all duration-700"&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"notify"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;item added successfully&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&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="nt"&gt;template&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="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
import axios from 'axios'
export default &lt;span class="si"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;data&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;products&lt;/span&gt;&lt;span class="p"&gt;:[],&lt;/span&gt;
      &lt;span class="na"&gt;notify&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;-right-64&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;cartId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;product_variant_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="nf"&gt;mounted&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;checkCartID&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="nx"&gt;methods&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;

      &lt;span class="nf"&gt;getCartID&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
        &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;VITE_baseUrl&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/store/carts`&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;res&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="nx"&gt;localStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cart_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&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;cart&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;

    &lt;span class="nf"&gt;checkCartID&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cartId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;localStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cart_id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cartId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getCartID&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="si"&gt;}&lt;/span&gt;,

    addP(data)&lt;span class="si"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cartId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;localStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cart_id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;VITE_baseUrl&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/store/carts/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cartId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/line-items`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;variant_id&lt;/span&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="na"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;products&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&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;localStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cart&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;products&lt;/span&gt;
            &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;notify&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;right-3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
            &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;inter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;setInterval&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;notify&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;-right-64&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
              &lt;span class="nf"&gt;clearInterval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;inter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="si"&gt;}&lt;/span&gt;
  }
}
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&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;Here, you import the header component so that it appears on all pages.&lt;/p&gt;

&lt;p&gt;You also add some methods related to the cart. The &lt;code&gt;checkCartID&lt;/code&gt; method checks on page load if there’s a cart ID in the local storage, and if so calls the &lt;code&gt;getCartID&lt;/code&gt; method. The &lt;code&gt;getCartID&lt;/code&gt; method is used to fetch cart and its items from the Medusa server. &lt;/p&gt;

&lt;p&gt;The &lt;code&gt;addP&lt;/code&gt; method is used to add products to your store cart. It will be called later on the Single Product page.&lt;/p&gt;

&lt;p&gt;You can learn more about Medusa carts in the &lt;a href="https://docs.medusajs.com/api/store/#tag/Cart" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Homepage View
&lt;/h3&gt;

&lt;p&gt;Create the file &lt;code&gt;src/views/HomeView.vue&lt;/code&gt; with the following content:&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="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
import PageHeader from '../components/PageHeader.vue'
import Products from '../components/Products.vue'
import FooterComponent from '../components/FooterComponent.vue'
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&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="nt"&gt;template&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="nt"&gt;main&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"bg-purple-300 w-full"&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"height: 92vh"&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"max-w-6xl mx-auto h-full flex items-center"&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"grid gap-1 px-3 grid-cols-1 mt-8 md:grid-cols-5"&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"md:col-span-2 order-2 flex flex-col justify-center space-y-12"&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"space-y-5"&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"font-extrabold w-full text-6xl"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                              Nothing But Qualities
                          &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-lg leading-7 max-w-md"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                              We sell quality Hoddies, Joggers, Shorts and lot more
                          &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;router&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="na"&gt;link&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"{ name: 'products'}"&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="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'w-fit  cursor-pointer transistion-all duration-300 hover:text-purple-400 text-white px-3  py-3 bg-gradient-to-r from-purple-500 to-pink-500 rounded flex justify-center items-center'&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                                Explore More
                          &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&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="nt"&gt;router&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="na"&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="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"md:col-span-3 flex justify-center md:order-2"&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="nt"&gt;img&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/src/images/hoddie.png"&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"bottom-1 relative h-11/12"&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&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="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"flex justify-center bg-purple-300 py-4 pb-10 w-full"&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"h-14 rounded-2xl relative"&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"border: 1px solid black;padding:3px 6px 3px"&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"bg-black rounded-full relative top-10"&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"padding: 3px"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;products&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="nt"&gt;footer&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="na"&gt;component&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="nt"&gt;main&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="nt"&gt;template&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="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
export default &lt;span class="si"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;mounted&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;handlePageScroll&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="nx"&gt;methods&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;
    &lt;span class="nf"&gt;handlePageScroll&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
      &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;scrollTo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;scrollposition&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;scrollposition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pageYOffset&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="si"&gt;}&lt;/span&gt;
}
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&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;You import the &lt;code&gt;Products&lt;/code&gt; and &lt;code&gt;FooterComponent&lt;/code&gt; components inside this file and display them on the Homepage.&lt;/p&gt;

&lt;h3&gt;
  
  
  Products Page View
&lt;/h3&gt;

&lt;p&gt;Create the file &lt;code&gt;src/views/ProductView.vue&lt;/code&gt; with the following content:&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="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
import PageHeader from '../components/PageHeader.vue'
import Products from '../components/Products.vue'
import FooterComponent from '../components/FooterComponent.vue'
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&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="nt"&gt;template&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="nt"&gt;main&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="nt"&gt;products&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="nt"&gt;footer&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="na"&gt;component&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="nt"&gt;main&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="nt"&gt;template&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;You also import the &lt;code&gt;Products&lt;/code&gt; and &lt;code&gt;FooterComponent&lt;/code&gt; components inside this file to display them in the Products listing page.&lt;/p&gt;

&lt;h3&gt;
  
  
  Single Product Page
&lt;/h3&gt;

&lt;p&gt;Create the file &lt;code&gt;src/views/SingleProductView.vue&lt;/code&gt; with the following content:&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="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
import FooterComponent from '../components/FooterComponent.vue'
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&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="nt"&gt;template&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="nt"&gt;main&lt;/span&gt; &lt;span class="na"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"addProd"&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'py-20 px-4'&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'text-white max-w-6xl mx-auto py-2'&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'grid md:grid-cols-2 gap-20 grid-cols-1'&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"relative"&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="nt"&gt;img&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"imgArr[currentImg]"&lt;/span&gt; &lt;span class="na"&gt;alt&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"no image"&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"absolute overflow-x-scroll w-full bottom-0 right-0 p-4 flex flex-nowrap gap-4"&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="nt"&gt;div&lt;/span&gt;  &lt;span class="na"&gt;v-for&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"(er,i) in imgArr.length"&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"i"&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"flex w-full flex-nowrap gap-4 rounded-lg"&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="nt"&gt;div&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;click&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"currentImg = i"&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"imgArr[i]"&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"w-16 h-24 flex-none"&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"h-full w-full rounded-lg cursor-pointer shadow-lg border overflow-hidden"&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="nt"&gt;img&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"imgArr[i]"&lt;/span&gt; &lt;span class="na"&gt;alt&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"h-full w-full"&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="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'flex md:flex-col flex-col space-y-7 justify-center'&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'text-black space-y-3'&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="nt"&gt;h2&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'font-bold text-xl text-black'&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;{&lt;/span&gt;&lt;span class="nx"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h2&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="nt"&gt;p&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'text-sm'&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;{&lt;/span&gt;&lt;span class="nx"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&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="nt"&gt;div&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'space-y-3'&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'font-bold text-md text-black'&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Select Size&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'flex flex-row flex-wrap gap-4'&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;v-for&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"(size,i) in sizes"&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"i"&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&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="nt"&gt;div&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;click&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"currentSize = size ; currentPrice = priceList[i] ; variants_id = product.variants[i].id"&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"currentSize == size ? 'border-purple-300 bg-purple-100':'border-gray-100' "&lt;/span&gt; &lt;span class="na"&gt;contenteditable&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'border-2 rounded-md cursor-pointer flex justify-center py-3 px-5'&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="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;' text-black text-sm'&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;{&lt;/span&gt;&lt;span class="nx"&gt;size&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&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="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'flex flex-col space-y-3'&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="nt"&gt;div&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="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'text-gray-700 text-2xl font-san'&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="ni"&gt;&amp;amp;euro;&lt;/span&gt; &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;currentPrice&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&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="nt"&gt;div&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="nt"&gt;div&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;click&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"addProduct()"&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'bg-gray-900 cursor-pointer text-white w-full text-sm font-semibold py-3 flex justify-center cursor pointer hover:bg-white hover:border hover:border-gray-900 hover:text-black '&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                                    ADD TO CART
                                &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;div&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="nt"&gt;footer&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="na"&gt;component&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="nt"&gt;main&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="nt"&gt;template&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="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
import axios from 'axios'

export default &lt;span class="si"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;activated&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;scrollTo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="nf"&gt;data&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;currentImg&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;imgArr&lt;/span&gt;&lt;span class="p"&gt;:[],&lt;/span&gt;
            &lt;span class="na"&gt;productData&lt;/span&gt;&lt;span class="p"&gt;:[],&lt;/span&gt;
            &lt;span class="na"&gt;product&lt;/span&gt;&lt;span class="p"&gt;:[],&lt;/span&gt;
            &lt;span class="na"&gt;productId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;sizes&lt;/span&gt;&lt;span class="p"&gt;:[],&lt;/span&gt;
            &lt;span class="na"&gt;currentSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;S&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;priceList&lt;/span&gt;&lt;span class="p"&gt;:[],&lt;/span&gt;
            &lt;span class="na"&gt;currentPrice&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;variants_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="nf"&gt;mounted&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
        &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;scrollTo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="nf"&gt;beforeMount&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;productId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;$route&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
        &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;VITE_baseUrl&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/store/products/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;productId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;productData&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;product&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;productData&lt;/span&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;product&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;product&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;images&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&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;{&lt;/span&gt;
                    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;imgArr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&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;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                                    
                &lt;span class="p"&gt;});&lt;/span&gt;
                &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currentPrice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;variants&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;prices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
                &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;variants_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;variants&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
                &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;variants&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&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;{&lt;/span&gt;
                    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sizes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&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;title&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                    
                    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;priceList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&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;prices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                    
                &lt;span class="p"&gt;});&lt;/span&gt;
            &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="nx"&gt;methods&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;
        &lt;span class="nf"&gt;addProduct&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
            &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;$emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;addP&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;variants_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="si"&gt;}&lt;/span&gt;
}
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&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;In the above code block, you are fetching a single product from the Medusa server using its id. Then, you display the product’s information including its price, size, and description.&lt;/p&gt;

&lt;p&gt;When the Add to Cart button is clicked, the &lt;code&gt;addProduct&lt;/code&gt; method is executed. This method calls the &lt;code&gt;addP&lt;/code&gt; method defined in &lt;code&gt;src/App.vue&lt;/code&gt; passing it the selected variant ID.&lt;/p&gt;

&lt;h2&gt;
  
  
  Change Vue.js Port
&lt;/h2&gt;

&lt;p&gt;In the &lt;code&gt;vite.config.js&lt;/code&gt;file, add this code snippet inside the object parameter passed to&lt;code&gt;defineConfig&lt;/code&gt;:&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="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8000&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the above code block, you change the port of the Vue.js ecommerce storefront to &lt;code&gt;8000&lt;/code&gt;. This allows you to avoid &lt;code&gt;cors&lt;/code&gt; issues when sending requests to the Medusa server.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test the Storefront
&lt;/h2&gt;

&lt;p&gt;You can now test your Vue.js ecommerce storefront with the following steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Run the Medusa server:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;medusa develop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Run the Vue.js app:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you open the storefront on &lt;code&gt;localhost:8000&lt;/code&gt;, you’ll see the following home page:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fnvklasmw56cuus6y2k28.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fnvklasmw56cuus6y2k28.png" alt="Image description" width="800" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you scroll down or click on the Products item in the navigation bar, you’ll see products populated from your Medusa server.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fn5jtv154zuocy9w6b71r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fn5jtv154zuocy9w6b71r.png" alt="Image description" width="800" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Try clicking on any of the products, a new page will open showing the products details.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fjigfhajtcdq3wv12npht.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fjigfhajtcdq3wv12npht.png" alt="Image description" width="800" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can add the product to the cart by clicking the “Add to Cart” button.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s Next?
&lt;/h2&gt;

&lt;p&gt;In this tutorial, you learned how to create a Vue.js Ecommerce storefront with the help of Medusa. This storefront only implements the product listing and add-to-cart functionality, but there’s much more to add to your storefront.&lt;/p&gt;

&lt;p&gt;Check out the following documentation pages for help on how to move forward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add a &lt;a href="https://docs.medusajs.com/advanced/storefront/how-to-implement-checkout-flow" rel="noopener noreferrer"&gt;checkout page&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Install &lt;a href="https://docs.medusajs.com/add-plugins/stripe" rel="noopener noreferrer"&gt;Stripe&lt;/a&gt; plugin to process payments.&lt;/li&gt;
&lt;li&gt;Add advanced search functionality with &lt;a href="https://docs.medusajs.com/add-plugins/meilisearch" rel="noopener noreferrer"&gt;MeiliSearch&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Should you have any issues or questions related to Medusa, then feel free to reach out to the Medusa team via &lt;a href="https://discord.gg/medusajs" rel="noopener noreferrer"&gt;Discord&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>security</category>
      <category>community</category>
    </item>
    <item>
      <title>Ecommerce Website Breakdown: Using Medusa as a Case Study</title>
      <dc:creator>Noble Okechi</dc:creator>
      <pubDate>Tue, 18 Oct 2022 12:17:59 +0000</pubDate>
      <link>https://dev.to/nobleokechi/ecommerce-website-breakdown-using-medusa-as-a-case-study-1lca</link>
      <guid>https://dev.to/nobleokechi/ecommerce-website-breakdown-using-medusa-as-a-case-study-1lca</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;If you want to own an eCommerce store and have been facing challenges in choosing the best eCommerce platform to build your store on, this article will walk you through selecting the best eCommerce platform to work with.&lt;/p&gt;

&lt;p&gt;In this article, you’ll learn the key concepts of an eCommerce platform, the different types of eCommerce and an overview of eCommerce platforms. You’ll learn how to start up your own store, the benefits of using Medusa eCommerce Platform, and why you should use Medusa.&lt;/p&gt;

&lt;h1&gt;
  
  
  What is eCommerce?
&lt;/h1&gt;

&lt;p&gt;eCommerce, the short form for Electronic Commerce, enables the buying and selling of goods and services or sending data and funds via the internet.&lt;/p&gt;

&lt;p&gt;eCommerce simply is a place where we can buy or sell different items. Today, we have many eCommerce platforms; examples include Medusa, Shopify, Amazon, Alibaba, eBay and others.&lt;/p&gt;

&lt;h1&gt;
  
  
  Types of eCommerce Websites
&lt;/h1&gt;

&lt;p&gt;As said earlier, we have many eCommerce websites, and they fall into different categories, including:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Business to Business (B2B)&lt;/li&gt;
&lt;li&gt;Business to Consumer (B2C)&lt;/li&gt;
&lt;li&gt;Consumer to Consumer (C2C)&lt;/li&gt;
&lt;li&gt;Consumer to Business (C2B)&lt;/li&gt;
&lt;li&gt;Business to Administration (B2A)&lt;/li&gt;
&lt;li&gt;Consumer to Administration (C2A)&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Business to Business (B2B)
&lt;/h3&gt;

&lt;p&gt;B2B is a process where the transaction of goods and services is done between two companies or business owners, i.e. selling to another (as wholesale services). This process does not involve the end user yet (consumer).&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Business to Consumer (B2C)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;B2C involves the consumer itself, i.e. selling products and services to the consumer. This model is the most popular today across different countries. Examples are McDonald’s, Walmart, Amazon, and many others.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Consumer to Consumer (C2C)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;C2C involves the selling goods between two consumers. Let’s say you bought pizza from McDonald’s, and after getting home, you found out that you were given beef pizza instead of the chicken pizza you requested. You then decide to sell it to your friend since he or she enjoys eating beef pizza. That whole process is called C2C, it can also be done through platforms like &lt;a href="https://www.ebay.com/"&gt;eBay&lt;/a&gt; ****and more, where you have to put the goods online for other consumers to see.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Consumer to Business (C2B)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;C2B is the opposite of Business to Consumer (B2C). This involves the transaction between a consumer and business owners and companies. For example, rendering your service as a photographer, graphics designer, or web developer to a company or business owner to buy or use.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Business to Administration (B2A)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;B2A transaction occurs between companies and public administration or government bodies. The products and services rendered to them are social security, employment, legal documents, and so on.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Consumer to Administration (C2A)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;C2A is the opposite of B2A, but products or services are rendered by individuals to government bodies or public administration. This type of eCommerce applies in the areas of health, education, social security, and so on.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Medusa?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://medusajs.com/"&gt;Medusa&lt;/a&gt; is an open-source composable commerce engine that enables developers to create amazing digital commerce experiences.&lt;/p&gt;

&lt;p&gt;As an open-source eCommerce platform, you can contribute to it and customize certain things based on your preference. Medusa can also be used by beginners (developers), not just experienced developers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Should You Use Medusa?
&lt;/h2&gt;

&lt;p&gt;Medusa is a free, developer-friendly, open source, eCommerce website. Unlike other eCommerce websites that have so many limitations and are not free, Medusa gives you the full authority, power, and access, to control, customize, and modify every line of code in your store however you want it.&lt;/p&gt;

&lt;p&gt;Medusa is so flexible that your business can grow with it. As your business grows over the years, you may feel the need to add some new features or change some things in your store. Medusa makes it very easy for you to write some lines of codes to achieve what you want.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;How Medusa Works&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Medusa functions as a Headless commerce engine, its headless architecture makes it easy for third-party integrations such as Payment providers, Analytics, Notification providers, Search integration,  CMS, and storage integration.&lt;/p&gt;

&lt;p&gt;Medusa has a pre-built &lt;a href="https://docs.medusajs.com/admin/quickstart"&gt;Admin Panel&lt;/a&gt;, &lt;a href="https://docs.medusajs.com/starters/nextjs-medusa-starter"&gt;Nextjs Storefront&lt;/a&gt;, and &lt;a href="https://docs.medusajs.com/starters/gatsby-medusa-starter"&gt;Gatsby Storefront&lt;/a&gt;, which make it easier for building. It is easy to set up a Medusa eCommerce store using all pre-built codebase and third-party integrations.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;How to Get Started with Medusa&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Getting started with Medusa eCommerce website is as simple as cloning an open source codebase from a GitHub repository.&lt;/p&gt;

&lt;p&gt;Medusa has a well-written documentation, which makes the setup easier. Medusa eCommerce website can be completely integrated with a few lines of commands as stated in the &lt;a href="https://docs.medusajs.com/quickstart/quick-start"&gt;Quickstart Guide Documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For more details on how to use Medusa, visit the &lt;a href="https://docs.medusajs.com/"&gt;documentation website&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Benefits of Medusa over other eCommerce Platforms&lt;/strong&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  1. Medusa Flexible Backend
&lt;/h2&gt;

&lt;p&gt;Medusa as an open source headless commerce engine, which has  similar feature as other ecommerce platforms. But the Medusa backend is built such that developers can easily study, understand and  write new codes depending on what the developer intends to achieve.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Medusa Site Performance
&lt;/h2&gt;

&lt;p&gt;Medusa decouples the frontend from the backend and also decouples the admin panel from the backend, i.e Medusa frontend, backend and admin panel stand on a separate codebase.&lt;br&gt;
The frontend only fetches and posts data to backend as well as the admin panel, which makes Medusa site performance to be faster.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Medusa Supports Multi-currency
&lt;/h2&gt;

&lt;p&gt;With Medusa, there is no need to create or have multiple stores just to handle multiple currencies. Medusa lets you do it all from one admin dashboard. You can create multiple regions in the same store and select the currency of the region. Then, you’ll be able to set the price of the product differently for each currency.&lt;/p&gt;

&lt;p&gt;Read: &lt;a href="https://dev.to/medusajs/how-an-open-source-platform-resolves-shopifys-multi-currency-issues-47lg"&gt;How Medusa resolved Multi-currency issue&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Medusa supports Integration
&lt;/h2&gt;

&lt;p&gt;As an eCommerce platform, medusa supports any third-party integrations, unlike other eCommerce platforms that only support a few third-party integrations.&lt;/p&gt;

&lt;p&gt;It only requires a basic understanding of Medusa code-base to enable you integrate any third-party service.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Medusa remains the best platform for developers; its characteristics of being open source, developer-friendly, and free are very interesting and something you must try. To set up your own medusa store visit &lt;a href="https://docs.medusajs.com/quickstart/quick-start"&gt;Medusa Quickstart Guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Always remember to reach out to the Medusa team via &lt;a href="https://discord.gg/y6s5QggZBT"&gt;Discord&lt;/a&gt; if you need more clarity on any issue you are facing.&lt;/p&gt;

</description>
      <category>medusa</category>
      <category>ecommerce</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Building REST API with Laravel 9x</title>
      <dc:creator>Noble Okechi</dc:creator>
      <pubDate>Fri, 16 Sep 2022 19:50:53 +0000</pubDate>
      <link>https://dev.to/nobleokechi/building-rest-api-with-laravel-9x-4m69</link>
      <guid>https://dev.to/nobleokechi/building-rest-api-with-laravel-9x-4m69</guid>
      <description>&lt;p&gt;Laravel is a PHP framework that is build for web Artisan. Laravel attempts to take the pain out of development by easing common tasks used in the majority of web projects, such as authentication, routing, sessions, and caching.&lt;/p&gt;

&lt;p&gt;Laravel aims to make the development process a pleasing one for the developer without sacrificing application functionality.&lt;/p&gt;

&lt;p&gt;Laravel is accessible, yet powerful, providing powerful tools needed for large, robust applications. A superb inversion of control container, expressive migration system, and tightly integrated unit testing support give you the tools you need to build any application with which you are tasked.&lt;/p&gt;

&lt;p&gt;Laravel is a backend framework that provides all of the features you need to build modern web applications, such as routing, validation, caching, queues, file storage, and more. However, we will be learning steps on how to build REST API with Laravel 9x.&lt;/p&gt;

&lt;p&gt;Laravel 9 continues the improvements made in Laravel 8.x by introducing support for Symfony 6.0 components, Symfony Mailer, Flysystem 3.0, improved &lt;code&gt;route:list&lt;/code&gt; output, a Laravel Scout database driver, new Eloquent accessor / mutator syntax, implicit route bindings via Enums, and a variety of other bug fixes and usability improvements.&lt;/p&gt;

&lt;p&gt;Laravel 9 has been one of the most prevalent PHP frameworks for a long time now. It is adaptable, scalable, versatile, and has become one of the in fact the systems for engineers and companies working with PHP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Contents&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prerequisites&lt;/li&gt;
&lt;li&gt;Create a Laravel Project&lt;/li&gt;
&lt;li&gt;Setup a Database&lt;/li&gt;
&lt;li&gt;Create a Database Migration&lt;/li&gt;
&lt;li&gt;Create an API Routes&lt;/li&gt;
&lt;li&gt;Create a Controller&lt;/li&gt;
&lt;li&gt;Code your Functions&lt;/li&gt;
&lt;li&gt;Code Modules&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Prerequisites&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To follow along with this tutorial, you need to ensure that PHP and &lt;a href="https://getcomposer.org/" rel="noopener noreferrer"&gt;Composer&lt;/a&gt; is installed on your local computer for &lt;code&gt;artisan&lt;/code&gt; commands. If you are building frontend on a same file, I recommend you install &lt;a href="https://nodejs.org/" rel="noopener noreferrer"&gt;Node&lt;/a&gt; for NPM commands. But for this content, we shall be using Postman for testing and I recommend you to go through my content on &lt;a href="https://dev.to/nobleokechi/how-to-setup-postman-with-laravel-project-521n"&gt;how to setup postman with laravel&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create your Laravel Project&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To create a laravel project, run the commands below&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;composer global require laravel/installer

laravel new laravel-9x
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;composer&lt;/code&gt; is a dependency manager for PHP that provides a standard format for managing dependencies of PHP software and required libraries.&lt;/p&gt;

&lt;p&gt;The first command &lt;code&gt;composer global require laravel/installer&lt;/code&gt; is used to install &lt;code&gt;laravel&lt;/code&gt; on your local machine.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;laravel new laravel-9x&lt;/code&gt; command installs a fresh laravel project on your computer.&lt;/p&gt;

&lt;p&gt;Note: &lt;code&gt;laravel-9x&lt;/code&gt; can be replace with any preferred name of your choice, as it serves as the project name.&lt;/p&gt;

&lt;p&gt;After the project has been created, &lt;code&gt;cd&lt;/code&gt; into the project directory.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd laravel-9x
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After migrating into your project with the above command, run the next command below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;composer install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above command creates a new &lt;code&gt;vendor&lt;/code&gt; folder on our project and gives access to run to run &lt;code&gt;artisan&lt;/code&gt; commands.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setup a Database&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To setup your database on laravel, locate .env file inside your project files.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=testproject
DB_USERNAME=root
DB_PASSWORD=
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For this project, I will be using &lt;code&gt;MySQL&lt;/code&gt; database and that is while I have the above code snippet. &lt;/p&gt;

&lt;p&gt;&lt;code&gt;DB_DATABASE=testproject&lt;/code&gt; represents your database file name, which &lt;code&gt;testproject&lt;/code&gt; can be changed to any preferred name of your choice.&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%2Fm7bekix768l9ummsah8s.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%2Fm7bekix768l9ummsah8s.PNG" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Having created a database connection as shown above, you can run the below command to migrate your database model.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan key:generate

php artisan migrate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The command above generate an &lt;code&gt;APP_KEY&lt;/code&gt; on the &lt;code&gt;.env&lt;/code&gt; file for your project, while the second command &lt;code&gt;migrate&lt;/code&gt; your database.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create a Database Migration&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A migration file in laravel represents a database table file in the core &lt;code&gt;PHP&lt;/code&gt; code. Migration file is often generated according preferred name of your database table.&lt;/p&gt;

&lt;p&gt;We will generate a migration file called &lt;code&gt;contact&lt;/code&gt;, which will serve as contact table for testing our &lt;code&gt;REST API&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan make:model Contact -m
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above command will generate a &lt;code&gt;model&lt;/code&gt; and database migration file called &lt;code&gt;contact&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Locate the migration inside your project on &lt;code&gt;database/migrations/2022_09_16_042805_create_contacts_table.php&lt;/code&gt;. Note that the file name is been named with the current data attached to it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public function up()
    {
        Schema::create('contacts', function (Blueprint $table) {
            $table-&amp;gt;id();
            $table-&amp;gt;string('name');
            $table-&amp;gt;string('email');
            $table-&amp;gt;string('tel');
            $table-&amp;gt;timestamps();
        });
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copy and replace the &lt;code&gt;up()&lt;/code&gt; function with the snippet above.&lt;/p&gt;

&lt;p&gt;Note, we only added the code block below to the function &lt;code&gt;up()&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$table-&amp;gt;string('name');
$table-&amp;gt;string('email');
$table-&amp;gt;string('tel');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After completing the above, run migration to &lt;code&gt;migrate/create&lt;/code&gt; your table &lt;code&gt;contact&lt;/code&gt; on your database.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan migrate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Create an API Routes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In laravel, we can register all our API routes inside &lt;code&gt;routes/api.php&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;We will be registering two &lt;code&gt;post&lt;/code&gt; API routes before the &lt;code&gt;middleware&lt;/code&gt; routes function. We are creating &lt;code&gt;save_data&lt;/code&gt; and &lt;code&gt;fetch_data&lt;/code&gt; routes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Route::post('save_data', [ContactController::class, 'save_data'])-&amp;gt;name('api.save_data');
Route::post('fetch_data', [ContactController::class, 'fetch_data'])-&amp;gt;name('api.fetch_data');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above code block demonstrate how your route should lock like.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\ContactController;


Route::post('save_data', [ContactController::class, 'save_data'])-&amp;gt;name('api.save_data');
Route::post('fetch_data', [ContactController::class, 'fetch_data'])-&amp;gt;name('api.fetch_data');

Route::middleware('auth:sanctum')-&amp;gt;get('/user', function (Request $request) {
    return $request-&amp;gt;user();
});

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

&lt;/div&gt;



&lt;p&gt;This is my entire &lt;code&gt;api.php&lt;/code&gt; route file codes, you can copy and replace with yours.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create a Controller&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Controllers can group related request handling logic into a single class. &lt;br&gt;
A Controller is that which controls the behavior of a request. It handles the requests coming from the Routes. In Laravel, a controller is in the &lt;code&gt;app/Http/Controllers&lt;/code&gt; directory.&lt;/p&gt;

&lt;p&gt;We will have to create a controller named ContactController using the command below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan make:controller ContactController
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After creating our controller, we can locate the controller on &lt;code&gt;app/Http/Controllers&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code your Functions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is the sweetest part of this article is the coding aspect, here can write your codes according your coding preference, but for a better clarity, you can make reference to my codes.&lt;/p&gt;

&lt;p&gt;Inside the &lt;code&gt;ContactController.php&lt;/code&gt;, we will be having two functions according to our routes on &lt;code&gt;routes/api.php&lt;/code&gt;, where we have &lt;code&gt;save_data&lt;/code&gt; and &lt;code&gt;fetch_data&lt;/code&gt; routes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ContactController extends Controller
{
    // code here
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above code block, represents everything in our &lt;code&gt;ContactController.php&lt;/code&gt; before we write our functions inside.&lt;/p&gt;

&lt;p&gt;Now, we will be writing our first function, which is the &lt;code&gt;save_data&lt;/code&gt; function.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; public function save_data(request $request)
    {
        if(isset($request-&amp;gt;name) &amp;amp;&amp;amp; isset($request-&amp;gt;email) &amp;amp;&amp;amp; isset($request-&amp;gt;tel)){
            // proccess data
            $contact = new contact;
            $contact-&amp;gt;email = $request-&amp;gt;email;
            $contact-&amp;gt;name = $request-&amp;gt;name;
            $contact-&amp;gt;tel = $request-&amp;gt;tel;
            if ($contact-&amp;gt;save()) {
                return response()-&amp;gt;json([
                    'status' =&amp;gt; 'success',
                    'message' =&amp;gt; 'Data saved successfully',
                    'data' =&amp;gt; $contact
                ]);
            } else {
                return response()-&amp;gt;json([
                    'status' =&amp;gt; 'error',
                    'message' =&amp;gt; 'An error occured'
                ],500);
            }

        }else{
            return response()-&amp;gt;json([
                'status' =&amp;gt; 'error',
                'message' =&amp;gt; 'Missing Paramiter'
            ],501);
        }
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;isset()&lt;/code&gt; function checks whether a variable is set, which means that it has to be declared and is not NULL. This function returns true if the variable exists.&lt;/p&gt;

&lt;p&gt;The above code block will save data coming from our REST API routes into our &lt;code&gt;contact&lt;/code&gt; model in the database.&lt;/p&gt;

&lt;p&gt;For this article, I will be testing with &lt;code&gt;postman&lt;/code&gt;, if you are new to postman, I will suggest you check this article on &lt;a href="https://dev.to/nobleokechi/how-to-setup-postman-with-laravel-project-521n"&gt;how to setup postman with laravel&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;From postman, we will be sending &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;email&lt;/code&gt;, and &lt;code&gt;tel&lt;/code&gt; as required on the &lt;code&gt;save_data&lt;/code&gt; function.&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%2Fynkkufx8d58jfkzrjl7s.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%2Fynkkufx8d58jfkzrjl7s.PNG" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have sent the exact data as mine on the snapshot above, you will be getting same response as mine.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"status": "success",
    "message": "Data saved successfully",
    "data": {
        "email": "okechinoble@gmail.com",
        "name": "Noble Okechi",
        "tel": "+2349097784784",
        "updated_at": "2022-09-16T14:47:45.000000Z",
        "created_at": "2022-09-16T14:47:45.000000Z",
        "id": 1
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, that we have achieved the &lt;code&gt;save_data&lt;/code&gt; function, it is time to work build our fetch_data function for getting all stored data from &lt;code&gt;contact&lt;/code&gt; model.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public function fetch_data()
    {
        $fetch = contact::latest()-&amp;gt;get();
        if ($fetch) {
            return response()-&amp;gt;json([
                'status' =&amp;gt; 'success',
                'message' =&amp;gt; 'Data fetched successfully',
                'data' =&amp;gt; $fetch
            ]);
        } else {
            return response()-&amp;gt;json([
                'status' =&amp;gt; 'error',
                'message' =&amp;gt; 'An error occured'
            ],500);
        }

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

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;latest()&lt;/code&gt; fetches the most recent set of data from the Database. it sort its data using the &lt;code&gt;created_at&lt;/code&gt; column.&lt;/p&gt;

&lt;p&gt;Now, we can create &lt;code&gt;fetch_data&lt;/code&gt; request on postman to test the &lt;code&gt;fetch_data&lt;/code&gt; function.&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%2Flma0w8tdrq4khiohn19q.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%2Flma0w8tdrq4khiohn19q.PNG" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After setting up postman request to fetch data from fetch_data API, I got an array of data as response below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"status": "success",
    "message": "Data fetched successfully",
    "data": [
        {
            "id": 2,
            "name": "Developer Noble",
            "email": "dev@gmail.com",
            "tel": "+234000000000",
            "created_at": "2022-09-16T15:20:39.000000Z",
            "updated_at": "2022-09-16T15:20:39.000000Z"
        },
        {
            "id": 1,
            "name": "Noble Okechi",
            "email": "okechinoble@gmail.com",
            "tel": "+2349097784784",
            "created_at": "2022-09-16T14:47:45.000000Z",
            "updated_at": "2022-09-16T14:47:45.000000Z"
        }
    ]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wow, if you have gotten it to this extent, bravos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code Modules&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We can now wrap up our code by posting the entire codes module by module.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;ContactController Module&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ContactController&lt;/code&gt; module is located at &lt;code&gt;app/Http/Controllers&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?php

namespace App\Http\Controllers;

use App\Models\contact;
use Illuminate\Http\Request;

class ContactController extends Controller
{
    public function save_data(request $request)
    {
        if(isset($request-&amp;gt;name) &amp;amp;&amp;amp; isset($request-&amp;gt;email) &amp;amp;&amp;amp; isset($request-&amp;gt;tel)){
            // proccess data
            $contact = new contact;
            $contact-&amp;gt;email = $request-&amp;gt;email;
            $contact-&amp;gt;name = $request-&amp;gt;name;
            $contact-&amp;gt;tel = $request-&amp;gt;tel;
            if ($contact-&amp;gt;save()) {
                return response()-&amp;gt;json([
                    'status' =&amp;gt; 'success',
                    'message' =&amp;gt; 'Data saved successfully',
                    'data' =&amp;gt; $contact
                ]);
            } else {
                return response()-&amp;gt;json([
                    'status' =&amp;gt; 'error',
                    'message' =&amp;gt; 'An error occured'
                ],500);
            }

        }else{
            return response()-&amp;gt;json([
                'status' =&amp;gt; 'error',
                'message' =&amp;gt; 'Missing Paramiter'
            ],501);
        }
    }

    public function fetch_data()
    {
        $fetch = contact::latest()-&amp;gt;get();
        if ($fetch) {
            return response()-&amp;gt;json([
                'status' =&amp;gt; 'success',
                'message' =&amp;gt; 'Data fetched successfully',
                'data' =&amp;gt; $fetch
            ]);
        } else {
            return response()-&amp;gt;json([
                'status' =&amp;gt; 'error',
                'message' =&amp;gt; 'An error occured'
            ],500);
        }

    }
}

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;Contact Migration Module&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you can recall, we buildup our database contact model fields inside migration folder and can be located at &lt;code&gt;database/migrations&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('contacts', function (Blueprint $table) {
            $table-&amp;gt;id();
            $table-&amp;gt;string('name');
            $table-&amp;gt;string('email');
            $table-&amp;gt;string('tel');
            $table-&amp;gt;timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('contacts');
    }
};

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;API Routes Modules&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;API routes is located at routes/api.php.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\ContactController;


Route::post('save_data', [ContactController::class, 'save_data'])-&amp;gt;name('api.save_data');
Route::post('fetch_data', [ContactController::class, 'fetch_data'])-&amp;gt;name('api.fetch_data');

Route::middleware('auth:sanctum')-&amp;gt;get('/user', function (Request $request) {
    return $request-&amp;gt;user();
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br&gt;
In this article, we successfully explored different modules in laravel 9x and we demonstrated easy steps on how to build REST APIs on laravel 9x.&lt;/p&gt;

&lt;p&gt;With laravel 9x, it is easy to build standard REST APIs for every frontend.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Paystack Payment Initialization using PHP Laravel Backend</title>
      <dc:creator>Noble Okechi</dc:creator>
      <pubDate>Mon, 12 Sep 2022 13:51:12 +0000</pubDate>
      <link>https://dev.to/nobleokechi/paystack-payment-initialization-using-php-laravel-backend-4pah</link>
      <guid>https://dev.to/nobleokechi/paystack-payment-initialization-using-php-laravel-backend-4pah</guid>
      <description>&lt;p&gt;Initializing paystack transaction from your backend is safer way of building a secured payment integration.&lt;/p&gt;

&lt;p&gt;For this content, I will be using postman for my testing. If you are new to postman, check my post on &lt;a href="https://dev.to/nobleokechi/how-to-setup-postman-with-laravel-project-521n"&gt;how to setup postman with laravel backend&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create a Route&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create a route on &lt;code&gt;api.php&lt;/code&gt; file with any preferred name.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Route::post('initialize_paystack', [PaystackController::class, 'initialize_paystack'])-&amp;gt;name('api.initialize_paystack');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Create a Controller&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For this solution, I have a controller called &lt;code&gt;PaystackController&lt;/code&gt; and a function inside the controller called &lt;code&gt;initialize_paystack&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;To initialize payment, see the code below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;private $initialize_url = "https://api.paystack.co/transaction/initialize";

public function initialize_paystack(Request $request)
    {
        // $amount = number_format($request-&amp;gt;amount,2);
        $fields = [
            'email' =&amp;gt; $request-&amp;gt;user()-&amp;gt;email,
            'amount' =&amp;gt; $request-&amp;gt;amount * 100,
        ];
        $fields_string = http_build_query($fields);
        //open connection
        $ch = curl_init();
        //set the url, number of POST vars, POST data

        curl_setopt($ch,CURLOPT_URL, $this-&amp;gt;initialize_url);
        curl_setopt($ch,CURLOPT_POST, true);
        curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        "Authorization: Bearer ".env('PAYSTACK_SECRET_KEY'),

        "Cache-Control: no-cache",

        ));

        //So that curl_exec returns the contents of the cURL; rather than echoing it

        curl_setopt($ch,CURLOPT_RETURNTRANSFER, true); 
        //execute post

        $result = curl_exec($ch);
        $response = json_decode($result);

        return json_encode([
                'data' =&amp;gt; $response,
                'metadata' =&amp;gt; [
                    'payment_for' =&amp;gt; 'token'
                ]
           ]);
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Send data from postman&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To trigger the initialization, I will send the &lt;code&gt;amount&lt;/code&gt; from postman which can also be sent from your frontend.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tWUf8j9o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/021ple6ymfwqn3gdon3f.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tWUf8j9o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/021ple6ymfwqn3gdon3f.PNG" alt="Image description" width="701" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Your response will return payment link, which you can use to make a payment or return back to the frontend.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"data": {
        "status": true,
        "message": "Authorization URL created",
        "data": {
            "authorization_url": "https://checkout.paystack.com/zbm34791mm5t9wk",
            "access_code": "zbm34791mm5t9wk",
            "reference": "dod8hghbhc"
        }
    },
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Drv78wjq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/17bpfq8xjxti97wl470s.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Drv78wjq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/17bpfq8xjxti97wl470s.PNG" alt="Image description" width="701" height="551"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The image above is response gotten after clicking the payment link.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to Setup Postman with Laravel Project</title>
      <dc:creator>Noble Okechi</dc:creator>
      <pubDate>Mon, 12 Sep 2022 13:00:12 +0000</pubDate>
      <link>https://dev.to/nobleokechi/how-to-setup-postman-with-laravel-project-521n</link>
      <guid>https://dev.to/nobleokechi/how-to-setup-postman-with-laravel-project-521n</guid>
      <description>&lt;p&gt;Postman is an API platform for developers to design, build, test and iterate their APIs. Often, postman has been an essential API tool for developers.&lt;/p&gt;

&lt;p&gt;As a Laravel developer, it is advisable you know how to work in postman while building your projects.&lt;/p&gt;

&lt;p&gt;In this content, I'm going to be listing simple clear steps on how to can communicate with your laravel project through postman.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Own a Postman Free Account&lt;/strong&gt;&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%2Fktstvqa078hy5ztdvzl3.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%2Fktstvqa078hy5ztdvzl3.PNG" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Create a free postman account by visiting &lt;a href="https://www.postman.com/" rel="noopener noreferrer"&gt;POSTMAN&lt;/a&gt; or click on &lt;a href="https://identity.getpostman.com/signup" rel="noopener noreferrer"&gt;signup for postman&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Create a Workspace and Collection&lt;/strong&gt;&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%2F5ugrsa6mywp39g4ojzy0.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%2F5ugrsa6mywp39g4ojzy0.PNG" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can choose any preferred name as your workspace name.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create Collection&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After you are done creating a workspace, it is advisable you create a Collection with any preferred name of your choose as indicated below.&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%2Fmv12yk61av17gtbf4bkf.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%2Fmv12yk61av17gtbf4bkf.PNG" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Download and Install Postman Agent&lt;/strong&gt;&lt;br&gt;
To download postman desktop agent, click &lt;a href="https://www.postman.com/downloads/postman-agent/" rel="noopener noreferrer"&gt;DOWNLOAD&lt;/a&gt;, after downloading, don't forget to install it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Working with Laravel&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you've already setup your laravel project, follow the codes blocks to setup and test your connection.&lt;/p&gt;

&lt;p&gt;Create a route on &lt;code&gt;route&lt;/code&gt; -&amp;gt; &lt;code&gt;api.php&lt;/code&gt; &lt;/p&gt;

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

Route::post('test_data', [TestController::class, 'test_data'])-&amp;gt;name('api.test_data');


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

&lt;/div&gt;

&lt;p&gt;Goto your controller and create a function according to your the name used in &lt;code&gt;api.php&lt;/code&gt; route.&lt;/p&gt;

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

 public function test_data(Request $request)
    {
        return $request;
    }


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

&lt;/div&gt;

&lt;p&gt;Next thing is to serve your project by running &lt;code&gt;php artisan serve&lt;/code&gt; on your terminal, copy the link and lets move to the next step.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Testing the Connection&lt;/strong&gt;&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%2Fj1zuutdn7o52du6tl5zu.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%2Fj1zuutdn7o52du6tl5zu.PNG" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Add a request by clicking the &lt;code&gt;add a request&lt;/code&gt; as shown on the image above.&lt;/p&gt;

&lt;p&gt;Now, you can now paste the copied link, after we served the project on terminal and click on "send".&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%2Fj890m4hlsm3lyx02pt4u.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%2Fj890m4hlsm3lyx02pt4u.PNG" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If it return and empty array [] for you, it means you got it right.&lt;/p&gt;

&lt;p&gt;We can decide to send a extra parameter as request and return the response from you controller.&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%2Fw0rqd9oyypou3n7139ot.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%2Fw0rqd9oyypou3n7139ot.PNG" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you got similar results as mine on the screenshot above, congratulation.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to clone and setup Laravel project from GitHub</title>
      <dc:creator>Noble Okechi</dc:creator>
      <pubDate>Wed, 07 Sep 2022 18:13:25 +0000</pubDate>
      <link>https://dev.to/nobleokechi/how-to-clone-and-setup-laravel-project-from-github-3oe6</link>
      <guid>https://dev.to/nobleokechi/how-to-clone-and-setup-laravel-project-from-github-3oe6</guid>
      <description>&lt;p&gt;Knowing how to clone and setup your Laravel project from GitHub is one of the most important thing you can know as a software developer. It gives you the ability to have access to millions of open source laravel projects out there.&lt;/p&gt;

&lt;p&gt;In this content, I will be dropping a clear steps on how to clone laravel projects from github.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Locate the Repository&lt;/strong&gt;&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%2Fkr100hluza5f2ujcd74p.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%2Fkr100hluza5f2ujcd74p.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you already have a Laravel project you want to clone before now, it is advisable you copy the repository link as directed on the snapshot above.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Move to Visual Studio Code Editor&lt;/strong&gt;&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%2F2mhwit2poumk60qbent4.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%2F2mhwit2poumk60qbent4.PNG" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On VS Code Editor, go to &lt;code&gt;Source Control Tab&lt;/code&gt; or use &lt;code&gt;Ctrl+Shift+G&lt;/code&gt; to locate the control source tab as shown on the image above. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Clone Repository&lt;/strong&gt;&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%2Flouxzm7kfbuqo4s6xxn9.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%2Flouxzm7kfbuqo4s6xxn9.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on &lt;code&gt;Clone Repository&lt;/code&gt;, then enter the repository link copied and click on clone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Select Local Directory&lt;/strong&gt;&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%2F7wekgyhsnb3m2mzv3jtd.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%2F7wekgyhsnb3m2mzv3jtd.PNG" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After Step 3, the computer automatically promote you to select the local directory to clone the Laravel Project into.&lt;/p&gt;

&lt;p&gt;For me, I'm cloning the project into my &lt;code&gt;htdocs&lt;/code&gt; because I'm using XAMPP Server.&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%2Fznqlv776ayxqahjybd04.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%2Fznqlv776ayxqahjybd04.PNG" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At this point, your project is now cloning.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Open Cloned File&lt;/strong&gt;&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%2Fpoqsvqwz9koplu6hep58.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%2Fpoqsvqwz9koplu6hep58.PNG" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After our project has successfully been cloned, we can now go ahead to open it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 6&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Setting Up Project&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Laravel projects requires extra setups before it can run on your local computers.&lt;/p&gt;

&lt;p&gt;First, we are going to install Node Module and Vendor files.&lt;/p&gt;

&lt;p&gt;To install node module run &lt;code&gt;npm install&lt;/code&gt; on your VS Code Terminal and wait for it to complete.&lt;/p&gt;

&lt;p&gt;To install your Vendor file run &lt;code&gt;composer install&lt;/code&gt; on your VS Code Terminal and wait for it to complete.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 7&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Setup .env file&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To setup your &lt;code&gt;.env&lt;/code&gt;, kindly duplicate your &lt;code&gt;.env.example&lt;/code&gt; file and rename the duplicated file to &lt;code&gt;.env&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 8&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Setup Database&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For this content, I'm using &lt;code&gt;PHP MyAdmin Database&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;On your &lt;code&gt;.env&lt;/code&gt; file, locate this block of code below.&lt;/p&gt;

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

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=subnetweb
DB_USERNAME=root
DB_PASSWORD=


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

&lt;/div&gt;

&lt;p&gt;The block of code above represents your Database connection and &lt;code&gt;subnetweb&lt;/code&gt; is my database name, which you can create your database name to be something else.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 9&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Commands&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To finalize this everything, run the following commands on your terminal.&lt;/p&gt;

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

npm run dev

php artisan key:generate

php artisan migrate

php artisan server


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

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Step 10&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you finished step 1 - 10 successfully, congratulation!!! you have just cloned your first Laravel Project from GitHub.&lt;/p&gt;

&lt;p&gt;Click &lt;a href="https://www.youtube.com/watch?v=w261-WZ2WSA" rel="noopener noreferrer"&gt;here&lt;/a&gt; to follow my youtube tutorial on this content.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to Publish Project to GitHub</title>
      <dc:creator>Noble Okechi</dc:creator>
      <pubDate>Fri, 02 Sep 2022 23:12:39 +0000</pubDate>
      <link>https://dev.to/nobleokechi/how-to-publish-project-to-github-4jh4</link>
      <guid>https://dev.to/nobleokechi/how-to-publish-project-to-github-4jh4</guid>
      <description>&lt;p&gt;Having your project stored on GitHub is sweetest and easiest way to backup your project for future purpose.&lt;/p&gt;

&lt;p&gt;In this content, I will be reviewing different methods of publishing projects to GitHub.&lt;/p&gt;

&lt;p&gt;Before we start, we assume you already have created a GitHub Account, but if you don’t, kindly click &lt;a href="https://dev.to/nobleokechi/how-to-create-a-github-account-11ec"&gt;here&lt;/a&gt; to see how to create a fresh GitHub Account.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Method 1: The Create and Upload Method&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is the method I recommend if you are just trying to backup any project or documented files in GitHub, also this method is best recommended to beginners.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PPqkuer9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fbrt5fcy3pusbmbqe5ik.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PPqkuer9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fbrt5fcy3pusbmbqe5ik.PNG" alt="Image description" width="880" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you are under your Repositories Tab, you should be having a similar screen just like mine above.&lt;/p&gt;

&lt;p&gt;Click on the New green button as directed on the snapshot above to start the process.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--usBLfdQg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5gzrw1f4d3wrg37vnlsx.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--usBLfdQg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5gzrw1f4d3wrg37vnlsx.PNG" alt="Image description" width="880" height="525"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Choose a preferred repository name to suit your project, but for this content, we’ll be using &lt;code&gt;testproject&lt;/code&gt; as our repository name.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bAw4jVQW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bncv716p6o06jdj14aej.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bAw4jVQW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bncv716p6o06jdj14aej.PNG" alt="Image description" width="880" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Complete this process by clicking Create repository button as demonstrated on the snapshot above.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_c16YfVT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fzct6jszp037r1gpto88.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_c16YfVT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fzct6jszp037r1gpto88.PNG" alt="Image description" width="880" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once your repository has been created successfully according to to Step 2, you should have the above snapshot on your screen.&lt;/p&gt;

&lt;p&gt;Click on “uploading an existing file” to continue the process.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mhczwFVc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3wzci0cwqocn1w3rg9l3.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mhczwFVc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3wzci0cwqocn1w3rg9l3.PNG" alt="Image description" width="880" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Drag your Project and drop them or choose your files as demonstrated on the snapshot above.&lt;/p&gt;

&lt;p&gt;You are free to add statement as commit and lastly, click on commit changes button to complete this method.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Method 2: Publishing from Visual Studio Code Editor&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is the best method I recommend for every software developer.&lt;/p&gt;

&lt;p&gt;To start the process, make sure you have written at least “a line of code” in your project and also sign in your GitHub account your VS Code Editor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YFdHrCwM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tz1o4304e7qqiwog3ikt.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YFdHrCwM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tz1o4304e7qqiwog3ikt.PNG" alt="Image description" width="482" height="168"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To Sign In, click the above icon on your Visual Studio Code Editor&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--G4_VaVY2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ysogemq6kks262ug9av4.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--G4_VaVY2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ysogemq6kks262ug9av4.PNG" alt="Image description" width="767" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on “Publish to GitHub” button to continue.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cQHXwu12--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hxqj94g8qetbr0uereax.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cQHXwu12--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hxqj94g8qetbr0uereax.PNG" alt="Image description" width="716" height="130"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select your repository visibility by clicking on it.&lt;/p&gt;

&lt;p&gt;Private: Anyone on the internet can see this repository. You choose who can commit.&lt;/p&gt;

&lt;p&gt;Public: You choose who can see and commit to this repository.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nl_sVTvn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/htv08fpuub3xj7wdsi66.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nl_sVTvn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/htv08fpuub3xj7wdsi66.PNG" alt="Image description" width="553" height="159"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Your project is been published to GitHub and creating its first commit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wgDOlE1w--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uq0e1u6vorjqqx1d7se1.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wgDOlE1w--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uq0e1u6vorjqqx1d7se1.PNG" alt="Image description" width="523" height="198"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This what you see once your project has published successfully.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UYvS24iS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gcvezkgzkpq4uk15wd9s.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UYvS24iS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gcvezkgzkpq4uk15wd9s.PNG" alt="Image description" width="880" height="354"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can now check our GitHub Repositories to know if the project really completed.&lt;/p&gt;

&lt;p&gt;Bravos!!! our project completed successfully.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
