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