diff --git a/site/src/App.tsx b/site/src/App.tsx index 39f75813c8349..952f7c0920a51 100644 --- a/site/src/App.tsx +++ b/site/src/App.tsx @@ -1,13 +1,14 @@ import { QueryClient, QueryClientProvider } from "react-query"; import { type FC, type ReactNode, useEffect, useState } from "react"; import { HelmetProvider } from "react-helmet-async"; -import { AppRouter } from "./AppRouter"; +import { router } from "./router"; import { ThemeProvider } from "./contexts/ThemeProvider"; import { AuthProvider } from "./contexts/auth/AuthProvider"; import { ErrorBoundary } from "./components/ErrorBoundary/ErrorBoundary"; import { GlobalSnackbar } from "./components/GlobalSnackbar/GlobalSnackbar"; import "./theme/globalFonts"; import { ReactQueryDevtools } from "@tanstack/react-query-devtools"; +import { RouterProvider } from "react-router-dom"; const defaultQueryClient = new QueryClient({ defaultOptions: { @@ -61,7 +62,7 @@ export const App: FC = () => { return ( - + ); diff --git a/site/src/pages/TemplateVersionEditorPage/MonacoEditor.tsx b/site/src/pages/TemplateVersionEditorPage/MonacoEditor.tsx index 63c5bc4cc87a9..c9de35adf9c4d 100644 --- a/site/src/pages/TemplateVersionEditorPage/MonacoEditor.tsx +++ b/site/src/pages/TemplateVersionEditorPage/MonacoEditor.tsx @@ -6,7 +6,7 @@ import { MONOSPACE_FONT_FAMILY } from "theme/constants"; loader.config({ monaco }); -interface MonacoEditorProps { +export interface MonacoEditorProps { value?: string; path?: string; onChange?: (value: string) => void; diff --git a/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.tsx b/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.tsx index 879ddc3abbc76..2a85541d79d14 100644 --- a/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.tsx +++ b/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.tsx @@ -2,7 +2,10 @@ import Button from "@mui/material/Button"; import IconButton from "@mui/material/IconButton"; import Tooltip from "@mui/material/Tooltip"; import CreateIcon from "@mui/icons-material/AddOutlined"; -import { Link as RouterLink } from "react-router-dom"; +import { + Link as RouterLink, + unstable_usePrompt as usePrompt, +} from "react-router-dom"; import { type Interpolation, type Theme, useTheme } from "@emotion/react"; import { type FC, useCallback, useEffect, useRef, useState } from "react"; import AlertTitle from "@mui/material/AlertTitle"; @@ -65,8 +68,8 @@ export interface TemplateVersionEditorProps { defaultFileTree: FileTree; buildLogs?: ProvisionerJobLog[]; resources?: WorkspaceResource[]; - disablePreview?: boolean; - disableUpdate?: boolean; + isBuilding: boolean; + canPublish: boolean; onPreview: (files: FileTree) => Promise; onPublish: () => void; onConfirmPublish: (data: PublishVersionData) => void; @@ -88,8 +91,8 @@ export interface TemplateVersionEditorProps { } export const TemplateVersionEditor: FC = ({ - disablePreview, - disableUpdate, + isBuilding, + canPublish, template, templateVersion, defaultFileTree, @@ -179,6 +182,10 @@ export const TemplateVersionEditor: FC = ({ } }, [buildLogs]); + useLeaveSiteWarning(canPublish); + + const canBuild = !isBuilding && dirty; + return ( <>
@@ -242,7 +249,7 @@ export const TemplateVersionEditor: FC = ({ borderLeft: "1px solid #FFF", }, }} - disabled={disablePreview} + disabled={!canBuild} > = ({ /> } title="Build template (Ctrl + Enter)" - disabled={disablePreview} + disabled={!canBuild} onClick={async () => { await triggerPreview(); }} @@ -276,7 +283,7 @@ export const TemplateVersionEditor: FC = ({ Publish @@ -540,7 +547,7 @@ export const TemplateVersionEditor: FC = ({