156 lines
3.2 KiB
TypeScript
156 lines
3.2 KiB
TypeScript
import swell from 'swell-node'
|
|
|
|
// Init Swell
|
|
swell.init(import.meta.env.VITE_SWELL_STORE_ID, import.meta.env.VITE_SWELL_API_TOKEN)
|
|
|
|
|
|
|
|
/**
|
|
* Fetch products
|
|
*/
|
|
export const getProducts = async (category?: string, limit: number = 25, page: number = 1) => {
|
|
const products = await swell.get('/products', {
|
|
where: {
|
|
active: true,
|
|
},
|
|
category,
|
|
limit,
|
|
page
|
|
})
|
|
|
|
if (products) {
|
|
return products
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Retrieve a product
|
|
*/
|
|
export const getProduct = async (id: string) => {
|
|
const product = await swell.get('/products/{id}', {
|
|
id
|
|
})
|
|
|
|
if (product) {
|
|
return product
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Create a cart
|
|
*/
|
|
export const createCart = async () => {
|
|
const cart = await swell.post('/carts')
|
|
|
|
if (cart) {
|
|
return cart
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Retrieve cart
|
|
*/
|
|
export const fetchCart = async (id: string) => {
|
|
const cart = await swell.get('/carts/{id}', {
|
|
id,
|
|
expand: [
|
|
'items.product',
|
|
'items.variant',
|
|
]
|
|
})
|
|
|
|
if (cart) {
|
|
return cart
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Add product to cart
|
|
*/
|
|
export const addToCart = async (cartId: string, productId: string, quantity: number) => {
|
|
// Fetch current cart data
|
|
const currentCart = await fetchCart(cartId)
|
|
|
|
// Updated cart with new items
|
|
const updatedCart = await swell.put('/carts/{id}', {
|
|
id: cartId,
|
|
items: [
|
|
...currentCart.items || [],
|
|
{
|
|
product_id: productId,
|
|
quantity,
|
|
}
|
|
],
|
|
})
|
|
if (updatedCart) {
|
|
// Fetch latest cart with updates
|
|
const cart = await fetchCart(cartId)
|
|
if (cart) {
|
|
return cart
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Update cart item
|
|
*/
|
|
export const updateCartItem = async (cartId: string, productId: string, quantity: number) => {
|
|
// Fetch current cart data
|
|
const currentCart = await fetchCart(cartId)
|
|
|
|
// Updated items with replacing new item quantity
|
|
const updatedCartItems = currentCart.items.map((item: any) => {
|
|
// Replace item quantity with selected one
|
|
if (item.id === productId) {
|
|
item.quantity = quantity
|
|
}
|
|
return item
|
|
})
|
|
|
|
const updatedCart = await swell.put('/carts/{id}', {
|
|
id: cartId,
|
|
$set: {
|
|
items: updatedCartItems,
|
|
}
|
|
})
|
|
if (updatedCart) {
|
|
// Fetch latest cart with updates
|
|
const cart = await fetchCart(cartId)
|
|
if (cart) {
|
|
return cart
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Remove cart item
|
|
*/
|
|
export const removeCartItem = async (cartId: string, productId: string) => {
|
|
// Fetch current cart data
|
|
const currentCart = await fetchCart(cartId)
|
|
|
|
// Updated items and remove selected item
|
|
const updatedCartItems = [...currentCart.items.filter((item: any) => {
|
|
return item.id !== productId
|
|
})]
|
|
|
|
const updatedCart = await swell.put('/carts/{id}', {
|
|
id: cartId,
|
|
$set: {
|
|
items: updatedCartItems,
|
|
}
|
|
})
|
|
if (updatedCart) {
|
|
// Fetch latest cart with updates
|
|
const cart = await fetchCart(cartId)
|
|
if (cart) {
|
|
return cart
|
|
}
|
|
}
|
|
} |