4
4
* See License.AGPL.txt in the project root for license information.
5
5
*/
6
6
7
- import { useContext , useState } from "react" ;
7
+ import { useCallback , useContext , useEffect , useState } from "react" ;
8
8
import { getGitpodService } from "../service/service" ;
9
9
import { UserContext } from "../user-context" ;
10
10
import { trackEvent } from "../Analytics" ;
11
11
import SelectIDE from "./SelectIDE" ;
12
12
import { PageWithSettingsSubMenu } from "./PageWithSettingsSubMenu" ;
13
13
import { ThemeSelector } from "../components/ThemeSelector" ;
14
- import CheckBox from "../components/CheckBox " ;
15
- import { WorkspaceTimeoutDuration } from "@gitpod/gitpod-protocol " ;
14
+ import Alert from "../components/Alert " ;
15
+ import { Link } from "react-router-dom " ;
16
16
17
17
export default function Preferences ( ) {
18
18
const { user } = useContext ( UserContext ) ;
@@ -31,31 +31,21 @@ export default function Preferences() {
31
31
}
32
32
} ;
33
33
34
- const [ disabledClosedTimeout , setDisabledClosedTimeout ] = useState < boolean > (
35
- user ?. additionalData ?. disabledClosedTimeout ?? false ,
36
- ) ;
37
- const actuallySetDisabledClosedTimeout = async ( value : boolean ) => {
38
- try {
39
- const additionalData = user ?. additionalData || { } ;
40
- additionalData . disabledClosedTimeout = value ;
41
- await getGitpodService ( ) . server . updateLoggedInUser ( { additionalData } ) ;
42
- setDisabledClosedTimeout ( value ) ;
43
- } catch ( e ) {
44
- alert ( "Cannot set custom workspace timeout: " + e . message ) ;
45
- }
46
- } ;
47
-
48
34
const [ workspaceTimeout , setWorkspaceTimeout ] = useState < string > ( user ?. additionalData ?. workspaceTimeout ?? "" ) ;
49
- const actuallySetWorkspaceTimeout = async ( value : string ) => {
35
+ const actuallySetWorkspaceTimeout = useCallback ( async ( value : string ) => {
50
36
try {
51
- const timeout = WorkspaceTimeoutDuration . validate ( value ) ;
52
- const additionalData = user ?. additionalData || { } ;
53
- additionalData . workspaceTimeout = timeout ;
54
- await getGitpodService ( ) . server . updateLoggedInUser ( { additionalData } ) ;
37
+ await getGitpodService ( ) . server . updateWorkspaceTimeoutSetting ( { workspaceTimeout : value } ) ;
55
38
} catch ( e ) {
56
39
alert ( "Cannot set custom workspace timeout: " + e . message ) ;
57
40
}
58
- } ;
41
+ } , [ ] ) ;
42
+
43
+ const [ allowConfigureWorkspaceTimeout , setAllowConfigureWorkspaceTimeout ] = useState < boolean > ( false ) ;
44
+ useEffect ( ( ) => {
45
+ getGitpodService ( )
46
+ . server . supportConfigureWorkspaceTimeout ( )
47
+ . then ( ( r ) => setAllowConfigureWorkspaceTimeout ( r ) ) ;
48
+ } , [ ] ) ;
59
49
60
50
return (
61
51
< div >
@@ -103,38 +93,44 @@ export default function Preferences() {
103
93
104
94
< h3 className = "mt-12" > Inactivity Timeout </ h3 >
105
95
< p className = "text-base text-gray-500 dark:text-gray-400" >
106
- By default, workspaces stop following 30 minutes without user input (e.g. keystrokes or terminal
107
- input commands). You can increase the workspace timeout up to a maximum of 24 hours.
96
+ Workspaces will stop after a period of inactivity without any user input.
108
97
</ p >
109
98
< div className = "mt-4 max-w-xl" >
110
- < h4 > Default Inactivity Timeout</ h4 >
111
- < span className = "flex" >
112
- < input
113
- type = "text"
114
- className = "w-96 h-9"
115
- value = { workspaceTimeout }
116
- placeholder = "timeout time, such as 30m, 1h, max 24h"
117
- onChange = { ( e ) => setWorkspaceTimeout ( e . target . value ) }
118
- />
119
- < button
120
- className = "secondary ml-2"
121
- onClick = { ( ) => actuallySetWorkspaceTimeout ( workspaceTimeout ) }
122
- >
123
- Save Changes
124
- </ button >
125
- </ span >
126
- < div className = "mt-1" >
127
- < p className = "text-gray-500 dark:text-gray-400" >
128
- Use minutes or hours, like < strong > 30m</ strong > or < strong > 2h</ strong > .
129
- </ p >
130
- </ div >
99
+ < h4 > Default Workspace Timeout</ h4 >
100
+
101
+ { ! allowConfigureWorkspaceTimeout && (
102
+ < Alert type = "message" >
103
+ Upgrade organization < Link to = "/billing" > billing</ Link > plan to use a custom inactivity
104
+ timeout.
105
+ </ Alert >
106
+ ) }
131
107
132
- < CheckBox
133
- title = "Stop workspace when no active editor connection"
134
- desc = { < span > Don't change workspace inactivity timeout when closing the editor.</ span > }
135
- checked = { disabledClosedTimeout }
136
- onChange = { ( e ) => actuallySetDisabledClosedTimeout ( e . target . checked ) }
137
- />
108
+ { allowConfigureWorkspaceTimeout && (
109
+ < >
110
+ < span className = "flex mt-2" >
111
+ < input
112
+ type = "text"
113
+ className = "w-96 h-9"
114
+ value = { workspaceTimeout }
115
+ disabled = { ! allowConfigureWorkspaceTimeout }
116
+ placeholder = "e.g. 30m"
117
+ onChange = { ( e ) => setWorkspaceTimeout ( e . target . value ) }
118
+ />
119
+ < button
120
+ className = "secondary ml-2"
121
+ disabled = { ! allowConfigureWorkspaceTimeout }
122
+ onClick = { ( ) => actuallySetWorkspaceTimeout ( workspaceTimeout ) }
123
+ >
124
+ Save Changes
125
+ </ button >
126
+ </ span >
127
+ < div className = "mt-1" >
128
+ < p className = "text-gray-500 dark:text-gray-400" >
129
+ Use minutes or hours, like < strong > 30m</ strong > or < strong > 2h</ strong > .
130
+ </ p >
131
+ </ div >
132
+ </ >
133
+ ) }
138
134
</ div >
139
135
</ PageWithSettingsSubMenu >
140
136
</ div >
0 commit comments