123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406 |
- /* 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
|