From f74ef142d0df14b00d88eacd051ed2e065fda74e Mon Sep 17 00:00:00 2001 From: Kayla Washburn-Love Date: Mon, 22 Jan 2024 10:43:32 -0700 Subject: [PATCH] refactor: reorganize auth components and hooks (#11717) --- site/.eslintrc.yaml | 1 - site/src/App.tsx | 2 +- site/src/AppRouter.tsx | 6 ++-- .../components/Dashboard/DashboardLayout.tsx | 2 +- .../DeploymentBanner/DeploymentBanner.tsx | 6 ++-- .../components/Dashboard/Navbar/Navbar.tsx | 6 ++-- .../Dashboard/Navbar/NavbarView.tsx | 6 ++-- site/src/components/Filter/UserFilter.tsx | 8 ++--- site/src/contexts/ProxyContext.tsx | 12 +++---- site/src/contexts/ThemeProvider.tsx | 2 +- .../{AuthProvider => auth}/AuthProvider.tsx | 11 ------- .../auth}/RequireAuth.test.tsx | 0 .../auth}/RequireAuth.tsx | 6 ++-- .../auth}/RequirePermission.tsx | 6 ++-- .../{AuthProvider => auth}/permissions.tsx | 0 site/src/contexts/auth/useAuth.ts | 12 +++++++ site/src/{hooks => contexts/auth}/useMe.ts | 2 +- site/src/contexts/auth/useOrganizationId.ts | 11 +++++++ .../auth}/usePermissions.ts | 4 +-- site/src/hooks/index.ts | 3 -- site/src/hooks/useOrganizationId.ts | 6 ---- .../DuplicateTemplateView.tsx | 9 +++--- .../ImportStarterTemplateView.tsx | 9 +++--- .../CreateTemplatePage/UploadTemplateView.tsx | 10 +++--- .../pages/CreateUserPage/CreateUserPage.tsx | 12 +++---- .../CreateWorkspacePage.tsx | 30 +++++++++--------- .../DeploySettingsLayout.tsx | 16 +++++----- .../ExternalAuthPage/ExternalAuthPage.tsx | 12 +++---- site/src/pages/GroupsPage/CreateGroupPage.tsx | 8 ++--- site/src/pages/GroupsPage/GroupsPage.tsx | 16 +++++----- site/src/pages/LoginPage/LoginPage.tsx | 2 +- site/src/pages/SetupPage/SetupPage.tsx | 2 +- .../StarterTemplatePage.tsx | 10 +++--- .../StarterTemplatesPage.tsx | 8 ++--- .../TemplateFilesPage/TemplateFilesPage.tsx | 6 ++-- .../src/pages/TemplatePage/TemplateLayout.tsx | 4 +-- .../TemplateSettingsPage.tsx | 16 +++++----- .../TemplatePermissionsPage.tsx | 18 +++++------ .../TemplateSchedulePage.tsx | 14 ++++----- .../TemplateSettingsLayout.tsx | 12 +++---- .../TemplateVariablesPage.tsx | 16 +++++----- .../TemplateVersionEditorPage.tsx | 30 +++++++++--------- .../TemplateVersionPage.tsx | 12 +++---- .../src/pages/TemplatesPage/TemplatesPage.tsx | 10 +++--- .../AccountPage/AccountPage.tsx | 10 +++--- .../AppearancePage/AppearancePage.tsx | 2 +- site/src/pages/UserSettingsPage/Layout.tsx | 2 +- .../SchedulePage/SchedulePage.tsx | 2 +- .../SecurityPage/SecurityPage.tsx | 2 +- site/src/pages/UsersPage/UsersLayout.tsx | 6 ++-- site/src/pages/UsersPage/UsersPage.tsx | 31 +++++++++---------- .../src/pages/WorkspacePage/WorkspacePage.tsx | 22 ++++++------- .../WorkspacePage/WorkspaceReadyPage.tsx | 28 ++++++++--------- .../pages/WorkspacesPage/WorkspacesPage.tsx | 21 +++++++------ site/src/testHelpers/entities.ts | 2 +- site/src/testHelpers/handlers.ts | 2 +- site/src/testHelpers/renderHelpers.tsx | 2 +- 57 files changed, 264 insertions(+), 262 deletions(-) rename site/src/contexts/{AuthProvider => auth}/AuthProvider.tsx (94%) rename site/src/{components/RequireAuth => contexts/auth}/RequireAuth.test.tsx (100%) rename site/src/{components/RequireAuth => contexts/auth}/RequireAuth.tsx (90%) rename site/src/{components/RequirePermission => contexts/auth}/RequirePermission.tsx (79%) rename site/src/contexts/{AuthProvider => auth}/permissions.tsx (100%) create mode 100644 site/src/contexts/auth/useAuth.ts rename site/src/{hooks => contexts/auth}/useMe.ts (76%) create mode 100644 site/src/contexts/auth/useOrganizationId.ts rename site/src/{hooks => contexts/auth}/usePermissions.ts (59%) delete mode 100644 site/src/hooks/useOrganizationId.ts diff --git a/site/.eslintrc.yaml b/site/.eslintrc.yaml index e2d919bcd8..9fc59fce26 100644 --- a/site/.eslintrc.yaml +++ b/site/.eslintrc.yaml @@ -170,7 +170,6 @@ rules: react/jsx-uses-react: "off" react/no-unknown-property: ["error", { ignore: ["css"] }] react/react-in-jsx-scope: "off" - "unicorn/explicit-length-check": "error" # https://github.com/jsx-eslint/eslint-plugin-react/issues/2628#issuecomment-984160944 no-restricted-syntax: [ diff --git a/site/src/App.tsx b/site/src/App.tsx index ad3314e0ce..39f75813c8 100644 --- a/site/src/App.tsx +++ b/site/src/App.tsx @@ -3,7 +3,7 @@ import { type FC, type ReactNode, useEffect, useState } from "react"; import { HelmetProvider } from "react-helmet-async"; import { AppRouter } from "./AppRouter"; import { ThemeProvider } from "./contexts/ThemeProvider"; -import { AuthProvider } from "./contexts/AuthProvider/AuthProvider"; +import { AuthProvider } from "./contexts/auth/AuthProvider"; import { ErrorBoundary } from "./components/ErrorBoundary/ErrorBoundary"; import { GlobalSnackbar } from "./components/GlobalSnackbar/GlobalSnackbar"; import "./theme/globalFonts"; diff --git a/site/src/AppRouter.tsx b/site/src/AppRouter.tsx index 8c4584ae34..0ec595975f 100644 --- a/site/src/AppRouter.tsx +++ b/site/src/AppRouter.tsx @@ -5,17 +5,17 @@ import { BrowserRouter as Router, Navigate, } from "react-router-dom"; +import { RequireAuth } from "./contexts/auth/RequireAuth"; import { DashboardLayout } from "./components/Dashboard/DashboardLayout"; -import { DeploySettingsLayout } from "./pages/DeploySettingsPage/DeploySettingsLayout"; import { FullScreenLoader } from "./components/Loader/FullScreenLoader"; -import { RequireAuth } from "./components/RequireAuth/RequireAuth"; -import { UsersLayout } from "./pages/UsersPage/UsersLayout"; import AuditPage from "./pages/AuditPage/AuditPage"; +import { DeploySettingsLayout } from "./pages/DeploySettingsPage/DeploySettingsLayout"; import LoginPage from "./pages/LoginPage/LoginPage"; import { SetupPage } from "./pages/SetupPage/SetupPage"; import { TemplateLayout } from "./pages/TemplatePage/TemplateLayout"; import { HealthLayout } from "./pages/HealthPage/HealthLayout"; import TemplatesPage from "./pages/TemplatesPage/TemplatesPage"; +import { UsersLayout } from "./pages/UsersPage/UsersLayout"; import UsersPage from "./pages/UsersPage/UsersPage"; import WorkspacesPage from "./pages/WorkspacesPage/WorkspacesPage"; import UserSettingsLayout from "./pages/UserSettingsPage/Layout"; diff --git a/site/src/components/Dashboard/DashboardLayout.tsx b/site/src/components/Dashboard/DashboardLayout.tsx index 35cc12611e..af4cb9a0cb 100644 --- a/site/src/components/Dashboard/DashboardLayout.tsx +++ b/site/src/components/Dashboard/DashboardLayout.tsx @@ -4,10 +4,10 @@ import Button from "@mui/material/Button"; import InfoOutlined from "@mui/icons-material/InfoOutlined"; import { type FC, type HTMLAttributes, Suspense } from "react"; import { Outlet } from "react-router-dom"; +import { usePermissions } from "contexts/auth/usePermissions"; import { LicenseBanner } from "components/Dashboard/LicenseBanner/LicenseBanner"; import { Loader } from "components/Loader/Loader"; import { ServiceBanner } from "components/Dashboard/ServiceBanner/ServiceBanner"; -import { usePermissions } from "hooks/usePermissions"; import { dashboardContentBottomPadding } from "theme/constants"; import { docs } from "utils/docs"; import { Navbar } from "./Navbar/Navbar"; diff --git a/site/src/components/Dashboard/DeploymentBanner/DeploymentBanner.tsx b/site/src/components/Dashboard/DeploymentBanner/DeploymentBanner.tsx index 526f822f21..4f32b3a33d 100644 --- a/site/src/components/Dashboard/DeploymentBanner/DeploymentBanner.tsx +++ b/site/src/components/Dashboard/DeploymentBanner/DeploymentBanner.tsx @@ -1,9 +1,9 @@ import { type FC } from "react"; import { useQuery } from "react-query"; -import { deploymentStats } from "api/queries/deployment"; -import { usePermissions } from "hooks/usePermissions"; -import { DeploymentBannerView } from "./DeploymentBannerView"; import { health } from "api/queries/debug"; +import { deploymentStats } from "api/queries/deployment"; +import { usePermissions } from "contexts/auth/usePermissions"; +import { DeploymentBannerView } from "./DeploymentBannerView"; export const DeploymentBanner: FC = () => { const permissions = usePermissions(); diff --git a/site/src/components/Dashboard/Navbar/Navbar.tsx b/site/src/components/Dashboard/Navbar/Navbar.tsx index 4eeca4825e..bd0f0705e7 100644 --- a/site/src/components/Dashboard/Navbar/Navbar.tsx +++ b/site/src/components/Dashboard/Navbar/Navbar.tsx @@ -1,10 +1,10 @@ import { type FC } from "react"; -import { useAuth } from "contexts/AuthProvider/AuthProvider"; +import { useAuth } from "contexts/auth/useAuth"; +import { useMe } from "contexts/auth/useMe"; +import { usePermissions } from "contexts/auth/usePermissions"; import { useProxy } from "contexts/ProxyContext"; import { useDashboard } from "components/Dashboard/DashboardProvider"; import { useFeatureVisibility } from "hooks/useFeatureVisibility"; -import { useMe } from "hooks/useMe"; -import { usePermissions } from "hooks/usePermissions"; import { NavbarView } from "./NavbarView"; export const Navbar: FC = () => { diff --git a/site/src/components/Dashboard/Navbar/NavbarView.tsx b/site/src/components/Dashboard/Navbar/NavbarView.tsx index 66c7c7fc22..dccbb65717 100644 --- a/site/src/components/Dashboard/Navbar/NavbarView.tsx +++ b/site/src/components/Dashboard/Navbar/NavbarView.tsx @@ -7,19 +7,19 @@ import Button from "@mui/material/Button"; import MenuItem from "@mui/material/MenuItem"; import KeyboardArrowDownOutlined from "@mui/icons-material/KeyboardArrowDownOutlined"; import MenuIcon from "@mui/icons-material/Menu"; +import { visuallyHidden } from "@mui/utils"; import { css, type Interpolation, type Theme, useTheme } from "@emotion/react"; import { type FC, type ReactNode, useRef, useState } from "react"; import { NavLink, useLocation, useNavigate } from "react-router-dom"; import { BUTTON_SM_HEIGHT, navHeight } from "theme/constants"; import type * as TypesGen from "api/typesGenerated"; +import { usePermissions } from "contexts/auth/usePermissions"; import type { ProxyContextValue } from "contexts/ProxyContext"; +import { Abbr } from "components/Abbr/Abbr"; import { displayError } from "components/GlobalSnackbar/utils"; import { ProxyStatusLatency } from "components/ProxyStatusLatency/ProxyStatusLatency"; import { CoderIcon } from "components/Icons/CoderIcon"; -import { usePermissions } from "hooks/usePermissions"; import { UserDropdown } from "./UserDropdown/UserDropdown"; -import { visuallyHidden } from "@mui/utils"; -import { Abbr } from "components/Abbr/Abbr"; export const USERS_LINK = `/users?filter=${encodeURIComponent( "status:active", diff --git a/site/src/components/Filter/UserFilter.tsx b/site/src/components/Filter/UserFilter.tsx index 14bab75b52..879e2ed53c 100644 --- a/site/src/components/Filter/UserFilter.tsx +++ b/site/src/components/Filter/UserFilter.tsx @@ -1,10 +1,10 @@ import { type FC } from "react"; -import { useMe } from "hooks"; -import { BaseOption } from "./options"; import { getUsers } from "api/api"; -import { UseFilterMenuOptions, useFilterMenu } from "./menu"; +import { useMe } from "contexts/auth/useMe"; +import { UserAvatar } from "../UserAvatar/UserAvatar"; import { FilterSearchMenu, OptionItem } from "./filter"; -import { UserAvatar } from "components/UserAvatar/UserAvatar"; +import { UseFilterMenuOptions, useFilterMenu } from "./menu"; +import { BaseOption } from "./options"; export type UserOption = BaseOption & { avatarUrl?: string; diff --git a/site/src/contexts/ProxyContext.tsx b/site/src/contexts/ProxyContext.tsx index d1b6b6057f..12a6ef9171 100644 --- a/site/src/contexts/ProxyContext.tsx +++ b/site/src/contexts/ProxyContext.tsx @@ -1,17 +1,17 @@ -import { useQuery } from "react-query"; -import { getWorkspaceProxies, getWorkspaceProxyRegions } from "api/api"; -import { Region, WorkspaceProxy } from "api/typesGenerated"; import { createContext, - FC, - PropsWithChildren, + type FC, + type PropsWithChildren, useCallback, useContext, useEffect, useState, } from "react"; +import { useQuery } from "react-query"; +import { getWorkspaceProxies, getWorkspaceProxyRegions } from "api/api"; +import type { Region, WorkspaceProxy } from "api/typesGenerated"; +import { usePermissions } from "contexts/auth/usePermissions"; import { ProxyLatencyReport, useProxyLatency } from "./useProxyLatency"; -import { usePermissions } from "hooks/usePermissions"; export interface ProxyContextValue { // proxy is **always** the workspace proxy that should be used. diff --git a/site/src/contexts/ThemeProvider.tsx b/site/src/contexts/ThemeProvider.tsx index 488c290602..fce5e87940 100644 --- a/site/src/contexts/ThemeProvider.tsx +++ b/site/src/contexts/ThemeProvider.tsx @@ -14,7 +14,7 @@ import { useState, } from "react"; import themes, { DEFAULT_THEME, type Theme } from "theme"; -import { AuthContext } from "./AuthProvider/AuthProvider"; +import { AuthContext } from "./auth/AuthProvider"; /** * diff --git a/site/src/contexts/AuthProvider/AuthProvider.tsx b/site/src/contexts/auth/AuthProvider.tsx similarity index 94% rename from site/src/contexts/AuthProvider/AuthProvider.tsx rename to site/src/contexts/auth/AuthProvider.tsx index 57c558e7e2..573c5c20a2 100644 --- a/site/src/contexts/AuthProvider/AuthProvider.tsx +++ b/site/src/contexts/auth/AuthProvider.tsx @@ -3,7 +3,6 @@ import { type FC, type PropsWithChildren, useCallback, - useContext, } from "react"; import { useMutation, useQuery, useQueryClient } from "react-query"; import { checkAuthorization } from "api/queries/authCheck"; @@ -129,13 +128,3 @@ export const AuthProvider: FC = ({ children }) => { ); }; - -export const useAuth = () => { - const context = useContext(AuthContext); - - if (!context) { - throw new Error("useAuth should be used inside of "); - } - - return context; -}; diff --git a/site/src/components/RequireAuth/RequireAuth.test.tsx b/site/src/contexts/auth/RequireAuth.test.tsx similarity index 100% rename from site/src/components/RequireAuth/RequireAuth.test.tsx rename to site/src/contexts/auth/RequireAuth.test.tsx diff --git a/site/src/components/RequireAuth/RequireAuth.tsx b/site/src/contexts/auth/RequireAuth.tsx similarity index 90% rename from site/src/components/RequireAuth/RequireAuth.tsx rename to site/src/contexts/auth/RequireAuth.tsx index 7a1eb9c6ef..c6ea2cc519 100644 --- a/site/src/components/RequireAuth/RequireAuth.tsx +++ b/site/src/contexts/auth/RequireAuth.tsx @@ -3,10 +3,10 @@ import { type FC, useEffect } from "react"; import { Outlet, Navigate, useLocation } from "react-router-dom"; import { embedRedirect } from "utils/redirect"; import { isApiError } from "api/errors"; -import { useAuth } from "contexts/AuthProvider/AuthProvider"; import { ProxyProvider } from "contexts/ProxyContext"; -import { DashboardProvider } from "../Dashboard/DashboardProvider"; -import { FullScreenLoader } from "../Loader/FullScreenLoader"; +import { DashboardProvider } from "components/Dashboard/DashboardProvider"; +import { FullScreenLoader } from "components/Loader/FullScreenLoader"; +import { useAuth } from "./useAuth"; export const RequireAuth: FC = () => { const { signOut, isSigningOut, isSignedOut, isSignedIn, isLoading } = diff --git a/site/src/components/RequirePermission/RequirePermission.tsx b/site/src/contexts/auth/RequirePermission.tsx similarity index 79% rename from site/src/components/RequirePermission/RequirePermission.tsx rename to site/src/contexts/auth/RequirePermission.tsx index 6a2694f5fd..51bdd394f6 100644 --- a/site/src/components/RequirePermission/RequirePermission.tsx +++ b/site/src/contexts/auth/RequirePermission.tsx @@ -1,8 +1,8 @@ -import { FC } from "react"; +import { type FC, type ReactNode } from "react"; import { Navigate } from "react-router-dom"; export interface RequirePermissionProps { - children: JSX.Element; + children?: ReactNode; isFeatureVisible: boolean; } @@ -16,6 +16,6 @@ export const RequirePermission: FC = ({ if (!isFeatureVisible) { return ; } else { - return children; + return <>{children}; } }; diff --git a/site/src/contexts/AuthProvider/permissions.tsx b/site/src/contexts/auth/permissions.tsx similarity index 100% rename from site/src/contexts/AuthProvider/permissions.tsx rename to site/src/contexts/auth/permissions.tsx diff --git a/site/src/contexts/auth/useAuth.ts b/site/src/contexts/auth/useAuth.ts new file mode 100644 index 0000000000..bdbd297306 --- /dev/null +++ b/site/src/contexts/auth/useAuth.ts @@ -0,0 +1,12 @@ +import { useContext } from "react"; +import { AuthContext } from "./AuthProvider"; + +export const useAuth = () => { + const context = useContext(AuthContext); + + if (!context) { + throw new Error("useAuth should be used inside of "); + } + + return context; +}; diff --git a/site/src/hooks/useMe.ts b/site/src/contexts/auth/useMe.ts similarity index 76% rename from site/src/hooks/useMe.ts rename to site/src/contexts/auth/useMe.ts index d6a5ad3400..378a246ffe 100644 --- a/site/src/hooks/useMe.ts +++ b/site/src/contexts/auth/useMe.ts @@ -1,5 +1,5 @@ import type { User } from "api/typesGenerated"; -import { useAuth } from "contexts/AuthProvider/AuthProvider"; +import { useAuth } from "./useAuth"; export const useMe = (): User => { const { user } = useAuth(); diff --git a/site/src/contexts/auth/useOrganizationId.ts b/site/src/contexts/auth/useOrganizationId.ts new file mode 100644 index 0000000000..4bdf873201 --- /dev/null +++ b/site/src/contexts/auth/useOrganizationId.ts @@ -0,0 +1,11 @@ +import { useMe } from "./useMe"; + +export const useOrganizationId = (): string => { + const me = useMe(); + + if (me.organization_ids.length < 1) { + throw new Error("User is not a member of any organizations"); + } + + return me.organization_ids[0]; +}; diff --git a/site/src/hooks/usePermissions.ts b/site/src/contexts/auth/usePermissions.ts similarity index 59% rename from site/src/hooks/usePermissions.ts rename to site/src/contexts/auth/usePermissions.ts index ac327b938c..8638b19d02 100644 --- a/site/src/hooks/usePermissions.ts +++ b/site/src/contexts/auth/usePermissions.ts @@ -1,5 +1,5 @@ -import { useAuth } from "contexts/AuthProvider/AuthProvider"; -import type { Permissions } from "contexts/AuthProvider/permissions"; +import { useAuth } from "./useAuth"; +import type { Permissions } from "./permissions"; export const usePermissions = (): Permissions => { const { permissions } = useAuth(); diff --git a/site/src/hooks/index.ts b/site/src/hooks/index.ts index 7f0309dc3a..40147df532 100644 --- a/site/src/hooks/index.ts +++ b/site/src/hooks/index.ts @@ -2,8 +2,5 @@ export * from "./useClickable"; export * from "./useClickableTableRow"; export * from "./useClipboard"; export * from "./useFeatureVisibility"; -export * from "./useMe"; -export * from "./useOrganizationId"; export * from "./usePagination"; -export * from "./usePermissions"; export * from "./useTab"; diff --git a/site/src/hooks/useOrganizationId.ts b/site/src/hooks/useOrganizationId.ts deleted file mode 100644 index 52f0c034e5..0000000000 --- a/site/src/hooks/useOrganizationId.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { useMe } from "./useMe"; - -export const useOrganizationId = (): string => { - const user = useMe(); - return user.organization_ids[0]; -}; diff --git a/site/src/pages/CreateTemplatePage/DuplicateTemplateView.tsx b/site/src/pages/CreateTemplatePage/DuplicateTemplateView.tsx index 3fcdb59498..8d3d70cb00 100644 --- a/site/src/pages/CreateTemplatePage/DuplicateTemplateView.tsx +++ b/site/src/pages/CreateTemplatePage/DuplicateTemplateView.tsx @@ -1,4 +1,6 @@ +import { type FC } from "react"; import { useQuery, useMutation } from "react-query"; +import { useNavigate, useSearchParams } from "react-router-dom"; import { templateVersionLogs, templateByName, @@ -7,15 +9,14 @@ import { JobError, createTemplate, } from "api/queries/templates"; +import { useOrganizationId } from "contexts/auth/useOrganizationId"; import { ErrorAlert } from "components/Alert/ErrorAlert"; -import { useOrganizationId } from "hooks"; -import { useNavigate, useSearchParams } from "react-router-dom"; -import { CreateTemplateForm } from "./CreateTemplateForm"; import { Loader } from "components/Loader/Loader"; import { useDashboard } from "components/Dashboard/DashboardProvider"; +import { CreateTemplateForm } from "./CreateTemplateForm"; import { firstVersionFromFile, getFormPermissions, newTemplate } from "./utils"; -export const DuplicateTemplateView = () => { +export const DuplicateTemplateView: FC = () => { const navigate = useNavigate(); const organizationId = useOrganizationId(); const [searchParams] = useSearchParams(); diff --git a/site/src/pages/CreateTemplatePage/ImportStarterTemplateView.tsx b/site/src/pages/CreateTemplatePage/ImportStarterTemplateView.tsx index 38e596b908..32c2308ede 100644 --- a/site/src/pages/CreateTemplatePage/ImportStarterTemplateView.tsx +++ b/site/src/pages/CreateTemplatePage/ImportStarterTemplateView.tsx @@ -1,4 +1,6 @@ +import { type FC } from "react"; import { useQuery, useMutation } from "react-query"; +import { useNavigate, useSearchParams } from "react-router-dom"; import { templateVersionLogs, JobError, @@ -6,19 +8,18 @@ import { templateExamples, templateVersionVariables, } from "api/queries/templates"; +import { useOrganizationId } from "contexts/auth/useOrganizationId"; import { ErrorAlert } from "components/Alert/ErrorAlert"; -import { useOrganizationId } from "hooks"; -import { useNavigate, useSearchParams } from "react-router-dom"; -import { CreateTemplateForm } from "./CreateTemplateForm"; import { Loader } from "components/Loader/Loader"; import { useDashboard } from "components/Dashboard/DashboardProvider"; +import { CreateTemplateForm } from "./CreateTemplateForm"; import { firstVersionFromExample, getFormPermissions, newTemplate, } from "./utils"; -export const ImportStarterTemplateView = () => { +export const ImportStarterTemplateView: FC = () => { const navigate = useNavigate(); const organizationId = useOrganizationId(); const [searchParams] = useSearchParams(); diff --git a/site/src/pages/CreateTemplatePage/UploadTemplateView.tsx b/site/src/pages/CreateTemplatePage/UploadTemplateView.tsx index b3eb11a7c1..5bd807d4d2 100644 --- a/site/src/pages/CreateTemplatePage/UploadTemplateView.tsx +++ b/site/src/pages/CreateTemplatePage/UploadTemplateView.tsx @@ -1,16 +1,16 @@ import { useQuery, useMutation } from "react-query"; +import { useNavigate } from "react-router-dom"; import { templateVersionLogs, JobError, createTemplate, templateVersionVariables, } from "api/queries/templates"; -import { useOrganizationId } from "hooks"; -import { useNavigate } from "react-router-dom"; -import { CreateTemplateForm } from "./CreateTemplateForm"; -import { useDashboard } from "components/Dashboard/DashboardProvider"; -import { firstVersionFromFile, getFormPermissions, newTemplate } from "./utils"; import { uploadFile } from "api/queries/files"; +import { useOrganizationId } from "contexts/auth/useOrganizationId"; +import { useDashboard } from "components/Dashboard/DashboardProvider"; +import { CreateTemplateForm } from "./CreateTemplateForm"; +import { firstVersionFromFile, getFormPermissions, newTemplate } from "./utils"; export const UploadTemplateView = () => { const navigate = useNavigate(); diff --git a/site/src/pages/CreateUserPage/CreateUserPage.tsx b/site/src/pages/CreateUserPage/CreateUserPage.tsx index f3ad9f6225..117bbe4c72 100644 --- a/site/src/pages/CreateUserPage/CreateUserPage.tsx +++ b/site/src/pages/CreateUserPage/CreateUserPage.tsx @@ -1,13 +1,13 @@ -import { useOrganizationId } from "hooks/useOrganizationId"; -import { FC } from "react"; +import { type FC } from "react"; import { Helmet } from "react-helmet-async"; -import { useNavigate } from "react-router-dom"; -import { CreateUserForm } from "./CreateUserForm"; -import { Margins } from "components/Margins/Margins"; -import { pageTitle } from "utils/page"; import { useMutation, useQuery, useQueryClient } from "react-query"; +import { useNavigate } from "react-router-dom"; +import { pageTitle } from "utils/page"; import { authMethods, createUser } from "api/queries/users"; +import { useOrganizationId } from "contexts/auth/useOrganizationId"; +import { Margins } from "components/Margins/Margins"; import { displaySuccess } from "components/GlobalSnackbar/utils"; +import { CreateUserForm } from "./CreateUserForm"; export const Language = { unknownError: "Oops, an unknown error occurred.", diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx index 9a04103975..309aa6c419 100644 --- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx +++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx @@ -1,34 +1,34 @@ -import { - TemplateVersionParameter, - Workspace, - WorkspaceBuildParameter, -} from "api/typesGenerated"; -import { useMe } from "hooks/useMe"; -import { useOrganizationId } from "hooks/useOrganizationId"; import { type FC, useCallback, useState, useEffect } from "react"; import { Helmet } from "react-helmet-async"; import { useNavigate, useParams, useSearchParams } from "react-router-dom"; -import { pageTitle } from "utils/page"; -import { CreateWorkspacePageView } from "./CreateWorkspacePageView"; -import { Loader } from "components/Loader/Loader"; -import { ErrorAlert } from "components/Alert/ErrorAlert"; +import { useMutation, useQuery, useQueryClient } from "react-query"; import { uniqueNamesGenerator, animals, colors, NumberDictionary, } from "unique-names-generator"; -import { useMutation, useQuery, useQueryClient } from "react-query"; +import type { + TemplateVersionParameter, + Workspace, + WorkspaceBuildParameter, +} from "api/typesGenerated"; +import { useMe } from "contexts/auth/useMe"; +import { useOrganizationId } from "contexts/auth/useOrganizationId"; +import { pageTitle } from "utils/page"; +import { checkAuthorization } from "api/queries/authCheck"; import { templateByName, templateVersionExternalAuth, richParameters, } from "api/queries/templates"; import { autoCreateWorkspace, createWorkspace } from "api/queries/workspaces"; -import { checkAuthorization } from "api/queries/authCheck"; -import { CreateWSPermissions, createWorkspaceChecks } from "./permissions"; -import { paramsUsedToCreateWorkspace } from "utils/workspace"; import { useEffectEvent } from "hooks/hookPolyfills"; +import { paramsUsedToCreateWorkspace } from "utils/workspace"; +import { Loader } from "components/Loader/Loader"; +import { ErrorAlert } from "components/Alert/ErrorAlert"; +import { CreateWSPermissions, createWorkspaceChecks } from "./permissions"; +import { CreateWorkspacePageView } from "./CreateWorkspacePageView"; export const createWorkspaceModes = ["form", "auto", "duplicate"] as const; export type CreateWorkspaceMode = (typeof createWorkspaceModes)[number]; diff --git a/site/src/pages/DeploySettingsPage/DeploySettingsLayout.tsx b/site/src/pages/DeploySettingsPage/DeploySettingsLayout.tsx index e862a72c25..96a2ab6fcd 100644 --- a/site/src/pages/DeploySettingsPage/DeploySettingsLayout.tsx +++ b/site/src/pages/DeploySettingsPage/DeploySettingsLayout.tsx @@ -1,14 +1,14 @@ +import { createContext, type FC, Suspense, useContext } from "react"; +import { useQuery } from "react-query"; +import { Outlet } from "react-router-dom"; +import { DeploymentConfig } from "api/api"; +import { deploymentConfig } from "api/queries/deployment"; +import { RequirePermission } from "contexts/auth/RequirePermission"; +import { usePermissions } from "contexts/auth/usePermissions"; +import { Loader } from "components/Loader/Loader"; import { Margins } from "components/Margins/Margins"; import { Stack } from "components/Stack/Stack"; import { Sidebar } from "./Sidebar"; -import { createContext, Suspense, useContext, FC } from "react"; -import { Loader } from "components/Loader/Loader"; -import { RequirePermission } from "components/RequirePermission/RequirePermission"; -import { usePermissions } from "hooks/usePermissions"; -import { Outlet } from "react-router-dom"; -import { DeploymentConfig } from "api/api"; -import { useQuery } from "react-query"; -import { deploymentConfig } from "api/queries/deployment"; type DeploySettingsContextValue = { deploymentValues: DeploymentConfig; diff --git a/site/src/pages/ExternalAuthPage/ExternalAuthPage.tsx b/site/src/pages/ExternalAuthPage/ExternalAuthPage.tsx index 6b11bd6be1..74d188f7f1 100644 --- a/site/src/pages/ExternalAuthPage/ExternalAuthPage.tsx +++ b/site/src/pages/ExternalAuthPage/ExternalAuthPage.tsx @@ -1,18 +1,18 @@ +import Button from "@mui/material/Button"; import { useQuery, useQueryClient } from "react-query"; -import { usePermissions } from "hooks"; +import { isAxiosError } from "axios"; import { type FC } from "react"; import { useParams, useSearchParams } from "react-router-dom"; -import ExternalAuthPageView from "./ExternalAuthPageView"; import { ApiErrorResponse } from "api/errors"; -import { isAxiosError } from "axios"; -import Button from "@mui/material/Button"; -import { SignInLayout } from "components/SignInLayout/SignInLayout"; -import { Welcome } from "components/Welcome/Welcome"; import { externalAuthDevice, externalAuthProvider, exchangeExternalAuthDevice, } from "api/queries/externalAuth"; +import { usePermissions } from "contexts/auth/usePermissions"; +import { SignInLayout } from "components/SignInLayout/SignInLayout"; +import { Welcome } from "components/Welcome/Welcome"; +import ExternalAuthPageView from "./ExternalAuthPageView"; const ExternalAuthPage: FC = () => { const { provider } = useParams() as { provider: string }; diff --git a/site/src/pages/GroupsPage/CreateGroupPage.tsx b/site/src/pages/GroupsPage/CreateGroupPage.tsx index e76f5fbdb5..8804773bb7 100644 --- a/site/src/pages/GroupsPage/CreateGroupPage.tsx +++ b/site/src/pages/GroupsPage/CreateGroupPage.tsx @@ -1,11 +1,11 @@ -import { useOrganizationId } from "hooks/useOrganizationId"; -import { FC } from "react"; +import { type FC } from "react"; import { Helmet } from "react-helmet-async"; +import { useMutation, useQueryClient } from "react-query"; import { useNavigate } from "react-router-dom"; +import { createGroup } from "api/queries/groups"; +import { useOrganizationId } from "contexts/auth/useOrganizationId"; import { pageTitle } from "utils/page"; import CreateGroupPageView from "./CreateGroupPageView"; -import { useMutation, useQueryClient } from "react-query"; -import { createGroup } from "api/queries/groups"; export const CreateGroupPage: FC = () => { const queryClient = useQueryClient(); diff --git a/site/src/pages/GroupsPage/GroupsPage.tsx b/site/src/pages/GroupsPage/GroupsPage.tsx index 37bb1abfc2..281c702e0c 100644 --- a/site/src/pages/GroupsPage/GroupsPage.tsx +++ b/site/src/pages/GroupsPage/GroupsPage.tsx @@ -1,14 +1,14 @@ -import { useFeatureVisibility } from "hooks/useFeatureVisibility"; -import { useOrganizationId } from "hooks/useOrganizationId"; -import { usePermissions } from "hooks/usePermissions"; -import { FC, useEffect } from "react"; +import { type FC, useEffect } from "react"; import { Helmet } from "react-helmet-async"; -import { pageTitle } from "utils/page"; -import GroupsPageView from "./GroupsPageView"; import { useQuery } from "react-query"; -import { groups } from "api/queries/groups"; -import { displayError } from "components/GlobalSnackbar/utils"; import { getErrorMessage } from "api/errors"; +import { groups } from "api/queries/groups"; +import { useOrganizationId } from "contexts/auth/useOrganizationId"; +import { usePermissions } from "contexts/auth/usePermissions"; +import { useFeatureVisibility } from "hooks/useFeatureVisibility"; +import { pageTitle } from "utils/page"; +import { displayError } from "components/GlobalSnackbar/utils"; +import GroupsPageView from "./GroupsPageView"; export const GroupsPage: FC = () => { const organizationId = useOrganizationId(); diff --git a/site/src/pages/LoginPage/LoginPage.tsx b/site/src/pages/LoginPage/LoginPage.tsx index 6d88f4cc12..5b7ba35624 100644 --- a/site/src/pages/LoginPage/LoginPage.tsx +++ b/site/src/pages/LoginPage/LoginPage.tsx @@ -1,7 +1,7 @@ import { type FC } from "react"; import { Helmet } from "react-helmet-async"; import { Navigate, useLocation, useNavigate } from "react-router-dom"; -import { useAuth } from "contexts/AuthProvider/AuthProvider"; +import { useAuth } from "contexts/auth/useAuth"; import { getApplicationName } from "utils/appearance"; import { retrieveRedirect } from "utils/redirect"; import { LoginPageView } from "./LoginPageView"; diff --git a/site/src/pages/SetupPage/SetupPage.tsx b/site/src/pages/SetupPage/SetupPage.tsx index 5a3d87e626..c49256df12 100644 --- a/site/src/pages/SetupPage/SetupPage.tsx +++ b/site/src/pages/SetupPage/SetupPage.tsx @@ -4,7 +4,7 @@ import { useMutation } from "react-query"; import { Navigate, useNavigate } from "react-router-dom"; import { pageTitle } from "utils/page"; import { createFirstUser } from "api/queries/users"; -import { useAuth } from "contexts/AuthProvider/AuthProvider"; +import { useAuth } from "contexts/auth/useAuth"; import { FullScreenLoader } from "components/Loader/FullScreenLoader"; import { SetupPageView } from "./SetupPageView"; diff --git a/site/src/pages/StarterTemplatePage/StarterTemplatePage.tsx b/site/src/pages/StarterTemplatePage/StarterTemplatePage.tsx index 6ab267692e..21f11bea66 100644 --- a/site/src/pages/StarterTemplatePage/StarterTemplatePage.tsx +++ b/site/src/pages/StarterTemplatePage/StarterTemplatePage.tsx @@ -1,11 +1,11 @@ -import { useOrganizationId } from "hooks/useOrganizationId"; -import { FC } from "react"; +import { type FC } from "react"; import { Helmet } from "react-helmet-async"; -import { useParams } from "react-router-dom"; -import { pageTitle } from "utils/page"; -import { StarterTemplatePageView } from "./StarterTemplatePageView"; import { useQuery } from "react-query"; +import { useParams } from "react-router-dom"; import { templateExamples } from "api/queries/templates"; +import { pageTitle } from "utils/page"; +import { useOrganizationId } from "contexts/auth/useOrganizationId"; +import { StarterTemplatePageView } from "./StarterTemplatePageView"; const StarterTemplatePage: FC = () => { const { exampleId } = useParams() as { exampleId: string }; diff --git a/site/src/pages/StarterTemplatesPage/StarterTemplatesPage.tsx b/site/src/pages/StarterTemplatesPage/StarterTemplatesPage.tsx index ab0a024a28..5c47bc1311 100644 --- a/site/src/pages/StarterTemplatesPage/StarterTemplatesPage.tsx +++ b/site/src/pages/StarterTemplatesPage/StarterTemplatesPage.tsx @@ -1,11 +1,11 @@ -import { useOrganizationId } from "hooks/useOrganizationId"; -import { FC } from "react"; +import { type FC } from "react"; import { Helmet } from "react-helmet-async"; -import { pageTitle } from "utils/page"; -import { StarterTemplatesPageView } from "./StarterTemplatesPageView"; import { useQuery } from "react-query"; import { templateExamples } from "api/queries/templates"; +import { useOrganizationId } from "contexts/auth/useOrganizationId"; +import { pageTitle } from "utils/page"; import { getTemplatesByTag } from "utils/starterTemplates"; +import { StarterTemplatesPageView } from "./StarterTemplatesPageView"; const StarterTemplatesPage: FC = () => { const organizationId = useOrganizationId(); diff --git a/site/src/pages/TemplatePage/TemplateFilesPage/TemplateFilesPage.tsx b/site/src/pages/TemplatePage/TemplateFilesPage/TemplateFilesPage.tsx index 6ddeb3b69b..e80e21d6c2 100644 --- a/site/src/pages/TemplatePage/TemplateFilesPage/TemplateFilesPage.tsx +++ b/site/src/pages/TemplatePage/TemplateFilesPage/TemplateFilesPage.tsx @@ -1,15 +1,15 @@ import { type FC } from "react"; import { Helmet } from "react-helmet-async"; +import { useQuery } from "react-query"; +import { previousTemplateVersion, templateFiles } from "api/queries/templates"; import { Loader } from "components/Loader/Loader"; import { TemplateFiles, useFileTab, } from "components/TemplateFiles/TemplateFiles"; import { useTemplateLayoutContext } from "pages/TemplatePage/TemplateLayout"; +import { useOrganizationId } from "contexts/auth/useOrganizationId"; import { getTemplatePageTitle } from "../utils"; -import { useQuery } from "react-query"; -import { previousTemplateVersion, templateFiles } from "api/queries/templates"; -import { useOrganizationId } from "hooks"; const TemplateFilesPage: FC = () => { const orgId = useOrganizationId(); diff --git a/site/src/pages/TemplatePage/TemplateLayout.tsx b/site/src/pages/TemplatePage/TemplateLayout.tsx index a54da49401..010184d1ed 100644 --- a/site/src/pages/TemplatePage/TemplateLayout.tsx +++ b/site/src/pages/TemplatePage/TemplateLayout.tsx @@ -13,12 +13,12 @@ import { getTemplateByName, getTemplateVersion, } from "api/api"; +import { useOrganizationId } from "contexts/auth/useOrganizationId"; import { ErrorAlert } from "components/Alert/ErrorAlert"; import { Margins } from "components/Margins/Margins"; import { Loader } from "components/Loader/Loader"; -import { useOrganizationId } from "hooks/useOrganizationId"; -import { TemplatePageHeader } from "./TemplatePageHeader"; import { TabLink, Tabs } from "components/Tabs/Tabs"; +import { TemplatePageHeader } from "./TemplatePageHeader"; const templatePermissions = ( templateId: string, diff --git a/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsPage.tsx b/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsPage.tsx index e2c3d03c9f..adc760e4bc 100644 --- a/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsPage.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsPage.tsx @@ -1,16 +1,16 @@ -import { useMutation, useQueryClient } from "react-query"; -import { updateTemplateMeta } from "api/api"; -import { UpdateTemplateMeta } from "api/typesGenerated"; -import { displaySuccess } from "components/GlobalSnackbar/utils"; -import { FC } from "react"; +import { type FC } from "react"; import { Helmet } from "react-helmet-async"; +import { useMutation, useQueryClient } from "react-query"; import { useNavigate, useParams } from "react-router-dom"; import { pageTitle } from "utils/page"; +import { updateTemplateMeta } from "api/api"; +import type { UpdateTemplateMeta } from "api/typesGenerated"; +import { templateByNameKey } from "api/queries/templates"; +import { useOrganizationId } from "contexts/auth/useOrganizationId"; +import { useDashboard } from "components/Dashboard/DashboardProvider"; +import { displaySuccess } from "components/GlobalSnackbar/utils"; import { useTemplateSettings } from "../TemplateSettingsLayout"; import { TemplateSettingsPageView } from "./TemplateSettingsPageView"; -import { templateByNameKey } from "api/queries/templates"; -import { useOrganizationId } from "hooks"; -import { useDashboard } from "components/Dashboard/DashboardProvider"; export const TemplateSettingsPage: FC = () => { const { template: templateName } = useParams() as { template: string }; diff --git a/site/src/pages/TemplateSettingsPage/TemplatePermissionsPage/TemplatePermissionsPage.tsx b/site/src/pages/TemplateSettingsPage/TemplatePermissionsPage/TemplatePermissionsPage.tsx index 5b4bee3dee..264259270e 100644 --- a/site/src/pages/TemplateSettingsPage/TemplatePermissionsPage/TemplatePermissionsPage.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplatePermissionsPage/TemplatePermissionsPage.tsx @@ -1,19 +1,19 @@ import Button from "@mui/material/Button"; import Link from "@mui/material/Link"; import ArrowRightAltOutlined from "@mui/icons-material/ArrowRightAltOutlined"; -import { Paywall } from "components/Paywall/Paywall"; -import { Stack } from "components/Stack/Stack"; -import { useFeatureVisibility } from "hooks/useFeatureVisibility"; -import { useOrganizationId } from "hooks/useOrganizationId"; -import { FC } from "react"; +import { type FC } from "react"; import { Helmet } from "react-helmet-async"; -import { pageTitle } from "utils/page"; -import { useTemplateSettings } from "../TemplateSettingsLayout"; -import { TemplatePermissionsPageView } from "./TemplatePermissionsPageView"; -import { docs } from "utils/docs"; import { useMutation, useQuery, useQueryClient } from "react-query"; import { setGroupRole, setUserRole, templateACL } from "api/queries/templates"; +import { Paywall } from "components/Paywall/Paywall"; +import { Stack } from "components/Stack/Stack"; import { displaySuccess } from "components/GlobalSnackbar/utils"; +import { useFeatureVisibility } from "hooks/useFeatureVisibility"; +import { useOrganizationId } from "contexts/auth/useOrganizationId"; +import { pageTitle } from "utils/page"; +import { docs } from "utils/docs"; +import { useTemplateSettings } from "../TemplateSettingsLayout"; +import { TemplatePermissionsPageView } from "./TemplatePermissionsPageView"; export const TemplatePermissionsPage: FC< React.PropsWithChildren diff --git a/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateSchedulePage.tsx b/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateSchedulePage.tsx index ba76f413bd..8e75e29ae8 100644 --- a/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateSchedulePage.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateSchedulePage.tsx @@ -1,16 +1,16 @@ -import { useMutation, useQueryClient } from "react-query"; -import { updateTemplateMeta } from "api/api"; -import { UpdateTemplateMeta } from "api/typesGenerated"; -import { useDashboard } from "components/Dashboard/DashboardProvider"; -import { displaySuccess } from "components/GlobalSnackbar/utils"; import { type FC } from "react"; import { Helmet } from "react-helmet-async"; +import { useMutation, useQueryClient } from "react-query"; import { useNavigate, useParams } from "react-router-dom"; import { pageTitle } from "utils/page"; +import { updateTemplateMeta } from "api/api"; +import type { UpdateTemplateMeta } from "api/typesGenerated"; +import { templateByNameKey } from "api/queries/templates"; +import { useOrganizationId } from "contexts/auth/useOrganizationId"; +import { useDashboard } from "components/Dashboard/DashboardProvider"; +import { displaySuccess } from "components/GlobalSnackbar/utils"; import { useTemplateSettings } from "../TemplateSettingsLayout"; import { TemplateSchedulePageView } from "./TemplateSchedulePageView"; -import { useOrganizationId } from "hooks"; -import { templateByNameKey } from "api/queries/templates"; const TemplateSchedulePage: FC = () => { const { template: templateName } = useParams() as { template: string }; diff --git a/site/src/pages/TemplateSettingsPage/TemplateSettingsLayout.tsx b/site/src/pages/TemplateSettingsPage/TemplateSettingsLayout.tsx index 75e20440ed..01c4d99716 100644 --- a/site/src/pages/TemplateSettingsPage/TemplateSettingsLayout.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplateSettingsLayout.tsx @@ -1,16 +1,16 @@ import { createContext, type FC, Suspense, useContext } from "react"; import { Helmet } from "react-helmet-async"; import { useQuery } from "react-query"; -import { pageTitle } from "utils/page"; -import { Stack } from "components/Stack/Stack"; -import { Loader } from "components/Loader/Loader"; import { Outlet, useParams } from "react-router-dom"; -import { Margins } from "components/Margins/Margins"; -import { useOrganizationId } from "hooks/useOrganizationId"; +import { pageTitle } from "utils/page"; +import { useOrganizationId } from "contexts/auth/useOrganizationId"; +import { checkAuthorization } from "api/queries/authCheck"; import { templateByName } from "api/queries/templates"; import type { AuthorizationResponse, Template } from "api/typesGenerated"; import { ErrorAlert } from "components/Alert/ErrorAlert"; -import { checkAuthorization } from "api/queries/authCheck"; +import { Loader } from "components/Loader/Loader"; +import { Margins } from "components/Margins/Margins"; +import { Stack } from "components/Stack/Stack"; import { Sidebar } from "./Sidebar"; const TemplateSettings = createContext< diff --git a/site/src/pages/TemplateSettingsPage/TemplateVariablesPage/TemplateVariablesPage.tsx b/site/src/pages/TemplateSettingsPage/TemplateVariablesPage/TemplateVariablesPage.tsx index f45e9e7842..e98bde030a 100644 --- a/site/src/pages/TemplateSettingsPage/TemplateVariablesPage/TemplateVariablesPage.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplateVariablesPage/TemplateVariablesPage.tsx @@ -1,25 +1,25 @@ -import { +import { useCallback, type FC } from "react"; +import { Helmet } from "react-helmet-async"; +import { useMutation, useQuery, useQueryClient } from "react-query"; +import { useNavigate, useParams } from "react-router-dom"; +import type { CreateTemplateVersionRequest, TemplateVersionVariable, VariableValue, } from "api/typesGenerated"; import { displaySuccess } from "components/GlobalSnackbar/utils"; -import { useOrganizationId } from "hooks/useOrganizationId"; -import { useCallback, type FC } from "react"; -import { Helmet } from "react-helmet-async"; -import { useNavigate, useParams } from "react-router-dom"; +import { useOrganizationId } from "contexts/auth/useOrganizationId"; import { pageTitle } from "utils/page"; -import { useTemplateSettings } from "../TemplateSettingsLayout"; -import { TemplateVariablesPageView } from "./TemplateVariablesPageView"; import { createAndBuildTemplateVersion, templateVersion, templateVersionVariables, updateActiveTemplateVersion, } from "api/queries/templates"; -import { useMutation, useQuery, useQueryClient } from "react-query"; import { ErrorAlert } from "components/Alert/ErrorAlert"; import { Loader } from "components/Loader/Loader"; +import { useTemplateSettings } from "../TemplateSettingsLayout"; +import { TemplateVariablesPageView } from "./TemplateVariablesPageView"; export const TemplateVariablesPage: FC = () => { const { template: templateName } = useParams() as { diff --git a/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditorPage.tsx b/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditorPage.tsx index 27dc4330be..742a10316d 100644 --- a/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditorPage.tsx +++ b/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditorPage.tsx @@ -1,10 +1,20 @@ -import { TemplateVersionEditor } from "./TemplateVersionEditor"; -import { useOrganizationId } from "hooks/useOrganizationId"; -import { FC, useEffect, useState } from "react"; +import { type FC, useEffect, useState } from "react"; import { Helmet } from "react-helmet-async"; -import { useNavigate, useParams } from "react-router-dom"; -import { pageTitle } from "utils/page"; import { useMutation, useQuery, useQueryClient } from "react-query"; +import { useNavigate, useParams } from "react-router-dom"; +import { TemplateVersionEditor } from "./TemplateVersionEditor"; +import { useOrganizationId } from "contexts/auth/useOrganizationId"; +import { pageTitle } from "utils/page"; +import { + patchTemplateVersion, + updateActiveTemplateVersion, + watchBuildLogsByTemplateVersionId, +} from "api/api"; +import type { + PatchTemplateVersionRequest, + ProvisionerJobLog, + TemplateVersion, +} from "api/typesGenerated"; import { createTemplateVersion, resources, @@ -19,16 +29,6 @@ import { createTemplateVersionFileTree, isAllowedFile, } from "utils/templateVersion"; -import { - patchTemplateVersion, - updateActiveTemplateVersion, - watchBuildLogsByTemplateVersionId, -} from "api/api"; -import { - PatchTemplateVersionRequest, - ProvisionerJobLog, - TemplateVersion, -} from "api/typesGenerated"; import { displayError } from "components/GlobalSnackbar/utils"; import { FullScreenLoader } from "components/Loader/FullScreenLoader"; diff --git a/site/src/pages/TemplateVersionPage/TemplateVersionPage.tsx b/site/src/pages/TemplateVersionPage/TemplateVersionPage.tsx index fdc9f20afd..887ffca6d8 100644 --- a/site/src/pages/TemplateVersionPage/TemplateVersionPage.tsx +++ b/site/src/pages/TemplateVersionPage/TemplateVersionPage.tsx @@ -1,18 +1,18 @@ -import { usePermissions } from "hooks/usePermissions"; -import { useOrganizationId } from "hooks/useOrganizationId"; import { type FC, useMemo } from "react"; import { Helmet } from "react-helmet-async"; -import { useParams } from "react-router-dom"; -import { pageTitle } from "utils/page"; -import TemplateVersionPageView from "./TemplateVersionPageView"; import { useQuery } from "react-query"; +import { useParams } from "react-router-dom"; +import { usePermissions } from "contexts/auth/usePermissions"; +import { useOrganizationId } from "contexts/auth/useOrganizationId"; +import { pageTitle } from "utils/page"; +import { useFileTab } from "components/TemplateFiles/TemplateFiles"; +import TemplateVersionPageView from "./TemplateVersionPageView"; import { templateByName, templateFiles, templateVersion, templateVersionByName, } from "api/queries/templates"; -import { useFileTab } from "components/TemplateFiles/TemplateFiles"; type Params = { version: string; diff --git a/site/src/pages/TemplatesPage/TemplatesPage.tsx b/site/src/pages/TemplatesPage/TemplatesPage.tsx index 80b39c2644..33ca81fee0 100644 --- a/site/src/pages/TemplatesPage/TemplatesPage.tsx +++ b/site/src/pages/TemplatesPage/TemplatesPage.tsx @@ -1,11 +1,11 @@ -import { useOrganizationId } from "hooks/useOrganizationId"; -import { usePermissions } from "hooks/usePermissions"; -import { FC } from "react"; +import { type FC } from "react"; import { Helmet } from "react-helmet-async"; +import { useQuery } from "react-query"; +import { templateExamples, templates } from "api/queries/templates"; +import { useOrganizationId } from "contexts/auth/useOrganizationId"; +import { usePermissions } from "contexts/auth/usePermissions"; import { pageTitle } from "utils/page"; import { TemplatesPageView } from "./TemplatesPageView"; -import { templateExamples, templates } from "api/queries/templates"; -import { useQuery } from "react-query"; export const TemplatesPage: FC = () => { const organizationId = useOrganizationId(); diff --git a/site/src/pages/UserSettingsPage/AccountPage/AccountPage.tsx b/site/src/pages/UserSettingsPage/AccountPage/AccountPage.tsx index 863027a1c4..c2e7512a29 100644 --- a/site/src/pages/UserSettingsPage/AccountPage/AccountPage.tsx +++ b/site/src/pages/UserSettingsPage/AccountPage/AccountPage.tsx @@ -1,12 +1,12 @@ -import { Stack } from "@mui/system"; import { type FC } from "react"; import { useQuery } from "react-query"; -import { useOrganizationId } from "hooks"; -import { useMe } from "hooks/useMe"; -import { usePermissions } from "hooks/usePermissions"; import { groupsForUser } from "api/queries/groups"; -import { useAuth } from "contexts/AuthProvider/AuthProvider"; +import { useAuth } from "contexts/auth/useAuth"; +import { useMe } from "contexts/auth/useMe"; +import { useOrganizationId } from "contexts/auth/useOrganizationId"; +import { usePermissions } from "contexts/auth/usePermissions"; import { useDashboard } from "components/Dashboard/DashboardProvider"; +import { Stack } from "components/Stack/Stack"; import { Section } from "../Section"; import { AccountUserGroups } from "./AccountUserGroups"; import { AccountForm } from "./AccountForm"; diff --git a/site/src/pages/UserSettingsPage/AppearancePage/AppearancePage.tsx b/site/src/pages/UserSettingsPage/AppearancePage/AppearancePage.tsx index 924aad6dc5..0fcaf3c104 100644 --- a/site/src/pages/UserSettingsPage/AppearancePage/AppearancePage.tsx +++ b/site/src/pages/UserSettingsPage/AppearancePage/AppearancePage.tsx @@ -3,7 +3,7 @@ import { type FC } from "react"; import { useMutation, useQueryClient } from "react-query"; import { updateAppearanceSettings } from "api/queries/users"; import { Stack } from "components/Stack/Stack"; -import { useMe } from "hooks"; +import { useMe } from "contexts/auth/useMe"; import { Section } from "../Section"; import { AppearanceForm } from "./AppearanceForm"; diff --git a/site/src/pages/UserSettingsPage/Layout.tsx b/site/src/pages/UserSettingsPage/Layout.tsx index 573c39362a..4d9ae5ce6a 100644 --- a/site/src/pages/UserSettingsPage/Layout.tsx +++ b/site/src/pages/UserSettingsPage/Layout.tsx @@ -2,7 +2,7 @@ import { type FC, Suspense } from "react"; import { Outlet } from "react-router-dom"; import { Helmet } from "react-helmet-async"; import { pageTitle } from "utils/page"; -import { useMe } from "hooks/useMe"; +import { useMe } from "contexts/auth/useMe"; import { Loader } from "components/Loader/Loader"; import { Margins } from "components/Margins/Margins"; import { Stack } from "components/Stack/Stack"; diff --git a/site/src/pages/UserSettingsPage/SchedulePage/SchedulePage.tsx b/site/src/pages/UserSettingsPage/SchedulePage/SchedulePage.tsx index 26aea75853..f41362232a 100644 --- a/site/src/pages/UserSettingsPage/SchedulePage/SchedulePage.tsx +++ b/site/src/pages/UserSettingsPage/SchedulePage/SchedulePage.tsx @@ -1,7 +1,7 @@ import { type FC } from "react"; import { useMutation, useQuery, useQueryClient } from "react-query"; import { ErrorAlert } from "components/Alert/ErrorAlert"; -import { useMe } from "hooks/useMe"; +import { useMe } from "contexts/auth/useMe"; import { Loader } from "components/Loader/Loader"; import { updateUserQuietHoursSchedule, diff --git a/site/src/pages/UserSettingsPage/SecurityPage/SecurityPage.tsx b/site/src/pages/UserSettingsPage/SecurityPage/SecurityPage.tsx index f7a6847dbc..1d2075f577 100644 --- a/site/src/pages/UserSettingsPage/SecurityPage/SecurityPage.tsx +++ b/site/src/pages/UserSettingsPage/SecurityPage/SecurityPage.tsx @@ -2,7 +2,7 @@ import { type ComponentProps, type FC } from "react"; import { useMutation, useQuery } from "react-query"; import { getUserLoginType } from "api/api"; import { authMethods, updatePassword } from "api/queries/users"; -import { useMe } from "hooks/useMe"; +import { useMe } from "contexts/auth/useMe"; import { Loader } from "components/Loader/Loader"; import { Stack } from "components/Stack/Stack"; import { displaySuccess } from "components/GlobalSnackbar/utils"; diff --git a/site/src/pages/UsersPage/UsersLayout.tsx b/site/src/pages/UsersPage/UsersLayout.tsx index 454e48aec4..e2a7c00e94 100644 --- a/site/src/pages/UsersPage/UsersLayout.tsx +++ b/site/src/pages/UsersPage/UsersLayout.tsx @@ -2,12 +2,12 @@ import Button from "@mui/material/Button"; import Link from "@mui/material/Link"; import GroupAdd from "@mui/icons-material/GroupAddOutlined"; import PersonAdd from "@mui/icons-material/PersonAddOutlined"; +import { type FC, Suspense } from "react"; +import { Link as RouterLink, Outlet, useNavigate } from "react-router-dom"; import { USERS_LINK } from "components/Dashboard/Navbar/NavbarView"; import { PageHeader, PageHeaderTitle } from "components/PageHeader/PageHeader"; import { useFeatureVisibility } from "hooks/useFeatureVisibility"; -import { usePermissions } from "hooks/usePermissions"; -import { FC, Suspense } from "react"; -import { Link as RouterLink, Outlet, useNavigate } from "react-router-dom"; +import { usePermissions } from "contexts/auth/usePermissions"; import { Margins } from "components/Margins/Margins"; import { TabLink, Tabs } from "components/Tabs/Tabs"; import { Loader } from "components/Loader/Loader"; diff --git a/site/src/pages/UsersPage/UsersPage.tsx b/site/src/pages/UsersPage/UsersPage.tsx index a7db041bd6..165254a359 100644 --- a/site/src/pages/UsersPage/UsersPage.tsx +++ b/site/src/pages/UsersPage/UsersPage.tsx @@ -1,5 +1,7 @@ -import { type FC, type PropsWithChildren, useState } from "react"; - +import { type FC, useState } from "react"; +import { Helmet } from "react-helmet-async"; +import { useMutation, useQuery, useQueryClient } from "react-query"; +import { useSearchParams, useNavigate } from "react-router-dom"; import { type User } from "api/typesGenerated"; import { roles } from "api/queries/roles"; import { groupsByUserId } from "api/queries/groups"; @@ -14,28 +16,23 @@ import { updateRoles, authMethods, } from "api/queries/users"; - -import { useMutation, useQuery, useQueryClient } from "react-query"; -import { useSearchParams, useNavigate } from "react-router-dom"; -import { useOrganizationId } from "hooks"; -import { useMe } from "hooks/useMe"; -import { usePermissions } from "hooks/usePermissions"; -import { useStatusFilterMenu } from "./UsersFilter"; +import { useOrganizationId } from "contexts/auth/useOrganizationId"; +import { useMe } from "contexts/auth/useMe"; +import { usePermissions } from "contexts/auth/usePermissions"; import { useFilter } from "components/Filter/filter"; import { useDashboard } from "components/Dashboard/DashboardProvider"; -import { generateRandomString } from "utils/random"; - -import { Helmet } from "react-helmet-async"; import { DeleteDialog } from "components/Dialogs/DeleteDialog/DeleteDialog"; -import { isNonInitialPage } from "components/PaginationWidget/utils"; import { ConfirmDialog } from "components/Dialogs/ConfirmDialog/ConfirmDialog"; -import { ResetPasswordDialog } from "./ResetPasswordDialog"; -import { pageTitle } from "utils/page"; -import { UsersPageView } from "./UsersPageView"; import { displayError, displaySuccess } from "components/GlobalSnackbar/utils"; +import { isNonInitialPage } from "components/PaginationWidget/utils"; import { usePaginatedQuery } from "hooks/usePaginatedQuery"; +import { pageTitle } from "utils/page"; +import { generateRandomString } from "utils/random"; +import { ResetPasswordDialog } from "./ResetPasswordDialog"; +import { useStatusFilterMenu } from "./UsersFilter"; +import { UsersPageView } from "./UsersPageView"; -export const UsersPage: FC = () => { +export const UsersPage: FC = () => { const queryClient = useQueryClient(); const navigate = useNavigate(); diff --git a/site/src/pages/WorkspacePage/WorkspacePage.tsx b/site/src/pages/WorkspacePage/WorkspacePage.tsx index e2c3d4b1fe..c70f83de63 100644 --- a/site/src/pages/WorkspacePage/WorkspacePage.tsx +++ b/site/src/pages/WorkspacePage/WorkspacePage.tsx @@ -1,20 +1,20 @@ -import { Loader } from "components/Loader/Loader"; -import { FC, useEffect } from "react"; -import { useParams } from "react-router-dom"; -import { WorkspaceReadyPage } from "./WorkspaceReadyPage"; -import { ErrorAlert } from "components/Alert/ErrorAlert"; -import { useOrganizationId } from "hooks"; -import { Margins } from "components/Margins/Margins"; +import { type FC, useEffect } from "react"; import { useQuery, useQueryClient } from "react-query"; +import { useParams } from "react-router-dom"; +import { useEffectEvent } from "hooks/hookPolyfills"; +import { useOrganizationId } from "contexts/auth/useOrganizationId"; +import { watchWorkspace } from "api/api"; +import type { Workspace } from "api/typesGenerated"; import { workspaceBuildsKey } from "api/queries/workspaceBuilds"; import { templateByName } from "api/queries/templates"; import { workspaceByOwnerAndName } from "api/queries/workspaces"; import { checkAuthorization } from "api/queries/authCheck"; -import { WorkspacePermissions, workspaceChecks } from "./permissions"; -import { watchWorkspace } from "api/api"; -import { Workspace } from "api/typesGenerated"; -import { useEffectEvent } from "hooks/hookPolyfills"; +import { ErrorAlert } from "components/Alert/ErrorAlert"; +import { Loader } from "components/Loader/Loader"; +import { Margins } from "components/Margins/Margins"; import { Navbar } from "components/Dashboard/Navbar/Navbar"; +import { WorkspacePermissions, workspaceChecks } from "./permissions"; +import { WorkspaceReadyPage } from "./WorkspaceReadyPage"; export const WorkspacePage: FC = () => { const queryClient = useQueryClient(); diff --git a/site/src/pages/WorkspacePage/WorkspaceReadyPage.tsx b/site/src/pages/WorkspacePage/WorkspaceReadyPage.tsx index 73ff4b623b..a39876e1bb 100644 --- a/site/src/pages/WorkspacePage/WorkspaceReadyPage.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceReadyPage.tsx @@ -1,23 +1,23 @@ -import { useDashboard } from "components/Dashboard/DashboardProvider"; -import { useFeatureVisibility } from "hooks/useFeatureVisibility"; +import dayjs from "dayjs"; import { type FC, useEffect, useState } from "react"; import { Helmet } from "react-helmet-async"; -import { useNavigate } from "react-router-dom"; -import { Workspace } from "./Workspace"; -import { pageTitle } from "utils/page"; -import { UpdateBuildParametersDialog } from "./UpdateBuildParametersDialog"; -import { ChangeVersionDialog } from "./ChangeVersionDialog"; import { useMutation, useQuery, useQueryClient } from "react-query"; +import { useNavigate } from "react-router-dom"; import { MissingBuildParameters, restartWorkspace } from "api/api"; +import { useFeatureVisibility } from "hooks/useFeatureVisibility"; +import { pageTitle } from "utils/page"; +import { getErrorMessage } from "api/errors"; +import type * as TypesGen from "api/typesGenerated"; +import { templateVersion, templateVersions } from "api/queries/templates"; +import { deploymentConfig, deploymentSSHConfig } from "api/queries/deployment"; +import { useDashboard } from "components/Dashboard/DashboardProvider"; import { ConfirmDialog, ConfirmDialogProps, } from "components/Dialogs/ConfirmDialog/ConfirmDialog"; -import * as TypesGen from "api/typesGenerated"; -import { WorkspaceBuildLogsSection } from "./WorkspaceBuildLogsSection"; -import { templateVersion, templateVersions } from "api/queries/templates"; import { Alert } from "components/Alert/Alert"; import { Stack } from "components/Stack/Stack"; +import { useMe } from "contexts/auth/useMe"; import { useWorkspaceBuildLogs } from "hooks/useWorkspaceBuildLogs"; import { activate, @@ -28,13 +28,13 @@ import { startWorkspace, cancelBuild, } from "api/queries/workspaces"; -import { getErrorMessage } from "api/errors"; import { displayError } from "components/GlobalSnackbar/utils"; -import { deploymentConfig, deploymentSSHConfig } from "api/queries/deployment"; import { WorkspacePermissions } from "./permissions"; +import { ChangeVersionDialog } from "./ChangeVersionDialog"; +import { UpdateBuildParametersDialog } from "./UpdateBuildParametersDialog"; +import { Workspace } from "./Workspace"; +import { WorkspaceBuildLogsSection } from "./WorkspaceBuildLogsSection"; import { WorkspaceDeleteDialog } from "./WorkspaceDeleteDialog"; -import dayjs from "dayjs"; -import { useMe } from "hooks"; interface WorkspaceReadyPageProps { template: TypesGen.Template; diff --git a/site/src/pages/WorkspacesPage/WorkspacesPage.tsx b/site/src/pages/WorkspacesPage/WorkspacesPage.tsx index 303ead72df..077e85c6f8 100644 --- a/site/src/pages/WorkspacesPage/WorkspacesPage.tsx +++ b/site/src/pages/WorkspacesPage/WorkspacesPage.tsx @@ -1,22 +1,23 @@ -import { usePagination } from "hooks/usePagination"; -import { Workspace } from "api/typesGenerated"; -import { useDashboard } from "components/Dashboard/DashboardProvider"; import { type FC, useEffect, useState } from "react"; import { Helmet } from "react-helmet-async"; -import { pageTitle } from "utils/page"; -import { useWorkspacesData, useWorkspaceUpdate } from "./data"; -import { WorkspacesPageView } from "./WorkspacesPageView"; -import { useOrganizationId, usePermissions } from "hooks"; -import { useTemplateFilterMenu, useStatusFilterMenu } from "./filter/menus"; +import { useQuery } from "react-query"; import { useSearchParams } from "react-router-dom"; +import { templates } from "api/queries/templates"; +import type { Workspace } from "api/typesGenerated"; +import { useOrganizationId } from "contexts/auth/useOrganizationId"; +import { usePermissions } from "contexts/auth/usePermissions"; +import { usePagination } from "hooks/usePagination"; +import { pageTitle } from "utils/page"; +import { useDashboard } from "components/Dashboard/DashboardProvider"; import { useFilter } from "components/Filter/filter"; import { useUserFilterMenu } from "components/Filter/UserFilter"; import { useEffectEvent } from "hooks/hookPolyfills"; -import { useQuery } from "react-query"; -import { templates } from "api/queries/templates"; import { useBatchActions } from "./batchActions"; +import { useWorkspacesData, useWorkspaceUpdate } from "./data"; +import { useTemplateFilterMenu, useStatusFilterMenu } from "./filter/menus"; import { BatchDeleteConfirmation } from "./BatchDeleteConfirmation"; import { BatchUpdateConfirmation } from "./BatchUpdateConfirmation"; +import { WorkspacesPageView } from "./WorkspacesPageView"; function useSafeSearchParams() { // Have to wrap setSearchParams because React Router doesn't make sure that diff --git a/site/src/testHelpers/entities.ts b/site/src/testHelpers/entities.ts index 5915363346..9075f02f4c 100644 --- a/site/src/testHelpers/entities.ts +++ b/site/src/testHelpers/entities.ts @@ -6,7 +6,7 @@ import { import { FieldError } from "api/errors"; import type * as TypesGen from "api/typesGenerated"; import range from "lodash/range"; -import { Permissions } from "contexts/AuthProvider/permissions"; +import type { Permissions } from "contexts/auth/permissions"; import { TemplateVersionFiles } from "utils/templateVersion"; import { FileTree } from "utils/filetree"; import { ProxyLatencyReport } from "contexts/useProxyLatency"; diff --git a/site/src/testHelpers/handlers.ts b/site/src/testHelpers/handlers.ts index 8b1b2a6a09..416f10ef8a 100644 --- a/site/src/testHelpers/handlers.ts +++ b/site/src/testHelpers/handlers.ts @@ -1,6 +1,6 @@ import { rest } from "msw"; import { CreateWorkspaceBuildRequest } from "api/typesGenerated"; -import { permissionsToCheck } from "contexts/AuthProvider/permissions"; +import { permissionsToCheck } from "contexts/auth/permissions"; import * as M from "./entities"; import { MockGroup, MockWorkspaceQuota } from "./entities"; import fs from "fs"; diff --git a/site/src/testHelpers/renderHelpers.tsx b/site/src/testHelpers/renderHelpers.tsx index 4d16b40a44..e0203676a9 100644 --- a/site/src/testHelpers/renderHelpers.tsx +++ b/site/src/testHelpers/renderHelpers.tsx @@ -9,7 +9,7 @@ import { QueryClient } from "react-query"; import { AppProviders } from "App"; import { ThemeProvider } from "contexts/ThemeProvider"; import { DashboardLayout } from "components/Dashboard/DashboardLayout"; -import { RequireAuth } from "components/RequireAuth/RequireAuth"; +import { RequireAuth } from "contexts/auth/RequireAuth"; import { TemplateSettingsLayout } from "pages/TemplateSettingsPage/TemplateSettingsLayout"; import { WorkspaceSettingsLayout } from "pages/WorkspaceSettingsPage/WorkspaceSettingsLayout"; import {