import { mergeDeltaRows } from "@govoplan/core-webui"; import type { CampaignJobsDeltaResponse, CampaignJobsResponse } from "../../../api/campaigns"; export function emptyCampaignJobsResponse(): CampaignJobsResponse { return { jobs: [], page: 1, page_size: 50, total: 0, total_unfiltered: 0, pages: 0, cursor: null, next_cursor: null, counts: {}, filtered_counts: {}, review: {} }; } export function mergeCampaignJobsDelta(current: CampaignJobsResponse, response: CampaignJobsDeltaResponse): CampaignJobsResponse { if (response.full) return campaignJobsResponseFromDelta(response); return { ...campaignJobsResponseFromDelta(response), jobs: mergeDeltaRows(current.jobs, response.jobs, response.deleted, (row) => String(row.id ?? ""), { deletedResourceType: "campaign_job", sort: sortJobsByEntry }), cursor: response.cursor ?? current.cursor, next_cursor: response.next_cursor ?? current.next_cursor }; } export function campaignJobsResponseFromDelta(response: CampaignJobsDeltaResponse): CampaignJobsResponse { return { jobs: response.jobs, page: response.page, page_size: response.page_size, total: response.total, total_unfiltered: response.total_unfiltered, pages: response.pages, cursor: response.cursor, next_cursor: response.next_cursor, counts: response.counts, filtered_counts: response.filtered_counts, review: response.review }; } function sortJobsByEntry(left: Record, right: Record): number { const indexDelta = Number(left.entry_index ?? 0) - Number(right.entry_index ?? 0); if (indexDelta !== 0) return indexDelta; return String(left.id ?? "").localeCompare(String(right.id ?? "")); }