Skip to content

Commit

Permalink
Translations: reset cache on message edit & deletion
Browse files Browse the repository at this point in the history
  • Loading branch information
morethanwords committed Apr 16, 2024
1 parent 30e2c51 commit ff4baee
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 0 deletions.
10 changes: 10 additions & 0 deletions src/lib/appManagers/appMessagesManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7872,6 +7872,8 @@ export class AppMessagesManager extends AppManager {
removedResults: reactions.results
});
}

this.appTranslationsManager.resetMessageTranslations(message.peerId, message.mid);
}

this.deleteMessageFromStorage(storage, mid);
Expand Down Expand Up @@ -7902,6 +7904,14 @@ export class AppMessagesManager extends AppManager {
if(groupedId) {
this.dispatchGroupedEdit(groupedId, storage, []);
}

const isTranslated = this.appTranslationsManager.hasTriedToTranslateMessage(oldMessage.peerId, oldMessage.mid);
if(isTranslated && (
oldMessage.message !== (newMessage as Message.message).message ||
!deepEqual(oldMessage.entities, (newMessage as Message.message).entities)
)) {
this.appTranslationsManager.resetMessageTranslations(oldMessage.peerId, oldMessage.mid);
}
}
}

Expand Down
38 changes: 38 additions & 0 deletions src/lib/appManagers/appTranslationsManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ import {TextWithEntities, MessagesTranslatedText} from '../../layer';
import {AppManager} from './manager';
import getServerMessageId from './utils/messageId/getServerMessageId';

// ! possible race-condition if message was edited while translation is in progress

export default class AppTranslationsManager extends AppManager {
private translateTextBatch: {
[lang: string]: {
Expand All @@ -19,6 +21,35 @@ export default class AppTranslationsManager extends AppManager {
messagesPromises: Map<PeerId, Promise<any>>
}
} = {};
private triedToTranslateMessages: Map<`${PeerId}_${number}`, Set<string>> = new Map();

public hasTriedToTranslateMessage(peerId: PeerId, mid: number) {
return this.triedToTranslateMessages.has(`${peerId}_${mid}`);
}

public resetMessageTranslations(peerId: PeerId, mid: number) {
const key = `${peerId}_${mid}` as const;
const languages = this.triedToTranslateMessages.get(key);
if(!languages) {
return;
}

for(const lang of languages) {
const batch = this.translateTextBatch[lang];
if(!batch) {
continue;
}

const map = batch.messages.get(peerId);
if(!map) {
continue;
}

map.delete(mid);
}

this.triedToTranslateMessages.delete(key);
}

private processTextWithEntities = (textWithEntities: TextWithEntities) => {
this.appMessagesManager.wrapMessageEntities(textWithEntities);
Expand Down Expand Up @@ -94,6 +125,13 @@ export default class AppTranslationsManager extends AppManager {
promise = deferredPromise<TextWithEntities>();
map.set(options.mid, promise);

const key = `${options.peerId}_${options.mid}` as const;
let tried = this.triedToTranslateMessages.get(key);
if(!tried) {
this.triedToTranslateMessages.set(key, tried = new Set());
}
tried.add(options.lang);

this.batchMessageTranslation(options.lang, options.peerId);

return promise;
Expand Down

0 comments on commit ff4baee

Please sign in to comment.