diff --git a/src/pages/applications/ReleaseManagementPage.tsx b/src/pages/applications/ReleaseManagementPage.tsx index cbbf3a6..ff70763 100644 --- a/src/pages/applications/ReleaseManagementPage.tsx +++ b/src/pages/applications/ReleaseManagementPage.tsx @@ -164,7 +164,7 @@ export function ReleaseManagementPage() { const [version, setVersion] = useState(''); const [releaseModalOpen, setReleaseModalOpen] = useState(false); const [selectedBuildIds, setSelectedBuildIds] = useState([]); - const [openLogReleaseId, setOpenLogReleaseId] = useState(''); + const [selectedReleaseLogId, setSelectedReleaseLogId] = useState(''); const [loading, setLoading] = useState(true); const [page, setPage] = useState(1); const [range, setRange] = useState('week'); @@ -262,6 +262,8 @@ export function ReleaseManagementPage() { } }; + const selectedReleaseLog = releases.find((release) => release.id === selectedReleaseLogId) ?? null; + return ( <> { const artifacts = releaseArtifacts(release); - const isLogOpen = openLogReleaseId === release.id; return (
@@ -319,9 +320,9 @@ export function ReleaseManagementPage() { variant="outline" className="size-8 px-0" disabled={!release.logs} - title={isLogOpen ? '로그 닫기' : '로그'} - aria-label={isLogOpen ? '로그 닫기' : '로그'} - onClick={() => setOpenLogReleaseId((prev) => prev === release.id ? '' : release.id)} + title="로그" + aria-label="로그" + onClick={() => setSelectedReleaseLogId(release.id)} > @@ -342,11 +343,6 @@ export function ReleaseManagementPage() {

-

)}
- {isLogOpen ? ( -
-                      {release.logs}
-                    
- ) : null}
); })} @@ -442,6 +438,23 @@ export function ReleaseManagementPage() { + setSelectedReleaseLogId('')} + className="log-modal-shell" + footer={} + > + {selectedReleaseLog?.logs ? ( +
+            {selectedReleaseLog.logs}
+          
+ ) : ( +
+ 로그가 없습니다. +
+ )} +
); diff --git a/src/pages/applications/SourceManagementPage.tsx b/src/pages/applications/SourceManagementPage.tsx index 71153c2..caf64c2 100644 --- a/src/pages/applications/SourceManagementPage.tsx +++ b/src/pages/applications/SourceManagementPage.tsx @@ -3,14 +3,12 @@ import { useEffect, useMemo, useRef, useState } from 'react'; import { useToast } from '../../components/toast'; import { Badge, Button, Card, CardHeader, Modal } from '../../components/ui'; import { PageTitle } from '../../layout/AppLayout'; -import type { AppRelease } from '../../types/application'; import type { ApiApp, ApiAppComponent } from '../../types/runtime'; import { LoadingModal, useMinimumLoading } from '../operations/operation-utils'; import { AppSelector, useApps } from './ApplicationControls'; import { getGiteaCommitDiff, listGiteaCommitsPage, - listReleases, listSources, type GiteaCommit } from './application-api'; @@ -68,11 +66,6 @@ function repositoryGitUrl(repository?: string | null) { return normalized ? `${giteaBaseUrl.replace(/\/$/, '')}/${normalized}.git` : '-'; } -function releaseTime(release: AppRelease) { - const value = new Date(release.createdAt).getTime(); - return Number.isNaN(value) ? 0 : value; -} - function commitAuthor(commit: GiteaCommit) { return commit.author?.login || commit.author?.username @@ -304,7 +297,6 @@ export function SourceManagementPage() { const { toast } = useToast(); const { apps, selectedAppId, loading: appsLoading, selectApp } = useApps(); const [sources, setSources] = useState([]); - const [releases, setReleases] = useState([]); const [sourcesLoading, setSourcesLoading] = useState(true); const [selectedSourceId, setSelectedSourceId] = useState(''); const [selectedBranch, setSelectedBranch] = useState('release'); @@ -328,33 +320,19 @@ export function SourceManagementPage() { const selectedSource = filteredSources.find((source) => source.id === selectedSourceId) ?? filteredSources[0] ?? null; const repository = splitRepository(selectedSource?.repository); const branch = selectedBranch || 'release'; + 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)))], [selectedSource?.branch] ); - const latestRelease = useMemo( - () => releases - .filter((release) => release.appId === selectedSource?.appId && release.status === 'SUCCEEDED') - .sort((a, b) => releaseTime(b) - releaseTime(a))[0], - [releases, selectedSource?.appId] - ); const totalCommitPages = totalCommits === null ? null : Math.max(1, Math.ceil(totalCommits / commitPageSize)); const selectedRepositoryGitUrl = repositoryGitUrl(selectedSource?.repository); const refreshSources = () => { setSourcesLoading(true); - Promise.all([ - listSources(), - listReleases().catch(() => []) - ]) - .then(([sourceItems, releaseItems]) => { - setSources(sourceItems); - setReleases(releaseItems); - }) - .catch(() => { - setSources([]); - setReleases([]); - }) + listSources() + .then((sourceItems) => setSources(sourceItems)) + .catch(() => setSources([])) .finally(() => setSourcesLoading(false)); }; @@ -464,6 +442,18 @@ export function SourceManagementPage() {
+
+

조회 브랜치

+ +

저장소

@@ -480,23 +470,13 @@ export function SourceManagementPage() {
-

버전

+

SHA1

-

{latestRelease?.version ?? '-'}

+

+ {latestBranchSha || '-'} +

-
-

조회 브랜치

- -