/* eslint-disable */ // #ifdef APP-PLUS let alphaBg, shareMenu; // 关闭弹窗 export const closeShare = function () { alphaBg && alphaBg.close(); alphaBg && shareMenu.close(); }; // 复制 function onCopy(item, shareInfo, callback) { let copyInfo = shareInfo.shareUrl || shareInfo.shareContent || shareInfo.shareImg; if (copyInfo) { uni.setClipboardData({ data: copyInfo, success: () => { uni.showToast({ title: '已复制到剪贴板', icon: 'none' }); callback && callback(item); } }); } } // 更多 function onMore(item, shareInfo, callback) { plus.share.sendWithSystem( { type: 'text', title: shareInfo.shareTitle || '', href: shareInfo.shareUrl || '', content: shareInfo.shareContent || '' }, function (res) { callback && callback(item); }, function (err) { console.log(err); } ); } // 分享 function onShare(item, shareInfo, callback) { if (shareInfo.type == undefined) { shareInfo.type = item.type; } let shareObj = { provider: item.provider, type: shareInfo.type, success: res => { callback && callback(item); console.log('success:' + JSON.stringify(res)); }, fail: err => { console.log('分享失败,参数缺失 fail:' + JSON.stringify(err)); } }; if (shareInfo.shareTitle) { shareObj.title = shareInfo.shareTitle; } else if (item.provider == 'qq') { uni.showToast({ title: '缺失分享的标题', icon: 'none' }); return; } if (shareInfo.type == 0 || item.provider == 'qq') { if (shareInfo.shareUrl) { shareObj.href = shareInfo.shareUrl; } else { uni.showToast({ title: '缺失分享的地址', icon: 'none' }); return; } } if ([0, 1, 3, 4].includes(shareInfo.type)) { if (shareInfo.shareContent) { shareObj.summary = shareInfo.shareContent; } else { uni.showToast({ title: '缺失分享的描述', icon: 'none' }); return; } } if ([0, 2, 5].includes(shareInfo.type)) { if (shareInfo.shareImg) { shareObj.imageUrl = shareInfo.shareImg; } else { uni.showToast({ title: '缺失分享的图片', icon: 'none' }); return; } } if ([3, 4].includes(shareInfo.type)) { if (shareInfo.mediaUrl) { shareObj.mediaUrl = shareInfo.mediaUrl; } else { uni.showToast({ title: '缺失分享的音视频地址', icon: 'none' }); return; } } if (shareInfo.type == 5) { if (shareInfo.appId && shareInfo.appPath && shareInfo.appWebUrl) { shareObj.miniProgram = { id: shareInfo.appId, path: shareInfo.appPath, webUrl: shareInfo.appWebUrl }; if (shareInfo.appType) { shareObj.miniProgram.type = shareInfo.appType; } } else { uni.showToast({ title: '缺失分享小程序的参数', icon: 'none' }); return; } } if (item.scene) { shareObj.scene = item.scene; } uni.share(shareObj); } let otherShareList = [ { icon: '/static/share/icon_copy.png', text: '复制', provider: 'copy', onClick: onCopy }, { icon: '/static/share/icon_more.png', text: '更多', provider: 'more', onClick: onMore } ]; let platformShareList = []; // 获取服务商支持的分享 uni.getProvider({ service: 'share', success: function (res) { if (res.provider.includes('sinaweibo')) { platformShareList = [ { icon: '/static/share/icon_weibo.png', text: '新浪微博', onClick: onShare, provider: 'sinaweibo', type: 0 } ].concat(platformShareList); } if (res.provider.includes('qq')) { platformShareList = [ { icon: '/static/share/icon_qq.png', text: 'QQ', onClick: onShare, provider: 'qq', type: 1 } ].concat(platformShareList); } if (res.provider.includes('weixin')) { platformShareList = [ { icon: '/static/share/icon_weixin.png', text: '微信好友', onClick: onShare, provider: 'weixin', scene: 'WXSceneSession', type: 0 }, { icon: '/static/share/icon_pengyouquan.png', text: '朋友圈', onClick: onShare, provider: 'weixin', scene: 'WXSenceTimeline', type: 0 }, { icon: '/static/share/ic_xiaochengxu.png', text: '小程序', onClick: onShare, provider: 'weixin', scene: 'WXSceneSession', type: 5 } ].concat(platformShareList); } } }); // 根据type类型过滤掉不支持的平台 function platformFilter(data) { console.log(data); let platformList = []; let supportList = [ ['weixin', 'sinaweibo'], ['weixin', 'sinaweibo', 'qq'], ['weixin', 'sinaweibo', 'qq'], ['weixin', 'qq'], ['weixin', 'sinaweibo'], ['weixin'] ]; let currentSupport = []; if (data.type >= 0 && data.type <= 5) { currentSupport = supportList[data.type]; } console.log('platformShareList', platformShareList); platformShareList.forEach(item => { if (data.type >= 0 && data.type <= 5) { if (currentSupport.includes(item.provider)) { if (item.provider == 'weixin') { if (item.text == '小程序') { if (data.type == 5) { platformList.push(item); } } else if (data.type !== 5) { platformList.push(item); } } else { platformList.push(item); } } } else { if (item.provider == 'weixin') { if (item.text == '小程序') { if (data.appId && data.appPath) { platformList.push(item); } } else { platformList.push(item); } } else { platformList.push(item); } } }); return platformList.concat(otherShareList); } // 数据处理 function dataFactory(shareInfo = {}) { let config = { ...shareInfo }; config.shareUrl = shareInfo.shareUrl || ''; config.shareContent = shareInfo.shareContent || '分享的描述'; config.shareImg = shareInfo.shareImg || '分享的图片'; return config; } export default function (shareInfo, callback) { shareInfo = dataFactory(shareInfo); // 以下为计算菜单的nview绘制布局,为固定算法,使用者无关关心 let screenWidth = plus.screen.resolutionWidth; //以360px宽度屏幕为例,上下左右边距及2排按钮边距留25像素,图标宽度55像素,同行图标间的间距在360宽的屏幕是30px,但需要动态计算,以此原则计算4列图标分别的left位置 //图标下的按钮文字距离图标5像素,文字大小12像素 //底部取消按钮高度固定为44px //TODO 未处理横屏和pad,这些情况6个图标应该一排即可 let marginTop = 25, //上间距 marginLeft = 25, //左间距 iconWidth = 55, //图标宽宽 iconHeight = 55, //图标高度 icontextSpace = 10, //图标与文字间距 textHeight = 12; //文字大小 let left1 = (marginLeft / 360) * screenWidth; let colNumber = Math.floor(screenWidth / (iconWidth + marginLeft)); let i = (screenWidth - (iconWidth + marginLeft) * colNumber - marginLeft) / (colNumber + 1); let initMargin = marginLeft + i; let itemWidth = iconWidth + initMargin; let itemHeight = iconHeight + icontextSpace + textHeight + marginTop; let textTop = iconHeight + icontextSpace; alphaBg = new plus.nativeObj.View('alphaBg', { //先创建遮罩层 top: '0px', left: '0px', height: '100%', width: '100%', backgroundColor: 'rgba(0,0,0,0.5)' }); alphaBg.addEventListener('click', function () { //处理遮罩层点击 alphaBg.close(); shareMenu.close(); }); let shareList = platformFilter(shareInfo); shareMenu = new plus.nativeObj.View('shareMenu', { //创建底部图标菜单 bottom: '0px', left: '0px', height: Math.ceil(shareList.length / colNumber) * itemHeight + marginTop + 44 + 1 + 'px', width: '100%', backgroundColor: 'rgb(255,255,255)' }); //绘制底部图标菜单的内容 shareMenu.draw([ { tag: 'rect', //菜单顶部的分割灰线 color: '#e7e7e7', position: { top: '0px', height: '1px' } }, { tag: 'font', id: 'sharecancel', //底部取消按钮的文字 text: '取消分享', textStyles: { size: '14px' }, position: { bottom: '0px', height: '44px' } }, { tag: 'rect', //底部取消按钮的顶部边线 color: '#e7e7e7', position: { bottom: '45px', height: '1px' } } ]); shareList.map((v, k) => { let time = new Date().getTime(); let row = Math.floor(k / colNumber); let col = k % colNumber; let item = [ { src: v.icon, id: Math.random() * 1000 + time, tag: 'img', position: { top: row * itemHeight + marginTop, left: col * itemWidth + initMargin, width: iconWidth, height: iconWidth } }, { text: v.text, id: Math.random() * 1000 + time, tag: 'font', textStyles: { size: textHeight }, position: { top: row * itemHeight + textTop, left: col * itemWidth + initMargin, width: iconWidth, height: iconWidth } } ]; shareMenu.draw(item); }); shareMenu.addEventListener('click', function (e) { //处理底部图标菜单的点击事件,根据点击位置触发不同的逻辑 if (e.screenY > plus.screen.resolutionHeight - 44) { //点击了底部取消按钮 alphaBg.close(); shareMenu.close(); } else if (e.clientX < 5 || e.clientX > screenWidth - 5 || e.clientY < 5) { //屏幕左右边缘5像素及菜单顶部5像素不处理点击 } else { //点击了图标按钮 let x = e.clientX; let y = e.clientY; let colIdx = Math.floor(x / itemWidth); let rowIdx = Math.floor(y / itemHeight); let tapIndex = colIdx + rowIdx * colNumber; shareList[tapIndex].onClick(shareList[tapIndex], shareInfo, callback); } }); alphaBg.show(); shareMenu.show(); return { close: function () { alphaBg && alphaBg.close(); alphaBg && shareMenu.close(); } }; } // #endif /** * 获取分享海报 * @param array store 海报素材 * @param string store_name 素材文字 * @param string price 价格 * @param function successFn 回调函数 * * */ export const PosterCanvas = (store, successCallBack) => { uni.showLoading({ title: '海报生成中', mask: true }); getImageInfo([store.image, store.code]).then(res => { let contentHh = 48 * 1.3 const ctx = uni.createCanvasContext('myCanvas') ctx.clearRect(0, 0, 0, 0); const WIDTH = 747 const HEIGHT = 1326; ctx.fillStyle = "#FFFFFF"; ctx.fillRect(0, 0, WIDTH, HEIGHT); ctx.drawImage(res[0].path, 0, 0, WIDTH, WIDTH); ctx.drawImage(res[1].path, 40, 1064, 200, 200); ctx.save(); let r = 90; let d = r * 2; let cx = 40; let cy = 990; ctx.arc(cx + r, cy + r, r, 0, 2 * Math.PI); ctx.clip(); ctx.restore(); ctx.setTextAlign('center'); ctx.setFontSize(48); ctx.setFillStyle('#000'); ctx.fillText(store.title, WIDTH / 2, 810 + contentHh); ctx.setTextAlign('center') ctx.setFontSize(32); ctx.setFillStyle('red'); ctx.fillText('¥' + store.price, WIDTH / 2, 985); ctx.setTextAlign('center') ctx.setFontSize(22); ctx.setFillStyle('#333333'); ctx.fillText('长按识别二维码立即购买', WIDTH / 2, 1167); ctx.save(); ctx.draw(true, () => { uni.canvasToTempFilePath({ canvasId: 'myCanvas', fileType: 'png', destWidth: WIDTH, destHeight: HEIGHT, success: function (res) { uni.hideLoading(); successCallBack && successCallBack(res.tempFilePath); }, fail: function (error) { console.log(error) }, }) }); }) // uni.getImageInfo({ // src: store.image, // fail: function (res) { // uni.showToast({ // title: '海报生成失败', // icon: "none", // duration: 2000 // }); // }, // success: function (res) { // } // }) } const getImageInfo = (images) => { return new Promise((resolve, reject) => { let imageAry = {} images.map((item, index) => { uni.getImageInfo({ src: item, fail: function (res) { imageAry[index] = null if (imageAry.length == images.length) { resolve(imageAry) } }, success: function (res) { imageAry[index] = res if (Object.keys(imageAry).length == images.length) { resolve(imageAry) } } }) }) }) }