From ece6728e94db166b614b6ce4cde414888018f045 Mon Sep 17 00:00:00 2001 From: xudan Date: Wed, 23 Jul 2025 16:59:46 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E5=88=B7=E6=96=B0=E5=8A=9F=E8=83=BD=E8=87=B3=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E4=B8=8A=E4=B8=8B=E6=96=87=EF=BC=8C=E5=B9=B6=E5=9C=A8=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E5=88=97=E8=A1=A8=E5=B1=8F=E5=B9=95=E4=B8=AD=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E4=B8=8B=E6=8B=89=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/context/TasksContext.tsx | 9 +++++--- src/screens/TaskListScreen.tsx | 41 +++++++++++++++++++++++++++++----- 2 files changed, 42 insertions(+), 8 deletions(-) diff --git a/src/context/TasksContext.tsx b/src/context/TasksContext.tsx index c6b98f7..97a9289 100644 --- a/src/context/TasksContext.tsx +++ b/src/context/TasksContext.tsx @@ -23,6 +23,7 @@ interface TasksContextData { refreshConfig: () => Promise; isConfigLoaded: boolean; fetchTaskDetail: (taskId: string) => Promise; + refreshTasks: () => Promise; } const TasksContext = createContext({} as TasksContextData); @@ -34,7 +35,7 @@ export const TasksProvider: React.FC<{ children: ReactNode }> = ({ const [isConfigLoaded, setIsConfigLoaded] = useState(false); const [serverUrl, setServerUrl] = useState(null); - const fetchTasks = useCallback(async () => { + const refreshTasks = useCallback(async () => { if (!isConfigLoaded) return; try { const fetchedTasks = await getTasksService({ pageNum: 1, pageSize: 100 }); @@ -67,9 +68,9 @@ export const TasksProvider: React.FC<{ children: ReactNode }> = ({ useEffect(() => { if (isConfigLoaded) { - fetchTasks(); + refreshTasks(); } - }, [isConfigLoaded, fetchTasks]); + }, [isConfigLoaded, refreshTasks]); const applyConfig = (config: AppConfig) => { if (config.serverUrl) { @@ -129,6 +130,7 @@ export const TasksProvider: React.FC<{ children: ReactNode }> = ({ refreshConfig, isConfigLoaded, fetchTaskDetail, + refreshTasks, }), [ tasks, @@ -138,6 +140,7 @@ export const TasksProvider: React.FC<{ children: ReactNode }> = ({ refreshConfig, isConfigLoaded, fetchTaskDetail, + refreshTasks, ], ); diff --git a/src/screens/TaskListScreen.tsx b/src/screens/TaskListScreen.tsx index 69c7e18..37a46f6 100644 --- a/src/screens/TaskListScreen.tsx +++ b/src/screens/TaskListScreen.tsx @@ -1,7 +1,14 @@ -import React from 'react'; -import { View, StyleSheet, FlatList } from 'react-native'; +import React, { useLayoutEffect, useState, useCallback } from 'react'; +import { + View, + StyleSheet, + FlatList, + TouchableOpacity, + ActivityIndicator, +} from 'react-native'; import { useNavigation } from '@react-navigation/native'; import { StackNavigationProp } from '@react-navigation/stack'; +import MaterialIcons from 'react-native-vector-icons/MaterialIcons'; import { useTasks } from '../context/TasksContext'; import TaskCard from '../components/TaskCard'; @@ -16,10 +23,34 @@ type TaskListNavigationProp = StackNavigationProp< >; export default function TaskListScreen() { - const { tasks } = useTasks(); - console.log('tasks', tasks); - + const { tasks, refreshTasks } = useTasks(); const navigation = useNavigation(); + const [isRefreshing, setIsRefreshing] = useState(false); + + const handleRefresh = useCallback(async () => { + setIsRefreshing(true); + try { + await refreshTasks(); + } catch (error) { + console.error('刷新任务失败:', error); + } finally { + setIsRefreshing(false); + } + }, [refreshTasks]); + + useLayoutEffect(() => { + navigation.setOptions({ + headerRight: () => ( + + {isRefreshing ? ( + + ) : ( + + )} + + ), + }); + }, [navigation, isRefreshing, handleRefresh]); const handlePressTask = (id: string) => { navigation.navigate('TaskEdit', { taskId: id });