Files
sendou.ink/app/features/chat/ChatMentionNotification.server.ts
2026-10-23 18:35:27 +03:00

48 lines
1.4 KiB
TypeScript

import { notify } from "~/features/notifications/core/notify.server";
import * as NotificationRepository from "~/features/notifications/NotificationRepository.server";
import { hasPermission } from "~/modules/permissions/utils";
import { avatarUrl } from "~/utils/urls";
import type * as ChatRoomResolver from "./ChatRoomResolver.server";
import type { ChatMessageWithAuthor } from "./chat-types";
import * as Mentions from "./core/Mentions";
export async function notifyMentioned({
room,
message,
}: {
room: ChatRoomResolver.ResolvedRoom;
message: ChatMessageWithAuthor;
}) {
if (!message.contents || !message.author) return;
const recipientIds = Mentions.mentionedUserIds(message.contents).filter(
(userId) =>
userId !== message.authorUserId &&
hasPermission(room, "VIEW", { id: userId }),
);
const alreadyNotifiedIds =
await NotificationRepository.findUserIdsWithUnseenByType({
userIds: recipientIds,
type: "CHAT_MENTION",
meta: { roomId: room.roomId },
});
await notify({
userIds: recipientIds.filter(
(userId) => !alreadyNotifiedIds.includes(userId),
),
notification: {
type: "CHAT_MENTION",
meta: {
roomId: room.roomId,
messageId: message.id,
mentionerUsername: message.author.username,
roomUrl: room.url,
},
pictureUrl: message.author.avatar
? avatarUrl(message.author.avatar, "sm")
: undefined,
},
});
}