Skip to content

Commit

Permalink
Added support for media chat messages;
Browse files Browse the repository at this point in the history
  • Loading branch information
stef-coenen committed Nov 21, 2023
1 parent 76a9ded commit 401ce04
Show file tree
Hide file tree
Showing 4 changed files with 199 additions and 48 deletions.
5 changes: 4 additions & 1 deletion packages/chat-app/src/hooks/chat/useChatMessage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import {
updateChatMessage,
uploadChatMessage,
} from '../../providers/ChatProvider';
import { NewMediaFile } from '@youfoundation/js-lib/public';

export const useChatMessage = () => {
const { getIdentity, getDotYouClient } = useDotYouClient();
Expand All @@ -24,10 +25,12 @@ export const useChatMessage = () => {
const sendMessage = async ({
conversationId,
recipients,
files,
message,
}: {
conversationId: string;
recipients: string[];
files?: NewMediaFile[];
message: string;
}): Promise<NewDriveSearchResult<ChatMessage> | null> => {
const newChatId = getNewId();
Expand All @@ -54,7 +57,7 @@ export const useChatMessage = () => {
},
};

const uploadResult = await uploadChatMessage(dotYouClient, newChat);
const uploadResult = await uploadChatMessage(dotYouClient, newChat, files);
if (!uploadResult) throw new Error('Failed to send the chat message');

newChat.fileId = uploadResult.file.fileId;
Expand Down
43 changes: 39 additions & 4 deletions packages/chat-app/src/providers/ChatProvider.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,21 @@
import {
DotYouClient,
DriveSearchResult,
EmbeddedThumb,
FileMetadata,
FileQueryParams,
GetBatchQueryResultOptions,
KeyHeader,
NewDriveSearchResult,
PayloadFile,
ScheduleOptions,
SecurityGroupType,
SendContents,
TargetDrive,
ThumbnailFile,
UploadFileMetadata,
UploadInstructionSet,
createThumbnails,
getContentFromHeaderOrPayload,
queryBatch,
sendCommand,
Expand All @@ -25,6 +29,7 @@ import {
SingleConversation,
} from './ConversationProvider';
import { jsonStringify64 } from '@youfoundation/js-lib/helpers';
import { NewMediaFile } from '@youfoundation/js-lib/dist';

export enum ChatDeliveryStatus {
// NotSent = 10, // NotSent is not a valid atm, when it's not sent, it doesn't "exist"
Expand Down Expand Up @@ -86,6 +91,8 @@ export interface ChatMessage {
recipients: string[];
}

const CHAT_MESSAGE_PAYLOAD_KEY = 'chat_web';

export const getChatMessages = async (
dotYouClient: DotYouClient,
conversationId: string,
Expand Down Expand Up @@ -150,6 +157,7 @@ export const dsrToMessage = async (
export const uploadChatMessage = async (
dotYouClient: DotYouClient,
message: NewDriveSearchResult<ChatMessage>,
files: NewMediaFile[] | undefined,
onVersionConflict?: () => void
) => {
const messageContent = message.fileMetadata.appData.content;
Expand All @@ -170,28 +178,55 @@ export const uploadChatMessage = async (
: undefined,
};

const payloadJson: string = jsonStringify64({ ...messageContent, recipients: undefined });
const jsonContent: string = jsonStringify64({ ...messageContent, recipients: undefined });
const uploadMetadata: UploadFileMetadata = {
versionTag: message?.fileMetadata.versionTag,
allowDistribution: distribute,
appData: {
uniqueId: messageContent.id,
groupId: messageContent.conversationId,
fileType: messageContent.messageType,
content: payloadJson,
content: jsonContent,
},
isEncrypted: true,
accessControlList: message.serverMetadata?.accessControlList || {
requiredSecurityGroup: SecurityGroupType.Connected,
},
};

const payloads: PayloadFile[] = [];
const thumbnails: ThumbnailFile[] = [];
let previewThumbnail: EmbeddedThumb | undefined;

for (let i = 0; files && i < files?.length; i++) {
const payloadKey = `${CHAT_MESSAGE_PAYLOAD_KEY}${i}`;
const newMediaFile = files[i];
if (newMediaFile.file.type.startsWith('video/')) {
throw new Error('Video is not supported yet');
} else {
const { additionalThumbnails, tinyThumb } = await createThumbnails(
newMediaFile.file,
payloadKey
);

thumbnails.push(...additionalThumbnails);
payloads.push({
key: payloadKey,
payload: newMediaFile.file,
});

if (!previewThumbnail) previewThumbnail = tinyThumb;
}
}

uploadMetadata.appData.previewThumbnail = previewThumbnail;

return await uploadFile(
dotYouClient,
uploadInstructions,
uploadMetadata,
undefined,
undefined,
payloads,
thumbnails,
undefined,
onVersionConflict
);
Expand Down
Loading

0 comments on commit 401ce04

Please sign in to comment.