feat(commission) : add push notifications and unread ticket titles
CI / Verify (push) Successful in 1m48s
CI / Build immutable images and deploy (push) Successful in 2m47s

This commit is contained in:
2026-10-02 11:51:05 +07:00 Unverified
parent bb5c571837
commit 3473b55768
27 changed files with 4480 additions and 24 deletions
+21 -5
View File
@@ -2,15 +2,31 @@
import { useEffect } from "react";
import { useRouter } from "next/navigation";
import { parseCommissionMessageEvent } from "@/lib/commission/message-event";
export function CommissionLiveRefresh({ endpoint }: { endpoint: string }) {
export function CommissionLiveRefresh({ endpoint, userId }: { endpoint: string; userId: string }) {
const router = useRouter();
useEffect(() => {
const originalTitle = document.title;
let managedTitle = "";
let unread = 0;
const source = new EventSource(endpoint);
const refresh = () => router.refresh();
const refresh = (event: Event) => {
const message = parseCommissionMessageEvent((event as MessageEvent<string>).data);
if (message && message.authorId !== userId) {
unread += 1;
managedTitle = `(${unread}) ${message.ticketTitle}`;
document.title = managedTitle;
}
router.refresh();
};
const opened = () => router.refresh();
source.addEventListener("changed", refresh);
source.addEventListener("open", refresh);
return () => { source.removeEventListener("changed", refresh); source.removeEventListener("open", refresh); source.close(); };
}, [endpoint, router]);
source.addEventListener("open", opened);
return () => {
source.removeEventListener("changed", refresh); source.removeEventListener("open", opened); source.close();
if (managedTitle && document.title === managedTitle) document.title = originalTitle;
};
}, [endpoint, userId, router]);
return null;
}