Skip to content

Commit 395a280

Browse files
authored
fix: Handle undefined message type in is voice message (#643)
### Description Of Changes issue * Screen error shows up intermittently and says that the `message.type` property is undefined fix * Check if the type property is empty and return false when it is
1 parent 81171a9 commit 395a280

File tree

2 files changed

+141
-7
lines changed

2 files changed

+141
-7
lines changed
+132
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
import { FileMessage, UserMessage } from '@sendbird/chat/message';
2+
import { isVoiceMessage } from '..';
3+
4+
const mockVoiceMessage = {
5+
message: null,
6+
messageType: 'file',
7+
createdAt: 1,
8+
type: 'audio/mp3;sbu_type=voice',
9+
name: 'Voice_message.mp3',
10+
file: new File([], 'Voice_message.mp3'),
11+
metaArrays: [
12+
{ key: 'KEY_INTERNAL_MESSAGE_TYPE', value: ['voice/mp3'] },
13+
],
14+
} as unknown as FileMessage;
15+
const mockUserMessage = {
16+
message: 'I am user message',
17+
messageType: 'user',
18+
createdAt: 1,
19+
type: null,
20+
name: null,
21+
file: null,
22+
} as unknown as UserMessage;
23+
24+
describe('Global-utils/isVoiceMessage', () => {
25+
it('should verify voice message', () => {
26+
expect(
27+
isVoiceMessage(mockVoiceMessage),
28+
).toBeTrue();
29+
expect(
30+
isVoiceMessage({
31+
...mockVoiceMessage,
32+
type: 'audio/mp3',
33+
// referring correct metaArrays
34+
} as unknown as FileMessage),
35+
).toBeTrue();
36+
expect(
37+
isVoiceMessage({
38+
...mockVoiceMessage,
39+
// referring correct type
40+
metaArrays: [],
41+
} as unknown as FileMessage),
42+
).toBeTrue();
43+
});
44+
it('should filter invalid parameters', () => {
45+
expect(
46+
isVoiceMessage({
47+
...mockVoiceMessage,
48+
type: 'voice/mp3;sbu_type=voice',
49+
} as unknown as FileMessage),
50+
).toBeFalse();
51+
expect(
52+
isVoiceMessage({
53+
...mockVoiceMessage,
54+
type: '',
55+
} as unknown as FileMessage),
56+
).toBeFalse();
57+
expect(
58+
isVoiceMessage({
59+
...mockVoiceMessage,
60+
type: null,
61+
} as unknown as FileMessage),
62+
).toBeFalse();
63+
expect(
64+
isVoiceMessage({
65+
...mockVoiceMessage,
66+
type: undefined,
67+
} as unknown as FileMessage),
68+
).toBeFalse();
69+
});
70+
it('should filter user messages', () => {
71+
expect(
72+
isVoiceMessage(mockUserMessage),
73+
).toBeFalse();
74+
expect(
75+
isVoiceMessage({
76+
...mockUserMessage,
77+
type: undefined,
78+
name: undefined,
79+
file: undefined,
80+
} as unknown as UserMessage),
81+
).toBeFalse();
82+
});
83+
it('should filter the other file messages', () => {
84+
expect(
85+
isVoiceMessage({
86+
...mockVoiceMessage,
87+
type: 'audio/mp3',
88+
metaArrays: [],
89+
} as unknown as FileMessage),
90+
).toBeFalse();
91+
expect(
92+
isVoiceMessage({
93+
...mockVoiceMessage,
94+
type: 'audio/ogg',
95+
metaArrays: [],
96+
} as unknown as FileMessage),
97+
).toBeFalse();
98+
expect(
99+
isVoiceMessage({
100+
...mockVoiceMessage,
101+
type: 'audio/webm',
102+
metaArrays: [],
103+
} as unknown as FileMessage),
104+
).toBeFalse();
105+
106+
expect(
107+
isVoiceMessage({
108+
...mockVoiceMessage,
109+
type: 'video/mp4',
110+
} as unknown as FileMessage),
111+
).toBeFalse();
112+
expect(
113+
isVoiceMessage({
114+
...mockVoiceMessage,
115+
type: 'video/ogg',
116+
} as unknown as FileMessage),
117+
).toBeFalse();
118+
expect(
119+
isVoiceMessage({
120+
...mockVoiceMessage,
121+
type: 'video/webm',
122+
} as unknown as FileMessage),
123+
).toBeFalse();
124+
125+
expect(
126+
isVoiceMessage({
127+
...mockVoiceMessage,
128+
type: 'application/ogg',
129+
} as unknown as FileMessage),
130+
).toBeFalse();
131+
});
132+
});

src/utils/index.ts

+9-7
Original file line numberDiff line numberDiff line change
@@ -163,23 +163,25 @@ export const isGifMessage = (message: UserMessage | FileMessage): boolean => (
163163
);
164164
export const isAudioMessage = (message: FileMessage): boolean => message && isFileMessage(message) && isAudio(message.type);
165165
export const isAudioMessageMimeType = (type: string): boolean => (/^audio\//.test(type));
166+
export const isVoiceMessageMimeType = (type: string): boolean => (/^voice\//.test(type));
166167
export const isVoiceMessage = (message: Nullable<FileMessage | UserMessage>): boolean => {
167168
// ex) audio/m4a OR audio/m4a;sbu_type=voice
168-
if (!(message && isFileMessage(message))) {
169+
if (!(message && isFileMessage(message)) || !(message as FileMessage).type) {
169170
return false;
170171
}
171-
const [mimeType, typeParameter] = message.type.split(';');
172-
if (!isAudioMessageMimeType(mimeType) || !typeParameter) {
172+
const [mimeType, typeParameter] = (message as FileMessage).type.split(';');
173+
174+
if (!isAudioMessageMimeType(mimeType)) {
173175
return false;
174176
}
175-
const [key, value] = typeParameter.split('=');
176-
if (key === 'sbu_type' && value === 'voice') {
177-
return true;
177+
178+
if (typeParameter) {
179+
const [key, value] = typeParameter.split('=');
180+
return key === 'sbu_type' && value === 'voice';
178181
}
179182
// ex) message.metaArrays = [{ key: 'KEY_INTERNAL_MESSAGE_TYPE', value: ['voice/m4a'] }]
180183
return isVoiceMessageMimeType(message?.metaArrays?.find((metaArray) => metaArray.key === 'KEY_INTERNAL_MESSAGE_TYPE')?.value?.[0] ?? '');
181184
};
182-
export const isVoiceMessageMimeType = (type: string): boolean => (/^voice\//.test(type));
183185

184186
export const isEditedMessage = (message: AdminMessage | UserMessage | FileMessage): boolean => isUserMessage(message) && (message?.updatedAt > 0);
185187
export const isEnabledOGMessage = (message: UserMessage): boolean => (

0 commit comments

Comments
 (0)