Merge branch 'release-stable' of github.com:KieIO/grocery-vercel-commerce into feature/m2-add-product-to-cart

This commit is contained in:
DatNguyen
2021-10-08 17:19:14 +07:00
85 changed files with 1710 additions and 710 deletions

View File

@@ -1,72 +1,84 @@
import DefaultImg from '../../public/assets/images/default_img.jpg'
export const REVALIDATE_TIME = 60
export const MAX_PRODUCT_CAROUSEL = 20
export const BLUR_DATA_IMG = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mN8fBIAApUBruKYvzsAAAAASUVORK5CYII='
export const DEFAULT_IMG = DefaultImg
export const SOCIAL_LINKS = {
FB: 'FB',
TWITTER: 'TWITTER',
YOUTUBE: 'YOUTUBE',
IG: 'IG',
FB: 'FB',
TWITTER: 'TWITTER',
YOUTUBE: 'YOUTUBE',
IG: 'IG',
}
export const ROUTE = {
HOME: '/',
ABOUT: '/about',
ACCOUNT: '/account',
HOME: '/',
ABOUT: '/about',
ACCOUNT: '/account',
PRODUCTS: '/products',
PRODUCT_DETAIL: '/product',
BLOGS: '/blogs',
BLOG_DETAIL: '/blog',
PRODUCTS: '/products',
PRODUCT_DETAIL: '/product',
RECIPES: '/recipes',
RECIPE_DETAIL: '/recipe',
BLOGS: '/blogs',
BLOG_DETAIL: '/blog',
NOTIFICATION: '/notifications',
BUSSINESS: '/bussiness',
CONTACT: '/contact',
CHECKOUT: '/checkout',
FAQ: '/faq',
CUSTOMER_SERVICE: '/customer-service',
TERM_CONDITION: '/term-condition',
PRIVACY_POLICY: '/privacy-policy',
FORGOT_PASSWORD: '/forgot-password'
RECIPES: '/recipes',
RECIPE_DETAIL: '/recipe',
NOTIFICATION: '/notifications',
BUSSINESS: '/bussiness',
CONTACT: '/contact',
CHECKOUT: '/checkout',
FAQ: '/faq',
CUSTOMER_SERVICE: '/customer-service',
TERM_CONDITION: '/term-condition',
PRIVACY_POLICY: '/privacy-policy',
FORGOT_PASSWORD: '/forgot-password'
}
export const ACCOUNT_TAB = {
CUSTOMER_INFO: '',
ORDER: 'orders',
FAVOURITE: 'wishlist',
CUSTOMER_INFO: '',
ORDER: 'orders',
FAVOURITE: 'wishlist',
}
export const LOCAL_STORAGE_KEY = {
TOKEN: 'token'
}
export const QUERY_SPLIT_SEPERATOR = ','
export const QUERY_KEY = {
TAB: 'tab',
CATEGORY: 'category',
BRAND: 'brand',
FEATURED: 'feature',
SORTBY:'sortby',
RECIPES:'recipes'
TAB: 'tab',
CATEGORY: 'category',
BRAND: 'brand',
FEATURED: 'featured',
SORTBY: 'sortby',
RECIPES: 'recipes',
PAGE: 'page',
}
export const PRODUCT_SORT_OPTION_VALUE = {
NAME_ASC: 'name_asc',
NAME_DESC: 'name_desc',
PRICE_ASC: 'price_asc',
PRICE_DESC: 'price_desc',
}
export enum ProductFeature {
BestSellers = 'Best Sellers',
Sales = 'Sales',
NewItem = 'New Item',
Viewed = 'Viewed',
BestSellers = 'Best Sellers',
Sales = 'Sales',
NewItem = 'New Item',
Viewed = 'Viewed',
}
export const KEY = {
ENTER: 'Enter',
ENTER: 'Enter',
}
export const OPTION_ALL = 'all';
export const DEFAULT_PAGE_SIZE=20;
export const DEFAULT_PAGE_SIZE = 20;
export const CATEGORY = [
@@ -123,28 +135,55 @@ export const FACET = {
}
}
export const FEATURED = [
{
name: 'Best Sellers',
link: `${ROUTE.PRODUCTS}/?${QUERY_KEY.FEATURED}=best_sellers`,
},
{
name: 'Sales',
link: `${ROUTE.PRODUCTS}/?${QUERY_KEY.FEATURED}=sales`,
},
{
name: 'New Item',
link: `${ROUTE.PRODUCTS}/?${QUERY_KEY.FEATURED}=new_item`,
},
{
name: 'Viewed',
link: `${ROUTE.PRODUCTS}/?${QUERY_KEY.FEATURED}=viewed`,
},
]
export const DEFAULT_BLOG_PAGE_SIZE=6;
export const CODE_FACET_FEATURED = 'featured'
export const CODE_FACET_DISCOUNT = 'discount'
export const CODE_FACET_BRAND = 'brand'
export const CODE_FACET_FEATURED_VARIANT = {
FRESH: 'fresh',
}
export const FILTER_PAGE = [ROUTE.HOME,ROUTE.PRODUCTS]
export const OPTIONS_SORT_PRODUCT = [
{
name: 'By Name (A-Z)',
value: PRODUCT_SORT_OPTION_VALUE.NAME_ASC,
},
{
name: 'By Name (Z-A)',
value: PRODUCT_SORT_OPTION_VALUE.NAME_DESC,
},
{
name: 'Price (Low to High)',
value: PRODUCT_SORT_OPTION_VALUE.PRICE_ASC,
},
{
name: 'Price (High to Low)',
value: PRODUCT_SORT_OPTION_VALUE.PRICE_DESC,
},
];
export const FEATURED = [
{
name: 'Best Sellers',
link: `${ROUTE.PRODUCTS}/?${QUERY_KEY.FEATURED}=best_sellers`,
},
{
name: 'Sales',
link: `${ROUTE.PRODUCTS}/?${QUERY_KEY.FEATURED}=sales`,
},
{
name: 'New Item',
link: `${ROUTE.PRODUCTS}/?${QUERY_KEY.FEATURED}=new_item`,
},
{
name: 'Viewed',
link: `${ROUTE.PRODUCTS}/?${QUERY_KEY.FEATURED}=viewed`,
},
]
export const DEFAULT_BLOG_PAGE_SIZE = 6;
export const FILTER_PAGE = [ROUTE.HOME, ROUTE.PRODUCTS]
export const STATE_OPTIONS = [
{

View File

@@ -1,11 +1,60 @@
import { FacetValue } from './../../framework/vendure/schema.d';
import { Facet } from "@commerce/types/facet";
import { FACET } from "./constanst.utils";
import { Collection, FacetValue, SearchResultSortParameter } from './../../framework/vendure/schema.d';
import { CODE_FACET_DISCOUNT, CODE_FACET_FEATURED, CODE_FACET_FEATURED_VARIANT, FACET, PRODUCT_SORT_OPTION_VALUE } from "./constanst.utils";
import { PromiseWithKey, SortOrder } from "./types.utils";
export function isMobile() {
return window.innerWidth < 768
}
export function getPageFromQuery(pageQuery: string) {
let page = 0
try {
page = +pageQuery
if (isNaN(page)) {
page = 0
}
} catch (err) {
page = 0
}
return page
}
export function getProductSortParamFromQuery(query: string) {
let rs = {} as SearchResultSortParameter
switch (query) {
case PRODUCT_SORT_OPTION_VALUE.NAME_ASC:
rs = {
name: SortOrder.Asc
}
break;
case PRODUCT_SORT_OPTION_VALUE.NAME_DESC:
rs = {
name: SortOrder.Desc
}
break;
case PRODUCT_SORT_OPTION_VALUE.PRICE_ASC:
rs = {
price: SortOrder.Asc
}
break;
case PRODUCT_SORT_OPTION_VALUE.PRICE_DESC:
rs = {
price: SortOrder.Desc
}
break;
default:
break;
}
return rs
}
export function removeItem<T>(arr: Array<T>, value: T): Array<T> {
const index = arr.indexOf(value);
if (index > -1) {
@@ -14,9 +63,18 @@ export function removeItem<T>(arr: Array<T>, value: T): Array<T> {
return [...arr];
}
export function getFreshProductFacetId(facets: Facet[]) {
const featuredFacet = facets.find((item: Facet) => item.name === FACET.FEATURE.PARENT_NAME)
const freshFacetValue = featuredFacet?.values.find((item: FacetValue) => item.name === FACET.FEATURE.FRESH)
function findFacetByCode(code: string, facets?: Facet) {
return facets?.values.find((item: FacetValue) => item.code === code)
}
export function getFeaturedFacetId(facets: Facet[]) {
const featuredFacet = facets.find((item: Facet) => item.code === CODE_FACET_FEATURED)
return featuredFacet?.id
}
export function getFreshFacetId(facets: Facet[]) {
const featuredFacet = facets.find((item: Facet) => item.code === CODE_FACET_FEATURED)
const freshFacetValue = findFacetByCode(CODE_FACET_FEATURED_VARIANT.FRESH, featuredFacet)
return freshFacetValue?.id
}
@@ -31,6 +89,54 @@ export function getFacetIdByName(facets: Facet[], facetName: string, valueName:s
export function getAllFeaturedFacetId(facets: Facet[]) {
const featuredFacet = facets.find((item: Facet) => item.name === FACET.FEATURE.PARENT_NAME)
const rs = featuredFacet?.values.map((item: FacetValue) => item.id)
return rs || []
}
export function getAllFacetValueIdsByParentCode(facets: Facet[], code: string) {
const featuredFacet = facets.find((item: Facet) => item.code === code)
const rs = featuredFacet?.values.map((item: FacetValue) => item.id)
return rs || []
}
export function getAllFacetValuesForFeatuedProducts(facets: Facet[]) {
const facetsRs = facets.filter((item: Facet) => item.code === CODE_FACET_FEATURED || item.code === CODE_FACET_DISCOUNT)
let rs = [] as FacetValue[]
facetsRs.map((item: Facet) => {
rs = rs.concat(item.values)
return null
})
return rs
}
export function getFacetNamesFromIds(facets: FacetValue[], ids?: string[]): string {
if (!ids || ids?.length === 0) {
return ''
}
const facetItems = facets.filter((item: FacetValue) => ids.includes(item.id))
const names = facetItems.map((item: FacetValue) => item.name)
return names.join(", ")
}
export function getFacetIdsFromCodes(facets: FacetValue[], codes?: string[]): string[] {
if (!codes || codes?.length === 0) {
return []
}
const facetItems = facets.filter((item: FacetValue) => codes.includes(item.code))
const ids = facetItems.map((item: FacetValue) => item.id)
return ids
}
export const getCategoryNameFromCollectionId = (colelctions: Collection[], collectionId?: string ) => {
if (!collectionId) {
return ''
}
const collection = colelctions.find(item => item.id === collectionId)
return collection?.name || ''
}
export function getAllPromies(promies: PromiseWithKey[]) {
return promies.map(item => item.promise)
}

View File

@@ -1,4 +1,3 @@
import { SortOrder } from "@framework/schema";
export interface ProductProps {
category?: string
@@ -36,18 +35,23 @@ export interface BlogProps {
export interface CheckOutForm {
name?: string
email?:string
email?: string
address?: string
city?:string
state?:string
code?:number
phone?:number
method?:string
shipping_fee?:number
city?: string
state?: string
code?: number
phone?: number
method?: string
shipping_fee?: number
}
export type MouseAndTouchEvent = MouseEvent | TouchEvent
export enum SortOrder {
Asc = 'ASC',
Desc = 'DESC',
}
export type filterContextType = {
visible: boolean;
open: () => void;
@@ -61,4 +65,9 @@ export interface FacetMap extends StringMap{
}
export interface FacetConstant{
[key: string]: FacetMap;
}
}
export type PromiseWithKey = {
key: string
promise: PromiseLike<any>
keyResult?: string,
}