From fa85c347940265e44e75a1651d8037a259d52568 Mon Sep 17 00:00:00 2001 From: Yakovenko Valeriia Date: Tue, 14 Apr 2026 15:56:48 +0200 Subject: [PATCH 1/2] fix: cart --- bo/components.d.ts | 3 + bo/src/components/customer/PageCart.vue | 16 ++ bo/src/components/customer/PageCarts.vue | 265 ++++++------------ bo/src/components/customer/PageProduct.vue | 27 +- bo/src/components/customer/PageProducts.vue | 54 +++- bo/src/stores/customer/cart.ts | 163 ++++------- bo/src/stores/customer/customer-product.ts | 21 +- .../carts/add-product-to-cart (1).yml | 2 +- .../b2b_daniel/carts/add-product-to-cart.yml | 2 +- bruno/b2b_daniel/carts/change-cart-name.yml | 2 +- bruno/b2b_daniel/carts/retrieve-cart.yml | 2 +- .../b2b_daniel/carts/retrieve-carts-info.yml | 2 +- 12 files changed, 242 insertions(+), 317 deletions(-) create mode 100644 bo/src/components/customer/PageCart.vue diff --git a/bo/components.d.ts b/bo/components.d.ts index 361fcb7..80139ee 100644 --- a/bo/components.d.ts +++ b/bo/components.d.ts @@ -23,7 +23,10 @@ declare module 'vue' { FavoriteProducts: typeof import('./src/components/admin/FavoriteProducts.vue')['default'] LangSwitch: typeof import('./src/components/inner/LangSwitch.vue')['default'] PageAddresses: typeof import('./src/components/customer/PageAddresses.vue')['default'] + PageCart: typeof import('./src/components/customer/PageCart.vue')['default'] PageCarts: typeof import('./src/components/customer/PageCarts.vue')['default'] + PageCArts: typeof import('./src/components/customer/PageCArts.vue')['default'] + PageCreateCart: typeof import('./src/components/customer/PageCreateCart.vue')['default'] PageOrders: typeof import('./src/components/customer/PageOrders.vue')['default'] PageProduct: typeof import('./src/components/customer/PageProduct.vue')['default'] PageProducts: typeof import('./src/components/admin/PageProducts.vue')['default'] diff --git a/bo/src/components/customer/PageCart.vue b/bo/src/components/customer/PageCart.vue new file mode 100644 index 0000000..7cc3d13 --- /dev/null +++ b/bo/src/components/customer/PageCart.vue @@ -0,0 +1,16 @@ + + + \ No newline at end of file diff --git a/bo/src/components/customer/PageCarts.vue b/bo/src/components/customer/PageCarts.vue index 2c5a1d9..48c6adc 100644 --- a/bo/src/components/customer/PageCarts.vue +++ b/bo/src/components/customer/PageCarts.vue @@ -1,204 +1,105 @@ + \ No newline at end of file diff --git a/bo/src/components/customer/PageProduct.vue b/bo/src/components/customer/PageProduct.vue index 4a992d6..c7fe8d8 100644 --- a/bo/src/components/customer/PageProduct.vue +++ b/bo/src/components/customer/PageProduct.vue @@ -87,7 +87,6 @@ import { ref, computed } from 'vue' import ProductCustomization from './components/ProductCustomization.vue' import ProductVariants from './components/ProductVariants.vue' import Default from '@/layouts/default.vue' -import { useFetchJson } from '@/composable/useFetchJson' import { useRoute } from 'vue-router' interface Color { id: string @@ -172,21 +171,21 @@ if (productData.colors.length > 0) { const route = useRoute() -async function toggleFavorite() { - const url = `/api/v1/restricted/product/favorite/${route.params.product_id}` +// async function toggleFavorite() { +// const url = `/api/v1/restricted/product/favorite/${route.params.product_id}` - try { - if (!productData.is_favorite) { - await useFetchJson(url, { method: 'POST' }) - } else { - await useFetchJson(url, { method: 'DELETE' }) - } +// try { +// if (!productData.is_favorite) { +// await useFetchJson(url, { method: 'POST' }) +// } else { +// await useFetchJson(url, { method: 'DELETE' }) +// } - productData.is_favorite = !productData.is_favorite - } catch (e: unknown) { - console.error(e) - } -} +// productData.is_favorite = !productData.is_favorite +// } catch (e: unknown) { +// console.error(e) +// } +// } \ No newline at end of file diff --git a/bo/src/layouts/default.vue b/bo/src/layouts/default.vue index 6da881d..681d019 100644 --- a/bo/src/layouts/default.vue +++ b/bo/src/layouts/default.vue @@ -34,10 +34,33 @@
-
- - {{ pageTitle }} +
+
+ + {{ pageTitle }} +
+
+
+ + +
+

+ {{ cartStore.activeCart.name }}- + + ID: {{ cartStore.activeCart.cart_id }} + +

+ +
+
+ + + + No cart selected + +
@@ -172,6 +195,7 @@ import LangSwitch from '@/components/inner/LangSwitch.vue' import ThemeSwitch from '@/components/inner/ThemeSwitch.vue' import type { LabelTrans, TopMenuItem } from '@/types' import { useUserStore } from '@/stores/user' +import { useCartStore } from '@/stores/customer/cart' const router = useRouter() @@ -297,5 +321,11 @@ const userItems = computed(() => [ ] ]) +const cartStore = useCartStore() + +onMounted(() => { + cartStore.initCart() +}) + defineShortcuts(extractShortcuts(teamsItems.value)) diff --git a/bo/src/stores/customer/cart.ts b/bo/src/stores/customer/cart.ts index 20d7c03..22d8d1e 100644 --- a/bo/src/stores/customer/cart.ts +++ b/bo/src/stores/customer/cart.ts @@ -15,7 +15,6 @@ export const useCartStore = defineStore('cart', () => { const activeCartId = ref(null) const error = ref(null) - async function fetchCarts() { try { const res = await useFetchJson( @@ -28,7 +27,6 @@ export const useCartStore = defineStore('cart', () => { } } - async function addNewCart(name: string) { try { error.value = null @@ -51,38 +49,59 @@ export const useCartStore = defineStore('cart', () => { } } - const route = useRoute() const amount = ref(1); - const errorMassege = ref(''); - const cartId = computed(() => Number(route.params.id)); + const errorMessage = ref(''); + + async function addProduct(product_id: number, count: number) { + if (!activeCartId.value) { + errorMessage.value = 'No active cart selected' + return + } - async function addProduct(product_id: number) { try { const res = await useFetchJson( - `/api/v1/restricted/carts/add-product-to-cart?cart_id=${cartId.value}&product_id=${product_id}&amount=${amount.value}` + `/api/v1/restricted/carts/add-product-to-cart?cart_id=${activeCartId.value}&product_id=${product_id}&amount=${count}` ) - console.log('sfdsfdfd', res); + console.log('fsdfsdfdsfdsfs', res) } catch (e: any) { - errorMassege.value = e?.message ?? 'Error loading carts' + errorMessage.value = e?.message ?? 'Error adding product' } } + function setActiveCart(id: number | null) { + activeCartId.value = id - // function setActiveCart(id: number) { - // activeCartId.value = id - // } + if (id) { + localStorage.setItem('activeCartId', String(id)) + } else { + localStorage.removeItem('activeCartId') + } + } + + function initCart() { + const saved = localStorage.getItem('activeCartId') + + if (saved) { + activeCartId.value = Number(saved) + } + } + + const activeCart = computed(() => { + return carts.value.find(c => c.cart_id === activeCartId.value) + }) return { carts, activeCartId, error, - errorMassege, - // setActiveCart, + errorMessage, + activeCart, + setActiveCart, addProduct, fetchCarts, addNewCart, - + initCart, } }) \ No newline at end of file