mirror of
https://github.com/formbricks/formbricks.git
synced 2026-05-13 03:16:58 -05:00
Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| a50cd9f861 | |||
| b1b94eaa66 | |||
| 67cc96449d | |||
| bf41a53b86 | |||
| 656b7a0f66 | |||
| 26292ecf39 |
@@ -1,3 +0,0 @@
|
|||||||
import { LinkSurveyLoading } from "@/modules/survey/link/loading";
|
|
||||||
|
|
||||||
export default LinkSurveyLoading;
|
|
||||||
@@ -53,9 +53,9 @@ export const I18nProvider = ({ children, language, defaultLanguage }: I18nProvid
|
|||||||
initializeI18n();
|
initializeI18n();
|
||||||
}, [locale, defaultLanguage]);
|
}, [locale, defaultLanguage]);
|
||||||
|
|
||||||
// Don't render children until i18n is ready to prevent hydration issues
|
// Don't render children until i18n is ready to prevent race conditions
|
||||||
if (!isReady) {
|
if (!isReady) {
|
||||||
return <div style={{ visibility: "hidden" }}>{children}</div>;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -85,6 +85,6 @@ export const middleware = async (originalRequest: NextRequest) => {
|
|||||||
|
|
||||||
export const config = {
|
export const config = {
|
||||||
matcher: [
|
matcher: [
|
||||||
"/((?!_next/static|_next/image|favicon.ico|sitemap.xml|robots.txt|js|css|images|fonts|icons|public).*)",
|
"/((?!_next/static|_next/image|favicon.ico|sitemap.xml|robots.txt|js|css|images|fonts|icons|public|animated-bgs).*)",
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -32,6 +32,16 @@ vi.mock("@/lib/styling/constants", () => ({
|
|||||||
},
|
},
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
// Mock recall utility
|
||||||
|
vi.mock("@/lib/utils/recall", () => ({
|
||||||
|
recallToHeadline: vi.fn((headline) => headline),
|
||||||
|
}));
|
||||||
|
|
||||||
|
// Mock text content extraction
|
||||||
|
vi.mock("@formbricks/types/surveys/validation", () => ({
|
||||||
|
getTextContent: vi.fn((text) => text),
|
||||||
|
}));
|
||||||
|
|
||||||
describe("Metadata Utils", () => {
|
describe("Metadata Utils", () => {
|
||||||
// Reset all mocks before each test
|
// Reset all mocks before each test
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
@@ -173,6 +183,75 @@ describe("Metadata Utils", () => {
|
|||||||
WEBAPP_URL: "https://test.formbricks.com",
|
WEBAPP_URL: "https://test.formbricks.com",
|
||||||
}));
|
}));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("handles welcome card headline with HTML content", async () => {
|
||||||
|
const { getTextContent } = await import("@formbricks/types/surveys/validation");
|
||||||
|
|
||||||
|
const mockSurvey = {
|
||||||
|
id: mockSurveyId,
|
||||||
|
environmentId: mockEnvironmentId,
|
||||||
|
name: "Test Survey",
|
||||||
|
metadata: {},
|
||||||
|
languages: [],
|
||||||
|
welcomeCard: {
|
||||||
|
enabled: true,
|
||||||
|
timeToFinish: false,
|
||||||
|
showResponseCount: false,
|
||||||
|
headline: {
|
||||||
|
default: "<p>Welcome <strong>Headline</strong></p>",
|
||||||
|
},
|
||||||
|
html: {
|
||||||
|
default: "Welcome Description",
|
||||||
|
},
|
||||||
|
} as TSurveyWelcomeCard,
|
||||||
|
} as TSurvey;
|
||||||
|
|
||||||
|
vi.mocked(getSurvey).mockResolvedValue(mockSurvey);
|
||||||
|
vi.mocked(getTextContent).mockReturnValue("Welcome Headline");
|
||||||
|
|
||||||
|
const result = await getBasicSurveyMetadata(mockSurveyId);
|
||||||
|
|
||||||
|
expect(getTextContent).toHaveBeenCalled();
|
||||||
|
expect(result.title).toBe("Welcome Headline");
|
||||||
|
});
|
||||||
|
|
||||||
|
test("handles welcome card headline with recall variables", async () => {
|
||||||
|
const { recallToHeadline } = await import("@/lib/utils/recall");
|
||||||
|
|
||||||
|
const mockSurvey = {
|
||||||
|
id: mockSurveyId,
|
||||||
|
environmentId: mockEnvironmentId,
|
||||||
|
name: "Test Survey",
|
||||||
|
metadata: {},
|
||||||
|
languages: [],
|
||||||
|
welcomeCard: {
|
||||||
|
enabled: true,
|
||||||
|
timeToFinish: false,
|
||||||
|
showResponseCount: false,
|
||||||
|
headline: {
|
||||||
|
default: "Welcome #recall:name/fallback:User#",
|
||||||
|
},
|
||||||
|
html: {
|
||||||
|
default: "Welcome Description",
|
||||||
|
},
|
||||||
|
} as TSurveyWelcomeCard,
|
||||||
|
} as TSurvey;
|
||||||
|
|
||||||
|
vi.mocked(getSurvey).mockResolvedValue(mockSurvey);
|
||||||
|
vi.mocked(recallToHeadline).mockReturnValue({
|
||||||
|
default: "Welcome @User",
|
||||||
|
});
|
||||||
|
|
||||||
|
const result = await getBasicSurveyMetadata(mockSurveyId);
|
||||||
|
|
||||||
|
expect(recallToHeadline).toHaveBeenCalledWith(
|
||||||
|
mockSurvey.welcomeCard.headline,
|
||||||
|
mockSurvey,
|
||||||
|
false,
|
||||||
|
"default"
|
||||||
|
);
|
||||||
|
expect(result.title).toBe("Welcome @User");
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("getSurveyOpenGraphMetadata", () => {
|
describe("getSurveyOpenGraphMetadata", () => {
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
import { Metadata } from "next";
|
import { Metadata } from "next";
|
||||||
|
import { getTextContent } from "@formbricks/types/surveys/validation";
|
||||||
import { IS_FORMBRICKS_CLOUD } from "@/lib/constants";
|
import { IS_FORMBRICKS_CLOUD } from "@/lib/constants";
|
||||||
import { getPublicDomain } from "@/lib/getPublicUrl";
|
import { getPublicDomain } from "@/lib/getPublicUrl";
|
||||||
import { getLocalizedValue } from "@/lib/i18n/utils";
|
import { getLocalizedValue } from "@/lib/i18n/utils";
|
||||||
import { COLOR_DEFAULTS } from "@/lib/styling/constants";
|
import { COLOR_DEFAULTS } from "@/lib/styling/constants";
|
||||||
|
import { recallToHeadline } from "@/lib/utils/recall";
|
||||||
import { getSurvey } from "@/modules/survey/lib/survey";
|
import { getSurvey } from "@/modules/survey/lib/survey";
|
||||||
|
|
||||||
type TBasicSurveyMetadata = {
|
type TBasicSurveyMetadata = {
|
||||||
@@ -48,7 +50,9 @@ export const getBasicSurveyMetadata = async (
|
|||||||
const titleFromMetadata = metadata?.title ? getLocalizedValue(metadata.title, langCode) || "" : undefined;
|
const titleFromMetadata = metadata?.title ? getLocalizedValue(metadata.title, langCode) || "" : undefined;
|
||||||
const titleFromWelcome =
|
const titleFromWelcome =
|
||||||
welcomeCard?.enabled && welcomeCard.headline
|
welcomeCard?.enabled && welcomeCard.headline
|
||||||
? getLocalizedValue(welcomeCard.headline, langCode) || ""
|
? getTextContent(
|
||||||
|
getLocalizedValue(recallToHeadline(welcomeCard.headline, survey, false, langCode), langCode)
|
||||||
|
) || ""
|
||||||
: undefined;
|
: undefined;
|
||||||
let title = titleFromMetadata || titleFromWelcome || survey.name;
|
let title = titleFromMetadata || titleFromWelcome || survey.name;
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +0,0 @@
|
|||||||
"use client";
|
|
||||||
export const LinkSurveyLoading = () => {
|
|
||||||
return (
|
|
||||||
<div className="flex h-full w-full items-center justify-center">
|
|
||||||
<div className="flex h-1/2 w-3/4 flex-col sm:w-1/2 lg:w-1/4">
|
|
||||||
<div className="ph-no-capture h-16 w-1/3 animate-pulse rounded-lg bg-slate-200 font-medium text-slate-900"></div>
|
|
||||||
<div className="ph-no-capture mt-4 h-full animate-pulse rounded-lg bg-slate-200 text-slate-900"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
@@ -102,7 +102,7 @@
|
|||||||
"markdown-it": "14.1.0",
|
"markdown-it": "14.1.0",
|
||||||
"mime-types": "3.0.1",
|
"mime-types": "3.0.1",
|
||||||
"next": "15.5.6",
|
"next": "15.5.6",
|
||||||
"next-auth": "4.24.11",
|
"next-auth": "4.24.12",
|
||||||
"next-safe-action": "7.10.8",
|
"next-safe-action": "7.10.8",
|
||||||
"node-fetch": "3.3.2",
|
"node-fetch": "3.3.2",
|
||||||
"nodemailer": "7.0.9",
|
"nodemailer": "7.0.9",
|
||||||
|
|||||||
@@ -102,6 +102,7 @@ When PUBLIC_URL is configured, the following routes are automatically served fro
|
|||||||
- `/fonts/*` - Font files
|
- `/fonts/*` - Font files
|
||||||
- `/icons/*` - Icon assets
|
- `/icons/*` - Icon assets
|
||||||
- `/public/*` - Public static files
|
- `/public/*` - Public static files
|
||||||
|
- `/animated-bgs/*` - Animated Background assets
|
||||||
|
|
||||||
#### Storage Routes
|
#### Storage Routes
|
||||||
|
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ spec:
|
|||||||
{{- end }}
|
{{- end }}
|
||||||
{{- if .Values.deployment.securityContext }}
|
{{- if .Values.deployment.securityContext }}
|
||||||
securityContext:
|
securityContext:
|
||||||
{{ toYaml .Values.deployment.securityContext | indent 8 }}
|
{{ toYaml .Values.deployment.securityContext | nindent 8 }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
terminationGracePeriodSeconds: {{ .Values.deployment.terminationGracePeriodSeconds | default 30 }}
|
terminationGracePeriodSeconds: {{ .Values.deployment.terminationGracePeriodSeconds | default 30 }}
|
||||||
containers:
|
containers:
|
||||||
|
|||||||
+1
-1
@@ -79,7 +79,7 @@
|
|||||||
},
|
},
|
||||||
"pnpm": {
|
"pnpm": {
|
||||||
"patchedDependencies": {
|
"patchedDependencies": {
|
||||||
"next-auth@4.24.11": "patches/next-auth@4.24.11.patch"
|
"next-auth@4.24.12": "patches/next-auth@4.24.12.patch"
|
||||||
},
|
},
|
||||||
"overrides": {
|
"overrides": {
|
||||||
"axios": ">=1.12.2",
|
"axios": ">=1.12.2",
|
||||||
|
|||||||
Generated
+2234
-3117
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user