From 85e5828cc80e4272893af8db71cfec886ce725b0 Mon Sep 17 00:00:00 2001 From: Anshuman Pandey <54475686+pandeymangg@users.noreply.github.com> Date: Fri, 29 Mar 2024 21:36:51 +0530 Subject: [PATCH] fix: hotfix for sync validation errors (#2364) --- packages/lib/i18n/reverseTranslation.ts | 7 +++++++ packages/lib/i18n/utils.ts | 7 +------ packages/lib/survey/service.ts | 18 +++++------------- packages/types/surveys.ts | 4 +++- 4 files changed, 16 insertions(+), 20 deletions(-) diff --git a/packages/lib/i18n/reverseTranslation.ts b/packages/lib/i18n/reverseTranslation.ts index 4e1f7953a1..d2d2872546 100644 --- a/packages/lib/i18n/reverseTranslation.ts +++ b/packages/lib/i18n/reverseTranslation.ts @@ -34,6 +34,13 @@ export const reverseTranslateSurvey = (survey: TSurvey, languageCode: string = " reversedSurvey.questions = reversedSurvey.questions.map((question) => reverseTranslateObject(question, languageCode) ); + + // check if the headline is an empty object, if so, add a "default" key + // TODO: This is a temporary fix, should be handled propperly + if (Object.keys(reversedSurvey.welcomeCard.headline).length === 0) { + reversedSurvey.welcomeCard.headline = { default: "" }; + } + reversedSurvey.welcomeCard = reverseTranslateObject(reversedSurvey.welcomeCard, languageCode); reversedSurvey.thankYouCard = reverseTranslateObject(reversedSurvey.thankYouCard, languageCode); // validate the type with zod diff --git a/packages/lib/i18n/utils.ts b/packages/lib/i18n/utils.ts index 3ee77da0ae..1e2605bbe0 100644 --- a/packages/lib/i18n/utils.ts +++ b/packages/lib/i18n/utils.ts @@ -80,12 +80,7 @@ export const createI18nString = ( // Type guard to check if an object is an I18nString export function isI18nObject(obj: any): obj is TI18nString { - return ( - obj !== null && - typeof obj === "object" && - Object.values(obj).every((value) => typeof value !== "undefined") && - Object.keys(obj).includes("default") - ); + return typeof obj === "object" && obj !== null && Object.keys(obj).includes("default"); } export const isLabelValidForAllLanguages = (label: TI18nString, languages: string[]): boolean => { diff --git a/packages/lib/survey/service.ts b/packages/lib/survey/service.ts index 2ef2a4ab45..81fc4b2c91 100644 --- a/packages/lib/survey/service.ts +++ b/packages/lib/survey/service.ts @@ -31,7 +31,7 @@ import { subscribeTeamMembersToSurveyResponses } from "../team/service"; import { diffInDays, formatDateFields } from "../utils/datetime"; import { validateInputs } from "../utils/validate"; import { surveyCache } from "./cache"; -import { anySurveyHasFilters } from "./util"; +import { anySurveyHasFilters, formatSurveyDateFields } from "./util"; interface TriggerUpdate { create?: Array<{ actionClassId: string }>; @@ -343,24 +343,16 @@ export const getSurveys = async ( // since the unstable_cache function does not support deserialization of dates, we need to manually deserialize them // https://github.com/vercel/next.js/issues/51613 - return surveys.map((survey) => formatDateFields(survey, ZSurvey)); + return surveys.map((survey) => formatSurveyDateFields(survey)); }; export const transformToLegacySurvey = async ( survey: TSurvey, languageCode?: string ): Promise => { - const transformedSurvey = await unstable_cache( - async () => { - const targetLanguage = languageCode ?? "default"; - return reverseTranslateSurvey(survey, targetLanguage); - }, - [`transformToLegacySurvey-${survey.id}-${languageCode}`], - { - tags: [surveyCache.tag.byId(survey.id)], - revalidate: SERVICES_REVALIDATION_INTERVAL, - } - )(); + const targetLanguage = languageCode ?? "default"; + const transformedSurvey = reverseTranslateSurvey(survey, targetLanguage); + return formatDateFields(transformedSurvey, ZLegacySurvey); }; diff --git a/packages/types/surveys.ts b/packages/types/surveys.ts index 3106aa0f97..bbad613b03 100644 --- a/packages/types/surveys.ts +++ b/packages/types/surveys.ts @@ -7,7 +7,9 @@ import { ZLanguage } from "./product"; import { ZSegment } from "./segment"; import { ZBaseStyling } from "./styling"; -export const ZI18nString = z.record(z.string(), z.string()); +export const ZI18nString = z.record(z.string()).refine((obj) => "default" in obj, { + message: "Object must have a 'default' key", +}); export type TI18nString = z.infer;