diff --git a/src/createRoom.ts b/src/createRoom.ts index 00a970eedc..a5343076ac 100644 --- a/src/createRoom.ts +++ b/src/createRoom.ts @@ -17,6 +17,7 @@ limitations under the License. import { MatrixClient } from "matrix-js-sdk/src/client"; import { Room } from "matrix-js-sdk/src/models/room"; +import { EventType } from "matrix-js-sdk/src/@types/event"; import { MatrixClientPeg } from './MatrixClientPeg'; import Modal from './Modal'; @@ -31,6 +32,8 @@ import GroupStore from "./stores/GroupStore"; import CountlyAnalytics from "./CountlyAnalytics"; import { isJoinedOrNearlyJoined } from "./utils/membership"; import { VIRTUAL_ROOM_EVENT_TYPE } from "./CallHandler"; +import SpaceStore from "./stores/SpaceStore"; +import { makeSpaceParentEvent } from "./utils/space"; // we define a number of interfaces which take their names from the js-sdk /* eslint-disable camelcase */ @@ -84,6 +87,7 @@ export interface IOpts { inlineErrors?: boolean; andView?: boolean; associatedWithCommunity?: string; + parentSpace?: Room; } /** @@ -175,6 +179,16 @@ export default function createRoom(opts: IOpts): Promise { }); } + if (opts.parentSpace) { + opts.createOpts.initial_state.push(makeSpaceParentEvent(opts.parentSpace, true)); + opts.createOpts.initial_state.push({ + type: EventType.RoomHistoryVisibility, + content: { + "history_visibility": opts.createOpts.preset === Preset.PublicChat ? "world_readable" : "invited", + }, + }); + } + let modal; if (opts.spinner) modal = Modal.createDialog(Loader, null, 'mx_Dialog_spinner'); @@ -189,6 +203,9 @@ export default function createRoom(opts: IOpts): Promise { return Promise.resolve(); } }).then(() => { + if (opts.parentSpace) { + return SpaceStore.instance.addRoomToSpace(opts.parentSpace, roomId, [client.getDomain()], true); + } if (opts.associatedWithCommunity) { return GroupStore.addRoomToGroup(opts.associatedWithCommunity, roomId, false); } diff --git a/src/utils/permalinks/Permalinks.js b/src/utils/permalinks/Permalinks.js index 086abc669d..bcf4d87136 100644 --- a/src/utils/permalinks/Permalinks.js +++ b/src/utils/permalinks/Permalinks.js @@ -14,9 +14,11 @@ See the License for the specific language governing permissions and limitations under the License. */ -import {MatrixClientPeg} from "../../MatrixClientPeg"; import isIp from "is-ip"; -import * as utils from 'matrix-js-sdk/src/utils'; +import * as utils from "matrix-js-sdk/src/utils"; +import {Room} from "matrix-js-sdk/src/models/room"; + +import {MatrixClientPeg} from "../../MatrixClientPeg"; import SpecPermalinkConstructor, {baseUrl as matrixtoBaseUrl} from "./SpecPermalinkConstructor"; import PermalinkConstructor, {PermalinkParts} from "./PermalinkConstructor"; import ElementPermalinkConstructor from "./ElementPermalinkConstructor"; @@ -121,6 +123,10 @@ export class RoomPermalinkCreator { this._started = false; } + get serverCandidates() { + return this._serverCandidates; + } + isStarted() { return this._started; } @@ -451,3 +457,9 @@ function isHostnameIpAddress(hostname) { return isIp(hostname); } + +export const calculateRoomVia = (room: Room) => { + const permalinkCreator = new RoomPermalinkCreator(room); + permalinkCreator.load(); + return permalinkCreator.serverCandidates; +}; diff --git a/src/utils/space.ts b/src/utils/space.ts index 85faedf5d6..98801cabd0 100644 --- a/src/utils/space.ts +++ b/src/utils/space.ts @@ -18,6 +18,8 @@ import {Room} from "matrix-js-sdk/src/models/room"; import {MatrixClient} from "matrix-js-sdk/src/client"; import {EventType} from "matrix-js-sdk/src/@types/event"; +import {calculateRoomVia} from "../utils/permalinks/Permalinks"; + export const shouldShowSpaceSettings = (cli: MatrixClient, space: Room) => { const userId = cli.getUserId(); return space.getMyMembership() === "join" @@ -26,3 +28,12 @@ export const shouldShowSpaceSettings = (cli: MatrixClient, space: Room) => { || space.currentState.maySendStateEvent(EventType.RoomTopic, userId) || space.currentState.maySendStateEvent(EventType.RoomJoinRules, userId)); }; + +export const makeSpaceParentEvent = (room: Room, canonical = false) => ({ + type: EventType.SpaceParent, + content: { + "via": calculateRoomVia(room), + "canonical": canonical, + }, + state_key: room.roomId, +});