mirror of https://github.com/vector-im/riot-web
Turn RoomAliasField into properly controlled and use in RoomSettings
parent
115e773317
commit
ebf7eb698d
|
@ -173,7 +173,7 @@ export default createReactClass({
|
||||||
const domain = MatrixClientPeg.get().getDomain();
|
const domain = MatrixClientPeg.get().getDomain();
|
||||||
aliasField = (
|
aliasField = (
|
||||||
<div className="mx_CreateRoomDialog_aliasContainer">
|
<div className="mx_CreateRoomDialog_aliasContainer">
|
||||||
<RoomAliasField id="alias" ref={ref => this._aliasFieldRef = ref} onChange={this.onAliasChange} domain={domain} />
|
<RoomAliasField id="alias" ref={ref => this._aliasFieldRef = ref} onChange={this.onAliasChange} domain={domain} value={this.state.alias} />
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -20,11 +20,13 @@ import sdk from '../../../index';
|
||||||
import withValidation from './Validation';
|
import withValidation from './Validation';
|
||||||
import MatrixClientPeg from '../../../MatrixClientPeg';
|
import MatrixClientPeg from '../../../MatrixClientPeg';
|
||||||
|
|
||||||
|
// Controlled form component wrapping Field for inputting a room alias scoped to a given domain
|
||||||
export default class RoomAliasField extends React.PureComponent {
|
export default class RoomAliasField extends React.PureComponent {
|
||||||
static propTypes = {
|
static propTypes = {
|
||||||
id: PropTypes.string.isRequired,
|
id: PropTypes.string.isRequired,
|
||||||
domain: PropTypes.string.isRequired,
|
domain: PropTypes.string.isRequired,
|
||||||
onChange: PropTypes.func,
|
onChange: PropTypes.func,
|
||||||
|
value: PropTypes.string.isRequired,
|
||||||
};
|
};
|
||||||
|
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
|
@ -53,6 +55,7 @@ export default class RoomAliasField extends React.PureComponent {
|
||||||
onValidate={this._onValidate}
|
onValidate={this._onValidate}
|
||||||
placeholder={_t("e.g. my-room")}
|
placeholder={_t("e.g. my-room")}
|
||||||
onChange={this._onChange}
|
onChange={this._onChange}
|
||||||
|
value={this.props.value.substring(1, this.props.value.length - this.props.domain.length - 1)}
|
||||||
maxLength={maxlength} />
|
maxLength={maxlength} />
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -61,7 +64,7 @@ export default class RoomAliasField extends React.PureComponent {
|
||||||
if (this.props.onChange) {
|
if (this.props.onChange) {
|
||||||
this.props.onChange(this._asFullAlias(ev.target.value));
|
this.props.onChange(this._asFullAlias(ev.target.value));
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
_onValidate = async (fieldState) => {
|
_onValidate = async (fieldState) => {
|
||||||
const result = await this._validationRules(fieldState);
|
const result = await this._validationRules(fieldState);
|
||||||
|
|
|
@ -15,6 +15,8 @@ See the License for the specific language governing permissions and
|
||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import EditableItemList from "../elements/EditableItemList";
|
||||||
|
|
||||||
const React = require('react');
|
const React = require('react');
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
const MatrixClientPeg = require('../../../MatrixClientPeg');
|
const MatrixClientPeg = require('../../../MatrixClientPeg');
|
||||||
|
@ -22,8 +24,29 @@ const sdk = require("../../../index");
|
||||||
import { _t } from '../../../languageHandler';
|
import { _t } from '../../../languageHandler';
|
||||||
import Field from "../elements/Field";
|
import Field from "../elements/Field";
|
||||||
import ErrorDialog from "../dialogs/ErrorDialog";
|
import ErrorDialog from "../dialogs/ErrorDialog";
|
||||||
|
import AccessibleButton from "../elements/AccessibleButton";
|
||||||
const Modal = require("../../../Modal");
|
const Modal = require("../../../Modal");
|
||||||
|
|
||||||
|
class EditableAliasesList extends EditableItemList {
|
||||||
|
_renderNewItemField() {
|
||||||
|
const RoomAliasField = sdk.getComponent('views.elements.RoomAliasField');
|
||||||
|
const onChange = (alias) => this._onNewItemChanged({target: {value: alias}});
|
||||||
|
return (
|
||||||
|
<form onSubmit={this._onItemAdded} autoComplete="off"
|
||||||
|
noValidate={true} className="mx_EditableItemList_newItem">
|
||||||
|
<RoomAliasField
|
||||||
|
id={`mx_EditableItemList_new_${this.props.id}`}
|
||||||
|
onChange={onChange}
|
||||||
|
value={this.props.newItem || ""}
|
||||||
|
domain={this.props.domain} />
|
||||||
|
<AccessibleButton onClick={this._onItemAdded} kind="primary">
|
||||||
|
{_t("Add")}
|
||||||
|
</AccessibleButton>
|
||||||
|
</form>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export default class AliasSettings extends React.Component {
|
export default class AliasSettings extends React.Component {
|
||||||
static propTypes = {
|
static propTypes = {
|
||||||
roomId: PropTypes.string.isRequired,
|
roomId: PropTypes.string.isRequired,
|
||||||
|
@ -47,7 +70,6 @@ export default class AliasSettings extends React.Component {
|
||||||
remoteDomains: [], // [ domain.com, foobar.com ]
|
remoteDomains: [], // [ domain.com, foobar.com ]
|
||||||
canonicalAlias: null, // #canonical:domain.com
|
canonicalAlias: null, // #canonical:domain.com
|
||||||
updatingCanonicalAlias: false,
|
updatingCanonicalAlias: false,
|
||||||
newItem: "",
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const localDomain = MatrixClientPeg.get().getDomain();
|
const localDomain = MatrixClientPeg.get().getDomain();
|
||||||
|
@ -181,7 +203,6 @@ export default class AliasSettings extends React.Component {
|
||||||
};
|
};
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const EditableItemList = sdk.getComponent("elements.EditableItemList");
|
|
||||||
const localDomain = MatrixClientPeg.get().getDomain();
|
const localDomain = MatrixClientPeg.get().getDomain();
|
||||||
|
|
||||||
let found = false;
|
let found = false;
|
||||||
|
@ -233,7 +254,7 @@ export default class AliasSettings extends React.Component {
|
||||||
return (
|
return (
|
||||||
<div className='mx_AliasSettings'>
|
<div className='mx_AliasSettings'>
|
||||||
{canonicalAliasSection}
|
{canonicalAliasSection}
|
||||||
<EditableItemList
|
<EditableAliasesList
|
||||||
id="roomAliases"
|
id="roomAliases"
|
||||||
className={"mx_RoomSettings_localAliases"}
|
className={"mx_RoomSettings_localAliases"}
|
||||||
items={this.state.domainToAliases[localDomain] || []}
|
items={this.state.domainToAliases[localDomain] || []}
|
||||||
|
@ -248,6 +269,7 @@ export default class AliasSettings extends React.Component {
|
||||||
placeholder={_t(
|
placeholder={_t(
|
||||||
'New address (e.g. #foo:%(localDomain)s)', {localDomain: localDomain},
|
'New address (e.g. #foo:%(localDomain)s)', {localDomain: localDomain},
|
||||||
)}
|
)}
|
||||||
|
domain={localDomain}
|
||||||
/>
|
/>
|
||||||
{remoteAliasesSection}
|
{remoteAliasesSection}
|
||||||
</div>
|
</div>
|
||||||
|
|
Loading…
Reference in New Issue