Normalized Products output

This commit is contained in:
Belen Curcio 2021-01-07 11:01:47 -03:00
parent 7faea49da8
commit f7956f8d01

View File

@ -10,61 +10,45 @@ import getAllProducts from '@framework/api/operations/get-all-products'
import getSiteInfo from '@framework/api/operations/get-site-info' import getSiteInfo from '@framework/api/operations/get-site-info'
import getAllPages from '@framework/api/operations/get-all-pages' import getAllPages from '@framework/api/operations/get-all-pages'
// Outputs from providers should already be normalized
// TODO (bc) move this to the provider
function normalize(arr: any[]) {
// Normalizes products arr response and flattens node edges
return arr.map(
({
node: { entityId: id, images, variants, productOptions, ...rest },
}) => ({
id,
images: images.edges,
variants: variants.edges,
productOptions: productOptions.edges,
...rest,
})
)
}
export async function getStaticProps({ export async function getStaticProps({
preview, preview,
locale, locale,
}: GetStaticPropsContext) { }: GetStaticPropsContext) {
const config = getConfig({ locale }) const config = getConfig({ locale })
// Get Featured Products const { products: rawProducts } = await getAllProducts({
const { products: featuredProducts } = await getAllProducts({ variables: { first: 12 },
variables: { field: 'featuredProducts', first: 6 },
config, config,
preview, preview,
}) })
// Get Best Selling Products const products = normalize(rawProducts)
const { products: bestSellingProducts } = await getAllProducts({
variables: { field: 'bestSellingProducts', first: 6 },
config,
preview,
})
// Get Best Newest Products console.log(products)
const { products: newestProducts } = await getAllProducts({
variables: { field: 'newestProducts', first: 12 },
config,
preview,
})
const { categories, brands } = await getSiteInfo({ config, preview }) const { categories, brands } = await getSiteInfo({ config, preview })
const { pages } = await getAllPages({ config, preview }) const { pages } = await getAllPages({ config, preview })
// These are the products that are going to be displayed in the landing.
// We prefer to do the computation at buildtime/servertime
const { featured, bestSelling } = (() => {
// Create a copy of products that we can mutate
const products = [...newestProducts]
// If the lists of featured and best selling products don't have enough
// products, then fill them with products from the products list, this
// is useful for new commerce sites that don't have a lot of products
return {
featured: rangeMap(6, (i) => featuredProducts[i] ?? products.shift())
.filter(nonNullable)
.sort((a, b) => a.node.prices.price.value - b.node.prices.price.value)
.reverse(),
bestSelling: rangeMap(
6,
(i) => bestSellingProducts[i] ?? products.shift()
).filter(nonNullable),
}
})()
return { return {
props: { props: {
featured, products,
bestSelling,
newestProducts,
categories, categories,
brands, brands,
pages, pages,
@ -73,22 +57,18 @@ export async function getStaticProps({
} }
} }
const nonNullable = (v: any) => v
export default function Home({ export default function Home({
featured, products,
bestSelling,
brands, brands,
categories, categories,
newestProducts,
}: InferGetStaticPropsType<typeof getStaticProps>) { }: InferGetStaticPropsType<typeof getStaticProps>) {
return ( return (
<div> <div>
<Grid> <Grid>
{featured.slice(0, 3).map(({ node }, i) => ( {products.slice(0, 3).map(({ p }, i) => (
<ProductCard <ProductCard
key={node.path} key={p.id}
product={node} product={p}
imgProps={{ imgProps={{
width: i === 0 ? 1080 : 540, width: i === 0 ? 1080 : 540,
height: i === 0 ? 1080 : 540, height: i === 0 ? 1080 : 540,
@ -96,7 +76,7 @@ export default function Home({
/> />
))} ))}
</Grid> </Grid>
<Marquee variant="secondary"> {/* <Marquee variant="secondary">
{bestSelling.slice(3, 6).map(({ node }) => ( {bestSelling.slice(3, 6).map(({ node }) => (
<ProductCard <ProductCard
key={node.path} key={node.path}
@ -143,12 +123,12 @@ export default function Home({
}} }}
/> />
))} ))}
</Marquee> </Marquee> */}
<HomeAllProductsGrid {/* <HomeAllProductsGrid
newestProducts={newestProducts} newestProducts={newestProducts}
categories={categories} categories={categories}
brands={brands} brands={brands}
/> /> */}
</div> </div>
) )
} }