2025-07-21 15:10:39 +08:00
|
|
|
import React, { useState, useEffect } from 'react';
|
|
|
|
import { View, StyleSheet, Alert } from 'react-native';
|
|
|
|
import { useRoute, useNavigation } from '@react-navigation/native';
|
|
|
|
import { RouteProp } from '@react-navigation/native';
|
2025-07-21 15:36:11 +08:00
|
|
|
import { useTasks } from '../context/TasksContext';
|
2025-07-21 15:10:39 +08:00
|
|
|
import TaskForm from '../components/TaskForm';
|
|
|
|
import BottomActionBar from '../components/BottomActionBar';
|
|
|
|
import { Task } from '../types/task';
|
2025-07-21 15:36:11 +08:00
|
|
|
import { ActivityIndicator } from 'react-native-paper';
|
2025-07-21 15:10:39 +08:00
|
|
|
|
|
|
|
type RootStackParamList = {
|
|
|
|
TaskEdit: { taskId: string };
|
|
|
|
};
|
|
|
|
|
|
|
|
type TaskEditRouteProp = RouteProp<RootStackParamList, 'TaskEdit'>;
|
|
|
|
|
|
|
|
export default function TaskEditScreen() {
|
|
|
|
const route = useRoute<TaskEditRouteProp>();
|
|
|
|
const navigation = useNavigation();
|
|
|
|
const { taskId } = route.params;
|
|
|
|
|
2025-07-21 15:36:11 +08:00
|
|
|
const { getTaskById, updateTask, runTask } = useTasks();
|
|
|
|
|
2025-07-21 15:10:39 +08:00
|
|
|
const [task, setTask] = useState<Task | null>(null);
|
2025-07-21 15:36:11 +08:00
|
|
|
const [originalTask, setOriginalTask] = useState<Task | null>(null);
|
2025-07-21 15:10:39 +08:00
|
|
|
const [isModified, setIsModified] = useState(false);
|
|
|
|
|
|
|
|
useEffect(() => {
|
2025-07-21 15:36:11 +08:00
|
|
|
const foundTask = getTaskById(taskId);
|
2025-07-21 15:10:39 +08:00
|
|
|
if (foundTask) {
|
|
|
|
setTask(foundTask);
|
2025-07-21 15:36:11 +08:00
|
|
|
setOriginalTask(foundTask);
|
2025-07-21 15:10:39 +08:00
|
|
|
}
|
2025-07-21 15:36:11 +08:00
|
|
|
}, [taskId, getTaskById]);
|
2025-07-21 15:10:39 +08:00
|
|
|
|
|
|
|
const handleTaskChange = (updatedTask: Task) => {
|
|
|
|
setTask(updatedTask);
|
|
|
|
if (!isModified) {
|
|
|
|
setIsModified(true);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
const handleSave = () => {
|
2025-07-21 15:36:11 +08:00
|
|
|
if (task) {
|
|
|
|
updateTask(task);
|
|
|
|
setOriginalTask(task);
|
|
|
|
setIsModified(false);
|
|
|
|
Alert.alert('已保存', `任务 "${task.name}" 已被保存。`);
|
|
|
|
}
|
2025-07-21 15:10:39 +08:00
|
|
|
};
|
2025-07-21 15:36:11 +08:00
|
|
|
|
|
|
|
const handleRun = () => {
|
|
|
|
if(task) {
|
|
|
|
runTask(task.id);
|
|
|
|
navigation.goBack();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
const handleUndo = () => {
|
|
|
|
setTask(originalTask);
|
|
|
|
setIsModified(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
const handleRestore = () => {
|
|
|
|
setTask(originalTask);
|
|
|
|
setIsModified(false);
|
|
|
|
}
|
2025-07-21 15:10:39 +08:00
|
|
|
|
|
|
|
if (!task) {
|
2025-07-21 15:36:11 +08:00
|
|
|
return <ActivityIndicator animating={true} size="large" style={styles.loader}/>;
|
2025-07-21 15:10:39 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
return (
|
|
|
|
<View style={styles.container}>
|
|
|
|
<TaskForm task={task} onTaskChange={handleTaskChange} />
|
|
|
|
<BottomActionBar
|
2025-07-21 15:36:11 +08:00
|
|
|
onRun={handleRun}
|
2025-07-21 15:10:39 +08:00
|
|
|
onSave={handleSave}
|
2025-07-21 15:36:11 +08:00
|
|
|
onUndo={handleUndo}
|
|
|
|
onRestore={handleRestore}
|
2025-07-21 15:10:39 +08:00
|
|
|
onBack={() => navigation.goBack()}
|
|
|
|
isSaveDisabled={!isModified}
|
|
|
|
/>
|
|
|
|
</View>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
const styles = StyleSheet.create({
|
|
|
|
container: {
|
|
|
|
flex: 1,
|
|
|
|
backgroundColor: '#fff',
|
|
|
|
},
|
2025-07-21 15:36:11 +08:00
|
|
|
loader: {
|
|
|
|
flex: 1,
|
|
|
|
justifyContent: 'center',
|
|
|
|
alignItems: 'center'
|
|
|
|
}
|
2025-07-21 15:10:39 +08:00
|
|
|
});
|