feat(app): 新增HRV压力提醒设置与锻炼记录分享功能
- 通知设置页面新增 HRV 压力提醒开关,支持自定义开启或关闭压力监测推送 - 锻炼详情页集成分享功能,支持将运动数据生成精美长图并分享 - 优化 HRV 监测服务逻辑,在发送通知前检查用户偏好设置 - 更新多语言配置文件,添加相关文案翻译 - 将应用版本号更新至 1.1.5
This commit is contained in:
@@ -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',
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user