86 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
import {ref, inject, computed, onBeforeUnmount} from 'vue';
 | 
						|
import {router} from '@inertiajs/vue3';
 | 
						|
import useQueueEvents from './useQueueEvents.js';
 | 
						|
 | 
						|
export function useIndex(props, siteName) {
 | 
						|
    const axios = inject('axios');
 | 
						|
    const {startListener, stopListener} = useQueueEvents(siteName, () => reload(false));
 | 
						|
    const rawProps = JSON.parse(JSON.stringify(props));
 | 
						|
    const inner = {
 | 
						|
        data: ref(rawProps.data),
 | 
						|
        meta: ref(rawProps.meta),
 | 
						|
        filter: ref(rawProps.meta.filter ? rawProps.meta.filter : {}),
 | 
						|
    };
 | 
						|
 | 
						|
    function toFilterString(data) {
 | 
						|
        return btoa(encodeURIComponent(JSON.stringify(data)));
 | 
						|
    }
 | 
						|
 | 
						|
    const filterString = computed(() => toFilterString(inner.filter.value));
 | 
						|
 | 
						|
    function reload(resetPage = true, data) {
 | 
						|
        var data = {
 | 
						|
            filter: filterString.value,
 | 
						|
            page: resetPage ? 1 : inner.meta.value.current_page,
 | 
						|
            ...data,
 | 
						|
        };
 | 
						|
 | 
						|
        router.visit(window.location.pathname, {
 | 
						|
            data,
 | 
						|
            preserveState: true,
 | 
						|
            only: ['data'],
 | 
						|
            onSuccess: (page) => {
 | 
						|
                inner.data.value = page.props.data.data;
 | 
						|
                inner.meta.value = {
 | 
						|
                    ...inner.meta.value,
 | 
						|
                    ...page.props.data.meta,
 | 
						|
                };
 | 
						|
            },
 | 
						|
        });
 | 
						|
    }
 | 
						|
 | 
						|
    function reloadPage(page) {
 | 
						|
        reload(false, {page: page});
 | 
						|
    }
 | 
						|
 | 
						|
    function can(permission) {
 | 
						|
        return inner.meta.value.can[permission];
 | 
						|
    }
 | 
						|
 | 
						|
    function getFilter(value) {
 | 
						|
        return inner.filter.value[value];
 | 
						|
    }
 | 
						|
 | 
						|
    function setFilter(key, value) {
 | 
						|
        inner.filter.value[key] = value;
 | 
						|
        reload(true);
 | 
						|
    }
 | 
						|
 | 
						|
    startListener();
 | 
						|
    onBeforeUnmount(() => stopListener());
 | 
						|
 | 
						|
    return {
 | 
						|
        data: inner.data,
 | 
						|
        can,
 | 
						|
        getFilter,
 | 
						|
        setFilter,
 | 
						|
        meta: inner.meta,
 | 
						|
        filterString,
 | 
						|
        router,
 | 
						|
        toFilterString,
 | 
						|
        reloadPage,
 | 
						|
        axios,
 | 
						|
    };
 | 
						|
}
 | 
						|
 | 
						|
const indexProps = {
 | 
						|
    data: {
 | 
						|
        default: () => {
 | 
						|
            return {data: [], meta: {}};
 | 
						|
        },
 | 
						|
        type: Object,
 | 
						|
    },
 | 
						|
};
 | 
						|
 | 
						|
export {indexProps};
 |