From 9788b46fee700d617a0e556f624698ffff122b70 Mon Sep 17 00:00:00 2001 From: Pascal Senn Date: Mon, 22 Sep 2025 22:39:40 +0200 Subject: [PATCH 1/2] feat(website): add contact form --- website/src/components/misc/index.ts | 1 + website/src/components/misc/support-form.tsx | 245 ++++++++++++++++++ website/src/hooks/index.ts | 2 + website/src/hooks/use-form-submission.ts | 96 +++++++ website/src/hooks/use-support-form.ts | 153 +++++++++++ website/src/pages/services/support.tsx | 19 +- .../src/pages/services/support/contact.tsx | 33 +++ .../src/pages/services/support/thank-you.tsx | 124 +++++++++ website/src/types/support.ts | 3 + website/src/utils/url-helpers.ts | 58 +++++ 10 files changed, 723 insertions(+), 11 deletions(-) create mode 100644 website/src/components/misc/support-form.tsx create mode 100644 website/src/hooks/use-form-submission.ts create mode 100644 website/src/hooks/use-support-form.ts create mode 100644 website/src/pages/services/support/contact.tsx create mode 100644 website/src/pages/services/support/thank-you.tsx create mode 100644 website/src/types/support.ts create mode 100644 website/src/utils/url-helpers.ts diff --git a/website/src/components/misc/index.ts b/website/src/components/misc/index.ts index d79856e55c1..4147f9f0feb 100644 --- a/website/src/components/misc/index.ts +++ b/website/src/components/misc/index.ts @@ -17,3 +17,4 @@ export * from "./seo"; export * from "./spinner"; export * from "./sr-only"; export * from "./support-card"; +export * from "./support-form"; diff --git a/website/src/components/misc/support-form.tsx b/website/src/components/misc/support-form.tsx new file mode 100644 index 00000000000..fddfc7ede14 --- /dev/null +++ b/website/src/components/misc/support-form.tsx @@ -0,0 +1,245 @@ +import { useFormSubmission, useSupportForm } from "@/hooks"; +import { FONT_FAMILY_HEADING, THEME_COLORS } from "@/style"; +import { SUPPORT_PLANS, SupportPlan } from "@/types/support"; +import React, { FC, FormEvent } from "react"; +import styled from "styled-components"; +import { Button } from "./button"; + +interface SupportFormProps { + readonly className?: string; + readonly initialPlan?: SupportPlan; +} + +export const SupportForm: FC = ({ + className, + initialPlan = "Startup", +}) => { + const { formData, errors, updateField, validateForm } = useSupportForm({ + initialPlan, + }); + + const { isSubmitting, submitForm } = useFormSubmission(); + + const handleSubmit = async (e: FormEvent) => { + e.preventDefault(); + + if (!validateForm()) { + return; + } + + await submitForm(formData); + }; + + return ( + + Contact Support + + Fill out the form below and we'll get back to you as soon as possible. + + +
+ + + updateField("name", e.target.value)} + $hasError={!!errors.name} + disabled={isSubmitting} + /> + {errors.name && {errors.name}} + + + + + updateField("email", e.target.value)} + $hasError={!!errors.email} + disabled={isSubmitting} + /> + {errors.email && {errors.email}} + + + + + updateField("company", e.target.value)} + $hasError={!!errors.company} + disabled={isSubmitting} + /> + {errors.company && {errors.company}} + + + + + + + + + +