Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitd3f3ace

Browse files
authored
chore: reduce dashboard requests from seeded data (#13034)
* chore: reduce requests the dashboard makes from seeded dataWe already inject all of this content in `index.html`.There was also a bug with displaying a loading indicator whenthe workspace proxies endpoint 404s.* Fix first user fetch* Add util* Add cached query for entitlements and experiments* Fix authmethods unnecessary request* Fix unnecessary region request* Fix fmt* Debug* Fix test
1 parent8d1220e commitd3f3ace

File tree

11 files changed

+65
-31
lines changed

11 files changed

+65
-31
lines changed

‎site/src/api/queries/appearance.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,17 @@ import type { QueryClient, UseQueryOptions } from "react-query";
22
import*asAPIfrom"api/api";
33
importtype{AppearanceConfig}from"api/typesGenerated";
44
import{getMetadataAsJSON}from"utils/metadata";
5+
import{cachedQuery}from"./util";
56

67
constinitialAppearanceData=getMetadataAsJSON<AppearanceConfig>("appearance");
78
constappearanceConfigKey=["appearance"]asconst;
89

910
exportconstappearance=():UseQueryOptions<AppearanceConfig>=>{
1011
return{
12+
// We either have our initial data or should immediately
13+
// fetch and never again!
14+
...cachedQuery(initialAppearanceData),
1115
queryKey:["appearance"],
12-
initialData:initialAppearanceData,
1316
queryFn:()=>API.getAppearance(),
1417
};
1518
};

‎site/src/api/queries/buildInfo.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,17 @@ import type { UseQueryOptions } from "react-query";
22
import*asAPIfrom"api/api";
33
importtype{BuildInfoResponse}from"api/typesGenerated";
44
import{getMetadataAsJSON}from"utils/metadata";
5+
import{cachedQuery}from"./util";
56

67
constinitialBuildInfoData=getMetadataAsJSON<BuildInfoResponse>("build-info");
78
constbuildInfoKey=["buildInfo"]asconst;
89

910
exportconstbuildInfo=():UseQueryOptions<BuildInfoResponse>=>{
1011
return{
12+
// We either have our initial data or should immediately
13+
// fetch and never again!
14+
...cachedQuery(initialBuildInfoData),
1115
queryKey:buildInfoKey,
12-
initialData:initialBuildInfoData,
1316
queryFn:()=>API.getBuildInfo(),
1417
};
1518
};

‎site/src/api/queries/entitlements.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,16 @@ import type { QueryClient, UseQueryOptions } from "react-query";
22
import*asAPIfrom"api/api";
33
importtype{Entitlements}from"api/typesGenerated";
44
import{getMetadataAsJSON}from"utils/metadata";
5+
import{cachedQuery}from"./util";
56

67
constinitialEntitlementsData=getMetadataAsJSON<Entitlements>("entitlements");
7-
constENTITLEMENTS_QUERY_KEY=["entitlements"]asconst;
8+
constentitlementsQueryKey=["entitlements"]asconst;
89

910
exportconstentitlements=():UseQueryOptions<Entitlements>=>{
1011
return{
11-
queryKey:ENTITLEMENTS_QUERY_KEY,
12+
...cachedQuery(initialEntitlementsData),
13+
queryKey:entitlementsQueryKey,
1214
queryFn:()=>API.getEntitlements(),
13-
initialData:initialEntitlementsData,
1415
};
1516
};
1617

@@ -19,7 +20,7 @@ export const refreshEntitlements = (queryClient: QueryClient) => {
1920
mutationFn:API.refreshEntitlements,
2021
onSuccess:async()=>{
2122
awaitqueryClient.invalidateQueries({
22-
queryKey:ENTITLEMENTS_QUERY_KEY,
23+
queryKey:entitlementsQueryKey,
2324
});
2425
},
2526
};

‎site/src/api/queries/experiments.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@ import type { UseQueryOptions } from "react-query";
22
import*asAPIfrom"api/api";
33
importtype{Experiments}from"api/typesGenerated";
44
import{getMetadataAsJSON}from"utils/metadata";
5+
import{cachedQuery}from"./util";
56

67
constinitialExperimentsData=getMetadataAsJSON<Experiments>("experiments");
78
constexperimentsKey=["experiments"]asconst;
89

910
exportconstexperiments=():UseQueryOptions<Experiments>=>{
1011
return{
12+
...cachedQuery(initialExperimentsData),
1113
queryKey:experimentsKey,
12-
initialData:initialExperimentsData,
1314
queryFn:()=>API.getExperiments(),
1415
}satisfiesUseQueryOptions<Experiments>;
1516
};

‎site/src/api/queries/users.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import type { UsePaginatedQueryOptions } from "hooks/usePaginatedQuery";
1919
import{prepareQuery}from"utils/filters";
2020
import{getMetadataAsJSON}from"utils/metadata";
2121
import{getAuthorizationKey}from"./authCheck";
22+
import{cachedQuery}from"./util";
2223

2324
exportfunctionusersKey(req:UsersRequest){
2425
return["users",req]asconst;
@@ -112,6 +113,8 @@ export const updateRoles = (queryClient: QueryClient) => {
112113
};
113114
};
114115

116+
constinitialUserData=getMetadataAsJSON<User>("user");
117+
115118
exportconstauthMethods=()=>{
116119
return{
117120
// Even the endpoint being /users/authmethods we don't want to revalidate it
@@ -121,16 +124,14 @@ export const authMethods = () => {
121124
};
122125
};
123126

124-
constinitialUserData=getMetadataAsJSON<User>("user");
125-
126127
constmeKey=["me"];
127128

128129
exportconstme=():UseQueryOptions<User>&{
129130
queryKey:QueryKey;
130131
}=>{
131132
return{
133+
...cachedQuery(initialUserData),
132134
queryKey:meKey,
133-
initialData:initialUserData,
134135
queryFn:API.getAuthenticatedUser,
135136
};
136137
};
@@ -142,8 +143,10 @@ export function apiKey(): UseQueryOptions<GenerateAPIKeyResponse> {
142143
};
143144
}
144145

145-
exportconsthasFirstUser=()=>{
146+
exportconsthasFirstUser=():UseQueryOptions<boolean>=>{
146147
return{
148+
// This cannot be false otherwise it will not fetch!
149+
...cachedQuery(typeofinitialUserData!=="undefined" ?true :undefined),
147150
queryKey:["hasFirstUser"],
148151
queryFn:API.hasFirstUser,
149152
};

‎site/src/api/queries/util.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
importtype{UseQueryOptions}from"react-query";
2+
3+
// cachedQuery allows the caller to only make a request
4+
// a single time, and use `initialData` if it is provided.
5+
//
6+
// This is particularly helpful for passing values injected
7+
// via metadata. We do this for the initial user fetch, buildinfo,
8+
// and a few others to reduce page load time.
9+
exportconstcachedQuery=<T>(initialData?:T):Partial<UseQueryOptions<T>>=>
10+
// Only do this if there is initial data,
11+
// otherwise it can conflict with tests.
12+
initialData
13+
?{
14+
cacheTime:Infinity,
15+
staleTime:Infinity,
16+
refetchOnMount:false,
17+
refetchOnReconnect:false,
18+
refetchOnWindowFocus:false,
19+
initialData,
20+
}
21+
:{
22+
initialData,
23+
};

‎site/src/contexts/ProxyContext.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@ import {
77
useEffect,
88
useState,
99
}from"react";
10-
import{useQuery}from"react-query";
10+
import{typeUseQueryOptions,useQuery}from"react-query";
1111
import{getWorkspaceProxies,getWorkspaceProxyRegions}from"api/api";
12+
import{cachedQuery}from"api/queries/util";
1213
importtype{Region,WorkspaceProxy}from"api/typesGenerated";
1314
import{useAuthenticated}from"contexts/auth/RequireAuth";
1415
import{typeProxyLatencyReport,useProxyLatency}from"./useProxyLatency";
@@ -131,11 +132,10 @@ export const ProxyProvider: FC<PropsWithChildren> = ({ children }) => {
131132
isLoading:proxiesLoading,
132133
isFetched:proxiesFetched,
133134
}=useQuery({
135+
...cachedQuery(initialData),
134136
queryKey,
135137
queryFn:query,
136-
staleTime:initialData ?Infinity :undefined,
137-
initialData,
138-
});
138+
}asUseQueryOptions<readonlyRegion[]>);
139139

140140
// Every time we get a new proxiesResponse, update the latency check
141141
// to each workspace proxy.

‎site/src/contexts/auth/AuthProvider.tsx

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,13 @@ import { useMutation, useQuery, useQueryClient } from "react-query";
99
import{isApiError}from"api/errors";
1010
import{checkAuthorization}from"api/queries/authCheck";
1111
import{
12-
authMethods,
1312
hasFirstUser,
1413
login,
1514
logout,
1615
me,
1716
updateProfileasupdateProfileOptions,
1817
}from"api/queries/users";
19-
importtype{
20-
AuthMethods,
21-
UpdateUserProfileRequest,
22-
User,
23-
}from"api/typesGenerated";
18+
importtype{UpdateUserProfileRequest,User}from"api/typesGenerated";
2419
import{displaySuccess}from"components/GlobalSnackbar/utils";
2520
import{permissionsToCheck,typePermissions}from"./permissions";
2621

@@ -34,7 +29,6 @@ export type AuthContextValue = {
3429
isUpdatingProfile:boolean;
3530
user:User|undefined;
3631
permissions:Permissions|undefined;
37-
authMethods:AuthMethods|undefined;
3832
organizationId:string|undefined;
3933
signInError:unknown;
4034
updateProfileError:unknown;
@@ -51,7 +45,6 @@ export const AuthProvider: FC<PropsWithChildren> = ({ children }) => {
5145
constqueryClient=useQueryClient();
5246
constmeOptions=me();
5347
constuserQuery=useQuery(meOptions);
54-
constauthMethodsQuery=useQuery(authMethods());
5548
consthasFirstUserQuery=useQuery(hasFirstUser());
5649
constpermissionsQuery=useQuery({
5750
...checkAuthorization({checks:permissionsToCheck}),
@@ -77,7 +70,6 @@ export const AuthProvider: FC<PropsWithChildren> = ({ children }) => {
7770
userQuery.error.response.status===401;
7871
constisSigningOut=logoutMutation.isLoading;
7972
constisLoading=
80-
authMethodsQuery.isLoading||
8173
userQuery.isLoading||
8274
hasFirstUserQuery.isLoading||
8375
(userQuery.isSuccess&&permissionsQuery.isLoading);
@@ -120,7 +112,6 @@ export const AuthProvider: FC<PropsWithChildren> = ({ children }) => {
120112
updateProfile,
121113
user:userQuery.data,
122114
permissions:permissionsQuery.dataasPermissions|undefined,
123-
authMethods:authMethodsQuery.data,
124115
signInError:loginMutation.error,
125116
updateProfileError:updateProfileMutation.error,
126117
organizationId:userQuery.data?.organization_ids[0],

‎site/src/modules/dashboard/Navbar/NavbarView.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,13 @@ const ProxyMenu: FC<ProxyMenuProps> = ({ proxyContextValue }) => {
235235
returnproxy.healthy&&latency!==undefined&&latency.at<refetchDate;
236236
};
237237

238+
// This endpoint returns a 404 when not using enterprise.
239+
// If we don't return null, then it looks like this is
240+
// loading forever!
241+
if(proxyContextValue.error){
242+
returnnull;
243+
}
244+
238245
if(isLoading){
239246
return(
240247
<Skeleton

‎site/src/pages/LoginPage/LoginPage.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
importtype{FC}from"react";
22
import{Helmet}from"react-helmet-async";
3+
import{useQuery}from"react-query";
34
import{Navigate,useLocation,useNavigate}from"react-router-dom";
5+
import{authMethods}from"api/queries/users";
46
import{useAuthContext}from"contexts/auth/AuthProvider";
57
import{getApplicationName}from"utils/appearance";
68
import{retrieveRedirect}from"utils/redirect";
@@ -14,9 +16,9 @@ export const LoginPage: FC = () => {
1416
isConfiguringTheFirstUser,
1517
signIn,
1618
isSigningIn,
17-
authMethods,
1819
signInError,
1920
}=useAuthContext();
21+
constauthMethodsQuery=useQuery(authMethods());
2022
constredirectTo=retrieveRedirect(location.search);
2123
constapplicationName=getApplicationName();
2224
constnavigate=useNavigate();
@@ -60,9 +62,9 @@ export const LoginPage: FC = () => {
6062
<title>Sign in to{applicationName}</title>
6163
</Helmet>
6264
<LoginPageView
63-
authMethods={authMethods}
65+
authMethods={authMethodsQuery.data}
6466
error={signInError}
65-
isLoading={isLoading}
67+
isLoading={isLoading||authMethodsQuery.isLoading}
6668
isSigningIn={isSigningIn}
6769
onSignIn={async({ email, password})=>{
6870
awaitsignIn(email,password);

‎site/src/utils/metadata.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
exportconstgetMetadataAsJSON=<TextendsNonNullable<unknown>>(
22
property:string,
33
):T|undefined=>{
4-
constappearance=document.querySelector(`meta[property=${property}]`);
4+
constmetadata=document.querySelector(`meta[property=${property}]`);
55

6-
if(appearance){
7-
constrawContent=appearance.getAttribute("content");
6+
if(metadata){
7+
constrawContent=metadata.getAttribute("content");
88

99
if(rawContent){
1010
try{

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp