Files
hms/apps/miniprogram/src/pages/pkg-profile/settings/index.tsx
iven 1e59007bd5 fix(mp): DevTools 卡死 + 主包 2MB→766KB + 代码质量 4 项全通过
根因:主包 2MB 全量组件注入导致 DevTools 渲染引擎内存渐增,
叠加离线时固定 3s 抑制期后的请求洪泛。

修复:
- app.config.ts 添加 lazyCodeLoading: requiredComponents
  主包 2.0MB→766KB,taro.js 526→131KB,vendors.js 230→28KB
- request.ts 离线抑制改为指数退避(3s→6s→12s→30s cap)
  后端不可达时自动延长抑制,防止请求风暴
- SegmentTabs Tab 接口改为 readonly,修复 TS 编译错误
- AbortController polyfill 补齐小程序运行时缺失
- 健康首页/设备同步/健康档案/报告/设置页 UI 重构
- 文章页公开端点适配游客访问
- 健康首页 Swiper 间隔优化 4s→5s,动画 500→300ms
2026-05-24 11:32:40 +08:00

120 lines
4.1 KiB
TypeScript

import { View, Text } from '@tarojs/components';
import Taro from '@tarojs/taro';
import { safeNavigateTo } from '@/utils/navigate';
import { useAuthStore } from '../../../stores/auth';
import { useUIStore } from '../../../stores/ui';
import { invalidateHeadersCache, clearRequestCache } from '@/services/request';
import { useElderClass } from '../../../hooks/useElderClass';
import PageShell from '@/components/ui/PageShell';
import DoctorTabBar from '@/components/ui/DoctorTabBar';
import './index.scss';
export default function Settings() {
const modeClass = useElderClass();
const logout = useAuthStore((s) => s.logout);
const isMedicalStaff = useAuthStore((s) => s.isMedicalStaff);
const mode = useUIStore((s) => s.mode);
const toggleMode = useUIStore((s) => s.toggle);
const handleClearCache = async () => {
const { confirm } = await Taro.showModal({
title: '清除缓存',
content: '确定要清除本地缓存数据吗?不会影响账号信息。',
});
if (!confirm) return;
const preservedKeys = ['access_token', 'refresh_token', 'user_data', 'user_roles', 'tenant_id', 'wechat_openid', 'current_patient', 'current_patient_id'];
const preserved: Record<string, unknown> = {};
await Promise.all(
preservedKeys.map(async (key) => {
try {
const val = await Taro.getStorage({ key });
if (val.data) preserved[key] = val.data;
} catch { /* key not found */ }
}),
);
await Taro.clearStorage();
await Promise.all(
Object.entries(preserved).map(([key, val]) =>
Taro.setStorage({ key, data: val }),
),
);
clearRequestCache();
invalidateHeadersCache();
Taro.showToast({ title: '缓存已清除', icon: 'success' });
};
const handleAbout = () => {
Taro.showModal({
title: '关于我们',
content: 'HMS 健康管理平台 v1.0.0\n为您的健康保驾护航',
showCancel: false,
});
};
const handlePrivacy = () => {
safeNavigateTo('/pages/legal/privacy-policy');
};
const handleLogout = () => {
Taro.showModal({
title: '退出登录',
content: '确定要退出登录吗?',
}).then((res) => {
if (res.confirm) {
logout();
}
});
};
return (
<PageShell className={modeClass}>
<Text className='page-title'></Text>
<View className='settings-group'>
<View className='settings-item' onClick={toggleMode}>
<View className='settings-icon'>
<Text className='settings-icon-text'></Text>
</View>
<Text className='settings-label'></Text>
<Text className={`settings-toggle ${mode === 'elder' ? 'settings-toggle--active' : ''}`}>
{mode === 'elder' ? '已开启' : '未开启'}
</Text>
<Text className='settings-arrow'>{'>'}</Text>
</View>
<View className='settings-item' onClick={handleClearCache}>
<View className='settings-icon'>
<Text className='settings-icon-text'></Text>
</View>
<Text className='settings-label'></Text>
<Text className='settings-arrow'>{'>'}</Text>
</View>
<View className='settings-item' onClick={handleAbout}>
<View className='settings-icon'>
<Text className='settings-icon-text'></Text>
</View>
<Text className='settings-label'></Text>
<Text className='settings-arrow'>{'>'}</Text>
</View>
<View className='settings-item' onClick={handlePrivacy}>
<View className='settings-icon'>
<Text className='settings-icon-text'></Text>
</View>
<Text className='settings-label'></Text>
<Text className='settings-arrow'>{'>'}</Text>
</View>
</View>
<View className='settings-group'>
<View className='settings-item logout-item' onClick={handleLogout}>
<Text className='settings-label logout-label'>退</Text>
</View>
</View>
{isMedicalStaff() && <DoctorTabBar active="settings" />}
</PageShell>
);
}