refactor(web): extract timeline sse invalidation policy
This commit is contained in:
@@ -3,6 +3,7 @@
|
||||
import { SSE_EVENT_TYPES } from "@capakraken/shared";
|
||||
import { useQueryClient } from "@tanstack/react-query";
|
||||
import { useEffect, useRef } from "react";
|
||||
import { getTimelineSseInvalidationKeys, parseTimelineSseEvent } from "./timelineSsePolicy.js";
|
||||
|
||||
/**
|
||||
* Connects to the SSE timeline endpoint and invalidates React Query caches
|
||||
@@ -37,64 +38,18 @@ export function useTimelineSSE() {
|
||||
};
|
||||
|
||||
es.onmessage = (event) => {
|
||||
try {
|
||||
const data = JSON.parse(event.data as string) as { type: string };
|
||||
const eventType = parseTimelineSseEvent(String(event.data));
|
||||
if (!eventType) {
|
||||
return;
|
||||
}
|
||||
|
||||
switch (data.type) {
|
||||
case SSE_EVENT_TYPES.ALLOCATION_CREATED:
|
||||
case SSE_EVENT_TYPES.ALLOCATION_UPDATED:
|
||||
case SSE_EVENT_TYPES.ALLOCATION_DELETED:
|
||||
case SSE_EVENT_TYPES.VACATION_CREATED:
|
||||
case SSE_EVENT_TYPES.VACATION_UPDATED:
|
||||
case SSE_EVENT_TYPES.VACATION_DELETED:
|
||||
void queryClient.invalidateQueries({ queryKey: [["timeline", "getEntries"]] });
|
||||
void queryClient.invalidateQueries({ queryKey: [["timeline", "getEntriesView"]] });
|
||||
void queryClient.invalidateQueries({ queryKey: [["timeline", "getMyEntriesView"]] });
|
||||
void queryClient.invalidateQueries({ queryKey: [["timeline", "getHolidayOverlays"]] });
|
||||
void queryClient.invalidateQueries({ queryKey: [["timeline", "getMyHolidayOverlays"]] });
|
||||
void queryClient.invalidateQueries({ queryKey: [["vacation", "list"]] });
|
||||
void queryClient.invalidateQueries({ queryKey: [["allocation", "list"]] });
|
||||
break;
|
||||
if (eventType === SSE_EVENT_TYPES.PING) {
|
||||
reconnectAttempts = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
case SSE_EVENT_TYPES.PROJECT_SHIFTED:
|
||||
void queryClient.invalidateQueries({ queryKey: [["timeline", "getEntries"]] });
|
||||
void queryClient.invalidateQueries({ queryKey: [["timeline", "getEntriesView"]] });
|
||||
void queryClient.invalidateQueries({ queryKey: [["timeline", "getMyEntriesView"]] });
|
||||
void queryClient.invalidateQueries({ queryKey: [["timeline", "getHolidayOverlays"]] });
|
||||
void queryClient.invalidateQueries({ queryKey: [["timeline", "getMyHolidayOverlays"]] });
|
||||
void queryClient.invalidateQueries({ queryKey: [["project", "list"]] });
|
||||
break;
|
||||
|
||||
case SSE_EVENT_TYPES.BUDGET_WARNING:
|
||||
void queryClient.invalidateQueries({ queryKey: [["timeline", "getBudgetStatus"]] });
|
||||
break;
|
||||
|
||||
case SSE_EVENT_TYPES.NOTIFICATION_CREATED:
|
||||
void queryClient.invalidateQueries({ queryKey: [["notification", "list"]] });
|
||||
void queryClient.invalidateQueries({ queryKey: [["notification", "unreadCount"]] });
|
||||
break;
|
||||
|
||||
case SSE_EVENT_TYPES.TASK_ASSIGNED:
|
||||
case SSE_EVENT_TYPES.TASK_COMPLETED:
|
||||
case SSE_EVENT_TYPES.TASK_STATUS_CHANGED:
|
||||
void queryClient.invalidateQueries({ queryKey: [["notification", "listTasks"]] });
|
||||
void queryClient.invalidateQueries({ queryKey: [["notification", "taskCounts"]] });
|
||||
void queryClient.invalidateQueries({ queryKey: [["notification", "unreadCount"]] });
|
||||
void queryClient.invalidateQueries({ queryKey: [["notification", "list"]] });
|
||||
break;
|
||||
|
||||
case SSE_EVENT_TYPES.REMINDER_DUE:
|
||||
void queryClient.invalidateQueries({ queryKey: [["notification", "list"]] });
|
||||
void queryClient.invalidateQueries({ queryKey: [["notification", "unreadCount"]] });
|
||||
void queryClient.invalidateQueries({ queryKey: [["notification", "listReminders"]] });
|
||||
break;
|
||||
|
||||
case SSE_EVENT_TYPES.PING:
|
||||
reconnectAttempts = 0; // Reset on successful ping
|
||||
break;
|
||||
}
|
||||
} catch {
|
||||
// Ignore parse errors
|
||||
for (const queryKey of getTimelineSseInvalidationKeys(eventType)) {
|
||||
void queryClient.invalidateQueries({ queryKey });
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user