feat: 新增任务详情页面及相关功能

- 创建任务详情页面,展示任务的详细信息,包括状态、描述、优先级和进度
- 实现任务完成和跳过功能,用户可通过按钮操作更新任务状态
- 添加评论功能,用户可以对任务进行评论并发送
- 优化任务卡片,点击后可跳转至任务详情页面
- 更新相关样式,确保界面一致性和美观性
This commit is contained in:
2025-08-23 13:33:39 +08:00
parent 75806df660
commit b807e498ed
5 changed files with 680 additions and 65 deletions

View File

@@ -5,6 +5,7 @@ import { useColorScheme } from '@/hooks/useColorScheme';
import { completeTask, skipTask } from '@/store/tasksSlice';
import { TaskListItem } from '@/types/goals';
import MaterialIcons from '@expo/vector-icons/MaterialIcons';
import { useRouter } from 'expo-router';
import React from 'react';
import { Alert, Image, StyleSheet, Text, TouchableOpacity, View } from 'react-native';
@@ -19,6 +20,7 @@ export const TaskCard: React.FC<TaskCardProps> = ({
const colorTokens = Colors[theme];
const dispatch = useAppDispatch();
const { showConfirm } = useGlobalDialog();
const router = useRouter();
const getStatusText = (status: string) => {
@@ -123,6 +125,10 @@ export const TaskCard: React.FC<TaskCardProps> = ({
);
};
const handleTaskPress = () => {
router.push(`/task-detail?taskId=${task.id}`);
};
const renderActionIcons = () => {
if (task.status === 'completed' || task.status === 'overdue' || task.status === 'skipped') {
return null;
@@ -158,7 +164,7 @@ export const TaskCard: React.FC<TaskCardProps> = ({
return (
<TouchableOpacity
style={[styles.container, { backgroundColor: colorTokens.background }]}
onPress={() => {}}
onPress={handleTaskPress}
activeOpacity={0.7}
>
{/* 头部区域 */}
@@ -205,23 +211,21 @@ export const TaskCard: React.FC<TaskCardProps> = ({
)}
{/* 进度百分比文本 */}
<View style={styles.progressTextContainer}>
<Text style={styles.progressText}>{Math.round(task.progressPercentage)}%</Text>
<Text style={styles.progressText}>{task.currentCount}/{task.targetCount}</Text>
</View>
</View>
{/* 底部信息 */}
<View style={styles.footer}>
<View style={styles.teamSection}>
{/* 模拟团队成员头像 */}
{/* 团队成员头像 */}
<View style={styles.avatars}>
<View style={[styles.avatar, { backgroundColor: '#FBBF24' }]}>
<Text style={styles.avatarText}>A</Text>
</View>
<View style={[styles.avatar, { backgroundColor: '#34D399' }]}>
<Text style={styles.avatarText}>B</Text>
</View>
<View style={[styles.avatar, { backgroundColor: '#60A5FA' }]}>
<Text style={styles.avatarText}>C</Text>
<View style={styles.avatar}>
<Image
source={require('@/assets/images/Sealife.jpeg')}
style={styles.avatarImage}
resizeMode="cover"
/>
</View>
</View>
</View>
@@ -395,17 +399,15 @@ const styles = StyleSheet.create({
avatar: {
width: 24,
height: 24,
borderRadius: 12,
alignItems: 'center',
justifyContent: 'center',
borderRadius: 24,
marginRight: -8,
borderWidth: 2,
borderColor: '#FFFFFF',
overflow: 'hidden',
},
avatarText: {
fontSize: 10,
fontWeight: '600',
color: '#FFFFFF',
avatarImage: {
width: '100%',
height: '100%',
},
infoSection: {
flexDirection: 'row',