forked from mystiq/hydrogen-web
make SessionLoadViewModel transfer ownership of container with callback
also, deleting the session when navigating away is now done by LoginViewModel
This commit is contained in:
parent
4ae622bdd3
commit
35b83b7976
2 changed files with 42 additions and 43 deletions
|
@ -20,10 +20,11 @@ import {SessionLoadViewModel} from "./SessionLoadViewModel.js";
|
||||||
export class LoginViewModel extends ViewModel {
|
export class LoginViewModel extends ViewModel {
|
||||||
constructor(options) {
|
constructor(options) {
|
||||||
super(options);
|
super(options);
|
||||||
const {sessionCallback, defaultHomeServer, createSessionContainer} = options;
|
const {ready, defaultHomeServer, createSessionContainer} = options;
|
||||||
this._createSessionContainer = createSessionContainer;
|
this._createSessionContainer = createSessionContainer;
|
||||||
this._sessionCallback = sessionCallback;
|
this._ready = ready;
|
||||||
this._defaultHomeServer = defaultHomeServer;
|
this._defaultHomeServer = defaultHomeServer;
|
||||||
|
this._sessionContainer = null;
|
||||||
this._loadViewModel = null;
|
this._loadViewModel = null;
|
||||||
this._loadViewModelSubscription = null;
|
this._loadViewModelSubscription = null;
|
||||||
}
|
}
|
||||||
|
@ -45,25 +46,19 @@ export class LoginViewModel extends ViewModel {
|
||||||
if (this._loadViewModel) {
|
if (this._loadViewModel) {
|
||||||
this._loadViewModel.cancel();
|
this._loadViewModel.cancel();
|
||||||
}
|
}
|
||||||
this._loadViewModel = new SessionLoadViewModel({
|
this._loadViewModel = this.track(new SessionLoadViewModel({
|
||||||
createAndStartSessionContainer: () => {
|
createAndStartSessionContainer: () => {
|
||||||
const sessionContainer = this._createSessionContainer();
|
this._sessionContainer = this._createSessionContainer();
|
||||||
sessionContainer.startWithLogin(homeserver, username, password);
|
this._sessionContainer.startWithLogin(homeserver, username, password);
|
||||||
return sessionContainer;
|
return this._sessionContainer;
|
||||||
},
|
},
|
||||||
sessionCallback: sessionContainer => {
|
ready: sessionContainer => {
|
||||||
if (sessionContainer) {
|
// make sure we don't delete the session in dispose when navigating away
|
||||||
// make parent view model move away
|
this._sessionContainer = null;
|
||||||
this._sessionCallback(sessionContainer);
|
this._ready(sessionContainer);
|
||||||
} else {
|
|
||||||
// show list of session again
|
|
||||||
this._loadViewModel = null;
|
|
||||||
this.emitChange("loadViewModel");
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
deleteSessionOnCancel: true,
|
|
||||||
homeserver,
|
homeserver,
|
||||||
});
|
}));
|
||||||
this._loadViewModel.start();
|
this._loadViewModel.start();
|
||||||
this.emitChange("loadViewModel");
|
this.emitChange("loadViewModel");
|
||||||
this._loadViewModelSubscription = this.track(this._loadViewModel.disposableOn("change", () => {
|
this._loadViewModelSubscription = this.track(this._loadViewModel.disposableOn("change", () => {
|
||||||
|
@ -74,9 +69,16 @@ export class LoginViewModel extends ViewModel {
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
cancel() {
|
get cancelUrl() {
|
||||||
if (!this.isBusy) {
|
return this.urlRouter.urlForSegment("session");
|
||||||
this._sessionCallback();
|
}
|
||||||
|
|
||||||
|
dispose() {
|
||||||
|
super.dispose();
|
||||||
|
if (this._sessionContainer) {
|
||||||
|
// if we move away before we're done with initial sync
|
||||||
|
// delete the session
|
||||||
|
this._sessionContainer.deleteSession();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,9 +21,9 @@ import {ViewModel} from "./ViewModel.js";
|
||||||
export class SessionLoadViewModel extends ViewModel {
|
export class SessionLoadViewModel extends ViewModel {
|
||||||
constructor(options) {
|
constructor(options) {
|
||||||
super(options);
|
super(options);
|
||||||
const {createAndStartSessionContainer, sessionCallback, homeserver, deleteSessionOnCancel} = options;
|
const {createAndStartSessionContainer, ready, homeserver, deleteSessionOnCancel} = options;
|
||||||
this._createAndStartSessionContainer = createAndStartSessionContainer;
|
this._createAndStartSessionContainer = createAndStartSessionContainer;
|
||||||
this._sessionCallback = sessionCallback;
|
this._ready = ready;
|
||||||
this._homeserver = homeserver;
|
this._homeserver = homeserver;
|
||||||
this._deleteSessionOnCancel = deleteSessionOnCancel;
|
this._deleteSessionOnCancel = deleteSessionOnCancel;
|
||||||
this._loading = false;
|
this._loading = false;
|
||||||
|
@ -60,11 +60,17 @@ export class SessionLoadViewModel extends ViewModel {
|
||||||
|
|
||||||
// did it finish or get stuck at LoginFailed or Error?
|
// did it finish or get stuck at LoginFailed or Error?
|
||||||
const loadStatus = this._sessionContainer.loadStatus.get();
|
const loadStatus = this._sessionContainer.loadStatus.get();
|
||||||
|
const loadError = this._sessionContainer.loadError;
|
||||||
if (loadStatus === LoadStatus.FirstSync || loadStatus === LoadStatus.Ready) {
|
if (loadStatus === LoadStatus.FirstSync || loadStatus === LoadStatus.Ready) {
|
||||||
this._sessionCallback(this._sessionContainer);
|
const sessionContainer = this._sessionContainer;
|
||||||
|
// session container is ready,
|
||||||
|
// don't dispose it anymore when
|
||||||
|
// we get disposed
|
||||||
|
this._sessionContainer = null;
|
||||||
|
this._ready(sessionContainer);
|
||||||
}
|
}
|
||||||
if (this._sessionContainer.loadError) {
|
if (loadError) {
|
||||||
console.error("session load error", this._sessionContainer.loadError);
|
console.error("session load error", loadError);
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
this._error = err;
|
this._error = err;
|
||||||
|
@ -77,24 +83,15 @@ export class SessionLoadViewModel extends ViewModel {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
async cancel() {
|
dispose() {
|
||||||
try {
|
if (this._sessionContainer) {
|
||||||
if (this._sessionContainer) {
|
this._sessionContainer.dispose();
|
||||||
this._sessionContainer.dispose();
|
this._sessionContainer = null;
|
||||||
if (this._deleteSessionOnCancel) {
|
}
|
||||||
await this._sessionContainer.deleteSession();
|
if (this._waitHandle) {
|
||||||
}
|
// rejects with AbortError
|
||||||
this._sessionContainer = null;
|
this._waitHandle.dispose();
|
||||||
}
|
this._waitHandle = null;
|
||||||
if (this._waitHandle) {
|
|
||||||
// rejects with AbortError
|
|
||||||
this._waitHandle.dispose();
|
|
||||||
this._waitHandle = null;
|
|
||||||
}
|
|
||||||
this._sessionCallback();
|
|
||||||
} catch (err) {
|
|
||||||
this._error = err;
|
|
||||||
this.emitChange();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue