@@ -9,6 +9,7 @@ import { WindowService } from '@theia/core/lib/browser/window/window-service';
9
9
import { FileDialogService } from '@theia/filesystem/lib/browser/file-dialog/file-dialog-service' ;
10
10
import { DisposableCollection } from '@theia/core/lib/common/disposable' ;
11
11
import {
12
+ AdditionalUrls ,
12
13
CompilerWarningLiterals ,
13
14
Network ,
14
15
ProxySettings ,
@@ -35,21 +36,32 @@ export class SettingsComponent extends React.Component<
35
36
if (
36
37
this . state &&
37
38
prevState &&
38
- JSON . stringify ( this . state ) !== JSON . stringify ( prevState )
39
+ JSON . stringify ( SettingsComponent . State . toSettings ( this . state ) ) !==
40
+ JSON . stringify ( SettingsComponent . State . toSettings ( prevState ) )
39
41
) {
40
- this . props . settingsService . update ( this . state , true ) ;
42
+ this . props . settingsService . update (
43
+ SettingsComponent . State . toSettings ( this . state ) ,
44
+ true
45
+ ) ;
41
46
}
42
47
}
43
48
44
49
componentDidMount ( ) : void {
45
50
this . props . settingsService
46
51
. settings ( )
47
- . then ( ( settings ) => this . setState ( settings ) ) ;
48
- this . toDispose . push (
52
+ . then ( ( settings ) =>
53
+ this . setState ( SettingsComponent . State . fromSettings ( settings ) )
54
+ ) ;
55
+ this . toDispose . pushAll ( [
49
56
this . props . settingsService . onDidChange ( ( settings ) =>
50
- this . setState ( settings )
51
- )
52
- ) ;
57
+ this . setState ( ( prevState ) => ( {
58
+ ...SettingsComponent . State . merge ( prevState , settings ) ,
59
+ } ) )
60
+ ) ,
61
+ this . props . settingsService . onDidReset ( ( settings ) =>
62
+ this . setState ( SettingsComponent . State . fromSettings ( settings ) )
63
+ ) ,
64
+ ] ) ;
53
65
}
54
66
55
67
componentWillUnmount ( ) : void {
@@ -290,8 +302,8 @@ export class SettingsComponent extends React.Component<
290
302
< input
291
303
className = "theia-input stretch with-margin"
292
304
type = "text"
293
- value = { this . state . additionalUrls . join ( ',' ) }
294
- onChange = { this . additionalUrlsDidChange }
305
+ value = { this . state . rawAdditionalUrlsValue }
306
+ onChange = { this . rawAdditionalUrlsValueDidChange }
295
307
/>
296
308
< i
297
309
className = "fa fa-window-restore theia-button shrink"
@@ -475,11 +487,11 @@ export class SettingsComponent extends React.Component<
475
487
476
488
protected editAdditionalUrlDidClick = async ( ) : Promise < void > => {
477
489
const additionalUrls = await new AdditionalUrlsDialog (
478
- this . state . additionalUrls ,
490
+ AdditionalUrls . parse ( this . state . rawAdditionalUrlsValue , ',' ) ,
479
491
this . props . windowService
480
492
) . open ( ) ;
481
493
if ( additionalUrls ) {
482
- this . setState ( { additionalUrls } ) ;
494
+ this . setState ( { rawAdditionalUrlsValue : additionalUrls . join ( ',' ) } ) ;
483
495
}
484
496
} ;
485
497
@@ -492,11 +504,11 @@ export class SettingsComponent extends React.Component<
492
504
}
493
505
} ;
494
506
495
- protected additionalUrlsDidChange = (
507
+ protected rawAdditionalUrlsValueDidChange = (
496
508
event : React . ChangeEvent < HTMLInputElement >
497
509
) : void => {
498
510
this . setState ( {
499
- additionalUrls : event . target . value . split ( ',' ) . map ( ( url ) => url . trim ( ) ) ,
511
+ rawAdditionalUrlsValue : event . target . value ,
500
512
} ) ;
501
513
} ;
502
514
@@ -699,5 +711,46 @@ export namespace SettingsComponent {
699
711
readonly windowService : WindowService ;
700
712
readonly localizationProvider : AsyncLocalizationProvider ;
701
713
}
702
- export type State = Settings & { languages : string [ ] } ;
714
+ export type State = Settings & {
715
+ rawAdditionalUrlsValue : string ;
716
+ } ;
717
+ export namespace State {
718
+ export function fromSettings ( settings : Settings ) : State {
719
+ return {
720
+ ...settings ,
721
+ rawAdditionalUrlsValue : settings . additionalUrls . join ( ',' ) ,
722
+ } ;
723
+ }
724
+ export function toSettings ( state : State ) : Settings {
725
+ const parsedAdditionalUrls = AdditionalUrls . parse (
726
+ state . rawAdditionalUrlsValue ,
727
+ ','
728
+ ) ;
729
+ return {
730
+ ...state ,
731
+ additionalUrls : AdditionalUrls . sameAs (
732
+ state . additionalUrls ,
733
+ parsedAdditionalUrls
734
+ )
735
+ ? state . additionalUrls
736
+ : parsedAdditionalUrls ,
737
+ } ;
738
+ }
739
+ export function merge ( prevState : State , settings : Settings ) : State {
740
+ const prevAdditionalUrls = AdditionalUrls . parse (
741
+ prevState . rawAdditionalUrlsValue ,
742
+ ','
743
+ ) ;
744
+ return {
745
+ ...settings ,
746
+ rawAdditionalUrlsValue : prevState . rawAdditionalUrlsValue ,
747
+ additionalUrls : AdditionalUrls . sameAs (
748
+ prevAdditionalUrls ,
749
+ settings . additionalUrls
750
+ )
751
+ ? prevAdditionalUrls
752
+ : settings . additionalUrls ,
753
+ } ;
754
+ }
755
+ }
703
756
}
0 commit comments