// bootstrap.js
axios.interceptors.response.use(
    response => {
        /**
         * If the response contains authorization header,
         * Then we assume that it is from the renew token request.
         * Set the new JWT token.
         */
        const authHeader = response.headers.authorization;
        if (authHeader) jwt.setToken(authHeader.substr(7));

        return response;
    },
    error => {
        const errorResponseData = error.response.data;
        /**
         * Expired token but still refreshable will hit this condition.
         * We then trying to renew the expired token.
         * Also passing the failed request as a callback to retry failed request.
         */
        if (errorResponseData.message === 'Token has expired' && errorResponseData.statusCode === 401) {
            return store.dispatch('auth/renewToken', error.response.config)
                .then(response => {
                    if (response.status === 201 || response.status === 200) {
                        return Promise.resolve(response);
                    }
                });
        }

        return Promise.reject(error);
    }
);



// entry file (main.js)
store.dispatch('auth/getAuthUser')
    .then(_ => {
        return new Vue({
            el: '#app', store, router,
        });
    })
    .catch(_ => {
        jwt.clearToken();

        return new Vue({
            el: '#app', store, router, 
        });
    });