feat: 更新 CLAUDE.md 文件及多个组件以优化用户体验和功能

- 更新 CLAUDE.md 文件,重构架构部分,增加认证和数据层的描述
- 在 GoalsScreen 中新增目标模板选择功能,支持用户选择和创建目标
- 在 CreateGoalModal 中添加初始数据支持,优化目标创建体验
- 新增 GoalTemplateModal 组件,提供目标模板选择界面
- 更新 NotificationHelpers,支持构建深度链接以便于导航
- 在 CoachScreen 中处理路由参数,增强用户交互体验
- 更新多个组件的样式和逻辑,提升整体用户体验
- 删除不再使用的中文回复规则文档
This commit is contained in:
richarjiang
2025-08-26 15:04:04 +08:00
parent 7f2afdf671
commit 3f89023447
13 changed files with 1113 additions and 359 deletions

View File

@@ -4,7 +4,7 @@ import { CreateGoalRequest, GoalPriority, RepeatType } from '@/types/goals';
import { Ionicons } from '@expo/vector-icons';
import DateTimePicker from '@react-native-community/datetimepicker';
import { LinearGradient } from 'expo-linear-gradient';
import React, { useState } from 'react';
import React, { useState, useEffect } from 'react';
import {
Alert,
Image,
@@ -26,6 +26,7 @@ interface CreateGoalModalProps {
onSubmit: (goalData: CreateGoalRequest) => void;
onSuccess?: () => void;
loading?: boolean;
initialData?: Partial<CreateGoalRequest>;
}
const REPEAT_TYPE_OPTIONS: { value: RepeatType; label: string }[] = [
@@ -42,28 +43,49 @@ export const CreateGoalModal: React.FC<CreateGoalModalProps> = ({
onSubmit,
onSuccess,
loading = false,
initialData,
}) => {
const theme = (useColorScheme() ?? 'light') as 'light' | 'dark';
const colorTokens = Colors[theme];
// 表单状态
const [title, setTitle] = useState('');
const [description, setDescription] = useState('');
const [repeatType, setRepeatType] = useState<RepeatType>('daily');
const [frequency, setFrequency] = useState(1);
const [hasReminder, setHasReminder] = useState(false);
const [title, setTitle] = useState(initialData?.title || '');
const [description, setDescription] = useState(initialData?.description || '');
const [repeatType, setRepeatType] = useState<RepeatType>(initialData?.repeatType || 'daily');
const [frequency, setFrequency] = useState(initialData?.frequency || 1);
const [hasReminder, setHasReminder] = useState(initialData?.hasReminder || false);
const [showFrequencyPicker, setShowFrequencyPicker] = useState(false);
const [showRepeatTypePicker, setShowRepeatTypePicker] = useState(false);
const [reminderTime, setReminderTime] = useState('20:00');
const [category, setCategory] = useState('');
const [priority, setPriority] = useState<GoalPriority>(5);
const [reminderTime, setReminderTime] = useState(initialData?.reminderTime || '20:00');
const [category, setCategory] = useState(initialData?.category || '');
const [priority, setPriority] = useState<GoalPriority>(initialData?.priority || 5);
const [showTimePicker, setShowTimePicker] = useState(false);
const [tempSelectedTime, setTempSelectedTime] = useState<Date | null>(null);
// 周几选择状态
const [selectedWeekdays, setSelectedWeekdays] = useState<number[]>([1, 2, 3, 4, 5]); // 默认周一到周五
const [selectedWeekdays, setSelectedWeekdays] = useState<number[]>(
initialData?.customRepeatRule?.weekdays || [1, 2, 3, 4, 5]
); // 默认周一到周五
// 每月日期选择状态
const [selectedMonthDays, setSelectedMonthDays] = useState<number[]>([1, 15]); // 默认1号和15号
const [selectedMonthDays, setSelectedMonthDays] = useState<number[]>(
initialData?.customRepeatRule?.dayOfMonth || [1, 15]
); // 默认1号和15号
// 当 initialData 变化时更新表单状态
useEffect(() => {
if (initialData) {
setTitle(initialData.title || '');
setDescription(initialData.description || '');
setRepeatType(initialData.repeatType || 'daily');
setFrequency(initialData.frequency || 1);
setHasReminder(initialData.hasReminder || false);
setReminderTime(initialData.reminderTime || '20:00');
setCategory(initialData.category || '');
setPriority(initialData.priority || 5);
setSelectedWeekdays(initialData.customRepeatRule?.weekdays || [1, 2, 3, 4, 5]);
setSelectedMonthDays(initialData.customRepeatRule?.dayOfMonth || [1, 15]);
}
}, [initialData]);
// 重置表单
const resetForm = () => {