useWechatBinding.js 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. import { computed, onUnmounted, reactive } from 'vue'
  2. import { onHide, onShow } from '@dcloudio/uni-app'
  3. import { useUserStore } from '@/stores/user'
  4. import { PAGE_PATHS } from '@/config/api'
  5. import { fetchWechatNoticeStatus, startWechatBinding, fetchWechatBindingSession, confirmWechatBinding } from '@/api/wechat-notices'
  6. import { createWechatBindingFlow, initialBindingState } from '@/utils/wechatBindingFlow'
  7. export function useWechatBinding() {
  8. const user = useUserStore()
  9. const bindingState = reactive(initialBindingState())
  10. let active = false
  11. const bindingAccount = computed(() => user.userInfo?.realName || user.userInfo?.username || '当前登录账号')
  12. const flow = createWechatBindingFlow({
  13. state: bindingState,
  14. getSessionKey: () => user.isLoggedIn ? user.token : '',
  15. isActive: () => active,
  16. api: { status: fetchWechatNoticeStatus, start: startWechatBinding, session: fetchWechatBindingSession, confirm: confirmWechatBinding },
  17. openAuthorization: (authorizeUrl) => new Promise((resolve, reject) => {
  18. uni.navigateTo({
  19. url: PAGE_PATHS.wechatBindingAuthorize,
  20. success: (result) => {
  21. result.eventChannel.emit('wechatBindingAuthorize', { authorizeUrl })
  22. resolve()
  23. },
  24. fail: () => reject(new Error('打开授权页面失败,请重新绑定'))
  25. })
  26. })
  27. })
  28. onShow(() => {
  29. active = true
  30. user.checkLoginStatus()
  31. if (!user.isLoggedIn) { uni.reLaunch({ url: PAGE_PATHS.login }); return }
  32. void flow.refresh()
  33. })
  34. const stop = () => { active = false; flow.cancel() }
  35. onHide(stop)
  36. onUnmounted(stop)
  37. return { bindingState, bindingAccount, startBinding: flow.start, refreshBinding: flow.refresh }
  38. }