https://github.com/matrix-org/matrix-react-sdk/pull/7339 https://github.com/matrix-org/matrix-react-sdk/commit/7fa27f583490a4a9bf0b5469fef6143bc5f5bc06 https://github.com/matrix-org/matrix-react-sdk/pull/7372 !!! merged, 2022-03-15, /jumptodate slash command at "Settings->Labs" https://github.com/matrix-org/matrix-react-sdk/pull/7317 ?! closed ?! right after merging 7339 https://github.com/matrix-org/matrix-js-sdk/pull/2072 https://github.com/matrix-org/matrix-react-sdk/blob/develop/src/settings/Settings.tsx#L349 "feature_jump_to_date": { // We purposely leave out `isFeature: true` so it doesn't show in Labs // by default. We will conditionally show it depending on whether we can // detect MSC3030 support (see LabUserSettingsTab.tsx). // labsGroup: LabGroup.Messaging, displayName: _td("Jump to date (adds /jumptodate and jump to date headers)"), supportedLevels: LEVELS_FEATURE, default: false, }, https://github.com/matrix-org/matrix-react-sdk/blob/develop/src/components/views/settings/tabs/user/LabsUserSettingsTab.tsx @replaceableComponent("views.settings.tabs.user.LabsUserSettingsTab") export default class LabsUserSettingsTab extends React.Component<{}, IState> { constructor(props: {}) { super(props); MatrixClientPeg.get().doesServerSupportUnstableFeature("org.matrix.msc2285").then((showHiddenReadReceipts) => { this.setState({ showHiddenReadReceipts }); }); MatrixClientPeg.get().doesServerSupportUnstableFeature("org.matrix.msc3030").then((showJumpToDate) => { this.setState({ showJumpToDate }); }); this.state = { showHiddenReadReceipts: false, showJumpToDate: false, }; } ... } https://github.com/matrix-org/matrix-react-sdk/blob/develop/src/MatrixClientPeg.ts import { IStartClientOpts, MatrixClient } from 'matrix-js-sdk/src/client'; ... public get(): MatrixClient { return this.matrixClient; } ... https://github.com/matrix-org/matrix-js-sdk/blob/develop/src/client.ts ... /** * Query the server to see if it lists support for an unstable feature * in the /versions response * @param {string} feature the feature name * @return {Promise} true if the feature is supported */ public async doesServerSupportUnstableFeature(feature: string): Promise { const response = await this.getVersions(); if (!response) return false; const unstableFeatures = response["unstable_features"]; return unstableFeatures && !!unstableFeatures[feature]; } ... /** * Get the API versions supported by the server, along with any * unstable APIs it supports * @return {Promise} The server /versions response */ public getVersions(): Promise { if (this.serverVersionsPromise) { return this.serverVersionsPromise; } this.serverVersionsPromise = this.http.request( undefined, // callback Method.Get, "/_matrix/client/versions", undefined, // queryParams undefined, // data { prefix: '', }, ).catch((e: Error) => { // Need to unset this if it fails, otherwise we'll never retry this.serverVersionsPromise = null; // but rethrow the exception to anything that was waiting throw e; }); return this.serverVersionsPromise; }