reactify group updates text bubble from redux store (#2083)
parent
5fb3237d1a
commit
58dc3e26ca
@ -1,91 +0,0 @@
|
|||||||
import React from 'react';
|
|
||||||
|
|
||||||
import {
|
|
||||||
PropsForGroupUpdate,
|
|
||||||
PropsForGroupUpdateAdd,
|
|
||||||
PropsForGroupUpdateKicked,
|
|
||||||
PropsForGroupUpdateRemove,
|
|
||||||
PropsForGroupUpdateType,
|
|
||||||
} from '../../state/ducks/conversations';
|
|
||||||
import _ from 'underscore';
|
|
||||||
import { NotificationBubble } from './message/message-item/notification-bubble/NotificationBubble';
|
|
||||||
import { ReadableMessage } from './message/message-item/ReadableMessage';
|
|
||||||
|
|
||||||
// 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(', ');
|
|
||||||
}
|
|
||||||
|
|
||||||
// tslint:disable-next-line: cyclomatic-complexity
|
|
||||||
const ChangeItem = (change: PropsForGroupUpdateType): string => {
|
|
||||||
const people = isTypeWithContact(change) ? getPeople(change) : undefined;
|
|
||||||
|
|
||||||
switch (change.type) {
|
|
||||||
case 'name':
|
|
||||||
return window.i18n('titleIsNow', [change.newName || '']);
|
|
||||||
case 'add':
|
|
||||||
if (!change.contacts || !change.contacts.length || !people) {
|
|
||||||
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 || !people) {
|
|
||||||
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 || !people) {
|
|
||||||
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>
|
|
||||||
);
|
|
||||||
};
|
|
@ -0,0 +1,89 @@
|
|||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
import {
|
||||||
|
PropsForGroupUpdate,
|
||||||
|
PropsForGroupUpdateType,
|
||||||
|
} from '../../../../state/ducks/conversations';
|
||||||
|
import _ from 'underscore';
|
||||||
|
import { NotificationBubble } from './notification-bubble/NotificationBubble';
|
||||||
|
import { ReadableMessage } from './ReadableMessage';
|
||||||
|
import { arrayContainsUsOnly } from '../../../../models/message';
|
||||||
|
import { useConversationsUsernameOrFull } from '../../../../hooks/useParamSelector';
|
||||||
|
|
||||||
|
// This component is used to display group updates in the conversation view.
|
||||||
|
|
||||||
|
const ChangeItemJoined = (added: Array<string>): string => {
|
||||||
|
if (!added.length) {
|
||||||
|
throw new Error('Group update add is missing contacts');
|
||||||
|
}
|
||||||
|
const names = useConversationsUsernameOrFull(added);
|
||||||
|
const joinKey = added.length > 1 ? 'multipleJoinedTheGroup' : 'joinedTheGroup';
|
||||||
|
return window.i18n(joinKey, [names.join(', ')]);
|
||||||
|
};
|
||||||
|
|
||||||
|
const ChangeItemKicked = (kicked: Array<string>): string => {
|
||||||
|
if (!kicked.length) {
|
||||||
|
throw new Error('Group update kicked is missing contacts');
|
||||||
|
}
|
||||||
|
const names = useConversationsUsernameOrFull(kicked);
|
||||||
|
|
||||||
|
if (arrayContainsUsOnly(kicked)) {
|
||||||
|
return window.i18n('youGotKickedFromGroup');
|
||||||
|
}
|
||||||
|
|
||||||
|
const kickedKey = kicked.length > 1 ? 'multipleKickedFromTheGroup' : 'kickedFromTheGroup';
|
||||||
|
return window.i18n(kickedKey, [names.join(', ')]);
|
||||||
|
};
|
||||||
|
|
||||||
|
const ChangeItemLeft = (left: Array<string>): string => {
|
||||||
|
if (!left.length) {
|
||||||
|
throw new Error('Group update remove is missing contacts');
|
||||||
|
}
|
||||||
|
|
||||||
|
const names = useConversationsUsernameOrFull(left);
|
||||||
|
|
||||||
|
if (arrayContainsUsOnly(left)) {
|
||||||
|
return window.i18n('youLeftTheGroup');
|
||||||
|
}
|
||||||
|
|
||||||
|
const leftKey = left.length > 1 ? 'multipleLeftTheGroup' : 'leftTheGroup';
|
||||||
|
return window.i18n(leftKey, [names.join(', ')]);
|
||||||
|
};
|
||||||
|
|
||||||
|
// tslint:disable-next-line: cyclomatic-complexity
|
||||||
|
const ChangeItem = (change: PropsForGroupUpdateType): string => {
|
||||||
|
switch (change.type) {
|
||||||
|
case 'name':
|
||||||
|
console.warn('name: ', change.newName);
|
||||||
|
|
||||||
|
return window.i18n('titleIsNow', [change.newName || '']);
|
||||||
|
case 'add':
|
||||||
|
return ChangeItemJoined(change.added);
|
||||||
|
|
||||||
|
case 'left':
|
||||||
|
return ChangeItemLeft(change.left);
|
||||||
|
|
||||||
|
case 'kicked':
|
||||||
|
return ChangeItemKicked(change.kicked);
|
||||||
|
|
||||||
|
case 'general':
|
||||||
|
return window.i18n('updatedTheGroup');
|
||||||
|
default:
|
||||||
|
throw new Error('Missing case error');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export const GroupUpdateMessage = (props: PropsForGroupUpdate) => {
|
||||||
|
const { change, messageId, receivedAt, isUnread } = props;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<ReadableMessage
|
||||||
|
messageId={messageId}
|
||||||
|
receivedAt={receivedAt}
|
||||||
|
isUnread={isUnread}
|
||||||
|
key={`readable-message-${messageId}`}
|
||||||
|
>
|
||||||
|
<NotificationBubble notificationText={ChangeItem(change)} iconType="users" />
|
||||||
|
</ReadableMessage>
|
||||||
|
);
|
||||||
|
};
|
Loading…
Reference in New Issue