5
5
*/
6
6
7
7
import { useContext , useState } from "react" ;
8
+ import CheckBox from "../components/CheckBox" ;
8
9
import { PageWithSubMenu } from "../components/PageWithSubMenu" ;
9
10
import SelectableCard from "../components/SelectableCard" ;
10
11
import Tooltip from "../components/Tooltip" ;
11
12
import vscode from '../images/vscode.svg' ;
13
+ import ideaLogo from '../images/intellijIdeaLogo.svg' ;
14
+ import golandLogo from '../images/golandLogo.svg' ;
12
15
import { getGitpodService } from "../service/service" ;
13
16
import { ThemeContext } from "../theme-context" ;
14
17
import { UserContext } from "../user-context" ;
@@ -19,6 +22,7 @@ type Theme = 'light' | 'dark' | 'system';
19
22
export default function Preferences ( ) {
20
23
const { user } = useContext ( UserContext ) ;
21
24
const { setIsDark } = useContext ( ThemeContext ) ;
25
+
22
26
const [ defaultIde , setDefaultIde ] = useState < string > ( user ?. additionalData ?. ideSettings ?. defaultIde || 'code' ) ;
23
27
const actuallySetDefaultIde = async ( value : string ) => {
24
28
const additionalData = user ?. additionalData || { } ;
@@ -28,6 +32,31 @@ export default function Preferences() {
28
32
await getGitpodService ( ) . server . updateLoggedInUser ( { additionalData } ) ;
29
33
setDefaultIde ( value ) ;
30
34
}
35
+
36
+ const desktopIdeFeatureEnabled = ! ! user ?. rolesOrPermissions ?. includes ( 'admin' ) ;
37
+
38
+ const [ defaultDesktopIde , setDefaultDesktopIde ] = useState < string > ( user ?. additionalData ?. ideSettings ?. defaultDesktopIde || 'intellij' ) ;
39
+ const actuallySetDefaultDesktopIde = async ( value : string ) => {
40
+ const additionalData = user ?. additionalData || { } ;
41
+ const settings = additionalData . ideSettings || { } ;
42
+ settings . defaultDesktopIde = value ;
43
+ additionalData . ideSettings = settings ;
44
+ await getGitpodService ( ) . server . updateLoggedInUser ( { additionalData } ) ;
45
+ setDefaultDesktopIde ( value ) ;
46
+ }
47
+
48
+ const [ useDesktopIde , setUseDesktopIde ] = useState < boolean > ( user ?. additionalData ?. ideSettings ?. useDesktopIde || false ) ;
49
+ const actuallySetUseDesktopIde = async ( value : boolean ) => {
50
+ const additionalData = user ?. additionalData || { } ;
51
+ const settings = additionalData . ideSettings || { } ;
52
+ settings . useDesktopIde = value ;
53
+ // Make sure that default desktop IDE is set even when the user did not explicitly select one.
54
+ settings . defaultDesktopIde = defaultDesktopIde ;
55
+ additionalData . ideSettings = settings ;
56
+ await getGitpodService ( ) . server . updateLoggedInUser ( { additionalData } ) ;
57
+ setUseDesktopIde ( value ) ;
58
+ }
59
+
31
60
const [ theme , setTheme ] = useState < Theme > ( localStorage . theme || 'light' ) ;
32
61
const actuallySetTheme = ( theme : Theme ) => {
33
62
if ( theme === 'dark' || theme === 'system' ) {
@@ -59,6 +88,29 @@ export default function Preferences() {
59
88
</ SelectableCard >
60
89
</ Tooltip >
61
90
</ div >
91
+ { desktopIdeFeatureEnabled &&
92
+ < div className = "mt-4 space-x-4 flex" >
93
+ < CheckBox
94
+ title = "Use Desktop IDE"
95
+ desc = "Choose whether you would like to open your workspace in a desktop IDE instead."
96
+ checked = { useDesktopIde }
97
+ onChange = { ( evt ) => actuallySetUseDesktopIde ( evt . target . checked ) } />
98
+ </ div >
99
+ }
100
+ { desktopIdeFeatureEnabled && useDesktopIde &&
101
+ < div className = "mt-4 space-x-4 flex" >
102
+ < SelectableCard className = "w-36 h-40" title = "IntelliJ IDEA" selected = { defaultDesktopIde === 'intellij' } onClick = { ( ) => actuallySetDefaultDesktopIde ( 'intellij' ) } >
103
+ < div className = "flex justify-center mt-3" >
104
+ < img className = "w-16 filter-grayscale self-center" src = { ideaLogo } />
105
+ </ div >
106
+ </ SelectableCard >
107
+ < SelectableCard className = "w-36 h-40" title = "GoLand" selected = { defaultDesktopIde === 'goland' } onClick = { ( ) => actuallySetDefaultDesktopIde ( 'goland' ) } >
108
+ < div className = "flex justify-center mt-3" >
109
+ < img className = "w-16 filter-grayscale self-center" src = { golandLogo } />
110
+ </ div >
111
+ </ SelectableCard >
112
+ </ div >
113
+ }
62
114
< h3 className = "mt-12" > Theme</ h3 >
63
115
< p className = "text-base text-gray-500" > Early bird or night owl? Choose your side.</ p >
64
116
< div className = "mt-4 space-x-4 flex" >
0 commit comments