ykt-team-wxapp/hooks/useGuard.js

73 lines
2.0 KiB
JavaScript
Raw Normal View History

2026-01-20 19:36:49 +08:00
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 }
}