improvement: notify counter badge added to treatment and tasks tabs for upadted and edited cases.
This commit is contained in:
60
frontend/src/lib/hooks/useTabBadgeCounts.ts
Normal file
60
frontend/src/lib/hooks/useTabBadgeCounts.ts
Normal file
@@ -0,0 +1,60 @@
|
||||
'use client';
|
||||
|
||||
import { useCallback, useEffect, useState } from 'react';
|
||||
import { usePathname } from '@/i18n/navigation';
|
||||
import { notificationsApi } from '@/lib/api/notifications';
|
||||
import {
|
||||
tabBadgesChangedEventName,
|
||||
tabFromPathname,
|
||||
type TabBadgeCounts,
|
||||
} from '@/lib/tabBadgeUtils';
|
||||
import { useAuth } from '@/lib/hooks/useAuth';
|
||||
|
||||
const EMPTY_COUNTS: TabBadgeCounts = {};
|
||||
|
||||
export function useTabBadgeCounts(): TabBadgeCounts {
|
||||
const pathname = usePathname();
|
||||
const { currentOrganization } = useAuth();
|
||||
const [counts, setCounts] = useState<TabBadgeCounts>(EMPTY_COUNTS);
|
||||
|
||||
const fetchCounts = useCallback(async () => {
|
||||
if (!currentOrganization?.id) {
|
||||
setCounts(EMPTY_COUNTS);
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
const res = await notificationsApi.tabCounts();
|
||||
setCounts(res.data ?? EMPTY_COUNTS);
|
||||
} catch {
|
||||
setCounts(EMPTY_COUNTS);
|
||||
}
|
||||
}, [currentOrganization?.id]);
|
||||
|
||||
useEffect(() => {
|
||||
void fetchCounts();
|
||||
}, [fetchCounts, pathname]);
|
||||
|
||||
useEffect(() => {
|
||||
const onChanged = () => void fetchCounts();
|
||||
window.addEventListener(tabBadgesChangedEventName(), onChanged);
|
||||
return () => window.removeEventListener(tabBadgesChangedEventName(), onChanged);
|
||||
}, [fetchCounts]);
|
||||
|
||||
return counts;
|
||||
}
|
||||
|
||||
export function useMarkTabReadOnVisit() {
|
||||
const pathname = usePathname();
|
||||
const { currentOrganization } = useAuth();
|
||||
|
||||
useEffect(() => {
|
||||
const tab = tabFromPathname(pathname);
|
||||
// Cases tab badge clears per opened case (mark-case-read), not on tab visit.
|
||||
if (!tab || tab === 'CASES' || !currentOrganization?.id) return;
|
||||
|
||||
void notificationsApi.markTabRead(tab).then(() => {
|
||||
window.dispatchEvent(new Event(tabBadgesChangedEventName()));
|
||||
});
|
||||
}, [pathname, currentOrganization?.id]);
|
||||
}
|
||||
Reference in New Issue
Block a user