ResizeHandler.js 1.5 KB
import store from '@/store';

const {
    body
} = document;
const WIDTH = 992; // refer to Bootstrap's responsive design

export default {
    watch: {
        $route(route) {
            if (this.device === 'mobile' && this.sidebar.opened) {
                store.dispatch('app/closeSideBar', {
                    withoutAnimation: false
                });
            }
        }
    },
    beforeMount() {
        window.addEventListener('resize', this.$_resizeHandler);
    },
    beforeDestroy() {
        window.removeEventListener('resize', this.$_resizeHandler);
    },
    mounted() {
        const isMobile = this.$_isMobile();
        if (isMobile) {
            store.dispatch('app/toggleDevice', 'mobile');
            store.dispatch('app/closeSideBar', {
                withoutAnimation: true
            });
        }
    },
    methods: {
        // use $_ for mixins properties
        // https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential
        $_isMobile() {
            const rect = body.getBoundingClientRect();
            return rect.width - 1 < WIDTH;
        },
        $_resizeHandler() {
            if (!document.hidden) {
                const isMobile = this.$_isMobile();
                store.dispatch('app/toggleDevice', isMobile ? 'mobile' : 'desktop');

                if (isMobile) {
                    store.dispatch('app/closeSideBar', {
                        withoutAnimation: true
                    });
                }
            }
        }
    }
};