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.
		
		
		
		
		
			
		
			
				
	
	
		
			84 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			84 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			TypeScript
		
	
| import { OpenGroupData } from '../../data/opengroups';
 | |
| import { downloadAttachmentSogsV3 } from '../../receiver/attachments';
 | |
| import { MIME } from '../../types';
 | |
| import { urlToBlob } from '../../types/attachments/VisualAttachment';
 | |
| import { processNewAttachment } from '../../types/MessageAttachment';
 | |
| import { uploadImageForRoomSogsV3 } from '../apis/open_group_api/sogsv3/sogsV3RoomImage';
 | |
| import { getConversationController } from '../conversations';
 | |
| 
 | |
| export type OpenGroupUpdateAvatar = { objectUrl: string | null };
 | |
| 
 | |
| /**
 | |
|  * This function is only called when the local user makes a change to an open group.
 | |
|  * So this function is not called on group updates from the network, even from another of our devices.
 | |
|  */
 | |
| export async function initiateOpenGroupUpdate(
 | |
|   groupId: string,
 | |
|   groupName: string,
 | |
|   avatar: OpenGroupUpdateAvatar
 | |
| ) {
 | |
|   // we actually do not change the groupName just yet here, serverSide. This is just done client side. Maybe something to allow in a later release.
 | |
|   // For now, the UI is actually not allowing changing the room name so we do not care.
 | |
|   const convo = getConversationController().get(groupId);
 | |
| 
 | |
|   if (!convo || !convo.isPublic() || !convo.isOpenGroupV2()) {
 | |
|     throw new Error('Only opengroupv2 are supported');
 | |
|   }
 | |
|   if (avatar && avatar.objectUrl) {
 | |
|     const blobAvatarAlreadyScaled = await urlToBlob(avatar.objectUrl);
 | |
| 
 | |
|     const dataResized = await blobAvatarAlreadyScaled.arrayBuffer();
 | |
|     const roomInfos = OpenGroupData.getV2OpenGroupRoom(convo.id);
 | |
|     if (!roomInfos || !dataResized.byteLength) {
 | |
|       return false;
 | |
|     }
 | |
|     const uploadedFileDetails = await uploadImageForRoomSogsV3(
 | |
|       new Uint8Array(dataResized),
 | |
|       roomInfos
 | |
|     );
 | |
| 
 | |
|     if (!uploadedFileDetails || !uploadedFileDetails.fileUrl) {
 | |
|       window?.log?.warn('File opengroupv2 upload failed');
 | |
|       return false;
 | |
|     }
 | |
|     try {
 | |
|       const { fileId, fileUrl } = uploadedFileDetails;
 | |
| 
 | |
|       // this is kind of a hack just made to avoid having a specific function downloading from sogs by URL rather than fileID
 | |
|       const downloaded = await downloadAttachmentSogsV3(
 | |
|         { id: fileId, size: null, url: fileUrl },
 | |
|         roomInfos
 | |
|       );
 | |
| 
 | |
|       if (!downloaded || !(downloaded.data instanceof ArrayBuffer)) {
 | |
|         const typeFound = typeof downloaded;
 | |
|         throw new Error(`Expected a plain ArrayBuffer but got ${typeFound}`);
 | |
|       }
 | |
|       const data = downloaded.data;
 | |
|       if (!downloaded.data?.byteLength) {
 | |
|         window?.log?.error('Failed to download attachment. Length is 0');
 | |
|         throw new Error(
 | |
|           `Failed to download attachment. Length is 0 for ${uploadedFileDetails.fileUrl}`
 | |
|         );
 | |
|       }
 | |
| 
 | |
|       const upgraded = await processNewAttachment({
 | |
|         data,
 | |
|         isRaw: true,
 | |
|         contentType: MIME.IMAGE_UNKNOWN, // contentType is mostly used to generate previews and screenshot. We do not care for those in this case.
 | |
|       });
 | |
|       const avatarImageId = fileId;
 | |
|       await convo.setSessionProfile({
 | |
|         displayName: groupName || convo.get('displayNameInProfile') || 'Unknown',
 | |
|         avatarPath: upgraded.path,
 | |
| 
 | |
|         avatarImageId,
 | |
|       });
 | |
|     } catch (e) {
 | |
|       window?.log?.error(`Could not decrypt profile image: ${e}`);
 | |
|       return false;
 | |
|     }
 | |
|   }
 | |
|   return true;
 | |
| }
 |