4
4
* See License.AGPL.txt in the project root for license information.
5
5
*/
6
6
7
- import { useContext , useEffect , useState } from "react" ;
7
+ import { useCallback , useContext , useEffect , useState } from "react" ;
8
8
import { UserContext } from "../user-context" ;
9
9
import CheckBox from "../components/CheckBox" ;
10
10
import { User } from "@gitpod/gitpod-protocol" ;
@@ -14,7 +14,6 @@ import { useUpdateCurrentUserMutation } from "../data/current-user/update-mutati
14
14
15
15
export type IDEChangedTrackLocation = "workspace_list" | "workspace_start" | "preferences" ;
16
16
interface SelectIDEProps {
17
- updateUserContext ?: boolean ;
18
17
location : IDEChangedTrackLocation ;
19
18
}
20
19
@@ -33,27 +32,44 @@ export default function SelectIDE(props: SelectIDEProps) {
33
32
user ?. additionalData ?. ideSettings ?. useLatestVersion ?? false ,
34
33
) ;
35
34
36
- const actualUpdateUserIDEInfo = async ( selectedIde : string , useLatestVersion : boolean ) => {
37
- const additionalData = user ?. additionalData ?? { } ;
38
- const settings = additionalData . ideSettings ?? { } ;
39
- settings . settingVersion = "2.0" ;
40
- settings . defaultIde = selectedIde ;
41
- settings . useLatestVersion = useLatestVersion ;
42
- additionalData . ideSettings = settings ;
35
+ const actualUpdateUserIDEInfo = useCallback (
36
+ async ( selectedIde : string , useLatestVersion : boolean ) => {
37
+ const additionalData = user ?. additionalData || { } ;
38
+ const ideSettings = additionalData . ideSettings || { } ;
43
39
44
- const newUserData = await updateUser . mutateAsync ( { additionalData } ) ;
45
- props . updateUserContext && setUser ( { ...newUserData } ) ;
46
- } ;
40
+ // Avoid mutating user object in state for updates
41
+ const updates = {
42
+ additionalData : {
43
+ ...additionalData ,
44
+ ideSettings : {
45
+ ...ideSettings ,
46
+ settingVersion : "2.0" ,
47
+ defaultIde : selectedIde ,
48
+ useLatestVersion : useLatestVersion ,
49
+ } ,
50
+ } ,
51
+ } ;
52
+ const newUserData = await updateUser . mutateAsync ( updates ) ;
53
+ setUser ( newUserData ) ;
54
+ } ,
55
+ [ setUser , updateUser , user ?. additionalData ] ,
56
+ ) ;
47
57
48
- const actuallySetDefaultIde = async ( value : string ) => {
49
- await actualUpdateUserIDEInfo ( value , useLatestVersion ) ;
50
- setDefaultIde ( value ) ;
51
- } ;
58
+ const actuallySetDefaultIde = useCallback (
59
+ async ( value : string ) => {
60
+ await actualUpdateUserIDEInfo ( value , useLatestVersion ) ;
61
+ setDefaultIde ( value ) ;
62
+ } ,
63
+ [ actualUpdateUserIDEInfo , useLatestVersion ] ,
64
+ ) ;
52
65
53
- const actuallySetUseLatestVersion = async ( value : boolean ) => {
54
- await actualUpdateUserIDEInfo ( defaultIde , value ) ;
55
- setUseLatestVersion ( value ) ;
56
- } ;
66
+ const actuallySetUseLatestVersion = useCallback (
67
+ async ( value : boolean ) => {
68
+ await actualUpdateUserIDEInfo ( defaultIde , value ) ;
69
+ setUseLatestVersion ( value ) ;
70
+ } ,
71
+ [ actualUpdateUserIDEInfo , defaultIde ] ,
72
+ ) ;
57
73
58
74
//todo(ft): find a better way to group IDEs by vendor
59
75
const shouldShowJetbrainsNotice = ! [ "code" , "code-desktop" ] . includes ( defaultIde ) ; // a really hacky way to get just JetBrains IDEs
@@ -62,9 +78,7 @@ export default function SelectIDE(props: SelectIDEProps) {
62
78
< >
63
79
< div className = "w-112 my-4" >
64
80
< SelectIDEComponent
65
- onSelectionChange = { async ( ide ) => {
66
- await actuallySetDefaultIde ( ide ) ;
67
- } }
81
+ onSelectionChange = { actuallySetDefaultIde }
68
82
selectedIdeOption = { defaultIde }
69
83
useLatest = { useLatestVersion }
70
84
/>
0 commit comments