refactor(web): extract optimistic timeline reconciliation
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
export type OptimisticTimelineEntryLike = {
|
||||
id: string;
|
||||
startDate: Date | string;
|
||||
endDate: Date | string;
|
||||
};
|
||||
|
||||
export type OptimisticTimelineOverrideLike = {
|
||||
startDate: Date;
|
||||
endDate: Date;
|
||||
};
|
||||
|
||||
export function reconcileOptimisticEntries(
|
||||
optimisticAllocations: ReadonlyMap<string, OptimisticTimelineOverrideLike>,
|
||||
entries: readonly OptimisticTimelineEntryLike[],
|
||||
pendingOptimisticAllocationId: string | null,
|
||||
): {
|
||||
optimisticAllocations: Map<string, OptimisticTimelineOverrideLike>;
|
||||
pendingOptimisticAllocationId: string | null;
|
||||
changed: boolean;
|
||||
} {
|
||||
if (optimisticAllocations.size === 0) {
|
||||
return {
|
||||
optimisticAllocations: new Map(optimisticAllocations),
|
||||
pendingOptimisticAllocationId,
|
||||
changed: false,
|
||||
};
|
||||
}
|
||||
|
||||
const next = new Map(optimisticAllocations);
|
||||
let nextPendingId = pendingOptimisticAllocationId;
|
||||
|
||||
for (const entry of entries) {
|
||||
const override = next.get(entry.id);
|
||||
if (!override) continue;
|
||||
|
||||
const startTime = new Date(entry.startDate).getTime();
|
||||
const endTime = new Date(entry.endDate).getTime();
|
||||
if (startTime === override.startDate.getTime() && endTime === override.endDate.getTime()) {
|
||||
next.delete(entry.id);
|
||||
if (nextPendingId === entry.id) {
|
||||
nextPendingId = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
optimisticAllocations: next,
|
||||
pendingOptimisticAllocationId: nextPendingId,
|
||||
changed: next.size !== optimisticAllocations.size || nextPendingId !== pendingOptimisticAllocationId,
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user