import { MiniGamePf } from '../../../mx/tools/MiniGameHostInfo'; import { BYTEDANCE } from "cc/env"; import { TTHarmonyCompat } from "./TTHarmonyCompat"; /** * 分享。快手用 ks.shareAppMessage(templateId);微信/抖音保持原接口。 */ export class Share { private _shareDataList: Array<{ desc?: string; res?: string; tt?: string; ks?: string; shareid?: string }> = []; private _shareCb: ((ok: boolean) => void) | null = null; /** 注册系统分享菜单(微信 / B 站 / 抖音;快手无此菜单 API) */ init(shareDataList = []): void { this._shareDataList = shareDataList ?? []; const id = MiniGamePf.id(); if (id === 'ks') { return; } if (id === 'wx' || id === 'bl') { const api = MiniGamePf.api(); if (!api) return; if (typeof api.onShareAppMessage === 'function') { api.onShareAppMessage(this._onMenuShare); } if (typeof api.showShareMenu === 'function') { api.showShareMenu({}); } return; } if (BYTEDANCE) { window["tt"].onShareAppMessage(this._onMenuShare); TTHarmonyCompat.showShareMenu({}); } } /** * 主动拉起分享。 * @param title 标题(微信/抖音) * @param imageUrl 配图(微信/抖音) * @param cb 结果回调 * @param query 启动 query * @param id 快手/抖音分享模板 id */ share(title = "", imageUrl = "", cb?, query = ``, id = null): void { const pf = MiniGamePf.id(); if (pf === 'ks') { this._shareByKs(cb, query, id); return; } if (pf === 'tt') { const ok = TTHarmonyCompat.shareAppMessage({ title: title, templateId: id, imageUrl: imageUrl, query: query, success: () => { if (cb) cb(true); }, fail: () => { if (cb) cb(false); } }); if (!ok && cb) { cb(false); } return; } if (pf === 'wx' || pf === 'bl') { const api = MiniGamePf.api(); if (!api?.shareAppMessage) { console.warn('[Share] shareAppMessage 不可用', pf); if (cb) cb(false); return; } api.shareAppMessage({ title: title, imageUrl: imageUrl, query: query }); return; } console.warn('[Share] 当前平台无分享接口', pf); if (cb) cb(false); } /** 系统分享菜单文案 */ private _onMenuShare = (): { title: string; imageUrl: string } => { const list = this._shareDataList; let title = ''; let imageUrl = ''; if (list.length > 0) { const data = list[Math.floor(Math.random() * list.length)]; if (data?.desc) title = data.desc; if (data?.res) imageUrl = data.res; } return { title, imageUrl }; }; /** 快手分享成功 */ private _onKsShareOk = (): void => { const cb = this._shareCb; this._shareCb = null; cb?.(true); }; /** 快手分享失败 */ private _onKsShareFail = (): void => { const cb = this._shareCb; this._shareCb = null; cb?.(false); }; /** 快手:templateId 可选,不传走默认文案 */ private _shareByKs(cb: ((ok: boolean) => void) | undefined, query: string, id: string | null): void { const ks = MiniGamePf.api(); if (!ks?.shareAppMessage) { console.warn('[Share] ks.shareAppMessage 不可用'); cb?.(false); return; } this._shareCb = cb ?? null; const tmpl = id || this._pickKsTemplateId(); const opts: Record = { query: query || undefined, success: this._onKsShareOk, fail: this._onKsShareFail, }; if (tmpl) opts.templateId = tmpl; ks.shareAppMessage(opts); } /** 从配置取快手模板 id(ks / tt / shareid) */ private _pickKsTemplateId(): string { const list = this._shareDataList; if (!list.length) return ''; const data = list[Math.floor(Math.random() * list.length)]; return data?.ks || data?.tt || data?.shareid || ''; } }