diff --git a/apps/web/app/(app)/[emailAccountId]/assistant/Rules.tsx b/apps/web/app/(app)/[emailAccountId]/assistant/Rules.tsx index 3371f71dd8..ea6a4e53d3 100644 --- a/apps/web/app/(app)/[emailAccountId]/assistant/Rules.tsx +++ b/apps/web/app/(app)/[emailAccountId]/assistant/Rules.tsx @@ -150,6 +150,22 @@ export function Rules({ size = "md" }: { size?: "sm" | "md" }) { url: null, } : null, + emailAccountData?.coldEmailDigest + ? { + id: "cold-email-blocker-digest", + type: ActionType.DIGEST, + label: null, + createdAt: new Date(), + updatedAt: new Date(), + ruleId: COLD_EMAIL_BLOCKER_RULE_ID, + to: null, + subject: null, + content: null, + cc: null, + bcc: null, + url: null, + } + : null, ].filter(isDefined), categoryFilters: [], group: null, diff --git a/apps/web/app/(app)/[emailAccountId]/settings/DigestItemsForm.tsx b/apps/web/app/(app)/[emailAccountId]/settings/DigestItemsForm.tsx index 49ee2bd098..02bf03151a 100644 --- a/apps/web/app/(app)/[emailAccountId]/settings/DigestItemsForm.tsx +++ b/apps/web/app/(app)/[emailAccountId]/settings/DigestItemsForm.tsx @@ -1,6 +1,7 @@ import { useCallback, useEffect } from "react"; import { useForm, type SubmitHandler } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; +import useSWR from "swr"; import { Label } from "@/components/ui/label"; import { Button } from "@/components/ui/button"; import { toastError, toastSuccess } from "@/components/Toast"; @@ -14,10 +15,26 @@ import { } from "@/utils/actions/settings.validation"; import { ActionType } from "@prisma/client"; import { useAccount } from "@/providers/EmailAccountProvider"; +import type { GetDigestSettingsResponse } from "@/app/api/user/digest-settings/route"; +import { Skeleton } from "@/components/ui/skeleton"; export function DigestItemsForm() { const { emailAccountId } = useAccount(); - const { data: rules, isLoading, error, mutate } = useRules(); + const { + data: rules, + isLoading: rulesLoading, + error: rulesError, + mutate: mutateRules, + } = useRules(); + const { + data: digestSettings, + isLoading: digestLoading, + error: digestError, + mutate: mutateDigestSettings, + } = useSWR("/api/user/digest-settings"); + + const isLoading = rulesLoading || digestLoading; + const error = rulesError || digestError; const { handleSubmit, @@ -29,14 +46,16 @@ export function DigestItemsForm() { resolver: zodResolver(updateDigestItemsBody), defaultValues: { ruleDigestPreferences: {}, + coldEmailDigest: false, }, }); const ruleDigestPreferences = watch("ruleDigestPreferences"); + const coldEmailDigest = watch("coldEmailDigest"); - // Initialize preferences from rules data + // Initialize preferences from rules and digest settings data useEffect(() => { - if (rules) { + if (rules && digestSettings) { const preferences: Record = {}; rules.forEach((rule) => { preferences[rule.id] = rule.actions.some( @@ -45,9 +64,10 @@ export function DigestItemsForm() { }); reset({ ruleDigestPreferences: preferences, + coldEmailDigest: digestSettings.coldEmail || false, }); } - }, [rules, reset]); + }, [rules, digestSettings, reset]); const handleRuleDigestToggle = useCallback( (ruleId: string, enabled: boolean) => { @@ -56,6 +76,13 @@ export function DigestItemsForm() { [setValue], ); + const handleColdEmailDigestToggle = useCallback( + (enabled: boolean) => { + setValue("coldEmailDigest", enabled); + }, + [setValue], + ); + const onSubmit: SubmitHandler = useCallback( async (data) => { const result = await updateDigestItemsAction(emailAccountId, data); @@ -67,33 +94,37 @@ export function DigestItemsForm() { }); } else { toastSuccess({ description: "Your digest items have been updated!" }); - mutate(); + mutateRules(); + mutateDigestSettings(); } }, - [mutate, emailAccountId], + [mutateRules, mutateDigestSettings, emailAccountId], ); return ( - + } + >
{rules?.map((rule) => ( -
-
- {rule.name} -
- handleRuleDigestToggle(rule.id, enabled)} - /> -
+ label={rule.name} + enabled={ruleDigestPreferences[rule.id] ?? false} + onChange={(enabled) => handleRuleDigestToggle(rule.id, enabled)} + /> ))} + +