import type { INotificationDesktop } from '@rocket.chat/core-typings'; import type { SelectOption } from '@rocket.chat/fuselage'; import { AccordionItem, Button } from '@rocket.chat/fuselage'; import { Field, FieldGroup, FieldHint, FieldLabel, FieldRow, Select, ToggleSwitch } from '@rocket.chat/fuselage-forms'; import type { TranslationKey } from '@rocket.chat/ui-contexts'; import { useSetting, useUserPreference, useUser } from '@rocket.chat/ui-contexts'; import { useCallback, useEffect, useId, useMemo, useState } from 'react'; import { Controller, useFormContext } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; import { useNotification } from '../../../hooks/notification/useNotification'; const notificationOptionsLabelMap = { all: 'All_messages', mentions: 'Mentions', nothing: 'Nothing', }; const emailNotificationOptionsLabelMap = { mentions: 'Email_Notification_Mode_All', nothing: 'Email_Notification_Mode_Disabled', }; const PreferencesNotificationsSection = () => { const { t, i18n } = useTranslation(); const user = useUser(); const [notificationsPermission, setNotificationsPermission] = useState(); const defaultDesktopNotifications = useSetting( 'Accounts_Default_User_Preferences_desktopNotifications', ) as keyof typeof notificationOptionsLabelMap; const defaultMobileNotifications = useSetting( 'Accounts_Default_User_Preferences_pushNotifications', ) as keyof typeof notificationOptionsLabelMap; const canChangeEmailNotification = useSetting('Accounts_AllowEmailNotifications'); const loginEmailEnabled = useSetting('Device_Management_Enable_Login_Emails'); const allowLoginEmailPreference = useSetting('Device_Management_Allow_Login_Email_preference'); const showNewLoginEmailPreference = loginEmailEnabled && allowLoginEmailPreference; const showVideoConfMobileRinging = useSetting('VideoConf_Mobile_Ringing'); const showVoipMobileRinging = useSetting('VoIP_TeamCollab_Mobile_Ringing_Enabled'); const showMobileRinging = showVideoConfMobileRinging || showVoipMobileRinging; const notify = useNotification(); const userEmailNotificationMode = useUserPreference('emailNotificationMode') as keyof typeof emailNotificationOptionsLabelMap; useEffect(() => setNotificationsPermission(window.Notification && Notification.permission), []); const onSendNotification = useCallback(() => { notify({ payload: { sender: { _id: 'rocket.cat', username: 'rocket.cat' }, rid: 'GENERAL', } as INotificationDesktop['payload'], title: t('Desktop_Notification_Test'), text: t('This_is_a_desktop_notification'), }); }, [notify, t]); const onAskNotificationPermission = useCallback(() => { window.Notification && Notification.requestPermission().then((val) => setNotificationsPermission(val)); }, []); const notificationOptions = useMemo( () => Object.entries(notificationOptionsLabelMap).map(([key, val]) => i18n.exists(val) && [key, t(val)]), [i18n, t], ) as SelectOption[]; const desktopNotificationOptions = useMemo((): SelectOption[] => { const optionsCp = notificationOptions.slice(); optionsCp.unshift(['default', `${t('Default')} (${t(notificationOptionsLabelMap[defaultDesktopNotifications] as TranslationKey)})`]); return optionsCp; }, [defaultDesktopNotifications, notificationOptions, t]); const mobileNotificationOptions = useMemo(() => { const optionsCp = notificationOptions.slice(); optionsCp.unshift(['default', `${t('Default')} (${t(notificationOptionsLabelMap[defaultMobileNotifications] as TranslationKey)})`]); return optionsCp; }, [defaultMobileNotifications, notificationOptions, t]); const emailNotificationOptions = useMemo(() => { const options = Object.entries(emailNotificationOptionsLabelMap).map( ([key, val]) => i18n.exists(val) && [key, t(val)], ) as SelectOption[]; options.unshift(['default', `${t('Default')} (${t(emailNotificationOptionsLabelMap[userEmailNotificationMode] as TranslationKey)})`]); return options; }, [i18n, t, userEmailNotificationMode]); const { control } = useFormContext(); const desktopNotificationsLabelId = useId(); const showCalendarPreference = user?.settings?.calendar?.outlook?.Enabled; return ( {t('Desktop_Notifications')} {notificationsPermission === 'denied' && t('Desktop_Notifications_Disabled')} {notificationsPermission === 'granted' && ( )} {notificationsPermission !== 'denied' && notificationsPermission !== 'granted' && ( )} {t('Notification_RequireInteraction')} } /> {t('Only_works_with_chrome_version_greater_50')} {t('Notification_Desktop_Default_For')} } /> {t('Email_Notification_Mode')}