"use client"; import * as Collapsible from "@radix-ui/react-collapsible"; import { ArrowUpRight, Languages } from "lucide-react"; import Link from "next/link"; import { FC, useState } from "react"; import toast from "react-hot-toast"; import { cn } from "@formbricks/lib/cn"; import { extractLanguageCodes, translateSurvey } from "@formbricks/lib/i18n/utils"; import { TLanguage, TProduct } from "@formbricks/types/product"; import { TSurvey, TSurveyLanguage, ZSurvey } from "@formbricks/types/surveys"; import { Button } from "@formbricks/ui/Button"; import { ConfirmationModal } from "@formbricks/ui/ConfirmationModal"; import { Label } from "@formbricks/ui/Label"; import { Switch } from "@formbricks/ui/Switch"; import { UpgradePlanNotice } from "@formbricks/ui/UpgradePlanNotice"; import { DefaultLanguageSelect } from "./DefaultLanguageSelect"; import { SecondaryLanguageSelect } from "./SecondaryLanguageSelect"; interface MultiLanguageCardProps { localSurvey: TSurvey; product: TProduct; setLocalSurvey: (survey: TSurvey) => void; activeQuestionId: string | null; setActiveQuestionId: (questionId: string | null) => void; isMultiLanguageAllowed?: boolean; isFormbricksCloud: boolean; setSelectedLanguageCode: (language: string) => void; } export interface ConfirmationModalProps { text: string; open: boolean; title: string; buttonText: string; buttonVariant?: "darkCTA" | "warn"; onConfirm: () => void; } export const MultiLanguageCard: FC = ({ activeQuestionId, product, localSurvey, setActiveQuestionId, setLocalSurvey, isMultiLanguageAllowed, isFormbricksCloud, setSelectedLanguageCode, }) => { const environmentId = localSurvey.environmentId; const open = activeQuestionId == "multiLanguage"; const [isMultiLanguageActivated, setIsMultiLanguageActivated] = useState(localSurvey.languages?.length > 1); const [confirmationModalInfo, setConfirmationModalInfo] = useState({ title: "", open: false, text: "", buttonText: "", onConfirm: () => {}, }); const [defaultLanguage, setDefaultLanguage] = useState( localSurvey.languages?.find((language) => { return language.default === true; })?.language ); const setOpen = (open: boolean) => { if (open) { setActiveQuestionId("multiLanguage"); } else { setActiveQuestionId(null); } }; const updateSurveyTranslations = (survey: TSurvey, updatedLanguages: TSurveyLanguage[]) => { const translatedSurveyResult = translateSurvey(survey, extractLanguageCodes(updatedLanguages)); try { const parsedSurvey = ZSurvey.parse(translatedSurveyResult); if (parsedSurvey) { setLocalSurvey({ ...parsedSurvey, languages: updatedLanguages }); } } catch (error) { toast.error("Some error occured while translating the survey"); } }; const updateSurveyLanguages = (language: TLanguage) => { let updatedLanguages = localSurvey.languages; const languageIndex = localSurvey.languages.findIndex( (surveyLanguage) => surveyLanguage.language.code === language.code ); if (languageIndex >= 0) { // Toggle the 'enabled' property of the existing language updatedLanguages = updatedLanguages.map((surveyLanguage, index) => index === languageIndex ? { ...surveyLanguage, enabled: !surveyLanguage.enabled } : surveyLanguage ); } else { // Add the new language updatedLanguages = [ ...updatedLanguages, { enabled: true, default: false, language, }, ]; } updateSurveyTranslations(localSurvey, updatedLanguages); }; const updateSurvey = (data: { languages: TSurveyLanguage[] }) => { setLocalSurvey({ ...localSurvey, ...data }); }; const handleDefaultLanguageChange = (languageCode: string) => { const language = product.languages.find((lang) => lang.code === languageCode); if (language) { let languageExists = false; // Update all languages and check if the new default language already exists const newLanguages = localSurvey.languages?.map((lang) => { if (lang.language.code === language.code) { languageExists = true; return { ...lang, default: true }; } else { return { ...lang, default: false }; } }) ?? []; if (!languageExists) { // If the language doesn't exist, add it as the default newLanguages.push({ enabled: true, default: true, language, }); } setDefaultLanguage(language); setConfirmationModalInfo({ ...confirmationModalInfo, open: false }); updateSurvey({ languages: newLanguages }); } }; const handleActivationSwitchLogic = () => { if (isMultiLanguageActivated) { if (localSurvey.languages?.length > 0) { setConfirmationModalInfo({ open: true, title: "Remove translations", text: "This action will remove all the translations from this survey.", buttonText: "Remove translations", buttonVariant: "warn", onConfirm: () => { updateSurveyTranslations(localSurvey, []); setIsMultiLanguageActivated(false); setDefaultLanguage(undefined); setConfirmationModalInfo({ ...confirmationModalInfo, open: false }); }, }); } else { setIsMultiLanguageActivated(false); } } else { setIsMultiLanguageActivated(true); } }; return (

Multiple Languages

{ handleActivationSwitchLogic(); }} disabled={!isMultiLanguageAllowed || product.languages.length === 0} />
{!isMultiLanguageAllowed && !isFormbricksCloud && !isMultiLanguageActivated ? ( ) : !isMultiLanguageAllowed && isFormbricksCloud && !isMultiLanguageActivated ? ( ) : ( <> {product.languages.length <= 1 && (
{product.languages.length === 0 ? "No languages found. Add the first one to get started:" : "You need to have two or more languages set up in your product to work with translations."}
)} {product.languages.length > 1 && (
{isMultiLanguageAllowed && !isMultiLanguageActivated && (
Switch multi-lanugage on to get started 👉
)}
{isMultiLanguageActivated && (
{defaultLanguage && ( )}
)}
)} )} setConfirmationModalInfo((prev) => ({ ...prev, open: !prev.open }))} text={confirmationModalInfo.text} onConfirm={confirmationModalInfo.onConfirm} buttonText={confirmationModalInfo.buttonText} buttonVariant={confirmationModalInfo.buttonVariant} />
); };