diff --git a/_locales/en/messages.json b/_locales/en/messages.json
index 6afb7c1257..0883861d1f 100644
--- a/_locales/en/messages.json
+++ b/_locales/en/messages.json
@@ -3451,6 +3451,10 @@
"message": "Mute notifications",
"description": "Label for the mute notifications drop-down selector"
},
+ "notMuted": {
+ "message": "Not muted",
+ "description": "Label when the conversation is not muted"
+ },
"muteHour": {
"message": "Mute for one hour",
"description": "Label for muting the conversation"
@@ -4964,6 +4968,10 @@
"message": "When enabled, messages sent and received in this group will disappear after they've been seen.",
"description": "This is the info about the disappearing messages setting"
},
+ "ConversationDetails--notifications": {
+ "message": "Notifications",
+ "description": "This is the label for notifications in the conversation details screen"
+ },
"ConversationDetails--group-info-label": {
"message": "Who can edit group info",
"description": "This is the label for the 'who can edit the group' panel"
@@ -5070,6 +5078,22 @@
"message": "See all",
"description": "This is a button on the conversation details to show all members"
},
+ "ConversationNotificationsSettings__mentions__label": {
+ "message": "Mentions",
+ "description": "In the conversation notifications settings, this is the label for the mentions option"
+ },
+ "ConversationNotificationsSettings__mentions__info": {
+ "message": "Receive notifications when you're mentioned in muted chats",
+ "description": "In the conversation notifications settings, this is the sub-label for the mentions option"
+ },
+ "ConversationNotificationsSettings__mentions__select__always-notify": {
+ "message": "Always notify",
+ "description": "In the conversation notifications settings, this is the option that always notifies you for @mentions"
+ },
+ "ConversationNotificationsSettings__mentions__select__dont-notify-for-mentions-if-muted": {
+ "message": "Don't notify if muted",
+ "description": "In the conversation notifications settings, this is the option that doesn't notify you for @mentions if the conversation is muted"
+ },
"GroupLinkManagement--clipboard": {
"message": "Group link copied.",
"description": "Shown in a toast when a user selects to copy group link"
diff --git a/images/icons/v2/at-24.svg b/images/icons/v2/at-24.svg
new file mode 100644
index 0000000000..acbdfcb5f8
--- /dev/null
+++ b/images/icons/v2/at-24.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/images/icons/v2/bell-disabled-outline-24.svg b/images/icons/v2/bell-disabled-outline-24.svg
new file mode 100644
index 0000000000..0529c8fa08
--- /dev/null
+++ b/images/icons/v2/bell-disabled-outline-24.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/images/icons/v2/bell-disabled-solid-24.svg b/images/icons/v2/bell-disabled-solid-24.svg
new file mode 100644
index 0000000000..b0c7fa717e
--- /dev/null
+++ b/images/icons/v2/bell-disabled-solid-24.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/images/icons/v2/sound-outline-24.svg b/images/icons/v2/sound-outline-24.svg
new file mode 100644
index 0000000000..be5040701f
--- /dev/null
+++ b/images/icons/v2/sound-outline-24.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/js/modules/signal.js b/js/modules/signal.js
index 3a68d77fdb..5d45993cf5 100644
--- a/js/modules/signal.js
+++ b/js/modules/signal.js
@@ -94,6 +94,9 @@ const { createLeftPane } = require('../../ts/state/roots/createLeftPane');
const {
createMessageDetail,
} = require('../../ts/state/roots/createMessageDetail');
+const {
+ createConversationNotificationsSettings,
+} = require('../../ts/state/roots/createConversationNotificationsSettings');
const {
createGroupV2Permissions,
} = require('../../ts/state/roots/createGroupV2Permissions');
@@ -363,6 +366,7 @@ exports.setup = (options = {}) => {
createGroupV2Permissions,
createLeftPane,
createMessageDetail,
+ createConversationNotificationsSettings,
createPendingInvites,
createSafetyNumberViewer,
createShortcutGuideModal,
diff --git a/protos/SignalStorage.proto b/protos/SignalStorage.proto
index eb8f9586f3..131d3f8850 100644
--- a/protos/SignalStorage.proto
+++ b/protos/SignalStorage.proto
@@ -90,12 +90,13 @@ message GroupV1Record {
}
message GroupV2Record {
- optional bytes masterKey = 1;
- optional bool blocked = 2;
- optional bool whitelisted = 3;
- optional bool archived = 4;
- optional bool markedUnread = 5;
- optional uint64 mutedUntilTimestamp = 6;
+ optional bytes masterKey = 1;
+ optional bool blocked = 2;
+ optional bool whitelisted = 3;
+ optional bool archived = 4;
+ optional bool markedUnread = 5;
+ optional uint64 mutedUntilTimestamp = 6;
+ optional bool dontNotifyForMentionsIfMuted = 7;
}
message AccountRecord {
diff --git a/stylesheets/_modules.scss b/stylesheets/_modules.scss
index 4f5b9d0d64..5757d9e3fb 100644
--- a/stylesheets/_modules.scss
+++ b/stylesheets/_modules.scss
@@ -2862,6 +2862,51 @@ button.module-conversation-details__action-button {
}
}
+ &--notifications {
+ &::after {
+ -webkit-mask: url('../images/icons/v2/sound-outline-24.svg') no-repeat
+ center;
+
+ @include light-theme {
+ background-color: $color-gray-75;
+ }
+
+ @include dark-theme {
+ background-color: $color-gray-15;
+ }
+ }
+ }
+
+ &--mute {
+ &::after {
+ @include light-theme {
+ -webkit-mask: url('../images/icons/v2/bell-disabled-outline-24.svg')
+ no-repeat center;
+ background-color: $color-gray-75;
+ }
+
+ @include dark-theme {
+ -webkit-mask: url('../images/icons/v2/bell-disabled-solid-24.svg')
+ no-repeat center;
+ background-color: $color-gray-15;
+ }
+ }
+ }
+
+ &--mention {
+ &::after {
+ -webkit-mask: url('../images/icons/v2/at-24.svg') no-repeat center;
+
+ @include light-theme {
+ background-color: $color-gray-75;
+ }
+
+ @include dark-theme {
+ background-color: $color-gray-15;
+ }
+ }
+ }
+
&--lock {
&::after {
-webkit-mask: url(../images/icons/v2/lock-outline-24.svg) no-repeat
diff --git a/ts/components/Select.stories.tsx b/ts/components/Select.stories.tsx
index 84d7eb6f1e..97ac048d3e 100644
--- a/ts/components/Select.stories.tsx
+++ b/ts/components/Select.stories.tsx
@@ -29,3 +29,16 @@ story.add('Normal', () => {
/>
);
});
+
+story.add('With disabled options', () => (
+
+));
diff --git a/ts/components/Select.tsx b/ts/components/Select.tsx
index 7ca39008b4..65d2bcd43c 100644
--- a/ts/components/Select.tsx
+++ b/ts/components/Select.tsx
@@ -5,6 +5,7 @@ import React, { ChangeEvent } from 'react';
import classNames from 'classnames';
export type Option = Readonly<{
+ disabled?: boolean;
text: string;
value: string | number;
}>;
@@ -26,9 +27,14 @@ export function Select(props: PropsType): JSX.Element {
return (