diff --git a/native/chat/settings/thread-settings-notifications.react.js b/native/chat/settings/thread-settings-notifications.react.js
--- a/native/chat/settings/thread-settings-notifications.react.js
+++ b/native/chat/settings/thread-settings-notifications.react.js
@@ -1,7 +1,7 @@
// @flow
import * as React from 'react';
-import { View } from 'react-native';
+import { View, Text } from 'react-native';
import {
threadSettingsNotificationsCopy,
@@ -10,9 +10,10 @@
import type { ThreadInfo } from 'lib/types/minimally-encoded-thread-permissions-types.js';
import EnumSettingsOption from '../../components/enum-settings-option.react.js';
+import SWMansionIcon from '../../components/swmansion-icon.react.js';
import HeaderRightTextButton from '../../navigation/header-right-text-button.react.js';
import type { NavigationRoute } from '../../navigation/route-names.js';
-import { useStyles } from '../../themes/colors.js';
+import { useStyles, useColors } from '../../themes/colors.js';
import AllNotifsIllustration from '../../vectors/all-notifs-illustration.react.js';
import BadgeNotifsIllustration from '../../vectors/badge-notifs-illustration.react.js';
import MutedNotifsIllustration from '../../vectors/muted-notifs-illustration.react.js';
@@ -22,6 +23,114 @@
+threadInfo: ThreadInfo,
};
+type NotificationDescriptionProps = {
+ +selected: boolean,
+ +bannerNotifsEnabled: boolean,
+ +badgeCountEnabled: boolean,
+ +livesInFocusedTab: boolean,
+};
+
+function NotificationDescription(
+ props: NotificationDescriptionProps,
+): React.Node {
+ const {
+ selected,
+ bannerNotifsEnabled,
+ badgeCountEnabled,
+ livesInFocusedTab,
+ } = props;
+
+ const styles = useStyles(unboundStyles);
+ const colors = useColors();
+
+ const bannerNotifsDescriptionTextStyles = React.useMemo(() => {
+ const style = [styles.notificationOptionDescriptionText];
+
+ if (selected && !bannerNotifsEnabled) {
+ style.push(styles.notificationOptionDescriptionTextDisabledSelected);
+ } else if (!bannerNotifsEnabled) {
+ style.push(styles.notificationOptionDescriptionTextDisabled);
+ }
+
+ return style;
+ }, [
+ bannerNotifsEnabled,
+ selected,
+ styles.notificationOptionDescriptionText,
+ styles.notificationOptionDescriptionTextDisabled,
+ styles.notificationOptionDescriptionTextDisabledSelected,
+ ]);
+
+ const badgeCountDescriptionTextStyles = React.useMemo(() => {
+ const style = [styles.notificationOptionDescriptionText];
+
+ if (selected && !badgeCountEnabled) {
+ style.push(styles.notificationOptionDescriptionTextDisabledSelected);
+ } else if (!badgeCountEnabled) {
+ style.push(styles.notificationOptionDescriptionTextDisabled);
+ }
+
+ return style;
+ }, [
+ badgeCountEnabled,
+ selected,
+ styles.notificationOptionDescriptionText,
+ styles.notificationOptionDescriptionTextDisabled,
+ styles.notificationOptionDescriptionTextDisabledSelected,
+ ]);
+
+ let bannerNotifsIconColor = colors.panelForegroundSecondaryLabel;
+ if (selected && !bannerNotifsEnabled) {
+ bannerNotifsIconColor = colors.panelInputSecondaryForeground;
+ } else if (!bannerNotifsEnabled) {
+ bannerNotifsIconColor = colors.panelSecondaryForeground;
+ }
+
+ let badgeCountIconColor = colors.panelForegroundSecondaryLabel;
+ if (selected && !badgeCountEnabled) {
+ badgeCountIconColor = colors.panelInputSecondaryForeground;
+ } else if (!badgeCountEnabled) {
+ badgeCountIconColor = colors.panelSecondaryForeground;
+ }
+
+ return (
+ <>
+
+
+
+ {threadSettingsNotificationsCopy.BANNER_NOTIFS}
+
+
+
+
+
+ {threadSettingsNotificationsCopy.BADGE_COUNT}
+
+
+
+
+
+ {livesInFocusedTab
+ ? threadSettingsNotificationsCopy.IN_FOCUSED_TAB
+ : threadSettingsNotificationsCopy.IN_BACKGROUND_TAB}
+
+
+ >
+ );
+}
+
type Props = {
+navigation: ChatNavigationProp<'ThreadSettingsNotifications'>,
+route: NavigationRoute<'ThreadSettingsNotifications'>,
@@ -85,6 +194,42 @@
[styles.notificationOptionIconContainer],
);
+ const allNotificationsDescription = React.useMemo(
+ () => (
+
+ ),
+ [notificationSettings],
+ );
+
+ const badgeOnlyDescription = React.useMemo(
+ () => (
+
+ ),
+ [notificationSettings],
+ );
+
+ const mutedDescription = React.useMemo(
+ () => (
+
+ ),
+ [notificationSettings],
+ );
+
return (
@@ -92,7 +237,7 @@
name={threadSettingsNotificationsCopy.FOCUSED}
enumValue={notificationSettings === 'focused'}
onEnumValuePress={onFocusedSelected}
- description=""
+ description={allNotificationsDescription}
icon={allNotificationsIllustration}
/>
@@ -101,7 +246,7 @@
name={threadSettingsNotificationsCopy.BADGE_ONLY}
enumValue={notificationSettings === 'badge-only'}
onEnumValuePress={onBadgeOnlySelected}
- description=""
+ description={badgeOnlyDescription}
icon={badgeOnlyIllustration}
/>
@@ -110,7 +255,7 @@
name={threadSettingsNotificationsCopy.BACKGROUND}
enumValue={notificationSettings === 'background'}
onEnumValuePress={onBackgroundSelected}
- description=""
+ description={mutedDescription}
icon={mutedIllustration}
/>
@@ -130,6 +275,24 @@
marginLeft: 8,
marginRight: 16,
},
+ notificationOptionDescriptionListItem: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ marginTop: 4,
+ },
+ notificationOptionDescriptionText: {
+ color: 'panelForegroundSecondaryLabel',
+ marginLeft: 4,
+ fontSize: 14,
+ },
+ notificationOptionDescriptionTextDisabled: {
+ textDecorationLine: 'line-through',
+ color: 'panelSecondaryForeground',
+ },
+ notificationOptionDescriptionTextDisabledSelected: {
+ color: 'panelInputSecondaryForeground',
+ textDecorationLine: 'line-through',
+ },
};
export default ThreadSettingsNotifications;
diff --git a/native/components/enum-settings-option.react.js b/native/components/enum-settings-option.react.js
--- a/native/components/enum-settings-option.react.js
+++ b/native/components/enum-settings-option.react.js
@@ -11,7 +11,7 @@
type EnumSettingsOptionProps = {
+icon?: string | React.Node,
+name: string,
- +description: string,
+ +description: string | React.Node,
+enumValue: boolean,
+onEnumValuePress: () => mixed,
+type?: InputType,
@@ -47,6 +47,14 @@
return icon;
}, [icon, styles.enumIcon, colors.purpleButton]);
+ const descriptionElement = React.useMemo(() => {
+ if (typeof description === 'string') {
+ return {description};
+ }
+
+ return description;
+ }, [description, styles.enumInfoDescription]);
+
const enumInputStyles = React.useMemo(() => {
const style = [styles.enumInput];
@@ -106,7 +114,7 @@
{enumIcon}
{name}
- {description}
+ {descriptionElement}
{enumInputFill}