aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/features/appearance/index.ts22
-rw-r--r--src/i18n/locales/es.json7
-rw-r--r--src/i18n/locales/he.json6
-rw-r--r--src/i18n/locales/nl.json12
-rw-r--r--src/i18n/locales/uk.json27
-rw-r--r--src/index.ts21
-rw-r--r--src/jsUtils.ts15
-rw-r--r--src/stores/ServicesStore.ts25
-rw-r--r--src/webview/badge.ts19
-rw-r--r--src/webview/lib/RecipeWebview.ts3
-rw-r--r--src/webview/recipe.ts15
11 files changed, 124 insertions, 48 deletions
diff --git a/src/features/appearance/index.ts b/src/features/appearance/index.ts
index 367bcb612..9c9f3e175 100644
--- a/src/features/appearance/index.ts
+++ b/src/features/appearance/index.ts
@@ -2,6 +2,7 @@ import color from 'color';
2import { reaction } from 'mobx'; 2import { reaction } from 'mobx';
3import TopBarProgress from 'react-topbar-progress-indicator'; 3import TopBarProgress from 'react-topbar-progress-indicator';
4 4
5import { pathExistsSync, readFileSync } from 'fs-extra';
5import { isWindows, isLinux } from '../../environment'; 6import { isWindows, isLinux } from '../../environment';
6import { 7import {
7 DEFAULT_APP_SETTINGS, 8 DEFAULT_APP_SETTINGS,
@@ -10,6 +11,7 @@ import {
10 SIDEBAR_SERVICES_LOCATION_CENTER, 11 SIDEBAR_SERVICES_LOCATION_CENTER,
11 SIDEBAR_SERVICES_LOCATION_BOTTOMRIGHT, 12 SIDEBAR_SERVICES_LOCATION_BOTTOMRIGHT,
12} from '../../config'; 13} from '../../config';
14import { userDataPath } from '../../environment-remote';
13 15
14const STYLE_ELEMENT_ID = 'custom-appearance-style'; 16const STYLE_ELEMENT_ID = 'custom-appearance-style';
15 17
@@ -34,6 +36,11 @@ function darkenAbsolute(originalColor, absoluteChange) {
34 return originalColor.lightness(originalLightness - absoluteChange); 36 return originalColor.lightness(originalLightness - absoluteChange);
35} 37}
36 38
39function generateUserCustomCSS() {
40 const path = userDataPath('config', 'custom.css');
41 return pathExistsSync(path) ? readFileSync(path).toString() : '';
42}
43
37function generateAccentStyle(accentColorStr) { 44function generateAccentStyle(accentColorStr) {
38 let accentColor; 45 let accentColor;
39 try { 46 try {
@@ -135,6 +142,7 @@ function generateServiceRibbonWidthStyle(
135 useGrayscaleServices, 142 useGrayscaleServices,
136 grayscaleServicesDim, 143 grayscaleServicesDim,
137 shouldShowDragArea, 144 shouldShowDragArea,
145 isFullScreen,
138) { 146) {
139 const width = Number(widthStr); 147 const width = Number(widthStr);
140 const iconSize = Number(iconSizeStr) - iconSizeBias; 148 const iconSize = Number(iconSizeStr) - iconSizeBias;
@@ -249,11 +257,18 @@ function generateServiceRibbonWidthStyle(
249 margin-top: -${width}px !important; 257 margin-top: -${width}px !important;
250 } 258 }
251 .darwin .sidebar { 259 .darwin .sidebar {
252 height: ${width + verticalStyleOffset - 3 - sizeDragArea}px !important; 260 height: ${
261 isFullScreen ? width : width + verticalStyleOffset - 3 - sizeDragArea
262 }px !important;
263 ${isFullScreen ? `padding-top: ${2}px !important` : null}
253 } 264 }
254 .darwin .app .app__content { 265 .darwin .app .app__content {
255 padding-top: ${ 266 padding-top: ${
256 width + sidebarSizeBias + (sizeDragArea !== 0 ? 4 - sizeDragArea : 4) 267 isFullScreen
268 ? width
269 : width +
270 sidebarSizeBias +
271 (sizeDragArea !== 0 ? 4 - sizeDragArea : 4)
257 }px !important; 272 }px !important;
258 } 273 }
259 .darwin .workspaces-drawer { 274 .darwin .workspaces-drawer {
@@ -395,6 +410,7 @@ function generateStyle(settings, app) {
395 useGrayscaleServices, 410 useGrayscaleServices,
396 grayscaleServicesDim, 411 grayscaleServicesDim,
397 shouldShowDragArea, 412 shouldShowDragArea,
413 isFullScreen,
398 ); 414 );
399 415
400 if (shouldShowDragArea) { 416 if (shouldShowDragArea) {
@@ -412,6 +428,8 @@ function generateStyle(settings, app) {
412 style += generateOpenWorkspaceStyle(); 428 style += generateOpenWorkspaceStyle();
413 } 429 }
414 430
431 style += generateUserCustomCSS();
432
415 return style; 433 return style;
416} 434}
417 435
diff --git a/src/i18n/locales/es.json b/src/i18n/locales/es.json
index 18e5339e5..dc45780aa 100644
--- a/src/i18n/locales/es.json
+++ b/src/i18n/locales/es.json
@@ -58,6 +58,7 @@
58 "locked.password.label": "Contraseña", 58 "locked.password.label": "Contraseña",
59 "locked.submit.label": "Desbloquear", 59 "locked.submit.label": "Desbloquear",
60 "locked.touchId": "Desbloquear con Touch ID", 60 "locked.touchId": "Desbloquear con Touch ID",
61 "locked.touchIdPrompt": "Desbloquear con Touch ID",
61 "locked.unlockWithPassword": "Desbloquear con contraseña", 62 "locked.unlockWithPassword": "Desbloquear con contraseña",
62 "login.changeServer": "Cambiar aquí.", 63 "login.changeServer": "Cambiar aquí.",
63 "login.changeServerMessage": "Estás usando el servidor {serverNameParse}, ¿quieres cambiar?", 64 "login.changeServerMessage": "Estás usando el servidor {serverNameParse}, ¿quieres cambiar?",
@@ -243,6 +244,7 @@
243 "settings.app.form.scheduledDNDEnd": "A", 244 "settings.app.form.scheduledDNDEnd": "A",
244 "settings.app.form.scheduledDNDStart": "De", 245 "settings.app.form.scheduledDNDStart": "De",
245 "settings.app.form.searchEngine": "Motor de búsqueda", 246 "settings.app.form.searchEngine": "Motor de búsqueda",
247 "settings.app.form.sentry": "Enviar datos de telemetría",
246 "settings.app.form.serviceRibbonWidth": "Ancho de Barra Lateral", 248 "settings.app.form.serviceRibbonWidth": "Ancho de Barra Lateral",
247 "settings.app.form.showDisabledServices": "Mostrar pestañas de servicios desactivados", 249 "settings.app.form.showDisabledServices": "Mostrar pestañas de servicios desactivados",
248 "settings.app.form.showDragArea": "Mostrar área arrastrable en la ventana", 250 "settings.app.form.showDragArea": "Mostrar área arrastrable en la ventana",
@@ -279,6 +281,7 @@
279 "settings.app.restartRequired": "Los cambios requieren reiniciar", 281 "settings.app.restartRequired": "Los cambios requieren reiniciar",
280 "settings.app.scheduledDNDInfo": "El \"No molestar\" programado permite definir un período de tiempo en el que no recibir notificaciones de Ferdium.", 282 "settings.app.scheduledDNDInfo": "El \"No molestar\" programado permite definir un período de tiempo en el que no recibir notificaciones de Ferdium.",
281 "settings.app.scheduledDNDTimeInfo": "Horas en formato 24 horas. La hora de finalización puede ser anterior a la hora de inicio (por ejemplo, inicio 17:00, final 09:00) para habilitar No molestar la noche.", 283 "settings.app.scheduledDNDTimeInfo": "Horas en formato 24 horas. La hora de finalización puede ser anterior a la hora de inicio (por ejemplo, inicio 17:00, final 09:00) para habilitar No molestar la noche.",
284 "settings.app.sectionAccentColorSettings": "Color de Énfasis",
282 "settings.app.sectionAdvanced": "Configuración Avanzada", 285 "settings.app.sectionAdvanced": "Configuración Avanzada",
283 "settings.app.sectionGeneralUi": "Interfaz general", 286 "settings.app.sectionGeneralUi": "Interfaz general",
284 "settings.app.sectionHibernation": "Hibernación", 287 "settings.app.sectionHibernation": "Hibernación",
@@ -288,6 +291,7 @@
288 "settings.app.sectionServiceIconsSettings": "Configuración de iconos de servicios", 291 "settings.app.sectionServiceIconsSettings": "Configuración de iconos de servicios",
289 "settings.app.sectionSidebarSettings": "Ajustes de la barra lateral", 292 "settings.app.sectionSidebarSettings": "Ajustes de la barra lateral",
290 "settings.app.sectionUpdates": "Ajustes de actualizaciones", 293 "settings.app.sectionUpdates": "Ajustes de actualizaciones",
294 "settings.app.sentryInfo": "El envío de datos de telemetría nos permite encontrar errores en Ferdium - ¡No enviaremos ninguna información personal como sus mensajes!",
291 "settings.app.serverHelp": "Conectado con el servidor {serverURL}", 295 "settings.app.serverHelp": "Conectado con el servidor {serverURL}",
292 "settings.app.spellCheckerLanguageInfo": "Ferdium utiliza el corrector ortográfico incluido en su Mac. Si desea cambiar los lenguajes que el corrector ortográfico revisa, lo puede hacer en las Preferencias del Sistema de su Mac.", 296 "settings.app.spellCheckerLanguageInfo": "Ferdium utiliza el corrector ortográfico incluido en su Mac. Si desea cambiar los lenguajes que el corrector ortográfico revisa, lo puede hacer en las Preferencias del Sistema de su Mac.",
293 "settings.app.subheadlineCache": "Caché", 297 "settings.app.subheadlineCache": "Caché",
@@ -315,6 +319,7 @@
315 "settings.recipes.customService.intro": "Para añadir un servicio personalizado, copie la carpeta con la configuración (recipe) del servicio en:", 319 "settings.recipes.customService.intro": "Para añadir un servicio personalizado, copie la carpeta con la configuración (recipe) del servicio en:",
316 "settings.recipes.customService.openDevDocs": "Documentación para desarrolladores", 320 "settings.recipes.customService.openDevDocs": "Documentación para desarrolladores",
317 "settings.recipes.customService.openFolder": "Abrir carpeta", 321 "settings.recipes.customService.openFolder": "Abrir carpeta",
322 "settings.recipes.ferdiumPicks": "Picks de Ferdium",
318 "settings.recipes.headline": "Servicios disponibles", 323 "settings.recipes.headline": "Servicios disponibles",
319 "settings.recipes.missingService": "¿Echas de menos algún servicio?", 324 "settings.recipes.missingService": "¿Echas de menos algún servicio?",
320 "settings.recipes.nothingFound": "Lo sentimos, pero no pudimos encontrar ningún servicio similar a tu búsqueda, sin embargo: puedes agregarlo utilizando la opción de \"Sitio web personalizado\". \nRecuerda que pueden aparecer más servicios de los que has agregado a Ferdium desde la versión que estás utilizando. Para poder utilizar los nuevos servicios disponibles, considera actualizar a la versión más reciente.", 325 "settings.recipes.nothingFound": "Lo sentimos, pero no pudimos encontrar ningún servicio similar a tu búsqueda, sin embargo: puedes agregarlo utilizando la opción de \"Sitio web personalizado\". \nRecuerda que pueden aparecer más servicios de los que has agregado a Ferdium desde la versión que estás utilizando. Para poder utilizar los nuevos servicios disponibles, considera actualizar a la versión más reciente.",
@@ -339,6 +344,7 @@
339 "settings.service.form.enableBadge": "Mostrar señal de mensajes no leídos", 344 "settings.service.form.enableBadge": "Mostrar señal de mensajes no leídos",
340 "settings.service.form.enableDarkMode": "Habilitar modo oscuro", 345 "settings.service.form.enableDarkMode": "Habilitar modo oscuro",
341 "settings.service.form.enableHibernation": "Habilitar hibernación", 346 "settings.service.form.enableHibernation": "Habilitar hibernación",
347 "settings.service.form.enableMediaBadge": "Activar indicador de reproducción de medios",
342 "settings.service.form.enableNotification": "Activar notificaciones", 348 "settings.service.form.enableNotification": "Activar notificaciones",
343 "settings.service.form.enableProgressbar": "Activar la barra de progreso", 349 "settings.service.form.enableProgressbar": "Activar la barra de progreso",
344 "settings.service.form.enableService": "Activar servicio", 350 "settings.service.form.enableService": "Activar servicio",
@@ -440,6 +446,7 @@
440 "sidebar.openWorkspaceDrawer": "Abrir diseñador de espacios de trabajo", 446 "sidebar.openWorkspaceDrawer": "Abrir diseñador de espacios de trabajo",
441 "sidebar.splitModeToggle": "Cambiar modo dividido", 447 "sidebar.splitModeToggle": "Cambiar modo dividido",
442 "sidebar.unmuteApp": "Activar notificaciones y sonido", 448 "sidebar.unmuteApp": "Activar notificaciones y sonido",
449 "signup.company.label": "Empresa",
443 "signup.email.label": "Dirección de correo electrónico", 450 "signup.email.label": "Dirección de correo electrónico",
444 "signup.emailDuplicate": "Ya existe un usuario con esa dirección de correo electrónico", 451 "signup.emailDuplicate": "Ya existe un usuario con esa dirección de correo electrónico",
445 "signup.firstname.label": "Nombre", 452 "signup.firstname.label": "Nombre",
diff --git a/src/i18n/locales/he.json b/src/i18n/locales/he.json
index af16fbced..fb401d66f 100644
--- a/src/i18n/locales/he.json
+++ b/src/i18n/locales/he.json
@@ -58,6 +58,7 @@
58 "locked.password.label": "סיסמה", 58 "locked.password.label": "סיסמה",
59 "locked.submit.label": "שחרור נעילה", 59 "locked.submit.label": "שחרור נעילה",
60 "locked.touchId": "שחרור נעילה עם Touch ID", 60 "locked.touchId": "שחרור נעילה עם Touch ID",
61 "locked.touchIdPrompt": "שחרור נעילה עם Touch ID",
61 "locked.unlockWithPassword": "שחרור נעילה עם סיסמה", 62 "locked.unlockWithPassword": "שחרור נעילה עם סיסמה",
62 "login.changeServer": "החלפה מכאן!", 63 "login.changeServer": "החלפה מכאן!",
63 "login.changeServerMessage": "בחרת להשתמש בשרת {serverNameParse}, להחליף?", 64 "login.changeServerMessage": "בחרת להשתמש בשרת {serverNameParse}, להחליף?",
@@ -243,6 +244,7 @@
243 "settings.app.form.scheduledDNDEnd": "התחלה", 244 "settings.app.form.scheduledDNDEnd": "התחלה",
244 "settings.app.form.scheduledDNDStart": "סיום", 245 "settings.app.form.scheduledDNDStart": "סיום",
245 "settings.app.form.searchEngine": "מנוע חיפוש", 246 "settings.app.form.searchEngine": "מנוע חיפוש",
247 "settings.app.form.sentry": "שליחת נתונים טלמטריים",
246 "settings.app.form.serviceRibbonWidth": "רוחב סרגל צד", 248 "settings.app.form.serviceRibbonWidth": "רוחב סרגל צד",
247 "settings.app.form.showDisabledServices": "הצגת לשוניות שירותים מושבתים", 249 "settings.app.form.showDisabledServices": "הצגת לשוניות שירותים מושבתים",
248 "settings.app.form.showDragArea": "הצגת אזור לגרירה בחלון", 250 "settings.app.form.showDragArea": "הצגת אזור לגרירה בחלון",
@@ -261,6 +263,7 @@
261 "settings.app.form.wakeUpHibernationSplay": "להרחיב את מחזורי הרדמה/השכמה כדי להפחית בעומס", 263 "settings.app.form.wakeUpHibernationSplay": "להרחיב את מחזורי הרדמה/השכמה כדי להפחית בעומס",
262 "settings.app.form.wakeUpHibernationStrategy": "אסטרטגיית הרדמה לאחר השכמה אוטומטית", 264 "settings.app.form.wakeUpHibernationStrategy": "אסטרטגיית הרדמה לאחר השכמה אוטומטית",
263 "settings.app.form.wakeUpStrategy": "אסטרטגיית השכמה", 265 "settings.app.form.wakeUpStrategy": "אסטרטגיית השכמה",
266 "settings.app.form.webRTCIPHandlingPolicy": "מדיניות טיפול ב־IP ע״י WebRTC",
264 "settings.app.headlineAdvanced": "מתקדם", 267 "settings.app.headlineAdvanced": "מתקדם",
265 "settings.app.headlineAppearance": "מראה", 268 "settings.app.headlineAppearance": "מראה",
266 "settings.app.headlineGeneral": "כללי", 269 "settings.app.headlineGeneral": "כללי",
@@ -288,6 +291,7 @@
288 "settings.app.sectionServiceIconsSettings": "הגדרות סמלי שירות", 291 "settings.app.sectionServiceIconsSettings": "הגדרות סמלי שירות",
289 "settings.app.sectionSidebarSettings": "הגדרות סרגל צד", 292 "settings.app.sectionSidebarSettings": "הגדרות סרגל צד",
290 "settings.app.sectionUpdates": "הגדרות עדכוני יישום", 293 "settings.app.sectionUpdates": "הגדרות עדכוני יישום",
294 "settings.app.sentryInfo": "שליחת נתונים טלמטריים מאפשרות לנו למצוא שגיאות ב־Ferdium - אנו לא נשלח מידע פרטי כגון תוכן ההודעות שלך!",
291 "settings.app.serverHelp": "יש חיבור לשרת ב־{serverURL}", 295 "settings.app.serverHelp": "יש חיבור לשרת ב־{serverURL}",
292 "settings.app.spellCheckerLanguageInfo": "ב־Ferdium נעשה שימוש בבודק האיות המובנה של Mac כדי לבדוק שגיאות הקלדה. כדי לשנות את שפות הבדיקה של בודק האיות ניתן לעשות זאת בהגדרות המערכת של ה־Mac.", 296 "settings.app.spellCheckerLanguageInfo": "ב־Ferdium נעשה שימוש בבודק האיות המובנה של Mac כדי לבדוק שגיאות הקלדה. כדי לשנות את שפות הבדיקה של בודק האיות ניתן לעשות זאת בהגדרות המערכת של ה־Mac.",
293 "settings.app.subheadlineCache": "זיכרון מטמון", 297 "settings.app.subheadlineCache": "זיכרון מטמון",
@@ -340,6 +344,7 @@
340 "settings.service.form.enableBadge": "הצגת חיווי על הודעות שלא נקראו", 344 "settings.service.form.enableBadge": "הצגת חיווי על הודעות שלא נקראו",
341 "settings.service.form.enableDarkMode": "הפעלת מצב לילה", 345 "settings.service.form.enableDarkMode": "הפעלת מצב לילה",
342 "settings.service.form.enableHibernation": "הפעלת הרדמה", 346 "settings.service.form.enableHibernation": "הפעלת הרדמה",
347 "settings.service.form.enableMediaBadge": "הפעלת מחוון נגינת מדיה",
343 "settings.service.form.enableNotification": "הפעלת התראות", 348 "settings.service.form.enableNotification": "הפעלת התראות",
344 "settings.service.form.enableProgressbar": "הפעלת סרגל ההתקדמות", 349 "settings.service.form.enableProgressbar": "הפעלת סרגל ההתקדמות",
345 "settings.service.form.enableService": "הפעלת שירות", 350 "settings.service.form.enableService": "הפעלת שירות",
@@ -441,6 +446,7 @@
441 "sidebar.openWorkspaceDrawer": "פתיחת מגירת סביבות העבודה", 446 "sidebar.openWorkspaceDrawer": "פתיחת מגירת סביבות העבודה",
442 "sidebar.splitModeToggle": "החלפת מצב פיצול", 447 "sidebar.splitModeToggle": "החלפת מצב פיצול",
443 "sidebar.unmuteApp": "להפעיל התראות ושמע", 448 "sidebar.unmuteApp": "להפעיל התראות ושמע",
449 "signup.company.label": "חברה",
444 "signup.email.label": "כתובת דוא״ל", 450 "signup.email.label": "כתובת דוא״ל",
445 "signup.emailDuplicate": "כבר קיים חשבון עם כתובת דוא״ל זו", 451 "signup.emailDuplicate": "כבר קיים חשבון עם כתובת דוא״ל זו",
446 "signup.firstname.label": "שם פרטי", 452 "signup.firstname.label": "שם פרטי",
diff --git a/src/i18n/locales/nl.json b/src/i18n/locales/nl.json
index 4465c7c0b..42c44cc02 100644
--- a/src/i18n/locales/nl.json
+++ b/src/i18n/locales/nl.json
@@ -58,6 +58,7 @@
58 "locked.password.label": "Wachtwoord", 58 "locked.password.label": "Wachtwoord",
59 "locked.submit.label": "Ontgrendelen", 59 "locked.submit.label": "Ontgrendelen",
60 "locked.touchId": "Ontgrendelen met Touch ID", 60 "locked.touchId": "Ontgrendelen met Touch ID",
61 "locked.touchIdPrompt": "Ontgrendelen met Touch ID",
61 "locked.unlockWithPassword": "Ontgrendelen met wachtwoord", 62 "locked.unlockWithPassword": "Ontgrendelen met wachtwoord",
62 "login.changeServer": "Wijzig hier!", 63 "login.changeServer": "Wijzig hier!",
63 "login.changeServerMessage": "U gebruikt {serverNameParse} Server, wilt u wisselen?", 64 "login.changeServerMessage": "U gebruikt {serverNameParse} Server, wilt u wisselen?",
@@ -243,6 +244,7 @@
243 "settings.app.form.scheduledDNDEnd": "Tot", 244 "settings.app.form.scheduledDNDEnd": "Tot",
244 "settings.app.form.scheduledDNDStart": "Van", 245 "settings.app.form.scheduledDNDStart": "Van",
245 "settings.app.form.searchEngine": "Zoekmachine", 246 "settings.app.form.searchEngine": "Zoekmachine",
247 "settings.app.form.sentry": "Verstuur prestatiegegevens",
246 "settings.app.form.serviceRibbonWidth": "Breedte van de zijbalk", 248 "settings.app.form.serviceRibbonWidth": "Breedte van de zijbalk",
247 "settings.app.form.showDisabledServices": "Toon uitgeschakelde diensten", 249 "settings.app.form.showDisabledServices": "Toon uitgeschakelde diensten",
248 "settings.app.form.showDragArea": "Sleepbaar gebied in venster tonen", 250 "settings.app.form.showDragArea": "Sleepbaar gebied in venster tonen",
@@ -289,6 +291,7 @@
289 "settings.app.sectionServiceIconsSettings": "Service pictogrammen instellingen", 291 "settings.app.sectionServiceIconsSettings": "Service pictogrammen instellingen",
290 "settings.app.sectionSidebarSettings": "Sidebar instellingen", 292 "settings.app.sectionSidebarSettings": "Sidebar instellingen",
291 "settings.app.sectionUpdates": "App Updates Instellingen", 293 "settings.app.sectionUpdates": "App Updates Instellingen",
294 "settings.app.sentryInfo": "Als je prestatiegegevens laat verzenden, kunnen we fouten in Ferdium vinden. We verzenden geen persoonlijke informatie, zoals berichtgegevens!",
292 "settings.app.serverHelp": "Verbonden met de server op {serverURL}", 295 "settings.app.serverHelp": "Verbonden met de server op {serverURL}",
293 "settings.app.spellCheckerLanguageInfo": "Ferdium maakt gebruik van de ingebouwde spellingscontrole op je Mac om typfouten te zoeken. Als je wilt aanpassen welke talen worden gecontroleerd, kun je dat doen in Systeemvoorkeuren op je Mac.", 296 "settings.app.spellCheckerLanguageInfo": "Ferdium maakt gebruik van de ingebouwde spellingscontrole op je Mac om typfouten te zoeken. Als je wilt aanpassen welke talen worden gecontroleerd, kun je dat doen in Systeemvoorkeuren op je Mac.",
294 "settings.app.subheadlineCache": "Cache", 297 "settings.app.subheadlineCache": "Cache",
@@ -307,7 +310,7 @@
307 "settings.navigation.supportFerdium": "Over Ferdium", 310 "settings.navigation.supportFerdium": "Over Ferdium",
308 "settings.navigation.team": "Team beheren", 311 "settings.navigation.team": "Team beheren",
309 "settings.navigation.yourServices": "Uw diensten", 312 "settings.navigation.yourServices": "Uw diensten",
310 "settings.navigation.yourWorkspaces": "Jouw werkruimtes", 313 "settings.navigation.yourWorkspaces": "Uw werkruimtes",
311 "settings.recipes.all": "Alle services", 314 "settings.recipes.all": "Alle services",
312 "settings.recipes.custom": "Aangepaste services", 315 "settings.recipes.custom": "Aangepaste services",
313 "settings.recipes.customService.headline.communityRecipes": "Communityrecepten", 316 "settings.recipes.customService.headline.communityRecipes": "Communityrecepten",
@@ -341,6 +344,7 @@
341 "settings.service.form.enableBadge": "Toon badges met ongelezen berichten", 344 "settings.service.form.enableBadge": "Toon badges met ongelezen berichten",
342 "settings.service.form.enableDarkMode": "Donkere modus inschakelen", 345 "settings.service.form.enableDarkMode": "Donkere modus inschakelen",
343 "settings.service.form.enableHibernation": "Slaapstand inschakelen", 346 "settings.service.form.enableHibernation": "Slaapstand inschakelen",
347 "settings.service.form.enableMediaBadge": "Inschakelen indicator afspelen media",
344 "settings.service.form.enableNotification": "Meldingen inschakelen", 348 "settings.service.form.enableNotification": "Meldingen inschakelen",
345 "settings.service.form.enableProgressbar": "Voortgangsbalk inschakelen", 349 "settings.service.form.enableProgressbar": "Voortgangsbalk inschakelen",
346 "settings.service.form.enableService": "Dienst inschakelen", 350 "settings.service.form.enableService": "Dienst inschakelen",
@@ -420,15 +424,15 @@
420 "settings.workspace.form.keepLoadedInfo": "* Deze optie wordt overschreven door de globale optie 'Alle werkruimtes geladen houden'.", 424 "settings.workspace.form.keepLoadedInfo": "* Deze optie wordt overschreven door de globale optie 'Alle werkruimtes geladen houden'.",
421 "settings.workspace.form.name": "Naam", 425 "settings.workspace.form.name": "Naam",
422 "settings.workspace.form.servicesInWorkspaceHeadline": "Diensten in deze werkruimte", 426 "settings.workspace.form.servicesInWorkspaceHeadline": "Diensten in deze werkruimte",
423 "settings.workspace.form.yourWorkspaces": "Jouw werkruimtes", 427 "settings.workspace.form.yourWorkspaces": "Uw werkruimtes",
424 "settings.workspaces.deletedInfo": "Werkruimte is verwijderd", 428 "settings.workspaces.deletedInfo": "Werkruimte is verwijderd",
425 "settings.workspaces.headline": "Jouw werkruimtes", 429 "settings.workspaces.headline": "Uw werkruimtes",
426 "settings.workspaces.noWorkspacesAdded": "Je hebt nog geen werkruimtes gemaakt.", 430 "settings.workspaces.noWorkspacesAdded": "Je hebt nog geen werkruimtes gemaakt.",
427 "settings.workspaces.tryReloadWorkspaces": "Probeer opnieuw", 431 "settings.workspaces.tryReloadWorkspaces": "Probeer opnieuw",
428 "settings.workspaces.updatedInfo": "Je wijzigingen zijn opgeslagen", 432 "settings.workspaces.updatedInfo": "Je wijzigingen zijn opgeslagen",
429 "settings.workspaces.workspaceFeatureHeadline": "Less is More: Zie hier Ferdium Werkruimtes", 433 "settings.workspaces.workspaceFeatureHeadline": "Less is More: Zie hier Ferdium Werkruimtes",
430 "settings.workspaces.workspaceFeatureInfo": "Ferdium Workspaces laten u focussen op wat er op dit moment belangrijk is. Stel verschillende soorten diensten in en schakel er op elk moment eenvoudig tussen in. Je bepaalt welke diensten je nodig hebt wanneer en waar zodat we je kunnen helpen om aan je spel te blijven - of eenvoudig uit te schakelen van werk wanneer je maar wilt.", 434 "settings.workspaces.workspaceFeatureInfo": "Ferdium Workspaces laten u focussen op wat er op dit moment belangrijk is. Stel verschillende soorten diensten in en schakel er op elk moment eenvoudig tussen in. Je bepaalt welke diensten je nodig hebt wanneer en waar zodat we je kunnen helpen om aan je spel te blijven - of eenvoudig uit te schakelen van werk wanneer je maar wilt.",
431 "settings.workspaces.workspacesRequestFailed": "Kan jouw werkruimtes niet laden", 435 "settings.workspaces.workspacesRequestFailed": "Kan uw werkruimtes niet laden",
432 "setupAssistant.headline": "Laten we beginnen", 436 "setupAssistant.headline": "Laten we beginnen",
433 "setupAssistant.skip.label": "Overslaan", 437 "setupAssistant.skip.label": "Overslaan",
434 "setupAssistant.subheadline": "Kies uit onze meest gebruikte diensten en sta nu op de top van uw berichten.", 438 "setupAssistant.subheadline": "Kies uit onze meest gebruikte diensten en sta nu op de top van uw berichten.",
diff --git a/src/i18n/locales/uk.json b/src/i18n/locales/uk.json
index 0ecd83a41..aea5a7030 100644
--- a/src/i18n/locales/uk.json
+++ b/src/i18n/locales/uk.json
@@ -20,6 +20,7 @@
20 "feature.quickSwitch.info": "Виберіть сервіс за допомогою TAB, стрілок ↑ та ↓. Натисніть ENTER, щоб відкрити.", 20 "feature.quickSwitch.info": "Виберіть сервіс за допомогою TAB, стрілок ↑ та ↓. Натисніть ENTER, щоб відкрити.",
21 "feature.quickSwitch.search": "Пошук...", 21 "feature.quickSwitch.search": "Пошук...",
22 "feature.quickSwitch.title": "Швидке перемикання", 22 "feature.quickSwitch.title": "Швидке перемикання",
23 "global.api.unhealthy": "Не вдалося під'єднатися до {serverNameParse} онлайн-сервісів",
23 "global.cancel": "Відмінити", 24 "global.cancel": "Відмінити",
24 "global.edit": "Редагувати", 25 "global.edit": "Редагувати",
25 "global.no": "Ні", 26 "global.no": "Ні",
@@ -57,7 +58,12 @@
57 "locked.password.label": "Пароль", 58 "locked.password.label": "Пароль",
58 "locked.submit.label": "Розблокувати", 59 "locked.submit.label": "Розблокувати",
59 "locked.touchId": "Розблокувати за допомогою Touch ID", 60 "locked.touchId": "Розблокувати за допомогою Touch ID",
61 "locked.touchIdPrompt": "Розблокувати за допомогою Touch ID",
60 "locked.unlockWithPassword": "Розблокування паролем", 62 "locked.unlockWithPassword": "Розблокування паролем",
63 "login.changeServer": "Змінити тут!",
64 "login.changeServerMessage": "Ви використовуєте {serverNameParse} сервер, бажаєте перемкнутися?",
65 "login.customServerQuestion": "Використовуєте користувацький сервер Ferdium?",
66 "login.customServerSuggestion": "Спробуйте імпортувати свій обліковий запис Franz",
61 "login.email.label": "Email адреса", 67 "login.email.label": "Email адреса",
62 "login.headline": "Увійти", 68 "login.headline": "Увійти",
63 "login.invalidCredentials": "Email або пароль некоректні", 69 "login.invalidCredentials": "Email або пароль некоректні",
@@ -105,9 +111,11 @@
105 "menu.services": "Служби", 111 "menu.services": "Служби",
106 "menu.services.activatePreviousService": "Активувати попередній сервіс", 112 "menu.services.activatePreviousService": "Активувати попередній сервіс",
107 "menu.services.addNewService": "Додати новий сервіс...", 113 "menu.services.addNewService": "Додати новий сервіс...",
114 "menu.services.copyToClipboard": "Скопіювати до буфера обміну",
108 "menu.services.goHome": "Головна", 115 "menu.services.goHome": "Головна",
109 "menu.services.setNextServiceActive": "Активувати наступний сервіс", 116 "menu.services.setNextServiceActive": "Активувати наступний сервіс",
110 "menu.todos": "Завдання", 117 "menu.todos": "Завдання",
118 "menu.todos.disableTodos": "Вимкнути Завдання",
111 "menu.todos.enableTodos": "Увімкнути Завдання", 119 "menu.todos.enableTodos": "Увімкнути Завдання",
112 "menu.view": "Вигляд", 120 "menu.view": "Вигляд",
113 "menu.view.back": "Назад", 121 "menu.view.back": "Назад",
@@ -118,9 +126,11 @@
118 "menu.view.reloadService": "Перезавантажити сервіс", 126 "menu.view.reloadService": "Перезавантажити сервіс",
119 "menu.view.reloadTodos": "Перезавантажити Завдання", 127 "menu.view.reloadTodos": "Перезавантажити Завдання",
120 "menu.view.resetZoom": "Фактичний розмір", 128 "menu.view.resetZoom": "Фактичний розмір",
129 "menu.view.splitModeToggle": "Перемикання режиму розділеного перегляду",
121 "menu.view.toggleDarkMode": "Перемкнути темний режим", 130 "menu.view.toggleDarkMode": "Перемкнути темний режим",
122 "menu.view.toggleDevTools": "Перемкнути інструменти розробника", 131 "menu.view.toggleDevTools": "Перемкнути інструменти розробника",
123 "menu.view.toggleFullScreen": "Перемкнути повноекранний режим", 132 "menu.view.toggleFullScreen": "Перемкнути повноекранний режим",
133 "menu.view.toggleNavigationBar": "Перемикання Панелі навігації",
124 "menu.view.toggleServiceDevTools": "Перемкнути інструменти розробника сервісу", 134 "menu.view.toggleServiceDevTools": "Перемкнути інструменти розробника сервісу",
125 "menu.view.toggleTodosDevTools": "Перемкнути інструменти розробника Завдань", 135 "menu.view.toggleTodosDevTools": "Перемкнути інструменти розробника Завдань",
126 "menu.view.zoomIn": "Збільшити", 136 "menu.view.zoomIn": "Збільшити",
@@ -173,11 +183,14 @@
173 "settings.account.tryReloadUserInfoRequest": "Спробуйте ще раз", 183 "settings.account.tryReloadUserInfoRequest": "Спробуйте ще раз",
174 "settings.account.userInfoRequestFailed": "Не вдалося завантажити інформацію користувача", 184 "settings.account.userInfoRequestFailed": "Не вдалося завантажити інформацію користувача",
175 "settings.account.yourLicense": "Ваша ліцензія Ferdium:", 185 "settings.account.yourLicense": "Ваша ліцензія Ferdium:",
186 "settings.app.accentColorInfo": "Впишіть вибраний вами колір у форматі, сумісному з CSS. (За промовчуванням: {defaultAccentColor} або залиште пустим поле введення)",
176 "settings.app.buttonClearAllCache": "Очистити кеш", 187 "settings.app.buttonClearAllCache": "Очистити кеш",
177 "settings.app.buttonInstallUpdate": "Перезавантажити і встановити оновлення", 188 "settings.app.buttonInstallUpdate": "Перезавантажити і встановити оновлення",
178 "settings.app.buttonOpenFerdiumProfileFolder": "Відкрити папку профілю", 189 "settings.app.buttonOpenFerdiumProfileFolder": "Відкрити папку профілю",
179 "settings.app.buttonOpenFerdiumServiceRecipesFolder": "Відкрити папку сервісних протоколів", 190 "settings.app.buttonOpenFerdiumServiceRecipesFolder": "Відкрити папку сервісних протоколів",
191 "settings.app.buttonOpenImportExport": "Імпорт / Експорт",
180 "settings.app.buttonSearchForUpdate": "Перевірити наявність оновлень", 192 "settings.app.buttonSearchForUpdate": "Перевірити наявність оновлень",
193 "settings.app.buttonShowChangelog": "Показати журнал змін",
181 "settings.app.cacheInfo": "Кеш, який використовує Ferdium, займає {size} дискового простору.", 194 "settings.app.cacheInfo": "Кеш, який використовує Ferdium, займає {size} дискового простору.",
182 "settings.app.cacheNotCleared": "Не вдалося очистити весь кеш", 195 "settings.app.cacheNotCleared": "Не вдалося очистити весь кеш",
183 "settings.app.closeSettings": "Закрити налаштування", 196 "settings.app.closeSettings": "Закрити налаштування",
@@ -202,8 +215,14 @@
202 "settings.app.form.enableSpellchecking": "Увімкнути перевірку орфографії", 215 "settings.app.form.enableSpellchecking": "Увімкнути перевірку орфографії",
203 "settings.app.form.enableSystemTray": "Завжди показувати Ferdium в системному треї", 216 "settings.app.form.enableSystemTray": "Завжди показувати Ferdium в системному треї",
204 "settings.app.form.enableTodos": "Увімкнути Завдання Ferdium", 217 "settings.app.form.enableTodos": "Увімкнути Завдання Ferdium",
218 "settings.app.form.enableTranslator": "Увімкнути Перекладач",
219 "settings.app.form.grayscaleServicesDim": "Рівень затемнення відтінку сірого",
205 "settings.app.form.hibernateOnStartup": "Залишати сервіси в режимі глибокого сну при запуску", 220 "settings.app.form.hibernateOnStartup": "Залишати сервіси в режимі глибокого сну при запуску",
206 "settings.app.form.hibernationStrategy": "Стратегія режиму глибокого сну", 221 "settings.app.form.hibernationStrategy": "Стратегія режиму глибокого сну",
222 "settings.app.form.hideNotificationsButton": "Приховати кнопку Сповіщення та звуку",
223 "settings.app.form.hideSettingsButton": "Приховати кнопку Налаштування",
224 "settings.app.form.hideSplitModeButton": "Приховати кнопку Перемикання режиму розділеного перегляду",
225 "settings.app.form.hideWorkspacesButton": "Приховати кнопку Меню робочого простору",
207 "settings.app.form.iconSize": "Розмір іконки сервіса", 226 "settings.app.form.iconSize": "Розмір іконки сервіса",
208 "settings.app.form.inactivityLock": "Блокувати після бездіяльності", 227 "settings.app.form.inactivityLock": "Блокувати після бездіяльності",
209 "settings.app.form.keepAllWorkspacesLoaded": "Зберігати всі робочі простори завантаженими", 228 "settings.app.form.keepAllWorkspacesLoaded": "Зберігати всі робочі простори завантаженими",
@@ -221,6 +240,7 @@
221 "settings.app.form.scheduledDNDEnd": "До", 240 "settings.app.form.scheduledDNDEnd": "До",
222 "settings.app.form.scheduledDNDStart": "Від", 241 "settings.app.form.scheduledDNDStart": "Від",
223 "settings.app.form.searchEngine": "Пошукова система", 242 "settings.app.form.searchEngine": "Пошукова система",
243 "settings.app.form.sentry": "Надсилати дані телеметрії",
224 "settings.app.form.serviceRibbonWidth": "Ширина бічної панелі", 244 "settings.app.form.serviceRibbonWidth": "Ширина бічної панелі",
225 "settings.app.form.showDisabledServices": "Показати вкладку вимкнених сервісів", 245 "settings.app.form.showDisabledServices": "Показати вкладку вимкнених сервісів",
226 "settings.app.form.showDragArea": "Показати у вікні область, яку можна перетягнути", 246 "settings.app.form.showDragArea": "Показати у вікні область, яку можна перетягнути",
@@ -229,22 +249,29 @@
229 "settings.app.form.splitColumns": "Кількість стовпчиків", 249 "settings.app.form.splitColumns": "Кількість стовпчиків",
230 "settings.app.form.splitMode": "Увімкнути режим розділеного перегляду", 250 "settings.app.form.splitMode": "Увімкнути режим розділеного перегляду",
231 "settings.app.form.startMinimized": "Запускати згорнутим", 251 "settings.app.form.startMinimized": "Запускати згорнутим",
252 "settings.app.form.translatorEngine": "Рушій Перекладача",
253 "settings.app.form.translatorLanguage": "Мова Перекладача за замовчуванням",
232 "settings.app.form.universalDarkMode": "Увімкнути універсальний темний режим", 254 "settings.app.form.universalDarkMode": "Увімкнути універсальний темний режим",
255 "settings.app.form.useGrayscaleServices": "Використовувати сервіси відтінку сірого",
256 "settings.app.form.useHorizontalStyle": "Використовувати горизонтальний стиль",
233 "settings.app.form.useTouchIdToUnlock": "Дозволити використання TouchID для розблокування Ferdium", 257 "settings.app.form.useTouchIdToUnlock": "Дозволити використання TouchID для розблокування Ferdium",
234 "settings.app.form.wakeUpHibernationSplay": "Чергування циклів гібернації/пробудження для зменшення навантаження", 258 "settings.app.form.wakeUpHibernationSplay": "Чергування циклів гібернації/пробудження для зменшення навантаження",
235 "settings.app.form.wakeUpHibernationStrategy": "Стратегія режиму гібернації після автоматичного пробудження", 259 "settings.app.form.wakeUpHibernationStrategy": "Стратегія режиму гібернації після автоматичного пробудження",
236 "settings.app.form.wakeUpStrategy": "Стратегія пробудження", 260 "settings.app.form.wakeUpStrategy": "Стратегія пробудження",
261 "settings.app.form.webRTCIPHandlingPolicy": "Правила обробки IP у WebRTC",
237 "settings.app.headlineAdvanced": "Додаткові налаштування", 262 "settings.app.headlineAdvanced": "Додаткові налаштування",
238 "settings.app.headlineAppearance": "Вигляд", 263 "settings.app.headlineAppearance": "Вигляд",
239 "settings.app.headlineGeneral": "Загальні", 264 "settings.app.headlineGeneral": "Загальні",
240 "settings.app.headlineLanguage": "Мова", 265 "settings.app.headlineLanguage": "Мова",
241 "settings.app.headlinePrivacy": "Конфіденційність", 266 "settings.app.headlinePrivacy": "Конфіденційність",
267 "settings.app.headlineServices": "Сервіси",
242 "settings.app.headlineUpdates": "Оновлення", 268 "settings.app.headlineUpdates": "Оновлення",
243 "settings.app.hibernateInfo": "За замовчуванням, Ferdium залишає всі ваші сервіси відкритими та завантажує їх у фоновому режимі, щоб вони були готові, коли ви захочете їх використати. Режим глибокого сну розвантажить ваші сервіси після зазначеної кількості хвилин. Це корисно для заощадження оперативної пам’яті або щоб послуги не сповільнювали роботу комп’ютера.", 269 "settings.app.hibernateInfo": "За замовчуванням, Ferdium залишає всі ваші сервіси відкритими та завантажує їх у фоновому режимі, щоб вони були готові, коли ви захочете їх використати. Режим глибокого сну розвантажить ваші сервіси після зазначеної кількості хвилин. Це корисно для заощадження оперативної пам’яті або щоб послуги не сповільнювали роботу комп’ютера.",
244 "settings.app.inactivityLockInfo": "Кількість хвилин бездіяльності, після якої Ferdium буде автоматично блокуватись. Використайте 0, щоб не блокуватись", 270 "settings.app.inactivityLockInfo": "Кількість хвилин бездіяльності, після якої Ferdium буде автоматично блокуватись. Використайте 0, щоб не блокуватись",
245 "settings.app.lockInfo": "Блокування паролем дозволяє зберігати ваші повідомлення в безпеці.\nВикористовуючи блокування паролем, вам буде запропоновано ввести пароль кожен раз, коли ви запускаєте Ferdium або блокуєте Ferdium власноруч за допомогою символу замочку в нижньому лівому куті або комбінації клавіш {lockShortcut}.", 271 "settings.app.lockInfo": "Блокування паролем дозволяє зберігати ваші повідомлення в безпеці.\nВикористовуючи блокування паролем, вам буде запропоновано ввести пароль кожен раз, коли ви запускаєте Ferdium або блокуєте Ferdium власноруч за допомогою символу замочку в нижньому лівому куті або комбінації клавіш {lockShortcut}.",
246 "settings.app.lockedPassword": "Пароль", 272 "settings.app.lockedPassword": "Пароль",
247 "settings.app.lockedPasswordInfo": "Обов’язково встановіть пароль, який ви запам’ятаєте.\nЯкщо ви втратите цей пароль, вам доведеться перевстановити Ferdium.", 273 "settings.app.lockedPasswordInfo": "Обов’язково встановіть пароль, який ви запам’ятаєте.\nЯкщо ви втратите цей пароль, вам доведеться перевстановити Ferdium.",
274 "settings.app.overallTheme": "Загальна тема",
248 "settings.app.restartRequired": "Зміни потребують перезапуску", 275 "settings.app.restartRequired": "Зміни потребують перезапуску",
249 "settings.app.scheduledDNDInfo": "Запланований режим \"не турбувати\" дозволяє визначити проміжок часу, в який ви не хочете отримувати сповіщення від Ferdium.", 276 "settings.app.scheduledDNDInfo": "Запланований режим \"не турбувати\" дозволяє визначити проміжок часу, в який ви не хочете отримувати сповіщення від Ferdium.",
250 "settings.app.scheduledDNDTimeInfo": "Час в 24-годинному форматі. Час закінчення може бути меньшим за час початку (наприклад, старт - 17:00, кінець - 09:00) щоб увімкнути режим \"не турбувати\" вночі.", 277 "settings.app.scheduledDNDTimeInfo": "Час в 24-годинному форматі. Час закінчення може бути меньшим за час початку (наприклад, старт - 17:00, кінець - 09:00) щоб увімкнути режим \"не турбувати\" вночі.",
diff --git a/src/index.ts b/src/index.ts
index 08e81a2a8..bb6d64d1e 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -101,7 +101,7 @@ const retrieveSettingValue = (key: string, defaultValue: boolean | string) =>
101 101
102const liftSingleInstanceLock = retrieveSettingValue( 102const liftSingleInstanceLock = retrieveSettingValue(
103 'liftSingleInstanceLock', 103 'liftSingleInstanceLock',
104 false, 104 DEFAULT_APP_SETTINGS.liftSingleInstanceLock,
105); 105);
106 106
107// Force single window 107// Force single window
@@ -165,7 +165,12 @@ if (
165} 165}
166 166
167// Disable GPU acceleration 167// Disable GPU acceleration
168if (!retrieveSettingValue('enableGPUAcceleration', false)) { 168if (
169 !retrieveSettingValue(
170 'enableGPUAcceleration',
171 DEFAULT_APP_SETTINGS.enableGPUAcceleration,
172 )
173) {
169 debug('Disable GPU Acceleration'); 174 debug('Disable GPU Acceleration');
170 app.disableHardwareAcceleration(); 175 app.disableHardwareAcceleration();
171} 176}
@@ -198,9 +203,15 @@ const createWindow = () => {
198 } 203 }
199 204
200 // Create the browser window. 205 // Create the browser window.
201 const backgroundColor = retrieveSettingValue('darkMode', false) 206 const backgroundColor = retrieveSettingValue(
207 'darkMode',
208 DEFAULT_APP_SETTINGS.darkMode,
209 )
202 ? '#1E1E1E' 210 ? '#1E1E1E'
203 : settings.get('accentColor'); 211 : (retrieveSettingValue(
212 'accentColor',
213 DEFAULT_APP_SETTINGS.accentColor,
214 ) as string);
204 215
205 mainWindow = new BrowserWindow({ 216 mainWindow = new BrowserWindow({
206 x: posX, 217 x: posX,
@@ -217,7 +228,7 @@ const createWindow = () => {
217 spellcheck: retrieveSettingValue( 228 spellcheck: retrieveSettingValue(
218 'enableSpellchecking', 229 'enableSpellchecking',
219 DEFAULT_APP_SETTINGS.enableSpellchecking, 230 DEFAULT_APP_SETTINGS.enableSpellchecking,
220 ) as boolean | undefined, 231 ) as boolean,
221 nodeIntegration: true, 232 nodeIntegration: true,
222 contextIsolation: false, 233 contextIsolation: false,
223 webviewTag: true, 234 webviewTag: true,
diff --git a/src/jsUtils.ts b/src/jsUtils.ts
index b93d6db5b..0cc83bb91 100644
--- a/src/jsUtils.ts
+++ b/src/jsUtils.ts
@@ -9,4 +9,17 @@ export const convertToJSON = (data: string | any | undefined | null) =>
9export const cleanseJSObject = (data: any | undefined | null) => 9export const cleanseJSObject = (data: any | undefined | null) =>
10 JSON.parse(JSON.stringify(data)); 10 JSON.parse(JSON.stringify(data));
11 11
12export const isEscKeyPress = (keyCode: Number) => keyCode === 27; 12export const isEscKeyPress = (keyCode: number) => keyCode === 27;
13
14export const safeParseInt = (text: string | number | undefined | null) => {
15 if (text === undefined || text === null) {
16 return 0;
17 }
18
19 // Parse number to integer
20 // This will correct errors that recipes may introduce, e.g.
21 // by sending a String instead of an integer
22 const parsedNumber = Number.parseInt(text.toString(), 10);
23 const adjustedNumber = Number.isNaN(parsedNumber) ? 0 : parsedNumber;
24 return Math.max(adjustedNumber, 0);
25};
diff --git a/src/stores/ServicesStore.ts b/src/stores/ServicesStore.ts
index 4fdd9d5ad..0ab4dbc5b 100644
--- a/src/stores/ServicesStore.ts
+++ b/src/stores/ServicesStore.ts
@@ -826,8 +826,6 @@ export default class ServicesStore extends TypedStore {
826 break; 826 break;
827 } 827 }
828 case 'notification': { 828 case 'notification': {
829 const { options } = args[0];
830
831 // Check if we are in scheduled Do-not-Disturb time 829 // Check if we are in scheduled Do-not-Disturb time
832 const { scheduledDNDEnabled, scheduledDNDStart, scheduledDNDEnd } = 830 const { scheduledDNDEnabled, scheduledDNDStart, scheduledDNDEnd } =
833 this.stores.settings.all.app; 831 this.stores.settings.all.app;
@@ -839,30 +837,29 @@ export default class ServicesStore extends TypedStore {
839 return; 837 return;
840 } 838 }
841 839
842 if ( 840 const { notificationId, options } = args[0];
843 service.recipe.hasNotificationSound || 841
844 service.isMuted || 842 if (service.isMuted || this.stores.settings.all.app.isAppMuted) {
845 this.stores.settings.all.app.isAppMuted
846 ) {
847 Object.assign(options, { 843 Object.assign(options, {
848 silent: true, 844 silent: true,
849 }); 845 });
850 } 846 }
851 847
852 if (service.isNotificationEnabled) { 848 if (service.isNotificationEnabled) {
853 let title = `Notification from ${service.name}`; 849 let title: string;
854 if (!this.stores.settings.all.app.privateNotifications) { 850 options.icon = service.iconUrl;
851 if (this.stores.settings.all.app.privateNotifications === true) {
852 // Remove message data from notification in private mode
853 options.body = '';
854 title = `Notification from ${service.name}`;
855 } else {
855 options.body = typeof options.body === 'string' ? options.body : ''; 856 options.body = typeof options.body === 'string' ? options.body : '';
856 title = 857 title =
857 typeof args[0].title === 'string' ? args[0].title : service.name; 858 typeof args[0].title === 'string' ? args[0].title : service.name;
858 } else {
859 // Remove message data from notification in private mode
860 options.body = '';
861 options.icon = '/assets/img/notification-badge.gif';
862 } 859 }
863 860
864 this.actions.app.notify({ 861 this.actions.app.notify({
865 notificationId: args[0].notificationId, 862 notificationId,
866 title, 863 title,
867 options, 864 options,
868 serviceId, 865 serviceId,
diff --git a/src/webview/badge.ts b/src/webview/badge.ts
index afecd22d4..b33d05255 100644
--- a/src/webview/badge.ts
+++ b/src/webview/badge.ts
@@ -1,29 +1,16 @@
1import { ipcRenderer } from 'electron'; 1import { ipcRenderer } from 'electron';
2import { safeParseInt } from '../jsUtils';
2 3
3const debug = require('../preload-safe-debug')('Ferdium:Plugin:BadgeHandler'); 4const debug = require('../preload-safe-debug')('Ferdium:Plugin:BadgeHandler');
4 5
5export default class BadgeHandler { 6export default class BadgeHandler {
6 // TODO: Need to extract this into a utility class and reuse outside of the recipes
7 safeParseInt(text: string | number | undefined | null) {
8 if (text === undefined || text === null) {
9 return 0;
10 }
11
12 // Parse number to integer
13 // This will correct errors that recipes may introduce, e.g.
14 // by sending a String instead of an integer
15 const parsedNumber = Number.parseInt(text.toString(), 10);
16 const adjustedNumber = Number.isNaN(parsedNumber) ? 0 : parsedNumber;
17 return Math.max(adjustedNumber, 0);
18 }
19
20 setBadge( 7 setBadge(
21 direct: string | number | undefined | null, 8 direct: string | number | undefined | null,
22 indirect: string | number | undefined | null, 9 indirect: string | number | undefined | null,
23 ) { 10 ) {
24 const count = { 11 const count = {
25 direct: this.safeParseInt(direct), 12 direct: safeParseInt(direct),
26 indirect: this.safeParseInt(indirect), 13 indirect: safeParseInt(indirect),
27 }; 14 };
28 15
29 debug('Sending badge count to host: %j', count); 16 debug('Sending badge count to host: %j', count);
diff --git a/src/webview/lib/RecipeWebview.ts b/src/webview/lib/RecipeWebview.ts
index 20be3f866..436525b9e 100644
--- a/src/webview/lib/RecipeWebview.ts
+++ b/src/webview/lib/RecipeWebview.ts
@@ -1,6 +1,7 @@
1import { ipcRenderer } from 'electron'; 1import { ipcRenderer } from 'electron';
2import { BrowserWindow } from '@electron/remote'; 2import { BrowserWindow } from '@electron/remote';
3import { pathExistsSync, readFileSync, existsSync } from 'fs-extra'; 3import { pathExistsSync, readFileSync, existsSync } from 'fs-extra';
4import { safeParseInt } from '../../jsUtils';
4 5
5const debug = require('../../preload-safe-debug')( 6const debug = require('../../preload-safe-debug')(
6 'Ferdium:Plugin:RecipeWebview', 7 'Ferdium:Plugin:RecipeWebview',
@@ -91,7 +92,7 @@ class RecipeWebview {
91 * @param {string | number | undefined | null} text to be parsed 92 * @param {string | number | undefined | null} text to be parsed
92 */ 93 */
93 safeParseInt(text) { 94 safeParseInt(text) {
94 return this.badgeHandler.safeParseInt(text); 95 return safeParseInt(text);
95 } 96 }
96 97
97 /** 98 /**
diff --git a/src/webview/recipe.ts b/src/webview/recipe.ts
index dc3f39401..ed45192d3 100644
--- a/src/webview/recipe.ts
+++ b/src/webview/recipe.ts
@@ -44,7 +44,7 @@ import {
44} from './spellchecker'; 44} from './spellchecker';
45 45
46import { DEFAULT_APP_SETTINGS } from '../config'; 46import { DEFAULT_APP_SETTINGS } from '../config';
47import { ifUndefined } from '../jsUtils'; 47import { ifUndefined, safeParseInt } from '../jsUtils';
48import { AppStore } from '../@types/stores.types'; 48import { AppStore } from '../@types/stores.types';
49import Service from '../models/Service'; 49import Service from '../models/Service';
50 50
@@ -116,10 +116,15 @@ window.open = (url, frameName, features): WindowProxy | null => {
116// then overwrite the corresponding field of the window object by injected JS. 116// then overwrite the corresponding field of the window object by injected JS.
117contextBridge.exposeInMainWorld('ferdium', { 117contextBridge.exposeInMainWorld('ferdium', {
118 open: window.open, 118 open: window.open,
119 setBadge: (direct, indirect) => badgeHandler.setBadge(direct, indirect), 119 setBadge: (
120 safeParseInt: text => badgeHandler.safeParseInt(text), 120 direct: string | number | null | undefined,
121 setDialogTitle: title => dialogTitleHandler.setDialogTitle(title), 121 indirect: string | number | null | undefined,
122 displayNotification: (title, options) => 122 ) => badgeHandler.setBadge(direct, indirect),
123 safeParseInt: (text: string | number | null | undefined) =>
124 safeParseInt(text),
125 setDialogTitle: (title: string | null | undefined) =>
126 dialogTitleHandler.setDialogTitle(title),
127 displayNotification: (title: string, options: any) =>
123 notificationsHandler.displayNotification(title, options), 128 notificationsHandler.displayNotification(title, options),
124 getDisplayMediaSelector, 129 getDisplayMediaSelector,
125}); 130});