From 30a16e8076a3dd3c27aaf65db2f5c6e44397282c Mon Sep 17 00:00:00 2001 From: chyoo Date: Thu, 9 Jul 2026 15:05:24 +0900 Subject: [PATCH] refine monitoring skeletons and navigation icons --- src/App.tsx | 4 +- src/data/mock.ts | 7 +-- src/pages/system/MonitoringPage.tsx | 75 ++++++++++++++++++++++++++--- 3 files changed, 74 insertions(+), 12 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 316689f..90a67bf 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -963,8 +963,8 @@ function SkeletonBlock({ className }: { className?: string }) { return (
diff --git a/src/data/mock.ts b/src/data/mock.ts index ae5a705..ec3ad27 100644 --- a/src/data/mock.ts +++ b/src/data/mock.ts @@ -1,4 +1,5 @@ import { + MonitorPlay, Bell, Boxes, ChartNoAxesColumnIncreasing, @@ -7,8 +8,8 @@ import { KeyRound, LayoutDashboard, Megaphone, + MonitorUp, Network, - Rocket, ServerCog, ShieldCheck, Users @@ -31,7 +32,7 @@ export const navGroups = [ }, { label: '런처', - icon: Rocket, + icon: MonitorPlay, children: [ { label: '소스 관리', view: 'launcherSources' }, { label: '빌드 관리', view: 'launcherBuilds' }, @@ -67,7 +68,7 @@ export const navGroups = [ }, { label: '에이전트', - icon: ShieldCheck, + icon: MonitorUp, children: [ { label: '장비 등록' }, { label: '장비 제어' }, diff --git a/src/pages/system/MonitoringPage.tsx b/src/pages/system/MonitoringPage.tsx index 73187e5..a7a6b3c 100644 --- a/src/pages/system/MonitoringPage.tsx +++ b/src/pages/system/MonitoringPage.tsx @@ -100,6 +100,7 @@ export function MonitoringPage() { const selectedApp = apps.find((app) => app.id === selectedAppId) ?? apps[0]; const selectedRange = eventRanges.find((range) => range.value === eventRange) ?? eventRanges[1]; const visibleResources = useMemo(() => resources.filter((resource) => !isCompletedMigration(resource)), [resources]); + const showInitialSkeleton = loading && resources.length === 0 && events.length === 0; const filteredEvents = useMemo(() => { const threshold = Date.now() - selectedRange.milliseconds; return events.filter((event) => eventTime(event) >= threshold); @@ -258,10 +259,16 @@ export function MonitoringPage() {
- - resource.kind === 'Pod').length)} hint="현재 기준" tone="blue" /> - 0 ? 'amber' : 'green'} /> - 0 ? 'amber' : 'green'} /> + {showInitialSkeleton ? ( + Array.from({ length: 4 }).map((_, index) => ) + ) : ( + <> + + resource.kind === 'Pod').length)} hint="현재 기준" tone="blue" /> + 0 ? 'amber' : 'green'} /> + 0 ? 'amber' : 'green'} /> + + )}
@@ -313,7 +320,9 @@ export function MonitoringPage() {
- {visibleResources.map((resource) => ( + {showInitialSkeleton ? ( + + ) : visibleResources.map((resource) => (
@@ -331,7 +340,9 @@ export function MonitoringPage() {
- {filteredEvents.slice(0, 12).map((event, index) => ( + {showInitialSkeleton ? ( + + ) : filteredEvents.slice(0, 12).map((event, index) => (
{event.type ?? '-'} @@ -340,7 +351,7 @@ export function MonitoringPage() {

{event.message ?? '-'}

))} - {!filteredEvents.length ?
선택 기간에 표시할 이벤트가 없습니다.
: null} + {!showInitialSkeleton && !filteredEvents.length ?
선택 기간에 표시할 이벤트가 없습니다.
: null}
@@ -350,6 +361,56 @@ export function MonitoringPage() { ); } +function SkeletonBlock({ className }: { className: string }) { + return ( +
+ ); +} + +function MetricCardSkeleton() { + return ( + +
+ + +
+
+ + +
+ +
+ ); +} + +function ListSkeleton({ rows }: { rows: number }) { + return ( + <> + {Array.from({ length: rows }).map((_, index) => ( +
+
+
+
+ + +
+ +
+ +
+
+ ))} + + ); +} + function MetricCard({ icon: Icon, label, value, hint, tone }: { icon: typeof Server; label: string; value: string; hint: string; tone: 'green' | 'amber' | 'red' | 'blue' | 'neutral' }) { return (