feat: Refactor Triggers and combine Action Classes and Inline Triggers (#2562)

Co-authored-by: Matthias Nannt <mail@matthiasnannt.com>
Co-authored-by: pandeymangg <anshuman.pandey9999@gmail.com>
Co-authored-by: Johannes <johannes@formbricks.com>
This commit is contained in:
Piyush Gupta
2024-05-07 19:17:41 +05:30
committed by GitHub
parent b016d80cb2
commit 6bfd02794d
64 changed files with 1260 additions and 1381 deletions
@@ -1,11 +0,0 @@
import { TJsAppState, TJsLegacyState } from "@formbricks/types/js";
export const transformLegacySurveys = (state: TJsAppState): TJsLegacyState => {
const updatedState: any = { ...state };
updatedState.surveys = updatedState.surveys.map((survey) => {
const updatedSurvey = { ...survey };
updatedSurvey.triggers = updatedSurvey.triggers.map((trigger) => ({ name: trigger }));
return updatedSurvey;
});
return { ...updatedState, session: {} };
};
@@ -25,7 +25,7 @@ import { TSurvey } from "@formbricks/types/surveys";
export const transformLegacySurveys = (surveys: TSurvey[]): TSurveyWithTriggers[] => {
const updatedSurveys = surveys.map((survey) => {
const updatedSurvey: any = { ...reverseTranslateSurvey(survey) };
updatedSurvey.triggers = updatedSurvey.triggers.map((trigger) => ({ name: trigger }));
updatedSurvey.triggers = updatedSurvey.triggers.map((trigger) => ({ name: trigger.actionClass.name }));
return updatedSurvey;
});
return updatedSurveys;
@@ -23,7 +23,7 @@ import {
import { isVersionGreaterThanOrEqualTo } from "@formbricks/lib/utils/version";
import { TLegacySurvey } from "@formbricks/types/LegacySurvey";
import { TEnvironment } from "@formbricks/types/environment";
import { TJsAppStateSync, ZJsPeopleUserIdInput } from "@formbricks/types/js";
import { TJsAppLegacyStateSync, TJsAppStateSync, ZJsPeopleUserIdInput } from "@formbricks/types/js";
import { TProduct } from "@formbricks/types/product";
import { TSurvey } from "@formbricks/types/surveys";
@@ -135,7 +135,7 @@ export async function GET(
await sendFreeLimitReachedEventToPosthogBiWeekly(environmentId, "inAppSurvey");
}
const [surveys, noCodeActionClasses, product] = await Promise.all([
const [surveys, actionClasses, product] = await Promise.all([
getSyncSurveys(environmentId, person.id, device.type === "mobile" ? "phone" : "desktop", {
version: version ?? undefined,
}),
@@ -147,25 +147,6 @@ export async function GET(
throw new Error("Product not found");
}
// Define 'transformedSurveys' which can be an array of either TLegacySurvey or TSurvey.
let transformedSurveys: TLegacySurvey[] | TSurvey[];
// Backwards compatibility for versions less than 1.7.0 (no multi-language support).
if (version && isVersionGreaterThanOrEqualTo(version, "1.7.0")) {
// Scenario 1: Multi language supported
// Use the surveys as they are.
transformedSurveys = surveys;
} else {
// Scenario 2: Multi language not supported
// Convert to legacy surveys with default language.
transformedSurveys = await Promise.all(
surveys.map((survey) => {
const languageCode = "default";
return transformToLegacySurvey(survey, languageCode);
})
);
}
const updatedProduct: TProduct = {
...product,
brandColor: product.styling.brandColor?.light ?? COLOR_DEFAULTS.brandColor,
@@ -175,16 +156,41 @@ export async function GET(
};
const language = await getAttribute("language", person.id);
const noCodeActionClasses = actionClasses.filter((actionClass) => actionClass.type === "noCode");
// return state
const state: TJsAppStateSync = {
...(version && !isVersionGreaterThanOrEqualTo(version, "2.0.0") && { person }),
// Scenario 1: Multi language and updated trigger action classes supported.
// Use the surveys as they are.
let transformedSurveys: TLegacySurvey[] | TSurvey[] = surveys;
// creating state object
let state: TJsAppStateSync | TJsAppLegacyStateSync = {
surveys: !isInAppSurveyLimitReached ? transformedSurveys : [],
noCodeActionClasses: noCodeActionClasses.filter((actionClass) => actionClass.type === "noCode"),
actionClasses,
language,
product: updatedProduct,
};
// Backwards compatibility for versions less than 2.0.0 (no multi-language support and updated trigger action classes).
if (!isVersionGreaterThanOrEqualTo(version ?? "", "2.0.0")) {
// Scenario 2: Multi language and updated trigger action classes not supported
// Convert to legacy surveys with default language
// convert triggers to array of actionClasses Names
transformedSurveys = await Promise.all(
surveys.map((survey: TSurvey | TLegacySurvey) => {
const languageCode = "default";
return transformToLegacySurvey(survey as TSurvey, languageCode);
})
);
state = {
surveys: !isInAppSurveyLimitReached ? transformedSurveys : [],
person,
noCodeActionClasses,
language,
product: updatedProduct,
};
}
return responses.successResponse(
{ ...state },
true,
@@ -4,7 +4,7 @@ import { responses } from "@/app/lib/api/response";
import { transformErrorToDetails } from "@/app/lib/api/validator";
import { NextRequest } from "next/server";
import { getActionClasses } from "@formbricks/lib/actionClass/service";
import { getActionClassByEnvironmentIdAndName, getActionClasses } from "@formbricks/lib/actionClass/service";
import {
IS_FORMBRICKS_CLOUD,
PRICING_APPSURVEYS_FREE_RESPONSES,
@@ -17,7 +17,7 @@ import { createSurvey, getSurveys, transformToLegacySurvey } from "@formbricks/l
import { getMonthlyTeamResponseCount, getTeamByEnvironmentId } from "@formbricks/lib/team/service";
import { isVersionGreaterThanOrEqualTo } from "@formbricks/lib/utils/version";
import { TLegacySurvey } from "@formbricks/types/LegacySurvey";
import { TJsWebsiteStateSync, ZJsWebsiteSyncInput } from "@formbricks/types/js";
import { TJsWebsiteLegacyStateSync, TJsWebsiteStateSync, ZJsWebsiteSyncInput } from "@formbricks/types/js";
import { TProduct } from "@formbricks/types/product";
import { TSurvey } from "@formbricks/types/surveys";
@@ -77,12 +77,16 @@ export async function GET(
}
if (!environment?.widgetSetupCompleted) {
const firstSurvey = getExampleSurveyTemplate(WEBAPP_URL);
const exampleTrigger = await getActionClassByEnvironmentIdAndName(environmentId, "New Session");
if (!exampleTrigger) {
throw new Error("Example trigger not found");
}
const firstSurvey = getExampleSurveyTemplate(WEBAPP_URL, exampleTrigger);
await createSurvey(environmentId, firstSurvey);
await updateEnvironment(environment.id, { widgetSetupCompleted: true });
}
const [surveys, noCodeActionClasses, product] = await Promise.all([
const [surveys, actionClasses, product] = await Promise.all([
getSurveys(environmentId),
getActionClasses(environmentId),
getProductByEnvironmentId(environmentId),
@@ -99,25 +103,6 @@ export async function GET(
// && (!survey.segment || survey.segment.filters.length === 0)
);
// Define 'transformedSurveys' which can be an array of either TLegacySurvey or TSurvey.
let transformedSurveys: TLegacySurvey[] | TSurvey[];
// Backwards compatibility for versions less than 1.7.0 (no multi-language support).
if (version && isVersionGreaterThanOrEqualTo(version, "1.7.0")) {
// Scenario 1: Multi language supported
// Use the surveys as they are.
transformedSurveys = filteredSurveys;
} else {
// Scenario 2: Multi language not supported
// Convert to legacy surveys with default language.
transformedSurveys = await Promise.all(
filteredSurveys.map((survey) => {
const languageCode = "default";
return transformToLegacySurvey(survey, languageCode);
})
);
}
const updatedProduct: TProduct = {
...product,
brandColor: product.styling.brandColor?.light ?? COLOR_DEFAULTS.brandColor,
@@ -126,13 +111,35 @@ export async function GET(
}),
};
// Create the 'state' object with surveys, noCodeActionClasses, product, and person.
const state: TJsWebsiteStateSync = {
surveys: isInAppSurveyLimitReached ? [] : transformedSurveys,
noCodeActionClasses: noCodeActionClasses.filter((actionClass) => actionClass.type === "noCode"),
const noCodeActionClasses = actionClasses.filter((actionClass) => actionClass.type === "noCode");
// Define 'transformedSurveys' which can be an array of either TLegacySurvey or TSurvey.
let transformedSurveys: TLegacySurvey[] | TSurvey[] = surveys;
let state: TJsWebsiteStateSync | TJsWebsiteLegacyStateSync = {
surveys: !isInAppSurveyLimitReached ? transformedSurveys : [],
actionClasses,
product: updatedProduct,
};
// Backwards compatibility for versions less than 2.0.0 (no multi-language support and updated trigger action classes).
if (!isVersionGreaterThanOrEqualTo(version ?? "", "2.0.0")) {
// Scenario 2: Multi language and updated trigger action classes not supported
// Convert to legacy surveys with default language
// convert triggers to array of actionClasses Names
transformedSurveys = await Promise.all(
filteredSurveys.map((survey) => {
const languageCode = "default";
return transformToLegacySurvey(survey, languageCode);
})
);
state = {
surveys: isInAppSurveyLimitReached ? [] : transformedSurveys,
noCodeActionClasses,
product: updatedProduct,
};
}
return responses.successResponse(
{ ...state },
true,