From 95798f6b4dc48bb5653d5df9183db07fcd2db61a Mon Sep 17 00:00:00 2001 From: Supra4E8C Date: Mon, 23 Feb 2026 20:18:25 +0800 Subject: [PATCH] Remove health status pill from auth file cards --- .../authFiles/components/AuthFileCard.tsx | 85 +------------------ src/pages/AuthFilesPage.module.scss | 53 ------------ src/pages/AuthFilesPage.tsx | 3 - 3 files changed, 2 insertions(+), 139 deletions(-) diff --git a/src/features/authFiles/components/AuthFileCard.tsx b/src/features/authFiles/components/AuthFileCard.tsx index 16f498d..50f9251 100644 --- a/src/features/authFiles/components/AuthFileCard.tsx +++ b/src/features/authFiles/components/AuthFileCard.tsx @@ -9,7 +9,6 @@ import { resolveAuthProvider } from '@/utils/quota'; import { calculateStatusBarData, normalizeAuthIndex, type KeyStats } from '@/utils/usage'; import { formatFileSize } from '@/utils/format'; import { - AUTH_FILE_REFRESH_WARNING_MS, QUOTA_PROVIDER_TYPES, formatModified, getTypeColor, @@ -23,20 +22,7 @@ import type { AuthFileStatusBarData } from '@/features/authFiles/hooks/useAuthFi import { AuthFileQuotaSection } from '@/features/authFiles/components/AuthFileQuotaSection'; import styles from '@/pages/AuthFilesPage.module.scss'; -type AuthFileHealthStatus = 'healthy' | 'warning' | 'disabled' | 'unknown'; - const HEALTHY_STATUS_MESSAGES = new Set(['ok', 'healthy', 'ready', 'success', 'available']); -const GOOD_STATUS_VALUES = new Set(['', 'ok', 'ready', 'healthy', 'available']); - -const parseDateFromUnknown = (value: unknown): Date | null => { - if (value === null || value === undefined || value === '') return null; - const asNumber = Number(value); - const date = - Number.isFinite(asNumber) && !Number.isNaN(asNumber) - ? new Date(Math.abs(asNumber) < 1e12 ? asNumber * 1000 : asNumber) - : new Date(String(value)); - return Number.isNaN(date.getTime()) ? null : date; -}; export type AuthFileCardProps = { file: AuthFileItem; @@ -48,7 +34,6 @@ export type AuthFileCardProps = { quotaFilterType: QuotaProviderType | null; keyStats: KeyStats; statusBarCache: Map; - nowMs: number; onShowModels: (file: AuthFileItem) => void; onShowDetails: (file: AuthFileItem) => void; onDownload: (name: string) => void; @@ -65,7 +50,7 @@ const resolveQuotaType = (file: AuthFileItem): QuotaProviderType | null => { }; export function AuthFileCard(props: AuthFileCardProps) { - const { t, i18n } = useTranslation(); + const { t } = useTranslation(); const { file, selected, @@ -76,7 +61,6 @@ export function AuthFileCard(props: AuthFileCardProps) { quotaFilterType, keyStats, statusBarCache, - nowMs, onShowModels, onShowDetails, onDownload, @@ -110,63 +94,9 @@ export function AuthFileCard(props: AuthFileCardProps) { const authIndexKey = normalizeAuthIndex(rawAuthIndex); const statusData = (authIndexKey && statusBarCache.get(authIndexKey)) || calculateStatusBarData([]); - const rawStatus = String(file.status ?? file['status'] ?? '') - .trim() - .toLowerCase(); const rawStatusMessage = String(file['status_message'] ?? file.statusMessage ?? '').trim(); - const normalizedStatusMessage = rawStatusMessage.toLowerCase(); - const isFileDisabled = file.disabled === true || rawStatus === 'disabled'; - const isUnavailable = file.unavailable === true || rawStatus === 'unavailable'; - const lastRefreshDate = parseDateFromUnknown(file['last_refresh'] ?? file.lastRefresh); - const isRefreshStale = lastRefreshDate - ? nowMs - lastRefreshDate.getTime() > AUTH_FILE_REFRESH_WARNING_MS - : false; const hasStatusWarning = - Boolean(rawStatusMessage) && !HEALTHY_STATUS_MESSAGES.has(normalizedStatusMessage); - const hasStatusFailure = rawStatus === 'error' || rawStatus === 'failed' || rawStatus === 'warning'; - const healthStatus: AuthFileHealthStatus = isFileDisabled - ? 'disabled' - : hasStatusWarning || hasStatusFailure || isUnavailable || isRefreshStale - ? 'warning' - : lastRefreshDate && !isRefreshStale && GOOD_STATUS_VALUES.has(rawStatus) - ? 'healthy' - : 'unknown'; - const healthStatusClass = - healthStatus === 'healthy' - ? styles.healthStatusHealthy - : healthStatus === 'warning' - ? styles.healthStatusWarning - : healthStatus === 'disabled' - ? styles.healthStatusDisabled - : styles.healthStatusUnknown; - const healthStatusLabel = t(`auth_files.health_status_${healthStatus}`); - const lastRefreshText = (() => { - if (!lastRefreshDate) return t('auth_files.refresh_not_available'); - - const diffMs = lastRefreshDate.getTime() - nowMs; - const absMs = Math.abs(diffMs); - if (absMs < 30 * 1000) { - return t('auth_files.refresh_just_now'); - } - - const units: ReadonlyArray<{ unit: Intl.RelativeTimeFormatUnit; ms: number }> = [ - { unit: 'day', ms: 24 * 60 * 60 * 1000 }, - { unit: 'hour', ms: 60 * 60 * 1000 }, - { unit: 'minute', ms: 60 * 1000 }, - { unit: 'second', ms: 1000 } - ]; - const matched = units.find(({ ms }) => absMs >= ms) || units[units.length - 1]; - const value = Math.round(diffMs / matched.ms); - if (typeof Intl === 'undefined' || typeof Intl.RelativeTimeFormat !== 'function') { - return lastRefreshDate.toLocaleString(i18n.language); - } - const formatter = new Intl.RelativeTimeFormat(i18n.language, { numeric: 'auto' }); - return formatter.format(value, matched.unit); - })(); - const lastRefreshTitle = lastRefreshDate - ? lastRefreshDate.toLocaleString(i18n.language) - : t('auth_files.refresh_not_available'); - const healthStatusTitle = rawStatusMessage || t('auth_files.health_status_no_message'); + Boolean(rawStatusMessage) && !HEALTHY_STATUS_MESSAGES.has(rawStatusMessage.toLowerCase()); return (
-
- - {t('auth_files.health_status_label')}: {healthStatusLabel} - - - {t('auth_files.last_refresh_label')}: {lastRefreshText} - -
{rawStatusMessage && hasStatusWarning && (
{rawStatusMessage} diff --git a/src/pages/AuthFilesPage.module.scss b/src/pages/AuthFilesPage.module.scss index ce55d66..73938b9 100644 --- a/src/pages/AuthFilesPage.module.scss +++ b/src/pages/AuthFilesPage.module.scss @@ -605,59 +605,6 @@ border-bottom: 1px solid var(--border-color); } -.cardHealthRow { - display: flex; - align-items: center; - justify-content: space-between; - gap: $spacing-sm; - flex-wrap: wrap; -} - -.healthStatusBadge { - display: inline-flex; - align-items: center; - gap: 6px; - padding: 5px 10px; - border-radius: $radius-full; - border: 1px solid var(--border-color); - font-size: 12px; - font-weight: 600; - line-height: 1.2; -} - -.healthStatusHealthy { - color: var(--success-badge-text, #065f46); - background-color: var(--success-badge-bg, #d1fae5); - border-color: var(--success-badge-border, #6ee7b7); -} - -.healthStatusWarning { - color: var(--warning-text); - background-color: var(--warning-bg); - border-color: var(--warning-border); -} - -.healthStatusDisabled { - color: var(--text-secondary); - background-color: var(--bg-tertiary); - border-color: var(--border-color); -} - -.healthStatusUnknown { - color: var(--text-secondary); - background-color: var(--bg-secondary); - border-style: dashed; -} - -.lastRefreshText { - font-size: 12px; - color: var(--text-secondary); -} - -.lastRefreshStale { - color: var(--warning-text); -} - .healthStatusMessage { font-size: 12px; color: var(--warning-text); diff --git a/src/pages/AuthFilesPage.tsx b/src/pages/AuthFilesPage.tsx index 18d7253..764e2f9 100644 --- a/src/pages/AuthFilesPage.tsx +++ b/src/pages/AuthFilesPage.tsx @@ -58,7 +58,6 @@ export function AuthFilesPage() { const [selectedFile, setSelectedFile] = useState(null); const [viewMode, setViewMode] = useState<'diagram' | 'list'>('list'); const [batchActionBarVisible, setBatchActionBarVisible] = useState(false); - const [nowMs, setNowMs] = useState(() => Date.now()); const floatingBatchActionsRef = useRef(null); const previousSelectionCountRef = useRef(0); const selectionCountRef = useRef(0); @@ -223,7 +222,6 @@ export function AuthFilesPage() { }, isCurrentLayer ? 240_000 : null ); - useInterval(() => setNowMs(Date.now()), isCurrentLayer ? 60_000 : null); const existingTypes = useMemo(() => { const types = new Set(['all']); @@ -519,7 +517,6 @@ export function AuthFilesPage() { quotaFilterType={quotaFilterType} keyStats={keyStats} statusBarCache={statusBarCache} - nowMs={nowMs} onShowModels={showModels} onShowDetails={showDetails} onDownload={handleDownload}