dsg
Copy This
import app from "./app.js";
import store from "./store.js";
var $ = Dom7;

var trendingEventsStore = store.getters.getTrendingEvents;
var trendingVenuesStore = store.getters.getTrendingVenues;
var eventCategories = store.getters.getEventCategories;
var filteredEventsStore = store.getters.getFilteredEvents;
var filteredVenuesStore = store.getters.getFilteredVenues;
var trendingUsersStore = store.getters.getTrendingUsers;

var isFetchingPosts = false
var currentEventsPage = 1
var currentVenuesPage = 1
var currentUsersPage = 1
var refreshed = false

var totalEventPages = 1
var totalVenuesPages = 1
var totalUsersPages = 1

var autocomplete;
var filters = {};

//AUTOCOMPLETE FUNCTIONS
function initAutocomplete() {
    autocomplete = new google.maps.places.Autocomplete(
        document.getElementById("autocomplete"), {
            types: ["establishment", "geocode"],
            componentRestrictions: {
                country: \'GB\'
            }
        }
    );
    autocomplete.setFields(["geometry", "address_component"]);
    autocomplete.addListener("place_changed", fillInAddress);
}

function fillInAddress() {
    const place = autocomplete.getPlace();

    console.log(place);

    document.getElementById(\'lat\').value = place.geometry.location.lat();
    document.getElementById(\'lng\').value = place.geometry.location.lng();
}

function populateEventCard(data = [], isSwiper = true) {
    const swiperContainer = document.querySelector(\'#trending-events\');
    if (isSwiper) swiperContainer.innerHTML = \'\';

    const eventsTabContainer = document.querySelector(\'#filtered-events-tab\');

    if (refreshed) {
        eventsTabContainer.innerHTML = \'\';
    }

    data.forEach(event => {
        const startDate = new Date(event.start_date);
        const endDate = new Date(event.end_date);
        // const startDate = new Date(event.dates[0].start_date);
        // const endDate = new Date(event.dates[0].end_date);

        let endDateString = \'\';

        if (startDate.getDate() !== endDate.getDate()) {
            endDateString = `
            <div class="event-date-item">
                <p>${endDate.toLocaleString(\'default\', { month: \'short\' })}</p>
                <h5>${endDate.getDate()}</h5>
            </div>
            `
        }

        const card = `
        <a href="/discover-view-event/${event.id}">
            <div class="card event-item">
                <div class="event-image position-relative">
                    <div class="image-rectangle" style="background-image: url(\'${event.thumbnail}\');"></div>
                    <div class="event-dates">
                        <div class="event-date-item">
                            <p>${startDate.toLocaleString(\'default\', { month: \'short\' })}</p>
                            <h5>${startDate.getDate()}</h5>
                        </div>
                        ${endDateString}
                    </div>
                </div>
                <div class="card-content">
                    <h3 class="event-title">${event.title}</h3>
                    <p class="event-info">Starts ${startDate.toLocaleString(\'default\', { weekday: \'short\' })}, ${startDate.getDate()} ${startDate.toLocaleString(\'default\', { month: \'short\' })} ${startDate.getFullYear()}</p>
                    <div class="event-info">
                        ${event.location}
                    </div>
                </div>
            </div>
        </a>
        `;

        if (isSwiper) {
            const swiperSlide = document.createElement(\'swiper-slide\');
            swiperSlide.innerHTML = card;
            swiperContainer.appendChild(swiperSlide);
        }

        eventsTabContainer.innerHTML += card;
    });
}

function populateVenueCard(data = [], isSwiper = true) {
    const swiperContainer = document.querySelector(\'#trending-venues\');

    if (isSwiper) swiperContainer.innerHTML = \'\';

    const eventsTabContainer = document.querySelector(\'#filtered-venues-tab\');

    data.forEach(event => {
        const swiperSlide = document.createElement(\'swiper-slide\');

        const card = `
        <a href="/discover-view-venue/${event.ID}">
            <div class="card event-item">
                <div class="event-image position-relative">
                    <div class="image-rectangle" style="background-image: url(\'${event.cover_image}\');"></div>
                </div>
                <div class="card-content">
                    <h3 class="event-title">${event.title}</h3>
                    <div class="event-info">
                        ${event.venue_location}
                    </div>
                    <div class="event-info">
                        Apprx. ${event.distance} miles away
                    </div>
                </div>
            </div>
        </a>
        `;

        if (isSwiper) {
            swiperSlide.innerHTML = card;
            swiperContainer.appendChild(swiperSlide);
        }

        eventsTabContainer.innerHTML += card;
    });


}

function populateUsersCard(data = []) {
    const tabContainer = document.querySelector(\'#users-vehicles-tab\');

    data.forEach(user => {
        let linkTo = user.type === \'user\' ? `/profile-view/${user.id}` : `/profile-garage-vehicle-view/${user.id}`;
        let title;

        if (user.type === \'user\') {
            title = user.name;
        }

        if (user.type === \'vehicle\') {
            const userName = user.owner.username;
            const vehicleName = user.title;

            title = `${vehicleName} <br/> Owner ${userName}`;
        }


        const card = `
        <li>
            <a class="item-link search-result item-content" href="${linkTo}">
                <div class="item-media">
                    <div class="image-square image-rounded"
                        style="background-image:url(\'${user.thumbnail}\')">
                    </div>
                </div>
                <div class="item-inner">
                    <div class="item-title">${title}</div>
                </div>
            </a>
        </li>
        `;
        tabContainer.innerHTML += card;
    });
}

function addCategoryOptions(categories) {
    const categoryFilters = document.querySelector(\'#category-filters ul\');

    categories.forEach(category => {
        const listItem = document.createElement(\'li\');

        listItem.innerHTML = `
            <label class="item-checkbox item-content">
                <input type="checkbox" name="${category.slug}" value="${category.id}" />
                <i class="icon icon-checkbox"></i>
                <div class="item-inner">
                    <div class="item-title">${category.name}</div>
                </div>
            </label>
        `;

        categoryFilters.appendChild(listItem);
    });
}

// Event listener for the submit button
$(document).on(\'click\', \'.apply-filters\', function (e) {
    const dateFilters = document.querySelector(\'#date-filters ul\');
    const locationFilters = document.querySelector(\'#location-filters ul\');
    const categoryFilters = document.querySelector(\'#category-filters ul\');

    e.preventDefault(); // Prevent form submission if you\'re handling it via JavaScript
    const selectedCats = [...categoryFilters.querySelectorAll(\'input[type="checkbox"]:checked\')].map(cb => cb.value);
    const selectedLocation = [...locationFilters.querySelectorAll(\'input[type="radio"]:checked\')].map(cb => cb.value);
    const dateFilter = [...dateFilters.querySelectorAll(\'input[type="checkbox"]:checked\')].map(cb => cb.value);

    filters = {
        \'event_location\': selectedLocation,
        //  \'custom_location\': location,
        \'event_date\': dateFilter,
        //  \'event_start\': customDateRange?.start,
        //  \'event_end\': customDateRange?.end,
        \'event_category\': !selectedCats?.includes(0) ? selectedCats : undefined,
    };

    // get active tab
    const activeTab = document.querySelector(\'.tabbar-nav .tab-link-active\').getAttribute(\'data-id\');

    if (activeTab === \'events\') {
        store.dispatch(\'filterEvents\', {
            page: 1,
            filters
        })

        currentEventsPage = 1
        isFetchingPosts = false

        const eventsTabContainer = document.querySelector(\'#filtered-events-tab\');
        eventsTabContainer.innerHTML = \'\';
    }

    if (activeTab === \'venues\') {
        store.dispatch(\'filterVenues\', {
            page: 1,
            filters
        })

        currentVenuesPage = 1
        isFetchingPosts = false

        const venuesTabContainer = document.querySelector(\'#filtered-venues-tab\');
        venuesTabContainer.innerHTML = \'\';
    }

    // close popup
    app.popup.close()
});

$(document).on(\'change\', \'#category-filters ul\', function (e) {
    const categoryFilters = document.querySelector(\'#category-filters ul\');
    var allCheckbox = categoryFilters.querySelector(\'input[name="all"]\');

    const targetCheckbox = e.target;

    if (targetCheckbox.name !== "all") {
        // If any other checkbox is selected, uncheck "All"
        if (targetCheckbox.checked) {
            allCheckbox.checked = false;
        } else {
            // If all other checkboxes are unchecked, check "All"
            const allUnchecked = [...categoryFilters.querySelectorAll(\'input[type="checkbox"]\')]
                .filter(cb => cb.name !== "all")
                .every(cb => !cb.checked);

            if (allUnchecked) {
                allCheckbox.checked = true;
            }
        }
    } else {
        // If "All" is selected, uncheck all other checkboxes
        if (targetCheckbox.checked) {
            [...categoryFilters.querySelectorAll(\'input[type="checkbox"]\')]
            .filter(cb => cb.name !== "all")
                .forEach(cb => cb.checked = false);
        }
    }
});

eventCategories.onUpdated((data) => {
    addCategoryOptions(data);
})

trendingVenuesStore.onUpdated((data) => {
    totalVenuesPages = data.total_pages

    populateVenueCard(data.data);
});

trendingEventsStore.onUpdated((data) => {
    totalEventPages = data.total_pages

    populateEventCard(data.data);
});

trendingUsersStore.onUpdated((data) => {
    const tabContainer = document.querySelector(\'#users-vehicles-tab\');
    if (!data || data.data.length === 0) {
        tabContainer.innerHTML = `
            <div class="no-events">
                <h3>No trending users found for you</h3>
            </div>
        `;
        return
    }

    totalUsersPages = data.total_pages

    if ((totalUsersPages == data.page) || (totalUsersPages == 0) || (data.new_data.length < 10)) {
        $(\'.infinite-scroll-preloader.users-tab\').hide()
    } else {
        $(\'.infinite-scroll-preloader.users-tab\').show()
    }

    populateUsersCard(data.new_data);
});

// Filtered views
filteredEventsStore.onUpdated((data) => {
    const eventsTabContainer = document.querySelector(\'#filtered-events-tab\');
    if (!data || data.data.length === 0) {
        eventsTabContainer.innerHTML = `
            <div class="no-events">
                <h3>No events found</h3>
            </div>
        `;
        return
    }

    totalEventPages = data.total_pages

    if ((totalEventPages == data.page) || (totalEventPages == 0) || (data.new_data.length < 10)) {
        $(\'.infinite-scroll-preloader.events-tab\').hide()
    } else {
        $(\'.infinite-scroll-preloader.events-tab\').show()
    }

    populateEventCard(data.new_data, false);
});

filteredVenuesStore.onUpdated((data) => {
    const tabContainer = document.querySelector(\'#filtered-venues-tab\');

    if (!data || data.data.length === 0) {
        tabContainer.innerHTML = `
            <div class="no-venues">
                <h3>No venues found</h3>
            </div>
        `;

        totalVenuesPages = 0
        return
    }

    if ((totalVenuesPages == data.page) || (totalVenuesPages == 0) || (data.new_data.length == 0)) {
        $(\'.infinite-scroll-preloader.venues-tab\').hide()
        totalVenuesPages = 0
    } else {
        $(\'.infinite-scroll-preloader.venues-tab\').show()
        totalVenuesPages = data.total_pages
        populateVenueCard(data.new_data, false);
    }
});

$(document).on(\'page:init\', \'.page[data-name="discover"]\', function (e) {
    //Date Filters
    app.calendar.create({
        inputEl: \'#date-from\',
        openIn: \'customModal\',
        header: true,
        footer: true,
    });

    app.calendar.create({
        inputEl: \'#date-to\',
        openIn: \'customModal\',
        header: true,
        footer: true,
    });

    //Filter Date Popup
    app.popup.create({
        el: \'.filter-bydate-popup\',
        swipeToClose: \'to-bottom\'
    });

    //Filter Category Popup
    app.popup.create({
        el: \'.filter-bycategory-popup\',
        swipeToClose: \'to-bottom\'
    });

    //Filter Location Popup
    app.popup.create({
        el: \'.filter-bylocation-popup\',
        swipeToClose: \'to-bottom\'
    });

    //SEARCH BAR
    $(\'.discover-search\').on(\'mousedown\', function (event) {
        event.preventDefault();
        app.views.discover.router.navigate(\'/search/\');
    });

    const dateFilters = document.querySelector(\'#date-filters ul\');
    const locationFilters = document.querySelector(\'#location-filters ul\');

    // Event listener for checkbox selection
    dateFilters.addEventListener(\'change\', function (e) {
        const targetCheckbox = e.target;

        // Uncheck all checkboxes except the one that was clicked
        if (targetCheckbox.type === "checkbox") {
            [...dateFilters.querySelectorAll(\'input[type="checkbox"]\')].forEach(checkbox => {
                if (checkbox !== targetCheckbox) {
                    checkbox.checked = false;
                }
            });
        }
    });

    locationFilters.addEventListener(\'change\', function (e) {
        const targetCheckbox = e.target;

        // Uncheck all checkboxes except the one that was clicked
        if (targetCheckbox.type === "checkbox") {
            [...locationFilters.querySelectorAll(\'input[type="checkbox"]\')].forEach(checkbox => {
                if (checkbox !== targetCheckbox) {
                    checkbox.checked = false;
                }
            });
        }
    });

    initAutocomplete();
});

$(document).on(\'infinite\', \'.discover-page.infinite-scroll-content\', async function (e) {
    if (isFetchingPosts) return

    // get active tab
    const activeTabId = $(\'.tabbar-nav .tab-link-active\').attr(\'data-id\');

    if (!activeTabId) return

    isFetchingPosts = true

    if (activeTabId == \'events\') {
        currentEventsPage++

        if (currentEventsPage <= totalEventPages) {
            await store.dispatch(\'filterEvents\', {
                page: currentEventsPage,
                filters
            })
            isFetchingPosts = false
        }
    } else if (activeTabId == \'venues\') {
        currentVenuesPage++

        if (currentVenuesPage <= totalVenuesPages) {
            await store.dispatch(\'filterVenues\', {
                page: currentVenuesPage,
                filters
            })
            isFetchingPosts = false
        }
    } else {
        isFetchingPosts = false
    }
})

// $(document).on(\'page:beforein\', \'.page[data-name="discover"]\', function (e) {
// const eventCats = eventCategories.value
// const trendingEvents = trendingEventsStore.value
// const trendingVenues = trendingVenuesStore.value
// const trendingUsers = trendingUsersStore.value

// if (!eventCats || eventCats.length === 0) {
//     store.dispatch(\'fetchEventCategories\')
// } else {
//     addCategoryOptions(eventCats);
// }

// if (!trendingEvents || trendingEvents.length === 0) {
//     store.dispatch(\'fetchTrendingEvents\')
// } else {
//     totalEventPages = trendingEvents.total_pages
//     populateEventCard(trendingEvents.data);
// }

// if (!trendingVenues || trendingVenues.length === 0) {
//     store.dispatch(\'fetchTrendingVenues\')
// } else {
//     totalVenuesPages = trendingVenues.total_pages
//     populateVenueCard(trendingVenues.data);
// }

// if (!trendingUsers || trendingUsers.length === 0) {
//     store.dispatch(\'fetchTrendingUsers\')
// } else {
//     totalUsersPages = trendingUsers.total_pages
//     populateUsersCard(trendingUsers.data);
// }
// });

$(document).on(\'page:init\', \'.page[data-name="discover-view-event"]\', function (e) {
    // Init slider
    new Swiper(\'.swiper-container\', {
        pagination: {
            el: \'.swiper-pagination\',
            clickable: true,
        },
    })

    app.popup.create({
        el: \'.share-listing-popup\',
        swipeToClose: \'to-bottom\'
    });
});

$(document).on(\'ptr:refresh\', \'.discover-page.ptr-content\', async function (e) {
    refreshed = true
    currentEventsPage = 1
    currentVenuesPage = 1

    try {
        await store.dispatch(\'getTrendingEvents\')
        await store.dispatch(\'getTrendingVenues\')
        await store.dispatch(\'filterTrendingUsers\')
        await store.dispatch(\'fetchEventCategories\')
    } catch (error) {
        console.log(error);
    }

    refreshed = false
    app.ptr.get(\'.discover-page.ptr-content\').done()
})

$(document).on(\'click\', \'#featured-event-link\', function (e) {
    e.preventDefault();
    window.open(e.target.href, \'_blank\');
});
Add JS Function Name