- 新增后台任务管理器,支持任务的注册、执行和状态监控 - 实现自定义Hook,简化后台任务的使用和管理 - 添加示例任务,包括数据同步、健康数据更新和通知检查等 - 更新文档,详细描述后台任务系统的实现和使用方法 - 优化相关组件,确保用户体验和界面一致性
110 lines
3.3 KiB
TypeScript
110 lines
3.3 KiB
TypeScript
import { BackgroundTaskType as BackgroundTask, backgroundTaskManager, TaskStatusType as TaskStatus } from '@/services/backgroundTaskManager';
|
|
import { useCallback, useEffect, useState } from 'react';
|
|
|
|
export interface UseBackgroundTasksReturn {
|
|
// 状态
|
|
isInitialized: boolean;
|
|
taskStatuses: TaskStatus[];
|
|
registeredTasks: BackgroundTask[];
|
|
|
|
// 方法
|
|
registerTask: (task: BackgroundTask) => Promise<void>;
|
|
unregisterTask: (taskId: string) => Promise<void>;
|
|
executeTask: (taskId: string, data?: any) => Promise<void>;
|
|
executeAllTasks: () => Promise<{ [taskId: string]: 'success' | 'failed' }>;
|
|
getTaskStatus: (taskId: string) => TaskStatus | undefined;
|
|
cleanupTaskStatuses: () => Promise<void>;
|
|
|
|
// 后台任务状态
|
|
backgroundTaskStatus: string | null;
|
|
getBackgroundTaskStatus: () => Promise<void>;
|
|
}
|
|
|
|
export const useBackgroundTasks = (): UseBackgroundTasksReturn => {
|
|
const [isInitialized, setIsInitialized] = useState(false);
|
|
const [taskStatuses, setTaskStatuses] = useState<TaskStatus[]>([]);
|
|
const [registeredTasks, setRegisteredTasks] = useState<BackgroundTask[]>([]);
|
|
const [backgroundTaskStatus, setBackgroundTaskStatus] = useState<string | null>(null);
|
|
|
|
// 初始化
|
|
useEffect(() => {
|
|
const initialize = async () => {
|
|
try {
|
|
await backgroundTaskManager.initialize();
|
|
setIsInitialized(true);
|
|
refreshData();
|
|
} catch (error) {
|
|
console.error('初始化后台任务失败:', error);
|
|
}
|
|
};
|
|
|
|
initialize();
|
|
}, []);
|
|
|
|
// 刷新数据
|
|
const refreshData = useCallback(() => {
|
|
setTaskStatuses(backgroundTaskManager.getAllTaskStatuses());
|
|
setRegisteredTasks(backgroundTaskManager.getRegisteredTasks());
|
|
}, []);
|
|
|
|
// 注册任务
|
|
const registerTask = useCallback(async (task: BackgroundTask) => {
|
|
await backgroundTaskManager.registerTask(task);
|
|
refreshData();
|
|
}, [refreshData]);
|
|
|
|
// 取消注册任务
|
|
const unregisterTask = useCallback(async (taskId: string) => {
|
|
await backgroundTaskManager.unregisterTask(taskId);
|
|
refreshData();
|
|
}, [refreshData]);
|
|
|
|
// 执行任务
|
|
const executeTask = useCallback(async (taskId: string, data?: any) => {
|
|
await backgroundTaskManager.executeTask(taskId, data);
|
|
refreshData();
|
|
}, [refreshData]);
|
|
|
|
// 执行所有任务
|
|
const executeAllTasks = useCallback(async () => {
|
|
const results = await backgroundTaskManager.executeAllTasks();
|
|
refreshData();
|
|
return results;
|
|
}, [refreshData]);
|
|
|
|
// 获取任务状态
|
|
const getTaskStatus = useCallback((taskId: string) => {
|
|
return backgroundTaskManager.getTaskStatus(taskId);
|
|
}, []);
|
|
|
|
// 清理任务状态
|
|
const cleanupTaskStatuses = useCallback(async () => {
|
|
await backgroundTaskManager.cleanupTaskStatuses();
|
|
refreshData();
|
|
}, [refreshData]);
|
|
|
|
// 获取后台任务状态
|
|
const getBackgroundTaskStatus = useCallback(async () => {
|
|
try {
|
|
const status = await backgroundTaskManager.getBackgroundTaskStatus();
|
|
setBackgroundTaskStatus(status ? status.toString() : null);
|
|
} catch (error) {
|
|
console.error('获取后台任务状态失败:', error);
|
|
}
|
|
}, []);
|
|
|
|
return {
|
|
isInitialized,
|
|
taskStatuses,
|
|
registeredTasks,
|
|
registerTask,
|
|
unregisterTask,
|
|
executeTask,
|
|
executeAllTasks,
|
|
getTaskStatus,
|
|
cleanupTaskStatuses,
|
|
backgroundTaskStatus,
|
|
getBackgroundTaskStatus,
|
|
};
|
|
};
|