Skip to content
This repository was archived by the owner on Sep 11, 2024. It is now read-only.

Commit e9658a9

Browse files
authored
Merge pull request #3782 from matrix-org/t3chguy/room_settings_alias_input
Turn RoomAliasField into properly controlled and use in RoomSettings
2 parents eac66f0 + aa99046 commit e9658a9

File tree

4 files changed

+35
-6
lines changed

4 files changed

+35
-6
lines changed

src/components/views/dialogs/CreateRoomDialog.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ export default createReactClass({
173173
const domain = MatrixClientPeg.get().getDomain();
174174
aliasField = (
175175
<div className="mx_CreateRoomDialog_aliasContainer">
176-
<RoomAliasField id="alias" ref={ref => this._aliasFieldRef = ref} onChange={this.onAliasChange} domain={domain} />
176+
<RoomAliasField id="alias" ref={ref => this._aliasFieldRef = ref} onChange={this.onAliasChange} domain={domain} value={this.state.alias} />
177177
</div>
178178
);
179179
} else {

src/components/views/elements/RoomAliasField.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,13 @@ import sdk from '../../../index';
2020
import withValidation from './Validation';
2121
import MatrixClientPeg from '../../../MatrixClientPeg';
2222

23+
// Controlled form component wrapping Field for inputting a room alias scoped to a given domain
2324
export default class RoomAliasField extends React.PureComponent {
2425
static propTypes = {
2526
id: PropTypes.string.isRequired,
2627
domain: PropTypes.string.isRequired,
2728
onChange: PropTypes.func,
29+
value: PropTypes.string.isRequired,
2830
};
2931

3032
constructor(props) {
@@ -53,6 +55,7 @@ export default class RoomAliasField extends React.PureComponent {
5355
onValidate={this._onValidate}
5456
placeholder={_t("e.g. my-room")}
5557
onChange={this._onChange}
58+
value={this.props.value.substring(1, this.props.value.length - this.props.domain.length - 1)}
5659
maxLength={maxlength} />
5760
);
5861
}
@@ -61,7 +64,7 @@ export default class RoomAliasField extends React.PureComponent {
6164
if (this.props.onChange) {
6265
this.props.onChange(this._asFullAlias(ev.target.value));
6366
}
64-
}
67+
};
6568

6669
_onValidate = async (fieldState) => {
6770
const result = await this._validationRules(fieldState);

src/components/views/room_settings/AliasSettings.js

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,42 @@ See the License for the specific language governing permissions and
1515
limitations under the License.
1616
*/
1717

18+
import EditableItemList from "../elements/EditableItemList";
19+
1820
const React = require('react');
1921
import PropTypes from 'prop-types';
2022
const MatrixClientPeg = require('../../../MatrixClientPeg');
2123
const sdk = require("../../../index");
2224
import { _t } from '../../../languageHandler';
2325
import Field from "../elements/Field";
2426
import ErrorDialog from "../dialogs/ErrorDialog";
27+
import AccessibleButton from "../elements/AccessibleButton";
2528
const Modal = require("../../../Modal");
2629

30+
class EditableAliasesList extends EditableItemList {
31+
_renderNewItemField() {
32+
const RoomAliasField = sdk.getComponent('views.elements.RoomAliasField');
33+
const onChange = (alias) => this._onNewItemChanged({target: {value: alias}});
34+
return (
35+
<form
36+
onSubmit={this._onItemAdded}
37+
autoComplete="off"
38+
noValidate={true}
39+
className="mx_EditableItemList_newItem"
40+
>
41+
<RoomAliasField
42+
id={`mx_EditableItemList_new_${this.props.id}`}
43+
onChange={onChange}
44+
value={this.props.newItem || ""}
45+
domain={this.props.domain} />
46+
<AccessibleButton onClick={this._onItemAdded} kind="primary">
47+
{ _t("Add") }
48+
</AccessibleButton>
49+
</form>
50+
);
51+
}
52+
}
53+
2754
export default class AliasSettings extends React.Component {
2855
static propTypes = {
2956
roomId: PropTypes.string.isRequired,
@@ -47,7 +74,6 @@ export default class AliasSettings extends React.Component {
4774
remoteDomains: [], // [ domain.com, foobar.com ]
4875
canonicalAlias: null, // #canonical:domain.com
4976
updatingCanonicalAlias: false,
50-
newItem: "",
5177
};
5278

5379
const localDomain = MatrixClientPeg.get().getDomain();
@@ -181,7 +207,6 @@ export default class AliasSettings extends React.Component {
181207
};
182208

183209
render() {
184-
const EditableItemList = sdk.getComponent("elements.EditableItemList");
185210
const localDomain = MatrixClientPeg.get().getDomain();
186211

187212
let found = false;
@@ -233,7 +258,7 @@ export default class AliasSettings extends React.Component {
233258
return (
234259
<div className='mx_AliasSettings'>
235260
{canonicalAliasSection}
236-
<EditableItemList
261+
<EditableAliasesList
237262
id="roomAliases"
238263
className={"mx_RoomSettings_localAliases"}
239264
items={this.state.domainToAliases[localDomain] || []}
@@ -248,6 +273,7 @@ export default class AliasSettings extends React.Component {
248273
placeholder={_t(
249274
'New address (e.g. #foo:%(localDomain)s)', {localDomain: localDomain},
250275
)}
276+
domain={localDomain}
251277
/>
252278
{remoteAliasesSection}
253279
</div>

test/end-to-end-tests/src/usecases/room-settings.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ module.exports = async function changeRoomSettings(session, settings) {
5252
if (settings.alias) {
5353
session.log.step(`sets alias to ${settings.alias}`);
5454
const aliasField = await session.query(".mx_RoomSettingsDialog .mx_AliasSettings input[type=text]");
55-
await session.replaceInputText(aliasField, settings.alias);
55+
await session.replaceInputText(aliasField, settings.alias.substring(1, settings.alias.lastIndexOf(":")));
5656
const addButton = await session.query(".mx_RoomSettingsDialog .mx_AliasSettings .mx_AccessibleButton");
5757
await addButton.click();
5858
session.log.done();

0 commit comments

Comments
 (0)