add product to cart

This commit is contained in:
DatNguyen
2021-10-06 08:35:55 +07:00
9 changed files with 103 additions and 198 deletions

View File

@@ -1,3 +1,4 @@
import { CurrencyCode } from './../../vendure/schema.d';
import { FacetValueFilterInput, LogicalOperator, SearchResultSortParameter } from "@framework/schema" import { FacetValueFilterInput, LogicalOperator, SearchResultSortParameter } from "@framework/schema"
export type ProductImage = { export type ProductImage = {
@@ -46,6 +47,21 @@ export type Product = {
options: ProductOption[] options: ProductOption[]
} }
export type ProductCard = {
id: string
name: string
slug?: string
imageSrc: string
price: number
currencyCode: CurrencyCode
oldPrice?: number,
discount?: number
weight?: number
// TODO: collection
category?: string,
isNotSell?: boolean
}
export type SearchProductsBody = { export type SearchProductsBody = {
search?: string search?: string
categoryId?: string | number categoryId?: string | number

View File

@@ -1,24 +1,23 @@
import { Product } from '@commerce/types/product' import { Product, ProductCard } from '@commerce/types/product'
import { Cart } from '@commerce/types/cart' import { Cart } from '@commerce/types/cart'
import { CartFragment, SearchResultFragment } from '../schema' import { CartFragment, SearchResultFragment } from '../schema'
export function normalizeSearchResult(item: SearchResultFragment): Product { export function normalizeSearchResult(item: SearchResultFragment): ProductCard {
const imageUrl = item.productAsset?.preview ? item.productAsset?.preview + '?w=800&mode=crop' : ''
return { return {
id: item.productId, id: item.productId,
name: item.productName, name: item.productName,
description: item.description,
slug: item.slug, slug: item.slug,
path: item.slug, imageSrc: item.productAsset?.preview ? item.productAsset?.preview + '?w=800&mode=crop' : '',
images: imageUrl ? [{ url: imageUrl }] : [], price: (item.priceWithTax as any).min / 100,
price: { currencyCode: item.currencyCode,
// TODO: check price
value: (item.priceWithTax as any).min / 100, // TODO:
currencyCode: item.currencyCode, // oldPrice: item.price
}, // discount
// TODO: check product option // isNotSell
options: [], // weight
sku: item.sku, // category
} }
} }

View File

@@ -1,27 +1,29 @@
import { ProductCard } from '@commerce/types/product';
import { ProductVariables } from '@framework/api/operations/get-all-products'; import { ProductVariables } from '@framework/api/operations/get-all-products';
import { Facet, Product } from '@framework/schema'; import { Facet, Product } from '@framework/schema';
import commerce from '@lib/api/commerce'; import commerce from '@lib/api/commerce';
import { ifError } from 'assert'; import { ifError } from 'assert';
import { GetStaticPropsContext } from 'next'; import { GetStaticPropsContext } from 'next';
import { Layout } from 'src/components/common'; import { Layout } from 'src/components/common';
import { FeaturedProductsCarousel, HomeBanner, HomeCategories, HomeCollection, HomeCTA, HomeFeature, HomeRecipe, HomeSubscribe, HomeVideo } from 'src/components/modules/home'; import { FeaturedProductsCarousel, FreshProducts, HomeBanner, HomeCategories, HomeCollection, HomeCTA, HomeFeature, HomeRecipe, HomeSubscribe, HomeVideo } from 'src/components/modules/home';
import HomeSpice from 'src/components/modules/home/HomeSpice/HomeSpice'; import HomeSpice from 'src/components/modules/home/HomeSpice/HomeSpice';
import { FACET } from 'src/utils/constanst.utils'; import { FACET } from 'src/utils/constanst.utils';
import { getAllFeaturedFacetId, getFacetIdByName, getFreshProductFacetId } from 'src/utils/funtion.utils'; import { getAllFeaturedFacetId, getFacetIdByName, getFreshProductFacetId } from 'src/utils/funtion.utils';
interface Props { interface Props {
veggie: Product[], veggie: ProductCard[],
facets:Facet[] facets:Facet[]
freshProducts: ProductCard[],
featuredProducts: ProductCard[],
} }
export default function Home({ veggie, facets }: Props) { export default function Home({ freshProducts, featuredProducts, veggie }: Props) {
// console.log("total: ", freshProducts.length, featuredProducts.length)
console.log("rs: ", veggie)
return ( return (
<> <>
<HomeBanner /> <HomeBanner />
<HomeFeature /> <HomeFeature />
<HomeCategories /> <HomeCategories />
<HomeCollection /> <FreshProducts data={freshProducts}/>
<HomeCollection data = {veggie}/>
<HomeVideo /> <HomeVideo />
<HomeSpice /> <HomeSpice />
<FeaturedProductsCarousel /> <FeaturedProductsCarousel />
@@ -49,41 +51,45 @@ export async function getStaticProps({
}) })
const freshProductvariables: ProductVariables = {} const freshProductvariables: ProductVariables = {}
// const freshFacetId = getFreshProductFacetId(facets) const freshFacetId = getFreshProductFacetId(facets)
const veggieId = getFacetIdByName(facets,FACET.CATEGORY.PARENT_NAME,FACET.CATEGORY.VEGGIE) if (freshFacetId) {
console.log("veggieId",veggieId) freshProductvariables.facetValueIds = [freshFacetId]
console.log("facets",facets)
if (veggieId) {
freshProductvariables.facetValueIds = [veggieId]
} }
// if (freshFacetId) {
// freshProductvariables.facetValueIds = [freshFacetId]
// }
const freshProductsPromise = commerce.getAllProducts({ const freshProductsPromise = commerce.getAllProducts({
variables: freshProductvariables, variables: freshProductvariables,
config, config,
preview, preview,
}) })
// const allFeaturedFacetId = getAllFeaturedFacetId(facets) const veggieProductvariables: ProductVariables = {}
// const featuredProductsPromise = commerce.getAllProducts({ const veggieId = getFacetIdByName(facets,FACET.CATEGORY.PARENT_NAME,FACET.CATEGORY.VEGGIE)
// variables: { if (veggieId) {
// facetValueIds: allFeaturedFacetId veggieProductvariables.facetValueIds = [veggieId]
// }, }
// config, const veggieProductsPromise = commerce.getAllProducts({
// preview, variables: veggieProductvariables,
// }) config,
preview,
})
const allFeaturedFacetId = getAllFeaturedFacetId(facets)
const featuredProductsPromise = commerce.getAllProducts({
variables: {
facetValueIds: allFeaturedFacetId
},
config,
preview,
})
try { try {
const rs = await Promise.all([freshProductsPromise]) const rs = await Promise.all([veggieProductsPromise,featuredProductsPromise,freshProductsPromise])
// const rs = await Promise.all([freshProductsPromise, featuredProductsPromise])
return { return {
props: { props: {
veggie: rs[0].products, veggie: veggieId ? rs[0].products : [],
// featuredProducts: rs[1].products featuredProducts: rs[1].products,
facets freshProducts: freshFacetId ? rs[2].products : [],
}, },
revalidate: 60, revalidate: 60,
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

@@ -1,7 +1,7 @@
import React from 'react' import React from 'react'
import s from './ImgWithLink.module.scss' import s from './ImgWithLink.module.scss'
import Image from 'next/image' import Image from 'next/image'
import { BLUR_DATA_IMG } from 'src/utils/constanst.utils' import { BLUR_DATA_IMG, DEFAULT_IMG } from 'src/utils/constanst.utils'
export interface ImgWithLinkProps { export interface ImgWithLinkProps {
src: string, src: string,
@@ -12,7 +12,7 @@ export interface ImgWithLinkProps {
const ImgWithLink = ({ src, alt, blurDataURL = BLUR_DATA_IMG }: ImgWithLinkProps) => { const ImgWithLink = ({ src, alt, blurDataURL = BLUR_DATA_IMG }: ImgWithLinkProps) => {
return ( return (
<div className={s.imgWithLink}> <div className={s.imgWithLink}>
<Image src={src} alt={alt} <Image src={src || DEFAULT_IMG.src} alt={alt}
layout="fill" layout="fill"
className={s.imgWithLink} className={s.imgWithLink}
placeholder="blur" placeholder="blur"

View File

@@ -1,8 +1,8 @@
import { ProductCard } from '@commerce/types/product'
import Link from 'next/link' import Link from 'next/link'
import React from 'react' import React from 'react'
import { IconBuy } from 'src/components/icons' import { IconBuy } from 'src/components/icons'
import { ROUTE } from 'src/utils/constanst.utils' import { ROUTE } from 'src/utils/constanst.utils'
import { ProductProps } from 'src/utils/types.utils'
import { ImgWithLink } from '..' import { ImgWithLink } from '..'
import ButtonCommon from '../ButtonCommon/ButtonCommon' import ButtonCommon from '../ButtonCommon/ButtonCommon'
import ButtonIconBuy from '../ButtonIconBuy/ButtonIconBuy' import ButtonIconBuy from '../ButtonIconBuy/ButtonIconBuy'
@@ -11,16 +11,18 @@ import LabelCommon from '../LabelCommon/LabelCommon'
import s from './ProductCard.module.scss' import s from './ProductCard.module.scss'
import ProductNotSell from './ProductNotSell/ProductNotSell' import ProductNotSell from './ProductNotSell/ProductNotSell'
export interface ProductCardProps extends ProductProps { export interface ProductCardProps extends ProductCard {
buttonText?: string buttonText?: string
isSingleButton?: boolean, isSingleButton?: boolean,
} }
const ProductCard = ({ const ProductCardComponent = ({
category, category,
name, name,
slug,
weight, weight,
price, price,
currencyCode,
buttonText = 'Buy Now', buttonText = 'Buy Now',
imageSrc, imageSrc,
isNotSell, isNotSell,
@@ -35,24 +37,31 @@ const ProductCard = ({
return ( return (
<div className={s.productCardWarpper}> <div className={s.productCardWarpper}>
<div className={s.cardTop}> <div className={s.cardTop}>
<Link href={`${ROUTE.PRODUCT_DETAIL}/test`}> <Link href={`${ROUTE.PRODUCT_DETAIL}/${slug}`}>
<div className={s.productImage}> <a>
<ImgWithLink src={imageSrc} alt={name}/> <div className={s.productImage}>
</div> <ImgWithLink src={imageSrc} alt={name}/>
</div>
</a>
</Link> </Link>
{
category &&
<div className={s.productLabel}> <div className={s.productLabel}>
<LabelCommon shape="half">{category}</LabelCommon> <LabelCommon shape="half">{category}</LabelCommon>
</div> </div>
}
</div> </div>
<div className={s.cardMid}> <div className={s.cardMid}>
<div className={s.cardMidTop}> <div className={s.cardMidTop}>
<Link href={`${ROUTE.PRODUCT_DETAIL}/test`}> <Link href={`${ROUTE.PRODUCT_DETAIL}/${slug}`}>
<div className={s.productname}>{name} </div> <a>
<div className={s.productname}>{name} </div>
</a>
</Link> </Link>
<div className={s.productWeight}>{weight}</div> <div className={s.productWeight}>{weight}</div>
</div> </div>
<div className={s.cardMidBot}> <div className={s.cardMidBot}>
<div className={s.productPrice}>{price}</div> <div className={s.productPrice}>{price} {currencyCode}</div>
<div className={s.wishList}> <div className={s.wishList}>
<ItemWishList /> <ItemWishList />
</div> </div>
@@ -80,4 +89,4 @@ const ProductCard = ({
) )
} }
export default ProductCard export default ProductCardComponent

View File

@@ -1,101 +1,15 @@
import { ProductCard } from '@commerce/types/product'
import { Product } from '@framework/schema' import { Product } from '@framework/schema'
import React from 'react' import React from 'react'
import { CollectionCarcousel } from '..' import { CollectionCarcousel } from '..'
import image5 from '../../../../../public/assets/images/image5.png'
import image6 from '../../../../../public/assets/images/image6.png'
import image7 from '../../../../../public/assets/images/image7.png'
import image8 from '../../../../../public/assets/images/image8.png'
interface FreshProductsProps { interface FreshProductsProps {
data: Product[] data: ProductCard[]
} }
const dataTest = [
{
name: 'Tomato',
weight: '250g',
category: 'VEGGIE',
price: 'Rp 27.500',
imageSrc: image5.src,
},
{
name: 'Cucumber',
weight: '250g',
category: 'VEGGIE',
price: 'Rp 27.500',
imageSrc: image6.src,
},
{
name: 'Carrot',
weight: '250g',
category: 'VEGGIE',
price: 'Rp 27.500',
imageSrc: image7.src,
},
{
name: 'Salad',
weight: '250g',
category: 'VEGGIE',
price: 'Rp 27.500',
imageSrc: image8.src,
},
{
name: 'Tomato',
weight: '250g',
category: 'VEGGIE',
price: 'Rp 27.500',
imageSrc: image5.src,
},
{
name: 'Cucumber',
weight: '250g',
category: 'VEGGIE',
price: 'Rp 27.500',
imageSrc: image6.src,
},
{
name: 'Tomato',
weight: '250g',
category: 'VEGGIE',
price: 'Rp 27.500',
imageSrc: image5.src,
},
{
name: 'Cucumber',
weight: '250g',
category: 'VEGGIE',
price: 'Rp 27.500',
imageSrc: image6.src,
},
{
name: 'Carrot',
weight: '250g',
category: 'VEGGIE',
price: 'Rp 27.500',
imageSrc: image7.src,
},
{
name: 'Salad',
weight: '250g',
category: 'VEGGIE',
price: 'Rp 27.500',
imageSrc: image8.src,
},
{
name: 'Tomato',
weight: '250g',
category: 'VEGGIE',
price: 'Rp 27.500',
imageSrc: image5.src,
},
{
name: 'Cucumber',
weight: '250g',
category: 'VEGGIE',
price: 'Rp 27.500',
imageSrc: image6.src,
},
]
const FreshProducts = ({data}: FreshProductsProps) => { const FreshProducts = ({ data }: FreshProductsProps) => {
if (data.length === 0) {
return null
}
return ( return (
<div className="w-full"> <div className="w-full">
<CollectionCarcousel <CollectionCarcousel
@@ -106,41 +20,6 @@ const FreshProducts = ({data}: FreshProductsProps) => {
subtitle="Last call! Shop deep deals on 100+ bulk picks while you can." subtitle="Last call! Shop deep deals on 100+ bulk picks while you can."
category={"veggie"} category={"veggie"}
/> />
<CollectionCarcousel
data={dataTest}
itemKey="product-2"
title="VEGGIE"
subtitle="Last call! Shop deep deals on 100+ bulk picks while you can."
category={"veggie"}
/>
<CollectionCarcousel
data={dataTest}
itemKey="product-3"
title="VEGGIE"
subtitle="Last call! Shop deep deals on 100+ bulk picks while you can."
category={"veggie"}
/>
<CollectionCarcousel
data={dataTest}
itemKey="product-4"
title="VEGGIE"
subtitle="Last call! Shop deep deals on 100+ bulk picks while you can."
category={"veggie"}
/>
<CollectionCarcousel
data={dataTest}
itemKey="product-5"
title="VEGGIE"
subtitle="Last call! Shop deep deals on 100+ bulk picks while you can."
category={"veggie"}
/>
<CollectionCarcousel
data={dataTest}
itemKey="product-6"
title="VEGGIE"
subtitle="Last call! Shop deep deals on 100+ bulk picks while you can."
category={"veggie"}
/>
</div> </div>
) )
} }

View File

@@ -1,10 +1,13 @@
import React from 'react' import React from 'react'
import { ProductCard } from '@commerce/types/product'
import { CollectionCarcousel } from '..' import { CollectionCarcousel } from '..'
import image5 from '../../../../../public/assets/images/image5.png' import image5 from '../../../../../public/assets/images/image5.png'
import image6 from '../../../../../public/assets/images/image6.png' import image6 from '../../../../../public/assets/images/image6.png'
import image7 from '../../../../../public/assets/images/image7.png' import image7 from '../../../../../public/assets/images/image7.png'
import image8 from '../../../../../public/assets/images/image8.png' import image8 from '../../../../../public/assets/images/image8.png'
interface HomeCollectionProps {} interface HomeCollectionProps {
data: ProductCard[]
}
const dataTest = [ const dataTest = [
{ {
name: 'Tomato', name: 'Tomato',
@@ -92,47 +95,39 @@ const dataTest = [
}, },
] ]
const HomeCollection = (props: HomeCollectionProps) => { const HomeCollection = ({data}: HomeCollectionProps) => {
return ( return (
<div className="w-full"> <div className="w-full">
<CollectionCarcousel <CollectionCarcousel
type="highlight" data={data}
data={dataTest}
itemKey="product-1"
title="Fresh Products Today"
subtitle="Last call! Shop deep deals on 100+ bulk picks while you can."
category={"veggie"}
/>
<CollectionCarcousel
data={dataTest}
itemKey="product-2" itemKey="product-2"
title="VEGGIE" title="VEGGIE"
subtitle="Last call! Shop deep deals on 100+ bulk picks while you can." subtitle="Last call! Shop deep deals on 100+ bulk picks while you can."
category={"veggie"} category={"veggie"}
/> />
<CollectionCarcousel <CollectionCarcousel
data={dataTest} data={data}
itemKey="product-3" itemKey="product-3"
title="VEGGIE" title="VEGGIE"
subtitle="Last call! Shop deep deals on 100+ bulk picks while you can." subtitle="Last call! Shop deep deals on 100+ bulk picks while you can."
category={"veggie"} category={"veggie"}
/> />
<CollectionCarcousel <CollectionCarcousel
data={dataTest} data={data}
itemKey="product-4" itemKey="product-4"
title="VEGGIE" title="VEGGIE"
subtitle="Last call! Shop deep deals on 100+ bulk picks while you can." subtitle="Last call! Shop deep deals on 100+ bulk picks while you can."
category={"veggie"} category={"veggie"}
/> />
<CollectionCarcousel <CollectionCarcousel
data={dataTest} data={data}
itemKey="product-5" itemKey="product-5"
title="VEGGIE" title="VEGGIE"
subtitle="Last call! Shop deep deals on 100+ bulk picks while you can." subtitle="Last call! Shop deep deals on 100+ bulk picks while you can."
category={"veggie"} category={"veggie"}
/> />
<CollectionCarcousel <CollectionCarcousel
data={dataTest} data={data}
itemKey="product-6" itemKey="product-6"
title="VEGGIE" title="VEGGIE"
subtitle="Last call! Shop deep deals on 100+ bulk picks while you can." subtitle="Last call! Shop deep deals on 100+ bulk picks while you can."

View File

@@ -1,6 +1,7 @@
import { FacetConstant } from "./types.utils" import DefaultImg from '../../public/assets/images/default_img.jpg'
export const BLUR_DATA_IMG = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mN8fBIAApUBruKYvzsAAAAASUVORK5CYII=' export const BLUR_DATA_IMG = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mN8fBIAApUBruKYvzsAAAAASUVORK5CYII='
export const DEFAULT_IMG = DefaultImg
export const SOCIAL_LINKS = { export const SOCIAL_LINKS = {
FB: 'FB', FB: 'FB',