useProductCart.js 1.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import FormValidationError from '@/utils/FormValidationError'
  2. import { reactive } from 'vue'
  3. export function useProductCart(form, initialProducts) {
  4. const productCart = reactive([])
  5. const productValidation = () => {
  6. const existProduct = productCart.find(
  7. (product) => product.number === form.product.number
  8. )
  9. if (existProduct) {
  10. throw new FormValidationError('Produk sudah ada dikeranjang', 'product')
  11. }
  12. }
  13. const onAddProduct = () => {
  14. try {
  15. form.clearErrors('product', 'price', 'qty')
  16. productValidation()
  17. productCart.push({
  18. number: form.product.number,
  19. name: form.product.name,
  20. price: form.price,
  21. qty: form.qty,
  22. unit: form.product.unit,
  23. })
  24. form.reset('product', 'price', 'qty')
  25. } catch (e) {
  26. form.setError(e.field, e.message)
  27. }
  28. }
  29. const onDeleteProduct = (index) => {
  30. productCart.splice(index, 1)
  31. }
  32. const onClearProduct = () => {
  33. productCart.splice(0)
  34. }
  35. const totalProductPrice = () => {
  36. const productPrices = productCart.map((product) => {
  37. if (form.checkedPpn) {
  38. return product.price + product.price * (form.ppn / 100)
  39. } else {
  40. return product.price
  41. }
  42. })
  43. return productPrices.reduce((prev, current) => prev + current, 0)
  44. }
  45. const onEditProduct = (event) => {
  46. const { newData, index } = event
  47. productCart[index] = newData
  48. }
  49. return {
  50. productCart,
  51. onAddProduct,
  52. onDeleteProduct,
  53. onEditProduct,
  54. onClearProduct,
  55. totalProductPrice,
  56. }
  57. }