update
Some checks failed
Deploy / deploy (push) Has been cancelled

This commit is contained in:
2026-08-30 22:22:10 -06:00
parent 0e083225f1
commit cbe6955c26

View File

@@ -6,6 +6,7 @@ import { useLearnProgress } from "shared/composables/learnProgress"
import { useAuthModalStore } from "shared/store/authModal"
import { useCollabStore } from "shared/store/collab"
import { useScreenModeStore } from "shared/store/screenMode"
import type { CollabRequestItem } from "shared/composables/websocket"
import { logout } from "../api"
import CollabModal from "./CollabModal.vue"
import HelpRequestList from "./HelpRequestList.vue"
@@ -52,6 +53,45 @@ const pendingHelpCount = computed(() =>
hasHelpEntry.value ? collabStore.pendingCount : 0,
)
/**
* 新求助进来只有角标默默 +1上课走动的时候根本注意不到补一条 toast。
*
* 只在数字**变大**时弹:老师自己接单、拒绝、别的老师接走都会让它变小,那些
* 不该打扰人。断线重连后服务端会重推一份全量列表,队里还有人的话这里会再弹
* 一次 —— 那正好是「你刚断过线,这些人还等着」,留着。
*/
watch(
() => pendingHelpCount.value,
(count, previous) => {
if (count <= previous) return
let latest: CollabRequestItem | null = null
for (const item of collabStore.requests) {
if (item.status !== "pending") continue
if (!latest || item.createdAt > latest.createdAt) latest = item
}
const text = latest
? `${latest.studentName} 求助:${latest.problemTitle}`
: "有新的求助"
// 内容传 render 函数naive 的 content 支持),这样整条 toast 可点:
// 点一下直接开求助列表,省得再去点名字、再点菜单。
const notice = message.info(
() =>
h(
"span",
{
style: { cursor: "pointer" },
onClick: () => {
showHelpRequests.value = true
notice.destroy()
},
},
`${text} · 点击处理`,
),
{ duration: 5000 },
)
},
)
const isDark = useDark()
/**
@@ -142,12 +182,16 @@ const envVersion = computed(() => {
return ""
})
const showEnvVersion = computed(() => {
return (
import.meta.env.PUBLIC_ENV === "test" ||
import.meta.env.PUBLIC_ENV === "dev"
)
})
/**
* 站名后面括号里的东西:环境名 + 演示中。
*
* 演示模式除了下拉里那行「退出演示」再没有别的痕迹,而它是存在 localStorage 里
* 的,刷新、关标签页都还在,只有退出登录才清 —— 不在这儿常驻标一下,很容易
* 投屏完忘了退,第二天纳闷后台入口怎么没了。
*/
const titleTags = computed(() =>
[envVersion.value, userStore.demoMode ? "演示中" : ""].filter(Boolean),
)
const active = computed(() => {
const path = route.path.split("/")[1] || "problem"
@@ -338,7 +382,7 @@ function handleMenuSelect(key: string) {
<n-flex align="center" class="title" @click="goHome">
<Icon icon="streamline-emojis:dog" :height="30"></Icon>
<div>{{ configStore.config?.websiteName }}</div>
<div v-if="showEnvVersion">({{ envVersion }})</div>
<div v-if="titleTags.length">({{ titleTags.join(" · ") }})</div>
</n-flex>
<div>
<n-menu