import { convertStringifiedBooleanToBoolean, isDesktopApplication, } from '@/utils'; import { STRING_FAILED_TO_UPDATE_USER_SETTING } from '@/strings'; import { useCallback, useEffect, useState } from 'preact/hooks'; import { WebApplication } from '@/ui_models/application'; import { observer } from 'mobx-react-lite'; import { PreferencesGroup, PreferencesSegment, Subtitle, Text, Title, } from '../../components'; import { EmailBackupFrequency, MuteFailedBackupsEmailsOption, SettingName, } from '@standardnotes/settings'; import { Dropdown, DropdownItem } from '@/components/Dropdown'; import { Switch } from '@/components/Switch'; import { HorizontalSeparator } from '@/components/Shared/HorizontalSeparator'; import { FeatureIdentifier } from '@standardnotes/features'; import { FeatureStatus } from '@standardnotes/snjs'; type Props = { application: WebApplication; }; export const EmailBackups = observer(({ application }: Props) => { const [isLoading, setIsLoading] = useState(false); const [emailFrequency, setEmailFrequency] = useState( EmailBackupFrequency.Disabled ); const [emailFrequencyOptions, setEmailFrequencyOptions] = useState< DropdownItem[] >([]); const [isFailedBackupEmailMuted, setIsFailedBackupEmailMuted] = useState(true); const [isEntitledToEmailBackups, setIsEntitledToEmailBackups] = useState(false); const loadEmailFrequencySetting = useCallback(async () => { if (!application.getUser()) { return; } setIsLoading(true); try { const userSettings = await application.settings.listSettings(); setEmailFrequency( userSettings.getSettingValue( SettingName.EmailBackupFrequency, EmailBackupFrequency.Disabled ) ); setIsFailedBackupEmailMuted( convertStringifiedBooleanToBoolean( userSettings.getSettingValue( SettingName.MuteFailedBackupsEmails, MuteFailedBackupsEmailsOption.NotMuted ) ) ); } catch (error) { console.error(error); } finally { setIsLoading(false); } }, [application]); useEffect(() => { const emailBackupsFeatureStatus = application.features.getFeatureStatus( FeatureIdentifier.DailyEmailBackup ); setIsEntitledToEmailBackups( emailBackupsFeatureStatus === FeatureStatus.Entitled ); const frequencyOptions = []; for (const frequency in EmailBackupFrequency) { const frequencyValue = EmailBackupFrequency[frequency as keyof typeof EmailBackupFrequency]; frequencyOptions.push({ value: frequencyValue, label: application.settings.getEmailBackupFrequencyOptionLabel( frequencyValue ), }); } setEmailFrequencyOptions(frequencyOptions); loadEmailFrequencySetting(); }, [application, loadEmailFrequencySetting]); const updateSetting = async ( settingName: SettingName, payload: string ): Promise => { try { await application.settings.updateSetting(settingName, payload, false); return true; } catch (e) { application.alertService.alert(STRING_FAILED_TO_UPDATE_USER_SETTING); return false; } }; const updateEmailFrequency = async (frequency: EmailBackupFrequency) => { const previousFrequency = emailFrequency; setEmailFrequency(frequency); const updateResult = await updateSetting( SettingName.EmailBackupFrequency, frequency ); if (!updateResult) { setEmailFrequency(previousFrequency); } }; const toggleMuteFailedBackupEmails = async () => { const previousValue = isFailedBackupEmailMuted; setIsFailedBackupEmailMuted(!isFailedBackupEmailMuted); const updateResult = await updateSetting( SettingName.MuteFailedBackupsEmails, `${!isFailedBackupEmailMuted}` ); if (!updateResult) { setIsFailedBackupEmailMuted(previousValue); } }; return ( Email Backups {!isEntitledToEmailBackups && ( <> A Plus or{' '} Pro subscription plan is required to enable Email Backups.{' '} Learn more . )}
{!isDesktopApplication() && ( Daily encrypted email backups of your entire data set delivered directly to your inbox. )} Email frequency How often to receive backups.
{isLoading ? (
) : ( { updateEmailFrequency(item as EmailBackupFrequency); }} /> )}
Email preferences
Receive a notification email if an email backup fails.
{isLoading ? (
) : ( )}
); });