From 950f2be4023aa75477bbfd0fb3371e054658de02 Mon Sep 17 00:00:00 2001 From: "Kalle (Sendou)" <38327916+Sendouc@users.noreply.github.com> Date: Tue, 9 Mar 2021 00:01:59 +0200 Subject: [PATCH] new api for plus --- app/plus/api.ts | 9 ++++- app/plus/components/Suggestion.tsx | 25 ++++++++---- app/plus/components/SuggestionModal.tsx | 25 ++++++++---- app/plus/components/VouchModal.tsx | 25 ++++++++---- app/plus/service.ts | 19 +++++---- hooks/useMutation.ts | 51 ------------------------- pages/api/plus/index.ts | 23 ----------- pages/api/plus/vouch.ts | 40 ------------------- 8 files changed, 68 insertions(+), 149 deletions(-) delete mode 100644 hooks/useMutation.ts delete mode 100644 pages/api/plus/index.ts delete mode 100644 pages/api/plus/vouch.ts diff --git a/app/plus/api.ts b/app/plus/api.ts index 58a3d05ac..06708b8e3 100644 --- a/app/plus/api.ts +++ b/app/plus/api.ts @@ -1,6 +1,7 @@ import { createRouter } from "pages/api/trpc/[trpc]"; import { throwIfNotLoggedIn } from "utils/api"; import { suggestionFullSchema } from "utils/validators/suggestion"; +import { vouchSchema } from "utils/validators/vouch"; import service from "./service"; const plusApi = createRouter() @@ -20,6 +21,12 @@ const plusApi = createRouter() const user = throwIfNotLoggedIn(ctx.user); return service.addSuggestion({ input, userId: user.id }); }, + }) + .mutation("vouch", { + input: vouchSchema, + resolve({ input, ctx }) { + const user = throwIfNotLoggedIn(ctx.user); + return service.addVouch({ input, userId: user.id }); + }, }); - export default plusApi; diff --git a/app/plus/components/Suggestion.tsx b/app/plus/components/Suggestion.tsx index 5b8661c58..315bf878f 100644 --- a/app/plus/components/Suggestion.tsx +++ b/app/plus/components/Suggestion.tsx @@ -6,6 +6,7 @@ import { FormHelperText, FormLabel, Textarea, + useToast, } from "@chakra-ui/react"; import { zodResolver } from "@hookform/resolvers/zod"; import { Trans } from "@lingui/macro"; @@ -14,10 +15,11 @@ import MyLink from "components/common/MyLink"; import SubText from "components/common/SubText"; import UserAvatar from "components/common/UserAvatar"; import { useMyTheme } from "hooks/common"; -import useMutation from "hooks/useMutation"; import { useState } from "react"; import { useForm } from "react-hook-form"; +import { getToastOptions } from "utils/getToastOptions"; import { getFullUsername } from "utils/strings"; +import { trpc } from "utils/trpc"; import { Unpacked } from "utils/types"; import { resuggestionSchema, @@ -34,16 +36,23 @@ const Suggestion = ({ suggestion: Unpacked; canSuggest: boolean; }) => { + const toast = useToast(); const { gray } = useMyTheme(); const [showTextarea, setShowTextarea] = useState(false); const { handleSubmit, errors, register, watch } = useForm({ resolver: zodResolver(resuggestionSchema), }); - const { onSubmit, sending } = useMutation({ - route: "plus/suggestions", - mutationKey: "plus/suggestions", - successText: "Comment added", - onSuccess: () => setShowTextarea(false), + + const { mutate, status } = trpc.useMutation("plus.suggestion", { + onSuccess() { + toast(getToastOptions("Comment added", "success")); + // TODO: + trpc.queryClient.invalidateQueries(["plus.suggestions"]); + setShowTextarea(false); + }, + onError(error) { + toast(getToastOptions(error.message, "error")); + }, }); const watchDescription = watch("description", ""); @@ -100,7 +109,7 @@ const Suggestion = ({ {showTextarea && (
- onSubmit({ + mutate({ ...values, // region doesn't matter as it is not updated after the first suggestion region: "NA", @@ -127,7 +136,7 @@ const Suggestion = ({ size="sm" mr={3} type="submit" - isLoading={sending} + isLoading={status === "loading"} data-cy="submit-button" > Save diff --git a/app/plus/components/SuggestionModal.tsx b/app/plus/components/SuggestionModal.tsx index b00e3727b..68062ef86 100644 --- a/app/plus/components/SuggestionModal.tsx +++ b/app/plus/components/SuggestionModal.tsx @@ -13,12 +13,14 @@ import { ModalOverlay, Select, Textarea, + useToast, } from "@chakra-ui/react"; import { zodResolver } from "@hookform/resolvers/zod"; import UserSelector from "components/common/UserSelector"; -import useMutation from "hooks/useMutation"; import { useState } from "react"; import { Controller, useForm } from "react-hook-form"; +import { getToastOptions } from "utils/getToastOptions"; +import { trpc } from "utils/trpc"; import { suggestionFullSchema, SUGGESTION_DESCRIPTION_LIMIT, @@ -32,15 +34,22 @@ interface Props { type FormData = z.infer; const SuggestionModal: React.FC = ({ userPlusMembershipTier }) => { + const toast = useToast(); const [isOpen, setIsOpen] = useState(false); const { handleSubmit, errors, register, watch, control } = useForm({ resolver: zodResolver(suggestionFullSchema), }); - const { onSubmit, sending } = useMutation({ - onSuccess: () => setIsOpen(false), - route: "plus/suggestions", - mutationKey: "plus/suggestions", - successText: "New suggestion submitted", + + const { mutate, status } = trpc.useMutation("plus.suggestion", { + onSuccess() { + toast(getToastOptions("New suggestion submitted", "success")); + // TODO: + trpc.queryClient.invalidateQueries(["plus.suggestions"]); + setIsOpen(false); + }, + onError(error) { + toast(getToastOptions(error.message, "error")); + }, }); const watchDescription = watch("description", ""); @@ -66,7 +75,7 @@ const SuggestionModal: React.FC = ({ userPlusMembershipTier }) => { Adding a new suggestion - + mutate(data))}> Tier = ({ userPlusMembershipTier }) => {