diff --git a/apps/web/app/environments/[environmentId]/surveys/[surveyId]/edit/CTAQuestionForm.tsx b/apps/web/app/environments/[environmentId]/surveys/[surveyId]/edit/CTAQuestionForm.tsx new file mode 100644 index 0000000000..e7800cfb2b --- /dev/null +++ b/apps/web/app/environments/[environmentId]/surveys/[surveyId]/edit/CTAQuestionForm.tsx @@ -0,0 +1,125 @@ +"use client"; + +import type { CTAQuestion } from "@formbricks/types/questions"; +import { Editor, Input, Label } from "@formbricks/ui"; +import { RadioGroup, RadioGroupItem } from "@formbricks/ui"; +import { useState } from "react"; +import { md } from "@formbricks/lib/markdownIt"; + +interface CTAQuestionFormProps { + question: CTAQuestion; + questionIdx: number; + updateQuestion: (questionIdx: number, updatedAttributes: any) => void; + lastQuestion: boolean; +} + +export default function CTAQuestionForm({ + question, + questionIdx, + updateQuestion, + lastQuestion, +}: CTAQuestionFormProps) { + const [firstRender, setFirstRender] = useState(true); + return ( +
+ ); +} diff --git a/apps/web/app/environments/[environmentId]/surveys/[surveyId]/edit/QuestionCard.tsx b/apps/web/app/environments/[environmentId]/surveys/[surveyId]/edit/QuestionCard.tsx index 0aa91b8acd..0af858efc1 100644 --- a/apps/web/app/environments/[environmentId]/surveys/[surveyId]/edit/QuestionCard.tsx +++ b/apps/web/app/environments/[environmentId]/surveys/[surveyId]/edit/QuestionCard.tsx @@ -15,6 +15,7 @@ import OpenQuestionForm from "./OpenQuestionForm"; import QuestionDropdown from "./QuestionDropdown"; import NPSQuestionForm from "./NPSQuestionForm"; import UpdateQuestionId from "./UpdateQuestionId"; +import CTAQuestionForm from "./CTAQuestionForm"; interface QuestionCardProps { localSurvey: Survey; @@ -131,6 +132,13 @@ export default function QuestionCard({ updateQuestion={updateQuestion} lastQuestion={lastQuestion} /> + ) : question.type === "cta" ? ( +{response.question}
- {typeof response.answer === "string" ? ( + {typeof response.answer !== "object" ? ({response.answer}
) : ({response.answer.join(", ")}
diff --git a/apps/web/app/environments/[environmentId]/surveys/[surveyId]/summary/CTASummary.tsx b/apps/web/app/environments/[environmentId]/surveys/[surveyId]/summary/CTASummary.tsx new file mode 100644 index 0000000000..2a420a45ca --- /dev/null +++ b/apps/web/app/environments/[environmentId]/surveys/[surveyId]/summary/CTASummary.tsx @@ -0,0 +1,57 @@ +import { ProgressBar } from "@formbricks/ui"; +import type { QuestionSummary } from "@formbricks/types/responses"; +import { InboxStackIcon } from "@heroicons/react/24/solid"; +import { useMemo } from "react"; + +interface CTASummaryProps { + questionSummary: QuestionSummary; +} + +interface ChoiceResult { + count: number; + percentage: number; +} + +export default function CTASummary({ questionSummary }: CTASummaryProps) { + const ctr: ChoiceResult = useMemo(() => { + const clickedAbs = questionSummary.responses.filter((response) => response.value === "clicked").length; + + return { + count: questionSummary.responses.length, + percentage: clickedAbs / questionSummary.responses.length, + }; + }, [questionSummary]); + + return ( +Clickthrough Rate (CTR)
++ {Math.round(ctr.percentage * 100)}% +
++ {ctr.count} {ctr.count === 1 ? "response" : "responses"} +
+