Files
Kazier/mobile/services/backgroundUpload.ts
T
2026-08-26 17:29:10 +02:00

70 lines
2.0 KiB
TypeScript

import * as BackgroundTask from 'expo-background-task';
import * as TaskManager from 'expo-task-manager';
const BACKGROUND_UPLOAD_TASK = 'BACKGROUND_UPLOAD';
TaskManager.defineTask(BACKGROUND_UPLOAD_TASK, async () => {
try {
const { uploadQueue } = await import('./uploadQueue');
const { actionQueue } = await import('./actionQueue');
const { apiClient } = await import('../api/client');
const { tokenStorage } = await import('../api/secureStorage');
const pendingUploads = uploadQueue.getPendingCount();
const pendingActions = actionQueue.getPendingCount();
if (pendingUploads === 0 && pendingActions === 0) {
return BackgroundTask.BackgroundTaskResult.Success;
}
const token = await tokenStorage.getAccessToken();
if (!token) {
return BackgroundTask.BackgroundTaskResult.Success;
}
apiClient.setAccessToken(token);
if (pendingUploads > 0) {
uploadQueue.retryAll();
}
if (pendingActions > 0) {
actionQueue.processAll();
}
await new Promise<void>((resolve) => {
const check = setInterval(() => {
if (uploadQueue.getPendingCount() === 0 && actionQueue.getPendingCount() === 0) {
clearInterval(check);
resolve();
}
}, 1000);
setTimeout(() => {
clearInterval(check);
resolve();
}, 25000);
});
return BackgroundTask.BackgroundTaskResult.Success;
} catch {
return BackgroundTask.BackgroundTaskResult.Failed;
}
});
let isRegistered = false;
export async function registerBackgroundUpload() {
if (isRegistered) return;
isRegistered = true;
const status = await BackgroundTask.getStatusAsync();
if (status === BackgroundTask.BackgroundTaskStatus.Restricted) {
console.warn('[BackgroundUpload] Permission refusée');
return;
}
await BackgroundTask.registerTaskAsync(BACKGROUND_UPLOAD_TASK, {
minimumInterval: 15,
});
console.log('[BackgroundUpload] Enregistré (intervalle: 15min)');
}