From 71eeac278f35ae07d1cfcd0c32c716fc592c51c5 Mon Sep 17 00:00:00 2001 From: chyoo Date: Wed, 8 Jul 2026 11:04:38 +0900 Subject: [PATCH] update.. --- .../applications/BuildManagementPage.tsx | 51 ++++++++++++++++++- .../applications/ReleaseManagementPage.tsx | 23 +++++++++ .../applications/RepositoryManagementPage.tsx | 4 +- .../applications/SourceManagementPage.tsx | 8 +-- src/pages/launcher/LauncherSourcePage.tsx | 4 +- 5 files changed, 81 insertions(+), 9 deletions(-) diff --git a/src/pages/applications/BuildManagementPage.tsx b/src/pages/applications/BuildManagementPage.tsx index abd8235..41c43ef 100644 --- a/src/pages/applications/BuildManagementPage.tsx +++ b/src/pages/applications/BuildManagementPage.tsx @@ -92,6 +92,7 @@ export function BuildManagementPage() { const [branch, setBranch] = useState('develop'); const [commitSha, setCommitSha] = useState(''); const [selectedJob, setSelectedJob] = useState(null); + const [confirmOpen, setConfirmOpen] = useState(false); const [loading, setLoading] = useState(false); const [page, setPage] = useState(1); const [range, setRange] = useState('week'); @@ -199,6 +200,7 @@ export function BuildManagementPage() { const startBuild = async () => { if (!selectedComponent) return; try { + setConfirmOpen(false); const result = await createBuildJob({ componentId: selectedComponent.id, branch, commitSha }); toast({ type: 'success', message: '빌드 작업이 생성되었습니다.' }); setSelectedJob(result.buildJob); @@ -300,7 +302,7 @@ export function BuildManagementPage() { 예상 결과물 {predicted} - @@ -441,6 +443,53 @@ export function BuildManagementPage() { )} + { + if (!loading) setConfirmOpen(false); + }} + footer={ + <> + + + + } + > +
+
+

{selectedComponent?.name ?? '-'} 구성요소 빌드를 실행합니다.

+

+ 실행 후 빌드 작업이 생성되고, 작업 목록에서 진행 상태와 로그를 확인할 수 있습니다. +

+
+
+
+ 앱 + {selectedApp?.name ?? '-'} +
+
+ 저장소 + {selectedComponent?.repository || '-'} +
+
+ 브랜치 + {branch} +
+
+ 커밋 + {commitSha.trim() || '브랜치 최신'} +
+
+ 빌드 대상 + {selectedTarget} +
+
+
+
); diff --git a/src/pages/applications/ReleaseManagementPage.tsx b/src/pages/applications/ReleaseManagementPage.tsx index ff70763..c27faa3 100644 --- a/src/pages/applications/ReleaseManagementPage.tsx +++ b/src/pages/applications/ReleaseManagementPage.tsx @@ -171,6 +171,7 @@ export function ReleaseManagementPage() { const [totalReleases, setTotalReleases] = useState(0); const [usedBuildIdValues, setUsedBuildIdValues] = useState([]); const [usedReleaseValueValues, setUsedReleaseValueValues] = useState([]); + const hasActiveRelease = releases.some((release) => release.status === 'PENDING' || release.status === 'RUNNING'); const loadingVisible = useMinimumLoading(loading); const usedValues = useMemo(() => new Set(usedReleaseValueValues), [usedReleaseValueValues]); const usedBuildIds = useMemo(() => new Set(usedBuildIdValues), [usedBuildIdValues]); @@ -226,6 +227,28 @@ export function ReleaseManagementPage() { void refresh(); }, [selectedAppId, page, range, apps]); + useEffect(() => { + if (!hasActiveRelease) return; + const timer = window.setInterval(() => { + listReleasesPage({ + appKey: apps.find((app) => app.id === selectedAppId)?.key, + page, + limit: releasePageSize, + since: releaseRangeSince(range) + }) + .then((nextReleases) => { + setReleases(nextReleases.releases); + setTotalReleases(nextReleases.total); + setUsedBuildIdValues(nextReleases.usedBuildIds ?? []); + setUsedReleaseValueValues(nextReleases.usedValues ?? []); + }) + .catch((error: Error) => { + toast({ type: 'error', message: `릴리즈 목록 갱신 실패: ${error.message}` }); + }); + }, 2000); + return () => window.clearInterval(timer); + }, [hasActiveRelease, apps, selectedAppId, page, range, toast]); + useEffect(() => { setPage(1); }, [selectedAppId, range]); diff --git a/src/pages/applications/RepositoryManagementPage.tsx b/src/pages/applications/RepositoryManagementPage.tsx index e16d6f3..fb14a16 100644 --- a/src/pages/applications/RepositoryManagementPage.tsx +++ b/src/pages/applications/RepositoryManagementPage.tsx @@ -97,7 +97,7 @@ export function RepositoryManagementPage() { const [isCreateRepoOpen, setIsCreateRepoOpen] = useState(false); const [repoName, setRepoName] = useState(''); const [repoDescription, setRepoDescription] = useState(''); - const [repoPrivate, setRepoPrivate] = useState(true); + const [repoPrivate, setRepoPrivate] = useState(false); const [createDevelopBranch, setCreateDevelopBranch] = useState(true); const [createReleaseBranch, setCreateReleaseBranch] = useState(true); const [repoCreateStatus, setRepoCreateStatus] = useState<'idle' | 'saving' | 'error'>('idle'); @@ -165,7 +165,7 @@ export function RepositoryManagementPage() { .then(() => { setRepoName(''); setRepoDescription(''); - setRepoPrivate(true); + setRepoPrivate(false); setCreateDevelopBranch(true); setCreateReleaseBranch(true); setRepoCreateStatus('idle'); diff --git a/src/pages/applications/SourceManagementPage.tsx b/src/pages/applications/SourceManagementPage.tsx index caf64c2..3538751 100644 --- a/src/pages/applications/SourceManagementPage.tsx +++ b/src/pages/applications/SourceManagementPage.tsx @@ -299,7 +299,7 @@ export function SourceManagementPage() { const [sources, setSources] = useState([]); const [sourcesLoading, setSourcesLoading] = useState(true); const [selectedSourceId, setSelectedSourceId] = useState(''); - const [selectedBranch, setSelectedBranch] = useState('release'); + const [selectedBranch, setSelectedBranch] = useState('develop'); const [commitRange, setCommitRange] = useState('week'); const [commitPage, setCommitPage] = useState(1); const [commits, setCommits] = useState([]); @@ -319,10 +319,10 @@ export function SourceManagementPage() { ); const selectedSource = filteredSources.find((source) => source.id === selectedSourceId) ?? filteredSources[0] ?? null; const repository = splitRepository(selectedSource?.repository); - const branch = selectedBranch || 'release'; + const branch = selectedBranch || 'develop'; const latestBranchSha = commits.length > 0 ? commits[0]?.sha ?? '' : ''; const branchOptions = useMemo( - () => [...new Set(['release', 'develop', 'main', selectedSource?.branch].filter((item): item is string => Boolean(item)))], + () => [...new Set(['develop', 'release', 'main', selectedSource?.branch].filter((item): item is string => Boolean(item)))], [selectedSource?.branch] ); const totalCommitPages = totalCommits === null ? null : Math.max(1, Math.ceil(totalCommits / commitPageSize)); @@ -469,7 +469,7 @@ export function SourceManagementPage() { -
+

SHA1

diff --git a/src/pages/launcher/LauncherSourcePage.tsx b/src/pages/launcher/LauncherSourcePage.tsx index 98007f0..4a45479 100644 --- a/src/pages/launcher/LauncherSourcePage.tsx +++ b/src/pages/launcher/LauncherSourcePage.tsx @@ -378,7 +378,7 @@ export function LauncherSourcePage() { 'launcher-backend': emptyForm() }); const [commits, setCommits] = useState([]); - const [sourceBranch, setSourceBranch] = useState('release'); + const [sourceBranch, setSourceBranch] = useState('develop'); const [commitRange, setCommitRange] = useState('week'); const [commitPage, setCommitPage] = useState(1); const [hasNextCommitPage, setHasNextCommitPage] = useState(false); @@ -392,7 +392,7 @@ export function LauncherSourcePage() { const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const loadingVisible = useMinimumLoading(loading); - const branchOptions = ['release', 'develop', 'main']; + const branchOptions = ['develop', 'release', 'main']; const activeVersion = useMemo(() => versions.find((version) => version.isActive) ?? versions[0], [versions]); const activeForm = forms[activeTarget];