From cbdb84f8c1741cc9e3e0fd59ef00aa2db3d3f726 Mon Sep 17 00:00:00 2001 From: Lewis Carhart Date: Tue, 11 Feb 2025 14:54:06 +0000 Subject: [PATCH] fix: coderabbit suggestions --- .../src/components/notification-center.tsx | 31 ++++++------ .../notifications/risk-task-notifications.ts | 50 ++++++++++--------- .../utils/task-email-notification.tsx | 50 +++++++++++-------- .../email/emails/reminders/task-reminder.tsx | 4 +- 4 files changed, 72 insertions(+), 63 deletions(-) diff --git a/apps/app/src/components/notification-center.tsx b/apps/app/src/components/notification-center.tsx index f63dfca..075cad3 100644 --- a/apps/app/src/components/notification-center.tsx +++ b/apps/app/src/components/notification-center.tsx @@ -9,7 +9,6 @@ import { ScrollArea } from "@bubba/ui/scroll-area"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@bubba/ui/tabs"; import { formatDistanceToNow } from "date-fns"; import Link from "next/link"; -import { type } from "os"; import { useEffect, useState } from "react"; function EmptyState({ description }: { description: string }) { @@ -29,17 +28,20 @@ function NotificationItem({ description, createdAt, recordId, + from, + to, markMessageAsRead, + type, }: { id: string; setOpen: (open: boolean) => void; - description: string; + description: string | undefined; createdAt: string; - recordId?: string; - from?: string; - to?: string; + recordId: string | undefined; + from: string | undefined; + to: string | undefined; markMessageAsRead: (id: string) => void; - type?: string; + type: string | undefined; }) { switch (type) { case "task": @@ -85,19 +87,14 @@ export function NotificationCenter() { const t = useI18n(); const [isOpen, setOpen] = useState(false); - const { hasUnseenNotifications, notifications, markMessageAsRead, markAllMessagesAsSeen, markAllMessagesAsRead, - subscriberId, } = useNotifications(); - console.log(subscriberId); - console.log(notifications); - const unreadNotifications = notifications.filter( (notification) => !notification.read, ); @@ -112,8 +109,6 @@ export function NotificationCenter() { } }, [hasUnseenNotifications, isOpen]); - console.log(notifications); - return ( @@ -172,9 +167,12 @@ export function NotificationCenter() { id={notification.id} markMessageAsRead={markMessageAsRead} setOpen={setOpen} - description={notification.payload.description || ""} + description={notification.payload.description} createdAt={notification.createdAt} recordId={notification.payload.recordId} + type={notification.payload.type} + from={notification.payload?.from} + to={notification.payload?.to} /> ); })} @@ -211,9 +209,12 @@ export function NotificationCenter() { key={notification.id} id={notification.id} setOpen={setOpen} - description={notification.payload.description || ""} + description={notification.payload.description} createdAt={notification.createdAt} recordId={notification.payload.recordId} + type={notification.payload.type} + from={notification.payload?.from} + to={notification.payload?.to} markMessageAsRead={markMessageAsRead} /> ); diff --git a/apps/app/src/jobs/tasks/notifications/risk-task-notifications.ts b/apps/app/src/jobs/tasks/notifications/risk-task-notifications.ts index 8a4af4e..3d950a6 100644 --- a/apps/app/src/jobs/tasks/notifications/risk-task-notifications.ts +++ b/apps/app/src/jobs/tasks/notifications/risk-task-notifications.ts @@ -46,11 +46,6 @@ export const sendRiskTaskNotifications = schedules.task({ for (const task of tasks) { const owner = task.owner; - if (!owner || !owner.email || !owner.organizationId) { - logger.warn(`Skipping task ${task.id} - owner ${owner?.id} missing email or organizationId`); - continue; - } - const timeUntilDue = task.dueDate ? formatDistance(task.dueDate, new Date(), { addSuffix: true, @@ -58,31 +53,38 @@ export const sendRiskTaskNotifications = schedules.task({ : "soon"; try { - await db.riskMitigationTask.update({ - where: { id: task.id }, - data: { notifiedAt: new Date() }, - }); + await db.$transaction(async (tx) => { + if (!owner || !owner.email || !owner.organizationId) { + logger.warn(`Skipping task ${task.id} - owner ${owner?.id} missing email or organizationId`); + return; + } - await trigger({ - name: TriggerEvents.TaskReminderInApp, - user: { - subscriberId: `${owner.organizationId}_${owner.id}`, - email: owner.email, - fullName: owner.name, - image: owner.image, - organizationId: owner.organizationId, - }, - payload: { - description: `${task.title} is due ${timeUntilDue}`, - recordId: `/risk/${task.riskId}/tasks/${task.id}`, - type: NotificationTypes.Task, - }, + await tx.riskMitigationTask.update({ + where: { id: task.id }, + data: { notifiedAt: new Date() }, + }); + + await trigger({ + name: TriggerEvents.TaskReminderInApp, + user: { + subscriberId: `${owner.organizationId}_${owner.id}`, + email: owner.email, + fullName: owner.name, + image: owner.image, + organizationId: owner.organizationId, + }, + payload: { + description: `${task.title} is due ${timeUntilDue}`, + recordId: `/risk/${task.riskId}/tasks/${task.id}`, + type: NotificationTypes.Task, + }, + }); }); notifiedTasks.push(task.id); } catch (error) { logger.error( - `Error processing task ${task.id} for ${owner.email}: ${error}`, + `Error processing task ${task.id} for ${owner?.email}: ${error}`, ); } } diff --git a/apps/app/src/jobs/tasks/notifications/utils/task-email-notification.tsx b/apps/app/src/jobs/tasks/notifications/utils/task-email-notification.tsx index 5dd394f..767bf89 100644 --- a/apps/app/src/jobs/tasks/notifications/utils/task-email-notification.tsx +++ b/apps/app/src/jobs/tasks/notifications/utils/task-email-notification.tsx @@ -16,28 +16,34 @@ interface Props { } export async function sendTaskEmailNotification({ owner, task }: Props) { - const html = await render( - , - ); + try { + const html = await render( + , + ); - const triggerData = { - name: TriggerEvents.TaskReminderEmail, - payload: { - subject: "Task Reminder", - html, - }, - replyTo: owner.email, - user: { - subscriberId: `${owner.organizationId}_${owner.id}`, - organizationId: owner.organizationId, - email: owner.email, - fullName: owner.fullName, - }, - }; + const triggerData = { + name: TriggerEvents.TaskReminderEmail, + payload: { + subject: "Task Reminder", + html, + }, + replyTo: owner.email, + user: { + subscriberId: `${owner.organizationId}_${owner.id}`, + organizationId: owner.organizationId, + email: owner.email, + fullName: owner.fullName, + }, + }; - await trigger(triggerData); + await trigger(triggerData); + } catch (error) { + console.error("Failed to send task email notification: ", error); + throw error; + } } diff --git a/packages/email/emails/reminders/task-reminder.tsx b/packages/email/emails/reminders/task-reminder.tsx index 83ba410..ad86abd 100644 --- a/packages/email/emails/reminders/task-reminder.tsx +++ b/packages/email/emails/reminders/task-reminder.tsx @@ -15,7 +15,7 @@ import { Footer } from "../../components/footer"; import { Logo } from "../../components/logo"; interface Props { - email?: string; + email: string; name: string; dueDate: string; recordId: string; @@ -27,7 +27,7 @@ export const TaskReminderEmail = ({ dueDate, recordId, }: Props) => { - const link = `${process.env.NEXT_PUBLIC_APP_URL}${recordId}`; + const link = `${process.env.NEXT_PUBLIC_APP_URL ?? "https://app.trycomp.ai"}${recordId}`; return (