// TODO: i18n import { serverSideTranslations } from "next-i18next/serverSideTranslations"; import SkeletonLoaderTeamList from "@calcom/features/ee/teams/components/SkeletonloaderTeamList"; import Shell, { ShellMain } from "@calcom/features/shell/Shell"; import { UpgradeTip } from "@calcom/features/tips"; import { WEBAPP_URL } from "@calcom/lib/constants"; import useApp from "@calcom/lib/hooks/useApp"; import { useHasPaidPlan } from "@calcom/lib/hooks/useHasPaidPlan"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { trpc } from "@calcom/trpc/react"; import type { AppGetServerSidePropsContext, AppPrisma, AppUser } from "@calcom/types/AppGetServerSideProps"; import { Badge, ButtonGroup, EmptyScreen, List, ListLinkItem, Tooltip, Button } from "@calcom/ui"; import { Plus, GitMerge, ExternalLink, Link as LinkIcon, Edit, Download, Code, Copy, Trash, Menu, MessageCircle, FileText, Shuffle, BarChart, CheckCircle, Mail, } from "@calcom/ui/components/icon"; import type { inferSSRProps } from "@lib/types/inferSSRProps"; import { FormAction, FormActionsDropdown, FormActionsProvider } from "../../components/FormActions"; import { getSerializableForm } from "../../lib/getSerializableForm"; export default function RoutingForms({ forms: forms_, appUrl, }: inferSSRProps & { appUrl: string }) { const { t } = useLocale(); const { hasPaidPlan } = useHasPaidPlan(); const { data: forms, isLoading } = trpc.viewer.appRoutingForms.forms.useQuery(undefined, { initialData: forms_, }); const { data: typeformApp } = useApp("typeform"); const features = [ { icon: , title: t("create_your_first_form"), description: t("create_your_first_form_description"), }, { icon: , title: t("create_your_first_route"), description: t("route_to_the_right_person"), }, { icon: , title: t("reporting"), description: t("reporting_feature"), }, { icon: , title: t("test_routing_form"), description: t("test_preview_description"), }, { icon: , title: t("routing_forms_send_email_owner"), description: t("routing_forms_send_email_owner_description"), }, { icon: , title: t("download_responses"), description: t("download_responses_description"), }, ]; function NewFormButton() { return ( {t("new")} ); } return ( } subtitle={t("routing_forms_description")}> } buttons={
}>
{!forms?.length ? ( } /> ) : null} {forms?.length ? (
{forms.map((form, index) => { if (!form) { return null; } const description = form.description || ""; const disabled = form.disabled; form.routes = form.routes || []; const fields = form.fields || []; return ( {t("edit")} {t("download_responses")} {t("duplicate")} {typeformApp?.isInstalled ? ( {t("Copy Typeform Redirect Url")} ) : null} {t("delete")} }>
{fields.length} {fields.length === 1 ? "field" : "fields"} {form.routes.length} {form.routes.length === 1 ? "route" : "routes"} {form._count.responses} {form._count.responses === 1 ? "response" : "responses"}
); })}
) : null}
); } RoutingForms.getLayout = (page: React.ReactElement) => { return ( {page} ); }; export const getServerSideProps = async function getServerSideProps( context: AppGetServerSidePropsContext, prisma: AppPrisma, user: AppUser ) { if (!user) { return { redirect: { permanent: false, destination: "/auth/login", }, }; } const forms = await prisma.app_RoutingForms_Form.findMany({ where: { userId: user.id, }, orderBy: { createdAt: "desc", }, include: { _count: { select: { responses: true, }, }, }, }); const serializableForms = []; for (const [, form] of Object.entries(forms)) { serializableForms.push(await getSerializableForm(form)); } return { props: { ...(await serverSideTranslations(context.locale ?? "", ["common"])), forms: serializableForms, }, }; };