add Notifications in conversations context menu

pull/1779/head
Brice-W 4 years ago
parent bf76abacee
commit adab2b4506

@ -66,6 +66,8 @@ const ConversationListItem = (props: Props) => {
type, type,
lastMessage, lastMessage,
memberAvatars, memberAvatars,
notificationForConvo,
currentNotificationSetting,
} = props; } = props;
const triggerId: string = `conversation-item-${phoneNumber}-ctxmenu`; const triggerId: string = `conversation-item-${phoneNumber}-ctxmenu`;
const key: string = `conversation-item-${phoneNumber}`; const key: string = `conversation-item-${phoneNumber}`;
@ -119,7 +121,14 @@ const ConversationListItem = (props: Props) => {
</div> </div>
</div> </div>
<Portal> <Portal>
<ConversationListItemContextMenu id={id} triggerId={triggerId} type={type} isMe={isMe} /> <ConversationListItemContextMenu
id={id}
triggerId={triggerId}
type={type}
isMe={isMe}
notificationForConvo={notificationForConvo}
currentNotificationSetting={currentNotificationSetting}
/>
</Portal> </Portal>
</div> </div>
); );

@ -1,6 +1,9 @@
import React from 'react'; import React from 'react';
import { animation, Menu } from 'react-contexify'; import { animation, Menu } from 'react-contexify';
import { ConversationTypeEnum } from '../../../models/conversation'; import {
ConversationNotificationSettingType,
ConversationTypeEnum,
} from '../../../models/conversation';
import { import {
getBlockMenuItem, getBlockMenuItem,
@ -12,8 +15,10 @@ import {
getInviteContactMenuItem, getInviteContactMenuItem,
getLeaveGroupMenuItem, getLeaveGroupMenuItem,
getMarkAllReadMenuItem, getMarkAllReadMenuItem,
getNotificationForConvoMenuItem,
getPinConversationMenuItem, getPinConversationMenuItem,
} from './Menu'; } from './Menu';
import { NotificationForConvoOption } from '../../conversation/ConversationHeader';
export type PropsContextConversationItem = { export type PropsContextConversationItem = {
id: string; id: string;
@ -26,6 +31,8 @@ export type PropsContextConversationItem = {
isKickedFromGroup?: boolean; isKickedFromGroup?: boolean;
left?: boolean; left?: boolean;
theme?: any; theme?: any;
notificationForConvo: Array<NotificationForConvoOption>;
currentNotificationSetting: ConversationNotificationSettingType;
}; };
export const ConversationListItemContextMenu = (props: PropsContextConversationItem) => { export const ConversationListItemContextMenu = (props: PropsContextConversationItem) => {
@ -39,6 +46,8 @@ export const ConversationListItemContextMenu = (props: PropsContextConversationI
type, type,
left, left,
isKickedFromGroup, isKickedFromGroup,
notificationForConvo,
currentNotificationSetting,
} = props; } = props;
const isGroup = type === 'group'; const isGroup = type === 'group';
@ -46,6 +55,14 @@ export const ConversationListItemContextMenu = (props: PropsContextConversationI
return ( return (
<> <>
<Menu id={triggerId} animation={animation.fade}> <Menu id={triggerId} animation={animation.fade}>
{getNotificationForConvoMenuItem(
isKickedFromGroup,
left,
isBlocked,
notificationForConvo,
currentNotificationSetting,
conversationId
)}
{getPinConversationMenuItem(conversationId)} {getPinConversationMenuItem(conversationId)}
{getBlockMenuItem(isMe, type === ConversationTypeEnum.PRIVATE, isBlocked, conversationId)} {getBlockMenuItem(isMe, type === ConversationTypeEnum.PRIVATE, isBlocked, conversationId)}
{getCopyMenuItem(isPublic, isGroup, conversationId)} {getCopyMenuItem(isPublic, isGroup, conversationId)}

@ -408,6 +408,13 @@ export class ConversationModel extends Backbone.Model<ConversationAttributes> {
groupAdmins, groupAdmins,
members, members,
isPinned: this.isPinned(), 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'),
}; };
} }

@ -5,8 +5,12 @@ import { createAsyncThunk } from '@reduxjs/toolkit';
import { getConversationController } from '../../session/conversations'; import { getConversationController } from '../../session/conversations';
import { MessageModel } from '../../models/message'; import { MessageModel } from '../../models/message';
import { getMessagesByConversation } from '../../data/data'; import { getMessagesByConversation } from '../../data/data';
import { ConversationTypeEnum } from '../../models/conversation'; import {
ConversationNotificationSettingType,
ConversationTypeEnum,
} from '../../models/conversation';
import { MessageDeliveryStatus } from '../../models/messageType'; import { MessageDeliveryStatus } from '../../models/messageType';
import { NotificationForConvoOption } from '../../components/conversation/ConversationHeader';
// State // State
@ -83,6 +87,8 @@ export interface ConversationType {
groupAdmins?: Array<string>; // admins for closed groups and moderators for open groups groupAdmins?: Array<string>; // admins for closed groups and moderators for open groups
members?: Array<string>; // members for closed groups only members?: Array<string>; // members for closed groups only
isPinned: boolean; isPinned: boolean;
notificationForConvo: Array<NotificationForConvoOption>;
currentNotificationSetting: ConversationNotificationSettingType;
} }
export type ConversationLookupType = { export type ConversationLookupType = {

@ -1,5 +1,8 @@
import { assert } from 'chai'; import { assert } from 'chai';
import { ConversationTypeEnum } from '../../../../models/conversation'; import {
ConversationNotificationSetting,
ConversationTypeEnum,
} from '../../../../models/conversation';
import { ConversationLookupType } from '../../../../state/ducks/conversations'; import { ConversationLookupType } from '../../../../state/ducks/conversations';
import { import {
@ -28,6 +31,8 @@ describe('state/selectors/conversations', () => {
isKickedFromGroup: false, isKickedFromGroup: false,
left: false, left: false,
isPinned: false, isPinned: false,
notificationForConvo: [],
currentNotificationSetting: ConversationNotificationSetting[0],
}, },
id2: { id2: {
id: 'id2', id: 'id2',
@ -45,13 +50,14 @@ describe('state/selectors/conversations', () => {
isKickedFromGroup: false, isKickedFromGroup: false,
left: false, left: false,
isPinned: false, isPinned: false,
notificationForConvo: [],
currentNotificationSetting: ConversationNotificationSetting[0],
}, },
id3: { id3: {
id: 'id3', id: 'id3',
activeAt: 20, activeAt: 20,
name: 'C', name: 'C',
phoneNumber: 'notused', phoneNumber: 'notused',
type: ConversationTypeEnum.PRIVATE, type: ConversationTypeEnum.PRIVATE,
isMe: false, isMe: false,
unreadCount: 1, unreadCount: 1,
@ -62,6 +68,8 @@ describe('state/selectors/conversations', () => {
isKickedFromGroup: false, isKickedFromGroup: false,
left: false, left: false,
isPinned: false, isPinned: false,
notificationForConvo: [],
currentNotificationSetting: ConversationNotificationSetting[0],
}, },
id4: { id4: {
id: 'id4', id: 'id4',
@ -78,6 +86,8 @@ describe('state/selectors/conversations', () => {
isKickedFromGroup: false, isKickedFromGroup: false,
left: false, left: false,
isPinned: false, isPinned: false,
notificationForConvo: [],
currentNotificationSetting: ConversationNotificationSetting[0],
}, },
id5: { id5: {
id: 'id5', id: 'id5',
@ -94,6 +104,8 @@ describe('state/selectors/conversations', () => {
isKickedFromGroup: false, isKickedFromGroup: false,
left: false, left: false,
isPinned: false, isPinned: false,
notificationForConvo: [],
currentNotificationSetting: ConversationNotificationSetting[0],
}, },
}; };
const comparator = _getConversationComparator(i18n); const comparator = _getConversationComparator(i18n);
@ -126,6 +138,8 @@ describe('state/selectors/conversations', () => {
isKickedFromGroup: false, isKickedFromGroup: false,
left: false, left: false,
isPinned: false, isPinned: false,
notificationForConvo: [],
currentNotificationSetting: ConversationNotificationSetting[0],
}, },
id2: { id2: {
id: 'id2', id: 'id2',
@ -143,6 +157,8 @@ describe('state/selectors/conversations', () => {
isKickedFromGroup: false, isKickedFromGroup: false,
left: false, left: false,
isPinned: false, isPinned: false,
notificationForConvo: [],
currentNotificationSetting: ConversationNotificationSetting[0],
}, },
id3: { id3: {
id: 'id3', id: 'id3',
@ -160,6 +176,8 @@ describe('state/selectors/conversations', () => {
isKickedFromGroup: false, isKickedFromGroup: false,
left: false, left: false,
isPinned: true, isPinned: true,
notificationForConvo: [],
currentNotificationSetting: ConversationNotificationSetting[0],
}, },
id4: { id4: {
id: 'id4', id: 'id4',
@ -176,6 +194,8 @@ describe('state/selectors/conversations', () => {
isKickedFromGroup: false, isKickedFromGroup: false,
left: false, left: false,
isPinned: true, isPinned: true,
notificationForConvo: [],
currentNotificationSetting: ConversationNotificationSetting[0],
}, },
id5: { id5: {
id: 'id5', id: 'id5',
@ -192,6 +212,8 @@ describe('state/selectors/conversations', () => {
isKickedFromGroup: false, isKickedFromGroup: false,
left: false, left: false,
isPinned: false, isPinned: false,
notificationForConvo: [],
currentNotificationSetting: ConversationNotificationSetting[0],
}, },
}; };
const comparator = _getConversationComparator(i18n); const comparator = _getConversationComparator(i18n);

Loading…
Cancel
Save