fix: 修复分享模式进入主线冲突的 bug
This commit is contained in:
@@ -365,6 +365,19 @@ export class PageLevel extends BaseView {
|
||||
*/
|
||||
onViewShow(): void {
|
||||
console.log('[PageLevel] onViewShow');
|
||||
|
||||
// PageLevel 注册时 cache: true,缓存实例会被复用。
|
||||
// 必须根据本次进入时携带的 params 重新派生 _isShareMode,
|
||||
// 否则上一场分享挑战的状态会残留到下一次主线挑战进入。
|
||||
const params = this.getParams();
|
||||
const desiredShareMode = params?.shareMode === true;
|
||||
|
||||
if (desiredShareMode !== this._isShareMode) {
|
||||
console.log(`[PageLevel] 检测到模式切换 ${this._isShareMode} → ${desiredShareMode},重新初始化关卡会话`);
|
||||
this._reinitLevelSession(desiredShareMode);
|
||||
return;
|
||||
}
|
||||
|
||||
this._refreshModeUI();
|
||||
this.updateStaminaLabel();
|
||||
if (!this._isShareMode) {
|
||||
@@ -372,6 +385,56 @@ export class PageLevel extends BaseView {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 跨模式切换时(例如分享挑战 → 主线挑战)重置会话状态并重新加载关卡。
|
||||
* 仅在 onViewShow 检测到模式发生变化时调用,避免对正常的同模式连续作答产生副作用。
|
||||
*/
|
||||
private _reinitLevelSession(shareMode: boolean): void {
|
||||
this._isShareMode = shareMode;
|
||||
|
||||
// 上一场可能遗留的弹窗 / 倒计时一并清掉,避免主线模式还看到分享态弹窗
|
||||
this._closePassModal();
|
||||
this._closeWrongModal();
|
||||
this._closeTimeoutModal();
|
||||
this._closeCommonModal();
|
||||
this.stopCountdown();
|
||||
this._stopStaminaRecoverTimer();
|
||||
|
||||
// 复位分享态相关字段(无论切换到哪个模式,分享态都不应残留)
|
||||
this._shareLevelIndex = 0;
|
||||
this._shareSubmissions.clear();
|
||||
this._isSubmittingShareResult = false;
|
||||
this._hasRequestedShareUserInfo = false;
|
||||
|
||||
if (this._isShareMode) {
|
||||
console.log('[PageLevel] 切换到分享挑战模式');
|
||||
} else {
|
||||
// 主线模式:从 AuthManager 拉取最新的 nextLevel
|
||||
this._nextLevelData = null;
|
||||
const nextLevel = AuthManager.instance.nextLevel;
|
||||
if (nextLevel) {
|
||||
this._currentLevelId = nextLevel.id;
|
||||
this._currentLevelNumber = nextLevel.level;
|
||||
console.log(`[PageLevel] 切换到主线挑战,进入关卡: 第 ${nextLevel.level} 关 (${nextLevel.id})`);
|
||||
} else {
|
||||
this._currentLevelId = '';
|
||||
this._currentLevelNumber = 0;
|
||||
console.warn('[PageLevel] 切换到主线挑战,但没有可用关卡');
|
||||
}
|
||||
}
|
||||
|
||||
this._refreshModeUI();
|
||||
this.updateStaminaLabel();
|
||||
if (!this._isShareMode) {
|
||||
this._startStaminaRecoverTimer();
|
||||
}
|
||||
|
||||
// 异步加载关卡资源并调用进入关卡接口,完成后启动倒计时
|
||||
this._enterAndInitLevel().catch(err => {
|
||||
console.error('[PageLevel] 模式切换后重新进入关卡失败:', err);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 页面隐藏时调用
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user