const io = require('./socket.io-mp') var user = require('./services/user.js'); const api = require('/config/api.js'); const util = require('/utils/util.js'); const getUserInfo = require('/utils/getUserInfo').default; const UNLOGIN = 'NO_LOGIN' const btoa = require('./utils/btoa') import remote from './config.js' var app = getApp(); var isIos = false wx.getSystemInfo({ success: function (res) { isIos = res.platform == "ios" } }) let urlToJson = (url = window.location.href) => { // 箭头函数默认传值为当前页面url let obj = {}, index = url.indexOf('?'), // 看url有没有参数 params = url.substr(index + 1); // 截取url参数部分 id = 1 & type = 2 if (index != -1) { // 有参数时 let parr = params.split('&'); // 将参数分割成数组 ["id = 1 ", " type = 2"] for (let i of parr) { // 遍历数组 let arr = i.split('='); // 1) i id = 1 arr = [id, 1] 2)i type = 2 arr = [type, 2] obj[arr[0]] = arr[1]; // obj[arr[0]] = id, obj.id = 1 obj[arr[0]] = type, obj.type = 2 } } return obj; } export default { joinUrl() { let info = this.getUserInfo() let options = { API_BASE_URL: api.API_BASE_URL, "url": this.data.url, "reload": this.data.reload, "token": info.token, "code": this.mcode, "brandId": this.options.id, "open": this.data.showCommodity, "pauseVideo": this.pauseVideo, "bottom": this.data.bottom || 0, socket: { socketHost: remote.socketHost, path: '/fsl-node', options: { ...this.data.socketOptions, nickname: encodeURI(encodeURI(this.data.socketOptions.nickname)) } } } console.error('joinurl11', options.url) // let base = 'http://127.0.0.1:5500/index.html' let base = remote.viewHost + '/shop-container/index.html?m=' + Date.now() // let base = remote.viewHost + '/shop.html' this.data.reload = false this.data.showCommodity = false if (!this.data.webviewUrl) { // this.setData({ // 'webviewUrl': base + '#' + JSON.stringify(options) // }) this.setData({ 'webviewUrl': options.url }) } else { if (getCurrentPages().length === 1) { wx.redirectTo({ url: '/pages/index/index.js', }) } else { wx.navigateBack({ delta: 0, }) } this.socketSendMessage('clientSyncAction', { sender: 'h5', type: 'hashChange', data: options }) } // let INFO = this.getUserInfo() // wx.setClipboardData({ // data: JSON.stringify(INFO), // }) }, onShow() { this.setData({ isIos, showComtypesAllTab: false }) if (this.socketSendMessage) { this.socketSendMessage('changeOnlineStatus', { status: true }) } }, changeShowComtypesAllTab(ev) { this.setData({ showCommodity: false }) setTimeout(() => { this.setData({ showComtypesAllTab: ev.currentTarget.dataset.show, showCommodity: true }) }, 100) }, async authorizeRecord() { let isAuth = await new Promise((r, j) => { wx.authorize({ scope: 'scope.record', success: () => r(true), fail: () => r(false) }) }) if (isAuth) return true let res = await new Promise(r => { wx.showModal({ title: '提示', content: '您未授权录音,说话功能将无法使用', showCancel: true, confirmText: "授权", confirmColor: "#52a2d8", success: res => r(res), fail: () => r(false) }) }) if (!res || res.cancel) return; isAuth = await new Promise((r) => { wx.openSetting({ success: res => r(res.authSetting['scope.record']), fail: () => r(false) }) }) return isAuth }, getUserInfo, login() { getApp().setLoginProps(false) }, async getSocketOptions(sceneId, roomId) { let room = roomId || (Number(Date.now().toString().slice(4)) + parseInt((Math.random() * 1000))) // let room = '147852' let userInfo = await this.getUserInfo() return { role: this.role || 'leader', userId: userInfo.userId, avatar: userInfo.avatar, nickname: userInfo.nickName, voiceStatus: getApp().globalData.voiceProps.noMute ? 0 : 2, enableTalk: this.role === 'leader' ? true : undefined, roomId: room, sceneNumber: sceneId, onlineStatus: true, userLimitNum: 30 } }, async socketStart({ sceneId, roomId, options }) { if (!options) { options = await this.getSocketOptions(sceneId, roomId) } console.log('小程序参数', options) let socket = io(remote.socketHost, { path: '/fsl-node', query: { ...options, isClient: true } }) console.error('新建socket Room', options.roomId) this.setData({ socketStatus: 0 }) socket.on('connect', () => { console.log('socket connect...') this.setData({ socketStatus: 1 }) }) socket.on('connect_error', () => { this.setData({ socketStatus: -1 }) this.__stop || socket.connect() wx.setStorageSync('testSocketw', wx.getStorageSync('testSocketw') + ' connect_error') }) socket.on('connect_timeout', () => { this.setData({ socketStatus: -1 }) this.__stop || socket.connect() wx.setStorageSync('testSocketw', wx.getStorageSync('connect_timeout') + ' connect_timeout') }) socket.on('disconnect', () => { this.setData({ socketStatus: -1 }) this.__stop || socket.connect() wx.setStorageSync('testSocketw', wx.getStorageSync('connect_timeout') + ' disconnect') }) socket.on('reconnect', () => { this.setData({ socketStatus: 0 }) let noMute = getApp().globalData.voiceProps.noMute this.socketSendMessage('changeVoiceStatus', { status: noMute ? 0 : 2 }) this.socketSendMessage('changeOnlineStatus', { status: true }) }) socket.on('reconnect_failed', () => { this.setData({ socketStatus: -1 }) this.__stop || socket.connect() }) socket.on('error', () => { this.setData({ socketStatus: -1 }) this.__stop || socket.connect() }) this.socketSendMessage = (event, obj) => { console.error('发送 socket Room', options.roomId, event, obj) socket.emit(event, obj) } socket.on('clientSyncAction', (data) => { console.log('调用', data.type, '方法', data) if (this[data.type]) { this[data.type](data) } else { console.error('没有', data.type, '方法') } }) socket.on('action', (data) => { console.log('打开action', data) if (data.type === 'navigateToGoods') { this.navigateToGoodsAction(data.data) } }) socket.on('changeRoomEnableTalk', config => { if (this.role !== 'leader') { this.changeRoomEnableTalk(config) } }) socket.on('startCall', this.startCall.bind(this)) socket.on('stopCall', (data) => { console.log('on stopCall') this.stopCall(data) }) socket.on('someOneInRoom', this.startCall.bind(this)) socket.on('someOneLeaveRoom', (user, data) => { this.handleSomeOneLeave(user) }) socket.on('roomClose', (data) => { console.log('on roomClose') this.stopCall(data) }) this.socketStop = () => { socket.close() this.__stop = true console.error('断开 并滞空 socket Room', options.roomId) this.setData({ socketStatus: 2 }) socket = null } return options }, changeRoomEnableTalk(data) { console.log(data) let noMute = getApp().globalData.voiceProps.noMute getApp().globalData.voiceProps.force = data.enableTalk // noMute true 静音 // enableTalk false 静音 if (!!data.enableTalk === !!noMute) { this.mic() } }, navigateToGoods({ data }) { // wx.showToast({ // title: JSON.stringify(data).substr(40) // }) this.navigateToGoodsAction(data) }, navigateToGoodsAction(id) { wx.navigateTo({ url: '/pages/goods/goods?id=' + id, }) }, getUrl(url, socketOptions, isJoin) { let token = this.getUserInfo().token url += '&room_id=' + socketOptions.roomId + '&user_id=' + socketOptions.userId + '&API_BASE_URL=' + api.API_BASE_URL + '&X-Nideshop-Token=' + token + '&special=' + ~this.data.handleScenes.indexOf(this.data.sceneNumber); url += '&detailApi=' + api.fireDetail + '&attachListApi=' + api.getAttachList + '&token=' + token if (isJoin) { url += '&role=customer&shopping' } console.log(api.fireDetail) return url }, navigateToMiniProgram(data) { wx.showModal({ title: '温馨提示', content: '即将跳到其他小程序,是否继续?', showCancel: true, //是否显示取消按钮 cancelText: "取消", //默认是“取消” confirmText: "确定", //默认是“确定” success: function (res) { if (res.cancel) { //点击取消,wx.navigateBack } else { wx.navigateToMiniProgram(data.data) } }, fail: function (res) { //接口调用失败的回调函数,wx.navigateBack }, complete: function (res) { //接口调用结束的回调函数(调用成功、失败都会执行) }, }) }, async startCall(data) { console.error(data, 'startcall') if (!data) return; if (!this.isAuthorizeRecord) { const voiceStatus = Number(await this.authorizeRecord()) this.isAuthorizeRecord = true getApp().setVoiceProps({ noMute: !voiceStatus }) console.log(getApp().globalData.voiceProps.noMute) // this.socketSendMessage('changeVoiceStatus', { // status: getApp().globalData.voiceProps.noMute ? 0 : 2 // }) this.data.socketOptions.voiceStatus = 1 } const socketOptions = this.data.socketOptions getApp().globalData.roomId = socketOptions.roomId console.error('roomid', getApp().globalData.roomId) const user = data.roomsPerson.find(user => user.userId == socketOptions.userId) console.log(user, data.roomsPerson, 'staer') if (!user) { return } if (data.roomsPerson.length <= 1) { return } user.noMute = getApp().globalData.voiceProps.noMute getApp().setVoiceProps({ ...user, action: 'startCall' }) this.socketSendMessage('changeVoiceStatus', { status: getApp().globalData.voiceProps.noMute ? 0 : 2 }) }, stopCall() { console.error('stopCall') this.socketSendMessage('stopCall') getApp().setVoiceProps({ noMute: false, action: 'stopCall' }) if (this.runManager) { // this.recorderManager.stop() this.runManager = false } }, handleSomeOneLeave(data) { if (data.roomsPerson.length <= 1) { // this.stopCall() } }, async newRoom(data) { this.exit() return; if (data.roomId) return; this.stopCall() getApp().globalData.rtcParams = [] getApp().globalData.pusher = '' this.role = 'leader' let options = await this.getSocketOptions(this.mcode) console.error('发送H5 newRoom', options) this.socketSendMessage('clientSyncAction', { type: 'newRoom', data: options }) setTimeout(async () => { this.wssSuccess = false this.socketStop && this.socketStop() let base = this.base let socketOptions = await this.socketStart({ options }) let url = this.getUrl(base, socketOptions, false) + (this.urlPj || '') this.base = base this.setData({ url, socketOptions, }) this.joinUrl() this.setData({ socketOptions }) this.loadConponSuccess = true this.readySendCouponCtrl() }, 300) }, async exit() { this.stopCall() getApp().globalData.rtcParams = [] getApp().globalData.pusher = '' this.socketStop && this.socketStop() // this.role = 'leader' return wx.reLaunch({ url: '/pages/index/index' }) let base = this.base let socketOptions = await this.socketStart({ sceneId: this.mcode }) let url = this.getUrl(base, socketOptions, false) + (this.urlPj || '') this.base = base wx.nextTick(() => { setTimeout(() => { this.setData({ url, loadUrl: true, socketOptions, showCommodityCtrl: false, hideWebView: false, reload: true }) this.joinUrl() }, 500) }) }, async mic() { let noMute = getApp().globalData.voiceProps.noMute // noMute true 静音 // enableTalk false 静音 // if (!!getApp().globalData.voiceProps.force === !!noMute) // return // if (!getApp().globalData.voiceProps.force && (!this.data.socketOptions.voiceStatus || noMute)) return; if (!this.data.socketOptions.voiceStatus) { let voiceStatus = await this.authorizeRecord() if (voiceStatus) { this.data.socketOptions.voiceStatus = 1 noMute = false } else { noMute = true } } else { noMute = !noMute } getApp().globalData.voiceProps.noMute = noMute this.socketSendMessage('changeVoiceStatus', { status: noMute ? 0 : 2 }) getApp().setVoiceProps({ noMute }) wx.showToast({ title: `已${noMute ? '关闭' : '开启'}麦克风`, }) }, callPhone() { wx.makePhoneCall({ phoneNumber: '400-2586366', }) this.setData({ showContact: false }) }, /** * 用户点击右上角分享 */ onShareAppMessage: function (res) { let { id, newPicUrl } = this.data if (res.from === 'button') { this.setData({ sendShare: false }) console.error('shareRoomId', this.data.socketOptions.roomId) return { title: '邀您共享VR火调现场,快加入吧!', imageUrl: newPicUrl, path: `/pages/webview/index?id=${id}&join=true&roomId=${this.data.socketOptions.roomId}`, } } else { return { imageUrl: newPicUrl, path: `/pages/webview/index?id=${id}&join=false`, } } }, /** * 生命周期函数--监听页面卸载 */ onUnload: async function () { await new Promise(r => setTimeout(r, 100)) let pages = getCurrentPages() let options = pages[pages.length - 1].options; if (options.repeat === true || options.repeat === 'true') { return; } console.error(options) let a = wx.getStorageSync('testSocket') + ' unload' wx.setStorageSync('testSocket', a) console.error('set', a) console.error('get', wx.getStorageSync('testSocket')) this.socketSendMessage('stopCall', {}) this.stopCall() this.socketStop() getApp().globalData.pusher = '' wx.navigateBack({ delta: 0, }) }, cart(data) { this.setData({ showCommodityCtrl: data.data }) }, viewFile(data) { console.error(data.data) this.setData({readfile: true}) let seft = this wx.downloadFile({ url: data.data, //要预览的PDF的地址 success: function (res) { if (res.statusCode === 200) { //成功 var Path = res.tempFilePath seft.setData({readfile: false}) //返回的文件临时地址,用于后面打开本地预览所用 let mime = res.header['Content-Type'] || res.header['content-type'] if (~mime.indexOf('jpg') || ~mime.indexOf('jpeg')) { wx.previewImage({urls: [Path], success() { seft.openFile = true }}) } else { wx.openDocument({ filePath: Path, //要打开的文件路径 success: function (res) { console.log('打开PDF成功'); seft.openFile = true }, fail: function (res) { console.error(res); } }) } } else { console.error(res) } }, fail: function (res) { console.error(res); seft.setData({readfile: false}) //失败 } }) }, share(data) { const companyName = `良房一聽` const vrLink = `/pages/webview/index` const img_url = this.data.newPicUrl || 'http://video.cgaii.com/new4dage/images/images/home_2_a.jpg' const shareImg = img_url let id = data.data || this.data.id this.count = this.count || 0 wx.navigateTo({ url: `/pages/shared/shared?img_url=${btoa(img_url)}&shareImg=${btoa(shareImg)}&companyName=${companyName}&vrLink=${btoa(vrLink)}&id=${id}`, }) }, back(data) { if (data.sender !== 'h5') return; // return this.exit() wx.reLaunch({ url: '/pages/index/index' }) this.setData({ showCommodityCtrl: false }) }, service() { this.setData({ showContact: true, showCommodity: false, showCoupon: false }) }, invite(data) { console.log('---', data) if (data.sender !== 'h5') return; this.setData({ sendShare: true, count: ++this.data.count }) }, coupon(data) { if (data.sender !== 'h5') return; this.setData({ showContact: false, showCommodity: false, showCoupon: true }) }, liveGotoGood(ev) { let id = ev.currentTarget.dataset.item.goodsId wx.navigateTo({ url: '/pages/goods/goods?id=' + id, }) }, gotoGoodsDOM(event) { this.gotoGoods(event.currentTarget.dataset.item.hotIdList[0]) }, gotoGoodsSocket(data) { this.gotoGoods(data.data) }, gotoGoods(id) { console.log('---', id) this.socketSendMessage('clientSyncAction', { type: 'openTag', data: id }) this.setData({ showCommodity: false }) this.joinUrl() }, // 加入购物车 addCard(data) { wx.navigateTo({ url: '/pages/goods/goods?id=' + data.data // url: '/pages/goods/goods?id=' + data.data + '&oper=addCard', }) }, // 立即购买 buyGoods(data) { wx.navigateTo({ url: '/pages/goods/goods?id=' + data.data // url: '/pages/goods/goods?id=' + data.data + '&oper=buyGoods', }) }, // addCard(event) { // wx.navigateTo({ // url: '/pages/goods/goods?id=' + event.currentTarget.dataset.id + '&oper=addCard', // }) // }, // buyGoods(event) { // wx.navigateTo({ // url: '/pages/goods/goods?id=' + event.currentTarget.dataset.id + '&oper=buyGoods', // }) // }, showCommodityFn() { this.setData({ showCommodity: true, showContact: false, showCoupon: false }) this.joinUrl() }, hideComodity() { this.setData({ showCommodity: false }) this.joinUrl() }, hideCoupon() { this.setData({ showCoupon: !this.data.showCoupon }) }, async receive(ev) { let item = ev.target.dataset.item try { // wx.showToast({ // title: '领取优惠卷', // }) // return; if (item.hasReceived || item.number <= item.receiveNumber) return; let res = await util.request(api.CouponExchange, { couponId: item.id }) if (res.code === 0) { wx.showToast({ title: '已成功领取', success: () => { this.setData({ showCoupon: false }) wx.nextTick(() => { this.setData({ coupons: this.data.coupons.map(citem => { return { ...citem, hasReceived: citem.id === item.id ? true : citem.hasReceived } }), showCoupon: true }) }) } }) } else if (res.errno === 401) { getApp().setLoginProps(false) } else { wx.showToast({ title: res.msg, }) } } catch (e) { console.error(e) wx.showToast({ icon: 'none', title: '领取失败', }) } }, async getCouponList(id) { const success = (res) => { this.setData({ coupons: res.data.list.map(item => { item.typeMoney = item.typeMoney.toString() item.fontSize = item.typeMoney.length === 3 ? '90rpx' : item.typeMoney.length === 4 ? '70rpx' : '130rpx' return item }) }) this.loadConponSuccess = true this.readySendCouponCtrl() } let res = await util.request(api.BrandCouponList, { brandId: id, pageNum: 1, pageSize: 10000 }, 'GET') console.log(res) if (res.code === 0) { success(res) } else { let res = await util.request(api.UNBrandCouponList, { brandId: id, pageNum: 1, pageSize: 10000 }, 'GET') success(res) } }, ready() { this.wssSuccess = true this.readySendCouponCtrl() }, readySendCouponCtrl() { if (this.wssSuccess && this.loadConponSuccess) { this.loadConponSuccess = false this.socketSendMessage('clientSyncAction', { type: 'showCoupon', data: this.data.coupons.length > 0 }) } }, getBrand: function (id, code) { return; let that = this; util.request(api.SueneCategory, { sceneNum: code }, 'GET').then(function (res) { if (res.code === 0) { const comtypes = res.list.map(item => { item.width = (item.name.length + (item.num.toString().length / 2) + 2) * 16 return { ...item } }) that.setData({ comWidth: comtypes.reduce((a, b) => a + b.width + 10, 0), comtypes, thumComtypes: (!isIos && comtypes.length > 3) ? comtypes.slice(0, 3) : null, currTypeId: comtypes.length > 0 && comtypes[0].category_id }); wx.showToast({ title: 'currTypeId' + that.data.currTypeId.length, }) that.data.currTypeId && that.getGoodsList(id, that.data.currTypeId); } }); }, getGoodsCount(code, id) { util.request(api.GoodsNumCount, { isDelete: 0, isOnSale: 1, brandId: id }, 'GET') .then(res => { if (res.code === 0) { this.setData({ goodsCount: res.data }) } this.getCouponList(id) }) }, getGoodsList(id, category_id) { var that = this; if (!(this.data.navList && this.data.navList.length)) { that.navDatas = {} let navDatas = this.data.navList = this.data.comtypes // util.request(api.GoodsCategory, { id: category_id }) // .then(function (res) { // if (res.errno == 0) { // let navDatas = res.data.brotherCategory // that.setData({ // navList: navDatas, // currTypeId: category_id // }); that.navDatas = {} navDatas.forEach(item => { util.request(api.GoodsList, { brandId: id, categoryId: item.category_id, page: that.data.page, size: that.data.size }) .then(res => { if (res.errno === 0) { that.navDatas[item.category_id] = res.data.goodsList } }) }) // } // }) } if (that.navDatas[category_id]) { if (!isIos) { let showCommodity = that.data.showCommodity that.setData({ showCommodity: false }) setTimeout(() => { wx.nextTick(() => { that.setData({ goodsList: that.navDatas[category_id], currTypeId: category_id, showCommodity: showCommodity }); }) }, 500) } else { that.setData({ goodsList: that.navDatas[category_id], currTypeId: category_id, }); } } else { console.error('诱惑去啦') util.request(api.GoodsList, { brandId: id, categoryId: category_id, page: that.data.page, size: that.data.size }) .then(function (res) { if (res.errno === 0) { that.setData({ goodsList: res.data.goodsList, currTypeId: category_id }); // this.data.navList } }); } }, getBrandDetail: function (id, cb) { util.request(api.fireDetail, { projectId: id }, 'get').then((res) => { // let base = res.data.vrLink // remote.viewHost = // let base = 'http://192.168.0.109:8080' + '/fire-control.html' + res.data.vrLink.substr(res.data.vrLink.indexOf('?')) + '&vlog&origin=fashilong' // remote.viewHost let base = remote.viewHost + '/fire-control.html' + res.data.vrLink.substr(res.data.vrLink.indexOf('?')) + '&origin=fashilong' if (res.code === 0) { let url = base + "&sid=" + id this.setData({ id: id, sceneNum: res.data.sceneNum }) console.log(url, urlToJson(url).m) cb(url, urlToJson(url).m, ) } }); }, selectType(ev) { this.getGoodsList(this.options.id, ev.target.dataset.item.category_id) }, hideCS() { this.setData({ showCommodity: false, showCoupon: false, showContact: false }) }, hideContact() { this.setData({ showContact: false }) }, calcShare() { // this.exit() this.setData({ sendShare: false }) }, contactKf() { let keys = Object.keys(this.navDatas) let goodsId = this.navDatas[keys[0]][0].id let user = wx.getStorageSync('userinfoDetail') util.request(api.AddTalkCount, { goodsId, viewId: user && user.userId || '', sceneNum: this.data.sceneNum }, 'get') this.hideAlert && this.hideAlert() this.hideContact && this.hideContact() }, onHide() { this.socketSendMessage('changeOnlineStatus', { status: false }) // this.pauseVideo = true // this.joinUrl() } }