ultisuite-client/components/gmail/mail-notifications-bridge.tsx
2026-05-25 13:52:40 +02:00

79 lines
2.4 KiB
TypeScript

"use client"
import { useCallback } from "react"
import { useRouter } from "next/navigation"
import { buildMailPath } from "@/lib/mail-url"
import { useWsEventListener } from "@/lib/api/ws"
import type { WsEvent } from "@/lib/api/types"
import { apiClient } from "@/lib/api/client"
import type { ApiMessageFull } from "@/lib/api/types"
import { useMailSettingsStore } from "@/lib/stores/mail-settings-store"
import {
isReplyOrMentionSubject,
showDesktopNotification,
} from "@/lib/notifications/desktop-notifications"
function mailEventPayload(evt: WsEvent): { message_id: string; account_id: string } | null {
const payload = evt.payload
if (!payload || typeof payload !== "object" || !("message_id" in payload)) return null
const messageId = String(payload.message_id ?? "")
if (!messageId) return null
return {
message_id: messageId,
account_id: String(payload.account_id ?? ""),
}
}
export function MailNotificationsBridge() {
const router = useRouter()
const desktopNewMail = useMailSettingsStore((s) => s.desktopNewMail)
const desktopMentions = useMailSettingsStore((s) => s.desktopMentions)
const soundEnabled = useMailSettingsStore((s) => s.soundEnabled)
const handleMailCreated = useCallback(
async (evt: WsEvent) => {
if (evt.type !== "mail.created") return
if (!desktopNewMail && !desktopMentions) return
const payload = mailEventPayload(evt)
if (!payload) return
let subject = "Nouveau message"
let sender = ""
try {
const message = await apiClient.get<ApiMessageFull>(
`/mail/messages/${payload.message_id}`
)
subject = message.subject?.trim() || subject
sender = message.from?.[0]?.name || message.from?.[0]?.address || ""
} catch {}
const isMention = isReplyOrMentionSubject(subject)
if (isMention && !desktopMentions) return
if (!isMention && !desktopNewMail) return
showDesktopNotification({
title: subject,
body: sender ? `De ${sender}` : undefined,
tag: payload.message_id,
playSound: soundEnabled,
onClick: () => {
router.push(
buildMailPath({
folderId: "inbox",
inboxTab: "primary",
page: 1,
mailId: payload.message_id,
})
)
},
})
},
[desktopMentions, desktopNewMail, router, soundEnabled]
)
useWsEventListener(handleMailCreated)
return null
}