You've already forked matrix-react-sdk
							
							
				mirror of
				https://github.com/matrix-org/matrix-react-sdk.git
				synced 2025-11-04 11:51:45 +03:00 
			
		
		
		
	Trigger join room actions properly
This commit is contained in:
		@@ -22,6 +22,7 @@ import SdkConfig from './SdkConfig';
 | 
				
			|||||||
import {MatrixClientPeg} from "./MatrixClientPeg";
 | 
					import {MatrixClientPeg} from "./MatrixClientPeg";
 | 
				
			||||||
import {sleep} from "./utils/promise";
 | 
					import {sleep} from "./utils/promise";
 | 
				
			||||||
import RoomViewStore from "./stores/RoomViewStore";
 | 
					import RoomViewStore from "./stores/RoomViewStore";
 | 
				
			||||||
 | 
					import { Action } from "./dispatcher/actions";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// polyfill textencoder if necessary
 | 
					// polyfill textencoder if necessary
 | 
				
			||||||
import * as TextEncodingUtf8 from 'text-encoding-utf-8';
 | 
					import * as TextEncodingUtf8 from 'text-encoding-utf-8';
 | 
				
			||||||
@@ -265,7 +266,7 @@ interface ICreateRoomEvent extends IEvent {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
interface IJoinRoomEvent extends IEvent {
 | 
					interface IJoinRoomEvent extends IEvent {
 | 
				
			||||||
    key: "join_room";
 | 
					    key: Action.JoinRoom;
 | 
				
			||||||
    dur: number; // how long it took to join (until remote echo)
 | 
					    dur: number; // how long it took to join (until remote echo)
 | 
				
			||||||
    segmentation: {
 | 
					    segmentation: {
 | 
				
			||||||
        room_id: string; // hashed
 | 
					        room_id: string; // hashed
 | 
				
			||||||
@@ -858,7 +859,7 @@ export default class CountlyAnalytics {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public trackRoomJoin(startTime: number, roomId: string, type: IJoinRoomEvent["segmentation"]["type"]) {
 | 
					    public trackRoomJoin(startTime: number, roomId: string, type: IJoinRoomEvent["segmentation"]["type"]) {
 | 
				
			||||||
        this.track<IJoinRoomEvent>("join_room", { type }, roomId, {
 | 
					        this.track<IJoinRoomEvent>(Action.JoinRoom, { type }, roomId, {
 | 
				
			||||||
            dur: CountlyAnalytics.getTimestamp() - startTime,
 | 
					            dur: CountlyAnalytics.getTimestamp() - startTime,
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1114,7 +1114,8 @@ export default class RoomView extends React.Component<IProps, IState> {
 | 
				
			|||||||
            Promise.resolve().then(() => {
 | 
					            Promise.resolve().then(() => {
 | 
				
			||||||
                const signUrl = this.props.threepidInvite?.signUrl;
 | 
					                const signUrl = this.props.threepidInvite?.signUrl;
 | 
				
			||||||
                dis.dispatch({
 | 
					                dis.dispatch({
 | 
				
			||||||
                    action: 'join_room',
 | 
					                    action: Action.JoinRoom,
 | 
				
			||||||
 | 
					                    roomId: this.getRoomId(),
 | 
				
			||||||
                    opts: { inviteSignUrl: signUrl },
 | 
					                    opts: { inviteSignUrl: signUrl },
 | 
				
			||||||
                    _type: "unknown", // TODO: instrumentation
 | 
					                    _type: "unknown", // TODO: instrumentation
 | 
				
			||||||
                });
 | 
					                });
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -34,6 +34,7 @@ import { isJoinedOrNearlyJoined } from "./utils/membership";
 | 
				
			|||||||
import { VIRTUAL_ROOM_EVENT_TYPE } from "./CallHandler";
 | 
					import { VIRTUAL_ROOM_EVENT_TYPE } from "./CallHandler";
 | 
				
			||||||
import SpaceStore from "./stores/SpaceStore";
 | 
					import SpaceStore from "./stores/SpaceStore";
 | 
				
			||||||
import { makeSpaceParentEvent } from "./utils/space";
 | 
					import { makeSpaceParentEvent } from "./utils/space";
 | 
				
			||||||
 | 
					import { Action } from "./dispatcher/actions"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// we define a number of interfaces which take their names from the js-sdk
 | 
					// we define a number of interfaces which take their names from the js-sdk
 | 
				
			||||||
/* eslint-disable camelcase */
 | 
					/* eslint-disable camelcase */
 | 
				
			||||||
@@ -243,7 +244,8 @@ export default function createRoom(opts: IOpts): Promise<string | null> {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        // We also failed to join the room (this sets joining to false in RoomViewStore)
 | 
					        // We also failed to join the room (this sets joining to false in RoomViewStore)
 | 
				
			||||||
        dis.dispatch({
 | 
					        dis.dispatch({
 | 
				
			||||||
            action: 'join_room_error',
 | 
					            action: Action.JoinRoomError,
 | 
				
			||||||
 | 
					            roomId,
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
        console.error("Failed to create room " + roomId + " " + err);
 | 
					        console.error("Failed to create room " + roomId + " " + err);
 | 
				
			||||||
        let description = _t("Server may be unavailable, overloaded, or you hit a bug.");
 | 
					        let description = _t("Server may be unavailable, overloaded, or you hit a bug.");
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -138,4 +138,19 @@ export enum Action {
 | 
				
			|||||||
     * Fired when an upload is cancelled by the user. Should be used with UploadCanceledPayload.
 | 
					     * Fired when an upload is cancelled by the user. Should be used with UploadCanceledPayload.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    UploadCanceled = "upload_canceled",
 | 
					    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",
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,17 +17,18 @@ limitations under the License.
 | 
				
			|||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import React from "react";
 | 
					import React from "react";
 | 
				
			||||||
import {Store} from 'flux/utils';
 | 
					import { Store } from 'flux/utils';
 | 
				
			||||||
import {MatrixError} from "matrix-js-sdk/src/http-api";
 | 
					import { MatrixError } from "matrix-js-sdk/src/http-api";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import dis from '../dispatcher/dispatcher';
 | 
					import dis from '../dispatcher/dispatcher';
 | 
				
			||||||
import {MatrixClientPeg} from '../MatrixClientPeg';
 | 
					import { MatrixClientPeg } from '../MatrixClientPeg';
 | 
				
			||||||
import * as sdk from '../index';
 | 
					import * as sdk from '../index';
 | 
				
			||||||
import Modal from '../Modal';
 | 
					import Modal from '../Modal';
 | 
				
			||||||
import { _t } from '../languageHandler';
 | 
					import { _t } from '../languageHandler';
 | 
				
			||||||
import { getCachedRoomIDForAlias, storeRoomAliasInCache } from '../RoomAliasCache';
 | 
					import { getCachedRoomIDForAlias, storeRoomAliasInCache } from '../RoomAliasCache';
 | 
				
			||||||
import {ActionPayload} from "../dispatcher/payloads";
 | 
					import { ActionPayload } from "../dispatcher/payloads";
 | 
				
			||||||
import {retry} from "../utils/promise";
 | 
					import { Action } from "../dispatcher/actions";
 | 
				
			||||||
 | 
					import { retry } from "../utils/promise";
 | 
				
			||||||
import CountlyAnalytics from "../CountlyAnalytics";
 | 
					import CountlyAnalytics from "../CountlyAnalytics";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const NUM_JOIN_RETRY = 5;
 | 
					const NUM_JOIN_RETRY = 5;
 | 
				
			||||||
@@ -136,13 +137,13 @@ class RoomViewStore extends Store<ActionPayload> {
 | 
				
			|||||||
                break;
 | 
					                break;
 | 
				
			||||||
            // join_room:
 | 
					            // join_room:
 | 
				
			||||||
            //      - opts: options for joinRoom
 | 
					            //      - opts: options for joinRoom
 | 
				
			||||||
            case 'join_room':
 | 
					            case Action.JoinRoom:
 | 
				
			||||||
                this.joinRoom(payload);
 | 
					                this.joinRoom(payload);
 | 
				
			||||||
                break;
 | 
					                break;
 | 
				
			||||||
            case 'join_room_error':
 | 
					            case Action.JoinRoomError:
 | 
				
			||||||
                this.joinRoomError(payload);
 | 
					                this.joinRoomError(payload);
 | 
				
			||||||
                break;
 | 
					                break;
 | 
				
			||||||
            case 'join_room_ready':
 | 
					            case Action.JoinRoomReady:
 | 
				
			||||||
                this.setState({ shouldPeek: false });
 | 
					                this.setState({ shouldPeek: false });
 | 
				
			||||||
                break;
 | 
					                break;
 | 
				
			||||||
            case 'on_client_not_viable':
 | 
					            case 'on_client_not_viable':
 | 
				
			||||||
@@ -217,7 +218,11 @@ class RoomViewStore extends Store<ActionPayload> {
 | 
				
			|||||||
            this.setState(newState);
 | 
					            this.setState(newState);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (payload.auto_join) {
 | 
					            if (payload.auto_join) {
 | 
				
			||||||
                this.joinRoom(payload);
 | 
					                dis.dispatch({
 | 
				
			||||||
 | 
					                    ...payload,
 | 
				
			||||||
 | 
					                    action: Action.JoinRoom,
 | 
				
			||||||
 | 
					                    roomId: payload.room_id,
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        } else if (payload.room_alias) {
 | 
					        } else if (payload.room_alias) {
 | 
				
			||||||
            // Try the room alias to room ID navigation cache first to avoid
 | 
					            // Try the room alias to room ID navigation cache first to avoid
 | 
				
			||||||
@@ -298,41 +303,16 @@ class RoomViewStore extends Store<ActionPayload> {
 | 
				
			|||||||
            // We do *not* clear the 'joining' flag because the Room object and/or our 'joined' member event may not
 | 
					            // 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
 | 
					            // have come down the sync stream yet, and that's the point at which we'd consider the user joined to the
 | 
				
			||||||
            // room.
 | 
					            // room.
 | 
				
			||||||
            dis.dispatch({ action: 'join_room_ready' });
 | 
					            dis.dispatch({
 | 
				
			||||||
 | 
					                action: Action.JoinRoomReady,
 | 
				
			||||||
 | 
					                roomId: this.state.roomId,
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
        } catch (err) {
 | 
					        } catch (err) {
 | 
				
			||||||
            dis.dispatch({
 | 
					            dis.dispatch({
 | 
				
			||||||
                action: 'join_room_error',
 | 
					                action: Action.JoinRoomError,
 | 
				
			||||||
 | 
					                roomId: this.state.roomId,
 | 
				
			||||||
                err: err,
 | 
					                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 = <div>
 | 
					 | 
				
			||||||
                    {_t("Sorry, your homeserver is too old to participate in this room.")}<br />
 | 
					 | 
				
			||||||
                    {_t("Please contact your homeserver administrator.")}
 | 
					 | 
				
			||||||
                </div>;
 | 
					 | 
				
			||||||
            } 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<ActionPayload> {
 | 
				
			|||||||
            joining: false,
 | 
					            joining: false,
 | 
				
			||||||
            joinError: payload.err,
 | 
					            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 = <div>
 | 
				
			||||||
 | 
					                {_t("Sorry, your homeserver is too old to participate in this room.")}<br />
 | 
				
			||||||
 | 
					                {_t("Please contact your homeserver administrator.")}
 | 
				
			||||||
 | 
					            </div>;
 | 
				
			||||||
 | 
					        } 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() {
 | 
					    public reset() {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user