From cfbd0672c5329955f91b392c416c0d9758c73c8e Mon Sep 17 00:00:00 2001 From: RMidhunSuresh Date: Tue, 6 Sep 2022 15:42:41 +0530 Subject: [PATCH 01/13] Refactor left panel to use menu --- .../session/leftpanel/LeftPanelViewModel.js | 5 ++-- .../web/ui/session/leftpanel/LeftPanelView.js | 27 ++++++++++++++++++- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/domain/session/leftpanel/LeftPanelViewModel.js b/src/domain/session/leftpanel/LeftPanelViewModel.js index 8c8d71a2..fc783cfa 100644 --- a/src/domain/session/leftpanel/LeftPanelViewModel.js +++ b/src/domain/session/leftpanel/LeftPanelViewModel.js @@ -34,7 +34,6 @@ export class LeftPanelViewModel extends ViewModel { this._setupNavigation(); this._closeUrl = this.urlCreator.urlForSegment("session"); this._settingsUrl = this.urlCreator.urlForSegment("settings"); - this._createRoomUrl = this.urlCreator.urlForSegment("create-room"); } _mapTileViewModels(roomsBeingCreated, invites, rooms) { @@ -74,7 +73,9 @@ export class LeftPanelViewModel extends ViewModel { return this._settingsUrl; } - get createRoomUrl() { return this._createRoomUrl; } + showCreateRoomView() { + this.navigation.push("create-room"); + } _setupNavigation() { const roomObservable = this.navigation.observe("room"); diff --git a/src/platform/web/ui/session/leftpanel/LeftPanelView.js b/src/platform/web/ui/session/leftpanel/LeftPanelView.js index c79192be..ac0fbb81 100644 --- a/src/platform/web/ui/session/leftpanel/LeftPanelView.js +++ b/src/platform/web/ui/session/leftpanel/LeftPanelView.js @@ -17,6 +17,8 @@ limitations under the License. import {ListView} from "../../general/ListView"; import {TemplateView} from "../../general/TemplateView"; import {RoomTileView} from "./RoomTileView.js"; +import {Menu} from "../../general/Menu.js"; +import {Popup} from "../../general/Popup.js"; class FilterField extends TemplateView { render(t, options) { @@ -51,6 +53,11 @@ class FilterField extends TemplateView { } export class LeftPanelView extends TemplateView { + constructor(vm) { + super(vm); + this._createMenuPopup = null; + } + render(t, vm) { const gridButtonLabel = vm => { return vm.gridEnabled ? @@ -90,7 +97,11 @@ export class LeftPanelView extends TemplateView { "aria-label": gridButtonLabel }), t.a({className: "button-utility settings", href: vm.settingsUrl, "aria-label": vm.i18n`Settings`, title: vm.i18n`Settings`}), - t.a({className: "button-utility create", href: vm.createRoomUrl, "aria-label": vm.i18n`Create room`, title: vm.i18n`Create room`}), + t.button({ + className: "button-utility create", + "aria-label": vm.i18n`Create room`, + onClick: evt => this._toggleCreateMenu(evt) + }), ]); return t.div({className: "LeftPanel"}, [ @@ -98,4 +109,18 @@ export class LeftPanelView extends TemplateView { roomList ]); } + + _toggleCreateMenu(evt) { + if (this._createMenuPopup && this._createMenuPopup.isOpen) { + this._createMenuPopup.close(); + } else { + const vm = this.value; + const options = []; + options.push(Menu.option(vm.i18n`Create Room`, () => { vm.showCreateRoomView(); })) + options.push(Menu.option(vm.i18n`Join Room`, () => {})) + this._createMenuPopup = new Popup(new Menu(options)); + this._createMenuPopup.trackInTemplateView(this); + this._createMenuPopup.showRelativeTo(evt.target, 10); + } + } } From 413ba3279f6ad15621de48ae55ac8a0e2066f8f2 Mon Sep 17 00:00:00 2001 From: RMidhunSuresh Date: Mon, 12 Sep 2022 14:49:05 +0530 Subject: [PATCH 02/13] add "join-room" segment --- src/domain/navigation/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/domain/navigation/index.ts b/src/domain/navigation/index.ts index 849d870a..af3c35bd 100644 --- a/src/domain/navigation/index.ts +++ b/src/domain/navigation/index.ts @@ -51,7 +51,7 @@ function allowsChild(parent: Segment | undefined, child: Segment Date: Mon, 12 Sep 2022 17:08:09 +0530 Subject: [PATCH 03/13] Add vm/view --- src/domain/session/JoinRoomViewModel.ts | 63 +++++++++++++++++++++ src/platform/web/ui/session/JoinRoomView.ts | 63 +++++++++++++++++++++ 2 files changed, 126 insertions(+) create mode 100644 src/domain/session/JoinRoomViewModel.ts create mode 100644 src/platform/web/ui/session/JoinRoomView.ts diff --git a/src/domain/session/JoinRoomViewModel.ts b/src/domain/session/JoinRoomViewModel.ts new file mode 100644 index 00000000..a4be548b --- /dev/null +++ b/src/domain/session/JoinRoomViewModel.ts @@ -0,0 +1,63 @@ +/* +Copyright 2022 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 {ViewModel, Options as BaseOptions} from "../ViewModel"; +import {SegmentType} from "../navigation/index"; +import type {Session} from "../../matrix/Session.js"; +import {joinRoom} from "../../matrix/room/joinRoom"; + +type Options = BaseOptions & { + session: Session; +}; + +export class JoinRoomViewModel extends ViewModel { + private _session: Session; + private _joinInProgress: boolean = false; + private _error: Error | undefined; + + constructor(options: Readonly) { + super(options); + this._session = options.session; + } + + async join(roomId: string) { + this._error = undefined; + this._joinInProgress = true; + this.emitChange("joinInProgress"); + try { + const id = await joinRoom(roomId, this._session); + this.navigation.push("room", id); + } + catch (e) { + this._error = e; + this._joinInProgress = false; + this.emitChange("error"); + } + } + + get joinInProgress(): boolean { + return this._joinInProgress; + } + + get status(): string | undefined { + if (this._error) { + return this._error.message; + } + else if(this._joinInProgress){ + return "Joining room"; + } + } +} diff --git a/src/platform/web/ui/session/JoinRoomView.ts b/src/platform/web/ui/session/JoinRoomView.ts new file mode 100644 index 00000000..bc6d751f --- /dev/null +++ b/src/platform/web/ui/session/JoinRoomView.ts @@ -0,0 +1,63 @@ +/* +Copyright 2022 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 "../general/TemplateView"; +import type {JoinRoomViewModel} from "../../../../domain/session/JoinRoomViewModel"; +import {spinner} from "../common.js"; + +export class JoinRoomView extends TemplateView { + render(t, vm) { + const input = t.input({ + type: "text", + name: "id", + id: "id", + placeholder: vm.i18n`Enter a room id`, + disabled: vm => vm.joinInProgress, + }); + return t.main({className: "middle"}, + t.div({className: "JoinRoomView centered-column"}, [ + t.h2("Join room"), + t.form({className: "JoinRoomView_detailsForm form", onSubmit: evt => this.onSubmit(evt, input.value)}, [ + t.div({className: "vertical-layout"}, [ + t.div({className: "stretch form-row text"}, [ + t.label({for: "id"}, vm.i18n`Room id`), + input, + ]), + ]), + t.div({className: "button-row"}, [ + t.button({ + className: "button-action primary", + type: "submit", + disabled: vm => vm.joinInProgress + }, vm.i18n`Join`), + ]), + t.map(vm => vm.status, (status, t) => { + return t.div({ className: "JoinRoomView_status" }, [ + spinner(t, { hidden: vm => !vm.joinInProgress }), + t.span(status), + ]); + }) + ]) + ]) + ); + } + + onSubmit(evt, id) { + evt.preventDefault(); + this.value.join(id); + } +} + From 84920622e302e3d71a69e80e113e18d63e0d0e8c Mon Sep 17 00:00:00 2001 From: RMidhunSuresh Date: Mon, 12 Sep 2022 17:18:57 +0530 Subject: [PATCH 04/13] Add join vm to session vm --- src/domain/session/SessionViewModel.js | 30 +++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/src/domain/session/SessionViewModel.js b/src/domain/session/SessionViewModel.js index 7226dbdf..ecb2b759 100644 --- a/src/domain/session/SessionViewModel.js +++ b/src/domain/session/SessionViewModel.js @@ -25,6 +25,7 @@ import {SessionStatusViewModel} from "./SessionStatusViewModel.js"; import {RoomGridViewModel} from "./RoomGridViewModel.js"; import {SettingsViewModel} from "./settings/SettingsViewModel.js"; import {CreateRoomViewModel} from "./CreateRoomViewModel.js"; +import {JoinRoomViewModel} from "./JoinRoomViewModel"; import {ViewModel} from "../ViewModel"; import {RoomViewModelObservable} from "./RoomViewModelObservable.js"; import {RightPanelViewModel} from "./rightpanel/RightPanelViewModel.js"; @@ -45,6 +46,7 @@ export class SessionViewModel extends ViewModel { this._roomViewModelObservable = null; this._gridViewModel = null; this._createRoomViewModel = null; + this._joinRoomViewModel = null; this._setupNavigation(); this._setupForcedLogoutOnAccessTokenInvalidation(); } @@ -83,6 +85,12 @@ export class SessionViewModel extends ViewModel { })); this._updateCreateRoom(createRoom.get()); + const joinRoom = this.navigation.observe("join-room"); + this.track(joinRoom.subscribe((joinRoomOpen) => { + this._updateJoinRoom(joinRoomOpen); + })); + this._updateJoinRoom(joinRoom.get()); + const lightbox = this.navigation.observe("lightbox"); this.track(lightbox.subscribe(eventId => { this._updateLightbox(eventId); @@ -121,7 +129,13 @@ export class SessionViewModel extends ViewModel { } get activeMiddleViewModel() { - return this._roomViewModelObservable?.get() || this._gridViewModel || this._settingsViewModel || this._createRoomViewModel; + return ( + this._roomViewModelObservable?.get() || + this._gridViewModel || + this._settingsViewModel || + this._createRoomViewModel || + this._joinRoomViewModel + ); } get roomGridViewModel() { @@ -152,6 +166,10 @@ export class SessionViewModel extends ViewModel { return this._createRoomViewModel; } + get joinRoomViewModel() { + return this._joinRoomViewModel; + } + _updateGrid(roomIds) { const changed = !(this._gridViewModel && roomIds); const currentRoomId = this.navigation.path.get("room"); @@ -286,6 +304,16 @@ export class SessionViewModel extends ViewModel { this.emitChange("activeMiddleViewModel"); } + _updateJoinRoom(joinRoomOpen) { + if (this._joinRoomViewModel) { + this._joinRoomViewModel = this.disposeTracked(this._joinRoomViewModel); + } + if (joinRoomOpen) { + this._joinRoomViewModel = this.track(new JoinRoomViewModel(this.childOptions({session: this._client.session}))); + } + this.emitChange("activeMiddleViewModel"); + } + _updateLightbox(eventId) { if (this._lightboxViewModel) { this._lightboxViewModel = this.disposeTracked(this._lightboxViewModel); From f1b86e35324fdb16929f7b645fd8de948d5282b9 Mon Sep 17 00:00:00 2001 From: RMidhunSuresh Date: Mon, 12 Sep 2022 17:20:30 +0530 Subject: [PATCH 05/13] Add method to show join room view --- src/domain/session/leftpanel/LeftPanelViewModel.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/domain/session/leftpanel/LeftPanelViewModel.js b/src/domain/session/leftpanel/LeftPanelViewModel.js index fc783cfa..ce9aa0ee 100644 --- a/src/domain/session/leftpanel/LeftPanelViewModel.js +++ b/src/domain/session/leftpanel/LeftPanelViewModel.js @@ -77,6 +77,10 @@ export class LeftPanelViewModel extends ViewModel { this.navigation.push("create-room"); } + showJoinRoomView() { + this.navigation.push("join-room"); + } + _setupNavigation() { const roomObservable = this.navigation.observe("room"); this.track(roomObservable.subscribe(roomId => this._open(roomId))); From 2d4b6b03413e5978e9206b3fef43894d4e34e294 Mon Sep 17 00:00:00 2001 From: RMidhunSuresh Date: Mon, 12 Sep 2022 17:22:10 +0530 Subject: [PATCH 06/13] Exctract into function --- src/domain/session/room/RoomViewModel.js | 19 +++-------- src/matrix/room/joinRoom.ts | 42 ++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 15 deletions(-) create mode 100644 src/matrix/room/joinRoom.ts diff --git a/src/domain/session/room/RoomViewModel.js b/src/domain/session/room/RoomViewModel.js index 75f90730..2328a6be 100644 --- a/src/domain/session/room/RoomViewModel.js +++ b/src/domain/session/room/RoomViewModel.js @@ -23,7 +23,7 @@ import {imageToInfo} from "../common.js"; // TODO: remove fallback so default isn't included in bundle for SDK users that have their custom tileClassForEntry // this is a breaking SDK change though to make this option mandatory import {tileClassForEntry as defaultTileClassForEntry} from "./timeline/tiles/index"; -import {RoomStatus} from "../../../matrix/room/common"; +import {joinRoom} from "../../../matrix/room/joinRoom"; export class RoomViewModel extends ViewModel { constructor(options) { @@ -200,22 +200,11 @@ export class RoomViewModel extends ViewModel { async _processCommandJoin(roomName) { try { - const roomId = await this._options.client.session.joinRoom(roomName); - const roomStatusObserver = await this._options.client.session.observeRoomStatus(roomId); - await roomStatusObserver.waitFor(status => status === RoomStatus.Joined); + const session = this._options.client.session; + const roomId = await joinRoom(roomName, session); this.navigation.push("room", roomId); } catch (err) { - let exc; - if ((err.statusCode ?? err.status) === 400) { - exc = new Error(`/join : '${roomName}' was not legal room ID or room alias`); - } else if ((err.statusCode ?? err.status) === 404 || (err.statusCode ?? err.status) === 502 || err.message == "Internal Server Error") { - exc = new Error(`/join : room '${roomName}' not found`); - } else if ((err.statusCode ?? err.status) === 403) { - exc = new Error(`/join : you're not invited to join '${roomName}'`); - } else { - exc = err; - } - this._sendError = exc; + this._sendError = err; this._timelineError = null; this.emitChange("error"); } diff --git a/src/matrix/room/joinRoom.ts b/src/matrix/room/joinRoom.ts new file mode 100644 index 00000000..cd2d1611 --- /dev/null +++ b/src/matrix/room/joinRoom.ts @@ -0,0 +1,42 @@ +/* +Copyright 2022 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 type {Session} from "../Session.js"; +import {RoomStatus} from "./common"; + +/** + * Join a room and wait for it to arrive in the next sync + * @param roomId The id of the room to join + * @param session A session instance + */ +export async function joinRoom(roomId: string, session: Session) { + try { + const internalRoomId = await session.joinRoom(roomId); + const roomStatusObserver = await session.observeRoomStatus(internalRoomId); + await roomStatusObserver.waitFor((status: RoomStatus) => status === RoomStatus.Joined); + return internalRoomId; + } + catch (e) { + if ((e.statusCode ?? e.status) === 400) { + throw new Error(`'${roomId}' is not a legal room ID or alias`); + } else if ((e.statusCode ?? e.status) === 404 || (e.statusCode ?? e.status) === 502 || e.message == "Internal Server eor") { + throw new Error(`Room '${roomId}' could not be found`); + } else if ((e.statusCode ?? e.status) === 403) { + throw new Error(`You are not invited to join '${roomId}'`); + } else { + throw e; + } + } +} From d6ba218c08e01455d6e12cbef70cc90941645bc4 Mon Sep 17 00:00:00 2001 From: RMidhunSuresh Date: Mon, 12 Sep 2022 17:22:53 +0530 Subject: [PATCH 07/13] Return view from SessionView --- src/platform/web/ui/session/SessionView.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/platform/web/ui/session/SessionView.js b/src/platform/web/ui/session/SessionView.js index ef63b29b..7bcd8c0f 100644 --- a/src/platform/web/ui/session/SessionView.js +++ b/src/platform/web/ui/session/SessionView.js @@ -29,6 +29,7 @@ import {SettingsView} from "./settings/SettingsView.js"; import {CreateRoomView} from "./CreateRoomView.js"; import {RightPanelView} from "./rightpanel/RightPanelView.js"; import {viewClassForTile} from "./room/common"; +import {JoinRoomView} from "./JoinRoomView"; export class SessionView extends TemplateView { render(t, vm) { @@ -48,6 +49,8 @@ export class SessionView extends TemplateView { return new SettingsView(vm.settingsViewModel); } else if (vm.createRoomViewModel) { return new CreateRoomView(vm.createRoomViewModel); + } else if (vm.joinRoomViewModel) { + return new JoinRoomView(vm.joinRoomViewModel); } else if (vm.currentRoomViewModel) { if (vm.currentRoomViewModel.kind === "invite") { return new InviteView(vm.currentRoomViewModel); From 3426240ef4e27ac476ea88036b1fd18bc3384c4f Mon Sep 17 00:00:00 2001 From: RMidhunSuresh Date: Mon, 12 Sep 2022 17:23:44 +0530 Subject: [PATCH 08/13] Style JoinRoom View --- src/platform/web/ui/css/themes/element/theme.css | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/platform/web/ui/css/themes/element/theme.css b/src/platform/web/ui/css/themes/element/theme.css index 05681cbb..e6f5b7a1 100644 --- a/src/platform/web/ui/css/themes/element/theme.css +++ b/src/platform/web/ui/css/themes/element/theme.css @@ -1180,7 +1180,7 @@ button.RoomDetailsView_row::after { gap: 12px; } -.CreateRoomView, .RoomBeingCreated_error { +.CreateRoomView, .JoinRoomView, .RoomBeingCreated_error { max-width: 400px; } @@ -1211,3 +1211,14 @@ button.RoomDetailsView_row::after { background-position: center; background-size: 36px; } + +.JoinRoomView_status { + display: flex; + align-items: center; + justify-content: center; + margin-top: 10px; +} + +.JoinRoomView_status .spinner { + margin-right: 5px; +} From 44eddd0d6b720296b8f6bd335905edc2c44a8f40 Mon Sep 17 00:00:00 2001 From: RMidhunSuresh Date: Mon, 12 Sep 2022 17:24:58 +0530 Subject: [PATCH 09/13] Call method from menu --- src/platform/web/ui/session/leftpanel/LeftPanelView.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/platform/web/ui/session/leftpanel/LeftPanelView.js b/src/platform/web/ui/session/leftpanel/LeftPanelView.js index ac0fbb81..fb2feb57 100644 --- a/src/platform/web/ui/session/leftpanel/LeftPanelView.js +++ b/src/platform/web/ui/session/leftpanel/LeftPanelView.js @@ -116,8 +116,8 @@ export class LeftPanelView extends TemplateView { } else { const vm = this.value; const options = []; - options.push(Menu.option(vm.i18n`Create Room`, () => { vm.showCreateRoomView(); })) - options.push(Menu.option(vm.i18n`Join Room`, () => {})) + options.push(Menu.option(vm.i18n`Create Room`, () => vm.showCreateRoomView())); + options.push(Menu.option(vm.i18n`Join Room`, () => vm.showJoinRoomView())); this._createMenuPopup = new Popup(new Menu(options)); this._createMenuPopup.trackInTemplateView(this); this._createMenuPopup.showRelativeTo(evt.target, 10); From 88091622dbf52841640ad9d5040f076cd9531c18 Mon Sep 17 00:00:00 2001 From: RMidhunSuresh Date: Mon, 12 Sep 2022 23:21:55 +0530 Subject: [PATCH 10/13] Rename variable --- src/matrix/room/joinRoom.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/matrix/room/joinRoom.ts b/src/matrix/room/joinRoom.ts index cd2d1611..a4f3550e 100644 --- a/src/matrix/room/joinRoom.ts +++ b/src/matrix/room/joinRoom.ts @@ -24,8 +24,8 @@ import {RoomStatus} from "./common"; export async function joinRoom(roomId: string, session: Session) { try { const internalRoomId = await session.joinRoom(roomId); - const roomStatusObserver = await session.observeRoomStatus(internalRoomId); - await roomStatusObserver.waitFor((status: RoomStatus) => status === RoomStatus.Joined); + const roomStatusObservable = await session.observeRoomStatus(internalRoomId); + await roomStatusObservable.waitFor((status: RoomStatus) => status === RoomStatus.Joined); return internalRoomId; } catch (e) { From 1898c4892e5a6c28061f5b4139f5903af6727886 Mon Sep 17 00:00:00 2001 From: RMidhunSuresh Date: Mon, 12 Sep 2022 23:44:51 +0530 Subject: [PATCH 11/13] Specify return type --- src/matrix/room/joinRoom.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/matrix/room/joinRoom.ts b/src/matrix/room/joinRoom.ts index a4f3550e..7f2ed19e 100644 --- a/src/matrix/room/joinRoom.ts +++ b/src/matrix/room/joinRoom.ts @@ -21,7 +21,7 @@ import {RoomStatus} from "./common"; * @param roomId The id of the room to join * @param session A session instance */ -export async function joinRoom(roomId: string, session: Session) { +export async function joinRoom(roomId: string, session: Session): Promise { try { const internalRoomId = await session.joinRoom(roomId); const roomStatusObservable = await session.observeRoomStatus(internalRoomId); From 67dfbc5e28f51d68939f97e6895b90261d4b32cb Mon Sep 17 00:00:00 2001 From: RMidhunSuresh Date: Mon, 12 Sep 2022 23:48:01 +0530 Subject: [PATCH 12/13] Add return type --- src/domain/session/JoinRoomViewModel.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/domain/session/JoinRoomViewModel.ts b/src/domain/session/JoinRoomViewModel.ts index a4be548b..1b7148f9 100644 --- a/src/domain/session/JoinRoomViewModel.ts +++ b/src/domain/session/JoinRoomViewModel.ts @@ -33,7 +33,7 @@ export class JoinRoomViewModel extends ViewModel { this._session = options.session; } - async join(roomId: string) { + async join(roomId: string): Promise { this._error = undefined; this._joinInProgress = true; this.emitChange("joinInProgress"); From 2e9470027bd76556c74730ffdcf5f493d035bd07 Mon Sep 17 00:00:00 2001 From: Bruno Windels <274386+bwindels@users.noreply.github.com> Date: Tue, 20 Sep 2022 08:50:37 +0000 Subject: [PATCH 13/13] Update src/platform/web/ui/session/JoinRoomView.ts --- src/platform/web/ui/session/JoinRoomView.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform/web/ui/session/JoinRoomView.ts b/src/platform/web/ui/session/JoinRoomView.ts index bc6d751f..90194317 100644 --- a/src/platform/web/ui/session/JoinRoomView.ts +++ b/src/platform/web/ui/session/JoinRoomView.ts @@ -24,7 +24,7 @@ export class JoinRoomView extends TemplateView { type: "text", name: "id", id: "id", - placeholder: vm.i18n`Enter a room id`, + placeholder: vm.i18n`Enter a room id or alias`, disabled: vm => vm.joinInProgress, }); return t.main({className: "middle"},