feat: add conversation image previews and sharing

This commit is contained in:
jjbrunton committed 2026-08-09 22:28:41 +01:00
1 parent 488145340d
commit b573b88b08
20 files changed
+634 -26

No files matched your search

+48
View File
@@ -81,6 +81,54 @@ describe('MediaLibraryExchangeService', () => {
expect(chat.sendChatImage).toHaveBeenCalledOnce();
db.close();
});
it('lists eligible choices and sends only the operator-selected matching asset', async () => {
const db = createTestDb();
const repository = new MediaLibraryRepository(db);
await addAsset(repository, directory, 'selfie-one', ['selfie'], 'sfw', 1);
await addAsset(repository, directory, 'selfie-two', ['selfie'], 'sfw', 2);
await addAsset(repository, directory, 'topless', ['topless'], 'nsfw', 3);
const chat = {
sendChatImage: vi.fn().mockResolvedValue({ eventId: '$selected', mxcUri: 'mxc://selected' }),
sendChatMessage: vi.fn().mockResolvedValue(true),
};
const service = new MediaLibraryExchangeService(repository, chat, logger(), 'account', directory);
expect(service.listShareable('room', 'send a selfie').assets.map((asset) => asset.id)).toEqual([
'selfie-two', 'selfie-one',
]);
expect(await service.handleSelected('room', '$request', 'send a selfie', 'topless')).toMatchObject({
kind: 'human-required',
});
expect(await service.handleSelected('room', '$request', 'send a selfie', 'selfie-one')).toMatchObject({
kind: 'sent', assetId: 'selfie-one', requestKind: 'selfie',
});
expect(chat.sendChatImage).toHaveBeenCalledWith(
'room', expect.objectContaining({ fileName: 'selfie-one.jpg' }), expect.any(String), null,
);
db.close();
});
it('keeps an image-only partial delivery human-required on later attempts', async () => {
const db = createTestDb();
const repository = new MediaLibraryRepository(db);
await addAsset(repository, directory, 'selfie', ['selfie'], 'sfw', 1);
const chat = {
sendChatImage: vi.fn().mockResolvedValue({ eventId: '$image', mxcUri: 'mxc://image' }),
sendChatMessage: vi.fn().mockResolvedValue(false),
};
const service = new MediaLibraryExchangeService(repository, chat, logger(), 'account', directory);
await expect(service.handleSelected('room', '$request', 'send a selfie', 'selfie')).resolves.toMatchObject({
kind: 'human-required', remoteSent: true,
});
await expect(service.handleSelected('room', '$request', 'send a selfie', 'selfie')).resolves.toMatchObject({
kind: 'human-required', remoteSent: true,
});
expect(chat.sendChatImage).toHaveBeenCalledOnce();
expect(chat.sendChatMessage).toHaveBeenCalledOnce();
db.close();
});
});
async function addAsset(