jiuyiUniapp/shop/utils/share.js

515 lines
12 KiB
JavaScript
Raw Normal View History

2024-12-18 15:46:27 +08:00
/* 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)
}
}
})
})
})
}