2020-05-05 23:16:51 +02:00
|
|
|
import {ViewModel} from "../ViewModel.js";
|
|
|
|
import {createEnum} from "../../utils/enum.js";
|
|
|
|
import {ConnectionStatus} from "../../matrix/net/Reconnector.js";
|
|
|
|
import {SyncStatus} from "../../matrix/Sync.js";
|
|
|
|
|
|
|
|
const SessionStatus = createEnum(
|
|
|
|
"Disconnected",
|
|
|
|
"Connecting",
|
|
|
|
"FirstSync",
|
|
|
|
"Sending",
|
2020-05-07 00:05:21 +02:00
|
|
|
"Syncing",
|
|
|
|
"SyncError"
|
2020-05-05 23:16:51 +02:00
|
|
|
);
|
|
|
|
|
|
|
|
export class SessionStatusViewModel extends ViewModel {
|
|
|
|
constructor(options) {
|
|
|
|
super(options);
|
2020-05-07 00:05:21 +02:00
|
|
|
const {sync, reconnector} = options;
|
|
|
|
this._sync = sync;
|
2020-05-05 23:16:51 +02:00
|
|
|
this._reconnector = reconnector;
|
2020-05-07 00:05:21 +02:00
|
|
|
this._status = this._calculateState(reconnector.connectionStatus.get(), sync.status.get());
|
2020-05-05 23:16:51 +02:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
start() {
|
|
|
|
const update = () => this._updateStatus();
|
2020-05-07 00:05:21 +02:00
|
|
|
this.track(this._sync.status.subscribe(update));
|
2020-05-05 23:16:51 +02:00
|
|
|
this.track(this._reconnector.connectionStatus.subscribe(update));
|
|
|
|
}
|
|
|
|
|
|
|
|
get isShown() {
|
|
|
|
return this._status !== SessionStatus.Syncing;
|
|
|
|
}
|
|
|
|
|
|
|
|
get statusLabel() {
|
|
|
|
switch (this._status) {
|
|
|
|
case SessionStatus.Disconnected:{
|
|
|
|
const retryIn = Math.round(this._reconnector.retryIn / 1000);
|
|
|
|
return this.i18n`Disconnected, trying to reconnect in ${retryIn}s…`;
|
|
|
|
}
|
|
|
|
case SessionStatus.Connecting:
|
|
|
|
return this.i18n`Trying to reconnect now…`;
|
|
|
|
case SessionStatus.FirstSync:
|
|
|
|
return this.i18n`Catching up with your conversations…`;
|
2020-05-07 00:05:21 +02:00
|
|
|
case SessionStatus.SyncError:
|
|
|
|
return this.i18n`Sync failed because of ${this._sync.error}`;
|
2020-05-05 23:16:51 +02:00
|
|
|
}
|
|
|
|
return "";
|
|
|
|
}
|
|
|
|
|
|
|
|
get isWaiting() {
|
|
|
|
switch (this._status) {
|
|
|
|
case SessionStatus.Connecting:
|
|
|
|
case SessionStatus.FirstSync:
|
|
|
|
return true;
|
|
|
|
default:
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
_updateStatus() {
|
|
|
|
const newStatus = this._calculateState(
|
|
|
|
this._reconnector.connectionStatus.get(),
|
2020-05-07 00:05:21 +02:00
|
|
|
this._sync.status.get()
|
2020-05-05 23:16:51 +02:00
|
|
|
);
|
|
|
|
if (newStatus !== this._status) {
|
|
|
|
if (newStatus === SessionStatus.Disconnected) {
|
|
|
|
this._retryTimer = this.track(this.clock.createInterval(() => {
|
|
|
|
this.emitChange("statusLabel");
|
|
|
|
}, 1000));
|
|
|
|
} else {
|
|
|
|
this._retryTimer = this.disposeTracked(this._retryTimer);
|
|
|
|
}
|
|
|
|
this._status = newStatus;
|
|
|
|
console.log("newStatus", newStatus);
|
|
|
|
this.emitChange();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
_calculateState(connectionStatus, syncStatus) {
|
|
|
|
if (connectionStatus !== ConnectionStatus.Online) {
|
|
|
|
switch (connectionStatus) {
|
|
|
|
case ConnectionStatus.Reconnecting:
|
|
|
|
return SessionStatus.Connecting;
|
|
|
|
case ConnectionStatus.Waiting:
|
|
|
|
return SessionStatus.Disconnected;
|
|
|
|
}
|
|
|
|
} else if (syncStatus !== SyncStatus.Syncing) {
|
|
|
|
switch (syncStatus) {
|
|
|
|
// InitialSync should be awaited in the SessionLoadViewModel,
|
|
|
|
// but include it here anyway
|
|
|
|
case SyncStatus.InitialSync:
|
|
|
|
case SyncStatus.CatchupSync:
|
|
|
|
return SessionStatus.FirstSync;
|
2020-05-07 00:05:21 +02:00
|
|
|
case SyncStatus.Stopped:
|
|
|
|
return SessionStatus.SyncError;
|
2020-05-05 23:16:51 +02:00
|
|
|
}
|
|
|
|
} /* else if (session.pendingMessageCount) {
|
|
|
|
return SessionStatus.Sending;
|
|
|
|
} */ else {
|
|
|
|
return SessionStatus.Syncing;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
get isConnectNowShown() {
|
|
|
|
return this._status === SessionStatus.Disconnected;
|
|
|
|
}
|
|
|
|
|
|
|
|
connectNow() {
|
|
|
|
if (this.isConnectNowShown) {
|
|
|
|
this._reconnector.tryNow();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|