123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247 |
- 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<string, any>
- 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
|