This commit is contained in:
harshsbhat
2025-06-16 13:44:00 +05:30
parent 84a94ad027
commit b0627fffa5
8 changed files with 115 additions and 55 deletions

View File

@@ -1,52 +1,74 @@
"use client";
import { CreateNewActionTab } from "@/modules/survey/editor/components/create-new-action-tab";
import { Button } from "@/modules/ui/components/button";
import { Input } from "@/modules/ui/components/input";
import { Modal } from "@/modules/ui/components/modal";
import { useTranslate } from "@tolgee/react";
import { MousePointerClickIcon, PlusIcon } from "lucide-react";
import { KeyIcon } from "lucide-react";
import { useState } from "react";
import { TActionClass } from "@formbricks/types/action-classes";
interface AddActionModalProps {
interface AddKeyModalProps {
environmentId: string;
actionClasses: TActionClass[];
isReadOnly: boolean;
open?: boolean;
setOpen?: (open: boolean) => void;
}
export const AddKeyModal = ({ environmentId, actionClasses, isReadOnly }: AddActionModalProps) => {
export const AddKeyModal = ({
environmentId,
open: externalOpen,
setOpen: externalSetOpen,
}: AddKeyModalProps) => {
const { t } = useTranslate();
const [open, setOpen] = useState(false);
const [internalOpen, setInternalOpen] = useState(false);
const [keyLabel, setKeyLabel] = useState("");
const [newActionClasses, setNewActionClasses] = useState<TActionClass[]>(actionClasses);
const open = externalOpen !== undefined ? externalOpen : internalOpen;
const setOpen = externalSetOpen || setInternalOpen;
return (
<>
<Button size="sm" onClick={() => setOpen(true)}>
{t("common.add_action")}
<PlusIcon />
</Button>
<Modal open={open} setOpen={setOpen} noPadding closeOnOutsideClick={false} restrictOverflow>
<div className="flex h-full flex-col rounded-lg">
<div className="rounded-t-lg bg-slate-100">
<div className="flex w-full items-center justify-between p-6">
<div className="flex items-center space-x-2">
<div className="mr-1.5 h-6 w-6 text-slate-500">
<MousePointerClickIcon className="h-5 w-5" />
<Modal open={open} setOpen={setOpen} noPadding closeOnOutsideClick={false} restrictOverflow>
<div className="flex h-full flex-col rounded-lg">
<div className="rounded-t-lg bg-slate-100">
<div className="flex w-full items-center justify-between p-6">
<div className="flex items-center space-x-2">
<div className="mr-1.5 h-6 w-6 text-slate-500">
<KeyIcon className="h-5 w-5" />
</div>
<div>
<div className="text-xl font-medium text-slate-700">
{t("environments.integrations.plain.add_key")}
</div>
<div>
<div className="text-xl font-medium text-slate-700">
{t("environments.actions.track_new_user_action")}
</div>
<div className="text-sm text-slate-500">
{t("environments.actions.track_user_action_to_display_surveys_or_create_user_segment")}
</div>
<div className="text-sm text-slate-500">
{t("environments.integrations.plain.add_key_description")}
</div>
</div>
</div>
</div>
</div>
</Modal>
</>
<div className="p-6">
<div className="mb-4">
<label htmlFor="keyLabel" className="mb-2 block text-sm font-medium text-slate-700">
{t("environments.integrations.plain.api_key_label")}
</label>
<Input
id="keyLabel"
name="keyLabel"
placeholder={t("environments.integrations.plain.api_key_label_placeholder")}
value={keyLabel}
onChange={(e) => setKeyLabel(e.target.value)}
className="w-full"
/>
</div>
<div className="flex justify-end space-x-2">
<Button variant="outline" onClick={() => setOpen(false)}>
{t("common.cancel")}
</Button>
<Button variant="default" disabled={!keyLabel.trim()}>
{t("common.connect")}
</Button>
</div>
</div>
</div>
</Modal>
);
};

View File

@@ -58,7 +58,6 @@ export const PlainWrapper = ({
return (
<>
<AddKeyModal environmentId={environment.id} actionClasses={[]} isReadOnly={false} />
{isConnected && notionIntegration ? (
<>
<AddIntegrationModal
@@ -81,12 +80,15 @@ export const PlainWrapper = ({
/>
</>
) : (
<ConnectIntegration
isEnabled={enabled}
integrationType={"plain"}
handleAuthorization={handlePlainAuthorization}
integrationLogoSrc={PlainLogo}
/>
<>
<AddKeyModal environmentId={environment.id} open={open} setOpen={setOpen} />
<ConnectIntegration
isEnabled={enabled}
integrationType={"plain"}
handleAuthorization={handlePlainAuthorization}
integrationLogoSrc={PlainLogo}
/>
</>
)}
</>
);

View File

@@ -79,7 +79,6 @@
},
"signup_without_verification_success": {
"user_successfully_created": "Benutzer erfolgreich erstellt",
"user_successfully_created_description": "Dein neuer Benutzer wurde erfolgreich erstellt. Bitte klicke auf den untenstehenden Button und melde Dich in deinem Konto an.",
"user_successfully_created_info": "Wir haben nach einem Konto gesucht, das mit {email} verknüpft ist. Wenn keines existierte, haben wir eines für Dich erstellt. Wenn bereits ein Konto existierte, wurden keine Änderungen vorgenommen. Bitte melde Dich unten an, um fortzufahren."
},
"testimonial_1": "Als open-source Firma ist uns Datenschutz extrem wichtig! Formbricks bietet die perfekte Mischung aus modernster Technologie und solidem Datenschutz.",
@@ -92,12 +91,10 @@
"invalid_token": "Ungültiges Token ☹️",
"new_email_verification_success": "Wenn die Adresse gültig ist, wurde eine Bestätigungs-E-Mail gesendet.",
"no_email_provided": "Keine E-Mail bereitgestellt",
"please_click_the_link_in_the_email_to_activate_your_account": "Bitte klicke auf den Link in der E-Mail, um dein Konto zu aktivieren.",
"please_confirm_your_email_address": "Bitte bestätige deine E-Mail-Adresse",
"resend_verification_email": "Bestätigungs-E-Mail erneut senden",
"verification_email_resent_successfully": "Bestätigungs-E-Mail gesendet! Bitte überprüfe dein Postfach.",
"verification_email_successfully_sent_info": "Wenn ein Konto mit {email} verknüpft ist, haben wir einen Bestätigungslink an diese Adresse gesendet. Bitte überprüfe dein Postfach, um die Anmeldung abzuschließen.",
"we_sent_an_email_to": "Wir haben eine E-Mail an {email} gesendet",
"you_didnt_receive_an_email_or_your_link_expired": "Hast Du keine E-Mail erhalten oder ist dein Link abgelaufen?"
},
"verify": {
@@ -132,6 +129,8 @@
"and": "und",
"and_response_limit_of": "und Antwortlimit von",
"anonymous": "Anonym",
"api_key_label": "Plain-API-Schlüssel",
"api_key_label_placeholder": "plainApiKey_xxxx",
"api_keys": "API-Schlüssel",
"app": "App",
"app_survey": "App-Umfrage",
@@ -708,6 +707,13 @@
"update_connection_tooltip": "Verbinde die Integration erneut, um neu hinzugefügte Datenbanken einzuschließen. Deine bestehenden Integrationen bleiben erhalten."
},
"notion_integration_description": "Sende Daten an deine Notion Datenbank",
"plain": {
"add_key": "Plain-API-Schlüssel hinzufügen",
"add_key_description": "Fügen Sie Ihren Plain-API-Schlüssel hinzu, um sich mit Plain zu verbinden",
"connect_with_plain": "Mit Plain verbinden",
"plain_integration": "Plain Integration",
"plain_integration_description": "Threads auf Plain mit Formbricks-Antworten erstellen"
},
"please_select_a_survey_error": "Bitte wähle eine Umfrage aus",
"select_at_least_one_question_error": "Bitte wähle mindestens eine Frage aus",
"slack": {

View File

@@ -79,7 +79,6 @@
},
"signup_without_verification_success": {
"user_successfully_created": "User successfully created",
"user_successfully_created_description": "Your new user has been created successfully. Please click the button below and sign in to your account.",
"user_successfully_created_info": "Weve checked for an account associated with {email}. If none existed, weve created one for you. If an account already existed, no changes were made. Please log in below to continue."
},
"testimonial_1": "We measure the clarity of our docs and learn from churn all on one platform. Great product, very responsive team!",
@@ -92,12 +91,10 @@
"invalid_token": "Invalid token ☹️",
"new_email_verification_success": "If the address is valid, a verification email has been sent.",
"no_email_provided": "No email provided",
"please_click_the_link_in_the_email_to_activate_your_account": "Please click the link in the email to activate your account.",
"please_confirm_your_email_address": "Please confirm your email address",
"resend_verification_email": "Resend verification email",
"verification_email_resent_successfully": "Verification email sent! Please check your inbox.",
"verification_email_successfully_sent_info": "If theres an account associated with {email}, weve sent a verification link to that address. Please check your inbox to complete the sign-up.",
"we_sent_an_email_to": "We sent an email to {email}. ",
"you_didnt_receive_an_email_or_your_link_expired": "You didn't receive an email or your link expired?"
},
"verify": {
@@ -132,6 +129,8 @@
"and": "And",
"and_response_limit_of": "and response limit of",
"anonymous": "Anonymous",
"api_key_label": "Plain API key",
"api_key_label_placeholder": "plainApiKey_xxxx",
"api_keys": "API Keys",
"app": "App",
"app_survey": "App Survey",
@@ -708,6 +707,13 @@
"update_connection_tooltip": "Reconnect the integration to include newly added databases. Your existing integrations will remain intact."
},
"notion_integration_description": "Send data to your Notion database",
"plain": {
"add_key": "Add Plain API Key",
"add_key_description": "Add your Plain API Key to connect with Plain",
"connect_with_plain": "Connect with Plain",
"plain_integration": "Plain Integration",
"plain_integration_description": "Create threads on Plain using Formbricks responses"
},
"please_select_a_survey_error": "Please select a survey",
"select_at_least_one_question_error": "Please select at least one question",
"slack": {

View File

@@ -79,7 +79,6 @@
},
"signup_without_verification_success": {
"user_successfully_created": "Utilisateur créé avec succès",
"user_successfully_created_description": "Votre nouvel utilisateur a été créé avec succès. Veuillez cliquer sur le bouton ci-dessous et vous connecter à votre compte.",
"user_successfully_created_info": "Nous avons vérifié s'il existait un compte associé à {email}. Si aucun n'existait, nous en avons créé un pour vous. Si un compte existait déjà, aucune modification n'a été apportée. Veuillez vous connecter ci-dessous pour continuer."
},
"testimonial_1": "Nous mesurons la clarté de nos documents et apprenons des abandons, le tout sur une seule plateforme. Excellent produit, équipe très réactive !",
@@ -92,12 +91,10 @@
"invalid_token": "Jeton non valide ☹️",
"new_email_verification_success": "Si l'adresse est valide, un email de vérification a été envoyé.",
"no_email_provided": "Aucun e-mail fourni",
"please_click_the_link_in_the_email_to_activate_your_account": "Veuillez cliquer sur le lien dans l'e-mail pour activer votre compte.",
"please_confirm_your_email_address": "Veuillez confirmer votre adresse e-mail.",
"resend_verification_email": "Renvoyer l'email de vérification",
"verification_email_resent_successfully": "E-mail de vérification envoyé ! Veuillez vérifier votre boîte de réception.",
"verification_email_successfully_sent_info": "Si un compte est associé à {email}, nous avons envoyé un lien de vérification à cette adresse. Veuillez vérifier votre boîte de réception pour terminer l'inscription.",
"we_sent_an_email_to": "Nous avons envoyé un email à {email}",
"you_didnt_receive_an_email_or_your_link_expired": "Vous n'avez pas reçu d'email ou votre lien a expiré ?"
},
"verify": {
@@ -132,6 +129,8 @@
"and": "Et",
"and_response_limit_of": "et limite de réponse de",
"anonymous": "Anonyme",
"api_key_label": "Clé API Plain",
"api_key_label_placeholder": "plainApiKey_xxxx",
"api_keys": "Clés API",
"app": "Application",
"app_survey": "Sondage d'application",
@@ -708,6 +707,13 @@
"update_connection_tooltip": "Reconnectez l'intégration pour inclure les nouvelles bases de données ajoutées. Vos intégrations existantes resteront intactes."
},
"notion_integration_description": "Envoyer des données à votre base de données Notion",
"plain": {
"add_key": "Ajouter une clé API Plain",
"add_key_description": "Ajoutez votre clé API Plain pour vous connecter avec Plain",
"connect_with_plain": "Se connecter avec Plain",
"plain_integration": "Intégration Plain",
"plain_integration_description": "Créer des fils sur Plain en utilisant les réponses de Formbricks"
},
"please_select_a_survey_error": "Veuillez sélectionner une enquête.",
"select_at_least_one_question_error": "Veuillez sélectionner au moins une question.",
"slack": {

View File

@@ -79,7 +79,6 @@
},
"signup_without_verification_success": {
"user_successfully_created": "Usuário criado com sucesso",
"user_successfully_created_description": "Seu novo usuário foi criado com sucesso. Por favor, clique no botão abaixo e faça login na sua conta.",
"user_successfully_created_info": "Verificamos se há uma conta associada a {email}. Se não existia, criamos uma para você. Se uma conta já existia, nenhuma alteração foi feita. Por favor, faça login abaixo para continuar."
},
"testimonial_1": "Mediamos a clareza dos nossos documentos e aprendemos com a rotatividade tudo em uma única plataforma. Ótimo produto, equipe muito atenciosa!",
@@ -92,12 +91,10 @@
"invalid_token": "Token inválido ☹️",
"new_email_verification_success": "Se o endereço for válido, um email de verificação foi enviado.",
"no_email_provided": "Nenhum e-mail fornecido",
"please_click_the_link_in_the_email_to_activate_your_account": "Por favor, clica no link do e-mail pra ativar sua conta.",
"please_confirm_your_email_address": "Por favor, confirme seu endereço de e-mail",
"resend_verification_email": "Reenviar e-mail de verificação",
"verification_email_resent_successfully": "E-mail de verificação enviado! Por favor, verifique sua caixa de entrada.",
"verification_email_successfully_sent_info": "Se houver uma conta associada a {email}, enviamos um link de verificação para esse endereço. Por favor, verifique sua caixa de entrada para completar o cadastro.",
"we_sent_an_email_to": "Enviamos um email para {email}",
"you_didnt_receive_an_email_or_your_link_expired": "Você não recebeu um e-mail ou seu link expirou?"
},
"verify": {
@@ -132,6 +129,8 @@
"and": "E",
"and_response_limit_of": "e limite de resposta de",
"anonymous": "Anônimo",
"api_key_label": "Chave API do Plain",
"api_key_label_placeholder": "plainApiKey_xxxx",
"api_keys": "Chaves de API",
"app": "app",
"app_survey": "Pesquisa de App",
@@ -708,6 +707,13 @@
"update_connection_tooltip": "Reconecte a integração para incluir os novos bancos de dados adicionados. Suas integrações existentes permanecerão intactas."
},
"notion_integration_description": "Enviar dados para seu banco de dados do Notion",
"plain": {
"add_key": "Adicionar Chave API do Plain",
"add_key_description": "Adicione sua chave API do Plain para conectar com o Plain",
"connect_with_plain": "Conectar com o Plain",
"plain_integration": "Integração com o Plain",
"plain_integration_description": "Criar threads no Plain usando respostas do Formbricks"
},
"please_select_a_survey_error": "Por favor, escolha uma pesquisa",
"select_at_least_one_question_error": "Por favor, selecione pelo menos uma pergunta",
"slack": {

View File

@@ -79,7 +79,6 @@
},
"signup_without_verification_success": {
"user_successfully_created": "Utilizador criado com sucesso",
"user_successfully_created_description": "O seu novo utilizador foi criado com sucesso. Por favor, clique no botão abaixo e inicie sessão na sua conta.",
"user_successfully_created_info": "Verificámos a existência de uma conta associada a {email}. Se não existia, criámos uma para si. Se já existia uma conta, não foram feitas alterações. Por favor, inicie sessão abaixo para continuar."
},
"testimonial_1": "Medimos a clareza dos nossos documentos e aprendemos com a rotatividade, tudo numa só plataforma. Ótimo produto, equipa muito responsiva!",
@@ -92,12 +91,10 @@
"invalid_token": "Token inválido ☹️",
"new_email_verification_success": "Se o endereço for válido, um email de verificação foi enviado.",
"no_email_provided": "Nenhum email fornecido",
"please_click_the_link_in_the_email_to_activate_your_account": "Por favor, clique no link no email para ativar a sua conta.",
"please_confirm_your_email_address": "Por favor, confirme o seu endereço de email",
"resend_verification_email": "Reenviar email de verificação",
"verification_email_resent_successfully": "Email de verificação enviado! Por favor, verifique a sua caixa de entrada.",
"verification_email_successfully_sent_info": "Se houver uma conta associada a {email}, enviámos um link de verificação para esse endereço. Por favor, verifique a sua caixa de entrada para completar o registo.",
"we_sent_an_email_to": "Enviámos um email para {email}. ",
"you_didnt_receive_an_email_or_your_link_expired": "Não recebeu um email ou o seu link expirou?"
},
"verify": {
@@ -132,6 +129,8 @@
"and": "E",
"and_response_limit_of": "e limite de resposta de",
"anonymous": "Anónimo",
"api_key_label": "Chave API do Plain",
"api_key_label_placeholder": "plainApiKey_xxxx",
"api_keys": "Chaves API",
"app": "Aplicação",
"app_survey": "Inquérito da Aplicação",
@@ -708,6 +707,13 @@
"update_connection_tooltip": "Restabeleça a integração para incluir as bases de dados recentemente adicionadas. As suas integrações existentes permanecerão intactas."
},
"notion_integration_description": "Enviar dados para a sua base de dados do Notion",
"plain": {
"add_key": "Adicionar Chave API do Plain",
"add_key_description": "Adicione a sua chave API do Plain para ligar ao Plain",
"connect_with_plain": "Ligar ao Plain",
"plain_integration": "Integração com Plain",
"plain_integration_description": "Criar tópicos no Plain usando respostas do Formbricks"
},
"please_select_a_survey_error": "Por favor, selecione um inquérito",
"select_at_least_one_question_error": "Por favor, selecione pelo menos uma pergunta",
"slack": {

View File

@@ -79,7 +79,6 @@
},
"signup_without_verification_success": {
"user_successfully_created": "使用者建立成功",
"user_successfully_created_description": "您的新使用者已成功建立。請點擊下方按鈕並登入您的帳戶。",
"user_successfully_created_info": "我們已檢查與 {email} 相關聯的帳戶。如果不存在,我們已為您建立一個。如果帳戶已存在,則未進行任何更改。請在下方登入以繼續。"
},
"testimonial_1": "我們在同一個平台上測量文件的清晰度,並從客戶流失中學習。很棒的產品,團隊反應非常迅速!",
@@ -92,12 +91,10 @@
"invalid_token": "無效的權杖 ☹️",
"new_email_verification_success": "如果地址有效,驗證電子郵件已發送。",
"no_email_provided": "未提供電子郵件",
"please_click_the_link_in_the_email_to_activate_your_account": "請點擊電子郵件中的連結以啟用您的帳戶。",
"please_confirm_your_email_address": "請確認您的電子郵件地址",
"resend_verification_email": "重新發送驗證電子郵件",
"verification_email_resent_successfully": "驗證電子郵件已發送!請檢查您的收件箱。",
"verification_email_successfully_sent_info": "如果有一個帳戶與 {email} 相關聯,我們已發送驗證連結至該地址。請檢查您的收件箱以完成註冊。",
"we_sent_an_email_to": "我們已發送一封電子郵件至 <email>'{'email'}'</email>。",
"you_didnt_receive_an_email_or_your_link_expired": "您沒有收到電子郵件或您的連結已過期?"
},
"verify": {
@@ -132,6 +129,8 @@
"and": "且",
"and_response_limit_of": "且回應上限為",
"anonymous": "匿名",
"api_key_label": "Plain API 金鑰",
"api_key_label_placeholder": "plainApiKey_xxxx",
"api_keys": "API 金鑰",
"app": "應用程式",
"app_survey": "應用程式問卷",
@@ -708,6 +707,13 @@
"update_connection_tooltip": "重新連接整合以包含新添加的資料庫。您現有的整合將保持不變。"
},
"notion_integration_description": "將資料傳送至您的 Notion 資料庫",
"plain": {
"add_key": "新增 Plain API 金鑰",
"add_key_description": "添加你的 Plain API Key 以連線 Plain",
"connect_with_plain": "連線 Plain",
"plain_integration": "Plain 整合",
"plain_integration_description": "使用 Formbricks 回應在 Plain 上建立 threads"
},
"please_select_a_survey_error": "請選取問卷",
"select_at_least_one_question_error": "請選取至少一個問題",
"slack": {