Skip to content

Commit d1fc093

Browse files
authored
Improve queries on workspace start page (#19590)
* Improve queries on workspace start page * Fix disabled g1-standard always shows error * update doc * Address feedback * Use lib `use-deep-compare-effect`
1 parent f12de25 commit d1fc093

File tree

6 files changed

+38
-14
lines changed

6 files changed

+38
-14
lines changed

components/dashboard/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
"tailwind-merge": "^1.14.0",
5858
"tailwindcss-animate": "^1.0.7",
5959
"url": "^0.11.1",
60+
"use-deep-compare-effect": "^1.8.1",
6061
"util": "^0.11.1",
6162
"validator": "^13.9.0",
6263
"xterm": "^5.4.0-beta.37",

components/dashboard/src/components/SelectWorkspaceClassComponent.tsx

+2
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ export default function SelectWorkspaceClassComponent({
8080
// if the selected workspace class is not supported, we set an error and ask the user to pick one
8181
if (selectedWorkspaceClass && !workspaceClasses?.find((c) => c.id === selectedWorkspaceClass)) {
8282
setError?.(`The workspace class '${selectedWorkspaceClass}' is not supported.`);
83+
} else {
84+
setError?.(undefined);
8385
}
8486
}, [
8587
loading,

components/dashboard/src/data/configurations/configuration-queries.ts

+2
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,8 @@ export const useConfiguration = (configurationId: string) => {
108108
}
109109
return true;
110110
},
111+
cacheTime: 1000 * 60 * 5, // 5m
112+
staleTime: 1000 * 30, // 30s
111113
},
112114
);
113115
};

components/dashboard/src/data/ide-options/ide-options-query.ts

+11-6
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { OrganizationSettings } from "@gitpod/public-api/lib/gitpod/v1/organizat
1313
import { useMemo } from "react";
1414
import { useCurrentOrg } from "../organizations/orgs-query";
1515
import { useConfiguration } from "../configurations/configuration-queries";
16+
import { useDeepCompareMemoize } from "use-deep-compare-effect";
1617

1718
const DEFAULT_WS_EDITOR = "code";
1819

@@ -76,20 +77,24 @@ export const useAllowedWorkspaceEditorsMemo = (configurationId: string | undefin
7677
// So we will filter it out
7778
isLoading = isLoadingInstallationCls || isLoadingConfiguration;
7879
}
80+
const depItems = [
81+
installationOptions,
82+
options?.ignoreScope,
83+
orgSettings,
84+
configuration?.workspaceSettings?.restrictedEditorNames,
85+
];
7986
const data = useMemo(() => {
8087
return getAllowedWorkspaceEditors(
8188
installationOptions,
8289
orgSettings,
8390
configuration?.workspaceSettings?.restrictedEditorNames,
8491
options,
8592
);
93+
// react useMemo is using `Object.is` to compare dependencies so array / object will make re-render re-call useMemo,
94+
// see also https://react.dev/reference/react/useMemo#every-time-my-component-renders-the-calculation-in-usememo-re-runs
95+
//
8696
// eslint-disable-next-line react-hooks/exhaustive-deps
87-
}, [
88-
installationOptions,
89-
options?.ignoreScope,
90-
orgSettings,
91-
configuration?.workspaceSettings?.restrictedEditorNames,
92-
]);
97+
}, [useDeepCompareMemoize(depItems)]);
9398
return { ...data, isLoading, usingConfigurationId: configuration?.id };
9499
};
95100

components/dashboard/src/data/workspaces/workspace-classes-query.ts

+13-7
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { useMemo } from "react";
1313
import { PlainMessage } from "@bufbuild/protobuf";
1414
import { useConfiguration } from "../configurations/configuration-queries";
1515
import { OrganizationSettings } from "@gitpod/public-api/lib/gitpod/v1/organization_pb";
16+
import { useDeepCompareMemoize } from "use-deep-compare-effect";
1617

1718
export const DEFAULT_WS_CLASS = "g1-standard";
1819

@@ -123,6 +124,13 @@ export const useAllowedWorkspaceClassesMemo = (
123124

124125
const isLoading = isLoadingOrgSettings || isLoadingInstallationCls || isLoadingConfiguration;
125126

127+
const depItems = [
128+
installationClasses,
129+
orgSettings,
130+
options,
131+
configuration?.workspaceSettings?.restrictedWorkspaceClasses,
132+
configuration?.workspaceSettings?.workspaceClass,
133+
];
126134
const data = useMemo(() => {
127135
return getAllowedWorkspaceClasses(
128136
installationClasses,
@@ -131,12 +139,10 @@ export const useAllowedWorkspaceClassesMemo = (
131139
configuration?.workspaceSettings?.workspaceClass,
132140
options,
133141
);
134-
}, [
135-
installationClasses,
136-
orgSettings,
137-
options,
138-
configuration?.workspaceSettings?.restrictedWorkspaceClasses,
139-
configuration?.workspaceSettings?.workspaceClass,
140-
]);
142+
// react useMemo is using `Object.is` to compare dependencies so array / object will make re-render re-call useMemo,
143+
// see also https://react.dev/reference/react/useMemo#every-time-my-component-renders-the-calculation-in-usememo-re-runs
144+
//
145+
// eslint-disable-next-line react-hooks/exhaustive-deps
146+
}, [useDeepCompareMemoize(depItems)]);
141147
return { ...data, isLoading };
142148
};

yarn.lock

+9-1
Original file line numberDiff line numberDiff line change
@@ -6582,7 +6582,7 @@ deprecation@^2.0.0, deprecation@^2.3.1:
65826582
resolved "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz"
65836583
integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==
65846584

6585-
dequal@^2.0.3:
6585+
dequal@^2.0.2, dequal@^2.0.3:
65866586
version "2.0.3"
65876587
resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be"
65886588
integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==
@@ -15254,6 +15254,14 @@ use-callback-ref@^1.3.0:
1525415254
dependencies:
1525515255
tslib "^2.0.0"
1525615256

15257+
use-deep-compare-effect@^1.8.1:
15258+
version "1.8.1"
15259+
resolved "https://registry.yarnpkg.com/use-deep-compare-effect/-/use-deep-compare-effect-1.8.1.tgz#ef0ce3b3271edb801da1ec23bf0754ef4189d0c6"
15260+
integrity sha512-kbeNVZ9Zkc0RFGpfMN3MNfaKNvcLNyxOAAd9O4CBZ+kCBXXscn9s/4I+8ytUER4RDpEYs5+O6Rs4PqiZ+rHr5Q==
15261+
dependencies:
15262+
"@babel/runtime" "^7.12.5"
15263+
dequal "^2.0.2"
15264+
1525715265
use-sidecar@^1.1.2:
1525815266
version "1.1.2"
1525915267
resolved "https://registry.yarnpkg.com/use-sidecar/-/use-sidecar-1.1.2.tgz#2f43126ba2d7d7e117aa5855e5d8f0276dfe73c2"

0 commit comments

Comments
 (0)