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({