From ec738515b76739af6bbabb96d8b221abdc374f03 Mon Sep 17 00:00:00 2001 From: Matt Aitken Date: Tue, 20 Jun 2023 22:21:36 +0100 Subject: [PATCH] Initial work on feedback form --- apps/webapp/app/components/Feedback.tsx | 125 ++++++++++++++++++ .../app/components/navigation/NavBar.tsx | 15 +-- .../app/components/primitives/TextArea.tsx | 16 +++ apps/webapp/app/env.server.ts | 1 + apps/webapp/app/routes/resources.feedback.ts | 48 +++++++ apps/webapp/package.json | 1 + pnpm-lock.yaml | 36 ++++- 7 files changed, 229 insertions(+), 13 deletions(-) create mode 100644 apps/webapp/app/components/Feedback.tsx create mode 100644 apps/webapp/app/components/primitives/TextArea.tsx create mode 100644 apps/webapp/app/routes/resources.feedback.ts diff --git a/apps/webapp/app/components/Feedback.tsx b/apps/webapp/app/components/Feedback.tsx new file mode 100644 index 000000000..029932e33 --- /dev/null +++ b/apps/webapp/app/components/Feedback.tsx @@ -0,0 +1,125 @@ +import { ChatBubbleLeftRightIcon } from "@heroicons/react/24/solid"; +import { Button } from "./primitives/Buttons"; +import { + Sheet, + SheetBody, + SheetContent, + SheetHeader, + SheetTrigger, +} from "./primitives/Sheet"; +import { Header1 } from "./primitives/Headers"; +import { NamedIconInBox } from "./primitives/NamedIcon"; +import { Paragraph } from "./primitives/Paragraph"; +import { + Form, + useActionData, + useLocation, + useNavigation, +} from "@remix-run/react"; +import { Fieldset } from "./primitives/Fieldset"; +import { InputGroup } from "./primitives/InputGroup"; +import { Label } from "./primitives/Label"; +import { + Select, + SelectContent, + SelectGroup, + SelectItem, + SelectLabel, + SelectSeparator, + SelectTrigger, + SelectValue, +} from "./primitives/Select"; +import { FormButtons } from "./primitives/FormButtons"; +import { conform, useForm } from "@conform-to/react"; +import { parse } from "@conform-to/zod"; +import { schema } from "~/routes/resources.feedback"; +import { FormError } from "./primitives/FormError"; +import { Input } from "./primitives/Input"; +import { TextArea } from "./primitives/TextArea"; +import { useState } from "react"; +import { set } from "jsonpointer"; + +export function Feedback() { + const [open, setOpen] = useState(false); + const location = useLocation(); + const lastSubmission = useActionData(); + const navigation = useNavigation(); + + const [form, { redirectPath, feedbackType, message }] = useForm({ + id: "accept-invite", + lastSubmission, + onValidate({ formData }) { + return parse(formData, { schema }); + }, + }); + + if ( + open && + navigation.formAction === "/resources/feedback" && + form.error === undefined && + form.errors.length === 0 + ) { + setOpen(false); + } + + return ( + + + + + + Give us feedback + + + We'd love to hear your feedback, good, bad or ugly. + +
+
+ + + + + + + + {feedbackType.error} + + + + +