You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
3.1 KiB
TypeScript
103 lines
3.1 KiB
TypeScript
import React from 'react';
|
|
import { compact, flatten } from 'lodash';
|
|
|
|
import { Intl } from '../Intl';
|
|
import { missingCaseError } from '../../util/missingCaseError';
|
|
import {
|
|
PropsForGroupUpdate,
|
|
PropsForGroupUpdateAdd,
|
|
PropsForGroupUpdateKicked,
|
|
PropsForGroupUpdateRemove,
|
|
PropsForGroupUpdateType,
|
|
} from '../../state/ducks/conversations';
|
|
import _ from 'underscore';
|
|
|
|
// 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 _.compact(
|
|
flatten(
|
|
(change.contacts || []).map((contact, index) => {
|
|
const element = (
|
|
<span
|
|
key={`external-${contact.phoneNumber}`}
|
|
className="module-group-notification__contact"
|
|
>
|
|
{contact.profileName || contact.phoneNumber}
|
|
</span>
|
|
);
|
|
|
|
return [index > 0 ? ', ' : null, element];
|
|
})
|
|
)
|
|
);
|
|
}
|
|
|
|
function renderChange(change: PropsForGroupUpdateType) {
|
|
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 <Intl id={joinKey} components={[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 <Intl id={leftKey} components={[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 <Intl id={kickedKey} components={[people]} />;
|
|
case 'general':
|
|
return window.i18n('updatedTheGroup');
|
|
default:
|
|
window.log.error('Missing case error');
|
|
}
|
|
}
|
|
|
|
export const GroupNotification = (props: PropsForGroupUpdate) => {
|
|
const { changes } = props;
|
|
return (
|
|
<div className="module-group-notification" id={props.messageId}>
|
|
{(changes || []).map((change, index) => (
|
|
<div key={index} className="module-group-notification__change">
|
|
{renderChange(change)}
|
|
</div>
|
|
))}
|
|
</div>
|
|
);
|
|
};
|