feat: create toggle product wishlist

This commit is contained in:
Quangnhankie
2021-10-11 09:59:46 +07:00
parent 391bba5d31
commit 279c20e1af
10 changed files with 118 additions and 19 deletions

View File

@@ -3198,15 +3198,23 @@ export type ActiveCustomerQuery = { __typename?: 'Query' } & {
activeCustomer?: Maybe< activeCustomer?: Maybe<
{ __typename?: 'Customer' } & Pick< { __typename?: 'Customer' } & Pick<
Customer, Customer,
FavoriteList,
'id' | 'firstName' | 'lastName' | 'emailAddress' | 'favorites' 'id' | 'firstName' | 'lastName' | 'emailAddress' | 'favorites'
>, >,
> >
} }
export type FavoriteList = { export type FavoriteList = PaginatedList & {
items: [Favorite!]! items: [Favorite!]!
totalItems: Int! totalItems: Int!
} }
type Favorite = Node & {
id: ID!
createdAt: DateTime!
updatedAt: DateTime!
product: Product
customer: Customer!
}
export type GetAllProductPathsQueryVariables = Exact<{ export type GetAllProductPathsQueryVariables = Exact<{
first?: Maybe<Scalars['Int']> first?: Maybe<Scalars['Int']>

View File

@@ -0,0 +1,9 @@
export const toggleWishlistMutation = /* GraphQL */ `
mutation toggleFavorite($productId:ID!){
toggleFavorite(productId:$productId){
items{
id
}
}
}
`

View File

@@ -1,3 +1,5 @@
import { searchResultFragment } from '../fragments/search-result-fragment'
export const activeCustomerQuery = /* GraphQL */ ` export const activeCustomerQuery = /* GraphQL */ `
query activeCustomer { query activeCustomer {
activeCustomer { activeCustomer {
@@ -9,6 +11,15 @@ export const activeCustomerQuery = /* GraphQL */ `
items{ items{
product{ product{
id id
name
slug
assets{
source
preview
}
variants{
price
}
} }
} }
} }

View File

@@ -2,7 +2,9 @@ import classNames from 'classnames'
import IconHeart from 'src/components/icons/IconHeart' import IconHeart from 'src/components/icons/IconHeart'
import React, { memo } from 'react' import React, { memo } from 'react'
import s from './ItemWishList.module.scss' import s from './ItemWishList.module.scss'
import { useToggleProductWishlist } from '../../../../src/components/hooks/product'
import { useMessage } from 'src/components/contexts'
import { LANGUAGE } from 'src/utils/language.utils'
interface Props { interface Props {
id:string, id:string,
isActive?: boolean, isActive?: boolean,
@@ -10,17 +12,28 @@ interface Props {
} }
const ItemWishList = memo(({id,isActive=false, onChange}:Props) => { const ItemWishList = memo(({id,isActive=false, onChange}:Props) => {
// function toggleFavorite(id:string):string|undefined{ const {onToggleProductWishlist} = useToggleProductWishlist();
// // alert(id); const { showMessageSuccess, showMessageError } = useMessage();
// return id;
// } function toggleWishlist(){
onToggleProductWishlist({productId:id},onSignupCallBack)
}
const onSignupCallBack = (isSuccess: boolean, message?: string) => {
if (isSuccess) {
// showMessageSuccess("Create account successfully. Please verify your email to login.", 15000)
} else {
showMessageError(message || LANGUAGE.MESSAGE.ERROR)
}
}
return( return(
<div className={classNames({ <div className={classNames({
[s.heartToggle]: true, [s.heartToggle]: true,
[s.isToggleOn]: isActive [s.isToggleOn]: isActive
})} })}
// onClick={toggleFavorite(id)}
onChange={onChange} onChange={onChange}
onClick={toggleWishlist}
> >
<IconHeart /> <IconHeart />
</div> </div>

View File

@@ -14,6 +14,7 @@ import ProductNotSell from './ProductNotSell/ProductNotSell'
export interface ProductCardProps extends ProductCard { export interface ProductCardProps extends ProductCard {
buttonText?: string buttonText?: string
isSingleButton?: boolean, isSingleButton?: boolean,
activeWishlist?:boolean
} }
const ProductCardComponent = ({ const ProductCardComponent = ({
@@ -28,6 +29,7 @@ const ProductCardComponent = ({
imageSrc, imageSrc,
isNotSell, isNotSell,
isSingleButton, isSingleButton,
activeWishlist
}: ProductCardProps) => { }: ProductCardProps) => {
if (isNotSell) { if (isNotSell) {
return <div className={`${s.productCardWarpper} ${s.notSell}`}> return <div className={`${s.productCardWarpper} ${s.notSell}`}>
@@ -65,7 +67,7 @@ const ProductCardComponent = ({
<div className={s.cardMidBot}> <div className={s.cardMidBot}>
<div className={s.productPrice}>{price} {currencyCode}</div> <div className={s.productPrice}>{price} {currencyCode}</div>
<div className={s.wishList}> <div className={s.wishList}>
<ItemWishList id={id}/> <ItemWishList isActive={activeWishlist} id={id}/>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -7,7 +7,6 @@ import { ButtonCommon, EmptyCommon } from '..'
import PaginationCommon from '../PaginationCommon/PaginationCommon' import PaginationCommon from '../PaginationCommon/PaginationCommon'
import ProductCard, { ProductCardProps } from '../ProductCard/ProductCard' import ProductCard, { ProductCardProps } from '../ProductCard/ProductCard'
import s from "./ProductList.module.scss" import s from "./ProductList.module.scss"
import { FavoriteList } from '@framework/schema'
interface ProductListProps { interface ProductListProps {
data: ProductCardProps[], data: ProductCardProps[],
total?: number, total?: number,
@@ -17,8 +16,8 @@ interface ProductListProps {
const ProductList = ({ data, total = data.length, defaultCurrentPage, onPageChange }: ProductListProps) => { const ProductList = ({ data, total = data.length, defaultCurrentPage, onPageChange }: ProductListProps) => {
const router = useRouter() const router = useRouter()
const {wishlist:FavoriteList } = useActiveCustomer(); const {wishlist } = useActiveCustomer();
const handlePageChange = (page: number) => { const handlePageChange = (page: number) => {
onPageChange && onPageChange(page) onPageChange && onPageChange(page)
} }
@@ -36,8 +35,8 @@ const ProductList = ({ data, total = data.length, defaultCurrentPage, onPageChan
<div className={s.list}> <div className={s.list}>
{ {
data.map((product, index) => { data.map((product, index) => {
let activeWishlist = wishlist?.findIndex((val:string) => val == product.id) !== -1;
return <ProductCard {...product} key={index} /> return <ProductCard activeWishlist={activeWishlist} {...product} key={index} />
}) })
} }
{ {

View File

@@ -1,14 +1,23 @@
import { ActiveCustomerQuery,FavoriteList } from '@framework/schema' import { ActiveCustomerQuery,Favorite } from '@framework/schema'
import { activeCustomerQuery } from '@framework/utils/queries/active-customer-query' import { activeCustomerQuery } from '@framework/utils/queries/active-customer-query'
import gglFetcher from 'src/utils/gglFetcher' import gglFetcher from 'src/utils/gglFetcher'
import useSWR from 'swr' import useSWR from 'swr'
const useActiveCustomer = () => { const useActiveCustomer = () => {
const { data, ...rest } = useSWR<ActiveCustomerQuery>([activeCustomerQuery], gglFetcher) const { data, ...rest } = useSWR<ActiveCustomerQuery>([activeCustomerQuery], gglFetcher)
console.log(data);
return { return {
customer: data?.activeCustomer, customer: data?.activeCustomer,
wishlist:data?.activeCustomer?.favorites, userInfo:{
...rest } firstName: data?.activeCustomer?.firstName,
lastName:data?.activeCustomer?.lastName,
email:data?.activeCustomer?.emailAddress,
phoneNumber: data?.activeCustomer?.phoneNumber,
address: data?.activeCustomer?.addresses?.[0]
},
wishlist: data?.activeCustomer?.favorites?.items.map((val:Favorite)=>val.product.id),
...rest
}
} }
export default useActiveCustomer export default useActiveCustomer

View File

@@ -1,3 +1,4 @@
export { default as useSearchProducts } from './useSearchProducts' export { default as useSearchProducts } from './useSearchProducts'
export { default as useToggleProductWishlist } from './useToggleProductWishlist'

View File

@@ -0,0 +1,44 @@
import { useState } from 'react'
import useActiveCustomer from '../auth/useActiveCustomer'
import { FavoriteList } from '@framework/schema'
import fetcher from 'src/utils/fetcher'
import { CommonError } from 'src/domains/interfaces/CommonError'
import { toggleWishlistMutation } from '@framework/utils/mutations/toggle-wishlist-mutation'
interface Props {
productId?:string
}
const useToggleProductWishlist = () => {
const [loading, setLoading] = useState(false)
const [error, setError] = useState<Error | null>(null)
const { mutate } = useActiveCustomer()
const onToggleProductWishlist = (
{ productId }:Props ,
fCallBack: (isSuccess: boolean, message?: string) => void
) => {
setError(null)
setLoading(true)
fetcher<FavoriteList>({
query: toggleWishlistMutation,
variables: {
productId
},
})
.then((data) => {
mutate()
fCallBack(true)
return data
})
.catch((error) => {
setError(error)
fCallBack(false, error.message)
})
.finally(() => setLoading(false))
}
return { loading, onToggleProductWishlist, error }
}
export default useToggleProductWishlist

View File

@@ -12,6 +12,7 @@ import EditInfoModal from './components/EditInfoModal/EditInfoModal'
import { PRODUCT_CART_DATA_TEST } from 'src/utils/demo-data'; import { PRODUCT_CART_DATA_TEST } from 'src/utils/demo-data';
import { ACCOUNT_TAB, QUERY_KEY } from "src/utils/constanst.utils" import { ACCOUNT_TAB, QUERY_KEY } from "src/utils/constanst.utils"
import { useRouter } from "next/router" import { useRouter } from "next/router"
import { useActiveCustomer } from 'src/components/hooks/auth'
const waiting = [ const waiting = [
{ {
@@ -82,6 +83,8 @@ const AccountPage = ({ defaultActiveContent="orders" } : AccountPageProps) => {
const router = useRouter() const router = useRouter()
const [activeTab, setActiveTab] = useState(defaultActiveContent==="info" ? 0 : defaultActiveContent==="orders" ? 1 : 2) const [activeTab, setActiveTab] = useState(defaultActiveContent==="info" ? 0 : defaultActiveContent==="orders" ? 1 : 2)
const [modalVisible, setModalVisible] = useState(false); const [modalVisible, setModalVisible] = useState(false);
// const { itemWishlist } = useActiveCustomer();
// console.log(itemWishlist)
useEffect(() => { useEffect(() => {
const query = router.query[QUERY_KEY.TAB] as string const query = router.query[QUERY_KEY.TAB] as string