diff --git a/CHANGELOG.md b/CHANGELOG.md index ccd574e7fd5..4bbda5ec631 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +Changes in [3.39.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v3.39.1) (2022-02-01) +===================================================================================================== + +## 🐛 Bug Fixes + * Fix the sticker picker ([\#7692](https://github.com/matrix-org/matrix-react-sdk/pull/7692)). Fixes vector-im/element-web#20797. + * Ensure UserInfo can be rendered without a room ([\#7687](https://github.com/matrix-org/matrix-react-sdk/pull/7687)). Fixes vector-im/element-web#20830. + * Fix publishing address wrongly demanding the alias be available ([\#7690](https://github.com/matrix-org/matrix-react-sdk/pull/7690)). Fixes vector-im/element-web#12013 and vector-im/element-web#20833. + Changes in [3.39.0](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v3.39.0) (2022-01-31) ===================================================================================================== diff --git a/package.json b/package.json index 94322a19e22..00ad730cb1f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "matrix-react-sdk", - "version": "3.39.0", + "version": "3.39.1", "description": "SDK for matrix.org using React", "author": "matrix.org", "repository": { diff --git a/src/components/views/elements/AppTile.tsx b/src/components/views/elements/AppTile.tsx index 8b61d0d7641..758270344bf 100644 --- a/src/components/views/elements/AppTile.tsx +++ b/src/components/views/elements/AppTile.tsx @@ -179,7 +179,8 @@ export default class AppTile extends React.Component { if (this.props.room.roomId == RoomViewStore.getRoomId()) return; const app = this.props.app; const isActiveWidget = ActiveWidgetStore.instance.getWidgetPersistence(app.id); - if (!isActiveWidget) { + // Stop the widget if it's not the active (persistent) widget and it's not a user widget + if (!isActiveWidget && !this.props.userWidget) { ActiveWidgetStore.instance.destroyPersistentWidget(app.id); PersistedElement.destroyElement(this.persistKey); this.sgWidget?.stopMessaging(); diff --git a/src/components/views/elements/RoomAliasField.tsx b/src/components/views/elements/RoomAliasField.tsx index 8e82f20a095..a8cf278a30c 100644 --- a/src/components/views/elements/RoomAliasField.tsx +++ b/src/components/views/elements/RoomAliasField.tsx @@ -28,6 +28,8 @@ interface IProps { label?: string; placeholder?: string; disabled?: boolean; + // if roomId is passed then the entered alias is checked to point to this roomId, else must be unassigned + roomId?: string; onKeyDown?: KeyboardEventHandler; onChange?(value: string): void; } @@ -165,7 +167,24 @@ export default class RoomAliasField extends React.PureComponent key: "required", test: async ({ value, allowEmpty }) => allowEmpty || !!value, invalid: () => _t("Please provide an address"), - }, { + }, this.props.roomId ? { + key: "matches", + final: true, + test: async ({ value }) => { + if (!value) { + return true; + } + const client = this.context; + try { + const result = await client.getRoomIdForAlias(this.asFullAlias(value)); + return result.room_id === this.props.roomId; + } catch (err) { + console.log(err); + return false; + } + }, + invalid: () => _t("This address does not point at this room"), + } : { key: "taken", final: true, test: async ({ value }) => { diff --git a/src/components/views/right_panel/UserInfo.tsx b/src/components/views/right_panel/UserInfo.tsx index a79e3824011..86c59287216 100644 --- a/src/components/views/right_panel/UserInfo.tsx +++ b/src/components/views/right_panel/UserInfo.tsx @@ -1518,7 +1518,7 @@ export type Member = User | RoomMember | GroupMember; const UserInfoHeader: React.FC<{ member: Member; e2eStatus: E2EStatus; - roomId: string; + roomId?: string; }> = ({ member, e2eStatus, roomId }) => { const cli = useContext(MatrixClientContext); const statusMessage = useUserStatusMessage(member); @@ -1710,7 +1710,7 @@ const UserInfo: React.FC = ({ const header = { scopeHeader } - + ; return { private aliasField = createRef(); - private onAliasAdded = async () => { + private onAliasAdded = async (ev: SyntheticEvent) => { + ev.preventDefault(); await this.aliasField.current.validate({ allowEmpty: false }); if (this.aliasField.current.isValid) { @@ -51,7 +53,7 @@ class EditableAliasesList extends EditableItemList { }; protected renderNewItemField() { - const onChange = (alias) => this.onNewItemChanged({ target: { value: alias } }); + const onChange = (alias: string) => this.onNewItemChanged({ target: { value: alias } }); return (
{ ref={this.aliasField} onChange={onChange} value={this.props.newItem || ""} - domain={this.props.domain} /> + domain={this.props.domain} + roomId={this.props.roomId} + /> { _t("Add") } @@ -360,7 +364,7 @@ export default class AliasSettings extends React.Component { ); - let localAliasesList; + let localAliasesList: JSX.Element; if (this.state.localAliasesLoading) { localAliasesList = ; } else { @@ -428,6 +432,7 @@ export default class AliasSettings extends React.Component { itemsLabel={_t('Other published addresses:')} noItemsLabel={_t('No other published addresses yet, add one below')} placeholder={_t('New published address (e.g. #alias:server)')} + roomId={this.props.roomId} /> o.type === RestrictedAllowType.RoomMembership).map(o => o.room_id) + ? content.allow?.filter(o => o.type === RestrictedAllowType.RoomMembership).map(o => o.room_id) : undefined; const editRestrictedRoomIds = async (): Promise => { diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index f3f38ce8aeb..28a6b07fafb 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -2310,6 +2310,7 @@ "Missing room name or separator e.g. (my-room:domain.org)": "Missing room name or separator e.g. (my-room:domain.org)", "Some characters not allowed": "Some characters not allowed", "Please provide an address": "Please provide an address", + "This address does not point at this room": "This address does not point at this room", "This address is available to use": "This address is available to use", "This address is already in use": "This address is already in use", "This address had invalid server or is already in use": "This address had invalid server or is already in use",