jiuyiUniapp/shop/utils/share.js

515 lines
12 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* 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)
}
}
})
})
})
}