From 1df15595f446554f8ecadfd815629245e7c4bfff Mon Sep 17 00:00:00 2001 From: Henry Date: Tue, 7 Nov 2023 09:12:00 +0000 Subject: [PATCH] feat: add new board form --- bun.lockb | Bin 183699 -> 187650 bytes package.json | 1 + src/app/_components/modal.tsx | 52 ++++++++++++++++++++++++ src/app/boards/boards.tsx | 10 ++--- src/app/boards/create.tsx | 70 ++++++++++++++++++++++++++++++++ src/app/boards/page.tsx | 14 +++++++ src/app/layout.tsx | 5 ++- src/app/providers/index.tsx | 41 +++++++++++++++++++ src/server/api/routers/board.ts | 30 ++++++++++++-- src/server/db/schema.ts | 5 ++- src/trpc/react.tsx | 2 +- src/utils/generateUID.ts | 10 +++++ 12 files changed, 228 insertions(+), 12 deletions(-) create mode 100644 src/app/_components/modal.tsx create mode 100644 src/app/boards/create.tsx create mode 100644 src/app/providers/index.tsx create mode 100644 src/utils/generateUID.ts diff --git a/bun.lockb b/bun.lockb index ccfaf06213e5124846c45416014ffd1d52b49169..b78bfa4b786a7380550c020e20e559e889a9b58b 100755 GIT binary patch delta 44846 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 delta 42315 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 diff --git a/package.json b/package.json index fb4b8ad9..e1794cb2 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ }, "dependencies": { "@auth/drizzle-adapter": "^0.3.2", + "@headlessui/react": "^1.7.17", "@planetscale/database": "^1.11.0", "@t3-oss/env-nextjs": "^0.7.0", "@tailwindcss/forms": "^0.5.6", diff --git a/src/app/_components/modal.tsx b/src/app/_components/modal.tsx new file mode 100644 index 00000000..fc562648 --- /dev/null +++ b/src/app/_components/modal.tsx @@ -0,0 +1,52 @@ +"use client"; + +import { Fragment } from "react"; +import { Dialog, Transition } from "@headlessui/react"; + +import { useModal } from "~/app/providers"; + +interface Props { + children: React.ReactNode; +} + +const Modal: React.FC = ({ children }) => { + const { isOpen, closeModal } = useModal(); + + return ( + + + +
+ + +
+
+ + + {children} + + +
+
+
+
+ ); +}; + +export default Modal; diff --git a/src/app/boards/boards.tsx b/src/app/boards/boards.tsx index cca8a944..57faa72e 100644 --- a/src/app/boards/boards.tsx +++ b/src/app/boards/boards.tsx @@ -1,15 +1,15 @@ import Link from "next/link"; -import { api } from "~/trpc/server"; +import { api } from "~/trpc/react"; -export async function Boards() { - const boards = await api.board.all.query(); +export function Boards() { + const { data } = api.board.all.useQuery(); - if (boards?.length === 0) return <>; + if (data?.length === 0) return <>; return (
- {boards?.map((board) => { + {data?.map((board) => { return (
diff --git a/src/app/boards/create.tsx b/src/app/boards/create.tsx new file mode 100644 index 00000000..85a656db --- /dev/null +++ b/src/app/boards/create.tsx @@ -0,0 +1,70 @@ +"use client"; + +import { api } from "~/trpc/react"; + +import { HiXMark } from "react-icons/hi2"; + +import { useModal } from "~/app/providers"; + +import { Formik, Form, Field } from "formik"; + +interface FormValues { + name: string; +} + +export function NewBoardForm() { + const { closeModal } = useModal(); + + const createBoard = api.board.create.useMutation({ + onSuccess() { + closeModal(); + }, + }); + + return ( + <> +
+

New board

+ +
+ + { + createBoard.mutate({ + name: values.name, + }); + }} + > +
+ + +
+ +
+ +
+ + ); +} diff --git a/src/app/boards/page.tsx b/src/app/boards/page.tsx index f95a92de..bd886e2f 100644 --- a/src/app/boards/page.tsx +++ b/src/app/boards/page.tsx @@ -1,7 +1,16 @@ +"use client"; + import { HiOutlinePlusSmall } from "react-icons/hi2"; import { Boards } from "./boards"; +import { useModal } from "~/app/providers"; +import Modal from "~/app/_components/modal"; + +import { NewBoardForm } from "~/app/boards/create"; + export default function BoardsPage() { + const { openModal } = useModal(); + return (
@@ -12,6 +21,7 @@ export default function BoardsPage() {
+ + + +
diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 6081a715..516086e8 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -4,6 +4,7 @@ import { Plus_Jakarta_Sans } from "next/font/google"; import { headers } from "next/headers"; import { TRPCReactProvider } from "~/trpc/react"; +import { ModalProvider } from "~/app/providers"; const jakarta = Plus_Jakarta_Sans({ subsets: ["latin"], @@ -24,7 +25,9 @@ export default function RootLayout({ return ( - {children} + + {children} + ); diff --git a/src/app/providers/index.tsx b/src/app/providers/index.tsx new file mode 100644 index 00000000..aca91c8f --- /dev/null +++ b/src/app/providers/index.tsx @@ -0,0 +1,41 @@ +"use client"; + +import { createContext, useContext, useState } from "react"; + +type ModalContextType = { + isOpen: boolean; + openModal: () => void; + closeModal: () => void; +}; + +interface Props { + children: React.ReactNode; +} + +const ModalContext = createContext(undefined); + +export const ModalProvider: React.FC = ({ children }) => { + const [isOpen, setIsOpen] = useState(false); + + const openModal = () => { + setIsOpen(true); + }; + + const closeModal = () => { + setIsOpen(false); + }; + + return ( + + {children} + + ); +}; + +export const useModal = () => { + const context = useContext(ModalContext); + if (context === undefined) { + throw new Error("useModal must be used within a ModalProvider"); + } + return context; +}; diff --git a/src/server/api/routers/board.ts b/src/server/api/routers/board.ts index f725fe41..e5c4a287 100644 --- a/src/server/api/routers/board.ts +++ b/src/server/api/routers/board.ts @@ -1,14 +1,38 @@ +import { z } from "zod"; + +import { boards } from "~/server/db/schema"; +import { generateUID } from "~/utils/generateUID"; + import { createTRPCRouter, publicProcedure, } from "~/server/api/trpc"; export const boardRouter = createTRPCRouter({ - all: publicProcedure.query(({ ctx }) => { + all: publicProcedure.query(async ({ ctx }) => { const userId = ctx.session?.user.id; if (!userId) return; - return ctx.db.query.boards.findMany(); - }) + const boards = await ctx.db.query.boards.findMany(); + + return boards.map((board) => ({ ...board, id: board.publicId })) + }), + create: publicProcedure + .input( + z.object({ + name: z.string().min(1), + }), + ) + .mutation(({ ctx, input }) => { + const userId = ctx.session?.user.id; + + if (!userId) return; + + return ctx.db.insert(boards).values({ + publicId: generateUID(), + name: input.name, + createdBy: userId, + }); + }), }); diff --git a/src/server/db/schema.ts b/src/server/db/schema.ts index a2f2aa17..6e2f4e44 100644 --- a/src/server/db/schema.ts +++ b/src/server/db/schema.ts @@ -22,10 +22,11 @@ export const mysqlTable = mysqlTableCreator((name) => `kan.${name}`); export const boards = mysqlTable( "board", { - id: varchar("id", { length: 12 }).notNull().primaryKey(), + id: bigint("id", { mode: "number" }).primaryKey().autoincrement(), + publicId: varchar("publicId", { length: 12 }).notNull(), name: varchar("name", { length: 255 }), createdBy: varchar("createdBy", { length: 255 }).notNull(), - createdAt: timestamp("created_at") + createdAt: timestamp("createdAt") .default(sql`CURRENT_TIMESTAMP`) .notNull(), updatedAt: timestamp("updatedAt").onUpdateNow(), diff --git a/src/trpc/react.tsx b/src/trpc/react.tsx index 6429613d..3e3eb5d8 100644 --- a/src/trpc/react.tsx +++ b/src/trpc/react.tsx @@ -34,7 +34,7 @@ export function TRPCReactProvider(props: { }, }), ], - }) + }), ); return ( diff --git a/src/utils/generateUID.ts b/src/utils/generateUID.ts new file mode 100644 index 00000000..3fb25fa9 --- /dev/null +++ b/src/utils/generateUID.ts @@ -0,0 +1,10 @@ +import { customAlphabet } from "nanoid"; + +const alphabet = "0123456789abcdefghijklmnopqrstuvwxyz"; +const length = 12; + +const nanoid = customAlphabet(alphabet, length); + +export function generateUID() { + return nanoid(); +} \ No newline at end of file