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

Commit ebf7eb6

Browse files
committed
Turn RoomAliasField into properly controlled and use in RoomSettings
1 parent 115e773 commit ebf7eb6

File tree

3 files changed

+30
-5
lines changed

3 files changed

+30
-5
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: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,38 @@ 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 onSubmit={this._onItemAdded} autoComplete="off"
36+
noValidate={true} className="mx_EditableItemList_newItem">
37+
<RoomAliasField
38+
id={`mx_EditableItemList_new_${this.props.id}`}
39+
onChange={onChange}
40+
value={this.props.newItem || ""}
41+
domain={this.props.domain} />
42+
<AccessibleButton onClick={this._onItemAdded} kind="primary">
43+
{_t("Add")}
44+
</AccessibleButton>
45+
</form>
46+
);
47+
}
48+
}
49+
2750
export default class AliasSettings extends React.Component {
2851
static propTypes = {
2952
roomId: PropTypes.string.isRequired,
@@ -47,7 +70,6 @@ export default class AliasSettings extends React.Component {
4770
remoteDomains: [], // [ domain.com, foobar.com ]
4871
canonicalAlias: null, // #canonical:domain.com
4972
updatingCanonicalAlias: false,
50-
newItem: "",
5173
};
5274

5375
const localDomain = MatrixClientPeg.get().getDomain();
@@ -181,7 +203,6 @@ export default class AliasSettings extends React.Component {
181203
};
182204

183205
render() {
184-
const EditableItemList = sdk.getComponent("elements.EditableItemList");
185206
const localDomain = MatrixClientPeg.get().getDomain();
186207

187208
let found = false;
@@ -233,7 +254,7 @@ export default class AliasSettings extends React.Component {
233254
return (
234255
<div className='mx_AliasSettings'>
235256
{canonicalAliasSection}
236-
<EditableItemList
257+
<EditableAliasesList
237258
id="roomAliases"
238259
className={"mx_RoomSettings_localAliases"}
239260
items={this.state.domainToAliases[localDomain] || []}
@@ -248,6 +269,7 @@ export default class AliasSettings extends React.Component {
248269
placeholder={_t(
249270
'New address (e.g. #foo:%(localDomain)s)', {localDomain: localDomain},
250271
)}
272+
domain={localDomain}
251273
/>
252274
{remoteAliasesSection}
253275
</div>

0 commit comments

Comments
 (0)