import { doChangeTabActive } from '@/module-model/tab' import { openDialog, closeDialog, canShowDialog } from '@/module-model/dialog' import loginCookie from '@/module-model/loginCookies' import { ScanCodeLoginDetection } from '@/utils/Login' import { doSetPageShareId } from '@/module-model/wxQrcode' import { getADInfo } from '@/module-model/loginLeftAd' import { clearAllStorageOfReg, trackReport } from '@/utils/common' import { ajaxSetSignOut } from '@/api' import LoginAuth from '@/lib/pluginLoginAuth' import core from '@/lib/core' import { dispatchCallback, transformResponse } from '@/lib/module' import { shareState, updateShareState } from '@/module-model/globalState' class PluginLogin { hasInited: boolean options: Record poll: any emitter: any constructor({ emitter }) { this.hasInited = false this.options = {} this.emitter = emitter this.poll = null this.addListener() } addListener () { // 登录成功后关闭轮询 this.emitter.$on('user-login-success', this.stop.bind(this)) // 更新全局用户状态 this.emitter.$on('user-info-update', this.setState.bind(this)) } init(options) { if (this.hasInited) { console.warn('pluginLogin hasInited') return } this.hasInited = true this.options = Object.assign( { // 立即获取当前登录信息 preloadLoginState: true, // 页面 num pageNum: -1, // 立即预加载弹窗左侧广告图片 preloadDialogImage: false, // 自动打开弹窗 autoOpen: false, type: 'login-code', // 立即获取二维码并自动监听微信扫码登录 preloadWeChatImage: false }, options ) this.poll = null if (this.options.preloadDialogImage) { this.preload() } if (this.options.preloadLoginState) { this.initPoll() this.poll.preload() } if (this.options.preloadWeChatImage) { this.start() } if (this.options.autoOpen) { this.open(this.options.type) } } /** * 预加载 */ preload() { // 预加载弹窗左侧广告 getADInfo() } /** * 根据 type 打开弹窗并通知 * @param type - 类型 */ open(type = 'login-code') { doChangeTabActive(type) openDialog() this.emit('open', type) } /** * 关闭弹窗并通知 * @param type */ close(type = '') { closeDialog() this.emit('close', type) } /** * 尝试调用 options 配置的公共回调函数 * @param type - 函数名称 * @param data - 参数 */ emit(type, data = null) { if (typeof this.options[type] === 'function') { this.options[type](data) } else { console.warn('[plugin-login]: not find emit function:', type) } } /** * 初始化登录检查轮询器 */ initPoll() { if (!this.poll) { this.poll = new ScanCodeLoginDetection({ num: this.options.pageNum, update: (type, data) => { if (type === 'shareId') { const { kopShareId, shareId } = data doSetPageShareId(shareId, kopShareId) } if (type === 'login') { this.emit('update', data) this.handleUpdateInfo('poll', data) } }, success: (data) => { this.emit('success', data) this.handleUpdateInfo('poll', data) this.handleSuccess('poll', data) } }) } } /** * 开始轮询 */ start() { this.initPoll() this.poll.start() } /** * 停止轮询 */ stop() { this.poll?.stop() } /** * 获取全局状态 */ getState() { return shareState.value } setState ({ format }) { if (format) { updateShareState(format) } } /** * 退出登录 */ doSignOut() { return ajaxSetSignOut().then(({ data }) => { if (data === 'ok') { clearAllStorageOfReg(/-login-clear/) loginCookie.clear() this.emitUserSignOut() } }) } /** * 处理信息相关更新 * @param type - 类型 * @param data */ handleUpdateInfo (type, data) { this.emitUserInfoUpdate(transformResponse(type, data)) } /** * 处理弹窗业务成功相关 * @param type - 类型 * @param data */ handleSuccess (type, data) { dispatchCallback(type, data) } /** * 广播用户退出事件 */ emitUserSignOut () { this.emitter.$emit('user-sign-out', {}, { cross: true }) } /** * 广播用户信息更新事件 * @param data - 用户信息 */ emitUserInfoUpdate (data) { this.emitter.$emit('user-info-update', data, { cross: true, replay: true }) } /** * 广播用户登录成功事件 * @param data */ emitUserLoginSuccess (data) { if (canShowDialog.value) { this.close('user-login-success') } this.emitter.$emit('user-login-success', data, { cross: true }) } } const pluginLogin = new PluginLogin({ emitter: core }) function addHook (hook) { LoginAuth.register(hook, pluginLogin[hook].bind(pluginLogin)) } // 注入 hooks ['open', 'doSignOut', 'close', 'init', 'getState'].forEach(hook => addHook(hook)) export default pluginLogin