Skip to content

Commit 36cdf66

Browse files
[dashboard] Fix user preferences workspace timeouts alert (#20619)
Tool: gitpod/catfood.gitpod.cloud
1 parent 331453c commit 36cdf66

File tree

3 files changed

+30
-3
lines changed

3 files changed

+30
-3
lines changed
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/**
2+
* Copyright (c) 2025 Gitpod GmbH. All rights reserved.
3+
* Licensed under the GNU Affero General Public License (AGPL).
4+
* See License.AGPL.txt in the project root for license information.
5+
*/
6+
7+
import { WORKSPACE_TIMEOUT_DEFAULT_LONG, WORKSPACE_TIMEOUT_DEFAULT_SHORT } from "@gitpod/gitpod-protocol";
8+
import { useOrgBillingMode } from "../billing-mode/org-billing-mode-query";
9+
10+
/**
11+
* Returns the default workspace timeout for an organization based on their billing mode (does not take into account the organization's own settings)
12+
*/
13+
export const useDefaultOrgTimeoutQuery = () => {
14+
const { data: billingMode } = useOrgBillingMode();
15+
16+
const isPaidOrDedicated =
17+
billingMode?.mode === "none" || (billingMode?.mode === "usage-based" && billingMode?.paid);
18+
19+
return isPaidOrDedicated ? WORKSPACE_TIMEOUT_DEFAULT_LONG : WORKSPACE_TIMEOUT_DEFAULT_SHORT;
20+
};

components/dashboard/src/teams/TeamPolicies.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import { WorkspaceClassesEnterpriseCallout } from "./policies/WorkspaceClassesEn
3131
import { EditorOptions } from "./policies/EditorOptions";
3232
import { RolePermissionsRestrictions } from "./policies/RoleRestrictions";
3333
import { OrgWorkspaceClassesOptions } from "./policies/OrgWorkspaceClassesOptions";
34+
import { useDefaultOrgTimeoutQuery } from "../data/organizations/default-org-timeout-query";
3435

3536
export default function TeamPoliciesPage() {
3637
useDocumentTitle("Organization Settings - Policies");
@@ -46,6 +47,8 @@ export default function TeamPoliciesPage() {
4647
const [allowTimeoutChangeByMembers, setAllowTimeoutChangeByMembers] = useState<boolean | undefined>(undefined);
4748
const [workspaceTimeoutSettingError, setWorkspaceTimeoutSettingError] = useState<string | undefined>(undefined);
4849

50+
const defaultOrgTimeout = useDefaultOrgTimeoutQuery();
51+
4952
const handleUpdateTeamSettings = useCallback(
5053
async (newSettings: Partial<PlainMessage<OrganizationSettings>>, options?: { throwMutateError?: boolean }) => {
5154
if (!org?.id) {
@@ -156,7 +159,9 @@ export default function TeamPoliciesPage() {
156159
hint={
157160
<span>
158161
Use minutes or hours, like <span className="font-semibold">30m</span> or{" "}
159-
<span className="font-semibold">2h</span>
162+
<span className="font-semibold">2h</span>. If not set, your organization's
163+
default of <span className="font-semibold">{defaultOrgTimeout}</span> will be
164+
used.
160165
</span>
161166
}
162167
>

components/dashboard/src/user-settings/Preferences.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import { converter, userClient } from "../service/public-api";
2525
import { LoadingButton } from "@podkit/buttons/LoadingButton";
2626
import { useOrgSettingsQuery } from "../data/organizations/org-settings-query";
2727
import Alert from "../components/Alert";
28+
import { useDefaultOrgTimeoutQuery } from "../data/organizations/default-org-timeout-query";
2829

2930
export type IDEChangedTrackLocation = "workspace_list" | "workspace_start" | "preferences";
3031

@@ -35,7 +36,7 @@ export default function Preferences() {
3536
const billingMode = useOrgBillingMode();
3637
const updateDotfileRepo = useUpdateCurrentUserDotfileRepoMutation();
3738
const { data: settings } = useOrgSettingsQuery();
38-
39+
const defaultOrgTimeout = useDefaultOrgTimeoutQuery();
3940
const [dotfileRepo, setDotfileRepo] = useState<string>(user?.dotfileRepo || "");
4041

4142
const [workspaceTimeout, setWorkspaceTimeout] = useState<string>(
@@ -173,7 +174,8 @@ export default function Preferences() {
173174
<Alert type="warning" className="mb-4">
174175
The currently selected organization does not allow members to set custom workspace timeouts,
175176
so for workspaces created in it, its default timeout of{" "}
176-
{converter.toDurationStringOpt(settings?.timeoutSettings?.inactivity) || ""} will be used.
177+
{converter.toDurationStringOpt(settings?.timeoutSettings?.inactivity) ?? defaultOrgTimeout}{" "}
178+
will be used.
177179
</Alert>
178180
)}
179181

0 commit comments

Comments
 (0)