fix: render inline support images
Deploy olons-server production / deploy (push) Successful in 4m1s

This commit is contained in:
Your Name
2026-10-19 18:06:00 +08:00
parent db18514e6d
commit db1367b8fe
2 changed files with 43 additions and 1 deletions
+38
View File
@@ -265,4 +265,42 @@ describe('customer service media upload', () => {
'https://cdn.example.com/public/image.png',
);
});
it('renders inline Drafty images sent by the IM web client', () => {
const onMessages = vi.fn();
new CustomerServiceChat(session(), onMessages, { origin: 'https://www.yuexuan1.shop' });
const tinode = mocks.instances[0];
tinode.topic.messages.mockImplementation((callback: (message: unknown) => void) => {
callback({
seq: 4,
from: 'usr_support',
ts: '2026-10-19T10:02:32.090Z',
content: {
ent: [{
tp: 'IM',
data: {
val: 'aGVsbG8=',
mime: 'image/png',
name: 'proof.png',
width: 70,
height: 70,
},
}],
fmt: [{ len: 1 }],
txt: ' ',
},
});
});
tinode.topic.onData?.();
expect(onMessages).toHaveBeenCalledWith([
expect.objectContaining({
seq: 4,
type: 'image',
media_url: 'data:image/png;base64,aGVsbG8=',
file_name: 'proof.png',
}),
]);
});
});
+5 -1
View File
@@ -349,10 +349,14 @@ function messageContent(content: unknown, mediaURL: (ref?: string) => string) {
const media = drafty.ent?.find((entity) => entity?.tp === 'IM' || entity?.tp === 'VD');
if (media?.data) {
const type = media.tp === 'VD' ? 'video' : 'image';
const inline = typeof media.data.val === 'string' ? media.data.val : '';
const mime = typeof media.data.mime === 'string' && media.data.mime.startsWith(`${type}/`)
? media.data.mime
: type === 'video' ? 'video/webm' : 'image/jpeg';
return {
text: '',
type,
media_url: mediaURL(String(media.data.ref || '')),
media_url: inline ? `data:${mime};base64,${inline}` : mediaURL(String(media.data.ref || '')),
preview_url: mediaURL(String(media.data.preref || '')),
file_name: String(media.data.name || ''),
} as const;