Files

308 lines
9.5 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.

/**
* @name: useShare
* @author: kahu4
* @date: 2023-11-10 09:45
* @descriptionuseShare
* @update: 2023-11-10 09:45
* */
import { ref, unref } from "vue";
import { useRouter } from "@/hooks/useRouter";
import { VUE_H5_DOMAIN_NAME, VUE_SHARE_TITLE } from "@/config";
import { h5InWeChat } from "@/utils";
import { useShearPlate } from "@/hooks/useShearPlate";
import { useInterface } from "@/hooks/useInterface";
import stringify from "@/utils/querystring";
import { getUrlQuery } from "@/utils/utils";
// 聚合处理的分享页面
const SHARE_INDEX = 'pages/share/index'
const {setData} = useShearPlate();
const {toast} = useInterface()
// 分享key
export const SharePathKey = {
HOME: 'h',// 首页
GOODS_DETAIL: 'g', // 商品分享
DISTRIBUTION_GOODS: 'dg', // 分销商品分享
INVITATION_USER: 'u', // 邀请用户
DISTRIBUTION_USER: 'd', // 邀请分销商
GROUP_BY: 'gb' // 拼团
}
// 分享页面路径
export const SharePathMap = {
[SharePathKey.HOME]: '/pages/home/home',
[SharePathKey.GOODS_DETAIL]: '/pages/goodsDetail/goodsDetail',
[SharePathKey.DISTRIBUTION_GOODS]: '/pages/goodsDetail/goodsDetail',
[SharePathKey.INVITATION_USER]: '/pages/login/index',
[SharePathKey.DISTRIBUTION_USER]: '/views/distribution/center/index',
[SharePathKey.GROUP_BY]: '/views/activity/groupBy/detail'
}
/**
* 分享hooks
* 只需要在需要分享的页面use此hooks会自动生成shareAppMessage、shareTimeline
* 1.在此工具方法内部分享聚合模块添加方法聚合分享内容参数需要使用packageParameter封装
* 2.在useShareInner模块的analysisParameter方法内部case聚合key做相应的跳转默认是跳转packageParameter封装的url内容参数是packageParameter的data
* 3.微信分享页面中调用步骤1封装的聚合方法将shareAppMessage、shareTimeline丢入钩子函数即可
* 4.h5分享页面中调用步骤1封装的聚合方法然后调用本hook中的shareH5方法
* -h5分享在微信内部可以拉起微信分享、外部只能复制链接
* 5.若要使用shareInfo的path和query去生成拉起小程序的二维码请严格使用SharePathKey配合SharePathMap传参注意参数长度参数名称尽量简短。
*/
export function useShare() {
const shareInfo = ref({
title: VUE_SHARE_TITLE,
path: SHARE_INDEX,
imageUrl: '',
query: '', // 参数
pathQuery: SHARE_INDEX
})
/**
* 设置设置参数
* @param query packageParameter
*/
const setQuery = (query) => {
shareInfo.value.query = query
shareInfo.value.pathQuery = `${ shareInfo.value.path }?${ query }`
}
const shareAppMessage = () => Promise.resolve({
title: shareInfo.value.title,
path: shareInfo.value.pathQuery,
imageUrl: shareInfo.value.imageUrl
})
const shareTimeline = () => ({
title: shareInfo.value.title,
path: shareInfo.value.pathQuery,
imageUrl: shareInfo.value.imageUrl
})
/**
* H5分享
* @param type 1微信好友 2微信朋友圈
*/
const shareH5 = (type = 1) => {
// h5InWeChat()
// 判断是否再微信环境
if (h5InWeChat()) {
_h5WechatShare(shareInfo.value)
} else {
_h5WechatShare(shareInfo.value)
// _h5WechatShare(shareInfo.value)
}
}
/**
* 封装参数
* @param type SharePathKey
* @param data 跳转的参数
*/
const packageParameter = (type, data) => {
const queryString = stringify({
t: type,
...data
})
console.log(queryString)
return `${ queryString }`
}
//========================= 分享聚合 ==================================
/**
* 默认分享
*/
const defaultShare = () => {
unref(shareInfo).title = VUE_SHARE_TITLE
unref(shareInfo).imageUrl = ''
setQuery(packageParameter(SharePathKey.HOME, {}))
}
/**
* 商品分享
* @param goods
*/
const goodsDetailShare = (goods) => {
unref(shareInfo).title = goods.storeName
unref(shareInfo).imageUrl = goods.image
console.log(shareInfo)
setQuery(packageParameter(SharePathKey.GOODS_DETAIL, {id: goods.id}))
}
/**
* 分销商品分享
* @param goods
* @param distributorId 分销商ID
*/
const distributionGoodsDetailShare = (goods, distributorId) => {
unref(shareInfo).title = goods.storeName
unref(shareInfo).imageUrl = goods.image
setQuery(packageParameter(SharePathKey.DISTRIBUTION_GOODS, {id: goods.id, uid: distributorId}))
}
/**
* 分享下级
* @param id
*/
const distributionShare = (id) => {
unref(shareInfo).title = '您的好友邀请您使用YShop'
unref(shareInfo).imageUrl = 'https://b2c-pro-static-dev.zkthink.com/static/icon/logo.png'
setQuery(packageParameter(SharePathKey.DISTRIBUTION_USER, {id}))
return shareInfo.value
}
/**
* 用户分享
* @param invitationCode 邀请人的邀请码
*/
const userInvitationShare = (invitationCode) => {
unref(shareInfo).title = '您的好友邀请您使用YShop'
unref(shareInfo).imageUrl = 'https://b2c-pro-static-dev.zkthink.com/static/icon/logo.png'
setQuery(packageParameter(SharePathKey.INVITATION_USER, {code: invitationCode}))
return shareInfo.value
}
/**
* 拼团邀请
* @param orderInfoData
*/
const groupByInvitationShare = (orderInfoData) => {
//teamworkId
const img = orderInfoData?.cartInfo?.[0]?.productInfo?.image || 'https://b2c-pro-static-dev.zkthink.com/static/icon/logo.png'
unref(shareInfo).title = '您的好友邀请您参与拼团'
unref(shareInfo).imageUrl = img
setQuery(packageParameter(SharePathKey.GROUP_BY, {id: orderInfoData.teamworkId}))
return shareInfo.value
}
return {
shareInfo,
shareH5,
setQuery,
shareAppMessage,
shareTimeline,
packageParameter,
defaultShare,
goodsDetailShare,
distributionGoodsDetailShare,
distributionShare,
userInvitationShare,
groupByInvitationShare
}
}
export const useShareInner = () => {
const {push, pushToTab} = useRouter()
const params = ref({
t: ""
})
/**
* 处理share参数
* @param options
*/
async function analysisParams(options) {
console.log('分享参数----', options)
// 从小程序二维码扫码进入
if (options.scene) {
params.value = getUrlQuery(decodeURIComponent(options.scene));
} else {
params.value = options
}
await analysisParameter()
}
/**
* 解析参数
*/
async function analysisParameter() {
switch (unref(params).t) {
case SharePathKey.GOODS_DETAIL:
case SharePathKey.INVITATION_USER:
case SharePathKey.DISTRIBUTION_GOODS:
case SharePathKey.DISTRIBUTION_USER:
case SharePathKey.GROUP_BY:
toSkip()
break;
default:
pushToTab({url: '/root/index/index'})
}
}
/**
* 跳转
*/
function toSkip() {
const path = SharePathMap[unref(params).t]
if (path) {
push({
url: path,
}, {
data: unref(params),
type: 'redirectTo'
})
}
}
return {
params,
analysisParams
}
}
/**
* 微信内H5分享
* @param shareInfo
* @param type
* @private
*/
const _h5InWechatShare = (shareInfo, type = 1) => {
const res = {} // todo 从后端拿
jweixin.config({
debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来若要查看传入的参数可以在pc端打开参数信息会通过log打出仅在pc端时才会打印。
appId: res.appId, // 必填,公众号的唯一标识
timestamp: res.timeStamp, // 必填,生成签名的时间戳
nonceStr: res.nonceStr, // 必填,生成签名的随机串
signature: res.paySign, // 必填签名见附录1
jsApiList: ['onMenuShareTimeline', 'onMenuShareAppMessage'] // 必填需要使用的JS接口列表所有JS接口列表见附录2
});
jweixin.ready(() => {
if (type === 1) {
// 好友
jweixin.updateAppMessageShareData({
title: shareInfo.title, // 分享标题
desc: shareInfo.title, // 分享描述
link: shareInfo.link, // 分享链接该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
imgUrl: shareInfo.imageUrl, // 分享图标
})
} else {
// 朋友圈
jweixin.updateTimelineShareData({
title: shareInfo.title, // 分享标题
link: shareInfo.link, // 分享链接该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
imgUrl: shareInfo.imageUrl, // 分享图标
})
}
})
}
/**
* 微信外h5分享 h5外部直接生成链接
* @param shareInfo
* @param type
* @private
*/
const _h5WechatShare = async (shareInfo, type = 1) => {
const link = `${ VUE_H5_DOMAIN_NAME }${ shareInfo.pathQuery }`
await setData(link)
toast({title: '已复制,快去分享链接分享给小伙伴吧~'})
}