diff --git a/packages/browseros-agent/apps/agent/entrypoints/app/scheduled-tasks/ScheduledTasksPage.tsx b/packages/browseros-agent/apps/agent/entrypoints/app/scheduled-tasks/ScheduledTasksPage.tsx index d45dde176..1ecfa97e9 100644 --- a/packages/browseros-agent/apps/agent/entrypoints/app/scheduled-tasks/ScheduledTasksPage.tsx +++ b/packages/browseros-agent/apps/agent/entrypoints/app/scheduled-tasks/ScheduledTasksPage.tsx @@ -22,9 +22,7 @@ import { SCHEDULED_TASK_TOGGLED_EVENT, SCHEDULED_TASK_VIEW_RESULTS_EVENT, } from '@/lib/constants/analyticsEvents' -import { useGraphqlMutation } from '@/lib/graphql/useGraphqlMutation' import { track } from '@/lib/metrics/track' -import { DeleteScheduledJobDocument } from '@/lib/schedules/graphql/syncSchedulesDocument' import { scheduledJobRunStorage, useScheduledJobRuns, @@ -46,8 +44,6 @@ export const ScheduledTasksPage: FC = () => { useScheduledJobs() const { jobRuns, cancelJobRun } = useScheduledJobRuns() - const deleteRemoteJobMutation = useGraphqlMutation(DeleteScheduledJobDocument) - const [activeTab, setActiveTab] = useState(null) const [isDialogOpen, setIsDialogOpen] = useState(false) const [editingJob, setEditingJob] = useState(null) @@ -102,7 +98,6 @@ export const ScheduledTasksPage: FC = () => { const confirmDelete = async () => { if (deleteJobId) { await removeJob(deleteJobId) - deleteRemoteJobMutation.mutate({ rowId: deleteJobId }) setDeleteJobId(null) track(SCHEDULED_TASK_DELETED_EVENT) } diff --git a/packages/browseros-agent/apps/agent/lib/schedules/scheduleStorage.ts b/packages/browseros-agent/apps/agent/lib/schedules/scheduleStorage.ts index c54041d0b..54e31613d 100644 --- a/packages/browseros-agent/apps/agent/lib/schedules/scheduleStorage.ts +++ b/packages/browseros-agent/apps/agent/lib/schedules/scheduleStorage.ts @@ -22,6 +22,13 @@ export const scheduledJobRunStorage = storage.defineItem( }, ) +export const pendingDeletionStorage = storage.defineItem( + 'local:scheduledJobsPendingDeletion', + { + fallback: [], + }, +) + export function useScheduledJobs() { const [jobs, setJobs] = useState([]) @@ -54,6 +61,11 @@ export function useScheduledJobs() { const removeJob = async (id: string) => { await chrome.alarms.clear(getAlarmName(id)) + const pending = (await pendingDeletionStorage.getValue()) ?? [] + if (!pending.includes(id)) { + await pendingDeletionStorage.setValue([...pending, id]) + } + const currentJobs = (await scheduledJobStorage.getValue()) ?? [] await scheduledJobStorage.setValue(currentJobs.filter((j) => j.id !== id)) diff --git a/packages/browseros-agent/apps/agent/lib/schedules/syncSchedulesToBackend.ts b/packages/browseros-agent/apps/agent/lib/schedules/syncSchedulesToBackend.ts index 41e7dede5..f50d2ca4b 100644 --- a/packages/browseros-agent/apps/agent/lib/schedules/syncSchedulesToBackend.ts +++ b/packages/browseros-agent/apps/agent/lib/schedules/syncSchedulesToBackend.ts @@ -5,10 +5,11 @@ import { sentry } from '@/lib/sentry/sentry' import { createAlarmFromJob } from './createAlarmFromJob' import { CreateScheduledJobDocument, + DeleteScheduledJobDocument, GetScheduledJobsByProfileIdDocument, UpdateScheduledJobDocument, } from './graphql/syncSchedulesDocument' -import { scheduledJobStorage } from './scheduleStorage' +import { pendingDeletionStorage, scheduledJobStorage } from './scheduleStorage' import type { ScheduledJob } from './scheduleTypes' type RemoteScheduledJob = { @@ -99,6 +100,27 @@ export async function syncSchedulesToBackend( } } + const pendingDeletions = new Set( + (await pendingDeletionStorage.getValue()) ?? [], + ) + + for (const rowId of pendingDeletions) { + if (remoteJobs.has(rowId)) { + try { + await execute(DeleteScheduledJobDocument, { rowId }) + remoteJobs.delete(rowId) + pendingDeletions.delete(rowId) + } catch (error) { + sentry.captureException(error, { + extra: { jobId: rowId, context: 'sync-pending-deletion' }, + }) + } + } else { + pendingDeletions.delete(rowId) + } + } + await pendingDeletionStorage.setValue([...pendingDeletions]) + const localJobsMap = new Map(localJobs.map((j) => [j.id, j])) const jobsToAddLocally: ScheduledJob[] = [] const jobsToUpdateLocally: ScheduledJob[] = []