From adab2b4506c713df3ed53668532d92af9d4ced76 Mon Sep 17 00:00:00 2001 From: Brice-W Date: Tue, 13 Jul 2021 15:14:43 +1000 Subject: [PATCH] add Notifications in conversations context menu --- ts/components/ConversationListItem.tsx | 11 +++++++- .../menu/ConversationListItemContextMenu.tsx | 19 +++++++++++++- ts/models/conversation.ts | 7 +++++ ts/state/ducks/conversations.ts | 8 +++++- .../unit/selectors/conversations_test.ts | 26 +++++++++++++++++-- 5 files changed, 66 insertions(+), 5 deletions(-) diff --git a/ts/components/ConversationListItem.tsx b/ts/components/ConversationListItem.tsx index ebdd01aee..b17f00bbd 100644 --- a/ts/components/ConversationListItem.tsx +++ b/ts/components/ConversationListItem.tsx @@ -66,6 +66,8 @@ const ConversationListItem = (props: Props) => { type, lastMessage, memberAvatars, + notificationForConvo, + currentNotificationSetting, } = props; const triggerId: string = `conversation-item-${phoneNumber}-ctxmenu`; const key: string = `conversation-item-${phoneNumber}`; @@ -119,7 +121,14 @@ const ConversationListItem = (props: Props) => { - + ); diff --git a/ts/components/session/menu/ConversationListItemContextMenu.tsx b/ts/components/session/menu/ConversationListItemContextMenu.tsx index 740eacfa1..61d39a371 100644 --- a/ts/components/session/menu/ConversationListItemContextMenu.tsx +++ b/ts/components/session/menu/ConversationListItemContextMenu.tsx @@ -1,6 +1,9 @@ import React from 'react'; import { animation, Menu } from 'react-contexify'; -import { ConversationTypeEnum } from '../../../models/conversation'; +import { + ConversationNotificationSettingType, + ConversationTypeEnum, +} from '../../../models/conversation'; import { getBlockMenuItem, @@ -12,8 +15,10 @@ import { getInviteContactMenuItem, getLeaveGroupMenuItem, getMarkAllReadMenuItem, + getNotificationForConvoMenuItem, getPinConversationMenuItem, } from './Menu'; +import { NotificationForConvoOption } from '../../conversation/ConversationHeader'; export type PropsContextConversationItem = { id: string; @@ -26,6 +31,8 @@ export type PropsContextConversationItem = { isKickedFromGroup?: boolean; left?: boolean; theme?: any; + notificationForConvo: Array; + currentNotificationSetting: ConversationNotificationSettingType; }; export const ConversationListItemContextMenu = (props: PropsContextConversationItem) => { @@ -39,6 +46,8 @@ export const ConversationListItemContextMenu = (props: PropsContextConversationI type, left, isKickedFromGroup, + notificationForConvo, + currentNotificationSetting, } = props; const isGroup = type === 'group'; @@ -46,6 +55,14 @@ export const ConversationListItemContextMenu = (props: PropsContextConversationI return ( <> + {getNotificationForConvoMenuItem( + isKickedFromGroup, + left, + isBlocked, + notificationForConvo, + currentNotificationSetting, + conversationId + )} {getPinConversationMenuItem(conversationId)} {getBlockMenuItem(isMe, type === ConversationTypeEnum.PRIVATE, isBlocked, conversationId)} {getCopyMenuItem(isPublic, isGroup, conversationId)} diff --git a/ts/models/conversation.ts b/ts/models/conversation.ts index 5dae6d3c5..79caa9440 100644 --- a/ts/models/conversation.ts +++ b/ts/models/conversation.ts @@ -408,6 +408,13 @@ export class ConversationModel extends Backbone.Model { groupAdmins, members, isPinned: this.isPinned(), + notificationForConvo: ConversationNotificationSetting.filter(n => + this.isPrivate() ? n !== 'mentions_only' : true + ).map((n: ConversationNotificationSettingType) => { + // this link to the notificationForConvo_all, notificationForConvo_mentions_only, ... + return { value: n, name: window.i18n(`notificationForConvo_${n}`) }; + }), + currentNotificationSetting: this.get('triggerNotificationsFor'), }; } diff --git a/ts/state/ducks/conversations.ts b/ts/state/ducks/conversations.ts index eb20669f9..2fea3d79f 100644 --- a/ts/state/ducks/conversations.ts +++ b/ts/state/ducks/conversations.ts @@ -5,8 +5,12 @@ import { createAsyncThunk } from '@reduxjs/toolkit'; import { getConversationController } from '../../session/conversations'; import { MessageModel } from '../../models/message'; import { getMessagesByConversation } from '../../data/data'; -import { ConversationTypeEnum } from '../../models/conversation'; +import { + ConversationNotificationSettingType, + ConversationTypeEnum, +} from '../../models/conversation'; import { MessageDeliveryStatus } from '../../models/messageType'; +import { NotificationForConvoOption } from '../../components/conversation/ConversationHeader'; // State @@ -83,6 +87,8 @@ export interface ConversationType { groupAdmins?: Array; // admins for closed groups and moderators for open groups members?: Array; // members for closed groups only isPinned: boolean; + notificationForConvo: Array; + currentNotificationSetting: ConversationNotificationSettingType; } export type ConversationLookupType = { diff --git a/ts/test/session/unit/selectors/conversations_test.ts b/ts/test/session/unit/selectors/conversations_test.ts index 06b494aa5..ea673cdf3 100644 --- a/ts/test/session/unit/selectors/conversations_test.ts +++ b/ts/test/session/unit/selectors/conversations_test.ts @@ -1,5 +1,8 @@ import { assert } from 'chai'; -import { ConversationTypeEnum } from '../../../../models/conversation'; +import { + ConversationNotificationSetting, + ConversationTypeEnum, +} from '../../../../models/conversation'; import { ConversationLookupType } from '../../../../state/ducks/conversations'; import { @@ -28,6 +31,8 @@ describe('state/selectors/conversations', () => { isKickedFromGroup: false, left: false, isPinned: false, + notificationForConvo: [], + currentNotificationSetting: ConversationNotificationSetting[0], }, id2: { id: 'id2', @@ -45,13 +50,14 @@ describe('state/selectors/conversations', () => { isKickedFromGroup: false, left: false, isPinned: false, + notificationForConvo: [], + currentNotificationSetting: ConversationNotificationSetting[0], }, id3: { id: 'id3', activeAt: 20, name: 'C', phoneNumber: 'notused', - type: ConversationTypeEnum.PRIVATE, isMe: false, unreadCount: 1, @@ -62,6 +68,8 @@ describe('state/selectors/conversations', () => { isKickedFromGroup: false, left: false, isPinned: false, + notificationForConvo: [], + currentNotificationSetting: ConversationNotificationSetting[0], }, id4: { id: 'id4', @@ -78,6 +86,8 @@ describe('state/selectors/conversations', () => { isKickedFromGroup: false, left: false, isPinned: false, + notificationForConvo: [], + currentNotificationSetting: ConversationNotificationSetting[0], }, id5: { id: 'id5', @@ -94,6 +104,8 @@ describe('state/selectors/conversations', () => { isKickedFromGroup: false, left: false, isPinned: false, + notificationForConvo: [], + currentNotificationSetting: ConversationNotificationSetting[0], }, }; const comparator = _getConversationComparator(i18n); @@ -126,6 +138,8 @@ describe('state/selectors/conversations', () => { isKickedFromGroup: false, left: false, isPinned: false, + notificationForConvo: [], + currentNotificationSetting: ConversationNotificationSetting[0], }, id2: { id: 'id2', @@ -143,6 +157,8 @@ describe('state/selectors/conversations', () => { isKickedFromGroup: false, left: false, isPinned: false, + notificationForConvo: [], + currentNotificationSetting: ConversationNotificationSetting[0], }, id3: { id: 'id3', @@ -160,6 +176,8 @@ describe('state/selectors/conversations', () => { isKickedFromGroup: false, left: false, isPinned: true, + notificationForConvo: [], + currentNotificationSetting: ConversationNotificationSetting[0], }, id4: { id: 'id4', @@ -176,6 +194,8 @@ describe('state/selectors/conversations', () => { isKickedFromGroup: false, left: false, isPinned: true, + notificationForConvo: [], + currentNotificationSetting: ConversationNotificationSetting[0], }, id5: { id: 'id5', @@ -192,6 +212,8 @@ describe('state/selectors/conversations', () => { isKickedFromGroup: false, left: false, isPinned: false, + notificationForConvo: [], + currentNotificationSetting: ConversationNotificationSetting[0], }, }; const comparator = _getConversationComparator(i18n);