mirror of
https://github.com/Sea-Haven-Industries/shoc-frontend-new.git
synced 2026-10-02 00:23:13 +00:00
# Conflicts: # src/app/(protected)/workorders/_components/detail/use-slide-over-edit-state.ts # src/app/(protected)/workorders/_components/detail/use-work-order-slide-over.ts # src/app/(protected)/workorders/_components/detail/work-order-slide-over.tsx # src/app/(protected)/workorders/_components/list/work-orders-list-page-panels.tsx # src/app/(protected)/workorders/_hooks/use-work-orders-list-page.ts
49 lines
1.8 KiB
TypeScript
49 lines
1.8 KiB
TypeScript
import { useMemo } from "react";
|
|
import { useNavigate } from "react-router";
|
|
import type { NotificationItem } from "@/domain/notifications/types/notification-feed";
|
|
import { useNotificationSession } from "@/domain/notifications/session/notification-session-context";
|
|
import { useNotificationFeed } from "@/domain/notifications/use-cases/use-notification-feed";
|
|
import { notificationTargetUrl } from "@/domain/notifications/utils/notification-target-url";
|
|
import {
|
|
isDismissable,
|
|
visibleNotificationSections,
|
|
} from "@/domain/notifications/utils/visible-notification-sections";
|
|
import { useAuthContext } from "@/providers/auth-context";
|
|
|
|
export function useNotificationCenter(onNavigate?: () => void) {
|
|
const navigate = useNavigate();
|
|
const { user } = useAuthContext();
|
|
const feed = useNotificationFeed();
|
|
const { dismissedIds, readIds, dismiss, markRead } = useNotificationSession();
|
|
|
|
const sections = useMemo(
|
|
() => visibleNotificationSections(feed.data?.sections ?? [], dismissedIds),
|
|
[feed.data, dismissedIds],
|
|
);
|
|
const items = useMemo(() => sections.flatMap((section) => section.items), [sections]);
|
|
const unreadIds = useMemo(
|
|
() => new Set(items.filter((item) => !readIds.has(item.id)).map((item) => item.id)),
|
|
[items, readIds],
|
|
);
|
|
|
|
const open = (item: NotificationItem, url = notificationTargetUrl(item, user?.id)) => {
|
|
markRead([item.id]);
|
|
if (url == null) return;
|
|
onNavigate?.();
|
|
navigate(url);
|
|
};
|
|
|
|
return {
|
|
sections,
|
|
unreadIds,
|
|
isLoading: feed.isLoading,
|
|
hasData: feed.data != null,
|
|
error: feed.error,
|
|
open,
|
|
dismiss: (item: NotificationItem) => dismiss([item.id]),
|
|
dismissAll: () => dismiss(items.filter(isDismissable).map((item) => item.id)),
|
|
markAllRead: () => markRead(items.map((item) => item.id)),
|
|
};
|
|
}
|
|
|
|
export type NotificationCenter = ReturnType<typeof useNotificationCenter>;
|