From bd22aaaa86644cd1c8e528c28565ff652df66067 Mon Sep 17 00:00:00 2001
From: Matti Nannt
Date: Mon, 5 May 2025 21:03:54 +0200
Subject: [PATCH] chore: move js sdk and demo app to its own repository (#5668)
---
.env.example | 6 +-
apps/demo/.env.example | 5 -
apps/demo/.eslintrc.js | 7 -
apps/demo/.gitignore | 36 --
apps/demo/components/layout-app.tsx | 13 -
apps/demo/components/sidebar.tsx | 65 ----
apps/demo/globals.css | 23 --
apps/demo/lib/utils.ts | 3 -
apps/demo/next-env.d.ts | 5 -
apps/demo/next.config.mjs | 17 -
apps/demo/package.json | 28 --
apps/demo/pages/_app.tsx | 20 -
apps/demo/pages/_document.tsx | 13 -
apps/demo/pages/index.tsx | 359 ------------------
apps/demo/postcss.config.js | 5 -
apps/demo/public/favicon.ico | Bin 15406 -> 0 bytes
apps/demo/public/fb-setup.png | Bin 6332 -> 0 bytes
apps/demo/public/next.svg | 1 -
apps/demo/public/thirteen.svg | 1 -
apps/demo/public/vercel.svg | 1 -
apps/demo/tsconfig.json | 5 -
.../landing/components/landing-sidebar.tsx | 2 -
.../components/FormbricksClient.test.tsx | 81 ----
.../app/(app)/components/FormbricksClient.tsx | 44 ---
.../components/MainNavigation.tsx | 4 +-
.../[environmentId]/layout.test.tsx | 7 -
.../profile/components/DeleteAccount.tsx | 2 -
apps/web/app/(app)/layout.test.tsx | 16 -
apps/web/app/(app)/layout.tsx | 19 +-
apps/web/app/lib/formbricks.ts | 11 -
apps/web/lib/constants.ts | 3 -
apps/web/lib/env.ts | 8 -
.../DeleteAccountModal/index.test.tsx | 8 -
.../components/DeleteAccountModal/index.tsx | 3 -
.../components/removed-from-organization.tsx | 2 -
.../question-form-input/index.test.tsx | 4 -
.../components/create-new-action-tab.test.tsx | 2 -
.../ui/components/client-logout/index.tsx | 2 -
.../environmentId-base-layout/index.test.tsx | 10 -
.../environmentId-base-layout/index.tsx | 15 +-
apps/web/package.json | 2 +-
apps/web/vite.config.mts | 3 +-
docker/docker-compose.yml | 4 -
package.json | 1 -
packages/js/.eslintrc.cjs | 7 -
packages/js/.gitignore | 4 -
packages/js/LICENSE | 9 -
packages/js/README.md | 36 --
packages/js/package.json | 50 ---
packages/js/src/index.ts | 23 --
packages/js/src/lib/load-formbricks.ts | 108 ------
packages/js/src/vite-env.d.ts | 1 -
packages/js/tsconfig.json | 15 -
packages/js/vite.config.ts | 23 --
pnpm-lock.yaml | 350 +----------------
turbo.json | 34 +-
56 files changed, 13 insertions(+), 1513 deletions(-)
delete mode 100644 apps/demo/.env.example
delete mode 100644 apps/demo/.eslintrc.js
delete mode 100644 apps/demo/.gitignore
delete mode 100644 apps/demo/components/layout-app.tsx
delete mode 100644 apps/demo/components/sidebar.tsx
delete mode 100644 apps/demo/globals.css
delete mode 100644 apps/demo/lib/utils.ts
delete mode 100644 apps/demo/next-env.d.ts
delete mode 100644 apps/demo/next.config.mjs
delete mode 100644 apps/demo/package.json
delete mode 100644 apps/demo/pages/_app.tsx
delete mode 100644 apps/demo/pages/_document.tsx
delete mode 100644 apps/demo/pages/index.tsx
delete mode 100644 apps/demo/postcss.config.js
delete mode 100644 apps/demo/public/favicon.ico
delete mode 100644 apps/demo/public/fb-setup.png
delete mode 100644 apps/demo/public/next.svg
delete mode 100644 apps/demo/public/thirteen.svg
delete mode 100644 apps/demo/public/vercel.svg
delete mode 100644 apps/demo/tsconfig.json
delete mode 100644 apps/web/app/(app)/components/FormbricksClient.test.tsx
delete mode 100644 apps/web/app/(app)/components/FormbricksClient.tsx
delete mode 100644 apps/web/app/lib/formbricks.ts
delete mode 100644 packages/js/.eslintrc.cjs
delete mode 100644 packages/js/.gitignore
delete mode 100644 packages/js/LICENSE
delete mode 100644 packages/js/README.md
delete mode 100644 packages/js/package.json
delete mode 100644 packages/js/src/index.ts
delete mode 100644 packages/js/src/lib/load-formbricks.ts
delete mode 100644 packages/js/src/vite-env.d.ts
delete mode 100644 packages/js/tsconfig.json
delete mode 100644 packages/js/vite.config.ts
diff --git a/.env.example b/.env.example
index c6dbb414a5..11b4efd35a 100644
--- a/.env.example
+++ b/.env.example
@@ -154,10 +154,6 @@ NOTION_OAUTH_CLIENT_SECRET=
STRIPE_SECRET_KEY=
STRIPE_WEBHOOK_SECRET=
-# Configure Formbricks usage within Formbricks
-FORMBRICKS_API_HOST=
-FORMBRICKS_ENVIRONMENT_ID=
-
# Oauth credentials for Google sheet integration
GOOGLE_SHEETS_CLIENT_ID=
GOOGLE_SHEETS_CLIENT_SECRET=
@@ -221,4 +217,4 @@ UNKEY_ROOT_KEY=
# SENTRY_AUTH_TOKEN=
# Disable the user management from UI
-# DISABLE_USER_MANAGEMENT
\ No newline at end of file
+# DISABLE_USER_MANAGEMENT=1
\ No newline at end of file
diff --git a/apps/demo/.env.example b/apps/demo/.env.example
deleted file mode 100644
index 90d5b7d8c8..0000000000
--- a/apps/demo/.env.example
+++ /dev/null
@@ -1,5 +0,0 @@
-NEXT_PUBLIC_FORMBRICKS_API_HOST=http://localhost:3000
-NEXT_PUBLIC_FORMBRICKS_ENVIRONMENT_ID=YOUR_ENVIRONMENT_ID
-
-# Copy the environment ID for the URL of your Formbricks App and
-# paste it above to connect your Formbricks App with the Demo App.
\ No newline at end of file
diff --git a/apps/demo/.eslintrc.js b/apps/demo/.eslintrc.js
deleted file mode 100644
index 63c8f7518e..0000000000
--- a/apps/demo/.eslintrc.js
+++ /dev/null
@@ -1,7 +0,0 @@
-module.exports = {
- extends: ["@formbricks/eslint-config/next.js"],
- parserOptions: {
- project: "tsconfig.json",
- tsconfigRootDir: __dirname,
- },
-};
diff --git a/apps/demo/.gitignore b/apps/demo/.gitignore
deleted file mode 100644
index c87c9b392c..0000000000
--- a/apps/demo/.gitignore
+++ /dev/null
@@ -1,36 +0,0 @@
-# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
-
-# dependencies
-/node_modules
-/.pnp
-.pnp.js
-
-# testing
-/coverage
-
-# next.js
-/.next/
-/out/
-
-# production
-/build
-
-# misc
-.DS_Store
-*.pem
-
-# debug
-npm-debug.log*
-yarn-debug.log*
-yarn-error.log*
-.pnpm-debug.log*
-
-# local env files
-.env*.local
-
-# vercel
-.vercel
-
-# typescript
-*.tsbuildinfo
-next-env.d.ts
diff --git a/apps/demo/components/layout-app.tsx b/apps/demo/components/layout-app.tsx
deleted file mode 100644
index 57703154a4..0000000000
--- a/apps/demo/components/layout-app.tsx
+++ /dev/null
@@ -1,13 +0,0 @@
-import { Sidebar } from "./sidebar";
-
-export function LayoutApp({ children }: { children: React.ReactNode }): React.JSX.Element {
- return (
-
- {/* Static sidebar for desktop */}
-
-
-
-
{children}
-
- );
-}
diff --git a/apps/demo/components/sidebar.tsx b/apps/demo/components/sidebar.tsx
deleted file mode 100644
index 4e54a63d2a..0000000000
--- a/apps/demo/components/sidebar.tsx
+++ /dev/null
@@ -1,65 +0,0 @@
-import {
- ClockIcon,
- CogIcon,
- CreditCardIcon,
- FileBarChartIcon,
- HelpCircleIcon,
- HomeIcon,
- ScaleIcon,
- ShieldCheckIcon,
- UsersIcon,
-} from "lucide-react";
-import { classNames } from "../lib/utils";
-
-const navigation = [
- { name: "Home", href: "#", icon: HomeIcon, current: true },
- { name: "History", href: "#", icon: ClockIcon, current: false },
- { name: "Balances", href: "#", icon: ScaleIcon, current: false },
- { name: "Cards", href: "#", icon: CreditCardIcon, current: false },
- { name: "Recipients", href: "#", icon: UsersIcon, current: false },
- { name: "Reports", href: "#", icon: FileBarChartIcon, current: false },
-];
-const secondaryNavigation = [
- { name: "Settings", href: "#", icon: CogIcon },
- { name: "Help", href: "#", icon: HelpCircleIcon },
- { name: "Privacy", href: "#", icon: ShieldCheckIcon },
-];
-
-export function Sidebar(): React.JSX.Element {
- return (
-
- );
-}
diff --git a/apps/demo/globals.css b/apps/demo/globals.css
deleted file mode 100644
index 5098be34ec..0000000000
--- a/apps/demo/globals.css
+++ /dev/null
@@ -1,23 +0,0 @@
-@import 'tailwindcss';
-
-@plugin '@tailwindcss/forms';
-
-@custom-variant dark (&:is(.dark *));
-
-/*
- The default border color has changed to `currentcolor` in Tailwind CSS v4,
- so we've added these compatibility styles to make sure everything still
- looks the same as it did with Tailwind CSS v3.
-
- If we ever want to remove these styles, we need to add an explicit border
- color utility to any element that depends on these defaults.
-*/
-@layer base {
- *,
- ::after,
- ::before,
- ::backdrop,
- ::file-selector-button {
- border-color: var(--color-gray-200, currentcolor);
- }
-}
diff --git a/apps/demo/lib/utils.ts b/apps/demo/lib/utils.ts
deleted file mode 100644
index 24e25d3d0e..0000000000
--- a/apps/demo/lib/utils.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export function classNames(...classes: string[]): string {
- return classes.filter(Boolean).join(" ");
-}
diff --git a/apps/demo/next-env.d.ts b/apps/demo/next-env.d.ts
deleted file mode 100644
index 52e831b434..0000000000
--- a/apps/demo/next-env.d.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-///
-///
-
-// NOTE: This file should not be edited
-// see https://nextjs.org/docs/pages/api-reference/config/typescript for more information.
diff --git a/apps/demo/next.config.mjs b/apps/demo/next.config.mjs
deleted file mode 100644
index 151cc3ec71..0000000000
--- a/apps/demo/next.config.mjs
+++ /dev/null
@@ -1,17 +0,0 @@
-/** @type {import('next').NextConfig} */
-const nextConfig = {
- images: {
- remotePatterns: [
- {
- protocol: "https",
- hostname: "tailwindui.com",
- },
- {
- protocol: "https",
- hostname: "images.unsplash.com",
- },
- ],
- },
-};
-
-export default nextConfig;
diff --git a/apps/demo/package.json b/apps/demo/package.json
deleted file mode 100644
index fa36524ea3..0000000000
--- a/apps/demo/package.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
- "name": "@formbricks/demo",
- "version": "0.0.0",
- "private": true,
- "scripts": {
- "clean": "rimraf .turbo node_modules .next",
- "dev": "next dev -p 3002 --turbopack",
- "go": "next dev -p 3002 --turbopack",
- "build": "next build",
- "start": "next start",
- "lint": "next lint"
- },
- "dependencies": {
- "@formbricks/js": "workspace:*",
- "@tailwindcss/forms": "0.5.9",
- "@tailwindcss/postcss": "4.1.3",
- "lucide-react": "0.486.0",
- "next": "15.2.4",
- "postcss": "8.5.3",
- "react": "19.1.0",
- "react-dom": "19.1.0",
- "tailwindcss": "4.1.3"
- },
- "devDependencies": {
- "@formbricks/config-typescript": "workspace:*",
- "@formbricks/eslint-config": "workspace:*"
- }
-}
diff --git a/apps/demo/pages/_app.tsx b/apps/demo/pages/_app.tsx
deleted file mode 100644
index e2ba74a494..0000000000
--- a/apps/demo/pages/_app.tsx
+++ /dev/null
@@ -1,20 +0,0 @@
-import type { AppProps } from "next/app";
-import Head from "next/head";
-import "../globals.css";
-
-export default function App({ Component, pageProps }: AppProps): React.JSX.Element {
- return (
- <>
-
- Demo App
-
- {(!process.env.NEXT_PUBLIC_FORMBRICKS_ENVIRONMENT_ID ||
- !process.env.NEXT_PUBLIC_FORMBRICKS_API_HOST) && (
-
- Please set Formbricks environment variables in apps/demo/.env
-
- )}
-
- >
- );
-}
diff --git a/apps/demo/pages/_document.tsx b/apps/demo/pages/_document.tsx
deleted file mode 100644
index 3a10b97bee..0000000000
--- a/apps/demo/pages/_document.tsx
+++ /dev/null
@@ -1,13 +0,0 @@
-import { Head, Html, Main, NextScript } from "next/document";
-
-export default function Document(): React.JSX.Element {
- return (
-
-
-
-
-
-
-
- );
-}
diff --git a/apps/demo/pages/index.tsx b/apps/demo/pages/index.tsx
deleted file mode 100644
index 08efe8689b..0000000000
--- a/apps/demo/pages/index.tsx
+++ /dev/null
@@ -1,359 +0,0 @@
-import Image from "next/image";
-import { useRouter } from "next/router";
-import { useEffect, useState } from "react";
-import formbricks from "@formbricks/js";
-import fbsetup from "../public/fb-setup.png";
-
-declare const window: Window;
-
-export default function AppPage(): React.JSX.Element {
- const [darkMode, setDarkMode] = useState(false);
- const router = useRouter();
- const userId = "THIS-IS-A-VERY-LONG-USER-ID-FOR-TESTING";
- const userAttributes = {
- "Attribute 1": "one",
- "Attribute 2": "two",
- "Attribute 3": "three",
- };
-
- useEffect(() => {
- if (darkMode) {
- document.body.classList.add("dark");
- } else {
- document.body.classList.remove("dark");
- }
- }, [darkMode]);
-
- useEffect(() => {
- const initFormbricks = () => {
- // enable Formbricks debug mode by adding formbricksDebug=true GET parameter
- const addFormbricksDebugParam = (): void => {
- const urlParams = new URLSearchParams(window.location.search);
- if (!urlParams.has("formbricksDebug")) {
- urlParams.set("formbricksDebug", "true");
- const newUrl = `${window.location.pathname}?${urlParams.toString()}`;
- window.history.replaceState({}, "", newUrl);
- }
- };
-
- addFormbricksDebugParam();
-
- if (process.env.NEXT_PUBLIC_FORMBRICKS_ENVIRONMENT_ID && process.env.NEXT_PUBLIC_FORMBRICKS_API_HOST) {
- void formbricks.setup({
- environmentId: process.env.NEXT_PUBLIC_FORMBRICKS_ENVIRONMENT_ID,
- appUrl: process.env.NEXT_PUBLIC_FORMBRICKS_API_HOST,
- });
- }
-
- // Connect next.js router to Formbricks
- if (process.env.NEXT_PUBLIC_FORMBRICKS_ENVIRONMENT_ID && process.env.NEXT_PUBLIC_FORMBRICKS_API_HOST) {
- const handleRouteChange = formbricks.registerRouteChange;
-
- router.events.on("routeChangeComplete", () => {
- void handleRouteChange();
- });
-
- return () => {
- router.events.off("routeChangeComplete", () => {
- void handleRouteChange();
- });
- };
- }
- };
-
- initFormbricks();
- }, [router.events]);
-
- return (
-
-
-
-
-
- Formbricks In-product Survey Demo App
-
-
- This app helps you test your app surveys. You can create and test user actions, create and
- update user attributes, etc.
-
-
-
-
-
-
-
-
-
-
-
1. Setup .env
-
- Copy the environment ID of your Formbricks app to the env variable in /apps/demo/.env
-
-
-
-
-
You're connected with env:
-
-
- {process.env.NEXT_PUBLIC_FORMBRICKS_ENVIRONMENT_ID}
-
-
-
-
-
-
-
-
-
-
2. Widget Logs
-
- Look at the logs to understand how the widget works.{" "}
- Open your browser console to see the logs.
-
-
-
-
-
-
-
- Set a user ID / pull data from Formbricks app
-
-
- On formbricks.setUserId() the user state will be fetched from Formbricks and
- the local state gets updated with the user state.
-
-
-
- If you made a change in Formbricks app and it does not seem to work, hit 'Reset' and
- try again.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- This button sets the{" "}
-
- attribute
- {" "}
- 'Plan' to 'Free'. If the attribute does not exist, it creates it.
-
-
-
-
-
-
-
-
-
- This button sets the{" "}
-
- attribute
- {" "}
- 'Plan' to 'Paid'. If the attribute does not exist, it creates it.
-
-
-
-
-
-
-
-
-
- This button sets the{" "}
-
- user email
- {" "}
- 'test@web.com'
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- This button sets the{" "}
-
- language
- {" "}
- to 'de'.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- This button logs out the user and syncs the local state with Formbricks. (Only works if a
- userId is set)
-
-
-
-
-
-
- );
-}
diff --git a/apps/demo/postcss.config.js b/apps/demo/postcss.config.js
deleted file mode 100644
index 483f378543..0000000000
--- a/apps/demo/postcss.config.js
+++ /dev/null
@@ -1,5 +0,0 @@
-module.exports = {
- plugins: {
- "@tailwindcss/postcss": {},
- },
-};
diff --git a/apps/demo/public/favicon.ico b/apps/demo/public/favicon.ico
deleted file mode 100644
index 2b175954392e32f653d65d5f504118593d1e2b4f..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 15406
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
H_x=9@J`;0!
diff --git a/apps/demo/public/next.svg b/apps/demo/public/next.svg
deleted file mode 100644
index 5174b28c56..0000000000
--- a/apps/demo/public/next.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/apps/demo/public/thirteen.svg b/apps/demo/public/thirteen.svg
deleted file mode 100644
index 8977c1bd12..0000000000
--- a/apps/demo/public/thirteen.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/apps/demo/public/vercel.svg b/apps/demo/public/vercel.svg
deleted file mode 100644
index d2f8422273..0000000000
--- a/apps/demo/public/vercel.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/apps/demo/tsconfig.json b/apps/demo/tsconfig.json
deleted file mode 100644
index d000509d66..0000000000
--- a/apps/demo/tsconfig.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "exclude": ["node_modules"],
- "extends": "@formbricks/config-typescript/nextjs.json",
- "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"]
-}
diff --git a/apps/web/app/(app)/(onboarding)/organizations/[organizationId]/landing/components/landing-sidebar.tsx b/apps/web/app/(app)/(onboarding)/organizations/[organizationId]/landing/components/landing-sidebar.tsx
index 521df03407..b6406aab4f 100644
--- a/apps/web/app/(app)/(onboarding)/organizations/[organizationId]/landing/components/landing-sidebar.tsx
+++ b/apps/web/app/(app)/(onboarding)/organizations/[organizationId]/landing/components/landing-sidebar.tsx
@@ -1,6 +1,5 @@
"use client";
-import { formbricksLogout } from "@/app/lib/formbricks";
import FBLogo from "@/images/formbricks-wordmark.svg";
import { cn } from "@/lib/cn";
import { capitalizeFirstLetter } from "@/lib/utils/strings";
@@ -125,7 +124,6 @@ export const LandingSidebar = ({
{
await signOut({ callbackUrl: "/auth/login" });
- await formbricksLogout();
}}
icon={}>
{t("common.logout")}
diff --git a/apps/web/app/(app)/components/FormbricksClient.test.tsx b/apps/web/app/(app)/components/FormbricksClient.test.tsx
deleted file mode 100644
index a0c67294a2..0000000000
--- a/apps/web/app/(app)/components/FormbricksClient.test.tsx
+++ /dev/null
@@ -1,81 +0,0 @@
-import { render } from "@testing-library/react";
-import { describe, expect, test, vi } from "vitest";
-import formbricks from "@formbricks/js";
-import { FormbricksClient } from "./FormbricksClient";
-
-// Mock next/navigation hooks.
-vi.mock("next/navigation", () => ({
- usePathname: () => "/test-path",
- useSearchParams: () => new URLSearchParams("foo=bar"),
-}));
-
-// Mock the flag that enables Formbricks.
-vi.mock("@/app/lib/formbricks", () => ({
- formbricksEnabled: true,
-}));
-
-// Mock the Formbricks SDK module.
-vi.mock("@formbricks/js", () => ({
- __esModule: true,
- default: {
- setup: vi.fn(),
- setUserId: vi.fn(),
- setEmail: vi.fn(),
- registerRouteChange: vi.fn(),
- },
-}));
-
-describe("FormbricksClient", () => {
- test("calls setup, setUserId, setEmail and registerRouteChange on mount when enabled", () => {
- const mockSetup = vi.spyOn(formbricks, "setup");
- const mockSetUserId = vi.spyOn(formbricks, "setUserId");
- const mockSetEmail = vi.spyOn(formbricks, "setEmail");
- const mockRegisterRouteChange = vi.spyOn(formbricks, "registerRouteChange");
-
- render(
-
- );
-
- // Expect the first effect to call setup and assign the provided user details.
- expect(mockSetup).toHaveBeenCalledWith({
- environmentId: "env-test",
- appUrl: "https://api.test.com",
- });
- expect(mockSetUserId).toHaveBeenCalledWith("user-123");
- expect(mockSetEmail).toHaveBeenCalledWith("test@example.com");
-
- // And the second effect should always register the route change when Formbricks is enabled.
- expect(mockRegisterRouteChange).toHaveBeenCalled();
- });
-
- test("does not call setup, setUserId, or setEmail if userId is not provided yet still calls registerRouteChange", () => {
- const mockSetup = vi.spyOn(formbricks, "setup");
- const mockSetUserId = vi.spyOn(formbricks, "setUserId");
- const mockSetEmail = vi.spyOn(formbricks, "setEmail");
- const mockRegisterRouteChange = vi.spyOn(formbricks, "registerRouteChange");
-
- render(
-
- );
-
- // Since userId is falsy, the first effect should not call setup or assign user details.
- expect(mockSetup).not.toHaveBeenCalled();
- expect(mockSetUserId).not.toHaveBeenCalled();
- expect(mockSetEmail).not.toHaveBeenCalled();
-
- // The second effect only checks formbricksEnabled, so registerRouteChange should be called.
- expect(mockRegisterRouteChange).toHaveBeenCalled();
- });
-});
diff --git a/apps/web/app/(app)/components/FormbricksClient.tsx b/apps/web/app/(app)/components/FormbricksClient.tsx
deleted file mode 100644
index dc9a7e6ab6..0000000000
--- a/apps/web/app/(app)/components/FormbricksClient.tsx
+++ /dev/null
@@ -1,44 +0,0 @@
-"use client";
-
-import { usePathname, useSearchParams } from "next/navigation";
-import { useEffect } from "react";
-import formbricks from "@formbricks/js";
-
-interface FormbricksClientProps {
- userId: string;
- email: string;
- formbricksEnvironmentId?: string;
- formbricksApiHost?: string;
- formbricksEnabled?: boolean;
-}
-
-export const FormbricksClient = ({
- userId,
- email,
- formbricksEnvironmentId,
- formbricksApiHost,
- formbricksEnabled,
-}: FormbricksClientProps) => {
- const pathname = usePathname();
- const searchParams = useSearchParams();
-
- useEffect(() => {
- if (formbricksEnabled && userId) {
- formbricks.setup({
- environmentId: formbricksEnvironmentId ?? "",
- appUrl: formbricksApiHost ?? "",
- });
-
- formbricks.setUserId(userId);
- formbricks.setEmail(email);
- }
- }, [userId, email, formbricksEnvironmentId, formbricksApiHost, formbricksEnabled]);
-
- useEffect(() => {
- if (formbricksEnabled) {
- formbricks.registerRouteChange();
- }
- }, [pathname, searchParams, formbricksEnabled]);
-
- return null;
-};
diff --git a/apps/web/app/(app)/environments/[environmentId]/components/MainNavigation.tsx b/apps/web/app/(app)/environments/[environmentId]/components/MainNavigation.tsx
index ab68d8af3e..a1ae639a63 100644
--- a/apps/web/app/(app)/environments/[environmentId]/components/MainNavigation.tsx
+++ b/apps/web/app/(app)/environments/[environmentId]/components/MainNavigation.tsx
@@ -2,7 +2,6 @@
import { getLatestStableFbReleaseAction } from "@/app/(app)/environments/[environmentId]/actions/actions";
import { NavigationLink } from "@/app/(app)/environments/[environmentId]/components/NavigationLink";
-import { formbricksLogout } from "@/app/lib/formbricks";
import FBLogo from "@/images/formbricks-wordmark.svg";
import { cn } from "@/lib/cn";
import { getAccessFlags } from "@/lib/membership/utils";
@@ -265,7 +264,7 @@ export const MainNavigation = ({
size="icon"
onClick={toggleSidebar}
className={cn(
- "rounded-xl bg-slate-50 p-1 text-slate-600 transition-all hover:bg-slate-100 focus:ring-0 focus:ring-transparent focus:outline-none"
+ "rounded-xl bg-slate-50 p-1 text-slate-600 transition-all hover:bg-slate-100 focus:outline-none focus:ring-0 focus:ring-transparent"
)}>
{isCollapsed ? (
@@ -392,7 +391,6 @@ export const MainNavigation = ({
onClick={async () => {
const route = await signOut({ redirect: false, callbackUrl: "/auth/login" });
router.push(route.url);
- await formbricksLogout();
}}
icon={}>
{t("common.logout")}
diff --git a/apps/web/app/(app)/environments/[environmentId]/layout.test.tsx b/apps/web/app/(app)/environments/[environmentId]/layout.test.tsx
index 54afe41f3c..44f5ecebd1 100644
--- a/apps/web/app/(app)/environments/[environmentId]/layout.test.tsx
+++ b/apps/web/app/(app)/environments/[environmentId]/layout.test.tsx
@@ -26,13 +26,6 @@ vi.mock("@/modules/ui/components/environmentId-base-layout", () => ({
vi.mock("@/modules/ui/components/toaster-client", () => ({
ToasterClient: () => ,
}));
-vi.mock("../../components/FormbricksClient", () => ({
- FormbricksClient: ({ userId, email }: any) => (
-
- {userId}-{email}
-
- ),
-}));
vi.mock("./components/EnvironmentStorageHandler", () => ({
default: ({ environmentId }: any) => {environmentId}
,
}));
diff --git a/apps/web/app/(app)/environments/[environmentId]/settings/(account)/profile/components/DeleteAccount.tsx b/apps/web/app/(app)/environments/[environmentId]/settings/(account)/profile/components/DeleteAccount.tsx
index 2afe7f47e4..a83687403d 100644
--- a/apps/web/app/(app)/environments/[environmentId]/settings/(account)/profile/components/DeleteAccount.tsx
+++ b/apps/web/app/(app)/environments/[environmentId]/settings/(account)/profile/components/DeleteAccount.tsx
@@ -1,6 +1,5 @@
"use client";
-import { formbricksLogout } from "@/app/lib/formbricks";
import { DeleteAccountModal } from "@/modules/account/components/DeleteAccountModal";
import { Button } from "@/modules/ui/components/button";
import { TooltipRenderer } from "@/modules/ui/components/tooltip";
@@ -37,7 +36,6 @@ export const DeleteAccount = ({
setOpen={setModalOpen}
user={user}
isFormbricksCloud={IS_FORMBRICKS_CLOUD}
- formbricksLogout={formbricksLogout}
organizationsWithSingleOwner={organizationsWithSingleOwner}
/>
diff --git a/apps/web/app/(app)/layout.test.tsx b/apps/web/app/(app)/layout.test.tsx
index 88034a3b73..eaf82442a8 100644
--- a/apps/web/app/(app)/layout.test.tsx
+++ b/apps/web/app/(app)/layout.test.tsx
@@ -36,14 +36,10 @@ vi.mock("@/lib/constants", () => ({
IS_POSTHOG_CONFIGURED: true,
POSTHOG_API_HOST: "test-posthog-api-host",
POSTHOG_API_KEY: "test-posthog-api-key",
- FORMBRICKS_API_HOST: "mock-formbricks-api-host",
FORMBRICKS_ENVIRONMENT_ID: "mock-formbricks-environment-id",
IS_FORMBRICKS_ENABLED: true,
}));
-vi.mock("@/app/(app)/components/FormbricksClient", () => ({
- FormbricksClient: () =>
,
-}));
vi.mock("@/app/intercom/IntercomClientWrapper", () => ({
IntercomClientWrapper: () => ,
}));
@@ -74,17 +70,5 @@ describe("(app) AppLayout", () => {
expect(screen.getByTestId("mock-intercom-wrapper")).toBeInTheDocument();
expect(screen.getByTestId("toaster-client")).toBeInTheDocument();
expect(screen.getByTestId("child-content")).toHaveTextContent("Hello from children");
- expect(screen.getByTestId("formbricks-client")).toBeInTheDocument();
- });
-
- test("skips FormbricksClient if no user is present", async () => {
- vi.mocked(getServerSession).mockResolvedValueOnce(null);
-
- const element = await AppLayout({
- children: Hello from children
,
- });
- render(element);
-
- expect(screen.queryByTestId("formbricks-client")).not.toBeInTheDocument();
});
});
diff --git a/apps/web/app/(app)/layout.tsx b/apps/web/app/(app)/layout.tsx
index eef6b727c8..99339d2d8c 100644
--- a/apps/web/app/(app)/layout.tsx
+++ b/apps/web/app/(app)/layout.tsx
@@ -1,13 +1,5 @@
-import { FormbricksClient } from "@/app/(app)/components/FormbricksClient";
import { IntercomClientWrapper } from "@/app/intercom/IntercomClientWrapper";
-import {
- FORMBRICKS_API_HOST,
- FORMBRICKS_ENVIRONMENT_ID,
- IS_FORMBRICKS_ENABLED,
- IS_POSTHOG_CONFIGURED,
- POSTHOG_API_HOST,
- POSTHOG_API_KEY,
-} from "@/lib/constants";
+import { IS_POSTHOG_CONFIGURED, POSTHOG_API_HOST, POSTHOG_API_KEY } from "@/lib/constants";
import { getUser } from "@/lib/user/service";
import { authOptions } from "@/modules/auth/lib/authOptions";
import { ClientLogout } from "@/modules/ui/components/client-logout";
@@ -38,15 +30,6 @@ const AppLayout = async ({ children }) => {
<>
- {user ? (
-
- ) : null}
{children}
diff --git a/apps/web/app/lib/formbricks.ts b/apps/web/app/lib/formbricks.ts
deleted file mode 100644
index 989022e59e..0000000000
--- a/apps/web/app/lib/formbricks.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import { FORMBRICKS_LOGGED_IN_WITH_LS } from "@/lib/localStorage";
-import formbricks from "@formbricks/js";
-
-export const formbricksLogout = async () => {
- const loggedInWith = localStorage.getItem(FORMBRICKS_LOGGED_IN_WITH_LS);
- localStorage.clear();
- if (loggedInWith) {
- localStorage.setItem(FORMBRICKS_LOGGED_IN_WITH_LS, loggedInWith);
- }
- return await formbricks.logout();
-};
diff --git a/apps/web/lib/constants.ts b/apps/web/lib/constants.ts
index 0130bbfc78..5e8432e13a 100644
--- a/apps/web/lib/constants.ts
+++ b/apps/web/lib/constants.ts
@@ -3,9 +3,6 @@ import { TUserLocale } from "@formbricks/types/user";
import { env } from "./env";
export const IS_FORMBRICKS_CLOUD = env.IS_FORMBRICKS_CLOUD === "1";
-export const FORMBRICKS_API_HOST = env.FORMBRICKS_API_HOST;
-export const FORMBRICKS_ENVIRONMENT_ID = env.FORMBRICKS_ENVIRONMENT_ID;
-export const IS_FORMBRICKS_ENABLED = !!(env.FORMBRICKS_API_HOST && env.FORMBRICKS_ENVIRONMENT_ID);
export const IS_PRODUCTION = env.NODE_ENV === "production";
diff --git a/apps/web/lib/env.ts b/apps/web/lib/env.ts
index b948666a5e..42428335b1 100644
--- a/apps/web/lib/env.ts
+++ b/apps/web/lib/env.ts
@@ -24,12 +24,6 @@ export const env = createEnv({
EMAIL_VERIFICATION_DISABLED: z.enum(["1", "0"]).optional(),
ENCRYPTION_KEY: z.string(),
ENTERPRISE_LICENSE_KEY: z.string().optional(),
- FORMBRICKS_API_HOST: z
- .string()
- .url()
- .optional()
- .or(z.string().refine((str) => str === "")),
- FORMBRICKS_ENVIRONMENT_ID: z.string().optional(),
GITHUB_ID: z.string().optional(),
GITHUB_SECRET: z.string().optional(),
GOOGLE_CLIENT_ID: z.string().optional(),
@@ -138,8 +132,6 @@ export const env = createEnv({
EMAIL_VERIFICATION_DISABLED: process.env.EMAIL_VERIFICATION_DISABLED,
ENCRYPTION_KEY: process.env.ENCRYPTION_KEY,
ENTERPRISE_LICENSE_KEY: process.env.ENTERPRISE_LICENSE_KEY,
- FORMBRICKS_API_HOST: process.env.FORMBRICKS_API_HOST,
- FORMBRICKS_ENVIRONMENT_ID: process.env.FORMBRICKS_ENVIRONMENT_ID,
GITHUB_ID: process.env.GITHUB_ID,
GITHUB_SECRET: process.env.GITHUB_SECRET,
GOOGLE_CLIENT_ID: process.env.GOOGLE_CLIENT_ID,
diff --git a/apps/web/modules/account/components/DeleteAccountModal/index.test.tsx b/apps/web/modules/account/components/DeleteAccountModal/index.test.tsx
index 80c49f2630..fc8fbd432e 100644
--- a/apps/web/modules/account/components/DeleteAccountModal/index.test.tsx
+++ b/apps/web/modules/account/components/DeleteAccountModal/index.test.tsx
@@ -26,7 +26,6 @@ describe("DeleteAccountModal", () => {
const mockOrgs: TOrganization[] = [{ name: "Org1" }, { name: "Org2" }] as TOrganization[];
const mockSetOpen = vi.fn();
- const mockLogout = vi.fn();
afterEach(() => {
cleanup();
@@ -40,7 +39,6 @@ describe("DeleteAccountModal", () => {
user={mockUser}
isFormbricksCloud={false}
organizationsWithSingleOwner={mockOrgs}
- formbricksLogout={mockLogout}
/>
);
@@ -56,7 +54,6 @@ describe("DeleteAccountModal", () => {
user={mockUser}
isFormbricksCloud={false}
organizationsWithSingleOwner={[]}
- formbricksLogout={mockLogout}
/>
);
@@ -78,7 +75,6 @@ describe("DeleteAccountModal", () => {
user={mockUser}
isFormbricksCloud={false}
organizationsWithSingleOwner={[]}
- formbricksLogout={mockLogout}
/>
);
@@ -90,7 +86,6 @@ describe("DeleteAccountModal", () => {
await waitFor(() => {
expect(deleteUserAction).toHaveBeenCalled();
- expect(mockLogout).toHaveBeenCalled();
expect(signOut).toHaveBeenCalledWith({ callbackUrl: "/auth/login" });
expect(mockSetOpen).toHaveBeenCalledWith(false);
});
@@ -114,7 +109,6 @@ describe("DeleteAccountModal", () => {
user={mockUser}
isFormbricksCloud={true}
organizationsWithSingleOwner={[]}
- formbricksLogout={mockLogout}
/>
);
@@ -126,7 +120,6 @@ describe("DeleteAccountModal", () => {
await waitFor(() => {
expect(deleteUserAction).toHaveBeenCalled();
- expect(mockLogout).toHaveBeenCalled();
expect(signOut).toHaveBeenCalledWith({ redirect: true });
expect(window.location.replace).toHaveBeenCalled();
expect(mockSetOpen).toHaveBeenCalledWith(false);
@@ -143,7 +136,6 @@ describe("DeleteAccountModal", () => {
user={mockUser}
isFormbricksCloud={false}
organizationsWithSingleOwner={[]}
- formbricksLogout={mockLogout}
/>
);
diff --git a/apps/web/modules/account/components/DeleteAccountModal/index.tsx b/apps/web/modules/account/components/DeleteAccountModal/index.tsx
index 158da36101..241c2ae90b 100644
--- a/apps/web/modules/account/components/DeleteAccountModal/index.tsx
+++ b/apps/web/modules/account/components/DeleteAccountModal/index.tsx
@@ -16,7 +16,6 @@ interface DeleteAccountModalProps {
user: TUser;
isFormbricksCloud: boolean;
organizationsWithSingleOwner: TOrganization[];
- formbricksLogout: () => Promise;
}
export const DeleteAccountModal = ({
@@ -24,7 +23,6 @@ export const DeleteAccountModal = ({
open,
user,
isFormbricksCloud,
- formbricksLogout,
organizationsWithSingleOwner,
}: DeleteAccountModalProps) => {
const { t } = useTranslate();
@@ -38,7 +36,6 @@ export const DeleteAccountModal = ({
try {
setDeleting(true);
await deleteUserAction();
- await formbricksLogout();
// redirect to account deletion survey in Formbricks Cloud
if (isFormbricksCloud) {
await signOut({ redirect: true });
diff --git a/apps/web/modules/setup/organization/create/components/removed-from-organization.tsx b/apps/web/modules/setup/organization/create/components/removed-from-organization.tsx
index ef91b44004..32e0ff9e1d 100644
--- a/apps/web/modules/setup/organization/create/components/removed-from-organization.tsx
+++ b/apps/web/modules/setup/organization/create/components/removed-from-organization.tsx
@@ -1,6 +1,5 @@
"use client";
-import { formbricksLogout } from "@/app/lib/formbricks";
import { DeleteAccountModal } from "@/modules/account/components/DeleteAccountModal";
import { Alert, AlertDescription, AlertTitle } from "@/modules/ui/components/alert";
import { Button } from "@/modules/ui/components/button";
@@ -29,7 +28,6 @@ export const RemovedFromOrganization = ({ user, isFormbricksCloud }: RemovedFrom
setOpen={setIsModalOpen}
user={user}
isFormbricksCloud={isFormbricksCloud}
- formbricksLogout={formbricksLogout}
organizationsWithSingleOwner={[]}
/>