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/session/apis/open_group_api/sogsv3/sogsV3RoomImage.ts

49 lines
1.7 KiB
TypeScript

import AbortController from 'abort-controller';
import { isNumber } from 'lodash';
import { OpenGroupRequestCommonType } from '../opengroupV2/ApiUtil';
import { batchFirstSubIsSuccess, batchGlobalIsSuccess, sogsBatchSend } from './sogsV3BatchPoll';
import { uploadFileToRoomSogs3 } from './sogsV3SendFile';
/**
* This function does a double request to the sogs.
* - First request uploads the file content to the server and gets the associated fileId.
* - Second request set the preview/avatar image of that room to the just got fileId.
*
* @param fileContent the content of the image to upload as new sogs room image. Be sure to resize it to not have something too big (500x500 jpeg should be enough)
* @param roomInfos the room details including the
* @returns the fileId and the full url of the new avatar. To be used for redownload and to set the avatar locally once it is updated.
*/
export const uploadImageForRoomSogsV3 = async (
fileContent: Uint8Array,
roomInfos: OpenGroupRequestCommonType
): Promise<{ fileUrl: string; fileId: number } | null> => {
if (!fileContent || !fileContent.length) {
return null;
}
const result = await uploadFileToRoomSogs3(fileContent, roomInfos);
if (!result || !isNumber(result.fileId)) {
return null;
}
const { fileId, fileUrl } = result;
if (!fileId || !fileContent.length) {
return null;
}
const batchResult = await sogsBatchSend(
roomInfos.serverUrl,
new Set([roomInfos.roomId]),
new AbortController().signal,
[{ type: 'updateRoom', updateRoom: { roomId: roomInfos.roomId, imageId: fileId } }],
'batch'
);
if (!batchGlobalIsSuccess(batchResult) || !batchFirstSubIsSuccess(batchResult)) {
return null;
}
return {
fileUrl,
fileId,
};
};