feat: add creating order
This commit is contained in:
parent
90677c7ee8
commit
f05130e52c
49
src/App.vue
49
src/App.vue
@ -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>
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user