share.js 3.39 KB
let shareData = {
  title: '',
  link: '',
  desc: '逛',
  imgUrl: 'http://static.yohobuy.com/m/v1/img/touch/apple-touch-icon-144x144-precomposed-new.png'
};

let jsApiList = [
  'checkJsApi',
  'onMenuShareTimeline',
  'onMenuShareAppMessage',
  'onMenuShareQQ',
  'onMenuShareWeibo',
  'onMenuShareQZone'
];

const setWxShareData = function() {
  window.wx.onMenuShareTimeline(shareData);
  window.wx.onMenuShareAppMessage(shareData);
  window.wx.onMenuShareQQ(shareData);
  window.wx.onMenuShareQZone(shareData);
  window.wx.onMenuShareWeibo(shareData);
};

function loadScript(url, success) {
  const head = document.getElementsByTagName('head')[0];
  let script = document.createElement('script');

  script.type = 'text/javascript';
  script.onload = script.onreadystatechange = function() {
    if (!this.readyState || this.readyState === 'loaded' || this.readyState === 'complete') {
      success && success();
      script.onload = script.onreadystatechange = null;
    }
  };
  script.src = url;
  head.appendChild(script);
}

function jsonp(url, data = {}) {
  return new Promise((resolve) => {
    let JSONP = document.createElement('script');
    let query = [];

    data.callback = 'jsonCallBack';
    Object.keys(data).forEach(key => {
      query.push(key + '=' + data[key]);
    });

    window.jsonCallBack = (result) => {
      resolve(result);
    };

    JSONP.type = 'text/javascript';
    JSONP.src = `${url}?${query.join('&')}`;
    const head = document.getElementsByTagName('head')[0];

    head.appendChild(JSONP);

    setTimeout(() => {
      head.removeChild(JSONP);
    }, 500);
  });
}

function init(qs) {
  if (/QQ/i.test(navigator.userAgent)) {
    loadScript('//qzonestyle.gtimg.cn/qzone/qzact/common/share/share.js', function() {
      window.setShareInfo && window.setShareInfo({
        title: shareData.title,
        summary: shareData.desc,
        pic: shareData.imgUrl,
        url: shareData.link || location.href
      });
    });
  }

  if (/MicroMessenger/i.test(navigator.userAgent)) {
    loadScript('//res.wx.qq.com/open/js/jweixin-1.3.2.js', () => {
      jsonp(location.protocol + '//m.yohobuy.com/activity/wechat/share', {
        url: encodeURIComponent(location.href.split('#')[0])
      }).then(res => {
        if (window.wx) {
          window.wx.config({
            debug: false,
            appId: res.appId,
            timestamp: res.timestamp,
            nonceStr: res.nonceStr,
            signature: res.signature,
            jsApiList: jsApiList
          });

          window.wx.ready(function() {
            setWxShareData();
          });
        }
      });
    });
  }

  if (qs && qs.share_id) {
    jsonp(location.protocol + '//m.yohobuy.com/activity/share', {
      shareId: qs.share_id
    }).then(res => {
      if (res && res.code === 200 && res.data) {
        shareData.desc = res.data.content || res.data.title;
        shareData.imgUrl = res.data.pic;
        shareData.title = res.data.title;
      }
    });
  }
}

export default {
  init,
  setShareInfo(data) {
    shareData.title = data.title;
    shareData.desc = data.desc || '逛';
    shareData.link = data.link || location.href;
    shareData.imgUrl = data.imgUrl || shareData.imgUrl;

    if (window.wx) {
      setWxShareData();
    }

    window.setShareInfo && window.setShareInfo({
      title: shareData.title,
      summary: shareData.desc,
      pic: shareData.imgUrl,
      url: shareData.link
    });
  }
};