Skip to content
Snippets Groups Projects
Unverified Commit 599b93ff authored by R Midhun Suresh's avatar R Midhun Suresh Committed by GitHub
Browse files

Merge pull request #65 from vector-im/disable-composer

Add support for disabling the composer until operator joins 
parents 42f846d1 f1b6930b
No related branches found
No related tags found
No related merge requests found
...@@ -19,6 +19,6 @@ ...@@ -19,6 +19,6 @@
"dependencies": { "dependencies": {
"@sentry/browser": "^7.5.0", "@sentry/browser": "^7.5.0",
"@sentry/tracing": "^7.5.0", "@sentry/tracing": "^7.5.0",
"hydrogen-view-sdk": "^0.0.14" "hydrogen-view-sdk": "^0.0.15"
} }
} }
...@@ -23,6 +23,9 @@ export interface IChatterboxConfig { ...@@ -23,6 +23,9 @@ export interface IChatterboxConfig {
// If specified, chatterbox will create a dm with this user // If specified, chatterbox will create a dm with this user
// This option takes precedence over 'auto_join_room' // This option takes precedence over 'auto_join_room'
invite_user: string; invite_user: string;
// If set to true, chatterbox will not let the user send any messages until the operator has joined
// Only applicable when invite_user is configured
disable_composer_until_operator_join: boolean;
// If set to true, the room created for DM is encrypted // If set to true, the room created for DM is encrypted
encrypt_room: boolean; encrypt_room: boolean;
// Configurations for header on chatterbox (containing title, avatar, minimize button) // Configurations for header on chatterbox (containing title, avatar, minimize button)
......
...@@ -214,3 +214,31 @@ body { ...@@ -214,3 +214,31 @@ body {
height: 15px; height: 15px;
font-size: 3px; font-size: 3px;
} }
.WaitingForOperatorJoinView {
display: flex;
justify-content: center;
}
.FakeComposerContainer {
display: flex;
background: #FFFFFF;
border: 1px solid #E3E8F0;
border-radius: 8px;
width: 351px;
height: 56px;
box-sizing: border-box;
align-items: center;
}
.FakeComposerContainer .loader {
width: 15px;
height: 15px;
margin: 0 0 0 10px;
font-size: 2px;
}
.FakeComposerContainer span {
margin-left: 20px;
color: #737D8C;
}
...@@ -38,7 +38,7 @@ export class ChatterboxView extends TemplateView<ChatterboxViewModel> { ...@@ -38,7 +38,7 @@ export class ChatterboxView extends TemplateView<ChatterboxViewModel> {
), ),
t.mapView( t.mapView(
(vm) => vm.messageComposerViewModel, (vm) => vm.messageComposerViewModel,
(vm) => (vm ? new MessageComposer(vm) : null) (vm) => (vm.kind === "composer" ? new MessageComposer(vm) : new WaitingForOperatorJoinView())
), ),
t.view(new FooterView(vm.footerViewModel)), t.view(new FooterView(vm.footerViewModel)),
]); ]);
...@@ -65,3 +65,14 @@ class RoomHeaderView extends TemplateView<ChatterboxViewModel> { ...@@ -65,3 +65,14 @@ class RoomHeaderView extends TemplateView<ChatterboxViewModel> {
]); ]);
} }
} }
class WaitingForOperatorJoinView extends TemplateView {
render(t) {
return t.div({ className: "WaitingForOperatorJoinView" }, [
t.div({ className: "FakeComposerContainer" }, [
t.span("Waiting for operator to join "),
t.div({ className: "loader" })]
)]
);
}
}
...@@ -25,6 +25,7 @@ export class ChatterboxViewModel extends ViewModel { ...@@ -25,6 +25,7 @@ export class ChatterboxViewModel extends ViewModel {
super(options); super(options);
this._client = options.client; this._client = options.client;
this._loginPromise = options.loginPromise; this._loginPromise = options.loginPromise;
this.emitOnRoomViewModelChange = this.emitOnRoomViewModelChange.bind(this);
} }
async load() { async load() {
...@@ -48,16 +49,31 @@ export class ChatterboxViewModel extends ViewModel { ...@@ -48,16 +49,31 @@ export class ChatterboxViewModel extends ViewModel {
tileClassForEntry: createCustomTileClassForEntry(this._session.userId), tileClassForEntry: createCustomTileClassForEntry(this._session.userId),
}))); })));
await this._roomViewModel.load(); await this._roomViewModel.load();
this._roomViewModel.on("change", this.emitOnRoomViewModelChange);
this.emitChange("roomViewModel");
}
private emitOnRoomViewModelChange() {
this.emitChange("roomViewModel"); this.emitChange("roomViewModel");
} }
private async createRoomWithUserSpecifiedInConfig() { private async createRoomWithUserSpecifiedInConfig() {
const userId = this._options.config["invite_user"]; const userId = this._options.config["invite_user"];
const ownUserId = this._session.userId;
let room = await this.findPreviouslyCreatedRoom(); let room = await this.findPreviouslyCreatedRoom();
if (room) { if (room) {
// we already have a room with this user // we already have a room with this user
return room; return room;
} }
const powerLevelContent = this._options.config["disable_composer_until_operator_join"] ? {
users: {
[userId]: 100,
[ownUserId]: 60
},
events: {
"m.room.message": 80,
}
} : null;
const roomBeingCreated = this._session.createRoom({ const roomBeingCreated = this._session.createRoom({
type: 1, //todo: use enum from hydrogen-sdk here type: 1, //todo: use enum from hydrogen-sdk here
name: undefined, name: undefined,
...@@ -67,6 +83,7 @@ export class ChatterboxViewModel extends ViewModel { ...@@ -67,6 +83,7 @@ export class ChatterboxViewModel extends ViewModel {
alias: undefined, alias: undefined,
avatar: undefined, avatar: undefined,
invites: [userId], invites: [userId],
powerLevelContentOverride: powerLevelContent,
}); });
const roomStatusObservable = await this._session.observeRoomStatus(roomBeingCreated.id); const roomStatusObservable = await this._session.observeRoomStatus(roomBeingCreated.id);
await roomStatusObservable.waitFor(status => status === (RoomStatus.BeingCreated | RoomStatus.Replaced)).promise; await roomStatusObservable.waitFor(status => status === (RoomStatus.BeingCreated | RoomStatus.Replaced)).promise;
...@@ -107,7 +124,7 @@ export class ChatterboxViewModel extends ViewModel { ...@@ -107,7 +124,7 @@ export class ChatterboxViewModel extends ViewModel {
return promise; return promise;
} }
private async findPreviouslyCreatedRoom(): Promise<string | null> { private async findPreviouslyCreatedRoom(): Promise<any | null> {
const createdRoomId = await this.platform.settingsStorage.getString("created-room-id"); const createdRoomId = await this.platform.settingsStorage.getString("created-room-id");
const lastKnownInviteUserId = await this.platform.settingsStorage.getString("invite-user"); const lastKnownInviteUserId = await this.platform.settingsStorage.getString("invite-user");
const currentInviteUserId = this._options.config["invite_user"]; const currentInviteUserId = this._options.config["invite_user"];
...@@ -117,6 +134,11 @@ export class ChatterboxViewModel extends ViewModel { ...@@ -117,6 +134,11 @@ export class ChatterboxViewModel extends ViewModel {
return null; return null;
} }
dispose() {
super.dispose();
this._roomViewModel.off("change", this.emitOnRoomViewModelChange);
}
minimize() { minimize() {
(window as any).sendMinimizeToParent(); (window as any).sendMinimizeToParent();
this.navigation.push("minimize"); this.navigation.push("minimize");
......
...@@ -798,10 +798,10 @@ human-signals@^1.1.1: ...@@ -798,10 +798,10 @@ human-signals@^1.1.1:
resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3"
integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==
hydrogen-view-sdk@^0.0.14: hydrogen-view-sdk@^0.0.15:
version "0.0.14" version "0.0.15"
resolved "https://registry.yarnpkg.com/hydrogen-view-sdk/-/hydrogen-view-sdk-0.0.14.tgz#36dc876989ed57b98bf9999bf993f121f24a72b4" resolved "https://registry.yarnpkg.com/hydrogen-view-sdk/-/hydrogen-view-sdk-0.0.15.tgz#2c8302fc6e3ad6147efe66e6ceba3a93f8cdd14e"
integrity sha512-jZWXab9fVKus9mze/NRvcmZlA1u/oVvsfqgg5fcaVVk2OuIaZwCtnTkHOBp4fRvjVhKIfikN03szqZZZMaK2YA== integrity sha512-qmXiw3EeQ6J/9IYfh/nc/fsFUa+TRx81+dk5E7p4QkDDWjWWvw60rdpObxD2iKi/DOhM9s0QvE2RyrnHxWkmdA==
dependencies: dependencies:
"@matrix-org/olm" "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.8.tgz" "@matrix-org/olm" "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.8.tgz"
another-json "^0.2.0" another-json "^0.2.0"
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment