From 602e6ad4acba612a7ea66fb3bc7485054f5675ee Mon Sep 17 00:00:00 2001 From: Simos Mikelatos Date: Tue, 9 Jun 2026 16:04:15 +0000 Subject: [PATCH] fix: address notification review feedback --- src/i18n/locales/de/settings.json | 18 ++++++++++++++++++ src/i18n/locales/ru/settings.json | 18 ++++++++++++++++++ src/utils/pageTitleNotification.ts | 26 ++++++++++++++++++++++++++ 3 files changed, 62 insertions(+) diff --git a/src/i18n/locales/de/settings.json b/src/i18n/locales/de/settings.json index d2189e83..237e5950 100644 --- a/src/i18n/locales/de/settings.json +++ b/src/i18n/locales/de/settings.json @@ -94,15 +94,33 @@ "git": "Git", "apiTokens": "API & Token", "tasks": "Aufgaben", + "notifications": "Benachrichtigungen", "plugins": "Plugins", "about": "Info" }, "notifications": { + "title": "Benachrichtigungen", + "description": "Lege fest, welche Benachrichtigungen du erhältst.", + "webPush": { + "title": "Web-Push-Benachrichtigungen", + "enable": "Push-Benachrichtigungen aktivieren", + "disable": "Push-Benachrichtigungen deaktivieren", + "enabled": "Push-Benachrichtigungen sind aktiviert", + "loading": "Wird aktualisiert...", + "unsupported": "Push-Benachrichtigungen werden in diesem Browser nicht unterstützt.", + "denied": "Push-Benachrichtigungen sind blockiert. Bitte erlaube sie in den Browsereinstellungen." + }, "sound": { "title": "Ton", "description": "Spielt einen kurzen Ton ab, wenn ein Chat-Lauf abgeschlossen ist.", "enabled": "Aktiviert", "test": "Ton testen" + }, + "events": { + "title": "Ereignistypen", + "actionRequired": "Aktion erforderlich", + "stop": "Lauf gestoppt", + "error": "Lauf fehlgeschlagen" } }, "appearanceSettings": { diff --git a/src/i18n/locales/ru/settings.json b/src/i18n/locales/ru/settings.json index 109161f8..94e88f37 100644 --- a/src/i18n/locales/ru/settings.json +++ b/src/i18n/locales/ru/settings.json @@ -94,15 +94,33 @@ "git": "Git", "apiTokens": "API и токены", "tasks": "Задачи", + "notifications": "Уведомления", "plugins": "Плагины", "about": "О программе" }, "notifications": { + "title": "Уведомления", + "description": "Управляйте тем, какие события уведомлений вы получаете.", + "webPush": { + "title": "Web Push уведомления", + "enable": "Включить Push уведомления", + "disable": "Отключить Push уведомления", + "enabled": "Push уведомления включены", + "loading": "Обновление...", + "unsupported": "Push уведомления не поддерживаются в этом браузере.", + "denied": "Push уведомления заблокированы. Разрешите их в настройках браузера." + }, "sound": { "title": "Звук", "description": "Воспроизводить короткий сигнал при завершении запуска чата.", "enabled": "Включено", "test": "Проверить звук" + }, + "events": { + "title": "Типы событий", + "actionRequired": "Требуется действие", + "stop": "Запуск остановлен", + "error": "Запуск завершился с ошибкой" } }, "appearanceSettings": { diff --git a/src/utils/pageTitleNotification.ts b/src/utils/pageTitleNotification.ts index 07f00b6b..dd786a0b 100644 --- a/src/utils/pageTitleNotification.ts +++ b/src/utils/pageTitleNotification.ts @@ -33,12 +33,17 @@ const clearTitleIndicator = (): void => { } removeReturnListeners(); + removePageInactiveListener(); if (document.title.startsWith(getIndicatorPrefix())) { document.title = stripIndicator(document.title); } }; +const removePageInactiveListener = (): void => { + document.removeEventListener('visibilitychange', handlePageInactive); +}; + const scheduleClear = (): void => { if (clearTimer !== null) { window.clearTimeout(clearTimer); @@ -47,6 +52,9 @@ const scheduleClear = (): void => { clearTimer = window.setTimeout(() => { clearTitleIndicator(); }, TITLE_INDICATOR_CLEAR_DELAY_MS); + + removePageInactiveListener(); + document.addEventListener('visibilitychange', handlePageInactive, { once: true }); }; function handleUserReturn(): void { @@ -59,6 +67,24 @@ function handleUserReturn(): void { scheduleClear(); } +function handlePageInactive(): void { + if (document.visibilityState !== 'hidden') { + return; + } + + if (clearTimer !== null) { + window.clearTimeout(clearTimer); + clearTimer = null; + } + + if (!returnListenersAttached) { + document.addEventListener('visibilitychange', handleUserReturn); + window.addEventListener('focus', handleUserReturn, true); + window.addEventListener('click', handleUserReturn, true); + returnListenersAttached = true; + } +} + export const showCompletionTitleIndicator = (): void => { if (typeof document === 'undefined' || typeof window === 'undefined') { return;