Remove health status pill from auth file cards

This commit is contained in:
Supra4E8C
2026-02-23 20:18:25 +08:00
Unverified
parent 19532064da
commit 95798f6b4d
3 changed files with 2 additions and 139 deletions
@@ -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<string, AuthFileStatusBarData>;
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 (
<div
@@ -209,17 +139,6 @@ export function AuthFileCard(props: AuthFileCardProps) {
</span>
</div>
<div className={styles.cardHealthRow}>
<span className={`${styles.healthStatusBadge} ${healthStatusClass}`} title={healthStatusTitle}>
{t('auth_files.health_status_label')}: {healthStatusLabel}
</span>
<span
className={`${styles.lastRefreshText} ${isRefreshStale ? styles.lastRefreshStale : ''}`}
title={lastRefreshTitle}
>
{t('auth_files.last_refresh_label')}: {lastRefreshText}
</span>
</div>
{rawStatusMessage && hasStatusWarning && (
<div className={styles.healthStatusMessage} title={rawStatusMessage}>
{rawStatusMessage}
-53
View File
@@ -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);
-3
View File
@@ -58,7 +58,6 @@ export function AuthFilesPage() {
const [selectedFile, setSelectedFile] = useState<AuthFileItem | null>(null);
const [viewMode, setViewMode] = useState<'diagram' | 'list'>('list');
const [batchActionBarVisible, setBatchActionBarVisible] = useState(false);
const [nowMs, setNowMs] = useState(() => Date.now());
const floatingBatchActionsRef = useRef<HTMLDivElement>(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<string>(['all']);
@@ -519,7 +517,6 @@ export function AuthFilesPage() {
quotaFilterType={quotaFilterType}
keyStats={keyStats}
statusBarCache={statusBarCache}
nowMs={nowMs}
onShowModels={showModels}
onShowDetails={showDetails}
onDownload={handleDownload}