HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
File: D:/HostingSpaces/farmfun/reserveren.farmfun.be/resources/js/site/components/ShoppingCart.js
import useCart from "../services/useCart";
import {appendTranslations} from "../services/useTranslations";
import flatpickr from "flatpickr";
import {computed, createApp, onMounted, ref} from "vue";
import { format } from 'date-fns'
import FlashMessage from "./FlashMessage";
import debounce from "lodash/debounce";
import PlanModal from "./PlanModal";

export default class ShoppingCart {

    constructor(el) {

        this.el = el;

        const {cart, updateProduct, removeProduct, loadCart, updateMeta, cartErrors, showForceCartUpdate} = useCart()
        cart.value = JSON.parse(el.dataset.cart)
        delete el.dataset.cart

        // If no items break
        if(!cart.value.items) return

        const cartDate = new Date(cart.value.date.year, (cart.value.date.month - 1), cart.value.date.day)
        const date = ref(format(cartDate, 'dd-MM-yyyy'))
        const location = ref(cart.value.location.id)

        const allAddons = ref(JSON.parse(el.dataset.addons))
        delete el.dataset.addons

        const editId = ref(null)

        appendTranslations(JSON.parse(el.dataset.translations))
        delete el.dataset.translations

        createApp({
            components: {FlashMessage, PlanModal},
            setup() {

                const isLoading = ref(false)
                const showAddons = ref(false)
                const datepicker = ref(null)

                const modalProduct = ref(null)


                if(document.body.clientWidth > 800) showAddons.value = true

                onMounted(() => {
                    flatpickr(datepicker.value, {
                        minDate: new Date().fp_incr(10),
                        defaultDate: cartDate
                    })
                })

                const dateOrLocationChanged = computed(() => {

                    if(format(cartDate, 'dd-MM-yyyy') != date.value) return true
                    if(!cart.value.location) return true
                    if(location.value != cart.value.location.id) return true

                    return false
                })

                const selectedProductIds = computed(() => {
                    return cart.value.items.map(item => item.product.id)
                })

                const addons = computed(() => {
                    return allAddons.value.filter(addon => {
                        return !selectedProductIds.value.includes(addon.id) && addon.locations.includes(location.value)
                    })
                })

                const reloadCart = () => {
                    if(document.body.clientWidth < 980) window.scrollTo(0, 0);
                    return loadCart().then(() => {
                        modalProduct.value = null
                    })
                }

                const update = debounce(async (event, product) => {

                    isLoading.value = true

                    await updateProduct(product.product.id, {
                        time: product.selectedTimeslot?.timeSlotValue,
                        amount: product.amountOfPersons,
                        notification: product.notification,
                    })

                    if(cartErrors.value.length === 0) await loadCart().then(() => {
                        editId.value = null
                    })

                    isLoading.value = false

                }, 600);

                const updateCartMeta = async (forceUpdate = false) => {

                    isLoading.value = true

                    await updateMeta({
                        location_id: location.value,
                        date: date.value,
                        force_update: forceUpdate
                    })

                    if(cartErrors.value.length === 0) window.location.reload()
                }

                const remove = async (productId) => {

                    isLoading.value = true

                    await removeProduct(productId)
                    if(cartErrors.value.length === 0) await loadCart()
                    if(!cart.value.items || cart.value.items.length === 0) window.location.reload()

                    isLoading.value = false
                }

                return {
                    datepicker,
                    cart,
                    date,
                    location,

                    showAddons,
                    addons,

                    update,
                    remove,
                    reloadCart,
                    updateCartMeta,

                    editId,
                    modalProduct,
                    dateOrLocationChanged,

                    isLoading,
                    messages: cartErrors,
                    showForceCartUpdate,
                }
            }
        }).mount(el);

    }


}