fix(web): 標示 AIOps 範例資料模式
This commit is contained in:
@@ -20,7 +20,7 @@ import {
|
||||
import { cn } from '@/lib/utils'
|
||||
import { TimelineFilter } from './TimelineFilter'
|
||||
import { TimelineStage } from './TimelineStage'
|
||||
import { MOCK_INCIDENTS } from './mock-data'
|
||||
import { SAMPLE_TIMELINE_INCIDENTS } from './sample-incidents'
|
||||
import type {
|
||||
TimelineIncident,
|
||||
TimelineFilterState,
|
||||
@@ -31,7 +31,8 @@ import type {
|
||||
// Constants
|
||||
// ============================================================
|
||||
|
||||
const IS_MOCK = process.env.NEXT_PUBLIC_AIOPS_TIMELINE_MOCK === 'true'
|
||||
// 保留既有環境變數相容;UI 以「範例資料」呈現,避免誤讀為正式證據。
|
||||
const USE_SAMPLE_TIMELINE = process.env.NEXT_PUBLIC_AIOPS_TIMELINE_MOCK === 'true'
|
||||
const API_BASE = process.env.NEXT_PUBLIC_API_URL ?? ''
|
||||
|
||||
const STAGE_ORDER: StageType[] = ['alert', 'diagnose', 'decide', 'execute', 'verify', 'learn']
|
||||
@@ -280,14 +281,14 @@ export default function AiopsTimelinePanel() {
|
||||
} = useQuery({
|
||||
queryKey: ['aiops-timeline', filter.incident_id, filter.time_range],
|
||||
queryFn: () => fetchTimeline(filter.incident_id),
|
||||
enabled: !IS_MOCK,
|
||||
enabled: !USE_SAMPLE_TIMELINE,
|
||||
staleTime: 30_000,
|
||||
refetchInterval: 60_000,
|
||||
})
|
||||
|
||||
// 客戶端篩選 — rawIncidents 內聯進 useMemo 避免 conditional 依賴警告
|
||||
const incidents = useMemo(() => {
|
||||
const rawIncidents: TimelineIncident[] = IS_MOCK ? MOCK_INCIDENTS : (apiData ?? [])
|
||||
const rawIncidents: TimelineIncident[] = USE_SAMPLE_TIMELINE ? SAMPLE_TIMELINE_INCIDENTS : (apiData ?? [])
|
||||
let list = rawIncidents
|
||||
|
||||
if (filter.incident_id.trim()) {
|
||||
@@ -325,9 +326,9 @@ export default function AiopsTimelinePanel() {
|
||||
<h1 className="font-heading text-2xl font-bold text-nothing-black flex items-center gap-2.5">
|
||||
<GitBranch className="w-6 h-6 text-claw-blue" aria-hidden="true" />
|
||||
{t('title')}
|
||||
{IS_MOCK && (
|
||||
{USE_SAMPLE_TIMELINE && (
|
||||
<span className="inline-flex items-center px-2 py-0.5 rounded text-[10px] font-body font-bold uppercase tracking-widest bg-status-warning/10 border border-status-warning/20 text-status-warning">
|
||||
{t('mockBadge')}
|
||||
{t('sampleBadge')}
|
||||
</span>
|
||||
)}
|
||||
</h1>
|
||||
@@ -337,7 +338,7 @@ export default function AiopsTimelinePanel() {
|
||||
</div>
|
||||
|
||||
{/* Refresh button (僅真實模式顯示) */}
|
||||
{!IS_MOCK && (
|
||||
{!USE_SAMPLE_TIMELINE && (
|
||||
<button
|
||||
onClick={() => refetch()}
|
||||
disabled={isLoading}
|
||||
@@ -362,7 +363,7 @@ export default function AiopsTimelinePanel() {
|
||||
/>
|
||||
|
||||
{/* Loading state (真實 API) */}
|
||||
{!IS_MOCK && isLoading && (
|
||||
{!USE_SAMPLE_TIMELINE && isLoading && (
|
||||
<div className="flex items-center justify-center py-20" role="status" aria-live="polite">
|
||||
<RefreshCw className="w-5 h-5 animate-spin text-nothing-gray-400" />
|
||||
<span className="ml-2 font-body text-sm text-nothing-gray-400">{t('loading')}</span>
|
||||
@@ -370,7 +371,7 @@ export default function AiopsTimelinePanel() {
|
||||
)}
|
||||
|
||||
{/* Error state */}
|
||||
{!IS_MOCK && error && !isLoading && (
|
||||
{!USE_SAMPLE_TIMELINE && error && !isLoading && (
|
||||
<div
|
||||
className="flex flex-col items-center justify-center py-20 gap-3"
|
||||
role="alert"
|
||||
|
||||
@@ -3,5 +3,5 @@ export { TimelineStage } from './TimelineStage'
|
||||
export { TimelineStageDetails } from './TimelineStageDetails'
|
||||
export { TimelineFilter } from './TimelineFilter'
|
||||
export { EvidenceViewer } from './EvidenceViewer'
|
||||
export { MOCK_INCIDENTS } from './mock-data'
|
||||
export { SAMPLE_TIMELINE_INCIDENTS } from './sample-incidents'
|
||||
export type * from './types'
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
// 2026-04-26 P2.5 by Claude — AIOps Timeline
|
||||
// ============================================================
|
||||
// Mock Data — 3 範例 incident,完整 6 階段 + metadata
|
||||
// Sample incidents — 3 筆範例 incident,完整 6 階段 + metadata
|
||||
// NEXT_PUBLIC_AIOPS_TIMELINE_MOCK=true 時使用
|
||||
// ============================================================
|
||||
|
||||
import type { TimelineIncident } from './types'
|
||||
|
||||
export const MOCK_INCIDENTS: TimelineIncident[] = [
|
||||
export const SAMPLE_TIMELINE_INCIDENTS: TimelineIncident[] = [
|
||||
{
|
||||
incident_id: 'INC-2026-0425-001',
|
||||
title: 'API Server CPU 100% — k8s-188',
|
||||
Reference in New Issue
Block a user