feat: add creating order

This commit is contained in:
Sergey Krylov 2025-01-27 06:52:47 +03:00
parent 90677c7ee8
commit f05130e52c
2 changed files with 66 additions and 6 deletions

View File

@ -14,6 +14,7 @@
searchQuery: '', searchQuery: '',
sortBy: '' sortBy: ''
}); });
const isCreatingOrder = ref(false);
const fetchItems = async (filters = {}) => { const fetchItems = async (filters = {}) => {
const params = {}; const params = {};
@ -48,7 +49,8 @@
"type": "success", "type": "success",
"hideProgressBar": true, "hideProgressBar": true,
"transition": "slide", "transition": "slide",
"dangerouslyHTMLString": true "dangerouslyHTMLString": true,
"position": "bottom-right",
}) })
} }
} catch (e) { } catch (e) {
@ -57,7 +59,8 @@
"type": "error", "type": "error",
"hideProgressBar": true, "hideProgressBar": true,
"transition": "slide", "transition": "slide",
"dangerouslyHTMLString": true "dangerouslyHTMLString": true,
"position": "bottom-right",
}) })
} }
} }
@ -72,7 +75,8 @@
"type": "success", "type": "success",
"hideProgressBar": true, "hideProgressBar": true,
"transition": "slide", "transition": "slide",
"dangerouslyHTMLString": true "dangerouslyHTMLString": true,
"position": "bottom-right",
}) })
} }
} catch (e) { } catch (e) {
@ -80,6 +84,43 @@
} }
} }
const createOrder = async () => {
try {
isCreatingOrder.value = true;
const { data } = await axios.post(`${import.meta.env.VITE_API_URL}/orders`, {
items: cart.value,
totalPrice: totalPrice.value
});
items.value.forEach((item) => {
item.isAdded = false;
});
await axios.patch(`${import.meta.env.VITE_API_URL}/items`, items.value);
toast("Заказ успешно оформлен", {
"type": "success",
"hideProgressBar": true,
"transition": "slide",
"dangerouslyHTMLString": true,
"position": "bottom-right",
})
return data;
} catch (e) {
toast("Ошибка при создании заказа", {
"type": "error",
"hideProgressBar": true,
"transition": "slide",
"dangerouslyHTMLString": true,
"position": "bottom-right",
})
} finally {
isCreatingOrder.value = false;
showDrawer.value = false;
}
}
const cart = computed(() => items.value.filter(i => i.isAdded)); const cart = computed(() => items.value.filter(i => i.isAdded));
const totalPrice = computed(() => cart.value.reduce((res, cur) => { const totalPrice = computed(() => cart.value.reduce((res, cur) => {
return res + cur.price return res + cur.price
@ -91,6 +132,8 @@
totalPrice, totalPrice,
openDrawer: () => showDrawer.value = true, openDrawer: () => showDrawer.value = true,
closeDrawer: () => showDrawer.value = false, closeDrawer: () => showDrawer.value = false,
createOrder,
isCreatingOrder,
}) })
</script> </script>
<template> <template>

View File

@ -1,10 +1,15 @@
<script setup> <script setup>
import DrawerHead from './DrawerHead.vue' import DrawerHead from './DrawerHead.vue'
import CartItemList from '@/components/CartItemList.vue' import CartItemList from '@/components/CartItemList.vue'
import { inject } from 'vue' import { inject, onMounted, onUnmounted } from 'vue'
import { decimalFormatter } from '@/utils/helpers.js' import { decimalFormatter } from '@/utils/helpers.js'
const { closeDrawer, totalPrice } = inject('cart') const {
closeDrawer,
totalPrice,
createOrder,
isCreatingOrder,
} = inject('cart')
defineProps({ defineProps({
cart: { cart: {
@ -12,6 +17,14 @@
required: true required: true
} }
}) })
onMounted(() => {
document.body.style.overflow = 'hidden'
})
onUnmounted(() => {
document.body.style.overflow = 'unset'
})
</script> </script>
<template> <template>
@ -43,7 +56,11 @@
<b>{{ decimalFormatter.format(totalPrice * 0.95) }} руб.</b> <b>{{ decimalFormatter.format(totalPrice * 0.95) }} руб.</b>
</div> </div>
<button class="mt-5 bg-lime-500 w-full rounded-xl py-3 text-white transition disabled:bg-slate-300 hover:bg-lime-600 active:bg-lime-700"> <button
@click="createOrder"
class="mt-5 bg-lime-500 w-full rounded-xl py-3 text-white transition disabled:bg-slate-300 hover:bg-lime-600 active:bg-lime-700"
:disabled="isCreatingOrder"
>
Оформить заказ Оформить заказ
</button> </button>
</div> </div>