From c99da59284cf24c9ab654c4a78edeac2ca7ff9fe Mon Sep 17 00:00:00 2001 From: David Crespo Date: Mon, 19 Sep 2022 15:16:39 -0500 Subject: [PATCH] prefetch /session/me in loader for all authenticated routes --- app/layouts/helpers.tsx | 5 + app/pages/OrgAccessPage.tsx | 2 +- .../project/access/ProjectAccessPage.tsx | 2 +- app/routes.tsx | 240 +++++++++--------- libs/api/hooks.ts | 4 +- 5 files changed, 131 insertions(+), 122 deletions(-) diff --git a/app/layouts/helpers.tsx b/app/layouts/helpers.tsx index 115cb74fd6..628bb9055a 100644 --- a/app/layouts/helpers.tsx +++ b/app/layouts/helpers.tsx @@ -1,5 +1,6 @@ import { Outlet } from 'react-router-dom' +import { apiQueryClient } from '@oxide/api' import { Pagination } from '@oxide/pagination' import { SkipLinkTarget } from '@oxide/ui' import { classed } from '@oxide/util' @@ -27,3 +28,7 @@ export function ContentPane({ children }: { children?: React.ReactNode }) { ) } + +export async function prefetchSessionMe() { + await apiQueryClient.prefetchQuery('sessionMe', {}) +} diff --git a/app/pages/OrgAccessPage.tsx b/app/pages/OrgAccessPage.tsx index 025d7cb108..f380cd15aa 100644 --- a/app/pages/OrgAccessPage.tsx +++ b/app/pages/OrgAccessPage.tsx @@ -46,7 +46,7 @@ OrgAccessPage.loader = async ({ params }: LoaderFunctionArgs) => { apiQueryClient.prefetchQuery('policyView', {}), apiQueryClient.prefetchQuery('organizationPolicyView', requireOrgParams(params)), // used to resolve user names - apiQueryClient.prefetchQuery('userList'), + apiQueryClient.prefetchQuery('userList', {}), ]) } diff --git a/app/pages/project/access/ProjectAccessPage.tsx b/app/pages/project/access/ProjectAccessPage.tsx index 2f88f53fdd..dacca61f7d 100644 --- a/app/pages/project/access/ProjectAccessPage.tsx +++ b/app/pages/project/access/ProjectAccessPage.tsx @@ -51,7 +51,7 @@ ProjectAccessPage.loader = async ({ params }: LoaderFunctionArgs) => { apiQueryClient.prefetchQuery('organizationPolicyView', { orgName }), apiQueryClient.prefetchQuery('projectPolicyView', { orgName, projectName }), // used to resolve user names - apiQueryClient.prefetchQuery('userList'), + apiQueryClient.prefetchQuery('userList', {}), ]) } diff --git a/app/routes.tsx b/app/routes.tsx index a4a92d0d1c..58dd4c2c5a 100644 --- a/app/routes.tsx +++ b/app/routes.tsx @@ -11,6 +11,7 @@ import RootLayout from './layouts/RootLayout' import SettingsLayout from './layouts/SettingsLayout' import SiloLayout from './layouts/SiloLayout' import SystemLayout from './layouts/SystemLayout' +import { prefetchSessionMe } from './layouts/helpers' import DeviceAuthSuccessPage from './pages/DeviceAuthSuccessPage' import DeviceAuthVerifyPage from './pages/DeviceAuthVerifyPage' import LoginPage from './pages/LoginPage' @@ -54,152 +55,155 @@ export const routes = createRoutesFromElements( } /> - }> - } /> - } handle={{ crumb: 'Profile' }} /> - } - handle={{ crumb: 'Appearance' }} - /> - } - loader={SSHKeysPage.loader} - handle={{ crumb: 'SSH Keys' }} - /> - } handle={{ crumb: 'Hotkeys' }} /> - + {/* This wraps all routes that are supposed to be authenticated */} + + }> + } /> + } handle={{ crumb: 'Profile' }} /> + } + handle={{ crumb: 'Appearance' }} + /> + } + loader={SSHKeysPage.loader} + handle={{ crumb: 'SSH Keys' }} + /> + } handle={{ crumb: 'Hotkeys' }} /> + - } /> + } /> - }> - - - - - - - - - + }> + + + + + + + + + - {/* These are done here instead of nested so we don't flash a layout on 404s */} - } /> - } - /> + {/* These are done here instead of nested so we don't flash a layout on 404s */} + } /> + } + /> - }> - }> - } loader={OrgsPage.loader} /> - } - loader={OrgsPage.loader} - /> - + }> + }> + } loader={OrgsPage.loader} /> } + path="new" + element={} loader={OrgsPage.loader} /> + + } + loader={OrgsPage.loader} + /> + - - - }> - } - loader={OrgAccessPage.loader} - handle={{ crumb: 'Access & IAM' }} - /> - - - {/* ORG */} + }> - } loader={ProjectsPage.loader} /> } - loader={ProjectsPage.loader} + path="access" + element={} + loader={OrgAccessPage.loader} + handle={{ crumb: 'Access & IAM' }} /> - + + + {/* ORG */} + }> + } loader={ProjectsPage.loader} /> } + path="new" + element={} loader={ProjectsPage.loader} /> - - - - {/* PROJECT */} - } - handle={{ crumb: projectCrumb }} - > - - } loader={InstancesPage.loader} /> - } /> - - } loader={InstancePage.loader} /> + } - handle={{ crumb: 'serial-console' }} + path=":projectName" + element={} + loader={ProjectsPage.loader} /> - - } loader={VpcsPage.loader} /> - } - loader={VpcsPage.loader} - /> - + + {/* PROJECT */} + } + handle={{ crumb: projectCrumb }} + > + + } loader={InstancesPage.loader} /> + } /> + + } loader={InstancePage.loader} /> + } + handle={{ crumb: 'serial-console' }} + /> + + + + } loader={VpcsPage.loader} /> } + path="new" + element={} loader={VpcsPage.loader} /> + + } + loader={VpcsPage.loader} + /> + + } + loader={VpcPage.loader} + handle={{ crumb: vpcCrumb }} + /> + + + } loader={DisksPage.loader} /> + } + loader={DisksPage.loader} + /> } - loader={VpcPage.loader} - handle={{ crumb: vpcCrumb }} + path="snapshots" + element={} + loader={SnapshotsPage.loader} + handle={{ crumb: 'Snapshots' }} /> - - - } loader={DisksPage.loader} /> } - loader={DisksPage.loader} + path="images" + element={} + loader={ImagesPage.loader} + handle={{ crumb: 'Images' }} + /> + } + loader={ProjectAccessPage.loader} + handle={{ crumb: 'Access & IAM' }} /> - } - loader={SnapshotsPage.loader} - handle={{ crumb: 'Snapshots' }} - /> - } - loader={ImagesPage.loader} - handle={{ crumb: 'Images' }} - /> - } - loader={ProjectAccessPage.loader} - handle={{ crumb: 'Access & IAM' }} - /> diff --git a/libs/api/hooks.ts b/libs/api/hooks.ts index 8afcd8bf66..67cdaba4f3 100644 --- a/libs/api/hooks.ts +++ b/libs/api/hooks.ts @@ -110,7 +110,7 @@ export const wrapQueryClient = (api: A, queryClient: QueryC ) => queryClient.refetchQueries(params ? [method, params] : [method], filters), fetchQuery: ( method: M, - params?: Params, + params: Params, options: FetchQueryOptions, ErrorResult> = {} ) => queryClient.fetchQuery({ @@ -120,7 +120,7 @@ export const wrapQueryClient = (api: A, queryClient: QueryC }), prefetchQuery: ( method: M, - params?: Params, + params: Params, options: FetchQueryOptions, ErrorResult> = {} ) => queryClient.prefetchQuery({