import { GUIDE_LOGIN_KEY } from '../constants/mock' import { request } from '../utils/request' let listenersRegistered = false export function initializePush() { // #ifdef APP-PLUS registerPushListeners() return registerPushClient() // #endif return Promise.resolve(false) } function registerPushClient(attempt = 0) { const loginState = uni.getStorageSync(GUIDE_LOGIN_KEY) if (!loginState || !loginState.token) return Promise.resolve(false) const clientInfo = plus.push.getClientInfo() const cid = clientInfo && clientInfo.clientid if (!cid) { if (attempt >= 5) return Promise.resolve(false) return new Promise((resolve) => { setTimeout(() => resolve(registerPushClient(attempt + 1)), 2000) }) } return request({ url: '/guide/push-device', method: 'PUT', data: { cid, platform: plus.os && plus.os.name ? plus.os.name : 'UNKNOWN' } }).then(() => true).catch(() => false) } function registerPushListeners() { if (listenersRegistered) return listenersRegistered = true plus.push.addEventListener('click', (message) => { const payload = parsePayload(message && message.payload) if (!payload.targetUrl) return uni.navigateTo({ url: payload.targetUrl }) }) } function parsePayload(payload) { if (!payload) return {} if (typeof payload === 'object') return payload try { return JSON.parse(payload) } catch (error) { return {} } }