|
|
|
import matrix from 'matrix-js-sdk';
|
|
|
|
import {NotificationHandler} from '@/lib/NotificationHandler';
|
|
|
|
|
|
|
|
export class MatrixHandler {
|
|
|
|
constructor(clientDisplayName = 'matrix-chat') {
|
|
|
|
this.clientDisplayName = clientDisplayName;
|
|
|
|
this.accessToken;
|
|
|
|
this.client = undefined;
|
|
|
|
this.rooms = [];
|
|
|
|
this.loading = undefined;
|
|
|
|
this.user = undefined;
|
|
|
|
this.baseUrl = undefined;
|
|
|
|
this.notify = new NotificationHandler();
|
|
|
|
}
|
|
|
|
login(user, password, baseUrl, onError, callback = ()=>{}){
|
|
|
|
if (this.client){ console.log('there is already an active session'); return; }
|
|
|
|
this.client = new matrix.createClient({
|
|
|
|
baseUrl: baseUrl,
|
|
|
|
store: new matrix.MemoryStore(window.localStorage)
|
|
|
|
});
|
|
|
|
this.client.login('m.login.password', {
|
|
|
|
user: user,
|
|
|
|
password: password,
|
|
|
|
initial_device_display_name: this.clientDisplayName,
|
|
|
|
}).then((response) => {
|
|
|
|
if (response.error) {
|
|
|
|
this.logout();
|
|
|
|
console.log(`login error => ${response.error}`);
|
|
|
|
onError(response.error);
|
|
|
|
}
|
|
|
|
if (response.access_token){
|
|
|
|
console.log(`access token => ${response.access_token}`);
|
|
|
|
callback(response.access_token);
|
|
|
|
this.user = user;
|
|
|
|
this.baseUrl = baseUrl;
|
|
|
|
this.accessToken = response.access_token;
|
|
|
|
this.startSync()
|
|
|
|
}
|
|
|
|
}).catch(error => {
|
|
|
|
this.logout();
|
|
|
|
console.log(error);
|
|
|
|
onError(error.toString());
|
|
|
|
})
|
|
|
|
}
|
|
|
|
tokenLogin(baseUrl, accessToken, userId){
|
|
|
|
if (this.client){ console.log('there is already an active session'); return; }
|
|
|
|
this.client = new matrix.createClient({
|
|
|
|
baseUrl,
|
|
|
|
accessToken,
|
|
|
|
userId,
|
|
|
|
store: new matrix.MemoryStore(window.localStorage)
|
|
|
|
});
|
|
|
|
this.user = userId;
|
|
|
|
this.baseUrl = baseUrl;
|
|
|
|
this.accessToken = accessToken;
|
|
|
|
this.startSync();
|
|
|
|
}
|
|
|
|
async logout(){
|
|
|
|
await this.client.stopClient();
|
|
|
|
this.client = undefined;
|
|
|
|
}
|
|
|
|
async startSync(callback = ()=>{}){
|
|
|
|
this.loading = true;
|
|
|
|
await this.client.startClient();
|
|
|
|
this.client.once('sync', (state) => {
|
|
|
|
console.log(state);
|
|
|
|
this.rooms = this.client.getRooms();
|
|
|
|
this.loading = false;
|
|
|
|
callback();
|
|
|
|
this.listenToPushEvents();
|
|
|
|
});
|
|
|
|
}
|
|
|
|
listenToPushEvents(){
|
|
|
|
this.client.on('event', event => {
|
|
|
|
if (this.client.getPushActionsForEvent(event).notify){
|
|
|
|
this.notify.showNotification(event.event);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
async sendEvent({content, type}, roomId){
|
|
|
|
return await this.client.sendEvent(roomId, type, content)
|
|
|
|
.then(() => console.log('message sent successfully'))
|
|
|
|
.catch((err) => console.log(`error while sending message => ${err}`));
|
|
|
|
}
|
|
|
|
}
|