| 123456789101112131415161718192021222324252627282930313233343536373839 |
- import { computed, onUnmounted, reactive } from 'vue'
- import { onHide, onShow } from '@dcloudio/uni-app'
- import { useUserStore } from '@/stores/user'
- import { PAGE_PATHS } from '@/config/api'
- import { fetchWechatNoticeStatus, startWechatBinding, fetchWechatBindingSession, confirmWechatBinding } from '@/api/wechat-notices'
- import { createWechatBindingFlow, initialBindingState } from '@/utils/wechatBindingFlow'
- export function useWechatBinding() {
- const user = useUserStore()
- const bindingState = reactive(initialBindingState())
- let active = false
- const bindingAccount = computed(() => user.userInfo?.realName || user.userInfo?.username || '当前登录账号')
- const flow = createWechatBindingFlow({
- state: bindingState,
- getSessionKey: () => user.isLoggedIn ? user.token : '',
- isActive: () => active,
- api: { status: fetchWechatNoticeStatus, start: startWechatBinding, session: fetchWechatBindingSession, confirm: confirmWechatBinding },
- openAuthorization: (authorizeUrl) => new Promise((resolve, reject) => {
- uni.navigateTo({
- url: PAGE_PATHS.wechatBindingAuthorize,
- success: (result) => {
- result.eventChannel.emit('wechatBindingAuthorize', { authorizeUrl })
- resolve()
- },
- fail: () => reject(new Error('打开授权页面失败,请重新绑定'))
- })
- })
- })
- onShow(() => {
- active = true
- user.checkLoginStatus()
- if (!user.isLoggedIn) { uni.reLaunch({ url: PAGE_PATHS.login }); return }
- void flow.refresh()
- })
- const stop = () => { active = false; flow.cancel() }
- onHide(stop)
- onUnmounted(stop)
- return { bindingState, bindingAccount, startBinding: flow.start, refreshBinding: flow.refresh }
- }
|