diff --git a/apps/web/src/app/(dashboard)/contacts/[contactBookId]/edit-contact.tsx b/apps/web/src/app/(dashboard)/contacts/[contactBookId]/edit-contact.tsx index 78f9f86..f46204c 100644 --- a/apps/web/src/app/(dashboard)/contacts/[contactBookId]/edit-contact.tsx +++ b/apps/web/src/app/(dashboard)/contacts/[contactBookId]/edit-contact.tsx @@ -92,6 +92,10 @@ export const EditContact: React.FC<{ }); async function onContactUpdate(values: z.infer) { + const properties: Record = Object.fromEntries( + Object.entries(variableValues).filter(([, value]) => value.trim()), + ); + updateContactMutation.mutate( { contactId: contact.id, @@ -100,11 +104,9 @@ export const EditContact: React.FC<{ properties: replaceContactVariableValues( (contact.properties as Record | null | undefined) ?? {}, - Object.fromEntries( - Object.entries(variableValues).filter(([, value]) => value.trim()), - ), + properties, contactBookVariables ?? [], - ), + ) as Record, }, { onSuccess: async () => { @@ -155,7 +157,7 @@ export const EditContact: React.FC<{ ( + render={({ field }) => ( First Name @@ -167,7 +169,7 @@ export const EditContact: React.FC<{ ( + render={({ field }) => ( Last Name diff --git a/apps/web/src/server/service/contact-book-service.ts b/apps/web/src/server/service/contact-book-service.ts index b693618..5d9bcf9 100644 --- a/apps/web/src/server/service/contact-book-service.ts +++ b/apps/web/src/server/service/contact-book-service.ts @@ -149,6 +149,7 @@ export async function updateContactBook( emoji?: string; variables?: string[]; doubleOptInEnabled?: boolean; + doubleOptInFrom?: string | null; doubleOptInSubject?: string; doubleOptInContent?: string; } = { diff --git a/apps/web/src/server/service/contact-service.ts b/apps/web/src/server/service/contact-service.ts index 8a16f98..a3f32ed 100644 --- a/apps/web/src/server/service/contact-service.ts +++ b/apps/web/src/server/service/contact-service.ts @@ -1,4 +1,4 @@ -import { type Contact, UnsubscribeReason } from "@prisma/client"; +import { Prisma, type Contact, UnsubscribeReason } from "@prisma/client"; import { type ContactPayload, type ContactWebhookEventType, @@ -106,7 +106,7 @@ export async function addOrUpdateContact( email: contact.email, firstName: contact.firstName, lastName: contact.lastName, - properties: normalizedProperties ?? {}, + properties: (normalizedProperties ?? {}) as Prisma.InputJsonObject, subscribed: shouldCreatePendingContact ? false : (contact.subscribed ?? true), @@ -120,7 +120,7 @@ export async function addOrUpdateContact( firstName: contact.firstName, lastName: contact.lastName, ...(mergedProperties !== undefined - ? { properties: mergedProperties } + ? { properties: mergedProperties as Prisma.InputJsonObject } : {}), ...(subscribedValue !== undefined ? { @@ -210,7 +210,7 @@ export async function updateContactInContactBook( data: { ...contact, ...(mergedProperties !== undefined - ? { properties: mergedProperties } + ? { properties: mergedProperties as Prisma.InputJsonObject } : {}), ...(contact.subscribed !== undefined ? { diff --git a/apps/web/src/server/utils/email-content.unit.test.ts b/apps/web/src/server/utils/email-content.unit.test.ts index d7f1dbe..927b531 100644 --- a/apps/web/src/server/utils/email-content.unit.test.ts +++ b/apps/web/src/server/utils/email-content.unit.test.ts @@ -3,7 +3,7 @@ import { escapeHtml, toPlainHtml } from "~/server/utils/email-content"; describe("email-content utils", () => { it("escapes unsafe HTML characters", () => { - const value = ``; + const value = ``; expect(escapeHtml(value)).toBe( "<script>alert('x') & "y"</script>", ); diff --git a/apps/web/src/store/upgradeModalStore.ts b/apps/web/src/store/upgradeModalStore.ts index 72b4ec0..992ee61 100644 --- a/apps/web/src/store/upgradeModalStore.ts +++ b/apps/web/src/store/upgradeModalStore.ts @@ -1,20 +1,25 @@ -import { create } from "zustand"; +import { create, type StateCreator } from "zustand"; import { LimitReason } from "~/lib/constants/plans"; +const createUpgradeModalActions = ( + set: Parameters>[0], +) => ({ + openModal: (reason?: LimitReason) => set({ isOpen: true, reason }), + closeModal: () => set({ isOpen: false, reason: undefined }), +}); + interface UpgradeModalStore { isOpen: boolean; reason?: LimitReason; - action: { - openModal: (reason?: LimitReason) => void; - closeModal: () => void; - }; + action: ReturnType; } -export const useUpgradeModalStore = create((set) => ({ +const createUpgradeModalStore: StateCreator = (set) => ({ isOpen: false, reason: undefined, - action: { - openModal: (reason?: LimitReason) => set({ isOpen: true, reason }), - closeModal: () => set({ isOpen: false, reason: undefined }), - }, -})); + action: createUpgradeModalActions(set), +}); + +export const useUpgradeModalStore = create( + createUpgradeModalStore, +);