import { useAppDispatch, useAppSelector } from "@/store"; import { useFocusEffect } from "expo-router"; import { useCallback, useState } from "react"; import { endUploadSessionInDb, syncUploadSessionState } from "@/features/appState/appStateSlice"; import { triggerManualUpload } from "@/lib/background-uploader/automatic"; import { exist_pending_tasks, getUploadTasksSince, UploadTask } from "@/lib/db"; export const useUploadManager = () => { const dispatch = useAppDispatch(); const uploadSessionStartTime = useAppSelector((state) => state.appState.uploadSessionStartTime); const [progressInfo, setProgressInfo] = useState({ total: 0, completed: 0, image: '' }); useFocusEffect( useCallback(() => { let isActive = true; let interval: any = null; const manageUploadState = async (restore_session: boolean = false) => { if (!isActive) { console.log('useUploadManager manageUploadState is not active'); return; } // 首先,同步Redux中的会话开始时间 const action = await dispatch(syncUploadSessionState()); const sessionStartTime = action.payload as number | null; if (sessionStartTime) { // 如果会话存在,则获取任务进度 const allTasks = await getUploadTasksSince(sessionStartTime); const total = allTasks.length; const completed = allTasks.filter((t: UploadTask) => t.status === 'success' || t.status === 'failed' || t.status === 'skipped').length; const pending = allTasks.filter((t: UploadTask) => t.status === 'pending' || t.status === 'uploading'); if (isActive) { setProgressInfo({ total, completed, image: allTasks[0]?.uri || '' }); } // 如果任务完成,则结束会话并清除定时器 if (total > 0 && pending.length === 0) { console.log('useUploadManager detects all tasks are complete. Ending session.'); if (interval) clearInterval(interval); dispatch(endUploadSessionInDb()); } } else { // 如果没有会话,确保本地状态被重置 if (isActive) { setProgressInfo({ total: 0, completed: 0, image: '' }); } } }; const initializeUploadProcess = async () => { // First, check if a session is already active. const action = await dispatch(syncUploadSessionState()); const existingSessionStartTime = action.payload as number | null; const existPendingTasks = await exist_pending_tasks(); if (existingSessionStartTime && existPendingTasks) { console.log('useUploadManager focused, existing session found. Monitoring progress.'); // If a session exists, just start monitoring. manageUploadState(true); // Initial check // 将轮询间隔从2秒增加到3秒,减少资源消耗 interval = setInterval(manageUploadState, 3000); } else { // If no session, then try to trigger a new upload. console.log('useUploadManager focused, no existing session. Triggering foreground media upload check.'); const now = new Date(); const oneDayAgo = new Date(now.getTime() - 24 * 60 * 60 * 1000); const newSessionStartTimeStr = await triggerManualUpload(oneDayAgo, now); if (newSessionStartTimeStr) { console.log(`New upload session started with time: ${newSessionStartTimeStr}, beginning to monitor...`); // A new session was started, so start monitoring. manageUploadState(); // Initial check // 将轮询间隔从2秒增加到3秒,减少资源消耗 interval = setInterval(manageUploadState, 3000); } } }; initializeUploadProcess(); return () => { isActive = false; if (interval) { clearInterval(interval); } }; }, [dispatch]) ); return { progressInfo, uploadSessionStartTime }; };