dashboard/shell/plugins/extend-router.js

81 lines
2.5 KiB
JavaScript

// import VueRouter from 'vue-router';
import isEqual from 'lodash/isEqual';
import { queryParamsFor } from '@shell/utils/router';
// We're consuming the errors of the push and replace functions based on this comment:
// https://github.com/vuejs/vue-router/issues/2881#issuecomment-520554378
// const originalPush = VueRouter.prototype.push;
// VueRouter.prototype.push = function push(location, onResolve, onReject) {
// if (onResolve || onReject) {
// return originalPush.call(this, location, onResolve, onReject);
// }
// return originalPush?.call(this, location)?.catch((err) => {
// if (VueRouter.isNavigationFailure(err)) {
// // If there really is an error, throw it
// return Promise.reject(err);
// }
// // Otherwise resolve to false to indicate the original push call didn't go to its original destination.
// return Promise.resolve(false);
// });
// };
// const originalReplace = VueRouter.prototype.replace;
// VueRouter.prototype.replace = function replace(location, onResolve, onReject) {
// if (onResolve || onReject) {
// return originalReplace.call(this, location, onResolve, onReject);
// }
// return originalReplace.call(this, location).catch((err) => {
// if (VueRouter.isNavigationFailure(err)) {
// // resolve err
// return err;
// }
// // rethrow error
// return Promise.reject(err);
// });
// };
// VueRouter.prototype.applyQuery = function(qp, defaults = {}) {
// const query = queryParamsFor(this.currentRoute.query, qp, defaults);
// const hash = this.currentRoute.hash || '';
// if ( isEqual(query, this.currentRoute.query) ) {
// return;
// }
// return this.replace({ query, hash }).catch((err) => {
// if ( err?.name === 'NavigationDuplicated' ) {
// // Do nothing, this is fine...
// // https://github.com/vuejs/vue-router/issues/2872
// } else {
// throw err;
// }
// });
// };
export const extendRouter = (router) => {
router.applyQuery = function(qp, defaults = {}) {
const query = queryParamsFor(router.currentRoute.value.query, qp, defaults);
const hash = router.currentRoute.value.hash || '';
if (isEqual(query, router.currentRoute.value.query)) {
return;
}
return router.replace({ query, hash }).catch((err) => {
if (err && err.name === 'NavigationDuplicated') {
// Do nothing, this is fine...
// https://github.com/vuejs/vue-router/issues/2872
} else {
throw err;
}
});
};
};