ykt-team-wxapp/hooks/useGuard.js
2026-01-20 19:36:49 +08:00

73 lines
2.0 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { ref } from 'vue';
import { storeToRefs } from 'pinia'
import { onLoad, onShow } from "@dcloudio/uni-app";
import routes from '@/routes';
import useAccount from '@/store/account';
import { triggerPromise } from '@/utils';
/**
* 页面校验登录hook
* hook逻辑
* 1. 根据routes配置判断当前页面是否需要登录
* 2. 如果需要登录,则判断是否已经登录,如果没有登录则跳转到登录页面
* 3. 如果已经登录则触发onLoad事件
* 4. 如果页面需要登录,则登录成功后跳转到当前页面
* @returns
*/
export default function useGuard() {
const { account } = storeToRefs(useAccount());
const { login } = useAccount();
const { resolve, promise } = triggerPromise();
const onShowEvents = ref([]);
const options = ref({})
const onShowOptions = ref({})
function toLoginPage(options, path) {
const params = Object.keys(options).map(key => `${key}=${options[key]}`).join('&');
const redirectUrl = encodeURIComponent(`${path}?${params}`);
uni.redirectTo({
url: `/pages/login/login?redirect=${redirectUrl}`
})
}
async function useLoad(fn) {
await promise;
fn(options.value);
}
async function triggleShowEvents() {
await promise;
onShowEvents.value.forEach(fn => fn(onShowOptions.value))
}
function useShow(fn) {
onShowEvents.value.push(fn)
}
onLoad(async opts => {
options.value = { ...opts };
const pages = getCurrentPages();
const page = pages[pages.length - 1];
const route = routes.find(i => page && i.path === page.route);
const requireLogin = route && route.meta && route.meta.login;
if (requireLogin && !account.value) {
const res = await login()
if (res) {
resolve()
} else {
return toLoginPage(opts, page.route);
}
}
resolve()
})
onShow(opts => {
console.log('onShow')
onShowOptions.value = { ...opts };
triggleShowEvents()
})
return { useLoad, useShow }
}