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 { 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" ;
16
15
17
16
export default function Preferences ( ) {
18
17
const { user } = useContext ( UserContext ) ;
@@ -31,32 +30,22 @@ export default function Preferences() {
31
30
}
32
31
} ;
33
32
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
33
const [ workspaceTimeout , setWorkspaceTimeout ] = useState < string > ( user ?. additionalData ?. workspaceTimeout ?? "" ) ;
49
34
const actuallySetWorkspaceTimeout = async ( value : string ) => {
50
35
try {
51
- const timeout = WorkspaceTimeoutDuration . validate ( value ) ;
52
- const additionalData = user ?. additionalData || { } ;
53
- additionalData . workspaceTimeout = timeout ;
54
- await getGitpodService ( ) . server . updateLoggedInUser ( { additionalData } ) ;
36
+ await getGitpodService ( ) . server . updateWorkspaceTimeoutSetting ( { workspaceTimeout : value } ) ;
55
37
} catch ( e ) {
56
38
alert ( "Cannot set custom workspace timeout: " + e . message ) ;
57
39
}
58
40
} ;
59
41
42
+ const [ allowConfigureWorkspaceTimeout , setAllowConfigureWorkspaceTimeout ] = useState < boolean > ( false ) ;
43
+ useEffect ( ( ) => {
44
+ getGitpodService ( )
45
+ . server . supportConfigureWorkspaceTimeout ( )
46
+ . then ( ( r ) => setAllowConfigureWorkspaceTimeout ( r ) ) ;
47
+ } , [ ] ) ;
48
+
60
49
return (
61
50
< div >
62
51
< PageWithSettingsSubMenu >
@@ -103,21 +92,29 @@ export default function Preferences() {
103
92
104
93
< h3 className = "mt-12" > Inactivity Timeout </ h3 >
105
94
< 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.
95
+ Workspaces will stop after a period of inactivity without any user input.
108
96
</ p >
109
97
< div className = "mt-4 max-w-xl" >
110
- < h4 > Default Inactivity Timeout</ h4 >
111
- < span className = "flex" >
98
+ < h4 > Default Workspace Timeout</ h4 >
99
+
100
+ { ! allowConfigureWorkspaceTimeout && (
101
+ < Alert type = "message" >
102
+ Upgrade organization < a href = "/billing" > billing</ a > plan to use a custom inactivity timeout.
103
+ </ Alert >
104
+ ) }
105
+
106
+ < span className = "flex mt-2" >
112
107
< input
113
108
type = "text"
114
109
className = "w-96 h-9"
115
110
value = { workspaceTimeout }
116
- placeholder = "timeout time, such as 30m, 1h, max 24h"
111
+ disabled = { ! allowConfigureWorkspaceTimeout }
112
+ placeholder = "e.g. 30m"
117
113
onChange = { ( e ) => setWorkspaceTimeout ( e . target . value ) }
118
114
/>
119
115
< button
120
116
className = "secondary ml-2"
117
+ disabled = { ! allowConfigureWorkspaceTimeout }
121
118
onClick = { ( ) => actuallySetWorkspaceTimeout ( workspaceTimeout ) }
122
119
>
123
120
Save Changes
@@ -128,13 +125,6 @@ export default function Preferences() {
128
125
Use minutes or hours, like < strong > 30m</ strong > or < strong > 2h</ strong > .
129
126
</ p >
130
127
</ div >
131
-
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
- />
138
128
</ div >
139
129
</ PageWithSettingsSubMenu >
140
130
</ div >
0 commit comments