diff --git a/src/CountlyAnalytics.ts b/src/CountlyAnalytics.ts index 974c08df18..fd2e8fe7a4 100644 --- a/src/CountlyAnalytics.ts +++ b/src/CountlyAnalytics.ts @@ -22,6 +22,7 @@ import SdkConfig from './SdkConfig'; import {MatrixClientPeg} from "./MatrixClientPeg"; import {sleep} from "./utils/promise"; import RoomViewStore from "./stores/RoomViewStore"; +import { Action } from "./dispatcher/actions"; // polyfill textencoder if necessary import * as TextEncodingUtf8 from 'text-encoding-utf-8'; @@ -265,7 +266,7 @@ interface ICreateRoomEvent extends IEvent { } interface IJoinRoomEvent extends IEvent { - key: "join_room"; + key: Action.JoinRoom; dur: number; // how long it took to join (until remote echo) segmentation: { room_id: string; // hashed @@ -858,7 +859,7 @@ export default class CountlyAnalytics { } public trackRoomJoin(startTime: number, roomId: string, type: IJoinRoomEvent["segmentation"]["type"]) { - this.track("join_room", { type }, roomId, { + this.track(Action.JoinRoom, { type }, roomId, { dur: CountlyAnalytics.getTimestamp() - startTime, }); } diff --git a/src/components/structures/RoomView.tsx b/src/components/structures/RoomView.tsx index d822b6a839..28bf4da04c 100644 --- a/src/components/structures/RoomView.tsx +++ b/src/components/structures/RoomView.tsx @@ -1114,7 +1114,8 @@ export default class RoomView extends React.Component { Promise.resolve().then(() => { const signUrl = this.props.threepidInvite?.signUrl; dis.dispatch({ - action: 'join_room', + action: Action.JoinRoom, + roomId: this.getRoomId(), opts: { inviteSignUrl: signUrl }, _type: "unknown", // TODO: instrumentation }); diff --git a/src/createRoom.ts b/src/createRoom.ts index 75219ef656..c6507b1380 100644 --- a/src/createRoom.ts +++ b/src/createRoom.ts @@ -34,6 +34,7 @@ import { isJoinedOrNearlyJoined } from "./utils/membership"; import { VIRTUAL_ROOM_EVENT_TYPE } from "./CallHandler"; import SpaceStore from "./stores/SpaceStore"; import { makeSpaceParentEvent } from "./utils/space"; +import { Action } from "./dispatcher/actions" // we define a number of interfaces which take their names from the js-sdk /* eslint-disable camelcase */ @@ -243,7 +244,8 @@ export default function createRoom(opts: IOpts): Promise { // We also failed to join the room (this sets joining to false in RoomViewStore) dis.dispatch({ - action: 'join_room_error', + action: Action.JoinRoomError, + roomId, }); console.error("Failed to create room " + roomId + " " + err); let description = _t("Server may be unavailable, overloaded, or you hit a bug."); diff --git a/src/dispatcher/actions.ts b/src/dispatcher/actions.ts index cd32c3743f..0c9a4160b5 100644 --- a/src/dispatcher/actions.ts +++ b/src/dispatcher/actions.ts @@ -138,4 +138,19 @@ export enum Action { * Fired when an upload is cancelled by the user. Should be used with UploadCanceledPayload. */ UploadCanceled = "upload_canceled", + + /** + * Fired when requesting to join a room + */ + JoinRoom = "join_room", + + /** + * Fired when successfully joining a room + */ + JoinRoomReady = "join_room_ready", + + /** + * Fired when joining a room failed + */ + JoinRoomError = "join_room", } diff --git a/src/stores/RoomViewStore.tsx b/src/stores/RoomViewStore.tsx index fe2e0a66b2..4ce1c789a5 100644 --- a/src/stores/RoomViewStore.tsx +++ b/src/stores/RoomViewStore.tsx @@ -17,17 +17,18 @@ limitations under the License. */ import React from "react"; -import {Store} from 'flux/utils'; -import {MatrixError} from "matrix-js-sdk/src/http-api"; +import { Store } from 'flux/utils'; +import { MatrixError } from "matrix-js-sdk/src/http-api"; import dis from '../dispatcher/dispatcher'; -import {MatrixClientPeg} from '../MatrixClientPeg'; +import { MatrixClientPeg } from '../MatrixClientPeg'; import * as sdk from '../index'; import Modal from '../Modal'; import { _t } from '../languageHandler'; import { getCachedRoomIDForAlias, storeRoomAliasInCache } from '../RoomAliasCache'; -import {ActionPayload} from "../dispatcher/payloads"; -import {retry} from "../utils/promise"; +import { ActionPayload } from "../dispatcher/payloads"; +import { Action } from "../dispatcher/actions"; +import { retry } from "../utils/promise"; import CountlyAnalytics from "../CountlyAnalytics"; const NUM_JOIN_RETRY = 5; @@ -136,13 +137,13 @@ class RoomViewStore extends Store { break; // join_room: // - opts: options for joinRoom - case 'join_room': + case Action.JoinRoom: this.joinRoom(payload); break; - case 'join_room_error': + case Action.JoinRoomError: this.joinRoomError(payload); break; - case 'join_room_ready': + case Action.JoinRoomReady: this.setState({ shouldPeek: false }); break; case 'on_client_not_viable': @@ -217,7 +218,11 @@ class RoomViewStore extends Store { this.setState(newState); if (payload.auto_join) { - this.joinRoom(payload); + dis.dispatch({ + ...payload, + action: Action.JoinRoom, + roomId: payload.room_id, + }); } } else if (payload.room_alias) { // Try the room alias to room ID navigation cache first to avoid @@ -298,41 +303,16 @@ class RoomViewStore extends Store { // We do *not* clear the 'joining' flag because the Room object and/or our 'joined' member event may not // have come down the sync stream yet, and that's the point at which we'd consider the user joined to the // room. - dis.dispatch({ action: 'join_room_ready' }); + dis.dispatch({ + action: Action.JoinRoomReady, + roomId: this.state.roomId, + }); } catch (err) { dis.dispatch({ - action: 'join_room_error', + action: Action.JoinRoomError, + roomId: this.state.roomId, err: err, }); - - let msg = err.message ? err.message : JSON.stringify(err); - console.log("Failed to join room:", msg); - - if (err.name === "ConnectionError") { - msg = _t("There was an error joining the room"); - } else if (err.errcode === 'M_INCOMPATIBLE_ROOM_VERSION') { - msg =
- {_t("Sorry, your homeserver is too old to participate in this room.")}
- {_t("Please contact your homeserver administrator.")} -
; - } else if (err.httpStatus === 404) { - const invitingUserId = this.getInvitingUserId(this.state.roomId); - // only provide a better error message for invites - if (invitingUserId) { - // if the inviting user is on the same HS, there can only be one cause: they left. - if (invitingUserId.endsWith(`:${MatrixClientPeg.get().getDomain()}`)) { - msg = _t("The person who invited you already left the room."); - } else { - msg = _t("The person who invited you already left the room, or their server is offline."); - } - } - } - - const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); - Modal.createTrackedDialog('Failed to join room', '', ErrorDialog, { - title: _t("Failed to join room"), - description: msg, - }); } } @@ -351,6 +331,35 @@ class RoomViewStore extends Store { joining: false, joinError: payload.err, }); + const err = payload.err; + let msg = err.message ? err.message : JSON.stringify(err); + console.log("Failed to join room:", msg); + + if (err.name === "ConnectionError") { + msg = _t("There was an error joining the room"); + } else if (err.errcode === 'M_INCOMPATIBLE_ROOM_VERSION') { + msg =
+ {_t("Sorry, your homeserver is too old to participate in this room.")}
+ {_t("Please contact your homeserver administrator.")} +
; + } else if (err.httpStatus === 404) { + const invitingUserId = this.getInvitingUserId(this.state.roomId); + // only provide a better error message for invites + if (invitingUserId) { + // if the inviting user is on the same HS, there can only be one cause: they left. + if (invitingUserId.endsWith(`:${MatrixClientPeg.get().getDomain()}`)) { + msg = _t("The person who invited you already left the room."); + } else { + msg = _t("The person who invited you already left the room, or their server is offline."); + } + } + } + + const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); + Modal.createTrackedDialog('Failed to join room', '', ErrorDialog, { + title: _t("Failed to join room"), + description: msg, + }); } public reset() {