diff --git a/site/.storybook/preview.tsx b/site/.storybook/preview.tsx index 899e05b1e5..037356db6d 100644 --- a/site/.storybook/preview.tsx +++ b/site/.storybook/preview.tsx @@ -1,4 +1,5 @@ import "../src/index.css"; +import "../src/theme/globalFonts"; import { ThemeProvider as EmotionThemeProvider } from "@emotion/react"; import CssBaseline from "@mui/material/CssBaseline"; import { @@ -6,13 +7,12 @@ import { StyledEngineProvider, } from "@mui/material/styles"; import { DecoratorHelpers } from "@storybook/addon-themes"; +import type { Decorator, Loader, Parameters } from "@storybook/react-vite"; import isChromatic from "chromatic/isChromatic"; import { StrictMode } from "react"; import { QueryClient, QueryClientProvider } from "react-query"; import { withRouter } from "storybook-addon-remix-react-router"; import { TooltipProvider } from "../src/components/Tooltip/Tooltip"; -import "theme/globalFonts"; -import type { Decorator, Loader, Parameters } from "@storybook/react-vite"; import themes from "../src/theme"; DecoratorHelpers.initializeThemeState(Object.keys(themes), "dark"); diff --git a/site/jest.config.ts b/site/jest.config.ts index e7a07a4a1d..cc082d2aba 100644 --- a/site/jest.config.ts +++ b/site/jest.config.ts @@ -34,7 +34,7 @@ module.exports = { testRegex: "(/__tests__/.*|(\\.|/)(jest))\\.tsx?$", testPathIgnorePatterns: ["/node_modules/", "/e2e/"], transformIgnorePatterns: [], - moduleDirectories: ["node_modules", "/src"], + moduleDirectories: ["node_modules"], moduleNameMapper: { "\\.css$": "/src/testHelpers/styleMock.ts", "^@fontsource": "/src/testHelpers/styleMock.ts", diff --git a/site/jest.setup.ts b/site/jest.setup.ts index a775eccbe6..a2708e769a 100644 --- a/site/jest.setup.ts +++ b/site/jest.setup.ts @@ -2,15 +2,15 @@ import "@testing-library/jest-dom"; import "jest-location-mock"; import crypto from "node:crypto"; import { cleanup } from "@testing-library/react"; -import type { ProxyLatencyReport } from "contexts/useProxyLatency"; import { useMemo } from "react"; import type { Region } from "#/api/typesGenerated"; +import type { ProxyLatencyReport } from "#/contexts/useProxyLatency"; import { server } from "#/testHelpers/server"; // useProxyLatency does some http requests to determine latency. // This would fail unit testing, or at least make it very slow with // actual network requests. So just globally mock this hook. -jest.mock("contexts/useProxyLatency", () => ({ +jest.mock("#/contexts/useProxyLatency", () => ({ useProxyLatency: (proxies?: Region[]) => { // Must use `useMemo` here to avoid infinite loop. // Mocking the hook with a hook. diff --git a/site/src/api/queries/chats.test.ts b/site/src/api/queries/chats.test.ts index 71bf44e0fa..30c5595cd8 100644 --- a/site/src/api/queries/chats.test.ts +++ b/site/src/api/queries/chats.test.ts @@ -29,7 +29,7 @@ import { updateInfiniteChatsCache, } from "./chats"; -vi.mock("api/api", () => ({ +vi.mock("#/api/api", () => ({ API: { experimental: { updateChat: vi.fn(), diff --git a/site/src/api/queries/workspaces.ts b/site/src/api/queries/workspaces.ts index b773985359..3828d7b560 100644 --- a/site/src/api/queries/workspaces.ts +++ b/site/src/api/queries/workspaces.ts @@ -1,5 +1,4 @@ import type { Dayjs } from "dayjs"; -import type { ConnectionStatus } from "pages/TerminalPage/types"; import type { MutationOptions, QueryClient, @@ -29,6 +28,7 @@ import { type WorkspacePermissions, workspaceChecks, } from "#/modules/workspaces/permissions"; +import type { ConnectionStatus } from "#/pages/TerminalPage/types"; import { checkAuthorization } from "./authCheck"; import { disabledRefetchOptions } from "./util"; import { workspaceBuildsKey } from "./workspaceBuilds"; diff --git a/site/src/components/Filter/UserFilter.tsx b/site/src/components/Filter/UserFilter.tsx index ff03f059a7..04d7f5a9bc 100644 --- a/site/src/components/Filter/UserFilter.tsx +++ b/site/src/components/Filter/UserFilter.tsx @@ -1,4 +1,3 @@ -import { useAuthenticated } from "hooks"; import type { FC } from "react"; import { API } from "#/api/api"; import { Avatar } from "#/components/Avatar/Avatar"; @@ -7,6 +6,7 @@ import { SelectFilter, type SelectFilterOption, } from "#/components/Filter/SelectFilter"; +import { useAuthenticated } from "#/hooks/useAuthenticated"; import { type UseFilterMenuOptions, useFilterMenu } from "./menu"; export const DEFAULT_USER_FILTER_WIDTH = 175; diff --git a/site/src/components/MultiUserSelect/MultiMemberSelect.stories.tsx b/site/src/components/MultiUserSelect/MultiMemberSelect.stories.tsx index eb376eded9..4671c150b4 100644 --- a/site/src/components/MultiUserSelect/MultiMemberSelect.stories.tsx +++ b/site/src/components/MultiUserSelect/MultiMemberSelect.stories.tsx @@ -1,5 +1,5 @@ import type { Meta, StoryObj } from "@storybook/react-vite"; -import { organizationMembersKey } from "api/queries/organizations"; +import { organizationMembersKey } from "#/api/queries/organizations"; import { MockOrganizationMember } from "#/testHelpers/entities"; import { MultiMemberSelect } from "./MultiUserSelect"; diff --git a/site/src/components/MultiUserSelect/MultiUserSelect.stories.tsx b/site/src/components/MultiUserSelect/MultiUserSelect.stories.tsx index f03ea4993a..49af7c0d2a 100644 --- a/site/src/components/MultiUserSelect/MultiUserSelect.stories.tsx +++ b/site/src/components/MultiUserSelect/MultiUserSelect.stories.tsx @@ -1,8 +1,8 @@ import type { Meta, StoryObj } from "@storybook/react-vite"; -import { API } from "api/api"; -import { usersKey } from "api/queries/users"; -import { MockUsers } from "pages/UsersPage/storybookData/users"; import { spyOn } from "storybook/test"; +import { API } from "#/api/api"; +import { usersKey } from "#/api/queries/users"; +import { MockUsers } from "#/pages/UsersPage/storybookData/users"; import { mockApiError } from "#/testHelpers/entities"; import { MultiUserSelect } from "./MultiUserSelect"; diff --git a/site/src/components/MultiUserSelect/MultiUserSelect.tsx b/site/src/components/MultiUserSelect/MultiUserSelect.tsx index 1d200d5f2a..fa73ecec31 100644 --- a/site/src/components/MultiUserSelect/MultiUserSelect.tsx +++ b/site/src/components/MultiUserSelect/MultiUserSelect.tsx @@ -1,25 +1,30 @@ -import { organizationMembers } from "api/queries/organizations"; -import { users } from "api/queries/users"; +import { type FC, type ReactNode, useState } from "react"; +import { keepPreviousData, useQuery } from "react-query"; +import { organizationMembers } from "#/api/queries/organizations"; +import { users } from "#/api/queries/users"; import type { OrganizationMemberWithUserData, ReducedUser, User, -} from "api/typesGenerated"; -import { ErrorAlert } from "components/Alert/ErrorAlert"; -import { AvatarData } from "components/Avatar/AvatarData"; -import { AvatarDataSkeleton } from "components/Avatar/AvatarDataSkeleton"; -import { Checkbox } from "components/Checkbox/Checkbox"; -import { EmptyState } from "components/EmptyState/EmptyState"; -import { SearchField } from "components/SearchField/SearchField"; -import { Table, TableBody, TableCell, TableRow } from "components/Table/Table"; +} from "#/api/typesGenerated"; +import { ErrorAlert } from "#/components/Alert/ErrorAlert"; +import { AvatarData } from "#/components/Avatar/AvatarData"; +import { AvatarDataSkeleton } from "#/components/Avatar/AvatarDataSkeleton"; +import { Checkbox } from "#/components/Checkbox/Checkbox"; +import { EmptyState } from "#/components/EmptyState/EmptyState"; +import { SearchField } from "#/components/SearchField/SearchField"; +import { + Table, + TableBody, + TableCell, + TableRow, +} from "#/components/Table/Table"; import { TableLoaderSkeleton, TableRowSkeleton, -} from "components/TableLoader/TableLoader"; -import { useDebouncedFunction } from "hooks/debounce"; -import { useClickableTableRow } from "hooks/useClickableTableRow"; -import { type FC, type ReactNode, useState } from "react"; -import { keepPreviousData, useQuery } from "react-query"; +} from "#/components/TableLoader/TableLoader"; +import { useDebouncedFunction } from "#/hooks/debounce"; +import { useClickableTableRow } from "#/hooks/useClickableTableRow"; import { cn } from "#/utils/cn"; import { prepareQuery } from "#/utils/filters"; diff --git a/site/src/components/ai-elements/tool.stories.tsx b/site/src/components/ai-elements/tool.stories.tsx index f1f526c776..4f7aead699 100644 --- a/site/src/components/ai-elements/tool.stories.tsx +++ b/site/src/components/ai-elements/tool.stories.tsx @@ -496,7 +496,7 @@ const sampleMCPServers = [ created_at: "2025-01-01T00:00:00Z", updated_at: "2025-01-01T00:00:00Z", }, -] satisfies readonly import("api/typesGenerated").MCPServerConfig[]; +] satisfies readonly import("#/api/typesGenerated").MCPServerConfig[]; export const MCPToolRunning: Story = { args: { diff --git a/site/src/components/ai-elements/tool/InlineDesktopPreview.tsx b/site/src/components/ai-elements/tool/InlineDesktopPreview.tsx index 09d16fb370..9f0191be3d 100644 --- a/site/src/components/ai-elements/tool/InlineDesktopPreview.tsx +++ b/site/src/components/ai-elements/tool/InlineDesktopPreview.tsx @@ -1,11 +1,11 @@ import { ExternalLinkIcon } from "lucide-react"; -import { - type UseDesktopConnectionResult, - useDesktopConnection, -} from "pages/AgentsPage/hooks/useDesktopConnection"; import type React from "react"; import { useEffect, useRef, useState } from "react"; import { Spinner } from "#/components/Spinner/Spinner"; +import { + type UseDesktopConnectionResult, + useDesktopConnection, +} from "#/pages/AgentsPage/hooks/useDesktopConnection"; /** Default aspect ratio used before the remote framebuffer size is known. */ const DEFAULT_ASPECT = "16 / 9"; diff --git a/site/src/contexts/ProxyContext.test.tsx b/site/src/contexts/ProxyContext.test.tsx index a2c901a4b5..beb8d27df0 100644 --- a/site/src/contexts/ProxyContext.test.tsx +++ b/site/src/contexts/ProxyContext.test.tsx @@ -1,4 +1,4 @@ -import "testHelpers/localStorage"; +import "#/testHelpers/localStorage"; import { screen } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { HttpResponse, http } from "msw"; @@ -23,7 +23,7 @@ import { import type * as ProxyLatency from "./useProxyLatency"; // Mock useProxyLatency to use a hard-coded latency. -vi.mock("contexts/useProxyLatency", () => ({ +vi.mock("#/contexts/useProxyLatency", () => ({ useProxyLatency: () => { return { proxyLatencies: hardCodedLatencies, diff --git a/site/src/contexts/ProxyContext.tsx b/site/src/contexts/ProxyContext.tsx index f7933b1dd7..a019de6770 100644 --- a/site/src/contexts/ProxyContext.tsx +++ b/site/src/contexts/ProxyContext.tsx @@ -1,4 +1,3 @@ -import { useAuthenticated } from "hooks"; import { createContext, type FC, @@ -12,6 +11,7 @@ import { useQuery } from "react-query"; import { API } from "#/api/api"; import { cachedQuery } from "#/api/queries/util"; import type { Region, WorkspaceProxy } from "#/api/typesGenerated"; +import { useAuthenticated } from "#/hooks/useAuthenticated"; import { useEmbeddedMetadata } from "#/hooks/useEmbeddedMetadata"; import { type ProxyLatencyReport, useProxyLatency } from "./useProxyLatency"; diff --git a/site/src/contexts/auth/RequireAuth.test.tsx b/site/src/contexts/auth/RequireAuth.test.tsx index 54fa2569e9..d5a7336faa 100644 --- a/site/src/contexts/auth/RequireAuth.test.tsx +++ b/site/src/contexts/auth/RequireAuth.test.tsx @@ -1,8 +1,8 @@ import { renderHook, screen } from "@testing-library/react"; -import { useAuthenticated } from "hooks"; import { HttpResponse, http } from "msw"; import type { FC, PropsWithChildren } from "react"; import { QueryClientProvider } from "react-query"; +import { useAuthenticated } from "#/hooks/useAuthenticated"; import { MockPermissions, MockUserOwner } from "#/testHelpers/entities"; import { createTestQueryClient, diff --git a/site/src/contexts/auth/RequireAuth.tsx b/site/src/contexts/auth/RequireAuth.tsx index 246c6e98be..a4dc18e118 100644 --- a/site/src/contexts/auth/RequireAuth.tsx +++ b/site/src/contexts/auth/RequireAuth.tsx @@ -1,9 +1,9 @@ -import { ProxyProvider as ProductionProxyProvider } from "contexts/ProxyContext"; import { type FC, useEffect } from "react"; import { Navigate, Outlet, useLocation } from "react-router"; import { API } from "#/api/api"; import { isApiError } from "#/api/errors"; import { Loader } from "#/components/Loader/Loader"; +import { ProxyProvider as ProductionProxyProvider } from "#/contexts/ProxyContext"; import { DashboardProvider as ProductionDashboardProvider } from "#/modules/dashboard/DashboardProvider"; import { embedRedirect } from "#/utils/redirect"; import { useAuthContext } from "./AuthProvider"; diff --git a/site/src/hooks/index.ts b/site/src/hooks/index.ts deleted file mode 100644 index 901fee8a50..0000000000 --- a/site/src/hooks/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export * from "./useAuthenticated"; -export * from "./useClickable"; -export * from "./useClickableTableRow"; -export * from "./useClipboard"; -export * from "./usePagination"; diff --git a/site/src/modules/apps/useAppLink.ts b/site/src/modules/apps/useAppLink.ts index c10b1fc2fe..497c18e184 100644 --- a/site/src/modules/apps/useAppLink.ts +++ b/site/src/modules/apps/useAppLink.ts @@ -1,4 +1,3 @@ -import { useProxy } from "contexts/ProxyContext"; import type React from "react"; import { useQuery } from "react-query"; import { toast } from "sonner"; @@ -8,6 +7,7 @@ import type { WorkspaceAgent, WorkspaceApp, } from "#/api/typesGenerated"; +import { useProxy } from "#/contexts/ProxyContext"; import { getAppHref, isExternalApp, diff --git a/site/src/modules/dashboard/AIGovernanceSeatBanner/AIGovernanceSeatBannerView.stories.tsx b/site/src/modules/dashboard/AIGovernanceSeatBanner/AIGovernanceSeatBannerView.stories.tsx index ae2a04ddcf..e2c6767999 100644 --- a/site/src/modules/dashboard/AIGovernanceSeatBanner/AIGovernanceSeatBannerView.stories.tsx +++ b/site/src/modules/dashboard/AIGovernanceSeatBanner/AIGovernanceSeatBannerView.stories.tsx @@ -1,7 +1,7 @@ -import { chromatic } from "testHelpers/chromatic"; import type { Meta, StoryObj } from "@storybook/react-vite"; -import { LicenseAIGovernance90PercentWarningText } from "api/typesGenerated"; import { expect, within } from "storybook/test"; +import { LicenseAIGovernance90PercentWarningText } from "#/api/typesGenerated"; +import { chromatic } from "#/testHelpers/chromatic"; import { AIGovernanceSeatBannerView } from "./AIGovernanceSeatBannerView"; const meta: Meta = { diff --git a/site/src/modules/dashboard/AIGovernanceSeatBanner/AIGovernanceSeatBannerView.tsx b/site/src/modules/dashboard/AIGovernanceSeatBanner/AIGovernanceSeatBannerView.tsx index 5cf739d218..c84d46a6cb 100644 --- a/site/src/modules/dashboard/AIGovernanceSeatBanner/AIGovernanceSeatBannerView.tsx +++ b/site/src/modules/dashboard/AIGovernanceSeatBanner/AIGovernanceSeatBannerView.tsx @@ -1,7 +1,7 @@ -import { LicenseAIGovernance90PercentWarningText } from "api/typesGenerated"; -import { Link } from "components/Link/Link"; import { TriangleAlertIcon } from "lucide-react"; import type { FC } from "react"; +import { LicenseAIGovernance90PercentWarningText } from "#/api/typesGenerated"; +import { Link } from "#/components/Link/Link"; type AIGovernanceSeatBannerViewProps = | { variant: "over-limit"; actual: number; limit: number } diff --git a/site/src/modules/dashboard/DashboardLayout.test.tsx b/site/src/modules/dashboard/DashboardLayout.test.tsx index 5d2f6ecd70..5b55f342cb 100644 --- a/site/src/modules/dashboard/DashboardLayout.test.tsx +++ b/site/src/modules/dashboard/DashboardLayout.test.tsx @@ -1,4 +1,3 @@ -import { server } from "testHelpers/server"; import { screen } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { HttpResponse, http } from "msw"; @@ -11,6 +10,7 @@ import { renderWithAuth, waitForLoaderToBeRemoved, } from "#/testHelpers/renderHelpers"; +import { server } from "#/testHelpers/server"; import { DashboardLayout } from "./DashboardLayout"; const renderDashboardLayout = async ({ diff --git a/site/src/modules/dashboard/DashboardLayout.tsx b/site/src/modules/dashboard/DashboardLayout.tsx index 046decfff2..323b39dd5b 100644 --- a/site/src/modules/dashboard/DashboardLayout.tsx +++ b/site/src/modules/dashboard/DashboardLayout.tsx @@ -1,11 +1,11 @@ import Link from "@mui/material/Link"; import Snackbar from "@mui/material/Snackbar"; -import { useAuthenticated } from "hooks"; import { InfoIcon } from "lucide-react"; import { type FC, type HTMLAttributes, Suspense } from "react"; import { Outlet } from "react-router"; import { Button } from "#/components/Button/Button"; import { Loader } from "#/components/Loader/Loader"; +import { useAuthenticated } from "#/hooks/useAuthenticated"; import { AnnouncementBanners } from "#/modules/dashboard/AnnouncementBanners/AnnouncementBanners"; import { LicenseBanner } from "#/modules/dashboard/LicenseBanner/LicenseBanner"; import { cn } from "#/utils/cn"; diff --git a/site/src/modules/dashboard/DashboardProvider.tsx b/site/src/modules/dashboard/DashboardProvider.tsx index feaae7c43b..66ea2ba22e 100644 --- a/site/src/modules/dashboard/DashboardProvider.tsx +++ b/site/src/modules/dashboard/DashboardProvider.tsx @@ -1,4 +1,3 @@ -import { useAuthenticated } from "hooks"; import { createContext, type FC, type PropsWithChildren } from "react"; import { useQuery } from "react-query"; import { appearance } from "#/api/queries/appearance"; @@ -15,6 +14,7 @@ import type { } from "#/api/typesGenerated"; import { ErrorAlert } from "#/components/Alert/ErrorAlert"; import { Loader } from "#/components/Loader/Loader"; +import { useAuthenticated } from "#/hooks/useAuthenticated"; import { useEmbeddedMetadata } from "#/hooks/useEmbeddedMetadata"; import { canViewAnyOrganization } from "#/modules/permissions"; import { selectFeatureVisibility } from "./entitlements"; diff --git a/site/src/modules/dashboard/DeploymentBanner/DeploymentBanner.tsx b/site/src/modules/dashboard/DeploymentBanner/DeploymentBanner.tsx index bf3847fcf2..d153d6add1 100644 --- a/site/src/modules/dashboard/DeploymentBanner/DeploymentBanner.tsx +++ b/site/src/modules/dashboard/DeploymentBanner/DeploymentBanner.tsx @@ -1,9 +1,9 @@ -import { useAuthenticated } from "hooks"; import type { FC } from "react"; import { useQuery } from "react-query"; import { useLocation } from "react-router"; import { health } from "#/api/queries/debug"; import { deploymentStats } from "#/api/queries/deployment"; +import { useAuthenticated } from "#/hooks/useAuthenticated"; import { DeploymentBannerView } from "./DeploymentBannerView"; const HIDE_DEPLOYMENT_BANNER_PATHS = [ diff --git a/site/src/modules/dashboard/LicenseBanner/LicenseBannerView.stories.tsx b/site/src/modules/dashboard/LicenseBanner/LicenseBannerView.stories.tsx index 53f8aa67f5..02ac3e0f1d 100644 --- a/site/src/modules/dashboard/LicenseBanner/LicenseBannerView.stories.tsx +++ b/site/src/modules/dashboard/LicenseBanner/LicenseBannerView.stories.tsx @@ -1,11 +1,3 @@ -import { chromatic } from "testHelpers/chromatic"; -import { - MockAppearanceConfig, - MockBuildInfo, - MockDefaultOrganization, - MockEntitlements, - MockExperiments, -} from "testHelpers/entities"; import type { Meta, StoryObj } from "@storybook/react-vite"; import { expect, within } from "storybook/test"; import { @@ -13,6 +5,14 @@ import { LicenseManagedAgentLimitExceededWarningText, LicenseTelemetryRequiredErrorText, } from "#/api/typesGenerated"; +import { chromatic } from "#/testHelpers/chromatic"; +import { + MockAppearanceConfig, + MockBuildInfo, + MockDefaultOrganization, + MockEntitlements, + MockExperiments, +} from "#/testHelpers/entities"; import { docs } from "#/utils/docs"; import { DashboardContext, type DashboardValue } from "../DashboardProvider"; import { LicenseBanner } from "./LicenseBanner"; diff --git a/site/src/modules/dashboard/Navbar/MobileMenu.tsx b/site/src/modules/dashboard/Navbar/MobileMenu.tsx index 9d6ea94767..416b499f21 100644 --- a/site/src/modules/dashboard/Navbar/MobileMenu.tsx +++ b/site/src/modules/dashboard/Navbar/MobileMenu.tsx @@ -1,4 +1,3 @@ -import type { ProxyContextValue } from "contexts/ProxyContext"; import { ChevronRightIcon, CircleHelpIcon, @@ -24,6 +23,7 @@ import { DropdownMenuTrigger, } from "#/components/DropdownMenu/DropdownMenu"; import { Latency } from "#/components/Latency/Latency"; +import type { ProxyContextValue } from "#/contexts/ProxyContext"; import { cn } from "#/utils/cn"; import { sortProxiesByLatency } from "./proxyUtils"; diff --git a/site/src/modules/dashboard/Navbar/Navbar.tsx b/site/src/modules/dashboard/Navbar/Navbar.tsx index 50802d5941..4312cfc984 100644 --- a/site/src/modules/dashboard/Navbar/Navbar.tsx +++ b/site/src/modules/dashboard/Navbar/Navbar.tsx @@ -1,9 +1,9 @@ -import { useProxy } from "contexts/ProxyContext"; -import { useAuthenticated } from "hooks"; import type { FC } from "react"; import { useQuery } from "react-query"; import { buildInfo } from "#/api/queries/buildInfo"; import type { LinkConfig } from "#/api/typesGenerated"; +import { useProxy } from "#/contexts/ProxyContext"; +import { useAuthenticated } from "#/hooks/useAuthenticated"; import { useEmbeddedMetadata } from "#/hooks/useEmbeddedMetadata"; import { useDashboard } from "#/modules/dashboard/useDashboard"; import { canViewDeploymentSettings } from "#/modules/permissions"; diff --git a/site/src/modules/dashboard/Navbar/NavbarView.tsx b/site/src/modules/dashboard/Navbar/NavbarView.tsx index 2ebae8d985..24b5984f02 100644 --- a/site/src/modules/dashboard/Navbar/NavbarView.tsx +++ b/site/src/modules/dashboard/Navbar/NavbarView.tsx @@ -1,4 +1,3 @@ -import type { ProxyContextValue } from "contexts/ProxyContext"; import type { FC } from "react"; import { useQuery } from "react-query"; import { NavLink, useLocation } from "react-router"; @@ -13,6 +12,7 @@ import { TooltipContent, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import type { ProxyContextValue } from "#/contexts/ProxyContext"; import { useEmbeddedMetadata } from "#/hooks/useEmbeddedMetadata"; import { useDashboard } from "#/modules/dashboard/useDashboard"; import { NotificationsInbox } from "#/modules/notifications/NotificationsInbox/NotificationsInbox"; diff --git a/site/src/modules/dashboard/Navbar/ProxyMenu.stories.tsx b/site/src/modules/dashboard/Navbar/ProxyMenu.stories.tsx index 688fa71527..5d61a5777d 100644 --- a/site/src/modules/dashboard/Navbar/ProxyMenu.stories.tsx +++ b/site/src/modules/dashboard/Navbar/ProxyMenu.stories.tsx @@ -1,8 +1,8 @@ import type { Meta, StoryObj } from "@storybook/react-vite"; -import { AuthProvider } from "contexts/auth/AuthProvider"; -import { getPreferredProxy } from "contexts/ProxyContext"; import { fn, userEvent, within } from "storybook/test"; import { getAuthorizationKey } from "#/api/queries/authCheck"; +import { AuthProvider } from "#/contexts/auth/AuthProvider"; +import { getPreferredProxy } from "#/contexts/ProxyContext"; import { permissionChecks } from "#/modules/permissions"; import { MockAuthMethodsAll, diff --git a/site/src/modules/dashboard/Navbar/ProxyMenu.tsx b/site/src/modules/dashboard/Navbar/ProxyMenu.tsx index f698005472..30ee274066 100644 --- a/site/src/modules/dashboard/Navbar/ProxyMenu.tsx +++ b/site/src/modules/dashboard/Navbar/ProxyMenu.tsx @@ -1,6 +1,4 @@ import Skeleton from "@mui/material/Skeleton"; -import type { ProxyContextValue } from "contexts/ProxyContext"; -import { useAuthenticated } from "hooks"; import { type FC, useState } from "react"; import { Link } from "react-router"; import { toast } from "sonner"; @@ -18,6 +16,8 @@ import { DropdownMenuTrigger, } from "#/components/DropdownMenu/DropdownMenu"; import { Latency } from "#/components/Latency/Latency"; +import type { ProxyContextValue } from "#/contexts/ProxyContext"; +import { useAuthenticated } from "#/hooks/useAuthenticated"; import { sortProxiesByLatency } from "./proxyUtils"; interface ProxyMenuProps { diff --git a/site/src/modules/dashboard/Navbar/proxyUtils.tsx b/site/src/modules/dashboard/Navbar/proxyUtils.tsx index 674c62ef38..15c587270e 100644 --- a/site/src/modules/dashboard/Navbar/proxyUtils.tsx +++ b/site/src/modules/dashboard/Navbar/proxyUtils.tsx @@ -1,4 +1,4 @@ -import type { Proxies, ProxyLatencies } from "contexts/ProxyContext"; +import type { Proxies, ProxyLatencies } from "#/contexts/ProxyContext"; export function sortProxiesByLatency( proxies: Proxies, diff --git a/site/src/modules/management/DeploymentSettingsLayout.tsx b/site/src/modules/management/DeploymentSettingsLayout.tsx index bdc02e47b3..29cd2f93d1 100644 --- a/site/src/modules/management/DeploymentSettingsLayout.tsx +++ b/site/src/modules/management/DeploymentSettingsLayout.tsx @@ -1,4 +1,3 @@ -import { useAuthenticated } from "hooks"; import { type FC, Suspense } from "react"; import { Navigate, Outlet, useLocation } from "react-router"; import { @@ -9,6 +8,7 @@ import { BreadcrumbSeparator, } from "#/components/Breadcrumb/Breadcrumb"; import { Loader } from "#/components/Loader/Loader"; +import { useAuthenticated } from "#/hooks/useAuthenticated"; import { canViewDeploymentSettings } from "#/modules/permissions"; import { RequirePermission } from "#/modules/permissions/RequirePermission"; import { DeploymentSidebar } from "./DeploymentSidebar"; diff --git a/site/src/modules/management/DeploymentSidebar.tsx b/site/src/modules/management/DeploymentSidebar.tsx index ab6564a959..a91c312f38 100644 --- a/site/src/modules/management/DeploymentSidebar.tsx +++ b/site/src/modules/management/DeploymentSidebar.tsx @@ -1,5 +1,5 @@ -import { useAuthenticated } from "hooks"; import type { FC } from "react"; +import { useAuthenticated } from "#/hooks/useAuthenticated"; import { useDashboard } from "#/modules/dashboard/useDashboard"; import { DeploymentSidebarView } from "./DeploymentSidebarView"; diff --git a/site/src/modules/management/OrganizationSettingsLayout.tsx b/site/src/modules/management/OrganizationSettingsLayout.tsx index 344d857b10..36f6604f72 100644 --- a/site/src/modules/management/OrganizationSettingsLayout.tsx +++ b/site/src/modules/management/OrganizationSettingsLayout.tsx @@ -1,4 +1,3 @@ -import NotFoundPage from "pages/404Page/404Page"; import { createContext, type FC, Suspense, useContext } from "react"; import { useQuery } from "react-query"; import { Outlet, useParams } from "react-router"; @@ -19,6 +18,7 @@ import { canViewOrganization, type OrganizationPermissions, } from "#/modules/permissions/organizations"; +import NotFoundPage from "#/pages/404Page/404Page"; export const OrganizationSettingsContext = createContext< OrganizationSettingsValue | undefined diff --git a/site/src/modules/management/OrganizationSidebar.tsx b/site/src/modules/management/OrganizationSidebar.tsx index b9591ae4c5..3c20b9e9f7 100644 --- a/site/src/modules/management/OrganizationSidebar.tsx +++ b/site/src/modules/management/OrganizationSidebar.tsx @@ -1,6 +1,6 @@ -import { useAuthenticated } from "hooks"; import type { FC } from "react"; import { Sidebar as BaseSidebar } from "#/components/Sidebar/Sidebar"; +import { useAuthenticated } from "#/hooks/useAuthenticated"; import { useOrganizationSettings } from "#/modules/management/OrganizationSettingsLayout"; import { OrganizationSidebarView } from "./OrganizationSidebarView"; diff --git a/site/src/modules/resources/AgentDevcontainerCard.stories.tsx b/site/src/modules/resources/AgentDevcontainerCard.stories.tsx index 71da8917f4..9eb21550ab 100644 --- a/site/src/modules/resources/AgentDevcontainerCard.stories.tsx +++ b/site/src/modules/resources/AgentDevcontainerCard.stories.tsx @@ -1,7 +1,7 @@ import type { Meta, StoryObj } from "@storybook/react-vite"; -import { getPreferredProxy } from "contexts/ProxyContext"; import { screen, spyOn, userEvent, within } from "storybook/test"; import { API } from "#/api/api"; +import { getPreferredProxy } from "#/contexts/ProxyContext"; import { chromatic } from "#/testHelpers/chromatic"; import { MockListeningPortsResponse, diff --git a/site/src/modules/resources/AgentDevcontainerCard.tsx b/site/src/modules/resources/AgentDevcontainerCard.tsx index 78b00a2315..f0ec7e65a3 100644 --- a/site/src/modules/resources/AgentDevcontainerCard.tsx +++ b/site/src/modules/resources/AgentDevcontainerCard.tsx @@ -1,7 +1,5 @@ import Skeleton from "@mui/material/Skeleton"; -import { useProxy } from "contexts/ProxyContext"; import { Container, ExternalLinkIcon } from "lucide-react"; -import { AppStatuses } from "pages/WorkspacePage/AppStatuses"; import type { FC } from "react"; import { useMutation, useQueryClient } from "react-query"; import { toast } from "sonner"; @@ -34,7 +32,9 @@ import { TooltipContent, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { useProxy } from "#/contexts/ProxyContext"; import { useFeatureVisibility } from "#/modules/dashboard/useFeatureVisibility"; +import { AppStatuses } from "#/pages/WorkspacePage/AppStatuses"; import { cn } from "#/utils/cn"; import { portForwardURL } from "#/utils/portForward"; import { AgentApps, organizeAgentApps } from "./AgentApps/AgentApps"; diff --git a/site/src/modules/resources/AgentRow.stories.tsx b/site/src/modules/resources/AgentRow.stories.tsx index a48faba402..81b98ec31f 100644 --- a/site/src/modules/resources/AgentRow.stories.tsx +++ b/site/src/modules/resources/AgentRow.stories.tsx @@ -1,8 +1,8 @@ import type { Meta, StoryObj } from "@storybook/react-vite"; -import { getPreferredProxy } from "contexts/ProxyContext"; import { spyOn, userEvent, within } from "storybook/test"; import { API } from "#/api/api"; import { workspaceAgentContainersKey } from "#/api/queries/workspaces"; +import { getPreferredProxy } from "#/contexts/ProxyContext"; import { chromatic } from "#/testHelpers/chromatic"; import * as M from "#/testHelpers/entities"; import { diff --git a/site/src/modules/resources/AgentRow.tsx b/site/src/modules/resources/AgentRow.tsx index 108951ccd3..d3482eaeda 100644 --- a/site/src/modules/resources/AgentRow.tsx +++ b/site/src/modules/resources/AgentRow.tsx @@ -1,9 +1,7 @@ import Collapse from "@mui/material/Collapse"; import Divider from "@mui/material/Divider"; import Skeleton from "@mui/material/Skeleton"; -import { useProxy } from "contexts/ProxyContext"; import { SquareCheckBigIcon } from "lucide-react"; -import { AppStatuses } from "pages/WorkspacePage/AppStatuses"; import { type FC, useCallback, @@ -23,7 +21,9 @@ import type { } from "#/api/typesGenerated"; import { ChevronDownIcon } from "#/components/AnimatedIcons/ChevronDown"; import { Button } from "#/components/Button/Button"; +import { useProxy } from "#/contexts/ProxyContext"; import { useFeatureVisibility } from "#/modules/dashboard/useFeatureVisibility"; +import { AppStatuses } from "#/pages/WorkspacePage/AppStatuses"; import { cn } from "#/utils/cn"; import { AgentApps, organizeAgentApps } from "./AgentApps/AgentApps"; import { AgentDevcontainerCard } from "./AgentDevcontainerCard"; diff --git a/site/src/modules/resources/AppLink/AppLink.stories.tsx b/site/src/modules/resources/AppLink/AppLink.stories.tsx index d83522c533..bd37aa2804 100644 --- a/site/src/modules/resources/AppLink/AppLink.stories.tsx +++ b/site/src/modules/resources/AppLink/AppLink.stories.tsx @@ -1,6 +1,6 @@ import type { Meta, StoryObj } from "@storybook/react-vite"; -import { getPreferredProxy } from "contexts/ProxyContext"; import { expect, screen, spyOn, userEvent, within } from "storybook/test"; +import { getPreferredProxy } from "#/contexts/ProxyContext"; import { MockPrimaryWorkspaceProxy, MockWorkspace, diff --git a/site/src/modules/resources/AppLink/AppLink.tsx b/site/src/modules/resources/AppLink/AppLink.tsx index 0ab2376ace..5b8d7aa56f 100644 --- a/site/src/modules/resources/AppLink/AppLink.tsx +++ b/site/src/modules/resources/AppLink/AppLink.tsx @@ -1,4 +1,3 @@ -import { useProxy } from "contexts/ProxyContext"; import { Building2Icon, CircleAlertIcon, @@ -18,6 +17,7 @@ import { TooltipContent, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { useProxy } from "#/contexts/ProxyContext"; import { isExternalApp, needsSessionToken } from "#/modules/apps/apps"; import { useAppLink } from "#/modules/apps/useAppLink"; import { docs } from "#/utils/docs"; diff --git a/site/src/modules/resources/WildcardHostnameWarning.tsx b/site/src/modules/resources/WildcardHostnameWarning.tsx index 99546e730c..e84782b2a2 100644 --- a/site/src/modules/resources/WildcardHostnameWarning.tsx +++ b/site/src/modules/resources/WildcardHostnameWarning.tsx @@ -1,8 +1,8 @@ -import { useProxy } from "contexts/ProxyContext"; import type { FC } from "react"; import type { WorkspaceResource } from "#/api/typesGenerated"; import { Alert, AlertDescription, AlertTitle } from "#/components/Alert/Alert"; import { Link } from "#/components/Link/Link"; +import { useProxy } from "#/contexts/ProxyContext"; import { useAuthenticated } from "#/hooks/useAuthenticated"; import { docs } from "#/utils/docs"; diff --git a/site/src/modules/tasks/TasksSidebar/TasksSidebar.stories.tsx b/site/src/modules/tasks/TasksSidebar/TasksSidebar.stories.tsx index de93f0981b..f1e14aa69f 100644 --- a/site/src/modules/tasks/TasksSidebar/TasksSidebar.stories.tsx +++ b/site/src/modules/tasks/TasksSidebar/TasksSidebar.stories.tsx @@ -1,8 +1,8 @@ import type { Meta, StoryObj } from "@storybook/react-vite"; -import { MockUsers } from "pages/UsersPage/storybookData/users"; import { spyOn, userEvent, within } from "storybook/test"; import { reactRouterParameters } from "storybook-addon-remix-react-router"; import { API } from "#/api/api"; +import { MockUsers } from "#/pages/UsersPage/storybookData/users"; import { MockDisplayNameTasks, MockTask, diff --git a/site/src/modules/tasks/TasksSidebar/TasksSidebar.tsx b/site/src/modules/tasks/TasksSidebar/TasksSidebar.tsx index 96df66f009..39d1a2d08a 100644 --- a/site/src/modules/tasks/TasksSidebar/TasksSidebar.tsx +++ b/site/src/modules/tasks/TasksSidebar/TasksSidebar.tsx @@ -1,4 +1,3 @@ -import { useAuthenticated } from "hooks"; import { EditIcon, EllipsisIcon, @@ -35,6 +34,7 @@ import { TooltipProvider, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { useAuthenticated } from "#/hooks/useAuthenticated"; import { useSearchParamsKey } from "#/hooks/useSearchParamsKey"; import { cn } from "#/utils/cn"; import { TaskDeleteDialog } from "../TaskDeleteDialog/TaskDeleteDialog"; diff --git a/site/src/modules/tasks/TasksSidebar/UserCombobox.stories.tsx b/site/src/modules/tasks/TasksSidebar/UserCombobox.stories.tsx index ba32ef6bca..125f541154 100644 --- a/site/src/modules/tasks/TasksSidebar/UserCombobox.stories.tsx +++ b/site/src/modules/tasks/TasksSidebar/UserCombobox.stories.tsx @@ -1,9 +1,9 @@ import type { Meta, StoryObj } from "@storybook/react-vite"; import { waitFor } from "@testing-library/react"; -import { MockUsers } from "pages/UsersPage/storybookData/users"; import { useState } from "react"; import { expect, spyOn, userEvent, within } from "storybook/test"; import { API } from "#/api/api"; +import { MockUsers } from "#/pages/UsersPage/storybookData/users"; import { MockUserOwner } from "#/testHelpers/entities"; import { withAuthProvider } from "#/testHelpers/storybook"; import { UserCombobox } from "./UserCombobox"; diff --git a/site/src/modules/tasks/TasksSidebar/UserCombobox.tsx b/site/src/modules/tasks/TasksSidebar/UserCombobox.tsx index 98d088da0a..e762d26a6b 100644 --- a/site/src/modules/tasks/TasksSidebar/UserCombobox.tsx +++ b/site/src/modules/tasks/TasksSidebar/UserCombobox.tsx @@ -1,4 +1,3 @@ -import { useAuthenticated } from "hooks"; import { CheckIcon, ChevronsUpDownIcon } from "lucide-react"; import { type FC, useState } from "react"; import { keepPreviousData, useQuery } from "react-query"; @@ -20,6 +19,7 @@ import { PopoverTrigger, } from "#/components/Popover/Popover"; import { useDebouncedValue } from "#/hooks/debounce"; +import { useAuthenticated } from "#/hooks/useAuthenticated"; import { cn } from "#/utils/cn"; type UserOption = { diff --git a/site/src/modules/workspaces/ClassicParameterFlowDeprecationWarning/ClassicParameterFlowDeprecationWarning.test.tsx b/site/src/modules/workspaces/ClassicParameterFlowDeprecationWarning/ClassicParameterFlowDeprecationWarning.test.tsx index 13b260315e..1d9acfd935 100644 --- a/site/src/modules/workspaces/ClassicParameterFlowDeprecationWarning/ClassicParameterFlowDeprecationWarning.test.tsx +++ b/site/src/modules/workspaces/ClassicParameterFlowDeprecationWarning/ClassicParameterFlowDeprecationWarning.test.tsx @@ -1,7 +1,7 @@ import { render, screen } from "@testing-library/react"; import { ClassicParameterFlowDeprecationWarning } from "./ClassicParameterFlowDeprecationWarning"; -vi.mock("modules/navigation", () => ({ +vi.mock("#/modules/navigation", () => ({ useLinks: () => () => "/mock-link", linkToTemplate: () => "/mock-template-link", })); diff --git a/site/src/modules/workspaces/WorkspaceMoreActions/useWorkspaceDuplication.jest.tsx b/site/src/modules/workspaces/WorkspaceMoreActions/useWorkspaceDuplication.jest.tsx index ce5b4ccc9b..620e457fe1 100644 --- a/site/src/modules/workspaces/WorkspaceMoreActions/useWorkspaceDuplication.jest.tsx +++ b/site/src/modules/workspaces/WorkspaceMoreActions/useWorkspaceDuplication.jest.tsx @@ -1,6 +1,6 @@ import { act, waitFor } from "@testing-library/react"; -import CreateWorkspacePage from "pages/CreateWorkspacePage/CreateWorkspacePage"; import type { Workspace } from "#/api/typesGenerated"; +import CreateWorkspacePage from "#/pages/CreateWorkspacePage/CreateWorkspacePage"; import * as M from "#/testHelpers/entities"; import { type GetLocationSnapshot, diff --git a/site/src/modules/workspaces/WorkspaceMoreActions/useWorkspaceDuplication.ts b/site/src/modules/workspaces/WorkspaceMoreActions/useWorkspaceDuplication.ts index b829d64b09..1a357805f4 100644 --- a/site/src/modules/workspaces/WorkspaceMoreActions/useWorkspaceDuplication.ts +++ b/site/src/modules/workspaces/WorkspaceMoreActions/useWorkspaceDuplication.ts @@ -1,10 +1,10 @@ -import type { CreateWorkspaceMode } from "pages/CreateWorkspacePage/CreateWorkspacePage"; import { useCallback } from "react"; import { useQuery } from "react-query"; import { useNavigate } from "react-router"; import { workspaceBuildParameters } from "#/api/queries/workspaceBuilds"; import type { Workspace, WorkspaceBuildParameter } from "#/api/typesGenerated"; import { linkToTemplate, useLinks } from "#/modules/navigation"; +import type { CreateWorkspaceMode } from "#/pages/CreateWorkspacePage/CreateWorkspacePage"; function getDuplicationUrlParams( workspaceParams: readonly WorkspaceBuildParameter[], diff --git a/site/src/pages/AIBridgePage/AIBridgeSessionsLayout.tsx b/site/src/pages/AIBridgePage/AIBridgeSessionsLayout.tsx index b6551dbea0..afea18ac17 100644 --- a/site/src/pages/AIBridgePage/AIBridgeSessionsLayout.tsx +++ b/site/src/pages/AIBridgePage/AIBridgeSessionsLayout.tsx @@ -1,12 +1,12 @@ -import { Link } from "components/Link/Link"; -import { Margins } from "components/Margins/Margins"; +import type { FC, PropsWithChildren } from "react"; +import { Outlet } from "react-router"; +import { Link } from "#/components/Link/Link"; +import { Margins } from "#/components/Margins/Margins"; import { PageHeader, PageHeaderSubtitle, PageHeaderTitle, -} from "components/PageHeader/PageHeader"; -import type { FC, PropsWithChildren } from "react"; -import { Outlet } from "react-router"; +} from "#/components/PageHeader/PageHeader"; import { docs } from "#/utils/docs"; const AIBridgeSessionsLayout: FC = () => { diff --git a/site/src/pages/AIBridgePage/ListSessionsPage/ListSessionsFilter.tsx b/site/src/pages/AIBridgePage/ListSessionsPage/ListSessionsFilter.tsx index fd1279092b..339254966f 100644 --- a/site/src/pages/AIBridgePage/ListSessionsPage/ListSessionsFilter.tsx +++ b/site/src/pages/AIBridgePage/ListSessionsPage/ListSessionsFilter.tsx @@ -1,10 +1,14 @@ -import { Filter, MenuSkeleton, type useFilter } from "components/Filter/Filter"; -import { type UserFilterMenu, UserMenu } from "components/Filter/UserFilter"; +import type { FC } from "react"; +import { + Filter, + MenuSkeleton, + type useFilter, +} from "#/components/Filter/Filter"; +import { type UserFilterMenu, UserMenu } from "#/components/Filter/UserFilter"; import { ProviderFilter, type ProviderFilterMenu, -} from "pages/AIBridgePage/RequestLogsPage/RequestLogsFilter/ProviderFilter"; -import type { FC } from "react"; +} from "#/pages/AIBridgePage/RequestLogsPage/RequestLogsFilter/ProviderFilter"; interface ListSessionsFilterProps { filter: ReturnType; diff --git a/site/src/pages/AIBridgePage/ListSessionsPage/ListSessionsPage.tsx b/site/src/pages/AIBridgePage/ListSessionsPage/ListSessionsPage.tsx index 8ecb443991..203de4d9be 100644 --- a/site/src/pages/AIBridgePage/ListSessionsPage/ListSessionsPage.tsx +++ b/site/src/pages/AIBridgePage/ListSessionsPage/ListSessionsPage.tsx @@ -1,9 +1,9 @@ -import { useFilter } from "components/Filter/Filter"; -import { useUserFilterMenu } from "components/Filter/UserFilter"; -import { useAuthenticated } from "hooks"; import type { FC } from "react"; import { useNavigate, useSearchParams } from "react-router"; import { paginatedSessions } from "#/api/queries/aiBridge"; +import { useFilter } from "#/components/Filter/Filter"; +import { useUserFilterMenu } from "#/components/Filter/UserFilter"; +import { useAuthenticated } from "#/hooks/useAuthenticated"; import { usePaginatedQuery } from "#/hooks/usePaginatedQuery"; import { useDashboard } from "#/modules/dashboard/useDashboard"; import { RequirePermission } from "#/modules/permissions/RequirePermission"; diff --git a/site/src/pages/AIBridgePage/ListSessionsPage/ListSessionsPageView.stories.tsx b/site/src/pages/AIBridgePage/ListSessionsPage/ListSessionsPageView.stories.tsx index 2b87d9acc2..d5b762ae16 100644 --- a/site/src/pages/AIBridgePage/ListSessionsPage/ListSessionsPageView.stories.tsx +++ b/site/src/pages/AIBridgePage/ListSessionsPage/ListSessionsPageView.stories.tsx @@ -1,14 +1,14 @@ import type { Meta, StoryObj } from "@storybook/react-vite"; +import type { ComponentProps } from "react"; +import { fn } from "storybook/test"; import { getDefaultFilterProps, MockMenu, -} from "components/Filter/storyHelpers"; +} from "#/components/Filter/storyHelpers"; import { mockInitialRenderResult, mockSuccessResult, -} from "components/PaginationWidget/PaginationContainer.mocks"; -import type { ComponentProps } from "react"; -import { fn } from "storybook/test"; +} from "#/components/PaginationWidget/PaginationContainer.mocks"; import { MockSession } from "#/testHelpers/entities"; import { ListSessionsPageView } from "./ListSessionsPageView"; diff --git a/site/src/pages/AIBridgePage/ListSessionsPage/ListSessionsPageView.tsx b/site/src/pages/AIBridgePage/ListSessionsPage/ListSessionsPageView.tsx index c3df60cd1f..31c22f6015 100644 --- a/site/src/pages/AIBridgePage/ListSessionsPage/ListSessionsPageView.tsx +++ b/site/src/pages/AIBridgePage/ListSessionsPage/ListSessionsPageView.tsx @@ -1,28 +1,28 @@ -import { Alert, AlertDescription, AlertTitle } from "components/Alert/Alert"; -import { Link } from "components/Link/Link"; +import { InfoIcon } from "lucide-react"; +import type { ComponentProps, FC, PropsWithChildren } from "react"; +import type { AIBridgeSession } from "#/api/typesGenerated"; +import { Alert, AlertDescription, AlertTitle } from "#/components/Alert/Alert"; +import { Link } from "#/components/Link/Link"; import { PaginationContainer, type PaginationResult, -} from "components/PaginationWidget/PaginationContainer"; -import { PaywallAIGovernance } from "components/Paywall/PaywallAIGovernance"; +} from "#/components/PaginationWidget/PaginationContainer"; +import { PaywallAIGovernance } from "#/components/Paywall/PaywallAIGovernance"; import { Table, TableBody, TableHead, TableHeader, TableRow, -} from "components/Table/Table"; -import { TableEmpty } from "components/TableEmpty/TableEmpty"; -import { TableLoader } from "components/TableLoader/TableLoader"; +} from "#/components/Table/Table"; +import { TableEmpty } from "#/components/TableEmpty/TableEmpty"; +import { TableLoader } from "#/components/TableLoader/TableLoader"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, -} from "components/Tooltip/Tooltip"; -import { InfoIcon } from "lucide-react"; -import type { ComponentProps, FC, PropsWithChildren } from "react"; -import type { AIBridgeSession } from "#/api/typesGenerated"; +} from "#/components/Tooltip/Tooltip"; import { docs } from "#/utils/docs"; import { DATE_FORMAT, formatDateTime } from "#/utils/time"; import { ListSessionsFilter } from "./ListSessionsFilter"; diff --git a/site/src/pages/AIBridgePage/ListSessionsPage/ListSessionsRow.stories.tsx b/site/src/pages/AIBridgePage/ListSessionsPage/ListSessionsRow.stories.tsx index ed39076425..3d8f6298ab 100644 --- a/site/src/pages/AIBridgePage/ListSessionsPage/ListSessionsRow.stories.tsx +++ b/site/src/pages/AIBridgePage/ListSessionsPage/ListSessionsRow.stories.tsx @@ -1,6 +1,6 @@ import type { Meta, StoryObj } from "@storybook/react-vite"; -import { Table, TableBody } from "components/Table/Table"; import { fn } from "storybook/test"; +import { Table, TableBody } from "#/components/Table/Table"; import { MockSession } from "#/testHelpers/entities"; import { ListSessionsRow } from "./ListSessionsRow"; diff --git a/site/src/pages/AIBridgePage/ListSessionsPage/ListSessionsRow.tsx b/site/src/pages/AIBridgePage/ListSessionsPage/ListSessionsRow.tsx index 35d613dba4..5b551b275e 100644 --- a/site/src/pages/AIBridgePage/ListSessionsPage/ListSessionsRow.tsx +++ b/site/src/pages/AIBridgePage/ListSessionsPage/ListSessionsRow.tsx @@ -1,17 +1,17 @@ -import { Avatar } from "components/Avatar/Avatar"; -import { Badge } from "components/Badge/Badge"; -import { TableCell, TableRow } from "components/Table/Table"; +import { ChevronRightIcon } from "lucide-react"; +import type { FC } from "react"; +import type { AIBridgeSession } from "#/api/typesGenerated"; +import { Avatar } from "#/components/Avatar/Avatar"; +import { Badge } from "#/components/Badge/Badge"; +import { TableCell, TableRow } from "#/components/Table/Table"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, -} from "components/Tooltip/Tooltip"; -import { ChevronRightIcon } from "lucide-react"; -import { AIBridgeClientIcon } from "pages/AIBridgePage/RequestLogsPage/icons/AIBridgeClientIcon"; -import { AIBridgeProviderIcon } from "pages/AIBridgePage/RequestLogsPage/icons/AIBridgeProviderIcon"; -import type { FC } from "react"; -import type { AIBridgeSession } from "#/api/typesGenerated"; +} from "#/components/Tooltip/Tooltip"; +import { AIBridgeClientIcon } from "#/pages/AIBridgePage/RequestLogsPage/icons/AIBridgeClientIcon"; +import { AIBridgeProviderIcon } from "#/pages/AIBridgePage/RequestLogsPage/icons/AIBridgeProviderIcon"; import { DATE_FORMAT, formatDateTime } from "#/utils/time"; import { TokenBadges } from "../TokenBadges"; import { getProviderDisplayName, getProviderIconName } from "../utils"; diff --git a/site/src/pages/AIBridgePage/RequestLogsPage/RequestLogsFilter/ClientFilter.tsx b/site/src/pages/AIBridgePage/RequestLogsPage/RequestLogsFilter/ClientFilter.tsx index 9474a450d8..acb5a05d6b 100644 --- a/site/src/pages/AIBridgePage/RequestLogsPage/RequestLogsFilter/ClientFilter.tsx +++ b/site/src/pages/AIBridgePage/RequestLogsPage/RequestLogsFilter/ClientFilter.tsx @@ -1,10 +1,10 @@ -import { API } from "api/api"; -import { ComboboxInput } from "components/Combobox/Combobox"; +import { API } from "#/api/api"; +import { ComboboxInput } from "#/components/Combobox/Combobox"; import { type UseFilterMenuOptions, useFilterMenu, -} from "components/Filter/menu"; -import { SelectFilter } from "components/Filter/SelectFilter"; +} from "#/components/Filter/menu"; +import { SelectFilter } from "#/components/Filter/SelectFilter"; import { AIBridgeClientIcon } from "../icons/AIBridgeClientIcon"; export const useClientFilterMenu = ({ diff --git a/site/src/pages/AIBridgePage/RequestLogsPage/RequestLogsPage.tsx b/site/src/pages/AIBridgePage/RequestLogsPage/RequestLogsPage.tsx index 0ce2720de7..895de8fb6b 100644 --- a/site/src/pages/AIBridgePage/RequestLogsPage/RequestLogsPage.tsx +++ b/site/src/pages/AIBridgePage/RequestLogsPage/RequestLogsPage.tsx @@ -3,7 +3,7 @@ import { useSearchParams } from "react-router"; import { paginatedInterceptions } from "#/api/queries/aiBridge"; import { useFilter } from "#/components/Filter/Filter"; import { useUserFilterMenu } from "#/components/Filter/UserFilter"; -import { useAuthenticated } from "#/hooks"; +import { useAuthenticated } from "#/hooks/useAuthenticated"; import { usePaginatedQuery } from "#/hooks/usePaginatedQuery"; import { useDashboard } from "#/modules/dashboard/useDashboard"; import { RequirePermission } from "#/modules/permissions/RequirePermission"; diff --git a/site/src/pages/AIBridgePage/SessionThreadsPage/SessionSummaryTable.tsx b/site/src/pages/AIBridgePage/SessionThreadsPage/SessionSummaryTable.tsx index 6180847604..e6198b93bd 100644 --- a/site/src/pages/AIBridgePage/SessionThreadsPage/SessionSummaryTable.tsx +++ b/site/src/pages/AIBridgePage/SessionThreadsPage/SessionSummaryTable.tsx @@ -1,8 +1,8 @@ -import { Avatar } from "components/Avatar/Avatar"; -import { Badge } from "components/Badge/Badge"; -import { AIBridgeClientIcon } from "pages/AIBridgePage/RequestLogsPage/icons/AIBridgeClientIcon"; -import { AIBridgeProviderIcon } from "pages/AIBridgePage/RequestLogsPage/icons/AIBridgeProviderIcon"; import type { MinimalUser } from "#/api/typesGenerated"; +import { Avatar } from "#/components/Avatar/Avatar"; +import { Badge } from "#/components/Badge/Badge"; +import { AIBridgeClientIcon } from "#/pages/AIBridgePage/RequestLogsPage/icons/AIBridgeClientIcon"; +import { AIBridgeProviderIcon } from "#/pages/AIBridgePage/RequestLogsPage/icons/AIBridgeProviderIcon"; import { formatDateTime } from "#/utils/time"; import { TokenBadges } from "../TokenBadges"; import { getProviderDisplayName, getProviderIconName } from "../utils"; diff --git a/site/src/pages/AIBridgePage/SessionThreadsPage/SessionTimeline/PromptTable.tsx b/site/src/pages/AIBridgePage/SessionThreadsPage/SessionTimeline/PromptTable.tsx index 620a256dbd..42ad047617 100644 --- a/site/src/pages/AIBridgePage/SessionThreadsPage/SessionTimeline/PromptTable.tsx +++ b/site/src/pages/AIBridgePage/SessionThreadsPage/SessionTimeline/PromptTable.tsx @@ -1,12 +1,12 @@ -import { Badge } from "components/Badge/Badge"; +import type { FC } from "react"; +import { Badge } from "#/components/Badge/Badge"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, -} from "components/Tooltip/Tooltip"; -import { AIBridgeModelIcon } from "pages/AIBridgePage/RequestLogsPage/icons/AIBridgeModelIcon"; -import type { FC } from "react"; +} from "#/components/Tooltip/Tooltip"; +import { AIBridgeModelIcon } from "#/pages/AIBridgePage/RequestLogsPage/icons/AIBridgeModelIcon"; import { cn } from "#/utils/cn"; import { formatDate } from "#/utils/time"; import { TokenBadges } from "../../TokenBadges"; diff --git a/site/src/pages/AIBridgePage/SessionThreadsPage/SessionTimeline/ToolCallTable.tsx b/site/src/pages/AIBridgePage/SessionThreadsPage/SessionTimeline/ToolCallTable.tsx index c52b37ce56..d5f0a8a6c6 100644 --- a/site/src/pages/AIBridgePage/SessionThreadsPage/SessionTimeline/ToolCallTable.tsx +++ b/site/src/pages/AIBridgePage/SessionThreadsPage/SessionTimeline/ToolCallTable.tsx @@ -1,5 +1,5 @@ -import { CopyButton } from "components/CopyButton/CopyButton"; import type { FC } from "react"; +import { CopyButton } from "#/components/CopyButton/CopyButton"; import { cn } from "#/utils/cn"; import { formatDate } from "#/utils/time"; import { TokenBadges } from "../../TokenBadges"; diff --git a/site/src/pages/AIBridgePage/TokenBadges.tsx b/site/src/pages/AIBridgePage/TokenBadges.tsx index 11593668d4..c929b8dce8 100644 --- a/site/src/pages/AIBridgePage/TokenBadges.tsx +++ b/site/src/pages/AIBridgePage/TokenBadges.tsx @@ -1,12 +1,12 @@ -import { Badge } from "components/Badge/Badge"; +import { ArrowDownIcon, ArrowUpIcon } from "lucide-react"; +import type { FC } from "react"; +import { Badge } from "#/components/Badge/Badge"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, -} from "components/Tooltip/Tooltip"; -import { ArrowDownIcon, ArrowUpIcon } from "lucide-react"; -import type { FC } from "react"; +} from "#/components/Tooltip/Tooltip"; import { prettyFormatJSON, roundTokenDisplay } from "./utils"; interface TokenBadgesProps { diff --git a/site/src/pages/AgentsPage/AgentAnalyticsPage.tsx b/site/src/pages/AgentsPage/AgentAnalyticsPage.tsx index 0aaf5c2bf2..1203f72322 100644 --- a/site/src/pages/AgentsPage/AgentAnalyticsPage.tsx +++ b/site/src/pages/AgentsPage/AgentAnalyticsPage.tsx @@ -1,8 +1,8 @@ -import { useAuthContext } from "contexts/auth/AuthProvider"; import dayjs, { type Dayjs } from "dayjs"; import { type FC, useState } from "react"; import { useQuery } from "react-query"; import { chatCostSummary } from "#/api/queries/chats"; +import { useAuthContext } from "#/contexts/auth/AuthProvider"; import { AgentAnalyticsPageView } from "./AgentAnalyticsPageView"; import { AgentPageHeader } from "./components/AgentPageHeader"; diff --git a/site/src/pages/AgentsPage/AgentDetail.tsx b/site/src/pages/AgentsPage/AgentDetail.tsx index d8d976f1fe..2a09fd80fa 100644 --- a/site/src/pages/AgentsPage/AgentDetail.tsx +++ b/site/src/pages/AgentsPage/AgentDetail.tsx @@ -1,9 +1,3 @@ -import { useProxy } from "contexts/ProxyContext"; -import { - getTerminalHref, - getVSCodeHref, - openAppInNewWindow, -} from "modules/apps/apps"; import { type FC, useEffect, useLayoutEffect, useRef, useState } from "react"; import { useInfiniteQuery, @@ -14,9 +8,6 @@ import { import { useOutletContext, useParams } from "react-router"; import { toast } from "sonner"; import type { UrlTransform } from "streamdown"; -import { isMobileViewport } from "utils/mobile"; -import { pageTitle } from "utils/page"; -import { rewriteLocalhostURL } from "utils/portForward"; import { API, watchWorkspace } from "#/api/api"; import { isApiError } from "#/api/errors"; import { @@ -37,6 +28,15 @@ import { deploymentSSHConfig } from "#/api/queries/deployment"; import { workspaceById, workspaceByIdKey } from "#/api/queries/workspaces"; import type * as TypesGen from "#/api/typesGenerated"; import type { ChatMessagePart } from "#/api/typesGenerated"; +import { useProxy } from "#/contexts/ProxyContext"; +import { + getTerminalHref, + getVSCodeHref, + openAppInNewWindow, +} from "#/modules/apps/apps"; +import { isMobileViewport } from "#/utils/mobile"; +import { pageTitle } from "#/utils/page"; +import { rewriteLocalhostURL } from "#/utils/portForward"; import type { AgentsOutletContext } from "./AgentsPage"; import type { ChatMessageInputRef } from "./components/AgentChatInput"; import { diff --git a/site/src/pages/AgentsPage/AgentEmbedPage.tsx b/site/src/pages/AgentsPage/AgentEmbedPage.tsx index d93410c2a6..407901e328 100644 --- a/site/src/pages/AgentsPage/AgentEmbedPage.tsx +++ b/site/src/pages/AgentsPage/AgentEmbedPage.tsx @@ -1,13 +1,13 @@ -import { useAuthContext } from "contexts/auth/AuthProvider"; -import { ProxyProvider } from "contexts/ProxyContext"; -import { DashboardProvider } from "modules/dashboard/DashboardProvider"; -import { permissionChecks } from "modules/permissions"; import { type FC, useEffect, useLayoutEffect, useRef, useState } from "react"; import { useMutation, useQueryClient } from "react-query"; import { Outlet, useBlocker, useParams, useSearchParams } from "react-router"; import { getErrorMessage } from "#/api/errors"; import { Button } from "#/components/Button/Button"; import { Loader } from "#/components/Loader/Loader"; +import { useAuthContext } from "#/contexts/auth/AuthProvider"; +import { ProxyProvider } from "#/contexts/ProxyContext"; +import { DashboardProvider } from "#/modules/dashboard/DashboardProvider"; +import { permissionChecks } from "#/modules/permissions"; import type { AgentsOutletContext } from "./AgentsPage"; import { bootstrapChatEmbedSession, diff --git a/site/src/pages/AgentsPage/AgentSettingsPage.tsx b/site/src/pages/AgentsPage/AgentSettingsPage.tsx index 813e5a26a1..4cc79e1225 100644 --- a/site/src/pages/AgentsPage/AgentSettingsPage.tsx +++ b/site/src/pages/AgentsPage/AgentSettingsPage.tsx @@ -1,6 +1,6 @@ -import { useAuthenticated } from "hooks"; import type { FC } from "react"; import { useParams } from "react-router"; +import { useAuthenticated } from "#/hooks/useAuthenticated"; import { AgentSettingsPageView } from "./AgentSettingsPageView"; import { AgentPageHeader } from "./components/AgentPageHeader"; diff --git a/site/src/pages/AgentsPage/AgentsPage.tsx b/site/src/pages/AgentsPage/AgentsPage.tsx index 566c65e121..a9c86949b0 100644 --- a/site/src/pages/AgentsPage/AgentsPage.tsx +++ b/site/src/pages/AgentsPage/AgentsPage.tsx @@ -1,4 +1,3 @@ -import { useAuthenticated } from "hooks"; import { type FC, useEffect, useRef, useState } from "react"; import { useInfiniteQuery, @@ -31,6 +30,7 @@ import { import { workspaceById } from "#/api/queries/workspaces"; import type * as TypesGen from "#/api/typesGenerated"; import { DeleteDialog } from "#/components/Dialogs/DeleteDialog/DeleteDialog"; +import { useAuthenticated } from "#/hooks/useAuthenticated"; import { useDashboard } from "#/modules/dashboard/useDashboard"; import { createReconnectingWebSocket } from "#/utils/reconnectingWebSocket"; import { AgentsPageView } from "./AgentsPageView"; diff --git a/site/src/pages/AgentsPage/components/AgentDetail/ChatContext.test.tsx b/site/src/pages/AgentsPage/components/AgentDetail/ChatContext.test.tsx index 8a6758990f..a31a640dd0 100644 --- a/site/src/pages/AgentsPage/components/AgentDetail/ChatContext.test.tsx +++ b/site/src/pages/AgentsPage/components/AgentDetail/ChatContext.test.tsx @@ -48,7 +48,7 @@ import { useChatStore, } from "./ChatContext"; -vi.mock("api/api", () => ({ +vi.mock("#/api/api", () => ({ watchChat: vi.fn(), })); diff --git a/site/src/pages/AgentsPage/components/AgentDetail/ChatContext.ts b/site/src/pages/AgentsPage/components/AgentDetail/ChatContext.ts index 74c8df5485..f9bce2ed96 100644 --- a/site/src/pages/AgentsPage/components/AgentDetail/ChatContext.ts +++ b/site/src/pages/AgentsPage/components/AgentDetail/ChatContext.ts @@ -1,9 +1,9 @@ -import { asNumber, asString } from "components/ai-elements/runtimeTypeUtils"; import { useEffect, useRef, useState, useSyncExternalStore } from "react"; import { type InfiniteData, useQueryClient } from "react-query"; import { watchChat } from "#/api/api"; import { chatMessagesKey, updateInfiniteChatsCache } from "#/api/queries/chats"; import type * as TypesGen from "#/api/typesGenerated"; +import { asNumber, asString } from "#/components/ai-elements/runtimeTypeUtils"; import type { OneWayMessageEvent } from "#/utils/OneWayWebSocket"; import { createReconnectingWebSocket } from "#/utils/reconnectingWebSocket"; import { diff --git a/site/src/pages/AgentsPage/components/AgentDetail/ChatStatusCallout.tsx b/site/src/pages/AgentsPage/components/AgentDetail/ChatStatusCallout.tsx index f366072071..ce6b052ee4 100644 --- a/site/src/pages/AgentsPage/components/AgentDetail/ChatStatusCallout.tsx +++ b/site/src/pages/AgentsPage/components/AgentDetail/ChatStatusCallout.tsx @@ -1,9 +1,9 @@ -import { Alert, AlertDescription, AlertTitle } from "components/Alert/Alert"; -import { Response, Shimmer } from "components/ai-elements"; -import { Button } from "components/Button/Button"; -import { Pill } from "components/Pill/Pill"; import { ExternalLinkIcon } from "lucide-react"; import { type FC, useEffect, useState } from "react"; +import { Alert, AlertDescription, AlertTitle } from "#/components/Alert/Alert"; +import { Response, Shimmer } from "#/components/ai-elements"; +import { Button } from "#/components/Button/Button"; +import { Pill } from "#/components/Pill/Pill"; import { getKindLabel, getProviderStatusURL } from "./chatStatusHelpers"; import type { LiveStatusModel } from "./liveStatusModel"; diff --git a/site/src/pages/AgentsPage/components/AgentDetail/TopBar.tsx b/site/src/pages/AgentsPage/components/AgentDetail/TopBar.tsx index f3ce3240e7..83dc404ee7 100644 --- a/site/src/pages/AgentsPage/components/AgentDetail/TopBar.tsx +++ b/site/src/pages/AgentsPage/components/AgentDetail/TopBar.tsx @@ -17,7 +17,6 @@ import { import type { FC } from "react"; import { Link } from "react-router"; import { toast } from "sonner"; -import { cn } from "utils/cn"; import type * as TypesGen from "#/api/typesGenerated"; import type { ChatDiffStatus } from "#/api/typesGenerated"; import { Button } from "#/components/Button/Button"; @@ -29,6 +28,7 @@ import { DropdownMenuTrigger, } from "#/components/DropdownMenu/DropdownMenu"; import { Spinner } from "#/components/Spinner/Spinner"; +import { cn } from "#/utils/cn"; import { parsePullRequestUrl } from "../../utils/pullRequest"; import { useEmbedContext } from "../EmbedContext"; import { PrStateIcon } from "../GitPanel/GitPanel"; diff --git a/site/src/pages/AgentsPage/components/AgentDetailView.tsx b/site/src/pages/AgentsPage/components/AgentDetailView.tsx index aa80523d3f..f2f899fd5d 100644 --- a/site/src/pages/AgentsPage/components/AgentDetailView.tsx +++ b/site/src/pages/AgentsPage/components/AgentDetailView.tsx @@ -8,13 +8,13 @@ import { useState, } from "react"; import type { UrlTransform } from "streamdown"; -import { cn } from "utils/cn"; -import { pageTitle } from "utils/page"; import type * as TypesGen from "#/api/typesGenerated"; import type { ChatDiffStatus, ChatMessagePart } from "#/api/typesGenerated"; import type { ModelSelectorOption } from "#/components/ai-elements"; import { DesktopPanelContext } from "#/components/ai-elements/tool/DesktopPanelContext"; import { Button } from "#/components/Button/Button"; +import { cn } from "#/utils/cn"; +import { pageTitle } from "#/utils/page"; import type { ChatDetailError } from "../utils/usageLimitMessage"; import { AgentChatInput, type ChatMessageInputRef } from "./AgentChatInput"; import type { useChatStore } from "./AgentDetail/ChatContext"; diff --git a/site/src/pages/AgentsPage/components/AgentsSkeletons.tsx b/site/src/pages/AgentsPage/components/AgentsSkeletons.tsx index da1b18470a..ae879fe360 100644 --- a/site/src/pages/AgentsPage/components/AgentsSkeletons.tsx +++ b/site/src/pages/AgentsPage/components/AgentsSkeletons.tsx @@ -1,6 +1,6 @@ import type { FC } from "react"; -import { cn } from "utils/cn"; import { Skeleton } from "#/components/Skeleton/Skeleton"; +import { cn } from "#/utils/cn"; /** localStorage keys shared with the agents panel components. */ const RIGHT_PANEL_OPEN_KEY = "agents.right-panel-open"; diff --git a/site/src/pages/AgentsPage/components/Sidebar/AgentsSidebar.test.tsx b/site/src/pages/AgentsPage/components/Sidebar/AgentsSidebar.test.tsx index dbaa9500b6..2634224bc3 100644 --- a/site/src/pages/AgentsPage/components/Sidebar/AgentsSidebar.test.tsx +++ b/site/src/pages/AgentsPage/components/Sidebar/AgentsSidebar.test.tsx @@ -1,11 +1,11 @@ import { act, render } from "@testing-library/react"; -import { ThemeOverride } from "contexts/ThemeProvider"; import type { FC, PropsWithChildren } from "react"; import { QueryClient, QueryClientProvider } from "react-query"; import { MemoryRouter } from "react-router"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import type * as TypesGen from "#/api/typesGenerated"; import type { Chat } from "#/api/typesGenerated"; +import { ThemeOverride } from "#/contexts/ThemeProvider"; import { DashboardContext } from "#/modules/dashboard/DashboardProvider"; import { MockAppearanceConfig, @@ -37,10 +37,8 @@ class MockIntersectionObserver { // ---- Auth mock ---- -vi.mock("hooks", async () => { - const actual = await vi.importActual("hooks"); +vi.mock("#/hooks/useAuthenticated", async () => { return { - ...actual, useAuthenticated: () => ({ user: MockUserOwner, permissions: {}, diff --git a/site/src/pages/AgentsPage/components/Sidebar/AgentsSidebar.tsx b/site/src/pages/AgentsPage/components/Sidebar/AgentsSidebar.tsx index d9b15215bb..6b00f6eb8d 100644 --- a/site/src/pages/AgentsPage/components/Sidebar/AgentsSidebar.tsx +++ b/site/src/pages/AgentsPage/components/Sidebar/AgentsSidebar.tsx @@ -16,7 +16,6 @@ import { verticalListSortingStrategy, } from "@dnd-kit/sortable"; import { CSS } from "@dnd-kit/utilities"; -import { useAuthenticated } from "hooks"; import { AlertTriangleIcon, ArchiveIcon, @@ -85,6 +84,7 @@ import { TooltipContent, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { useAuthenticated } from "#/hooks/useAuthenticated"; import { UserDropdownContent } from "#/modules/dashboard/Navbar/UserDropdown/UserDropdownContent"; import { useDashboard } from "#/modules/dashboard/useDashboard"; import { cn } from "#/utils/cn"; diff --git a/site/src/pages/AgentsPage/components/WebPushButton.tsx b/site/src/pages/AgentsPage/components/WebPushButton.tsx index 283e51b4a3..24b9cc45b0 100644 --- a/site/src/pages/AgentsPage/components/WebPushButton.tsx +++ b/site/src/pages/AgentsPage/components/WebPushButton.tsx @@ -1,4 +1,3 @@ -import { useWebpushNotifications } from "contexts/useWebpushNotifications"; import { BellIcon, BellOffIcon } from "lucide-react"; import type { FC } from "react"; import { toast } from "sonner"; @@ -10,6 +9,7 @@ import { TooltipContent, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { useWebpushNotifications } from "#/contexts/useWebpushNotifications"; export const WebPushButton: FC = () => { const webPush = useWebpushNotifications(); diff --git a/site/src/pages/AgentsPage/hooks/useDesktopConnection.test.ts b/site/src/pages/AgentsPage/hooks/useDesktopConnection.test.ts index ea85bc57f9..09a85d5aa2 100644 --- a/site/src/pages/AgentsPage/hooks/useDesktopConnection.test.ts +++ b/site/src/pages/AgentsPage/hooks/useDesktopConnection.test.ts @@ -3,7 +3,7 @@ import { act } from "react"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { useDesktopConnection } from "./useDesktopConnection"; -vi.mock("api/api", () => ({ +vi.mock("#/api/api", () => ({ watchChatDesktop: vi.fn(), })); diff --git a/site/src/pages/AgentsPage/hooks/useDesktopConnection.ts b/site/src/pages/AgentsPage/hooks/useDesktopConnection.ts index cde6df86b8..e108c5075d 100644 --- a/site/src/pages/AgentsPage/hooks/useDesktopConnection.ts +++ b/site/src/pages/AgentsPage/hooks/useDesktopConnection.ts @@ -1,8 +1,8 @@ import RFB from "@novnc/novnc/lib/rfb"; -import { useClipboard } from "hooks/useClipboard"; import { useEffect, useRef, useState } from "react"; import { toast } from "sonner"; import { watchChatDesktop } from "#/api/api"; +import { useClipboard } from "#/hooks/useClipboard"; interface UseDesktopConnectionOptions { chatId: string | undefined; diff --git a/site/src/pages/AgentsPage/hooks/useGitWatcher.test.ts b/site/src/pages/AgentsPage/hooks/useGitWatcher.test.ts index a4ee02f246..92011e3b5d 100644 --- a/site/src/pages/AgentsPage/hooks/useGitWatcher.test.ts +++ b/site/src/pages/AgentsPage/hooks/useGitWatcher.test.ts @@ -4,7 +4,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import type { WorkspaceAgentStatus } from "#/api/typesGenerated"; import { useGitWatcher } from "./useGitWatcher"; -vi.mock("api/api", () => ({ +vi.mock("#/api/api", () => ({ watchChatGit: vi.fn(), })); diff --git a/site/src/pages/CliAuthPage/CliAuthPageView.tsx b/site/src/pages/CliAuthPage/CliAuthPageView.tsx index 80bae0b370..89546ee0ca 100644 --- a/site/src/pages/CliAuthPage/CliAuthPageView.tsx +++ b/site/src/pages/CliAuthPage/CliAuthPageView.tsx @@ -1,4 +1,3 @@ -import { useClipboard } from "hooks"; import { CheckIcon, CopyIcon } from "lucide-react"; import type { FC } from "react"; import { Link as RouterLink } from "react-router"; @@ -6,6 +5,7 @@ import { Button } from "#/components/Button/Button"; import { SignInLayout } from "#/components/SignInLayout/SignInLayout"; import { Spinner } from "#/components/Spinner/Spinner"; import { Welcome } from "#/components/Welcome/Welcome"; +import { useClipboard } from "#/hooks/useClipboard"; interface CliAuthPageViewProps { sessionToken?: string; diff --git a/site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx b/site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx index df253aaaa2..b5a5eba333 100644 --- a/site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx +++ b/site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx @@ -3,7 +3,6 @@ import TextField from "@mui/material/TextField"; import { useFormik } from "formik"; import camelCase from "lodash/camelCase"; import capitalize from "lodash/capitalize"; -import { SelectedTemplate } from "pages/CreateWorkspacePage/SelectedTemplate"; import { type FC, useState } from "react"; import { useQuery } from "react-query"; import { useSearchParams } from "react-router"; @@ -32,6 +31,7 @@ import { Label } from "#/components/Label/Label"; import { OrganizationAutocomplete } from "#/components/OrganizationAutocomplete/OrganizationAutocomplete"; import { Spinner } from "#/components/Spinner/Spinner"; import { ProvisionerTagsField } from "#/modules/provisioners/ProvisionerTagsField"; +import { SelectedTemplate } from "#/pages/CreateWorkspacePage/SelectedTemplate"; import { docs } from "#/utils/docs"; import { displayNameValidator, diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx index cf0c3bd1bf..45a60bdd48 100644 --- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx +++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx @@ -1,4 +1,3 @@ -import { useAuthenticated } from "hooks"; import { type FC, useCallback, @@ -28,6 +27,7 @@ import type { } from "#/api/typesGenerated"; import { Loader } from "#/components/Loader/Loader"; import { useEffectEvent } from "#/hooks/hookPolyfills"; +import { useAuthenticated } from "#/hooks/useAuthenticated"; import { getInitialParameterValues } from "#/modules/workspaces/DynamicParameter/DynamicParameter"; import { generateWorkspaceName } from "#/modules/workspaces/generateWorkspaceName"; import { pageTitle } from "#/utils/page"; diff --git a/site/src/pages/DeploymentSettingsPage/AppearanceSettingsPage/AppearanceSettingsPage.tsx b/site/src/pages/DeploymentSettingsPage/AppearanceSettingsPage/AppearanceSettingsPage.tsx index 725d0e8410..b7c6d31831 100644 --- a/site/src/pages/DeploymentSettingsPage/AppearanceSettingsPage/AppearanceSettingsPage.tsx +++ b/site/src/pages/DeploymentSettingsPage/AppearanceSettingsPage/AppearanceSettingsPage.tsx @@ -1,4 +1,3 @@ -import { useAuthenticated } from "hooks"; import type { FC } from "react"; import { useMutation, useQueryClient } from "react-query"; import { toast } from "sonner"; @@ -8,6 +7,7 @@ import { updateAppearance, } from "#/api/queries/appearance"; import type { UpdateAppearanceConfig } from "#/api/typesGenerated"; +import { useAuthenticated } from "#/hooks/useAuthenticated"; import { useDashboard } from "#/modules/dashboard/useDashboard"; import { useFeatureVisibility } from "#/modules/dashboard/useFeatureVisibility"; import { RequirePermission } from "#/modules/permissions/RequirePermission"; diff --git a/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/CreateOAuth2AppPage.tsx b/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/CreateOAuth2AppPage.tsx index 2ab4733cad..fed685a6ca 100644 --- a/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/CreateOAuth2AppPage.tsx +++ b/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/CreateOAuth2AppPage.tsx @@ -1,10 +1,10 @@ -import { useAuthenticated } from "hooks"; import type { FC } from "react"; import { useMutation, useQueryClient } from "react-query"; import { useNavigate, useSearchParams } from "react-router"; import { toast } from "sonner"; import { getErrorDetail } from "#/api/errors"; import { postApp } from "#/api/queries/oauth2"; +import { useAuthenticated } from "#/hooks/useAuthenticated"; import { pageTitle } from "#/utils/page"; import { CreateOAuth2AppPageView } from "./CreateOAuth2AppPageView"; diff --git a/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/EditOAuth2AppPage.tsx b/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/EditOAuth2AppPage.tsx index e2fb79f612..bdcc39acdc 100644 --- a/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/EditOAuth2AppPage.tsx +++ b/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/EditOAuth2AppPage.tsx @@ -1,4 +1,3 @@ -import { useAuthenticated } from "hooks"; import { type FC, useState } from "react"; import { useMutation, useQuery, useQueryClient } from "react-query"; import { useNavigate, useParams } from "react-router"; @@ -6,6 +5,7 @@ import { toast } from "sonner"; import { getErrorDetail } from "#/api/errors"; import * as oauth2 from "#/api/queries/oauth2"; import type * as TypesGen from "#/api/typesGenerated"; +import { useAuthenticated } from "#/hooks/useAuthenticated"; import { pageTitle } from "#/utils/page"; import { EditOAuth2AppPageView } from "./EditOAuth2AppPageView"; diff --git a/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/OAuth2AppsSettingsPage.tsx b/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/OAuth2AppsSettingsPage.tsx index bbe5e071c9..6381e88447 100644 --- a/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/OAuth2AppsSettingsPage.tsx +++ b/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/OAuth2AppsSettingsPage.tsx @@ -1,7 +1,7 @@ -import { useAuthenticated } from "hooks"; import type { FC } from "react"; import { useQuery } from "react-query"; import { getApps } from "#/api/queries/oauth2"; +import { useAuthenticated } from "#/hooks/useAuthenticated"; import { pageTitle } from "#/utils/page"; import OAuth2AppsSettingsPageView from "./OAuth2AppsSettingsPageView"; diff --git a/site/src/pages/ExternalAuthPage/ExternalAuthPage.tsx b/site/src/pages/ExternalAuthPage/ExternalAuthPage.tsx index d3ef763750..b46dcf04f6 100644 --- a/site/src/pages/ExternalAuthPage/ExternalAuthPage.tsx +++ b/site/src/pages/ExternalAuthPage/ExternalAuthPage.tsx @@ -1,5 +1,4 @@ import { isAxiosError } from "axios"; -import { useAuthenticated } from "hooks"; import type { FC } from "react"; import { useMemo } from "react"; import { useQuery, useQueryClient } from "react-query"; @@ -17,6 +16,7 @@ import { } from "#/components/GitDeviceAuth/GitDeviceAuth"; import { SignInLayout } from "#/components/SignInLayout/SignInLayout"; import { Welcome } from "#/components/Welcome/Welcome"; +import { useAuthenticated } from "#/hooks/useAuthenticated"; import ExternalAuthPageView from "./ExternalAuthPageView"; const ExternalAuthPage: FC = () => { diff --git a/site/src/pages/GroupsPage/GroupsPageView.tsx b/site/src/pages/GroupsPage/GroupsPageView.tsx index 9da7c37e2e..e64698680d 100644 --- a/site/src/pages/GroupsPage/GroupsPageView.tsx +++ b/site/src/pages/GroupsPage/GroupsPageView.tsx @@ -1,6 +1,5 @@ import type { Interpolation, Theme } from "@emotion/react"; import Skeleton from "@mui/material/Skeleton"; -import { useClickableTableRow } from "hooks"; import { ChevronRightIcon, PlusIcon } from "lucide-react"; import type { FC } from "react"; import { Link as RouterLink, useNavigate } from "react-router"; @@ -25,6 +24,7 @@ import { TableLoaderSkeleton, TableRowSkeleton, } from "#/components/TableLoader/TableLoader"; +import { useClickableTableRow } from "#/hooks/useClickableTableRow"; import { docs } from "#/utils/docs"; type GroupsPageViewProps = { diff --git a/site/src/pages/LoginPage/LoginPage.tsx b/site/src/pages/LoginPage/LoginPage.tsx index 1503105572..a7323e2740 100644 --- a/site/src/pages/LoginPage/LoginPage.tsx +++ b/site/src/pages/LoginPage/LoginPage.tsx @@ -1,9 +1,9 @@ -import { useAuthContext } from "contexts/auth/AuthProvider"; import { type FC, useEffect } from "react"; import { useQuery } from "react-query"; import { Navigate, useLocation, useNavigate } from "react-router"; import { buildInfo } from "#/api/queries/buildInfo"; import { authMethods } from "#/api/queries/users"; +import { useAuthContext } from "#/contexts/auth/AuthProvider"; import { useEmbeddedMetadata } from "#/hooks/useEmbeddedMetadata"; import { getApplicationName } from "#/utils/appearance"; import { retrieveRedirect } from "#/utils/redirect"; diff --git a/site/src/pages/OrganizationSettingsPage/CreateOrganizationPage.tsx b/site/src/pages/OrganizationSettingsPage/CreateOrganizationPage.tsx index 2a1a23de53..2da4aafba5 100644 --- a/site/src/pages/OrganizationSettingsPage/CreateOrganizationPage.tsx +++ b/site/src/pages/OrganizationSettingsPage/CreateOrganizationPage.tsx @@ -1,9 +1,9 @@ -import { useAuthenticated } from "hooks"; import type { FC } from "react"; import { useMutation, useQueryClient } from "react-query"; import { useNavigate } from "react-router"; import { toast } from "sonner"; import { createOrganization } from "#/api/queries/organizations"; +import { useAuthenticated } from "#/hooks/useAuthenticated"; import { useFeatureVisibility } from "#/modules/dashboard/useFeatureVisibility"; import { RequirePermission } from "#/modules/permissions/RequirePermission"; import { CreateOrganizationPageView } from "./CreateOrganizationPageView"; diff --git a/site/src/pages/OrganizationSettingsPage/OrganizationMembersPageView.tsx b/site/src/pages/OrganizationSettingsPage/OrganizationMembersPageView.tsx index 28b6aab86f..63df203de8 100644 --- a/site/src/pages/OrganizationSettingsPage/OrganizationMembersPageView.tsx +++ b/site/src/pages/OrganizationSettingsPage/OrganizationMembersPageView.tsx @@ -1,6 +1,4 @@ import { EllipsisVertical, TriangleAlert, UserPlusIcon } from "lucide-react"; -import { AISeatCell } from "modules/users/AISeatCell"; -import { UserGroupsCell } from "pages/UsersPage/UsersTable/UserGroupsCell"; import { type FC, useState } from "react"; import { toast } from "sonner"; import { getErrorDetail, getErrorMessage } from "#/api/errors"; @@ -38,6 +36,8 @@ import { } from "#/components/Table/Table"; import { UserAutocomplete } from "#/components/UserAutocomplete/UserAutocomplete"; import type { PaginationResultInfo } from "#/hooks/usePaginatedQuery"; +import { AISeatCell } from "#/modules/users/AISeatCell"; +import { UserGroupsCell } from "#/pages/UsersPage/UsersTable/UserGroupsCell"; import { TableColumnHelpTooltip } from "./UserTable/TableColumnHelpTooltip"; import { UserRoleCell } from "./UserTable/UserRoleCell"; diff --git a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/ProvisionerRow.tsx b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/ProvisionerRow.tsx index 850d8554c1..dc53cdf58e 100644 --- a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/ProvisionerRow.tsx +++ b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/ProvisionerRow.tsx @@ -1,5 +1,4 @@ import { ChevronRightIcon } from "lucide-react"; -import { ProvisionerKey } from "pages/OrganizationSettingsPage/OrganizationProvisionersPage/ProvisionerKey"; import { type FC, useState } from "react"; import { Link as RouterLink } from "react-router"; import type { @@ -19,6 +18,7 @@ import { ProvisionerTags, ProvisionerTruncateTags, } from "#/modules/provisioners/ProvisionerTags"; +import { ProvisionerKey } from "#/pages/OrganizationSettingsPage/OrganizationProvisionersPage/ProvisionerKey"; import { cn } from "#/utils/cn"; import { relativeTime } from "#/utils/time"; import { ProvisionerVersion } from "./ProvisionerVersion"; diff --git a/site/src/pages/SetupPage/SetupPage.tsx b/site/src/pages/SetupPage/SetupPage.tsx index 9b4b812f10..b1bac76c5a 100644 --- a/site/src/pages/SetupPage/SetupPage.tsx +++ b/site/src/pages/SetupPage/SetupPage.tsx @@ -1,10 +1,10 @@ -import { useAuthContext } from "contexts/auth/AuthProvider"; import { type FC, useEffect, useRef } from "react"; import { useMutation, useQuery } from "react-query"; import { Navigate } from "react-router"; import { buildInfo } from "#/api/queries/buildInfo"; import { authMethods, createFirstUser } from "#/api/queries/users"; import { Loader } from "#/components/Loader/Loader"; +import { useAuthContext } from "#/contexts/auth/AuthProvider"; import { useEmbeddedMetadata } from "#/hooks/useEmbeddedMetadata"; import { pageTitle } from "#/utils/page"; import { sendDeploymentEvent } from "#/utils/telemetry"; diff --git a/site/src/pages/TaskPage/TaskAppIframe.tsx b/site/src/pages/TaskPage/TaskAppIframe.tsx index 4b6a8f34c8..90666e1a79 100644 --- a/site/src/pages/TaskPage/TaskAppIframe.tsx +++ b/site/src/pages/TaskPage/TaskAppIframe.tsx @@ -1,4 +1,3 @@ -import { useProxy } from "contexts/ProxyContext"; import { EllipsisVertical, ExternalLinkIcon, HouseIcon } from "lucide-react"; import { type FC, type HTMLProps, useRef } from "react"; import { Link as RouterLink } from "react-router"; @@ -11,6 +10,7 @@ import { DropdownMenuTrigger, } from "#/components/DropdownMenu/DropdownMenu"; import { Spinner } from "#/components/Spinner/Spinner"; +import { useProxy } from "#/contexts/ProxyContext"; import { useAppLink } from "#/modules/apps/useAppLink"; import type { WorkspaceAppWithAgent } from "#/modules/tasks/apps"; import { cn } from "#/utils/cn"; diff --git a/site/src/pages/TaskPage/TaskApps.stories.tsx b/site/src/pages/TaskPage/TaskApps.stories.tsx index 31626c33c2..2d4f29c63c 100644 --- a/site/src/pages/TaskPage/TaskApps.stories.tsx +++ b/site/src/pages/TaskPage/TaskApps.stories.tsx @@ -1,7 +1,7 @@ import type { Meta, StoryObj } from "@storybook/react-vite"; -import { getPreferredProxy } from "contexts/ProxyContext"; import kebabCase from "lodash/kebabCase"; import type { Task, Workspace, WorkspaceApp } from "#/api/typesGenerated"; +import { getPreferredProxy } from "#/contexts/ProxyContext"; import { MockPrimaryWorkspaceProxy, MockTask, diff --git a/site/src/pages/TaskPage/TaskTopbar.tsx b/site/src/pages/TaskPage/TaskTopbar.tsx index 81655dc0c7..4eb964846f 100644 --- a/site/src/pages/TaskPage/TaskTopbar.tsx +++ b/site/src/pages/TaskPage/TaskTopbar.tsx @@ -1,4 +1,3 @@ -import { useClipboard } from "hooks"; import { ArrowLeftIcon, CheckIcon, @@ -21,6 +20,7 @@ import { TooltipProvider, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { useClipboard } from "#/hooks/useClipboard"; import { ShareButton } from "../WorkspacePage/WorkspaceActions/ShareButton"; import { TaskStartupWarningButton } from "./TaskStartupWarningButton"; import { TaskStatusLink } from "./TaskStatusLink"; diff --git a/site/src/pages/TasksPage/TasksPage.stories.tsx b/site/src/pages/TasksPage/TasksPage.stories.tsx index d83e3dff85..5fd56cd4f4 100644 --- a/site/src/pages/TasksPage/TasksPage.stories.tsx +++ b/site/src/pages/TasksPage/TasksPage.stories.tsx @@ -1,5 +1,4 @@ import type { Meta, StoryObj } from "@storybook/react-vite"; -import { MockUsers } from "pages/UsersPage/storybookData/users"; import { expect, fireEvent, @@ -11,6 +10,7 @@ import { } from "storybook/test"; import { API } from "#/api/api"; import { getTemplatesQueryKey } from "#/api/queries/templates"; +import { MockUsers } from "#/pages/UsersPage/storybookData/users"; import { MockDisplayNameTasks, MockInitializingTasks, diff --git a/site/src/pages/TasksPage/TasksPage.tsx b/site/src/pages/TasksPage/TasksPage.tsx index 4f9d1347b3..5ed840b424 100644 --- a/site/src/pages/TasksPage/TasksPage.tsx +++ b/site/src/pages/TasksPage/TasksPage.tsx @@ -1,4 +1,3 @@ -import { useAuthenticated } from "hooks"; import { ChevronDownIcon, TrashIcon } from "lucide-react"; import { type FC, useState } from "react"; import { useMutation, useQueries, useQuery, useQueryClient } from "react-query"; @@ -32,6 +31,7 @@ import { import { Spinner } from "#/components/Spinner/Spinner"; import { Switch } from "#/components/Switch/Switch"; import { TableToolbar } from "#/components/TableToolbar/TableToolbar"; +import { useAuthenticated } from "#/hooks/useAuthenticated"; import { useSearchParamsKey } from "#/hooks/useSearchParamsKey"; import { isTaskNotification, diff --git a/site/src/pages/TasksPage/TasksTable.tsx b/site/src/pages/TasksPage/TasksTable.tsx index 308ead37ad..cb2d4edafd 100644 --- a/site/src/pages/TasksPage/TasksTable.tsx +++ b/site/src/pages/TasksPage/TasksTable.tsx @@ -1,4 +1,3 @@ -import { useClickableTableRow } from "hooks"; import { EllipsisVertical, RotateCcwIcon, TrashIcon } from "lucide-react"; import { type FC, type ReactNode, useState } from "react"; import { useMutation, useQueryClient } from "react-query"; @@ -31,6 +30,7 @@ import { TableLoaderSkeleton, TableRowSkeleton, } from "#/components/TableLoader/TableLoader"; +import { useClickableTableRow } from "#/hooks/useClickableTableRow"; import { TaskActionButton } from "#/modules/tasks/TaskActionButton"; import { TaskDeleteDialog } from "#/modules/tasks/TaskDeleteDialog/TaskDeleteDialog"; import { TaskStatus } from "#/modules/tasks/TaskStatus/TaskStatus"; diff --git a/site/src/pages/TasksPage/UsersCombobox.tsx b/site/src/pages/TasksPage/UsersCombobox.tsx index db5e8ce23e..a27b80e78f 100644 --- a/site/src/pages/TasksPage/UsersCombobox.tsx +++ b/site/src/pages/TasksPage/UsersCombobox.tsx @@ -1,5 +1,4 @@ import Skeleton from "@mui/material/Skeleton"; -import { useAuthenticated } from "hooks"; import { CheckIcon, ChevronsUpDownIcon } from "lucide-react"; import { type FC, useState } from "react"; import { keepPreviousData, useQuery } from "react-query"; @@ -21,6 +20,7 @@ import { PopoverTrigger, } from "#/components/Popover/Popover"; import { useDebouncedValue } from "#/hooks/debounce"; +import { useAuthenticated } from "#/hooks/useAuthenticated"; import { cn } from "#/utils/cn"; type UserOption = { diff --git a/site/src/pages/TemplatePage/TemplateDocsPage/TemplateDocsPage.tsx b/site/src/pages/TemplatePage/TemplateDocsPage/TemplateDocsPage.tsx index 4070165b1f..5bdd479860 100644 --- a/site/src/pages/TemplatePage/TemplateDocsPage/TemplateDocsPage.tsx +++ b/site/src/pages/TemplatePage/TemplateDocsPage/TemplateDocsPage.tsx @@ -1,7 +1,7 @@ import { useTheme } from "@emotion/react"; import frontMatter from "front-matter"; -import { useTemplateLayoutContext } from "pages/TemplatePage/TemplateLayout"; import { MemoizedMarkdown } from "#/components/Markdown/Markdown"; +import { useTemplateLayoutContext } from "#/pages/TemplatePage/TemplateLayout"; import { pageTitle } from "#/utils/page"; export default function TemplateDocsPage() { diff --git a/site/src/pages/TemplatePage/TemplateEmbedPage/TemplateEmbedPage.jest.tsx b/site/src/pages/TemplatePage/TemplateEmbedPage/TemplateEmbedPage.jest.tsx index 941d14bf3e..51a3884b5a 100644 --- a/site/src/pages/TemplatePage/TemplateEmbedPage/TemplateEmbedPage.jest.tsx +++ b/site/src/pages/TemplatePage/TemplateEmbedPage/TemplateEmbedPage.jest.tsx @@ -1,7 +1,7 @@ import { screen } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; -import { TemplateLayout } from "pages/TemplatePage/TemplateLayout"; import { API } from "#/api/api"; +import { TemplateLayout } from "#/pages/TemplatePage/TemplateLayout"; import { MockTemplate, MockTemplateVersionParameter1 as parameter1, diff --git a/site/src/pages/TemplatePage/TemplateEmbedPage/TemplateEmbedPage.tsx b/site/src/pages/TemplatePage/TemplateEmbedPage/TemplateEmbedPage.tsx index 6da89c3a2f..21d3944433 100644 --- a/site/src/pages/TemplatePage/TemplateEmbedPage/TemplateEmbedPage.tsx +++ b/site/src/pages/TemplatePage/TemplateEmbedPage/TemplateEmbedPage.tsx @@ -2,7 +2,6 @@ import FormControlLabel from "@mui/material/FormControlLabel"; import Radio from "@mui/material/Radio"; import RadioGroup from "@mui/material/RadioGroup"; import { CheckIcon, CopyIcon } from "lucide-react"; -import { useTemplateLayoutContext } from "pages/TemplatePage/TemplateLayout"; import { type FC, useEffect, useId, useState } from "react"; import { useQuery } from "react-query"; import { ValidationError } from "yup"; @@ -16,6 +15,7 @@ import { Loader } from "#/components/Loader/Loader"; import { RichParameterInput } from "#/components/RichParameterInput/RichParameterInput"; import { useDebouncedFunction } from "#/hooks/debounce"; import { useClipboard } from "#/hooks/useClipboard"; +import { useTemplateLayoutContext } from "#/pages/TemplatePage/TemplateLayout"; import { nameValidator } from "#/utils/formUtils"; import { pageTitle } from "#/utils/page"; import { getInitialRichParameterValues } from "#/utils/richParameters"; diff --git a/site/src/pages/TemplatePage/TemplateEmbedPage/TemplateEmbedPageExperimental.tsx b/site/src/pages/TemplatePage/TemplateEmbedPage/TemplateEmbedPageExperimental.tsx index 3b144ca640..c804611bfc 100644 --- a/site/src/pages/TemplatePage/TemplateEmbedPage/TemplateEmbedPageExperimental.tsx +++ b/site/src/pages/TemplatePage/TemplateEmbedPage/TemplateEmbedPageExperimental.tsx @@ -1,6 +1,4 @@ -import { useAuthenticated } from "hooks"; import { CheckIcon, CopyIcon } from "lucide-react"; -import { useTemplateLayoutContext } from "pages/TemplatePage/TemplateLayout"; import { type FC, useEffect, useMemo, useRef, useState } from "react"; import { API } from "#/api/api"; import { DetailedError } from "#/api/errors"; @@ -18,11 +16,13 @@ import { RadioGroup, RadioGroupItem } from "#/components/RadioGroup/RadioGroup"; import { Separator } from "#/components/Separator/Separator"; import { Skeleton } from "#/components/Skeleton/Skeleton"; import { useEffectEvent } from "#/hooks/hookPolyfills"; +import { useAuthenticated } from "#/hooks/useAuthenticated"; import { useClipboard } from "#/hooks/useClipboard"; import { Diagnostics, DynamicParameter, } from "#/modules/workspaces/DynamicParameter/DynamicParameter"; +import { useTemplateLayoutContext } from "#/pages/TemplatePage/TemplateLayout"; import { pageTitle } from "#/utils/page"; type ButtonValues = Record; diff --git a/site/src/pages/TemplatePage/TemplateFilesPage/TemplateFilesPage.jest.tsx b/site/src/pages/TemplatePage/TemplateFilesPage/TemplateFilesPage.jest.tsx index c8e662d79d..0cce93fb9a 100644 --- a/site/src/pages/TemplatePage/TemplateFilesPage/TemplateFilesPage.jest.tsx +++ b/site/src/pages/TemplatePage/TemplateFilesPage/TemplateFilesPage.jest.tsx @@ -1,8 +1,8 @@ -import { AppProviders } from "App"; import { render, screen } from "@testing-library/react"; -import { RequireAuth } from "contexts/auth/RequireAuth"; import { HttpResponse, http } from "msw"; import { createMemoryRouter, RouterProvider } from "react-router"; +import { AppProviders } from "#/App"; +import { RequireAuth } from "#/contexts/auth/RequireAuth"; import { MockTemplate } from "#/testHelpers/entities"; import { server } from "#/testHelpers/server"; import { TemplateLayout } from "../TemplateLayout"; @@ -10,7 +10,7 @@ import TemplateFilesPage from "./TemplateFilesPage"; // Occasionally, Jest encounters HTML5 canvas errors. As the SyntaxHighlight is // not required for these tests, we can safely mock it. -jest.mock("components/SyntaxHighlighter/SyntaxHighlighter", () => ({ +jest.mock("#/components/SyntaxHighlighter/SyntaxHighlighter", () => ({ SyntaxHighlighter: () =>
, })); diff --git a/site/src/pages/TemplatePage/TemplateFilesPage/TemplateFilesPage.tsx b/site/src/pages/TemplatePage/TemplateFilesPage/TemplateFilesPage.tsx index 3fb464ead7..0189a523c9 100644 --- a/site/src/pages/TemplatePage/TemplateFilesPage/TemplateFilesPage.tsx +++ b/site/src/pages/TemplatePage/TemplateFilesPage/TemplateFilesPage.tsx @@ -1,4 +1,3 @@ -import { useTemplateLayoutContext } from "pages/TemplatePage/TemplateLayout"; import type { FC } from "react"; import { useQuery } from "react-query"; import { useParams } from "react-router"; @@ -8,6 +7,7 @@ import { } from "#/api/queries/templates"; import { Loader } from "#/components/Loader/Loader"; import { TemplateFiles } from "#/modules/templates/TemplateFiles/TemplateFiles"; +import { useTemplateLayoutContext } from "#/pages/TemplatePage/TemplateLayout"; import { getTemplatePageTitle } from "../utils"; const TemplateFilesPage: FC = () => { diff --git a/site/src/pages/TemplatePage/TemplateInsightsPage/TemplateInsightsPage.tsx b/site/src/pages/TemplatePage/TemplateInsightsPage/TemplateInsightsPage.tsx index 588ddbfbc9..73533441cd 100644 --- a/site/src/pages/TemplatePage/TemplateInsightsPage/TemplateInsightsPage.tsx +++ b/site/src/pages/TemplatePage/TemplateInsightsPage/TemplateInsightsPage.tsx @@ -4,11 +4,6 @@ import { CircleXIcon, SquareArrowOutUpRightIcon, } from "lucide-react"; -import { - DateRangePicker as DailyPicker, - type DateRangeValue, -} from "pages/AgentsPage/components/DateRangePicker/DateRangePicker"; -import { useTemplateLayoutContext } from "pages/TemplatePage/TemplateLayout"; import { type FC, Fragment, @@ -56,6 +51,11 @@ import { TooltipTrigger, } from "#/components/Tooltip/Tooltip"; import { RequirePermission } from "#/modules/permissions/RequirePermission"; +import { + DateRangePicker as DailyPicker, + type DateRangeValue, +} from "#/pages/AgentsPage/components/DateRangePicker/DateRangePicker"; +import { useTemplateLayoutContext } from "#/pages/TemplatePage/TemplateLayout"; import { cn } from "#/utils/cn"; import { getLatencyColor } from "#/utils/latency"; import { diff --git a/site/src/pages/TemplatePage/TemplateInsightsPage/WeekPicker.tsx b/site/src/pages/TemplatePage/TemplateInsightsPage/WeekPicker.tsx index e2d68f70c7..03fe4435e2 100644 --- a/site/src/pages/TemplatePage/TemplateInsightsPage/WeekPicker.tsx +++ b/site/src/pages/TemplatePage/TemplateInsightsPage/WeekPicker.tsx @@ -1,5 +1,4 @@ import dayjs from "dayjs"; -import type { DateRangeValue } from "pages/AgentsPage/components/DateRangePicker/DateRangePicker"; import type { FC } from "react"; import { ChevronDownIcon } from "#/components/AnimatedIcons/ChevronDown"; import { Button } from "#/components/Button/Button"; @@ -10,6 +9,7 @@ import { DropdownMenuRadioItem, DropdownMenuTrigger, } from "#/components/DropdownMenu/DropdownMenu"; +import type { DateRangeValue } from "#/pages/AgentsPage/components/DateRangePicker/DateRangePicker"; import { lastWeeks } from "./utils"; // There is no point in showing the period > 6 months. We prune stats older than diff --git a/site/src/pages/TemplatePage/TemplateLayout.tsx b/site/src/pages/TemplatePage/TemplateLayout.tsx index 890057e386..a45c33cb28 100644 --- a/site/src/pages/TemplatePage/TemplateLayout.tsx +++ b/site/src/pages/TemplatePage/TemplateLayout.tsx @@ -1,4 +1,3 @@ -import { useAuthenticated } from "hooks"; import { createContext, type FC, @@ -15,6 +14,7 @@ import { ErrorAlert } from "#/components/Alert/ErrorAlert"; import { Loader } from "#/components/Loader/Loader"; import { Margins } from "#/components/Margins/Margins"; import { TabLink, Tabs, TabsList } from "#/components/Tabs/Tabs"; +import { useAuthenticated } from "#/hooks/useAuthenticated"; import { useFeatureVisibility } from "#/modules/dashboard/useFeatureVisibility"; import { type WorkspacePermissions, diff --git a/site/src/pages/TemplatePage/TemplatePrebuildsPage/TemplatePrebuildsPage.tsx b/site/src/pages/TemplatePage/TemplatePrebuildsPage/TemplatePrebuildsPage.tsx index 0a3adf5f07..a907e42d0a 100644 --- a/site/src/pages/TemplatePage/TemplatePrebuildsPage/TemplatePrebuildsPage.tsx +++ b/site/src/pages/TemplatePage/TemplatePrebuildsPage/TemplatePrebuildsPage.tsx @@ -1,5 +1,4 @@ import { RefreshCw } from "lucide-react"; -import { useTemplateLayoutContext } from "pages/TemplatePage/TemplateLayout"; import type { FC } from "react"; import { useMutation } from "react-query"; import { toast } from "sonner"; @@ -7,6 +6,7 @@ import { API } from "#/api/api"; import type { InvalidatePresetsResponse } from "#/api/typesGenerated"; import { ErrorAlert } from "#/components/Alert/ErrorAlert"; import { Button } from "#/components/Button/Button"; +import { useTemplateLayoutContext } from "#/pages/TemplatePage/TemplateLayout"; import { pageTitle } from "#/utils/page"; const TemplatePrebuildsPage: FC = () => { diff --git a/site/src/pages/TemplatePage/TemplateResourcesPage/TemplateResourcesPage.tsx b/site/src/pages/TemplatePage/TemplateResourcesPage/TemplateResourcesPage.tsx index 87f5379aa1..8ced44cc19 100644 --- a/site/src/pages/TemplatePage/TemplateResourcesPage/TemplateResourcesPage.tsx +++ b/site/src/pages/TemplatePage/TemplateResourcesPage/TemplateResourcesPage.tsx @@ -1,7 +1,7 @@ -import { useTemplateLayoutContext } from "pages/TemplatePage/TemplateLayout"; import type { FC } from "react"; import { useQuery } from "react-query"; import { API } from "#/api/api"; +import { useTemplateLayoutContext } from "#/pages/TemplatePage/TemplateLayout"; import { getTemplatePageTitle } from "../utils"; import { TemplateResourcesPageView } from "./TemplateResourcesPageView"; diff --git a/site/src/pages/TemplatePage/TemplateVersionsPage/TemplateVersionsPage.tsx b/site/src/pages/TemplatePage/TemplateVersionsPage/TemplateVersionsPage.tsx index f146f2ca4c..d8dc3b88ef 100644 --- a/site/src/pages/TemplatePage/TemplateVersionsPage/TemplateVersionsPage.tsx +++ b/site/src/pages/TemplatePage/TemplateVersionsPage/TemplateVersionsPage.tsx @@ -1,4 +1,3 @@ -import { useTemplateLayoutContext } from "pages/TemplatePage/TemplateLayout"; import { useState } from "react"; import { useMutation, useQuery, useQueryClient } from "react-query"; import { useNavigate } from "react-router"; @@ -11,6 +10,7 @@ import { } from "#/api/queries/templates"; import { ConfirmDialog } from "#/components/Dialogs/ConfirmDialog/ConfirmDialog"; import { linkToTemplate, useLinks } from "#/modules/navigation"; +import { useTemplateLayoutContext } from "#/pages/TemplatePage/TemplateLayout"; import { getTemplatePageTitle } from "../utils"; import { VersionsTable } from "./VersionsTable"; diff --git a/site/src/pages/TemplateSettingsPage/TemplateVariablesPage/TemplateVariablesPage.jest.tsx b/site/src/pages/TemplateSettingsPage/TemplateVariablesPage/TemplateVariablesPage.jest.tsx index 4bd85ece8a..57e0f24525 100644 --- a/site/src/pages/TemplateSettingsPage/TemplateVariablesPage/TemplateVariablesPage.jest.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplateVariablesPage/TemplateVariablesPage.jest.tsx @@ -19,7 +19,7 @@ import TemplateVariablesPage from "./TemplateVariablesPage"; // a real `delay(1000)` call. Without this mock the 1 s wall-clock wait races // against the default `waitFor` timeout (also 1 s), making the "submit" // assertion flaky in CI. -jest.mock("utils/delay", () => ({ +jest.mock("#/utils/delay", () => ({ delay: () => Promise.resolve(), })); diff --git a/site/src/pages/TemplateVersionEditorPage/MissingTemplateVariablesDialog.tsx b/site/src/pages/TemplateVersionEditorPage/MissingTemplateVariablesDialog.tsx index be4169fb9f..7445063373 100644 --- a/site/src/pages/TemplateVersionEditorPage/MissingTemplateVariablesDialog.tsx +++ b/site/src/pages/TemplateVersionEditorPage/MissingTemplateVariablesDialog.tsx @@ -5,7 +5,6 @@ import DialogActions from "@mui/material/DialogActions"; import DialogContent from "@mui/material/DialogContent"; import DialogContentText from "@mui/material/DialogContentText"; import DialogTitle from "@mui/material/DialogTitle"; -import { VariableInput } from "pages/CreateTemplatePage/VariableInput"; import { type FC, useEffect, useState } from "react"; import type { TemplateVersionVariable, @@ -15,6 +14,7 @@ import { Button } from "#/components/Button/Button"; import type { DialogProps } from "#/components/Dialogs/Dialog"; import { FormFields, VerticalForm } from "#/components/Form/Form"; import { Loader } from "#/components/Loader/Loader"; +import { VariableInput } from "#/pages/CreateTemplatePage/VariableInput"; type MissingTemplateVariablesDialogProps = Omit & { onClose: () => void; diff --git a/site/src/pages/TemplateVersionEditorPage/PublishTemplateVersionDialog.tsx b/site/src/pages/TemplateVersionEditorPage/PublishTemplateVersionDialog.tsx index 8fa81c3f4f..95f91d9cd6 100644 --- a/site/src/pages/TemplateVersionEditorPage/PublishTemplateVersionDialog.tsx +++ b/site/src/pages/TemplateVersionEditorPage/PublishTemplateVersionDialog.tsx @@ -2,13 +2,13 @@ import Checkbox from "@mui/material/Checkbox"; import FormControlLabel from "@mui/material/FormControlLabel"; import TextField from "@mui/material/TextField"; import { useFormik } from "formik"; -import type { PublishVersionData } from "pages/TemplateVersionEditorPage/types"; import type { FC } from "react"; import * as Yup from "yup"; import { ConfirmDialog } from "#/components/Dialogs/ConfirmDialog/ConfirmDialog"; import type { DialogProps } from "#/components/Dialogs/Dialog"; import { FormFields } from "#/components/Form/Form"; import { Stack } from "#/components/Stack/Stack"; +import type { PublishVersionData } from "#/pages/TemplateVersionEditorPage/types"; import { getFormHelpers } from "#/utils/formUtils"; import { HelpTooltip, diff --git a/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.tsx b/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.tsx index eb45d6eb45..c52fcb8f8c 100644 --- a/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.tsx +++ b/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.tsx @@ -7,7 +7,6 @@ import { TriangleAlertIcon, XIcon, } from "lucide-react"; -import type { PublishVersionData } from "pages/TemplateVersionEditorPage/types"; import { type FC, useCallback, useEffect, useRef, useState } from "react"; import { Link as RouterLink, @@ -52,6 +51,7 @@ import { isBinaryData } from "#/modules/templates/TemplateFiles/isBinaryData"; import { TemplateFileTree } from "#/modules/templates/TemplateFiles/TemplateFileTree"; import { TemplateResourcesTable } from "#/modules/templates/TemplateResourcesTable/TemplateResourcesTable"; import { WorkspaceBuildLogs } from "#/modules/workspaces/WorkspaceBuildLogs/WorkspaceBuildLogs"; +import type { PublishVersionData } from "#/pages/TemplateVersionEditorPage/types"; import { cn } from "#/utils/cn"; import { createFile, diff --git a/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditorPage.test.tsx b/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditorPage.test.tsx index 7ca72eef3f..5c39038386 100644 --- a/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditorPage.test.tsx +++ b/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditorPage.test.tsx @@ -1,14 +1,14 @@ -import { AppProviders } from "App"; import { render, screen, waitFor, within } from "@testing-library/react"; import userEvent, { type UserEvent } from "@testing-library/user-event"; -import { RequireAuth } from "contexts/auth/RequireAuth"; import WS from "jest-websocket-mock"; import { HttpResponse, http } from "msw"; import { QueryClient } from "react-query"; import { createMemoryRouter, RouterProvider } from "react-router"; +import { AppProviders } from "#/App"; import * as apiModule from "#/api/api"; import { templateVersionVariablesKey } from "#/api/queries/templates"; import type { TemplateVersion } from "#/api/typesGenerated"; +import { RequireAuth } from "#/contexts/auth/RequireAuth"; import { MockTemplate, MockTemplateVersion, @@ -43,7 +43,7 @@ vi.mock( // Occasionally, Jest encounters HTML5 canvas errors. As the MonacoEditor is not // required for these tests, we can safely mock it. -vi.mock("pages/TemplateVersionEditorPage/MonacoEditor", () => ({ +vi.mock("#/pages/TemplateVersionEditorPage/MonacoEditor", () => ({ MonacoEditor: (props: MonacoEditorProps) => (