Path: blob/main/components/dashboard/src/repositories/detail/ConfigurationDetailPage.tsx
2501 views
/**1* Copyright (c) 2022 Gitpod GmbH. All rights reserved.2* Licensed under the GNU Affero General Public License (AGPL).3* See License.AGPL.txt in the project root for license information.4*/56import { BreadcrumbNav } from "@podkit/breadcrumbs/BreadcrumbNav";7import { Button } from "@podkit/buttons/Button";8import { AlertTriangle } from "lucide-react";9import { FC, useMemo } from "react";10import Alert from "../../components/Alert";11import { WidePageWithSubMenu } from "../../components/WidePageWithSubmenu";12import type { SubmenuItemProps } from "../../components/PageWithSubMenu";13import { Route, Switch, useParams, useRouteMatch } from "react-router";14import { useConfiguration } from "../../data/configurations/configuration-queries";15import { ConfigurationDetailGeneral } from "./ConfigurationDetailGeneral";16import { ConfigurationDetailWorkspaces } from "./ConfigurationDetailWorkspaces";17import { ConfigurationDetailPrebuilds } from "./ConfigurationDetailPrebuilds";18import { ConfigurationVariableList } from "./variables/ConfigurationVariableList";19import { useWorkspaceClasses } from "../../data/workspaces/workspace-classes-query";20import { LoadingState } from "@podkit/loading/LoadingState";21import { ConfigurationDetailEditors } from "./ConfigurationDetailEditors";2223type PageRouteParams = {24id: string;25};26const ConfigurationDetailPage: FC = () => {27// preload some data we may show28useWorkspaceClasses();2930const { id } = useParams<PageRouteParams>();31const { path, url } = useRouteMatch();3233const { data, error, isLoading, refetch } = useConfiguration(id);34const prebuildsEnabled = !!data?.prebuildSettings?.enabled;3536const settingsMenu = useMemo(() => {37const menu: SubmenuItemProps[] = [38{39title: "General",40link: [url],41},42{43title: "Prebuild settings",44link: [`${url}/prebuilds`],45icon: !prebuildsEnabled ? <AlertTriangle size={20} /> : undefined,46},47{48title: "Environment variables",49link: [`${url}/variables`],50},51{52title: "Workspace classes",53link: [`${url}/workspaces`],54},55{56title: "Workspace editors",57link: [`${url}/editors`],58},59];60return menu;61}, [prebuildsEnabled, url]);6263return (64<div className="w-full">65<BreadcrumbNav pageTitle="Repositories" pageDescription={data?.name ?? ""} backLink="/repositories" />66<WidePageWithSubMenu subMenu={settingsMenu} navTitle="Repository settings">67{isLoading && <LoadingState />}68{error ? (69<div className="gap-4">70<Alert type="error">71<span>Failed to load repository</span>72<pre>{error.message}</pre>73</Alert>74<Button75variant={"destructive"}76onClick={() => {77refetch();78}}79>80Retry81</Button>82</div>83) : (84!isLoading &&85(!data ? (86// TODO: add a better not-found UI w/ link back to repositories87<div>Sorry, we couldn't find this repository.</div>88) : (89<div className="flex flex-col gap-4">90<Switch>91<Route exact path={path}>92<ConfigurationDetailGeneral configuration={data} />93</Route>94<Route exact path={`${path}/workspaces`}>95<ConfigurationDetailWorkspaces configuration={data} />96</Route>97<Route exact path={`${path}/editors`}>98<ConfigurationDetailEditors configuration={data} />99</Route>100<Route exact path={`${path}/prebuilds`}>101<ConfigurationDetailPrebuilds configuration={data} />102</Route>103<Route exact path={`${path}/variables`}>104<ConfigurationVariableList configuration={data} />105</Route>106</Switch>107</div>108))109)}110</WidePageWithSubMenu>111</div>112);113};114115export default ConfigurationDetailPage;116117118