|
|
@ -26,6 +26,7 @@ import { AttachmentType, save } from '../../../types/Attachment';
|
|
|
|
import { ToastUtils } from '../../../session/utils';
|
|
|
|
import { ToastUtils } from '../../../session/utils';
|
|
|
|
import * as MIME from '../../../types/MIME';
|
|
|
|
import * as MIME from '../../../types/MIME';
|
|
|
|
import { SessionFileDropzone } from './SessionFileDropzone';
|
|
|
|
import { SessionFileDropzone } from './SessionFileDropzone';
|
|
|
|
|
|
|
|
import { PubKey } from '../../../session/types';
|
|
|
|
|
|
|
|
|
|
|
|
interface State {
|
|
|
|
interface State {
|
|
|
|
conversationKey: string;
|
|
|
|
conversationKey: string;
|
|
|
@ -449,9 +450,7 @@ export class SessionConversation extends React.Component<Props, State> {
|
|
|
|
onSetDisappearingMessages: (seconds: any) =>
|
|
|
|
onSetDisappearingMessages: (seconds: any) =>
|
|
|
|
conversation.updateExpirationTimer(seconds),
|
|
|
|
conversation.updateExpirationTimer(seconds),
|
|
|
|
onDeleteMessages: () => null,
|
|
|
|
onDeleteMessages: () => null,
|
|
|
|
onDeleteSelectedMessages: async () => {
|
|
|
|
onDeleteSelectedMessages: this.deleteSelectedMessages,
|
|
|
|
await this.deleteSelectedMessages();
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
onCloseOverlay: () => {
|
|
|
|
onCloseOverlay: () => {
|
|
|
|
this.setState({ selectedMessages: [] });
|
|
|
|
this.setState({ selectedMessages: [] });
|
|
|
|
conversation.resetMessageSelection();
|
|
|
|
conversation.resetMessageSelection();
|
|
|
@ -536,6 +535,7 @@ export class SessionConversation extends React.Component<Props, State> {
|
|
|
|
onClickAttachment: this.onClickAttachment,
|
|
|
|
onClickAttachment: this.onClickAttachment,
|
|
|
|
onDownloadAttachment: this.downloadAttachment,
|
|
|
|
onDownloadAttachment: this.downloadAttachment,
|
|
|
|
messageContainerRef: this.messageContainerRef,
|
|
|
|
messageContainerRef: this.messageContainerRef,
|
|
|
|
|
|
|
|
onDeleteSelectedMessages: this.deleteSelectedMessages,
|
|
|
|
};
|
|
|
|
};
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -652,16 +652,15 @@ export class SessionConversation extends React.Component<Props, State> {
|
|
|
|
|
|
|
|
|
|
|
|
public async deleteSelectedMessages() {
|
|
|
|
public async deleteSelectedMessages() {
|
|
|
|
// Get message objects
|
|
|
|
// Get message objects
|
|
|
|
const selectedMessages = this.state.messages.filter(message =>
|
|
|
|
|
|
|
|
this.state.selectedMessages.find(
|
|
|
|
|
|
|
|
selectedMessage => selectedMessage === message.id
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const { conversationKey } = this.state;
|
|
|
|
const { conversationKey } = this.state;
|
|
|
|
const conversationModel = window.ConversationController.getOrThrow(
|
|
|
|
const conversationModel = window.ConversationController.getOrThrow(
|
|
|
|
conversationKey
|
|
|
|
conversationKey
|
|
|
|
);
|
|
|
|
);
|
|
|
|
|
|
|
|
const selectedMessages = conversationModel.messageCollection.models.filter(message =>
|
|
|
|
|
|
|
|
this.state.selectedMessages.find(
|
|
|
|
|
|
|
|
selectedMessage => selectedMessage === message.id
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
const multiple = selectedMessages.length > 1;
|
|
|
|
const multiple = selectedMessages.length > 1;
|
|
|
|
|
|
|
|
|
|
|
@ -698,9 +697,9 @@ export class SessionConversation extends React.Component<Props, State> {
|
|
|
|
await MultiDeviceProtocol.getPrimaryDevice(ourDevicePubkey)
|
|
|
|
await MultiDeviceProtocol.getPrimaryDevice(ourDevicePubkey)
|
|
|
|
).key;
|
|
|
|
).key;
|
|
|
|
const isModerator = conversationModel.isModerator(ourPrimaryPubkey);
|
|
|
|
const isModerator = conversationModel.isModerator(ourPrimaryPubkey);
|
|
|
|
|
|
|
|
const ourNumbers = (await MultiDeviceProtocol.getOurDevices()).map(m => m.key);
|
|
|
|
const isAllOurs = selectedMessages.every(
|
|
|
|
const isAllOurs = selectedMessages.every(
|
|
|
|
message =>
|
|
|
|
message => ourNumbers.includes(message.get('source'))
|
|
|
|
message.propsForMessage.authorPhoneNumber === message.OUR_NUMBER
|
|
|
|
|
|
|
|
);
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
if (!isAllOurs && !isModerator) {
|
|
|
|
if (!isAllOurs && !isModerator) {
|
|
|
@ -743,13 +742,6 @@ export class SessionConversation extends React.Component<Props, State> {
|
|
|
|
});
|
|
|
|
});
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// Only show a warning when at least one messages was successfully
|
|
|
|
|
|
|
|
// saved in on the server
|
|
|
|
|
|
|
|
if (!selectedMessages.some(m => !m.hasErrors())) {
|
|
|
|
|
|
|
|
await doDelete();
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// If removable from server, we "Unsend" - otherwise "Delete"
|
|
|
|
// If removable from server, we "Unsend" - otherwise "Delete"
|
|
|
|
const pluralSuffix = multiple ? 's' : '';
|
|
|
|
const pluralSuffix = multiple ? 's' : '';
|
|
|
|
const title = window.i18n(
|
|
|
|
const title = window.i18n(
|
|
|
|