From bfcac9fafb3c145b60fdf06378d879cd2349524b Mon Sep 17 00:00:00 2001 From: Danila Fedorin Date: Mon, 23 Aug 2021 14:38:07 -0700 Subject: [PATCH] Try open matrix: links before showing clients --- src/Link.js | 21 +++++++++++++++++++++ src/RootView.js | 28 +++++++++++++++------------- src/RootViewModel.js | 10 ++++++++++ 3 files changed, 46 insertions(+), 13 deletions(-) diff --git a/src/Link.js b/src/Link.js index 079d7be..a37cfc8 100644 --- a/src/Link.js +++ b/src/Link.js @@ -40,6 +40,16 @@ function asPrefix(identifierKind) { } } +function asPath(identifierKind) { + switch (identifierKind) { + case IdentifierKind.RoomId: return "roomid"; + case IdentifierKind.RoomAlias: return "r"; + case IdentifierKind.GroupId: return null; + case IdentifierKind.UserId: return "u"; + default: throw new Error("invalid id kind " + identifierKind); + } +} + function getWebInstanceMap(queryParams) { const prefix = "web-instance["; const postfix = "]"; @@ -183,4 +193,15 @@ export class Link { return `/${this.identifier}`; } } + + toMatrixUrl() { + const prefix = asPath(this.identifierKind); + if (!prefix) { + // Some matrix.to links aren't valid matrix: links (i.e. groups) + return null; + } + const identifier = this.identifier.substring(1); + const suffix = this.eventId ? `/e/${this.eventId.substring(1)}` : ""; + return `matrix:${prefix}/${identifier}${suffix}`; + } } diff --git a/src/RootView.js b/src/RootView.js index 315fbd9..c076ac7 100644 --- a/src/RootView.js +++ b/src/RootView.js @@ -21,21 +21,23 @@ import {LoadServerPolicyView} from "./policy/LoadServerPolicyView.js"; export class RootView extends TemplateView { render(t, vm) { - return t.div({className: "RootView"}, [ - t.mapView(vm => vm.openLinkViewModel, vm => vm ? new OpenLinkView(vm) : null), - t.mapView(vm => vm.createLinkViewModel, vm => vm ? new CreateLinkView(vm) : null), - t.mapView(vm => vm.loadServerPolicyViewModel, vm => vm ? new LoadServerPolicyView(vm) : null), - t.div({className: "footer"}, [ - t.p(t.img({src: "images/matrix-logo.svg"})), - t.p(["This invite uses ", externalLink(t, "https://matrix.org", "Matrix"), ", an open network for secure, decentralized communication."]), - t.ul({className: "links"}, [ - t.li(externalLink(t, "https://github.com/matrix-org/matrix.to", "GitHub project")), - t.li(externalLink(t, "https://github.com/matrix-org/matrix.to/tree/main/src/open/clients", "Add your app")), - t.li({className: {hidden: vm => !vm.hasPreferences}}, - t.button({className: "text", onClick: () => vm.clearPreferences()}, "Clear preferences")), + return t.if(vm => !vm.hidden, + vm => t.div({className: "RootView"}, [ + t.mapView(vm => vm.openLinkViewModel, vm => vm ? new OpenLinkView(vm) : null), + t.mapView(vm => vm.createLinkViewModel, vm => vm ? new CreateLinkView(vm) : null), + t.mapView(vm => vm.loadServerPolicyViewModel, vm => vm ? new LoadServerPolicyView(vm) : null), + t.div({className: "footer"}, [ + t.p(t.img({src: "images/matrix-logo.svg"})), + t.p(["This invite uses ", externalLink(t, "https://matrix.org", "Matrix"), ", an open network for secure, decentralized communication."]), + t.ul({className: "links"}, [ + t.li(externalLink(t, "https://github.com/matrix-org/matrix.to", "GitHub project")), + t.li(externalLink(t, "https://github.com/matrix-org/matrix.to/tree/main/src/open/clients", "Add your app")), + t.li({className: {hidden: vm => !vm.hasPreferences}}, + t.button({className: "text", onClick: () => vm.clearPreferences()}, "Clear preferences")), + ]) ]) ]) - ]); + ); } } diff --git a/src/RootViewModel.js b/src/RootViewModel.js index 6c05cc9..c725c91 100644 --- a/src/RootViewModel.js +++ b/src/RootViewModel.js @@ -25,6 +25,7 @@ import {Platform} from "./Platform.js"; export class RootViewModel extends ViewModel { constructor(options) { super(options); + this.hidden = false; this.link = null; this.openLinkViewModel = null; this.createLinkViewModel = null; @@ -58,6 +59,15 @@ export class RootViewModel extends ViewModel { } else { const oldLink = this.link; this.link = Link.parse(hash); + const matrixUrl = this.link.toMatrixUrl() + if (matrixUrl) { + this.hidden = true; + setTimeout(() => { + this.hidden = false; + this.emitChange(); + }, 1000); + this.openLink(this.link.toMatrixUrl()); + } this._updateChildVMs(oldLink); } }