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.
session-desktop/ts/opengroup/opengroupV2/OpenGroupUpdate.ts

88 lines
2.9 KiB
TypeScript

import { ApiV2 } from '.';
import { getV2OpenGroupRoom } from '../../data/opengroups';
import { ConversationModel } from '../../models/conversation';
import { downloadAttachmentOpenGroupV2 } from '../../receiver/attachments';
import { sha256 } from '../../session/crypto';
import { fromArrayBufferToBase64 } from '../../session/utils/String';
import { arrayBufferFromFile } from '../../types/Attachment';
import { AttachmentUtil } from '../../util';
export async function updateOpenGroupV2(convo: ConversationModel, groupName: string, avatar: any) {
if (avatar) {
// I hate duplicating this...
const readFile = async (attachment: any) =>
new Promise((resolve, reject) => {
const fileReader = new FileReader();
fileReader.onload = (e: any) => {
const data = e.target.result;
resolve({
...attachment,
data,
size: data.byteLength,
});
};
fileReader.onerror = reject;
fileReader.onabort = reject;
fileReader.readAsArrayBuffer(attachment.file);
});
const avatarAttachment: any = await readFile({ file: avatar });
// We want a square
const withBlob = await AttachmentUtil.autoScale(
{
contentType: avatar.type,
file: new Blob([avatarAttachment.data], {
type: avatar.contentType,
}),
},
{
maxSide: 640,
maxSize: 1000 * 1024,
}
);
const dataResized = await arrayBufferFromFile(withBlob.file);
const roomInfos = await getV2OpenGroupRoom(convo.id);
if (!roomInfos || !dataResized.byteLength) {
return false;
}
const uploadedFileDetails = await ApiV2.uploadImageForRoomOpenGroupV2(
new Uint8Array(dataResized),
roomInfos
);
if (!uploadedFileDetails || !uploadedFileDetails.fileUrl) {
window?.log?.warn('File opengroupv2 upload failed');
return;
}
let url: URL;
try {
url = new URL(uploadedFileDetails.fileUrl);
const pathname = url.pathname;
const downloaded = await downloadAttachmentOpenGroupV2(pathname, roomInfos);
if (!(downloaded instanceof Uint8Array)) {
const typeFound = typeof downloaded;
throw new Error(`Expected a plain Uint8Array but got ${typeFound}`);
}
const upgraded = await window.Signal.Migrations.processNewAttachment({
data: downloaded.buffer,
isRaw: true,
url: pathname,
});
// FIXME audric update of roomname on the server?
window?.log?.warn('TODO update of roomName');
const newHash = sha256(fromArrayBufferToBase64(downloaded.buffer));
await convo.setLokiProfile({
displayName: groupName || convo.get('name') || 'Unknown',
avatar: upgraded.path,
avatarHash: newHash,
});
} catch (e) {
window?.log?.error(`Could not decrypt profile image: ${e}`);
}
}
return undefined;
}