import { sanitizedRaw } from '@nozbe/watermelondb/RawRecord'; import database from '../database'; import { getMessageById } from '../database/services/Message'; import { getThreadById } from '../database/services/Thread'; import log from '../../utils/log'; import { Encryption } from '../encryption'; import getSingleMessage from './getSingleMessage'; import { IMessage, IThread, TThreadModel } from '../../definitions'; const buildThreadName = (thread: IThread | IMessage): string | undefined => thread.msg || thread?.attachments?.[0]?.title; const getThreadName = async (rid: string, tmid: string, messageId: string): Promise => { let tmsg: string | undefined; try { const db = database.active; const threadCollection = db.get('threads'); const messageRecord = await getMessageById(messageId); const threadRecord = await getThreadById(tmid); if (threadRecord) { tmsg = buildThreadName(threadRecord); await db.write(async () => { await messageRecord?.update(m => { m.tmsg = tmsg; }); }); } else { let thread = await getSingleMessage(tmid); thread = await Encryption.decryptMessage(thread); tmsg = buildThreadName(thread); await db.write(async () => { await db.batch( threadCollection?.prepareCreate((t: TThreadModel) => { t._raw = sanitizedRaw({ id: thread._id }, threadCollection.schema); if (t.subscription) t.subscription.id = rid; Object.assign(t, thread); }), messageRecord?.prepareUpdate(m => { m.tmsg = tmsg; }) ); }); } } catch (e) { log(e); } return tmsg; }; export default getThreadName;