import Taro from '@tarojs/taro'; import { BRAND_LOGO_URL } from '@dukang/shared-types'; import type { WechatShareData } from '@dukang/weixin-sdk'; import { getWechatShareLink, isWechatBrowser, isMiniProgram } from '@dukang/weixin-sdk'; import { toast } from './api'; import { isWechatEnv, weixinSdk } from './weixin'; export const DEFAULT_SHARE_TITLE = '你吃饭,杜康买单'; export const DEFAULT_SHARE_DESC = '杜康好客 · 买美酒,享好礼,全城门店可用'; export const WECHAT_SHARE_HINT = '请点击右上角 ··· 分享给好友'; export function getDefaultShareImageUrl(): string { return BRAND_LOGO_URL; } export function buildDefaultShareData( overrides?: Partial, ): WechatShareData { let link = overrides?.link; if (!link) { if (process.env.TARO_ENV === 'h5' && typeof window !== 'undefined') { link = getWechatShareLink(); } else { link = ''; } } return { title: overrides?.title ?? DEFAULT_SHARE_TITLE, desc: overrides?.desc ?? DEFAULT_SHARE_DESC, link, imgUrl: overrides?.imgUrl ?? getDefaultShareImageUrl(), }; } /** 配置 H5 微信内右上角分享卡片 */ export async function applyWechatShare( overrides?: Partial, ): Promise { if (process.env.TARO_ENV !== 'h5') return; if (!isWechatBrowser()) return; await weixinSdk.setShare(buildDefaultShareData(overrides)); } export type PageSharePayload = { title?: string; desc?: string; /** 小程序分享 path,如 /pages/product-detail/index?id=1 */ path?: string; imgUrl?: string; /** H5 自定义分享 link,默认当前页 */ link?: string; }; /** * 点击「分享」按钮。 * H5:走微信 JSSDK 配置分享卡片,并尝试 invoke 调起面板;否则返回需展示引导蒙层。 */ export async function handleShareButtonClick( payload?: PageSharePayload, ): Promise<{ showGuide: boolean }> { if (process.env.TARO_ENV === 'weapp' || isMiniProgram()) { try { await Taro.showShareMenu({ withShareTicket: true, showShareItems: ['shareAppMessage', 'shareTimeline'] }); } catch { try { await Taro.showShareMenu({ withShareTicket: true }); } catch { /* ignore */ } } toast(WECHAT_SHARE_HINT); return { showGuide: false }; } if (!isWechatEnv()) { toast('请在微信内打开后分享'); return { showGuide: false }; } const data = buildDefaultShareData({ title: payload?.title, desc: payload?.desc, imgUrl: payload?.imgUrl, link: payload?.link, }); try { const result = await weixinSdk.share(data); if (result.invoked) { return { showGuide: false }; } toast(WECHAT_SHARE_HINT); return { showGuide: true }; } catch (e) { toast(e instanceof Error ? e.message : '分享配置失败,请刷新后重试'); return { showGuide: true }; } } /** 供 useShareAppMessage 使用的标题/路径/图 */ export function toWeappShareMessage(payload?: PageSharePayload) { return { title: payload?.title || DEFAULT_SHARE_TITLE, path: payload?.path || '/pages/home/index', imageUrl: payload?.imgUrl || getDefaultShareImageUrl(), }; }