fix(做对了): 点评弹窗等烟花放完再出来,不再放到一半就被盖住;星星雨、彩虹喷泉收短一点,十种都在两三秒内放完

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
xuyueandClaude Opus 5.5 committed 2026-10-14 13:17:27 +08:00
1 parent 655af07ca7
commit 4d6df4ab0c
2 files changed
+80 -36

No files matched your search

@@ -35,7 +35,7 @@ const { celebrate } = useFireworks()
// 只对已经能评价、且还没评过的人弹:后端要求先有 AC 才收评价,这里刚 AC 完正好;
// mine 非 null 说明早就评过了,别再打扰。
//
// 点评是强制的,但从 AC 到弹窗出来有 1.5 秒(加上查一次「评过没有」),而换题会把
// 点评是强制的,但弹窗要等烟花放完才出来(两三秒,加上查一次「评过没有」),而换题会把
// 定时器取消(见下面换题的 watch)—— 「下一题」在通过的那一刻就出现了,学生手快点
// 下去,点评就跳过了。所以这段时间里欠着一次点评(reviewOwed),离开这道题的导航
// 先拦下来:立刻弹点评,选完再去原来要去的地方。
@@ -128,11 +128,24 @@ function continueAfterReview() {
closeCommentPanel()
}
const { start: showCommentPanelDelayed, stop: cancelCommentPanel } = useTimeoutFn(
openReview,
1500,
{ immediate: false },
)
/**
* 烟花放完再弹点评,两边一个时间(十种烟花长短不一,两到三秒)。
* 每次通过记一个号,换题、被导航拦下提前弹了,就把号作废,放完也不再弹。
*/
let reviewAfterFireworks = 0
function showCommentPanelAfter(fireworks: Promise<void>) {
const run = ++reviewAfterFireworks
fireworks.then(() => {
if (run === reviewAfterFireworks) openReview()
})
}
function cancelCommentPanel() {
reviewAfterFireworks++
}
// 离开题目页时烟花那边当作放完了,不能接着去查、去弹
onScopeDispose(cancelCommentPanel)
/**
* 只拦「离开这道题」:换 query(左栏切页签会改 `?tab=`)不算。弹窗已经开着的时候
@@ -166,7 +179,7 @@ const { start: goToProblemSetDelayed, stop: cancelGoToProblemSet } = useTimeoutF
)
/**
* 换题时收掉通过之后那两个 1.5 秒的定时器 —— 评价弹窗是按**当前**题目去查、去弹的,
* 换题时收掉通过之后等着的点评和回题单 —— 评价弹窗是按**当前**题目去查、去弹的,
* 不取消的话就会给一道还没做的题弹评价。欠着的点评走不到这里:离开这道题的导航
* 已经被 holdForReview 拦下、评完才放行;还能走到这里的只有弹窗开着时按了浏览器后退。
* 结果面板、还在跟的那条提交由 submission store 自己收。
@@ -226,12 +239,12 @@ watch(
if (result !== SubmissionStatus.accepted) return
// 2. 放烟花
celebrate()
const fireworks = celebrate()
// 3. 弹出评价框。比赛里不打扰;题单里 1.5 秒后要跳回题单页,弹了也会被冲掉
// 3. 烟花放完弹出评价框。比赛里不打扰;题单里 1.5 秒后要跳回题单页,弹了也会被冲掉
if (ctx.value.reviewAfterAccepted) {
reviewOwed.value = true
showCommentPanelDelayed()
showCommentPanelAfter(fireworks)
}
if (ctx.value.backToProblemSet) {