44 * See License.AGPL.txt in the project root for license information.
55 */
66
7- import { useContext , useEffect , useState } from "react" ;
7+ import { useCallback , useContext , useEffect , useState } from "react" ;
88import { UserContext } from "../user-context" ;
99import CheckBox from "../components/CheckBox" ;
1010import { User } from "@gitpod/gitpod-protocol" ;
@@ -14,7 +14,6 @@ import { useUpdateCurrentUserMutation } from "../data/current-user/update-mutati
1414
1515export type IDEChangedTrackLocation = "workspace_list" | "workspace_start" | "preferences" ;
1616interface SelectIDEProps {
17- updateUserContext ?: boolean ;
1817 location : IDEChangedTrackLocation ;
1918}
2019
@@ -33,27 +32,44 @@ export default function SelectIDE(props: SelectIDEProps) {
3332 user ?. additionalData ?. ideSettings ?. useLatestVersion ?? false ,
3433 ) ;
3534
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 || { } ;
4339
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+ ) ;
4757
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+ ) ;
5265
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+ ) ;
5773
5874 //todo(ft): find a better way to group IDEs by vendor
5975 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) {
6278 < >
6379 < div className = "w-112 my-4" >
6480 < SelectIDEComponent
65- onSelectionChange = { async ( ide ) => {
66- await actuallySetDefaultIde ( ide ) ;
67- } }
81+ onSelectionChange = { actuallySetDefaultIde }
6882 selectedIdeOption = { defaultIde }
6983 useLatest = { useLatestVersion }
7084 />
0 commit comments