@@ -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,13 @@ 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 ( {
495
+ rawAdditionalUrlsValue : AdditionalUrls . stringify ( additionalUrls ) ,
496
+ } ) ;
483
497
}
484
498
} ;
485
499
@@ -492,11 +506,11 @@ export class SettingsComponent extends React.Component<
492
506
}
493
507
} ;
494
508
495
- protected additionalUrlsDidChange = (
509
+ protected rawAdditionalUrlsValueDidChange = (
496
510
event : React . ChangeEvent < HTMLInputElement >
497
511
) : void => {
498
512
this . setState ( {
499
- additionalUrls : event . target . value . split ( ',' ) . map ( ( url ) => url . trim ( ) ) ,
513
+ rawAdditionalUrlsValue : event . target . value ,
500
514
} ) ;
501
515
} ;
502
516
@@ -699,5 +713,48 @@ export namespace SettingsComponent {
699
713
readonly windowService : WindowService ;
700
714
readonly localizationProvider : AsyncLocalizationProvider ;
701
715
}
702
- export type State = Settings & { languages : string [ ] } ;
716
+ export type State = Settings & {
717
+ rawAdditionalUrlsValue : string ;
718
+ } ;
719
+ export namespace State {
720
+ export function fromSettings ( settings : Settings ) : State {
721
+ return {
722
+ ...settings ,
723
+ rawAdditionalUrlsValue : AdditionalUrls . stringify (
724
+ settings . additionalUrls
725
+ ) ,
726
+ } ;
727
+ }
728
+ export function toSettings ( state : State ) : Settings {
729
+ const parsedAdditionalUrls = AdditionalUrls . parse (
730
+ state . rawAdditionalUrlsValue ,
731
+ ','
732
+ ) ;
733
+ return {
734
+ ...state ,
735
+ additionalUrls : AdditionalUrls . sameAs (
736
+ state . additionalUrls ,
737
+ parsedAdditionalUrls
738
+ )
739
+ ? state . additionalUrls
740
+ : parsedAdditionalUrls ,
741
+ } ;
742
+ }
743
+ export function merge ( prevState : State , settings : Settings ) : State {
744
+ const prevAdditionalUrls = AdditionalUrls . parse (
745
+ prevState . rawAdditionalUrlsValue ,
746
+ ','
747
+ ) ;
748
+ return {
749
+ ...settings ,
750
+ rawAdditionalUrlsValue : prevState . rawAdditionalUrlsValue ,
751
+ additionalUrls : AdditionalUrls . sameAs (
752
+ prevAdditionalUrls ,
753
+ settings . additionalUrls
754
+ )
755
+ ? prevAdditionalUrls
756
+ : settings . additionalUrls ,
757
+ } ;
758
+ }
759
+ }
703
760
}
0 commit comments