+
+
+ );
+ }
+ return (
+ + {intl.formatMessage(messages.notificationHeading)} +
+
+ {
+ coursesList.map(course => (
+
+
+
+
+ {course.name}
+
+
+
+
+
+
+ ))
+ }
+
+
+ {intl.formatMessage(messages.notificationGroupTitle, { key: groupId })}
+
+
+
+
+
+ +
+ {intl.formatMessage(messages.notificationHelpType)}
+
+ {intl.formatMessage(messages.notificationHelpWeb)}
+ {intl.formatMessage(messages.notificationHelpEmail)}
+ {intl.formatMessage(messages.notificationHelpPush)}
+
+
+
+ { preferences }
+
+
+
+ {intl.formatMessage(messages.notificationTitle, { text: preferenceName })}
+
+
+
+ onToggle(checked, 'web')}
+ />
+
+
+ onToggle(checked, 'email')}
+ />
+
+
+ onToggle(checked, 'push')}
+ />
+
+
+
+ );
+};
+
+NotificationPreferenceRow.propTypes = {
+ groupId: PropTypes.string.isRequired,
+ preferenceName: PropTypes.string.isRequired,
+};
+
+export default React.memo(NotificationPreferenceRow);
diff --git a/src/notification-preferences/NotificationPreferences.jsx b/src/notification-preferences/NotificationPreferences.jsx
new file mode 100644
index 0000000..6341b66
--- /dev/null
+++ b/src/notification-preferences/NotificationPreferences.jsx
@@ -0,0 +1,78 @@
+import React, { useEffect, useMemo } from 'react';
+import { useDispatch, useSelector } from 'react-redux';
+import { useParams } from 'react-router';
+import { Link } from 'react-router-dom';
+import { useIntl } from '@edx/frontend-platform/i18n';
+import { Container, Icon, Spinner } from '@edx/paragon';
+import { ArrowBack } from '@edx/paragon/icons';
+import {
+ courseListStatus,
+ getCourse,
+ getPreferenceGroupIds,
+ notificationPreferencesStatus,
+} from './data/selectors';
+import { fetchCourseList, fetchCourseNotificationPreferences } from './data/thunks';
+import { messages } from './messages';
+import NotificationPreferenceGroup from './NotificationPreferenceGroup';
+import { updateSelectedCourse } from './data/actions';
+import { LOADING_STATUS, SUCCESS_STATUS } from '../constants';
+
+const NotificationPreferences = () => {
+ const { courseId } = useParams();
+ const dispatch = useDispatch();
+ const intl = useIntl();
+ const courseStatus = useSelector(courseListStatus());
+ const notificationStatus = useSelector(notificationPreferencesStatus());
+ const course = useSelector(getCourse(courseId));
+ const preferenceGroups = useSelector(getPreferenceGroupIds());
+
+ const preferencesList = useMemo(() => (
+ preferenceGroups.map(key => (
+
+
+
+ );
+ }
+ return (
+ + {intl.formatMessage(messages.notificationHeading)} +
+
+
+
+
+
+
+
+ {course?.name}
+
+
+ { preferencesList }
+