80 lines
2.2 KiB
JavaScript
80 lines
2.2 KiB
JavaScript
import { InteractionManager } from 'react-native';
|
|
|
|
import buildMessage from './helpers/buildMessage';
|
|
import database from '../realm';
|
|
import log from '../../utils/log';
|
|
|
|
const getLastUpdate = (rid) => {
|
|
const sub = database
|
|
.objects('subscriptions')
|
|
.filtered('rid == $0', rid)[0];
|
|
return sub && new Date(sub.lastOpen).toISOString();
|
|
};
|
|
|
|
async function load({ rid: roomId, lastOpen }) {
|
|
let lastUpdate;
|
|
if (lastOpen) {
|
|
lastUpdate = new Date(lastOpen).toISOString();
|
|
} else {
|
|
lastUpdate = getLastUpdate(roomId);
|
|
}
|
|
// RC 0.60.0
|
|
const { result } = await this.sdk.get('chat.syncMessages', { roomId, lastUpdate });
|
|
return result;
|
|
}
|
|
|
|
export default function loadMissedMessages(...args) {
|
|
return new Promise(async(resolve, reject) => {
|
|
try {
|
|
const data = (await load.call(this, ...args));
|
|
|
|
if (data) {
|
|
if (data.updated && data.updated.length) {
|
|
const { updated } = data;
|
|
InteractionManager.runAfterInteractions(() => {
|
|
database.write(() => updated.forEach((message) => {
|
|
try {
|
|
message = buildMessage(message);
|
|
database.create('messages', message, true);
|
|
// if it's a thread "header"
|
|
if (message.tlm) {
|
|
database.create('threads', message, true);
|
|
}
|
|
if (message.tmid) {
|
|
message.rid = message.tmid;
|
|
database.create('threadMessages', message, true);
|
|
}
|
|
} catch (e) {
|
|
log('err_load_missed_messages_create', e);
|
|
}
|
|
}));
|
|
});
|
|
}
|
|
if (data.deleted && data.deleted.length) {
|
|
const { deleted } = data;
|
|
InteractionManager.runAfterInteractions(() => {
|
|
try {
|
|
database.write(() => {
|
|
deleted.forEach((m) => {
|
|
const message = database.objects('messages').filtered('_id = $0', m._id);
|
|
database.delete(message);
|
|
const thread = database.objects('threads').filtered('_id = $0', m._id);
|
|
database.delete(thread);
|
|
const threadMessage = database.objects('threadMessages').filtered('_id = $0', m._id);
|
|
database.delete(threadMessage);
|
|
});
|
|
});
|
|
} catch (e) {
|
|
log('err_load_missed_messages_delete', e);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
resolve();
|
|
} catch (e) {
|
|
log('err_load_missed_messages', e);
|
|
reject(e);
|
|
}
|
|
});
|
|
}
|