diff --git a/src/InvalidUrlView.js b/src/InvalidUrlView.js new file mode 100644 index 0000000..e6a58e7 --- /dev/null +++ b/src/InvalidUrlView.js @@ -0,0 +1,29 @@ +/* +Copyright 2021 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import {TemplateView} from "./utils/TemplateView.js"; + +export class InvalidUrlView extends TemplateView { + render(t) { + return t.div({ className: "DisclaimerView card" }, [ + t.h1("Invalid URL"), + t.p([ + 'The link you have entered is not valid. If you like, you can ', + t.a({ href: "#/" }, 'return to the home page.') + ]), + ]); + } +} diff --git a/src/RootView.js b/src/RootView.js index 5669f36..218ad57 100644 --- a/src/RootView.js +++ b/src/RootView.js @@ -19,10 +19,12 @@ import {OpenLinkView} from "./open/OpenLinkView.js"; import {CreateLinkView} from "./create/CreateLinkView.js"; import {LoadServerPolicyView} from "./policy/LoadServerPolicyView.js"; import {DisclaimerView} from "./disclaimer/DisclaimerView.js"; +import {InvalidUrlView} from "./InvalidUrlView.js"; export class RootView extends TemplateView { render(t, vm) { return t.div({className: "RootView"}, [ + t.mapView(vm => vm.invalidUrl, invalid => invalid ? new InvalidUrlView() : null), t.mapView(vm => vm.showDisclaimer, disclaimer => disclaimer ? new DisclaimerView() : null), t.mapView(vm => vm.openLinkViewModel, vm => vm ? new OpenLinkView(vm) : null), t.mapView(vm => vm.createLinkViewModel, vm => vm ? new CreateLinkView(vm) : null), diff --git a/src/RootViewModel.js b/src/RootViewModel.js index 2cc1070..b9cde3f 100644 --- a/src/RootViewModel.js +++ b/src/RootViewModel.js @@ -30,6 +30,7 @@ export class RootViewModel extends ViewModel { this.createLinkViewModel = null; this.loadServerPolicyViewModel = null; this.showDisclaimer = false; + this.invalidUrl = false; this.preferences.on("canClear", () => { this.emitChange(); }); @@ -58,6 +59,7 @@ export class RootViewModel extends ViewModel { // clear them to avoid having to manually reset (n-1)/n view models in every case. // That just doesn't scale well when we add new views. const oldLink = this.link; + this.invalidUrl = false; this.showDisclaimer = false; this.loadServerPolicyViewModel = null; this.createLinkViewModel = null; @@ -75,6 +77,9 @@ export class RootViewModel extends ViewModel { this.createLinkViewModel = new CreateLinkViewModel(this.childOptions()); } else if (newLink = Link.parse(hash)) { this._updateChildVMs(newLink, oldLink); + } else { + this._updateChildVMs(null, oldLink); + this.invalidUrl = true; } this.emitChange(); }