import React, { useCallback } from 'react'; import PropTypes from 'prop-types'; import classNames from 'classnames'; import { useDispatch, useSelector } from 'react-redux'; import { NavItem } from '@openedx/paragon'; import { useIntl } from '@edx/frontend-platform/i18n'; import messages from './messages'; import { useIsOnMobile } from '../hooks'; import ToggleSwitch from './ToggleSwitch'; import EmailCadences from './EmailCadences'; import { LOADING_STATUS } from '../constants'; import { updatePreferenceToggle } from './data/thunks'; import { selectAppPreferences, selectSelectedCourseId, selectUpdatePreferencesStatus } from './data/selectors'; import { notificationChannels, shouldHideAppPreferences } from './data/utils'; import { EMAIL, EMAIL_CADENCE, EMAIL_CADENCE_PREFERENCES, MIXED, } from './data/constants'; const NotificationPreferenceColumn = ({ appId, channel, appPreference }) => { const dispatch = useDispatch(); const intl = useIntl(); const courseId = useSelector(selectSelectedCourseId()); const appPreferences = useSelector(selectAppPreferences(appId)); const updatePreferencesStatus = useSelector(selectUpdatePreferencesStatus()); const mobileView = useIsOnMobile(); const NOTIFICATION_CHANNELS = Object.values(notificationChannels()); const hideAppPreferences = shouldHideAppPreferences(appPreferences, appId) || false; const getValue = useCallback((notificationChannel, innerText, checked) => { if (notificationChannel === EMAIL_CADENCE && courseId) { return innerText; } return checked; }, [courseId]); const getEmailCadence = useCallback((notificationChannel, checked, innerText, emailCadence) => { if (notificationChannel === EMAIL_CADENCE) { return innerText; } if (notificationChannel === EMAIL && checked) { return EMAIL_CADENCE_PREFERENCES.DAILY; } return emailCadence; }, []); const onToggle = useCallback((event, notificationType) => { const { name: notificationChannel, checked, innerText } = event.target; const appNotificationPreference = appPreferences.find(preference => preference.id === notificationType); const value = getValue(notificationChannel, innerText, checked); const emailCadence = getEmailCadence( notificationChannel, checked, innerText, appNotificationPreference.emailCadence, ); dispatch(updatePreferenceToggle( courseId, appId, notificationType, notificationChannel, value, emailCadence !== MIXED ? emailCadence : undefined, )); }, [appPreferences, getValue, getEmailCadence, dispatch, courseId, appId]); const renderPreference = (preference) => ( (preference?.coreNotificationTypes?.length > 0 || preference.id !== 'core') && (