Skip to content

Commit fac67d9

Browse files
authored
feat: Support setting output file type in image compression process (#1064)
[CLNP-2718](https://sendbird.atlassian.net/browse/CLNP-2718) [SBISSUE-14611](https://sendbird.atlassian.net/browse/SBISSUE-14611) ### Feature & ChangeLog * Add `outputFormat` to the image compression options ```tsx <SendbirdProvider ... imageCompression={{ outputFormat: 'preserve' | 'png' | 'jpeg', }} > </SendbirdProvider> ```
1 parent 29b823f commit fac67d9

File tree

5 files changed

+27
-14
lines changed

5 files changed

+27
-14
lines changed

src/lib/Sendbird.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,12 @@ interface VoiceRecordOptions {
6868
minRecordingTime?: number;
6969
}
7070

71+
export type ImageCompressionOutputFormatType = 'preserve' | 'png' | 'jpeg';
7172
export interface ImageCompressionOptions {
7273
compressionRate?: number;
7374
resizingWidth?: number | string;
7475
resizingHeight?: number | string;
76+
outputFormat?: ImageCompressionOutputFormatType;
7577
}
7678

7779
export interface SendbirdConfig {
@@ -361,6 +363,7 @@ const SendbirdSDK = ({
361363
pubSub,
362364
imageCompression: {
363365
compressionRate: 0.7,
366+
outputFormat: 'preserve',
364367
...imageCompression,
365368
},
366369
voiceRecord: {

src/lib/types.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import type {
2525
ReplyType,
2626
UserListQuery,
2727
} from '../types';
28+
import type { ImageCompressionOptions } from './Sendbird';
2829
import { UikitMessageHandler } from './selectors';
2930
import { Logger } from './SendbirdState';
3031
import { MarkAsReadSchedulerType } from './hooks/useMarkAsReadScheduler';
@@ -86,11 +87,7 @@ export interface SendBirdStateConfig {
8687
maxMentionCount: number,
8788
maxSuggestionCount: number,
8889
};
89-
imageCompression?: {
90-
compressionRate?: number,
91-
resizingWidth?: number | string,
92-
resizingHeight?: number | string,
93-
};
90+
imageCompression?: ImageCompressionOptions;
9491
markAsReadScheduler: MarkAsReadSchedulerType;
9592
markAsDeliveredScheduler: MarkAsDeliveredSchedulerType;
9693
isTypingIndicatorEnabledOnChannelList?: boolean;

src/lib/utils/uikitConfigMapper.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ export function uikitConfigMapper({
2626
enableOgtag: uikitOptions.groupChannel?.enableOgtag,
2727
enableMention: uikitOptions.groupChannel?.enableMention ?? isMentionEnabled,
2828
enableReactions: uikitOptions.groupChannel?.enableReactions ?? isReactionEnabled,
29+
enableReactionsSupergroup: uikitOptions.groupChannel?.enableReactionsSupergroup,
2930
enableTypingIndicator: uikitOptions.groupChannel?.enableTypingIndicator,
3031
enableVoiceMessage: uikitOptions.groupChannel?.enableVoiceMessage ?? isVoiceMessageEnabled,
3132
replyType: uikitOptions.groupChannel?.replyType

src/modules/OpenChannel/context/hooks/useFileUploadCallback.tsx

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import type { OpenChannel } from '@sendbird/chat/openChannel';
33
import type { FileMessageCreateParams } from '@sendbird/chat/message';
44

55
import type { Logger } from '../../../../lib/SendbirdState';
6+
import type { ImageCompressionOptions } from '../../../../lib/Sendbird';
67
import * as messageActionTypes from '../dux/actionTypes';
78
import * as utils from '../utils';
89
import { SdkStore } from '../../../../lib/types';
@@ -18,11 +19,7 @@ interface DynamicParams {
1819
currentOpenChannel: OpenChannel;
1920
onBeforeSendFileMessage: (file: File) => FileMessageCreateParams;
2021
checkScrollBottom: () => boolean;
21-
imageCompression?: {
22-
compressionRate?: number,
23-
resizingWidth?: number | string,
24-
resizingHeight?: number | string,
25-
};
22+
imageCompression?: ImageCompressionOptions;
2623
}
2724
interface StaticParams {
2825
sdk: SdkStore['sdk'];

src/utils/compressImages.ts

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
import { ImageCompressionOptions } from '../lib/Sendbird';
1+
import type { ImageCompressionOptions, ImageCompressionOutputFormatType } from '../lib/Sendbird';
22
import pxToNumber from './pxToNumber';
33
import { Logger } from '../lib/SendbirdState';
44

55
interface CompressImageParams {
66
imageFile: File;
77
compressionRate: number;
8+
outputFormat: ImageCompressionOutputFormatType;
89
resizingWidth?: number;
910
resizingHeight?: number;
1011
}
@@ -14,6 +15,7 @@ export const compressImage = ({
1415
compressionRate,
1516
resizingWidth,
1617
resizingHeight,
18+
outputFormat,
1719
}: CompressImageParams): Promise<File> => {
1820
const image = document.createElement('img');
1921
return new Promise((resolve, reject) => {
@@ -51,16 +53,28 @@ export const compressImage = ({
5153

5254
ctx.drawImage(image, 0, 0, targetResizingWidth, targetResizingHeight);
5355

56+
// Change the file.name & file.type for converting file type
57+
const targetFileType = outputFormat === 'preserve' ? imageFile.type : `image/${outputFormat}`;
58+
const targetSubtype = targetFileType.split('/').pop();
59+
let targetName = '';
60+
const dotIndex = imageFile.name.lastIndexOf('.');
61+
if (dotIndex === -1) {
62+
// No extension found, use the original filename
63+
targetName = imageFile.name;
64+
} else {
65+
// Replace the old extension with the new one
66+
targetName = imageFile.name.substring(0, dotIndex) + '.' + targetSubtype;
67+
}
5468
ctx.canvas.toBlob(
5569
(blob) => {
5670
if (blob) {
57-
const file = new File([blob], imageFile.name, { type: imageFile.type });
71+
const file = new File([blob], targetName, { type: targetFileType });
5872
resolve(file);
5973
} else {
6074
reject(new Error('Failed to compress image'));
6175
}
6276
},
63-
imageFile.type,
77+
targetFileType,
6478
compressionRate,
6579
);
6680
};
@@ -77,7 +91,7 @@ export const compressImages = async ({
7791
logger,
7892
imageCompression,
7993
}: CompressImagesParams) => {
80-
const { compressionRate } = imageCompression;
94+
const { compressionRate, outputFormat = 'preserve' } = imageCompression;
8195
const resizingWidth = pxToNumber(imageCompression.resizingWidth);
8296
const resizingHeight = pxToNumber(imageCompression.resizingHeight);
8397

@@ -111,6 +125,7 @@ export const compressImages = async ({
111125
compressionRate,
112126
resizingWidth,
113127
resizingHeight,
128+
outputFormat,
114129
});
115130
result.compressedFiles.push(compressedImage);
116131
} catch (err) {

0 commit comments

Comments
 (0)