feat(app): 新增HRV压力提醒设置与锻炼记录分享功能

- 通知设置页面新增 HRV 压力提醒开关,支持自定义开启或关闭压力监测推送
- 锻炼详情页集成分享功能,支持将运动数据生成精美长图并分享
- 优化 HRV 监测服务逻辑,在发送通知前检查用户偏好设置
- 更新多语言配置文件,添加相关文案翻译
- 将应用版本号更新至 1.1.5
This commit is contained in:
richarjiang
2025-12-16 11:27:11 +08:00
parent 409f125db1
commit 5e11da34ee
9 changed files with 569 additions and 122 deletions

View File

@@ -8,10 +8,12 @@ import {
getMoodReminderEnabled,
getNotificationEnabled,
getNutritionReminderEnabled,
getHRVReminderEnabled,
setMedicationReminderEnabled,
setMoodReminderEnabled,
setNotificationEnabled,
setNutritionReminderEnabled
setNutritionReminderEnabled,
setHRVReminderEnabled
} from '@/utils/userPreferences';
import { Ionicons } from '@expo/vector-icons';
import { LinearGradient } from 'expo-linear-gradient';
@@ -29,21 +31,24 @@ export default function NotificationSettingsScreen() {
const [medicationReminderEnabled, setMedicationReminderEnabledState] = useState(false);
const [nutritionReminderEnabled, setNutritionReminderEnabledState] = useState(false);
const [moodReminderEnabled, setMoodReminderEnabledState] = useState(false);
const [hrvReminderEnabled, setHrvReminderEnabledState] = useState(false);
const [isLoading, setIsLoading] = useState(true);
// 加载通知设置
const loadNotificationSettings = useCallback(async () => {
try {
const [notification, medicationReminder, nutritionReminder, moodReminder] = await Promise.all([
const [notification, medicationReminder, nutritionReminder, moodReminder, hrvReminder] = await Promise.all([
getNotificationEnabled(),
getMedicationReminderEnabled(),
getNutritionReminderEnabled(),
getMoodReminderEnabled(),
getHRVReminderEnabled(),
]);
setNotificationEnabledState(notification);
setMedicationReminderEnabledState(medicationReminder);
setNutritionReminderEnabledState(nutritionReminder);
setMoodReminderEnabledState(moodReminder);
setHrvReminderEnabledState(hrvReminder);
} catch (error) {
console.error('Failed to load notification settings:', error);
} finally {
@@ -103,6 +108,8 @@ export default function NotificationSettingsScreen() {
setNutritionReminderEnabledState(false);
await setMoodReminderEnabled(false);
setMoodReminderEnabledState(false);
await setHRVReminderEnabled(false);
setHrvReminderEnabledState(false);
} catch (error) {
console.error('Failed to disable push notifications:', error);
Alert.alert(t('notificationSettings.alerts.error.title'), t('notificationSettings.alerts.error.saveFailed'));
@@ -173,6 +180,26 @@ export default function NotificationSettingsScreen() {
}
};
// 处理 HRV 通知提醒开关变化
const handleHrvReminderToggle = async (value: boolean) => {
try {
await setHRVReminderEnabled(value);
setHrvReminderEnabledState(value);
if (value) {
await sendNotification({
title: t('notificationSettings.alerts.hrvReminderEnabled.title'),
body: t('notificationSettings.alerts.hrvReminderEnabled.body'),
sound: true,
priority: 'high',
});
}
} catch (error) {
console.error('Failed to set HRV reminder:', error);
Alert.alert(t('notificationSettings.alerts.error.title'), t('notificationSettings.alerts.error.hrvReminderFailed'));
}
};
// 渲染设置项
const renderSettingItem = (
icon: keyof typeof Ionicons.glyphMap,
@@ -297,6 +324,16 @@ export default function NotificationSettingsScreen() {
true
)}
{renderSettingItem(
'pulse-outline',
t('notificationSettings.items.hrvReminder.title'),
t('notificationSettings.items.hrvReminder.description'),
hrvReminderEnabled,
handleHrvReminderToggle,
!notificationEnabled,
true
)}
{renderSettingItem(
'happy-outline',
t('notificationSettings.items.moodReminder.title'),
@@ -432,4 +469,4 @@ const styles = StyleSheet.create({
height: 1,
backgroundColor: '#F0F0F0',
},
});
});