Rocket.Chat.ReactNative/app/lib/methods/subscriptions/rooms.js

71 lines
1.7 KiB
JavaScript

import database from '../../realm';
import { merge } from '../helpers/mergeSubscriptionsRooms';
import protectedFunction from '../helpers/protectedFunction';
import log from '../../../utils/log';
export default async function subscribeRooms(id) {
const subscriptions = Promise.all([
this.ddp.subscribe('stream-notify-user', `${ id }/subscriptions-changed`, false),
this.ddp.subscribe('stream-notify-user', `${ id }/rooms-changed`, false),
this.ddp.subscribe('stream-notify-user', `${ id }/message`, false)
]);
let timer = null;
const loop = (time = new Date()) => {
if (timer) {
return;
}
timer = setTimeout(async() => {
try {
await this.getRooms(time);
timer = false;
loop();
} catch (e) {
loop(time);
}
}, 5000);
};
if (this.ddp) {
this.ddp.on('logged', () => {
clearTimeout(timer);
timer = false;
});
this.ddp.on('logout', () => {
clearTimeout(timer);
timer = true;
});
this.ddp.on('disconnected', () => {
if (this._login) {
loop();
}
});
this.ddp.on('stream-notify-user', protectedFunction((ddpMessage) => {
const [type, data] = ddpMessage.fields.args;
const [, ev] = ddpMessage.fields.eventName.split('/');
if (/subscriptions/.test(ev)) {
const tpm = merge(data);
return database.write(() => {
database.create('subscriptions', tpm, true);
});
}
if (/rooms/.test(ev) && type === 'updated') {
const [sub] = database.objects('subscriptions').filtered('rid == $0', data._id);
database.write(() => {
merge(sub, data);
});
}
}));
}
try {
await subscriptions;
} catch (e) {
log('subscribeRooms', e);
}
// console.log(this.ddp.subscriptions);
}