Headless commerce and custom storefronts with Shopify APIs and SDKs
I currently have the following code to display the products in my Shopify store. This is in my Store.js file which simply grabs information from the Shopify store.
// @jsx jsx
import { jsx } from 'theme-ui'
import React from 'react';
import { StaticQuery, graphql } from 'gatsby';
import { ProductCard } from '../components/Product-card';
export const Store = () => {
return (
<StaticQuery
query={graphql`
{ allShopifyProduct {
nodes {
title
description
productType
variants {
image {
localFile {
childImageSharp {
fluid(maxHeight: 1600, maxWidth: 900, cropFocus: CENTER, fit: COVER) {
...GatsbyImageSharpFluid_withWebp
# srcSet
}
}
}
}
price
}
}
}
}
`}
render={data => (
<>
<div sx={{
mx: 'auto', maxWidth: '80vw', display: 'grid', padding: '40px',
gridGap: 4,
gridTemplateColumns: [
'auto',
'1fr 1fr 1fr 1fr'
], background: 'white'
}}>
{data.allShopifyProduct.nodes.map(product => (
<div>
<ProductCard key={product.id} product={product} />
</div>
))}
</div>
</>
)}
/>
)
};
Then I have this product card file that handles the frontend part using the information from the Store.js file:
// @jsx jsx
import { jsx } from 'theme-ui'
import React, { useContext, useEffect } from 'react';
import Image from 'gatsby-image';
const BuyButton = ({ variants }) => {
const price = variants[0].price;
// const formatted = new Intl.NumberFormat('en-US', price.currencyCode, { style: currency, currency: price.currencyCode }).format(price.amount);
return <button sx={{ position: 'absolute', width: '100%', color: 'white', background: 'black', borderRadius: '8px', border: 'none', padding: '13px', margin: 'auto', '&:hover': { bg: '#454C5F', boxShadow: '1px 1px 2px rgba(#fff, .2)', textDecoration: 'none', transition: 'all 250ms linear' } }}>{variants.length > 1 ? `Buy for ${`$` + price}` : `Buy for ${`$` + price}`} </button>
// if (variants.length > 1) {
// return <button>Buy for {variants[0].price}</button>
// }
}
export const ProductCard = ({ product }) => {
return (
<div sx={{
position: 'relative', background: 'white', border: '5px solid white', borderRadius: '15px', mb: '1rem'
}}>
<Image sx={{
maxWidth: '100%'
}} fluid={product.variants[0].image.localFile.childImageSharp.fluid} alt={product.title} />
<p sx={{ textAlign: 'center', fontSize: '20px', mt: '.2rem' }}>{product.productType}</p>
<h2 sx={{ mt: '.5rem', fontSize: '40px', textAlign: 'center' }}>{product.title}</h2>
<p sx={{ textAlign: 'center', fontSize: '25px', mt: '.2rem' }}>{product.description}</p>
<p sx={{ textAlign: 'center', fontSize: '25px', mt: '.2rem' }}>{product.price}</p>
<BuyButton variants={product.variants} />
</div >
)
}
export default ProductCard;
I can't seem to figure out what else I need to create a button that sends the user straight to the checkout. I guess I'm confused on how I can query for the checkout based on what I already have done. Do I have to create a new file or can I build on to what I already have? I don't have any context folder containing any information building a client or anything.
Learn these 5 things I had to learn the hard way with starting and running my own business
By Kitana Jan 27, 2023Would you love to unleash the unbridled power of the Google Shopping Channel into your sho...
By Gabe Jan 6, 2023How can you turn a hobby into a career? That’s what Emmanuel did while working as a wa...
By Skye Dec 30, 2022