测试: - secure-storage: 26 tests (AES 加解密/明文 fallback/迁移/Base64 边界) - request.ts: 16 tests (扩展 ResponseCache/patientId 隔离/requestUnlimited) - mock-api: 修复 getCachedPatientId 缺失导致 health 测试失败 UX 无障碍 (10 组件): - SegmentTabs/DoctorTabBar: role=tablist/tab + aria-selected - PrimaryButton/SecondaryButton: role=button + aria-disabled/aria-busy - Loading/LoadingCard: role=status + aria-live=polite - EmptyState: role=status + aria-live=polite - ErrorState: role=alert + aria-live=assertive - TrendChart tooltip: role=tooltip + aria-live=polite - FormInput: aria-invalid + aria-label 焦点管理: - 新增 _focus-ring.scss mixin (focus + focus-visible) - 5 组件 SCSS 应用 focus-ring
26 lines
687 B
TypeScript
26 lines
687 B
TypeScript
import React from 'react';
|
||
import { View, Text } from '@tarojs/components';
|
||
import './index.scss';
|
||
|
||
interface ErrorStateProps {
|
||
text?: string;
|
||
onRetry?: () => void;
|
||
}
|
||
|
||
export default React.memo(function ErrorState({
|
||
text = '加载失败,请稍后重试',
|
||
onRetry,
|
||
}: ErrorStateProps) {
|
||
return (
|
||
<View className='error-state' role="alert" aria-live="assertive">
|
||
<Text className='error-state-icon'>⚠️</Text>
|
||
<Text className='error-state-text'>{text}</Text>
|
||
{onRetry && (
|
||
<View className='error-state-retry' onClick={onRetry}>
|
||
<Text className='error-state-retry-text'>重新加载</Text>
|
||
</View>
|
||
)}
|
||
</View>
|
||
);
|
||
});
|