mirror of
https://github.com/vercel/commerce.git
synced 2025-05-18 07:26:59 +00:00
Cart Implementation
- Add to cart - Update cart - Delete cart - Remove cart item - Cart and cart item normalization
This commit is contained in:
parent
d785f3c0ef
commit
9d83146aff
@ -1,17 +1,30 @@
|
||||
import { useCallback } from 'react'
|
||||
|
||||
import useAddItem, { UseAddItem } from '@commerce/cart/use-add-item'
|
||||
import { MutationHook } from '@commerce/utils/types'
|
||||
import useCart from './use-cart'
|
||||
import epClient from '../utils/ep-client'
|
||||
import normalizeCart from '../utils/normalize-cart'
|
||||
|
||||
export default useAddItem as UseAddItem<typeof handler>
|
||||
export const handler: MutationHook<any> = {
|
||||
fetchOptions: {
|
||||
query: '',
|
||||
},
|
||||
async fetcher({ input, options, fetch }) {},
|
||||
useHook:
|
||||
({ fetch }) =>
|
||||
() => {
|
||||
return async function addItem() {
|
||||
return {}
|
||||
}
|
||||
},
|
||||
async fetcher({ input, options, fetch }) {
|
||||
return epClient.Cart().AddProduct(input.productId);
|
||||
},
|
||||
useHook: ({ fetch }) => () => {
|
||||
const { mutate } = useCart()
|
||||
|
||||
return useCallback(
|
||||
async function addItem(input) {
|
||||
const data = await fetch({ input })
|
||||
const cartData = normalizeCart(data, await epClient.Cart().Items());
|
||||
await mutate(cartData, true)
|
||||
return cartData
|
||||
},
|
||||
[fetch, mutate]
|
||||
)
|
||||
},
|
||||
}
|
@ -1,6 +1,8 @@
|
||||
import { useMemo } from 'react'
|
||||
import { SWRHook } from '@commerce/utils/types'
|
||||
import useCart, { UseCart } from '@commerce/cart/use-cart'
|
||||
import epClient from '../utils/ep-client'
|
||||
import normalizeCart from '../utils/normalize-cart'
|
||||
|
||||
export default useCart as UseCart<typeof handler>
|
||||
|
||||
@ -8,35 +10,27 @@ export const handler: SWRHook<any> = {
|
||||
fetchOptions: {
|
||||
query: '',
|
||||
},
|
||||
async fetcher() {
|
||||
return {
|
||||
id: '',
|
||||
createdAt: '',
|
||||
currency: { code: '' },
|
||||
taxesIncluded: '',
|
||||
lineItems: [],
|
||||
lineItemsSubtotalPrice: '',
|
||||
subtotalPrice: 0,
|
||||
totalPrice: 0,
|
||||
}
|
||||
async fetcher({fetch}) {
|
||||
const {data:cartData} = await epClient.Cart().Get();
|
||||
const {data:cartItems} = await epClient.Cart().Items();
|
||||
return normalizeCart(cartData, cartItems);
|
||||
},
|
||||
useHook:
|
||||
({ useData }) =>
|
||||
(input) => {
|
||||
return useMemo(
|
||||
() =>
|
||||
Object.create(
|
||||
{},
|
||||
{
|
||||
isEmpty: {
|
||||
get() {
|
||||
return true
|
||||
},
|
||||
enumerable: true,
|
||||
},
|
||||
}
|
||||
),
|
||||
[]
|
||||
)
|
||||
useHook: ({ useData }) => (input) => {
|
||||
const response = useData({
|
||||
swrOptions: { revalidateOnFocus: false, ...input?.swrOptions },
|
||||
})
|
||||
console.log("checking data..", epClient.Cart());
|
||||
return useMemo(
|
||||
() =>
|
||||
Object.create(response, {
|
||||
isEmpty: {
|
||||
get() {
|
||||
return (response.data?.lineItems.length ?? 0) <= 0
|
||||
},
|
||||
enumerable: true,
|
||||
},
|
||||
}),
|
||||
[response]
|
||||
)
|
||||
},
|
||||
}
|
||||
|
@ -1,5 +1,10 @@
|
||||
import { useCallback } from 'react'
|
||||
|
||||
import { MutationHook } from '@commerce/utils/types'
|
||||
import useRemoveItem, { UseRemoveItem } from '@commerce/cart/use-remove-item'
|
||||
import useCart from './use-cart'
|
||||
import epClient from '../utils/ep-client'
|
||||
import normalizeCart from '../utils/normalize-cart'
|
||||
|
||||
export default useRemoveItem as UseRemoveItem<typeof handler>
|
||||
|
||||
@ -7,12 +12,20 @@ export const handler: MutationHook<any> = {
|
||||
fetchOptions: {
|
||||
query: '',
|
||||
},
|
||||
async fetcher({ input, options, fetch }) {},
|
||||
useHook:
|
||||
({ fetch }) =>
|
||||
() => {
|
||||
return async function removeItem(input) {
|
||||
return {}
|
||||
}
|
||||
},
|
||||
async fetcher({ input }) {
|
||||
return epClient.Cart().RemoveItem(input.id);
|
||||
},
|
||||
useHook: ({ fetch }) => () => {
|
||||
const { mutate } = useCart()
|
||||
|
||||
return useCallback(
|
||||
async function addItem(input) {
|
||||
const data = await fetch({ input })
|
||||
const cartData = normalizeCart(data, await epClient.Cart().Items());
|
||||
await mutate(cartData, true)
|
||||
return cartData
|
||||
},
|
||||
[fetch, mutate]
|
||||
)
|
||||
},
|
||||
}
|
||||
|
@ -1,5 +1,9 @@
|
||||
import { MutationHook } from '@commerce/utils/types'
|
||||
import useUpdateItem, { UseUpdateItem } from '@commerce/cart/use-update-item'
|
||||
import epClient from '../utils/ep-client'
|
||||
import normalizeCart from '../utils/normalize-cart'
|
||||
import { useCallback } from 'react'
|
||||
import useCart from './use-cart'
|
||||
|
||||
export default useUpdateItem as UseUpdateItem<any>
|
||||
|
||||
@ -7,12 +11,27 @@ export const handler: MutationHook<any> = {
|
||||
fetchOptions: {
|
||||
query: '',
|
||||
},
|
||||
async fetcher({ input, options, fetch }) {},
|
||||
useHook:
|
||||
({ fetch }) =>
|
||||
() => {
|
||||
return async function addItem() {
|
||||
return {}
|
||||
}
|
||||
},
|
||||
async fetcher({input}) {
|
||||
return epClient.Cart().UpdateItem(input.id, input.quantity);
|
||||
},
|
||||
useHook: ({ fetch }) => (ctx) => {
|
||||
console.log(ctx);
|
||||
const { mutate } = useCart()
|
||||
|
||||
return useCallback(
|
||||
async function addItem(input) {
|
||||
const cartItemsRes = await fetch({
|
||||
input: {
|
||||
...ctx.item,
|
||||
...input
|
||||
}
|
||||
});
|
||||
const {data:cartObj} = await epClient.Cart().Get();
|
||||
const cartData = normalizeCart(cartObj, cartItemsRes.data);
|
||||
await mutate(cartData, false);
|
||||
return cartData
|
||||
},
|
||||
[fetch, mutate]
|
||||
)
|
||||
}
|
||||
}
|
||||
|
50
framework/elasticpath/utils/normalize-cart.js
Normal file
50
framework/elasticpath/utils/normalize-cart.js
Normal file
@ -0,0 +1,50 @@
|
||||
const normalizeLineItem = ({
|
||||
id,
|
||||
name,
|
||||
quantity,
|
||||
product_id:productId,
|
||||
sku,
|
||||
image,
|
||||
value,
|
||||
unit_price
|
||||
}) => {
|
||||
const item = {
|
||||
id,
|
||||
variantId: productId,
|
||||
productId,
|
||||
name,
|
||||
quantity,
|
||||
variant: {
|
||||
id: productId,
|
||||
sku,
|
||||
name,
|
||||
image: {
|
||||
url: image.href || '/',
|
||||
},
|
||||
requiresShipping: false,
|
||||
price: (unit_price.amount/100),
|
||||
listPrice: (unit_price.amount/100),
|
||||
},
|
||||
path: '',
|
||||
discounts: [],
|
||||
options: [],
|
||||
}
|
||||
return item
|
||||
}
|
||||
|
||||
const normalizeCart = async (cart, lineItems) => {
|
||||
const {with_tax, without_tax} = cart.meta?.display_price;
|
||||
|
||||
return {
|
||||
id: cart.id,
|
||||
createdAt: cart.meta.timestamps.created_at,
|
||||
currency: { code: with_tax.currency },
|
||||
taxesIncluded: '',
|
||||
lineItems: lineItems?.map(normalizeLineItem) ?? [],
|
||||
lineItemsSubtotalPrice: cart.meta?.display_price.without_tax || 0,
|
||||
subtotalPrice: (without_tax.amount/100) || 0,
|
||||
totalPrice: (with_tax.amount/100) || 0,
|
||||
};
|
||||
}
|
||||
|
||||
export default normalizeCart;
|
BIN
public/assets/placeholder.png
Normal file
BIN
public/assets/placeholder.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.0 MiB |
Loading…
x
Reference in New Issue
Block a user