@@ -136,56 +136,56 @@ module.exports = React.createClass({
136
136
return ObjectUtils . getKeyValueArrayDiffs ( oldAliases , this . state . domainToAliases ) ;
137
137
} ,
138
138
139
- onAliasAdded : function ( alias ) {
139
+ onNewAliasChanged : function ( value ) {
140
+ this . setState ( { newAlias : value } ) ;
141
+ } ,
142
+
143
+ onLocalAliasAdded : function ( alias ) {
140
144
if ( ! alias || alias . length === 0 ) return ; // ignore attempts to create blank aliases
141
145
142
- if ( this . isAliasValid ( alias ) ) {
143
- // add this alias to the domain to aliases dict
144
- var domain = alias . replace ( / ^ .* ?: / , '' ) ;
145
- // XXX: do we need to deep copy aliases before editing it?
146
- this . state . domainToAliases [ domain ] = this . state . domainToAliases [ domain ] || [ ] ;
147
- this . state . domainToAliases [ domain ] . push ( alias ) ;
146
+ const localDomain = MatrixClientPeg . get ( ) . getDomain ( ) ;
147
+ if ( this . isAliasValid ( alias ) && alias . endsWith ( localDomain ) ) {
148
+ this . state . domainToAliases [ localDomain ] = this . state . domainToAliases [ localDomain ] || [ ] ;
149
+ this . state . domainToAliases [ localDomain ] . push ( alias ) ;
150
+
148
151
this . setState ( {
149
- domainToAliases : this . state . domainToAliases
152
+ domainToAliases : this . state . domainToAliases ,
153
+ // Reset the add field
154
+ newAlias : "" ,
150
155
} ) ;
151
-
152
- // reset the add field
153
- this . refs . add_alias . setValue ( '' ) ; // FIXME
154
- }
155
- else {
156
- var ErrorDialog = sdk . getComponent ( "dialogs.ErrorDialog" ) ;
156
+ } else {
157
+ const ErrorDialog = sdk . getComponent ( "dialogs.ErrorDialog" ) ;
157
158
Modal . createTrackedDialog ( 'Invalid alias format' , '' , ErrorDialog , {
158
159
title : _t ( 'Invalid alias format' ) ,
159
160
description : _t ( '\'%(alias)s\' is not a valid format for an alias' , { alias : alias } ) ,
160
161
} ) ;
161
162
}
162
163
} ,
163
164
164
- onAliasChanged : function ( domain , index , alias ) {
165
+ onLocalAliasChanged : function ( alias , index ) {
165
166
if ( alias === "" ) return ; // hit the delete button to delete please
166
- var oldAlias ;
167
- if ( this . isAliasValid ( alias ) ) {
168
- oldAlias = this . state . domainToAliases [ domain ] [ index ] ;
169
- this . state . domainToAliases [ domain ] [ index ] = alias ;
170
- }
171
- else {
172
- var ErrorDialog = sdk . getComponent ( "dialogs.ErrorDialog" ) ;
167
+ const localDomain = MatrixClientPeg . get ( ) . getDomain ( ) ;
168
+ if ( this . isAliasValid ( alias ) && alias . endsWith ( localDomain ) ) {
169
+ this . state . domainToAliases [ localDomain ] [ index ] = alias ;
170
+ } else {
171
+ const ErrorDialog = sdk . getComponent ( "dialogs.ErrorDialog" ) ;
173
172
Modal . createTrackedDialog ( 'Invalid address format' , '' , ErrorDialog , {
174
173
title : _t ( 'Invalid address format' ) ,
175
174
description : _t ( '\'%(alias)s\' is not a valid format for an address' , { alias : alias } ) ,
176
175
} ) ;
177
176
}
178
177
} ,
179
178
180
- onAliasDeleted : function ( domain , index ) {
179
+ onLocalAliasDeleted : function ( index ) {
180
+ const localDomain = MatrixClientPeg . get ( ) . getDomain ( ) ;
181
181
// It's a bit naughty to directly manipulate this.state, and React would
182
182
// normally whine at you, but it can't see us doing the splice. Given we
183
183
// promptly setState anyway, it's just about acceptable. The alternative
184
184
// would be to arbitrarily deepcopy to a temp variable and then setState
185
185
// that, but why bother when we can cut this corner.
186
- var alias = this . state . domainToAliases [ domain ] . splice ( index , 1 ) ;
186
+ this . state . domainToAliases [ localDomain ] . splice ( index , 1 ) ;
187
187
this . setState ( {
188
- domainToAliases : this . state . domainToAliases
188
+ domainToAliases : this . state . domainToAliases ,
189
189
} ) ;
190
190
} ,
191
191
@@ -198,6 +198,7 @@ module.exports = React.createClass({
198
198
render : function ( ) {
199
199
var self = this ;
200
200
var EditableText = sdk . getComponent ( "elements.EditableText" ) ;
201
+ var EditableItemList = sdk . getComponent ( "elements.EditableItemList" ) ;
201
202
var localDomain = MatrixClientPeg . get ( ) . getDomain ( ) ;
202
203
203
204
var canonical_alias_section ;
@@ -257,58 +258,24 @@ module.exports = React.createClass({
257
258
< div className = "mx_RoomSettings_aliasLabel" >
258
259
{ _t ( 'The main address for this room is' ) } : { canonical_alias_section }
259
260
</ div >
260
- < div className = "mx_RoomSettings_aliasLabel" >
261
- { ( this . state . domainToAliases [ localDomain ] &&
262
- this . state . domainToAliases [ localDomain ] . length > 0 )
263
- ? _t ( 'Local addresses for this room:' )
264
- : _t ( 'This room has no local addresses' ) }
265
- </ div >
266
- < div className = "mx_RoomSettings_aliasesTable" >
267
- { ( this . state . domainToAliases [ localDomain ] || [ ] ) . map ( ( alias , i ) => {
268
- var deleteButton ;
269
- if ( this . props . canSetAliases ) {
270
- deleteButton = (
271
- < img src = "img/cancel-small.svg" width = "14" height = "14"
272
- alt = { _t ( 'Delete' ) } onClick = { self . onAliasDeleted . bind ( self , localDomain , i ) } />
273
- ) ;
274
- }
275
- return (
276
- < div className = "mx_RoomSettings_aliasesTableRow" key = { i } >
277
- < EditableText
278
- className = "mx_RoomSettings_alias mx_RoomSettings_editable"
279
- placeholderClassName = "mx_RoomSettings_aliasPlaceholder"
280
- placeholder = { _t ( 'New address (e.g. #foo:%(localDomain)s)' , { localDomain : localDomain } ) }
281
- blurToCancel = { false }
282
- onValueChanged = { self . onAliasChanged . bind ( self , localDomain , i ) }
283
- editable = { self . props . canSetAliases }
284
- initialValue = { alias } />
285
- < div className = "mx_RoomSettings_deleteAlias mx_filterFlipColor" >
286
- { deleteButton }
287
- </ div >
288
- </ div >
289
- ) ;
290
- } ) }
291
-
292
- { this . props . canSetAliases ?
293
- < div className = "mx_RoomSettings_aliasesTableRow" key = "new" >
294
- < EditableText
295
- ref = "add_alias"
296
- className = "mx_RoomSettings_alias mx_RoomSettings_editable"
297
- placeholderClassName = "mx_RoomSettings_aliasPlaceholder"
298
- placeholder = { _t ( 'New address (e.g. #foo:%(localDomain)s)' , { localDomain : localDomain } ) }
299
- blurToCancel = { false }
300
- onValueChanged = { self . onAliasAdded } />
301
- < div className = "mx_RoomSettings_addAlias mx_filterFlipColor" >
302
- < img src = "img/plus.svg" width = "14" height = "14" alt = { _t ( "Add" ) }
303
- onClick = { self . onAliasAdded . bind ( self , undefined ) } />
304
- </ div >
305
- </ div > : ""
306
- }
307
- </ div >
261
+ < EditableItemList
262
+ className = { "mx_RoomSettings_localAliases" }
263
+ items = { this . state . domainToAliases [ localDomain ] || [ ] }
264
+ newItem = { this . state . newAlias }
265
+ onNewItemChanged = { this . onNewAliasChanged }
266
+ onItemAdded = { this . onLocalAliasAdded }
267
+ onItemEdited = { this . onLocalAliasChanged }
268
+ onItemRemoved = { this . onLocalAliasDeleted }
269
+ itemsLabel = { _t ( 'Local addresses for this room:' ) }
270
+ noItemsLabel = { _t ( 'This room has no local addresses' ) }
271
+ placeholder = { _t (
272
+ 'New address (e.g. #foo:%(localDomain)s)' , { localDomain : localDomain } ,
273
+ ) }
274
+ />
308
275
309
276
{ remote_aliases_section }
310
277
311
278
</ div >
312
279
) ;
313
- }
280
+ } ,
314
281
} ) ;
0 commit comments