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.
138 lines
4.4 KiB
138 lines
4.4 KiB
|
3 weeks ago
|
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 || '';
|
||
|
|
}
|
||
|
|
}
|