session-desktop/ts/components/conversation/GroupNotification.tsx

91 lines
2.8 KiB
TypeScript

import React from 'react';
import {
PropsForGroupUpdate,
PropsForGroupUpdateAdd,
PropsForGroupUpdateKicked,
PropsForGroupUpdateRemove,
PropsForGroupUpdateType,
} from '../../state/ducks/conversations';
import _ from 'underscore';
import { ReadableMessage } from './ReadableMessage';
import { NotificationBubble } from './notification-bubble/NotificationBubble';
// This component is used to display group updates in the conversation view.
// This is a not a "notification" as the name suggests, but a message inside the conversation
type TypeWithContacts =
| PropsForGroupUpdateAdd
| PropsForGroupUpdateKicked
| PropsForGroupUpdateRemove;
function isTypeWithContact(change: PropsForGroupUpdateType): change is TypeWithContacts {
return (change as TypeWithContacts).contacts !== undefined;
}
function getPeople(change: TypeWithContacts) {
return change.contacts?.map(c => c.profileName || c.pubkey).join(', ');
}
const ChangeItem = (change: PropsForGroupUpdateType): string => {
const people = isTypeWithContact(change) ? getPeople(change) : [];
switch (change.type) {
case 'name':
return window.i18n('titleIsNow', change.newName || '');
case 'add':
if (!change.contacts || !change.contacts.length) {
throw new Error('Group update add is missing contacts');
}
const joinKey = change.contacts.length > 1 ? 'multipleJoinedTheGroup' : 'joinedTheGroup';
return window.i18n(joinKey, people);
case 'remove':
if (change.isMe) {
return window.i18n('youLeftTheGroup');
}
if (!change.contacts || !change.contacts.length) {
throw new Error('Group update remove is missing contacts');
}
const leftKey = change.contacts.length > 1 ? 'multipleLeftTheGroup' : 'leftTheGroup';
return window.i18n(leftKey, people);
case 'kicked':
if (change.isMe) {
return window.i18n('youGotKickedFromGroup');
}
if (!change.contacts || !change.contacts.length) {
throw new Error('Group update kicked is missing contacts');
}
const kickedKey =
change.contacts.length > 1 ? 'multipleKickedFromTheGroup' : 'kickedFromTheGroup';
return window.i18n(kickedKey, people);
case 'general':
return window.i18n('updatedTheGroup');
default:
throw new Error('Missing case error');
}
};
export const GroupNotification = (props: PropsForGroupUpdate) => {
const { changes, messageId, receivedAt, isUnread } = props;
const textChange = changes.map(ChangeItem)[0];
return (
<ReadableMessage
messageId={messageId}
receivedAt={receivedAt}
isUnread={isUnread}
key={`readable-message-${messageId}`}
>
<NotificationBubble notificationText={textChange} iconType="users" />
</ReadableMessage>
);
};