Vulture/VApp/node_modules/vuetify/lib/composables/router.mjs

77 lines
2.3 KiB
JavaScript

// Utilities
import { computed, nextTick, onScopeDispose, resolveDynamicComponent, toRef } from 'vue';
import { deepEqual, getCurrentInstance, hasEvent, IN_BROWSER, propsFactory } from "../util/index.mjs"; // Types
export function useRoute() {
const vm = getCurrentInstance('useRoute');
return computed(() => vm?.proxy?.$route);
}
export function useRouter() {
return getCurrentInstance('useRouter')?.proxy?.$router;
}
export function useLink(props, attrs) {
const RouterLink = resolveDynamicComponent('RouterLink');
const isLink = computed(() => !!(props.href || props.to));
const isClickable = computed(() => {
return isLink?.value || hasEvent(attrs, 'click') || hasEvent(props, 'click');
});
if (typeof RouterLink === 'string') {
return {
isLink,
isClickable,
href: toRef(props, 'href')
};
}
const link = props.to ? RouterLink.useLink(props) : undefined;
const route = useRoute();
return {
isLink,
isClickable,
route: link?.route,
navigate: link?.navigate,
isActive: link && computed(() => {
if (!props.exact) return link.isActive?.value;
if (!route.value) return link.isExactActive?.value;
return link.isExactActive?.value && deepEqual(link.route.value.query, route.value.query);
}),
href: computed(() => props.to ? link?.route.value.href : props.href)
};
}
export const makeRouterProps = propsFactory({
href: String,
replace: Boolean,
to: [String, Object],
exact: Boolean
}, 'router');
let inTransition = false;
export function useBackButton(router, cb) {
let popped = false;
let removeBefore;
let removeAfter;
if (IN_BROWSER) {
nextTick(() => {
window.addEventListener('popstate', onPopstate);
removeBefore = router?.beforeEach((to, from, next) => {
if (!inTransition) {
setTimeout(() => popped ? cb(next) : next());
} else {
popped ? cb(next) : next();
}
inTransition = true;
});
removeAfter = router?.afterEach(() => {
inTransition = false;
});
});
onScopeDispose(() => {
window.removeEventListener('popstate', onPopstate);
removeBefore?.();
removeAfter?.();
});
}
function onPopstate(e) {
if (e.state?.replaced) return;
popped = true;
setTimeout(() => popped = false);
}
}
//# sourceMappingURL=router.mjs.map