From 52b3444d4d43afe53a0dcca99f3f92098039ba18 Mon Sep 17 00:00:00 2001 From: Atridad Lahiji Date: Sun, 27 Aug 2023 23:57:17 -0600 Subject: [PATCH] App router almost done --- .../_components}/Footer.tsx | 4 +- .../_components}/Navbar.tsx | 7 +- .../_components}/RoomList.tsx | 10 +- .../_components}/templates/Welcome.tsx | 0 src/app/_trpc/Provider.tsx | 27 +++++ src/app/_trpc/client.ts | 5 + src/app/api/trpc/[trpc]/route.ts | 17 +++ .../index.tsx => app/dashboard/page.tsx} | 4 +- src/app/layout.tsx | 29 +++++ src/{pages/index.tsx => app/page.tsx} | 0 .../room/[id].tsx => app/room/[id]/page.tsx} | 18 +-- .../sign-in/[[...sign-in]]/page.tsx} | 4 + .../sign-up/[[...sign-up]]/page.tsx} | 4 + src/pages/_app.tsx | 24 ---- src/pages/_document.tsx | 62 ----------- src/pages/api/[...trpc].ts | 19 ---- src/pages/api/trpc/[...trpc].ts | 19 ---- src/server/api/root.ts | 16 --- src/server/api/trpc.ts | 104 ------------------ src/server/trpc/index.ts | 10 ++ src/server/{api => trpc}/routers/room.ts | 2 +- src/server/{api => trpc}/routers/vote.ts | 2 +- src/server/trpc/trpc.ts | 47 ++++++++ src/server/webhookHelpers.ts | 2 +- src/styles/globals.css | 9 -- src/utils/api.ts | 68 ------------ tsconfig.json | 24 +++- 27 files changed, 192 insertions(+), 345 deletions(-) rename src/{components => app/_components}/Footer.tsx (93%) rename src/{components => app/_components}/Navbar.tsx (91%) rename src/{components => app/_components}/RoomList.tsx (95%) rename src/{components => app/_components}/templates/Welcome.tsx (100%) create mode 100644 src/app/_trpc/Provider.tsx create mode 100644 src/app/_trpc/client.ts create mode 100644 src/app/api/trpc/[trpc]/route.ts rename src/{pages/dashboard/index.tsx => app/dashboard/page.tsx} (97%) create mode 100644 src/app/layout.tsx rename src/{pages/index.tsx => app/page.tsx} (100%) rename src/{pages/room/[id].tsx => app/room/[id]/page.tsx} (97%) rename src/{pages/sign-in/[[...index]].tsx => app/sign-in/[[...sign-in]]/page.tsx} (85%) rename src/{pages/sign-up/[[...index]].tsx => app/sign-up/[[...sign-up]]/page.tsx} (85%) delete mode 100644 src/pages/_app.tsx delete mode 100644 src/pages/_document.tsx delete mode 100644 src/pages/api/[...trpc].ts delete mode 100644 src/pages/api/trpc/[...trpc].ts delete mode 100644 src/server/api/root.ts delete mode 100644 src/server/api/trpc.ts create mode 100644 src/server/trpc/index.ts rename src/server/{api => trpc}/routers/room.ts (98%) rename src/server/{api => trpc}/routers/vote.ts (96%) create mode 100644 src/server/trpc/trpc.ts delete mode 100644 src/utils/api.ts diff --git a/src/components/Footer.tsx b/src/app/_components/Footer.tsx similarity index 93% rename from src/components/Footer.tsx rename to src/app/_components/Footer.tsx index 03d153e..ed59472 100644 --- a/src/components/Footer.tsx +++ b/src/app/_components/Footer.tsx @@ -1,5 +1,7 @@ +"use client"; + import { GiTechnoHeart } from "react-icons/gi"; -import packagejson from "../../package.json"; +import packagejson from "../../../package.json"; const Footer = () => { return ( diff --git a/src/components/Navbar.tsx b/src/app/_components/Navbar.tsx similarity index 91% rename from src/components/Navbar.tsx rename to src/app/_components/Navbar.tsx index 8524ddb..1efac23 100644 --- a/src/components/Navbar.tsx +++ b/src/app/_components/Navbar.tsx @@ -1,7 +1,9 @@ +"use client"; + import { UserButton, useUser } from "@clerk/nextjs"; import Image from "next/image"; import Link from "next/link"; -import { useRouter } from "next/router"; +import { useRouter, usePathname } from "next/navigation"; import { env } from "~/env.mjs"; interface NavbarProps { @@ -11,9 +13,10 @@ interface NavbarProps { const Navbar = ({ title }: NavbarProps) => { const { isLoaded, isSignedIn } = useUser(); const router = useRouter(); + const pathname = usePathname(); const navigationMenu = () => { - if (router.pathname !== "/dashboard" && isSignedIn) { + if (pathname !== "/dashboard" && isSignedIn) { return ( Dashboard diff --git a/src/components/RoomList.tsx b/src/app/_components/RoomList.tsx similarity index 95% rename from src/components/RoomList.tsx rename to src/app/_components/RoomList.tsx index f59bf7a..02ebc7b 100644 --- a/src/components/RoomList.tsx +++ b/src/app/_components/RoomList.tsx @@ -1,10 +1,12 @@ +"use client"; + import Link from "next/link"; import { configureAbly, useChannel } from "@ably-labs/react-hooks"; import { useState } from "react"; import { IoEnterOutline, IoTrashBinOutline } from "react-icons/io5"; import { env } from "~/env.mjs"; -import { api } from "~/utils/api"; import { useUser } from "@clerk/nextjs"; +import { trpc } from "../_trpc/client"; const RoomList = () => { const { isSignedIn, user } = useUser(); @@ -25,11 +27,11 @@ const RoomList = () => { const [roomName, setRoomName] = useState(""); const { data: roomsFromDb, refetch: refetchRoomsFromDb } = - api.room.getAll.useQuery(undefined, { + trpc.room.getAll.useQuery(undefined, { enabled: isSignedIn, }); - const createRoom = api.room.create.useMutation({}); + const createRoom = trpc.room.create.useMutation({}); const createRoomHandler = () => { createRoom.mutate({ name: roomName }); @@ -39,7 +41,7 @@ const RoomList = () => { false; }; - const deleteRoom = api.room.delete.useMutation({}); + const deleteRoom = trpc.room.delete.useMutation({}); const deleteRoomHandler = (roomId: string) => { if (isSignedIn) { diff --git a/src/components/templates/Welcome.tsx b/src/app/_components/templates/Welcome.tsx similarity index 100% rename from src/components/templates/Welcome.tsx rename to src/app/_components/templates/Welcome.tsx diff --git a/src/app/_trpc/Provider.tsx b/src/app/_trpc/Provider.tsx new file mode 100644 index 0000000..94f47df --- /dev/null +++ b/src/app/_trpc/Provider.tsx @@ -0,0 +1,27 @@ +"use client"; + +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import { httpBatchLink } from "@trpc/client"; +import React, { useState } from "react"; +import superjson from "superjson"; + +import { trpc } from "./client"; + +export default function Provider({ children }: { children: React.ReactNode }) { + const [queryClient] = useState(() => new QueryClient({})); + const [trpcClient] = useState(() => + trpc.createClient({ + links: [ + httpBatchLink({ + url: "http://localhost:3000/api/trpc", + }), + ], + transformer: superjson, + }) + ); + return ( + + {children} + + ); +} diff --git a/src/app/_trpc/client.ts b/src/app/_trpc/client.ts new file mode 100644 index 0000000..dec3bb5 --- /dev/null +++ b/src/app/_trpc/client.ts @@ -0,0 +1,5 @@ +import { createTRPCReact } from "@trpc/react-query"; + +import { type AppRouter } from "~/server/trpc"; + +export const trpc = createTRPCReact({}); diff --git a/src/app/api/trpc/[trpc]/route.ts b/src/app/api/trpc/[trpc]/route.ts new file mode 100644 index 0000000..5024554 --- /dev/null +++ b/src/app/api/trpc/[trpc]/route.ts @@ -0,0 +1,17 @@ +import { fetchRequestHandler } from "@trpc/server/adapters/fetch"; + +import { appRouter } from "~/server/trpc"; +import { createTRPCContext } from "~/server/trpc/trpc"; + +export const runtime = "edge"; +export const preferredRegion = ["pdx1"]; + +const handler = (req: Request) => + fetchRequestHandler({ + endpoint: "/api/trpc", + req, + router: appRouter, + createContext: createTRPCContext, + }); + +export { handler as GET, handler as POST }; diff --git a/src/pages/dashboard/index.tsx b/src/app/dashboard/page.tsx similarity index 97% rename from src/pages/dashboard/index.tsx rename to src/app/dashboard/page.tsx index f6a691d..53ca088 100644 --- a/src/pages/dashboard/index.tsx +++ b/src/app/dashboard/page.tsx @@ -1,7 +1,9 @@ +"use client"; + import type { NextPage } from "next"; import Head from "next/head"; -import RoomList from "~/components/RoomList"; +import RoomList from "~/app/_components/RoomList"; import Link from "next/link"; import { useEffect, useState } from "react"; diff --git a/src/app/layout.tsx b/src/app/layout.tsx new file mode 100644 index 0000000..5b982a7 --- /dev/null +++ b/src/app/layout.tsx @@ -0,0 +1,29 @@ +import { ClerkProvider } from "@clerk/nextjs"; +import Footer from "~/app/_components/Footer"; +import Navbar from "~/app/_components/Navbar"; +import "~/styles/globals.css"; +import Provider from "./_trpc/Provider"; + +export const metadata = { + title: "Next.js 13 with Clerk", +}; + +export default function RootLayout({ + children, +}: { + children: React.ReactNode; +}) { + return ( + + + + +
+ {children} +
+