From 2bdaa405ef631cce5096938040b7ecedaa189218 Mon Sep 17 00:00:00 2001 From: "Kalle (Sendou)" <38327916+Sendouc@users.noreply.github.com> Date: Mon, 9 Aug 2021 00:35:15 +0300 Subject: [PATCH] Calendar get likes via SWR --- components/freeagents/FreeAgentSection.tsx | 6 +++--- hooks/freeagents.ts | 10 ++++------ pages/api/free-agents/likes.ts | 21 +++++++++++++++++++++ routers/freeagents.ts | 6 ------ services/freeagents.ts | 8 +++++--- 5 files changed, 33 insertions(+), 18 deletions(-) create mode 100644 pages/api/free-agents/likes.ts diff --git a/components/freeagents/FreeAgentSection.tsx b/components/freeagents/FreeAgentSection.tsx index d26d451e0..4ba51aa19 100644 --- a/components/freeagents/FreeAgentSection.tsx +++ b/components/freeagents/FreeAgentSection.tsx @@ -22,6 +22,7 @@ import { getToastOptions } from "utils/objects"; import { trpc } from "utils/trpc"; import { Unpacked } from "utils/types"; import { FreeAgentsGet } from "pages/api/free-agents"; +import { mutate } from "swr"; const playstyleToEmoji = { FRONTLINE: RiSwordLine, @@ -45,10 +46,9 @@ const FreeAgentSection = ({ postRef?: RefObject; }) => { const toast = useToast(); - const utils = trpc.useQueryUtils(); const addLikeMutation = trpc.useMutation("freeAgents.addLike", { onSuccess() { - utils.invalidateQuery(["freeAgents.likes"]); + mutate("/api/free-agents/likes"); }, onError(error) { toast(getToastOptions(error.message, "error")); @@ -56,7 +56,7 @@ const FreeAgentSection = ({ }); const deleteLikeMutation = trpc.useMutation("freeAgents.deleteLike", { onSuccess() { - utils.invalidateQuery(["freeAgents.likes"]); + mutate("/api/free-agents/likes"); }, onError(error) { toast(getToastOptions(error.message, "error")); diff --git a/hooks/freeagents.ts b/hooks/freeagents.ts index 94b585d8e..5c744b487 100644 --- a/hooks/freeagents.ts +++ b/hooks/freeagents.ts @@ -2,10 +2,10 @@ import { Playstyle } from "@prisma/client"; import { countries } from "countries-list"; import { useUser } from "hooks/common"; import { FreeAgentsGet } from "pages/api/free-agents"; +import { LikesGet } from "pages/api/free-agents/likes"; import { Dispatch, useMemo, useReducer } from "react"; import useSWR from "swr"; import { getBooleanFromString, getWeaponFromString } from "utils/strings"; -import { trpc } from "utils/trpc"; import { isFreeAgentPlaystyle, isFreeAgentRegion } from "utils/typeGuards"; import { useMyRouter } from "./useMyRouter"; @@ -70,9 +70,7 @@ export function useFreeAgents(postsInitialData: FreeAgentsGet) { (post) => post.user.discordId === user?.discordId ); - const { data: likesData } = trpc.useQuery(["freeAgents.likes"], { - enabled: !!usersPost, - }); + const likes = useSWR(usersPost ? "/api/free-agents/likes" : null); const [state, dispatch] = useReducer( (oldState: UseFreeAgentsState, action: Action) => { @@ -177,10 +175,10 @@ export function useFreeAgents(postsInitialData: FreeAgentsGet) { postsData: filteredPostsData, refetchPosts: posts.mutate, allPostsCount: (posts.data ?? []).length, - likesData, + likesData: likes.data, isLoading: !posts.data, usersPost, - matchedPosts: (likesData?.matchedPostIds ?? []).map((id) => + matchedPosts: (likes.data?.matchedPostIds ?? []).map((id) => (filteredPostsData ?? []).find((post) => post.id === id) ), state, diff --git a/pages/api/free-agents/likes.ts b/pages/api/free-agents/likes.ts new file mode 100644 index 000000000..aa65ca39b --- /dev/null +++ b/pages/api/free-agents/likes.ts @@ -0,0 +1,21 @@ +import { NextApiRequest, NextApiResponse } from "next"; +import { createHandler, getMySession } from "utils/api"; +import freeAgentsService, { LikesData } from "services/freeagents"; +import { Serialized } from "utils/types"; + +export type LikesGet = Serialized; + +const GET = async (req: NextApiRequest, res: NextApiResponse) => { + const user = await getMySession(req); + if (!user) { + return res.status(401).end(); + } + + const likes = await freeAgentsService.likes({ user }); + res.status(200).json(likes); +}; + +const likesHandler = (req: NextApiRequest, res: NextApiResponse) => + createHandler(req, res, { GET }); + +export default likesHandler; diff --git a/routers/freeagents.ts b/routers/freeagents.ts index 928cc4e1b..5f8484362 100644 --- a/routers/freeagents.ts +++ b/routers/freeagents.ts @@ -5,12 +5,6 @@ import { freeAgentPostSchema } from "utils/validators/fapost"; import * as z from "zod"; const freeAgentsApi = createRouter() - .query("likes", { - resolve({ ctx }) { - const user = throwIfNotLoggedIn(ctx.user); - return service.likes(user.id); - }, - }) .mutation("upsertPost", { input: freeAgentPostSchema, resolve({ ctx, input }) { diff --git a/services/freeagents.ts b/services/freeagents.ts index 9599cdbf7..114e79899 100644 --- a/services/freeagents.ts +++ b/services/freeagents.ts @@ -1,4 +1,4 @@ -import { Prisma } from "@prisma/client"; +import { Prisma, User } from "@prisma/client"; import { httpError } from "@trpc/server"; import prisma from "prisma/client"; import { freeAgentPostSchema } from "utils/validators/fapost"; @@ -78,9 +78,11 @@ const deletePost = async (userId: number) => { return prisma.freeAgentPost.delete({ where: { userId } }); }; -const likes = async (userId: number) => { +export type LikesData = Prisma.PromiseReturnType; + +const likes = async ({ user }: { user: User }) => { const post = await prisma.freeAgentPost.findUnique({ - where: { userId }, + where: { userId: user.id }, include: { likedPosts: { select: { id: true } }, likersPosts: { select: { id: true, updatedAt: true } },