feat(share): 容器接线 ShareGuideDialog(订阅 SHOW_GUIDE/渲染/返回键/一次性回投,分享重构 §7)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
lanterngamescn
2026-06-27 14:15:23 +08:00
co-authored by Claude Sonnet 4.6
parent fffb353345
commit b1055c79f6
@@ -6,10 +6,11 @@ import { ConfigManager, ResourceManager, AppDataInjector, AppDataValues, RemoteC
import { KvStore, LocalUploadServer } from 'platform';
import { OutboundHandlers } from 'contracts';
import { AppEnv, EventBus, EventPayload, NavEvents, OpenGenericWebPayload, SwitchGamePayload,
BackGamePayload, ShareEvents, SharePanelRequest, SharePanelResult, Logger } from 'common';
BackGamePayload, ShareEvents, SharePanelRequest, SharePanelResult, ShareGuideRequest, ShareGuideResult, Logger } from 'common';
import { BridgeGameParams, GenericWebParams, GenericWebResult, RouteName, AppEvents } from '../routes/AppRoutes';
import { WebSlot } from '../web/WebSlot';
import { SharePanel } from '../components/SharePanel';
import { ShareGuideDialog } from '../components/ShareGuideDialog';
import { KEY_SPLASH_VISIBLE } from './Index';
/**
@@ -52,6 +53,12 @@ export struct BridgeGameContainer {
@State private sharePanelVisible: boolean = false;
/** 当前分享面板的一次性回投事件名(用户选定平台后 emit 回 ShareProvider)。 */
private shareResultEvent: string = '';
/** 分享指引窗显隐(渠道选定后叠在 Stack 顶层)。 */
@State private shareGuideVisible: boolean = false;
private shareGuidePlatform: string = '';
private shareGuideKind: string = '';
/** 当前指引窗的一次性回投事件名(用户选动作后 emit 回 ShareProvider)。 */
private shareGuideResultEvent: string = '';
aboutToAppear(): void {
if (AppEnv.isDebug()) {
@@ -120,6 +127,7 @@ export struct BridgeGameContainer {
this.cancels.push(EventBus.on(NavEvents.SWITCH_GAME, (p?: EventPayload) => this.switchGame(p)));
this.cancels.push(EventBus.on(NavEvents.BACK_GAME, (p?: EventPayload) => this.backToLobby(p)));
this.cancels.push(EventBus.on(ShareEvents.SHOW_PANEL, (p?: EventPayload) => this.showSharePanel(p)));
this.cancels.push(EventBus.on(ShareEvents.SHOW_GUIDE, (p?: EventPayload) => this.showShareGuide(p)));
}
/** 收到 ShareProvider 的 SHOW_PANEL:记下一次性回投事件名并弹出面板。 */
@@ -147,6 +155,33 @@ export struct BridgeGameContainer {
}
}
/** 收到 ShareProvider 的 SHOW_GUIDE:记下渠道/类型/一次性回投事件名并弹出指引窗。 */
private showShareGuide(p?: EventPayload): void {
if (p === undefined) {
return;
}
// 已有指引窗未关闭:先按取消回投旧请求,避免上一个 once 永不触发致 ShareProvider 悬挂。
if (this.shareGuideVisible && this.shareGuideResultEvent !== '') {
this.emitShareGuideResult('cancel');
}
const req = p as ShareGuideRequest;
this.shareGuidePlatform = req.platform;
this.shareGuideKind = req.contentKind;
this.shareGuideResultEvent = req.resultEvent;
this.shareGuideVisible = true;
}
/** 用户选定动作/取消:回投并关闭指引窗。 */
private emitShareGuideResult(action: string): void {
const ev: string = this.shareGuideResultEvent;
this.shareGuideResultEvent = '';
this.shareGuideVisible = false;
if (ev !== '') {
const result: ShareGuideResult = { action };
EventBus.emit(ev, result);
}
}
/** 路径 B:打开通用网页容器;关闭回传 → 当前激活槽 callHandler('getWebdata')。 */
private openGenericWeb(p?: EventPayload): void {
if (p === undefined) {
@@ -390,6 +425,14 @@ export struct BridgeGameContainer {
if (this.sharePanelVisible) {
SharePanel({ onPick: (platform: string) => this.emitShareResult(platform) })
}
// 分享指引窗(顶层叠加;渠道选定后弹,选动作/取消 → 一次性回投 ShareProvider
if (this.shareGuideVisible) {
ShareGuideDialog({
platform: this.shareGuidePlatform,
contentKind: this.shareGuideKind,
onPick: (action: string) => this.emitShareGuideResult(action),
})
}
}
.width('100%').height('100%')
// 垫白底:Web 首帧前/页面切换间隙显白色(与启动页白底无缝),避免黑屏闪烁
@@ -397,6 +440,11 @@ export struct BridgeGameContainer {
}
.hideTitleBar(true)
.onBackPressed(() => {
// 指引窗打开时,返回键关闭并按取消回投
if (this.shareGuideVisible) {
this.emitShareGuideResult('cancel');
return true;
}
// 分享面板打开时,返回键关闭面板并按取消回投(对齐 Android 点空白关闭)
if (this.sharePanelVisible) {
this.emitShareResult('cancel');