You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

137 lines
4.4 KiB

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<string, unknown> = {
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 || '';
}
}