diff --git a/web/src/pages/DisplayPage.test.tsx b/web/src/pages/DisplayPage.test.tsx index d4aeeae..74dad2b 100644 --- a/web/src/pages/DisplayPage.test.tsx +++ b/web/src/pages/DisplayPage.test.tsx @@ -89,7 +89,7 @@ describe("DisplayPage", () => { ]); }); - it("新批次出现时只播报一次叫号内容", () => { + it("新批次出现时连续播报三次叫号内容", () => { const speak = vi.fn(); const cancel = vi.fn(); class SpeechSynthesisUtteranceMock { @@ -118,11 +118,13 @@ describe("DisplayPage", () => { rerender(); expect(cancel).toHaveBeenCalledOnce(); - expect(speak).toHaveBeenCalledOnce(); - expect(speak.mock.calls[0][0]).toMatchObject({ - text: "请零零零零五号至零零零零六号,前往入口。", - lang: "zh-CN", - rate: 0.9, - }); + expect(speak).toHaveBeenCalledTimes(3); + for (const [utterance] of speak.mock.calls) { + expect(utterance).toMatchObject({ + text: "请零零零零五号至零零零零六号,前往入口。", + lang: "zh-CN", + rate: 0.9, + }); + } }); }); diff --git a/web/src/pages/DisplayPage.tsx b/web/src/pages/DisplayPage.tsx index 06b8f63..ef08299 100644 --- a/web/src/pages/DisplayPage.tsx +++ b/web/src/pages/DisplayPage.tsx @@ -68,11 +68,13 @@ export function DisplayPage() { || typeof SpeechSynthesisUtterance === "undefined" ) return; - const utterance = new SpeechSynthesisUtterance(currentAnnouncement); - utterance.lang = "zh-CN"; - utterance.rate = 0.9; window.speechSynthesis.cancel(); - window.speechSynthesis.speak(utterance); + for (let repeat = 0; repeat < 3; repeat += 1) { + const utterance = new SpeechSynthesisUtterance(currentAnnouncement); + utterance.lang = "zh-CN"; + utterance.rate = 0.9; + window.speechSynthesis.speak(utterance); + } }, [currentAnnouncement, currentCallKey, hasSnapshot, token]); const waitingTicketCount = data?.waiting_ticket_count ?? data?.waiting_count ?? 0; const waitingPeopleCount = data?.waiting_people_count ?? 0; diff --git a/web/src/pages/PublicDisplayCenterPage.test.tsx b/web/src/pages/PublicDisplayCenterPage.test.tsx index cdf9e8e..3796e93 100644 --- a/web/src/pages/PublicDisplayCenterPage.test.tsx +++ b/web/src/pages/PublicDisplayCenterPage.test.tsx @@ -62,7 +62,7 @@ describe("PublicDisplayCenterPage", () => { expect(screen.queryByRole("navigation", { name: "管理任务" })).not.toBeInTheDocument(); }); - it("新叫号批次出现时播报项目和号码", () => { + it("新叫号批次出现时连续三次播报项目和号码", () => { const speak = vi.fn(); class SpeechSynthesisUtteranceMock { text: string; @@ -95,10 +95,12 @@ describe("PublicDisplayCenterPage", () => { }; rerender(); - expect(speak).toHaveBeenCalledOnce(); - expect(speak.mock.calls[0][0]).toMatchObject({ - text: "东门观光车,请零零零一六号,前往入口。", - lang: "zh-CN", - }); + expect(speak).toHaveBeenCalledTimes(3); + for (const [utterance] of speak.mock.calls) { + expect(utterance).toMatchObject({ + text: "东门观光车,请零零零一六号,前往入口。", + lang: "zh-CN", + }); + } }); }); diff --git a/web/src/pages/PublicDisplayCenterPage.tsx b/web/src/pages/PublicDisplayCenterPage.tsx index fbe2006..2a5c193 100644 --- a/web/src/pages/PublicDisplayCenterPage.tsx +++ b/web/src/pages/PublicDisplayCenterPage.tsx @@ -37,10 +37,12 @@ export function PublicDisplayCenterPage() { window.speechSynthesis.cancel(); for (const announcement of announcements) { - const utterance = new SpeechSynthesisUtterance(announcement); - utterance.lang = "zh-CN"; - utterance.rate = 0.9; - window.speechSynthesis.speak(utterance); + for (let repeat = 0; repeat < 3; repeat += 1) { + const utterance = new SpeechSynthesisUtterance(announcement); + utterance.lang = "zh-CN"; + utterance.rate = 0.9; + window.speechSynthesis.speak(utterance); + } } }, [data]);