@tscircuit/fake-snippets 0.0.102 → 0.0.103
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundle.js +3 -3
- package/fake-snippets-api/routes/api/packages/update.ts +4 -2
- package/package.json +1 -1
- package/src/components/ViewPackagePage/components/sidebar-about-section.tsx +12 -1
- package/src/components/ViewPackagePage/components/sidebar-releases-section.tsx +17 -0
- package/src/components/dialogs/GitHubRepositorySelector.tsx +126 -66
- package/src/components/dialogs/edit-package-details-dialog.tsx +13 -3
- package/src/components/preview/BuildsList.tsx +19 -16
- package/src/components/preview/{ConnectedReposCards.tsx → ConnectedPackagesList.tsx} +64 -68
- package/src/components/preview/ConnectedRepoDashboard.tsx +37 -52
- package/src/components/preview/ConnectedRepoOverview.tsx +2 -2
- package/src/components/preview/index.tsx +42 -1
- package/src/pages/user-profile.tsx +14 -6
- package/src/pages/view-connected-repo.tsx +1 -7
- package/src/components/preview/ConnectedRepoSettings.tsx +0 -343
|
@@ -24,33 +24,28 @@ import {
|
|
|
24
24
|
import { useLocation } from "wouter"
|
|
25
25
|
import { ConnectedRepoOverview } from "./ConnectedRepoOverview"
|
|
26
26
|
import { BuildsList } from "./BuildsList"
|
|
27
|
-
import { ConnectedRepoSettings } from "./ConnectedRepoSettings"
|
|
28
27
|
import Header from "../Header"
|
|
29
28
|
import { formatTimeAgo } from "@/lib/utils/formatTimeAgo"
|
|
30
|
-
import {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
}
|
|
29
|
+
import {
|
|
30
|
+
getBuildStatus,
|
|
31
|
+
PackageBuild,
|
|
32
|
+
MOCK_DEPLOYMENTS,
|
|
33
|
+
getPackageFromBuild,
|
|
34
|
+
} from "."
|
|
35
|
+
import { PrefetchPageLink } from "../PrefetchPageLink"
|
|
37
36
|
|
|
38
37
|
export const ConnectedRepoDashboard = ({
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}
|
|
38
|
+
latestBuild,
|
|
39
|
+
}: {
|
|
40
|
+
latestBuild: PackageBuild
|
|
41
|
+
}) => {
|
|
43
42
|
const [activeTab, setActiveTab] = useState("overview")
|
|
44
|
-
const [currentBuild, setCurrentBuild] = useState<PackageBuild | undefined>(
|
|
45
|
-
selectedBuild || builds[0],
|
|
46
|
-
)
|
|
47
43
|
const [, setLocation] = useLocation()
|
|
48
|
-
|
|
44
|
+
const pkg = getPackageFromBuild(latestBuild)
|
|
49
45
|
const handleSelectBuild = (build: PackageBuild) => {
|
|
50
46
|
setLocation(`/build/${build.package_build_id}`)
|
|
47
|
+
setActiveTab("overview")
|
|
51
48
|
}
|
|
52
|
-
|
|
53
|
-
const latestBuild = builds[0]
|
|
54
49
|
const { status, label } = getBuildStatus(latestBuild)
|
|
55
50
|
|
|
56
51
|
return (
|
|
@@ -71,9 +66,12 @@ export const ConnectedRepoDashboard = ({
|
|
|
71
66
|
</div>
|
|
72
67
|
<div className="min-w-0 flex-1">
|
|
73
68
|
<div className="flex flex-col sm:flex-row sm:items-center gap-3">
|
|
74
|
-
<
|
|
75
|
-
{
|
|
76
|
-
|
|
69
|
+
<PrefetchPageLink
|
|
70
|
+
href={"/" + pkg.name}
|
|
71
|
+
className="text-2xl font-bold text-gray-900 truncate"
|
|
72
|
+
>
|
|
73
|
+
{pkg.unscoped_name}
|
|
74
|
+
</PrefetchPageLink>
|
|
77
75
|
<Badge
|
|
78
76
|
variant={
|
|
79
77
|
status === "success"
|
|
@@ -99,7 +97,15 @@ export const ConnectedRepoDashboard = ({
|
|
|
99
97
|
</Badge>
|
|
100
98
|
</div>
|
|
101
99
|
<div className="flex flex-col sm:flex-row sm:items-center gap-2 sm:gap-4 mt-2 text-sm text-gray-600">
|
|
102
|
-
<div
|
|
100
|
+
<div
|
|
101
|
+
className="flex cursor-pointer items-center gap-1"
|
|
102
|
+
onClick={() =>
|
|
103
|
+
window?.open(
|
|
104
|
+
`https://github.com/${pkg.github_repo_full_name}/tree/${latestBuild.branch_name || "main"}`,
|
|
105
|
+
"_blank",
|
|
106
|
+
)
|
|
107
|
+
}
|
|
108
|
+
>
|
|
103
109
|
<GitBranch className="w-4 h-4 flex-shrink-0" />
|
|
104
110
|
<span className="truncate">
|
|
105
111
|
{latestBuild.branch_name || "main"}
|
|
@@ -108,19 +114,9 @@ export const ConnectedRepoDashboard = ({
|
|
|
108
114
|
<div className="flex items-center gap-1">
|
|
109
115
|
<Clock className="w-4 h-4 flex-shrink-0" />
|
|
110
116
|
<span>
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
<div className="flex items-center gap-1">
|
|
115
|
-
<User className="w-4 h-4 flex-shrink-0" />
|
|
116
|
-
<span className="truncate">
|
|
117
|
-
{latestBuild.commit_author || "Unknown"}
|
|
118
|
-
</span>
|
|
119
|
-
</div>
|
|
120
|
-
<div className="flex items-center gap-1">
|
|
121
|
-
<Hash className="w-4 h-4 flex-shrink-0" />
|
|
122
|
-
<span className="font-mono text-xs truncate">
|
|
123
|
-
{latestBuild.package_build_id?.slice(-8) || "N/A"}
|
|
117
|
+
<time dateTime={latestBuild.created_at}>
|
|
118
|
+
Last deployed {formatTimeAgo(latestBuild.created_at)}
|
|
119
|
+
</time>
|
|
124
120
|
</span>
|
|
125
121
|
</div>
|
|
126
122
|
</div>
|
|
@@ -134,7 +130,7 @@ export const ConnectedRepoDashboard = ({
|
|
|
134
130
|
className="flex items-center gap-2 justify-center min-w-[120px] h-9"
|
|
135
131
|
onClick={() =>
|
|
136
132
|
window.open(
|
|
137
|
-
`https://github.com/${
|
|
133
|
+
`https://github.com/${pkg.github_repo_full_name}`,
|
|
138
134
|
"_blank",
|
|
139
135
|
)
|
|
140
136
|
}
|
|
@@ -181,7 +177,7 @@ export const ConnectedRepoDashboard = ({
|
|
|
181
177
|
<DropdownMenuContent align="end">
|
|
182
178
|
<DropdownMenuItem asChild>
|
|
183
179
|
<a
|
|
184
|
-
href={`https://github.com/${
|
|
180
|
+
href={`https://github.com/${pkg.github_repo_full_name}`}
|
|
185
181
|
target="_blank"
|
|
186
182
|
rel="noopener noreferrer"
|
|
187
183
|
>
|
|
@@ -197,7 +193,7 @@ export const ConnectedRepoDashboard = ({
|
|
|
197
193
|
onClick={() => {
|
|
198
194
|
if (navigator.share) {
|
|
199
195
|
navigator.share({
|
|
200
|
-
title:
|
|
196
|
+
title: pkg.unscoped_name,
|
|
201
197
|
url: window.location.href,
|
|
202
198
|
})
|
|
203
199
|
} else {
|
|
@@ -221,7 +217,7 @@ export const ConnectedRepoDashboard = ({
|
|
|
221
217
|
onValueChange={setActiveTab}
|
|
222
218
|
className="space-y-6"
|
|
223
219
|
>
|
|
224
|
-
<TabsList className="grid w-full grid-cols-
|
|
220
|
+
<TabsList className="grid w-full grid-cols-2 lg:w-auto lg:grid-cols-2">
|
|
225
221
|
<TabsTrigger value="overview" className="flex items-center gap-2">
|
|
226
222
|
<Activity className="w-4 h-4" />
|
|
227
223
|
Overview
|
|
@@ -230,25 +226,14 @@ export const ConnectedRepoDashboard = ({
|
|
|
230
226
|
<List className="w-4 h-4" />
|
|
231
227
|
Builds
|
|
232
228
|
</TabsTrigger>
|
|
233
|
-
<TabsTrigger value="settings" className="flex items-center gap-2">
|
|
234
|
-
<Settings className="w-4 h-4" />
|
|
235
|
-
Settings
|
|
236
|
-
</TabsTrigger>
|
|
237
229
|
</TabsList>
|
|
238
230
|
|
|
239
231
|
<TabsContent value="overview" className="space-y-6">
|
|
240
|
-
{
|
|
232
|
+
{latestBuild && <ConnectedRepoOverview build={latestBuild} />}
|
|
241
233
|
</TabsContent>
|
|
242
234
|
|
|
243
235
|
<TabsContent value="builds" className="space-y-6">
|
|
244
|
-
<BuildsList
|
|
245
|
-
</TabsContent>
|
|
246
|
-
|
|
247
|
-
<TabsContent value="settings" className="space-y-6">
|
|
248
|
-
<ConnectedRepoSettings
|
|
249
|
-
projectName={projectName}
|
|
250
|
-
onSave={(settings) => console.log("Settings saved:", settings)}
|
|
251
|
-
/>
|
|
236
|
+
<BuildsList pkg={pkg} onSelectBuild={handleSelectBuild} />
|
|
252
237
|
</TabsContent>
|
|
253
238
|
</Tabs>
|
|
254
239
|
</div>
|
|
@@ -198,7 +198,7 @@ export const ConnectedRepoOverview = ({
|
|
|
198
198
|
</div>
|
|
199
199
|
|
|
200
200
|
<div className="space-y-3">
|
|
201
|
-
<h2 className="text-lg font-semibold text-gray-900">
|
|
201
|
+
<h2 className="text-lg font-semibold text-gray-900">Logs</h2>
|
|
202
202
|
|
|
203
203
|
<Collapsible
|
|
204
204
|
open={openSections.transpilation}
|
|
@@ -387,7 +387,7 @@ export const ConnectedRepoOverview = ({
|
|
|
387
387
|
) : (
|
|
388
388
|
<Clock className="w-5 h-5 text-gray-400" />
|
|
389
389
|
)}
|
|
390
|
-
<span className="font-medium">
|
|
390
|
+
<span className="font-medium">Build</span>
|
|
391
391
|
</div>
|
|
392
392
|
<div className="flex items-center gap-2">
|
|
393
393
|
{getStepDuration(
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
export { ConnectedRepoOverview } from "./ConnectedRepoOverview"
|
|
2
2
|
export { BuildsList } from "./BuildsList"
|
|
3
|
-
export { ConnectedRepoSettings } from "./ConnectedRepoSettings"
|
|
4
3
|
export { ConnectedRepoDashboard } from "./ConnectedRepoDashboard"
|
|
5
4
|
|
|
6
5
|
export const getBuildStatus = (build: PackageBuild) => {
|
|
@@ -192,6 +191,7 @@ export const MOCK_DEPLOYMENTS: PackageBuild[] = [
|
|
|
192
191
|
},
|
|
193
192
|
]
|
|
194
193
|
|
|
194
|
+
import { Package, PackageRelease } from "fake-snippets-api/lib/db/schema"
|
|
195
195
|
import { Clock, CheckCircle, AlertCircle, Loader2 } from "lucide-react"
|
|
196
196
|
export const StatusIcon = ({ status }: { status: string }) => {
|
|
197
197
|
switch (status) {
|
|
@@ -205,3 +205,44 @@ export const StatusIcon = ({ status }: { status: string }) => {
|
|
|
205
205
|
return <Clock className="w-4 h-4 text-gray-500" />
|
|
206
206
|
}
|
|
207
207
|
}
|
|
208
|
+
|
|
209
|
+
export const getLatestBuildForPackage = (pkg: Package): PackageBuild => {
|
|
210
|
+
return MOCK_DEPLOYMENTS[0]
|
|
211
|
+
}
|
|
212
|
+
export const getLatestBuildFromPackageRelease = (
|
|
213
|
+
pkg: PackageRelease,
|
|
214
|
+
): PackageBuild => {
|
|
215
|
+
return MOCK_DEPLOYMENTS[0]
|
|
216
|
+
}
|
|
217
|
+
export const getPackageFromBuild = (build: PackageBuild): Package => {
|
|
218
|
+
return {
|
|
219
|
+
ai_description: "placeholder ai description",
|
|
220
|
+
ai_usage_instructions: "placeholder ai usage instructions",
|
|
221
|
+
created_at: "2025-08-06T14:37:05.802Z",
|
|
222
|
+
creator_account_id: "account-1234",
|
|
223
|
+
default_view: "files",
|
|
224
|
+
description: "placeholder ai description",
|
|
225
|
+
github_repo_full_name: "testuser/pcb-designs",
|
|
226
|
+
is_board: false,
|
|
227
|
+
is_footprint: false,
|
|
228
|
+
is_model: false,
|
|
229
|
+
is_package: false,
|
|
230
|
+
is_private: false,
|
|
231
|
+
is_public: true,
|
|
232
|
+
is_snippet: false,
|
|
233
|
+
is_source_from_github: false,
|
|
234
|
+
is_unlisted: false,
|
|
235
|
+
latest_package_release_fs_sha: "md5-425b47ef26be8f0863eca9e63e516dfa",
|
|
236
|
+
latest_package_release_id: "package_release_1754491026466",
|
|
237
|
+
latest_version: "0.0.1",
|
|
238
|
+
license: null,
|
|
239
|
+
name: "testuser/untitled-package-0",
|
|
240
|
+
owner_github_username: "testuser",
|
|
241
|
+
owner_org_id: "org-1234",
|
|
242
|
+
package_id: "package_1754491025802",
|
|
243
|
+
star_count: 0,
|
|
244
|
+
unscoped_name: "untitled-package-0",
|
|
245
|
+
updated_at: "2025-08-06T14:37:25.083Z",
|
|
246
|
+
website: "",
|
|
247
|
+
}
|
|
248
|
+
}
|
|
@@ -25,7 +25,7 @@ import {
|
|
|
25
25
|
} from "@/components/ui/select"
|
|
26
26
|
import { Box, Star } from "lucide-react"
|
|
27
27
|
import { PackageCardSkeleton } from "@/components/PackageCardSkeleton"
|
|
28
|
-
import {
|
|
28
|
+
import { ConnectedPackagesList } from "@/components/preview/ConnectedPackagesList"
|
|
29
29
|
|
|
30
30
|
export const UserProfilePage = () => {
|
|
31
31
|
const { username } = useParams()
|
|
@@ -101,7 +101,6 @@ export const UserProfilePage = () => {
|
|
|
101
101
|
if (accountError) {
|
|
102
102
|
return <NotFoundPage heading="User Not Found" />
|
|
103
103
|
}
|
|
104
|
-
|
|
105
104
|
const packagesToShow =
|
|
106
105
|
activeTab === "starred" ? starredPackages : userPackages
|
|
107
106
|
const isLoading =
|
|
@@ -179,9 +178,13 @@ export const UserProfilePage = () => {
|
|
|
179
178
|
<TabsList>
|
|
180
179
|
<TabsTrigger value="all">Packages</TabsTrigger>
|
|
181
180
|
<TabsTrigger value="starred">Starred Packages</TabsTrigger>
|
|
182
|
-
{isCurrentUserProfile &&
|
|
183
|
-
|
|
184
|
-
|
|
181
|
+
{isCurrentUserProfile &&
|
|
182
|
+
(
|
|
183
|
+
userPackages?.filter((x) => Boolean(x.github_repo_full_name)) ??
|
|
184
|
+
[]
|
|
185
|
+
).length > 0 && (
|
|
186
|
+
<TabsTrigger value="repos">Connected Repositories</TabsTrigger>
|
|
187
|
+
)}
|
|
185
188
|
</TabsList>
|
|
186
189
|
</Tabs>
|
|
187
190
|
{activeTab !== "repos" && (
|
|
@@ -208,7 +211,12 @@ export const UserProfilePage = () => {
|
|
|
208
211
|
</div>
|
|
209
212
|
)}
|
|
210
213
|
{activeTab === "repos" ? (
|
|
211
|
-
<
|
|
214
|
+
<ConnectedPackagesList
|
|
215
|
+
packages={
|
|
216
|
+
userPackages?.filter((x) => Boolean(x.github_repo_full_name)) ??
|
|
217
|
+
[]
|
|
218
|
+
}
|
|
219
|
+
/>
|
|
212
220
|
) : isLoading ? (
|
|
213
221
|
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4">
|
|
214
222
|
{[...Array(6)].map((_, i) => (
|
|
@@ -14,11 +14,5 @@ export default function ViewConnectedRepoOverview() {
|
|
|
14
14
|
return <NotFoundPage heading="Build Not Found" />
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
return
|
|
18
|
-
<ConnectedRepoDashboard
|
|
19
|
-
projectName="tscircuit-project"
|
|
20
|
-
builds={MOCK_DEPLOYMENTS}
|
|
21
|
-
selectedBuild={selectedBuild}
|
|
22
|
-
/>
|
|
23
|
-
)
|
|
17
|
+
return <ConnectedRepoDashboard latestBuild={selectedBuild} />
|
|
24
18
|
}
|
|
@@ -1,343 +0,0 @@
|
|
|
1
|
-
import { useEffect, useState } from "react"
|
|
2
|
-
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"
|
|
3
|
-
import { Button } from "@/components/ui/button"
|
|
4
|
-
import { Input } from "@/components/ui/input"
|
|
5
|
-
import { Label } from "@/components/ui/label"
|
|
6
|
-
import { Switch } from "@/components/ui/switch"
|
|
7
|
-
import { Textarea } from "@/components/ui/textarea"
|
|
8
|
-
import {
|
|
9
|
-
AlertDialog,
|
|
10
|
-
AlertDialogAction,
|
|
11
|
-
AlertDialogCancel,
|
|
12
|
-
AlertDialogContent,
|
|
13
|
-
AlertDialogDescription,
|
|
14
|
-
AlertDialogFooter,
|
|
15
|
-
AlertDialogHeader,
|
|
16
|
-
AlertDialogTitle,
|
|
17
|
-
AlertDialogTrigger,
|
|
18
|
-
} from "@/components/ui/alert-dialog"
|
|
19
|
-
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"
|
|
20
|
-
import { Settings, Github, Shield, Trash2, Save } from "lucide-react"
|
|
21
|
-
|
|
22
|
-
interface ConnectedRepoSettingsProps {
|
|
23
|
-
projectName?: string
|
|
24
|
-
onSave?: (settings: any) => void
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export const ConnectedRepoSettings = ({
|
|
28
|
-
projectName = "tscircuit-project",
|
|
29
|
-
onSave,
|
|
30
|
-
}: ConnectedRepoSettingsProps) => {
|
|
31
|
-
// MOCK
|
|
32
|
-
const initialSettings = {
|
|
33
|
-
general: {
|
|
34
|
-
projectName: projectName,
|
|
35
|
-
description: "A TypeScript circuit design project",
|
|
36
|
-
},
|
|
37
|
-
git: {
|
|
38
|
-
repository: "github.com/user/tscircuit-project",
|
|
39
|
-
productionBranch: "main",
|
|
40
|
-
autoBuildEnabled: true,
|
|
41
|
-
prComment: true,
|
|
42
|
-
buildPrs: true,
|
|
43
|
-
},
|
|
44
|
-
security: {
|
|
45
|
-
privateBuilds: false,
|
|
46
|
-
requireApprovalForPrs: true,
|
|
47
|
-
},
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
const [settings, setSettings] = useState(initialSettings)
|
|
51
|
-
const [hasChanges, setHasChanges] = useState(false)
|
|
52
|
-
|
|
53
|
-
// Track changes
|
|
54
|
-
useEffect(() => {
|
|
55
|
-
const isChanged =
|
|
56
|
-
JSON.stringify(settings) !== JSON.stringify(initialSettings)
|
|
57
|
-
setHasChanges(isChanged)
|
|
58
|
-
}, [settings])
|
|
59
|
-
|
|
60
|
-
const handleSave = () => {
|
|
61
|
-
onSave?.(settings)
|
|
62
|
-
setHasChanges(false)
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
return (
|
|
66
|
-
<div className="space-y-4 sm:space-y-6 p-4 sm:p-6">
|
|
67
|
-
<div className="flex flex-col sm:flex-row sm:items-center justify-between gap-4">
|
|
68
|
-
<div>
|
|
69
|
-
<h2 className="text-xl sm:text-2xl font-bold text-gray-900">
|
|
70
|
-
Settings
|
|
71
|
-
</h2>
|
|
72
|
-
<p className="text-sm sm:text-base text-gray-600">
|
|
73
|
-
Configure your build settings
|
|
74
|
-
</p>
|
|
75
|
-
</div>
|
|
76
|
-
<div className="flex justify-end">
|
|
77
|
-
<Button
|
|
78
|
-
onClick={handleSave}
|
|
79
|
-
disabled={!hasChanges}
|
|
80
|
-
className="flex items-center gap-2 w-full sm:w-auto"
|
|
81
|
-
>
|
|
82
|
-
<Save className="w-4 h-4" />
|
|
83
|
-
Save Changes
|
|
84
|
-
</Button>
|
|
85
|
-
</div>
|
|
86
|
-
</div>
|
|
87
|
-
|
|
88
|
-
<Tabs defaultValue="general" className="space-y-4 sm:space-y-6">
|
|
89
|
-
<TabsList className="grid w-full grid-cols-3">
|
|
90
|
-
<TabsTrigger
|
|
91
|
-
value="general"
|
|
92
|
-
className="flex items-center gap-1 sm:gap-2 text-xs sm:text-sm"
|
|
93
|
-
>
|
|
94
|
-
<Settings className="w-3 h-3 sm:w-4 sm:h-4" />
|
|
95
|
-
<span className="hidden sm:inline">General</span>
|
|
96
|
-
<span className="sm:hidden">Gen</span>
|
|
97
|
-
</TabsTrigger>
|
|
98
|
-
<TabsTrigger
|
|
99
|
-
value="git"
|
|
100
|
-
className="flex items-center gap-1 sm:gap-2 text-xs sm:text-sm"
|
|
101
|
-
>
|
|
102
|
-
<Github className="w-3 h-3 sm:w-4 sm:h-4" />
|
|
103
|
-
Git
|
|
104
|
-
</TabsTrigger>
|
|
105
|
-
<TabsTrigger
|
|
106
|
-
value="security"
|
|
107
|
-
className="flex items-center gap-1 sm:gap-2 text-xs sm:text-sm"
|
|
108
|
-
>
|
|
109
|
-
<Shield className="w-3 h-3 sm:w-4 sm:h-4" />
|
|
110
|
-
<span className="hidden sm:inline">Security</span>
|
|
111
|
-
<span className="sm:hidden">Sec</span>
|
|
112
|
-
</TabsTrigger>
|
|
113
|
-
</TabsList>
|
|
114
|
-
|
|
115
|
-
<TabsContent value="general" className="space-y-4 sm:space-y-6">
|
|
116
|
-
<Card>
|
|
117
|
-
<CardHeader>
|
|
118
|
-
<CardTitle className="text-lg sm:text-xl">
|
|
119
|
-
General Settings
|
|
120
|
-
</CardTitle>
|
|
121
|
-
</CardHeader>
|
|
122
|
-
<CardContent className="space-y-4 p-4 sm:p-6">
|
|
123
|
-
<div className="space-y-2">
|
|
124
|
-
<Label htmlFor="projectName">Project Name</Label>
|
|
125
|
-
<Input
|
|
126
|
-
id="projectName"
|
|
127
|
-
value={settings.general.projectName}
|
|
128
|
-
onChange={(e) =>
|
|
129
|
-
setSettings((prev) => ({
|
|
130
|
-
...prev,
|
|
131
|
-
general: { ...prev.general, projectName: e.target.value },
|
|
132
|
-
}))
|
|
133
|
-
}
|
|
134
|
-
/>
|
|
135
|
-
</div>
|
|
136
|
-
|
|
137
|
-
<div className="space-y-2">
|
|
138
|
-
<Label htmlFor="description">Description</Label>
|
|
139
|
-
<Textarea
|
|
140
|
-
id="description"
|
|
141
|
-
value={settings.general.description}
|
|
142
|
-
onChange={(e) =>
|
|
143
|
-
setSettings((prev) => ({
|
|
144
|
-
...prev,
|
|
145
|
-
general: { ...prev.general, description: e.target.value },
|
|
146
|
-
}))
|
|
147
|
-
}
|
|
148
|
-
rows={3}
|
|
149
|
-
/>
|
|
150
|
-
</div>
|
|
151
|
-
</CardContent>
|
|
152
|
-
</Card>
|
|
153
|
-
</TabsContent>
|
|
154
|
-
|
|
155
|
-
<TabsContent value="git" className="space-y-4 sm:space-y-6">
|
|
156
|
-
<Card>
|
|
157
|
-
<CardHeader>
|
|
158
|
-
<CardTitle className="text-lg sm:text-xl">
|
|
159
|
-
Git Integration
|
|
160
|
-
</CardTitle>
|
|
161
|
-
</CardHeader>
|
|
162
|
-
<CardContent className="space-y-4 p-4 sm:p-6">
|
|
163
|
-
<div className="space-y-2">
|
|
164
|
-
<Label htmlFor="repository">Repository</Label>
|
|
165
|
-
<Input
|
|
166
|
-
id="repository"
|
|
167
|
-
value={settings.git.repository}
|
|
168
|
-
onChange={(e) =>
|
|
169
|
-
setSettings((prev) => ({
|
|
170
|
-
...prev,
|
|
171
|
-
git: { ...prev.git, repository: e.target.value },
|
|
172
|
-
}))
|
|
173
|
-
}
|
|
174
|
-
placeholder="github.com/user/repo"
|
|
175
|
-
/>
|
|
176
|
-
</div>
|
|
177
|
-
|
|
178
|
-
<div className="space-y-2">
|
|
179
|
-
<Label htmlFor="productionBranch">Production Branch</Label>
|
|
180
|
-
<Input
|
|
181
|
-
id="productionBranch"
|
|
182
|
-
value={settings.git.productionBranch}
|
|
183
|
-
onChange={(e) =>
|
|
184
|
-
setSettings((prev) => ({
|
|
185
|
-
...prev,
|
|
186
|
-
git: { ...prev.git, productionBranch: e.target.value },
|
|
187
|
-
}))
|
|
188
|
-
}
|
|
189
|
-
/>
|
|
190
|
-
</div>
|
|
191
|
-
|
|
192
|
-
<div className="space-y-3">
|
|
193
|
-
<div className="flex items-center space-x-2">
|
|
194
|
-
<Switch
|
|
195
|
-
id="autoBuildEnabled"
|
|
196
|
-
checked={settings.git.autoBuildEnabled}
|
|
197
|
-
onCheckedChange={(checked) =>
|
|
198
|
-
setSettings((prev) => ({
|
|
199
|
-
...prev,
|
|
200
|
-
git: { ...prev.git, autoBuildEnabled: checked },
|
|
201
|
-
}))
|
|
202
|
-
}
|
|
203
|
-
/>
|
|
204
|
-
<Label htmlFor="autoBuildEnabled">
|
|
205
|
-
Enable automatic builds
|
|
206
|
-
</Label>
|
|
207
|
-
</div>
|
|
208
|
-
|
|
209
|
-
<div className="flex items-center space-x-2">
|
|
210
|
-
<Switch
|
|
211
|
-
id="prComment"
|
|
212
|
-
checked={settings.git.prComment}
|
|
213
|
-
onCheckedChange={(checked) =>
|
|
214
|
-
setSettings((prev) => ({
|
|
215
|
-
...prev,
|
|
216
|
-
git: { ...prev.git, prComment: checked },
|
|
217
|
-
}))
|
|
218
|
-
}
|
|
219
|
-
/>
|
|
220
|
-
<Label htmlFor="prComment">
|
|
221
|
-
Comment on pull requests with build preview
|
|
222
|
-
</Label>
|
|
223
|
-
</div>
|
|
224
|
-
|
|
225
|
-
<div className="flex items-center space-x-2">
|
|
226
|
-
<Switch
|
|
227
|
-
id="buildPrs"
|
|
228
|
-
checked={settings.git.buildPrs}
|
|
229
|
-
onCheckedChange={(checked) =>
|
|
230
|
-
setSettings((prev) => ({
|
|
231
|
-
...prev,
|
|
232
|
-
git: { ...prev.git, buildPrs: checked },
|
|
233
|
-
}))
|
|
234
|
-
}
|
|
235
|
-
/>
|
|
236
|
-
<Label htmlFor="buildPrs">
|
|
237
|
-
Build pull requests automatically
|
|
238
|
-
</Label>
|
|
239
|
-
</div>
|
|
240
|
-
</div>
|
|
241
|
-
</CardContent>
|
|
242
|
-
</Card>
|
|
243
|
-
</TabsContent>
|
|
244
|
-
|
|
245
|
-
<TabsContent value="security" className="space-y-4 sm:space-y-6">
|
|
246
|
-
<Card>
|
|
247
|
-
<CardHeader>
|
|
248
|
-
<CardTitle className="text-lg sm:text-xl">
|
|
249
|
-
Security Settings
|
|
250
|
-
</CardTitle>
|
|
251
|
-
</CardHeader>
|
|
252
|
-
<CardContent className="space-y-4 p-4 sm:p-6">
|
|
253
|
-
<div className="space-y-3">
|
|
254
|
-
<div className="flex items-center space-x-2">
|
|
255
|
-
<Switch
|
|
256
|
-
id="privateBuilds"
|
|
257
|
-
checked={settings.security.privateBuilds}
|
|
258
|
-
onCheckedChange={(checked) =>
|
|
259
|
-
setSettings((prev) => ({
|
|
260
|
-
...prev,
|
|
261
|
-
security: {
|
|
262
|
-
...prev.security,
|
|
263
|
-
privateBuilds: checked,
|
|
264
|
-
},
|
|
265
|
-
}))
|
|
266
|
-
}
|
|
267
|
-
/>
|
|
268
|
-
<Label htmlFor="privateBuilds">Make builds private</Label>
|
|
269
|
-
</div>
|
|
270
|
-
|
|
271
|
-
<div className="flex items-center space-x-2">
|
|
272
|
-
<Switch
|
|
273
|
-
id="requireApprovalForPrs"
|
|
274
|
-
checked={settings.security.requireApprovalForPrs}
|
|
275
|
-
onCheckedChange={(checked) =>
|
|
276
|
-
setSettings((prev) => ({
|
|
277
|
-
...prev,
|
|
278
|
-
security: {
|
|
279
|
-
...prev.security,
|
|
280
|
-
requireApprovalForPrs: checked,
|
|
281
|
-
},
|
|
282
|
-
}))
|
|
283
|
-
}
|
|
284
|
-
/>
|
|
285
|
-
<Label htmlFor="requireApprovalForPrs">
|
|
286
|
-
Require approval for PR builds
|
|
287
|
-
</Label>
|
|
288
|
-
</div>
|
|
289
|
-
</div>
|
|
290
|
-
</CardContent>
|
|
291
|
-
</Card>
|
|
292
|
-
|
|
293
|
-
<Card className="border-red-200">
|
|
294
|
-
<CardHeader>
|
|
295
|
-
<CardTitle className="text-red-600 text-lg sm:text-xl">
|
|
296
|
-
Danger Zone
|
|
297
|
-
</CardTitle>
|
|
298
|
-
</CardHeader>
|
|
299
|
-
<CardContent className="p-4 sm:p-6">
|
|
300
|
-
<div className="flex flex-col sm:flex-row sm:items-center justify-between gap-4 p-4 border border-red-200 rounded-lg">
|
|
301
|
-
<div>
|
|
302
|
-
<h4 className="font-medium text-red-600">Delete Project</h4>
|
|
303
|
-
<p className="text-sm text-gray-600">
|
|
304
|
-
Permanently delete this project and all its builds
|
|
305
|
-
</p>
|
|
306
|
-
</div>
|
|
307
|
-
<AlertDialog>
|
|
308
|
-
<AlertDialogTrigger asChild>
|
|
309
|
-
<Button
|
|
310
|
-
variant="destructive"
|
|
311
|
-
className="flex items-center gap-2 w-full sm:w-auto"
|
|
312
|
-
>
|
|
313
|
-
<Trash2 className="w-4 h-4" />
|
|
314
|
-
Delete Project
|
|
315
|
-
</Button>
|
|
316
|
-
</AlertDialogTrigger>
|
|
317
|
-
<AlertDialogContent>
|
|
318
|
-
<AlertDialogHeader>
|
|
319
|
-
<AlertDialogTitle>
|
|
320
|
-
Are you absolutely sure?
|
|
321
|
-
</AlertDialogTitle>
|
|
322
|
-
<AlertDialogDescription>
|
|
323
|
-
This action cannot be undone. This will permanently
|
|
324
|
-
delete the project and remove all build data from our
|
|
325
|
-
servers.
|
|
326
|
-
</AlertDialogDescription>
|
|
327
|
-
</AlertDialogHeader>
|
|
328
|
-
<AlertDialogFooter>
|
|
329
|
-
<AlertDialogCancel>Cancel</AlertDialogCancel>
|
|
330
|
-
<AlertDialogAction className="bg-red-600 hover:bg-red-700">
|
|
331
|
-
Delete Project
|
|
332
|
-
</AlertDialogAction>
|
|
333
|
-
</AlertDialogFooter>
|
|
334
|
-
</AlertDialogContent>
|
|
335
|
-
</AlertDialog>
|
|
336
|
-
</div>
|
|
337
|
-
</CardContent>
|
|
338
|
-
</Card>
|
|
339
|
-
</TabsContent>
|
|
340
|
-
</Tabs>
|
|
341
|
-
</div>
|
|
342
|
-
)
|
|
343
|
-
}
|