Files
your-gold/stores/productStore.ts
2025-07-03 15:24:28 +02:00

189 lines
4.9 KiB
TypeScript

import { useMyFetch } from '#imports'
import type {
GenericResponse,
GenericResponseChildren,
GenericResponseItems,
} from '~/types'
import type { Product } from '~/types/product'
export const useProductStore = defineStore('productStore', () => {
const { $toast } = useNuxtApp()
const productList = ref<Product[]>()
const modules = ref()
const checkoutStore = useCheckoutStore()
async function getList(count: number, categoryId = 1) {
try {
const { data } = await useMyFetch<GenericResponseItems<[]>>(
`/api/public/products/category/${categoryId}?p=1&elems=${count}`,
{
headers: {
'Content-Type': 'application/json',
},
onErrorOccured: async (_, status) => {
// await navigateTo("/error", { replace: true });
throw createError({
statusCode: status,
statusMessage: `HTTP error: ${status}`,
})
},
},
)
productList.value = data.items
}
catch (error) {
console.error('getList error:', error)
}
}
async function getModules() {
try {
const { data } = await useMyFetch<GenericResponseChildren<[]>>(
`/api/public/module/e_shop`,
{
headers: {
'Content-Type': 'application/json',
},
onErrorOccured: (_, status) => {
throw new Error(`HTTP error: ${status}`)
},
},
)
modules.value = data.children.find(
(item: { id: number, name: string }) =>
item.name === 'currency_rates_bar',
)
}
catch (error) {
console.error('getList error:', error)
}
}
async function incrementCartItem(id: number) {
try {
const res = await useMyFetch<GenericResponse<object>>(
`/api/public/user/cart/item/add/${id}/1`,
{
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
onErrorOccured: (_, status) => {
throw new Error(`HTTP error: ${status}`)
},
},
)
if (res.status === 200) {
$toast.success('Item successfully added to your cart.', {
autoClose: 5000,
dangerouslyHTMLString: true,
})
checkoutStore.getUserCart()
}
else {
$toast.error('Failed to add item to cart. Please try again.', {
autoClose: 5000,
dangerouslyHTMLString: true,
})
}
}
catch (error) {
$toast.error('An unexpected error occurred while updating your cart.', {
autoClose: 5000,
dangerouslyHTMLString: true,
})
console.error('incrementCartItem error:', error)
}
}
async function decrementCartItem(id: number) {
try {
const res = await useMyFetch<GenericResponse<object>>(
`/api/public/user/cart/item/subtract/${id}/1`,
{
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
onErrorOccured: (_, status) => {
throw new Error(`HTTP error: ${status}`)
},
},
)
if (res.status === 200) {
$toast.success('Item successfully removed from your cart.', {
autoClose: 5000,
dangerouslyHTMLString: true,
})
checkoutStore.getUserCart()
}
else {
$toast.error('Failed to removed item from cart. Please try again.', {
autoClose: 5000,
dangerouslyHTMLString: true,
})
}
}
catch (error) {
$toast.error('An unexpected error occurred while updating your cart.', {
autoClose: 5000,
dangerouslyHTMLString: true,
})
console.error('decrementCartItem error:', error)
}
}
async function deleteCartItem(id: number) {
try {
const res = await useMyFetch<GenericResponse<object>>(
`/api/public/user/cart/item/${id}`,
{
method: 'DELETE',
headers: {
'Content-Type': 'application/json',
},
onErrorOccured: (_, status) => {
throw new Error(`HTTP error: ${status}`)
},
},
)
if (res.status === 200) {
$toast.success('Item successfully removed from your cart.', {
autoClose: 5000,
dangerouslyHTMLString: true,
})
checkoutStore.getUserCart()
}
else {
$toast.error('Failed to removed item from cart. Please try again.', {
autoClose: 5000,
dangerouslyHTMLString: true,
})
}
}
catch (error) {
$toast.error('An unexpected error occurred while updating your cart.', {
autoClose: 5000,
dangerouslyHTMLString: true,
})
console.error('deleteCartItem error:', error)
}
}
return {
productList,
modules,
getList,
getModules,
incrementCartItem,
decrementCartItem,
deleteCartItem,
}
})