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.
141 lines
4.1 KiB
TypeScript
141 lines
4.1 KiB
TypeScript
import {
|
|
getCompleteUrlFromRoom,
|
|
openGroupPrefixRegex,
|
|
openGroupV2ConversationIdRegex,
|
|
} from '../opengroup/utils/OpenGroupUtils';
|
|
import { getV2OpenGroupRoom } from '../data/opengroups';
|
|
import { ToastUtils } from '../session/utils';
|
|
import { ConversationModel } from '../models/conversation';
|
|
import { MessageModel } from '../models/message';
|
|
import { ApiV2 } from '../opengroup/opengroupV2';
|
|
|
|
import _ from 'lodash';
|
|
|
|
export const getCompleteUrlForV2ConvoId = async (convoId: string) => {
|
|
if (convoId.match(openGroupV2ConversationIdRegex)) {
|
|
// this is a v2 group, just build the url
|
|
const roomInfos = await getV2OpenGroupRoom(convoId);
|
|
if (roomInfos) {
|
|
const fullUrl = getCompleteUrlFromRoom(roomInfos);
|
|
|
|
return fullUrl;
|
|
}
|
|
}
|
|
return undefined;
|
|
};
|
|
|
|
export async function copyPublicKey(convoId: string) {
|
|
if (convoId.match(openGroupPrefixRegex)) {
|
|
// open group v1 or v2
|
|
if (convoId.match(openGroupV2ConversationIdRegex)) {
|
|
// this is a v2 group, just build the url
|
|
const completeUrl = await getCompleteUrlForV2ConvoId(convoId);
|
|
if (completeUrl) {
|
|
window.clipboard.writeText(completeUrl);
|
|
|
|
ToastUtils.pushCopiedToClipBoard();
|
|
return;
|
|
}
|
|
window.log.warn('copy to pubkey no roomInfo');
|
|
return;
|
|
}
|
|
|
|
// this is a v1
|
|
const atIndex = convoId.indexOf('@');
|
|
const openGroupUrl = convoId.substr(atIndex + 1);
|
|
window.clipboard.writeText(openGroupUrl);
|
|
|
|
ToastUtils.pushCopiedToClipBoard();
|
|
return;
|
|
}
|
|
window.clipboard.writeText(convoId);
|
|
|
|
ToastUtils.pushCopiedToClipBoard();
|
|
}
|
|
|
|
export async function deleteOpenGroupMessages(
|
|
messages: Array<MessageModel>,
|
|
convo: ConversationModel
|
|
): Promise<Array<MessageModel>> {
|
|
if (!convo.isPublic()) {
|
|
throw new Error('cannot delete public message on a non public groups');
|
|
}
|
|
|
|
if (convo.isOpenGroupV2()) {
|
|
const roomInfos = convo.toOpenGroupV2();
|
|
// on v2 servers we can only remove a single message per request..
|
|
// so logic here is to delete each messages and get which one where not removed
|
|
const validServerIdsToRemove = _.compact(
|
|
messages.map(msg => {
|
|
const serverId = msg.get('serverId');
|
|
return serverId;
|
|
})
|
|
);
|
|
|
|
const validMessageModelsToRemove = _.compact(
|
|
messages.map(msg => {
|
|
const serverId = msg.get('serverId');
|
|
if (serverId) {
|
|
return msg;
|
|
}
|
|
return undefined;
|
|
})
|
|
);
|
|
|
|
let allMessagesAreDeleted: boolean = false;
|
|
if (validServerIdsToRemove.length) {
|
|
allMessagesAreDeleted = await ApiV2.deleteMessageByServerIds(
|
|
validServerIdsToRemove,
|
|
roomInfos
|
|
);
|
|
}
|
|
// remove only the messages we managed to remove on the server
|
|
if (allMessagesAreDeleted) {
|
|
window.log.info('Removed all those serverIds messages successfully');
|
|
return validMessageModelsToRemove;
|
|
} else {
|
|
window.log.info(
|
|
'failed to remove all those serverIds message. not removing them locally neither'
|
|
);
|
|
return [];
|
|
}
|
|
} else if (convo.isOpenGroupV1()) {
|
|
const channelAPI = await convo.getPublicSendData();
|
|
|
|
if (!channelAPI) {
|
|
throw new Error('Unable to get public channel API');
|
|
}
|
|
|
|
const invalidMessages = messages.filter(m => !m.attributes.serverId);
|
|
const pendingMessages = messages.filter(m => m.attributes.serverId);
|
|
|
|
let deletedServerIds = [];
|
|
let ignoredServerIds = [];
|
|
|
|
if (pendingMessages.length > 0) {
|
|
const result = await channelAPI.deleteMessages(
|
|
pendingMessages.map(m => m.attributes.serverId)
|
|
);
|
|
deletedServerIds = result.deletedIds;
|
|
ignoredServerIds = result.ignoredIds;
|
|
}
|
|
|
|
const toDeleteLocallyServerIds = _.union(deletedServerIds, ignoredServerIds);
|
|
let toDeleteLocally = messages.filter(m =>
|
|
toDeleteLocallyServerIds.includes(m.attributes.serverId)
|
|
);
|
|
toDeleteLocally = _.union(toDeleteLocally, invalidMessages);
|
|
|
|
await Promise.all(
|
|
toDeleteLocally.map(async m => {
|
|
await convo.removeMessage(m.id);
|
|
})
|
|
);
|
|
|
|
await convo.updateLastMessage();
|
|
|
|
return toDeleteLocally;
|
|
}
|
|
return [];
|
|
}
|