From e048e243d4b54f4abf1c11cc11601046ee9afbdb Mon Sep 17 00:00:00 2001 From: Henry Date: Sat, 13 Apr 2024 16:21:38 +0100 Subject: [PATCH] feat: convert to pages router --- bun.lockb | Bin 373752 -> 350813 bytes package.json | 46 ++++++------ src/app/api/auth/[...nextauth]/route.ts | 5 -- src/app/api/trpc/[trpc]/route.ts | 28 -------- src/app/boards/layout.tsx | 10 --- src/app/cards/layout.tsx | 10 --- src/app/layout.tsx | 41 ----------- src/app/members/layout.tsx | 10 --- src/app/page.tsx | 3 - src/app/settings/layout.tsx | 10 --- src/{app => }/assets/boards-dark.json | 0 src/{app => }/assets/boards-light.json | 0 src/{app => }/assets/chat-dark.json | 0 src/{app => }/assets/chat-light.json | 0 src/{app => }/assets/members-dark.json | 0 src/{app => }/assets/members-light.json | 0 src/{app => }/assets/settings-dark.json | 0 src/{app => }/assets/settings-light.json | 0 src/{app => }/components/CheckboxDropdown.tsx | 6 +- src/{app => }/components/FeedbackButton.tsx | 12 ++-- src/{app => }/components/LottieIcon.tsx | 2 - src/{app => }/components/NewWorkspaceForm.tsx | 8 +-- src/{app => }/components/ReactiveButton.tsx | 6 +- src/{app => }/components/SideNavigation.tsx | 24 +++---- src/{app => }/components/UserMenu.tsx | 27 ++++--- src/{app => }/components/WorkspaceMenu.tsx | 16 ++--- src/{app => }/components/auth.tsx | 4 +- src/{app => }/components/dashboard.tsx | 20 +++--- src/{app => }/components/modal.tsx | 8 +-- src/env.mjs | 18 +---- src/pages/_app.tsx | 38 ++++++++++ src/pages/api/auth/confirm.ts | 36 ++++++++++ src/pages/api/trpc/[trpc].ts | 33 +++++++++ src/pages/boards/[...boardId]/index.tsx | 13 ++++ src/pages/boards/index.tsx | 13 ++++ src/pages/cards/[cardId]/index.tsx | 13 ++++ src/pages/login/index.tsx | 5 ++ src/pages/members/index.tsx | 13 ++++ src/pages/settings/index.tsx | 13 ++++ src/{app => }/providers/board.tsx | 4 +- src/{app => }/providers/modal.tsx | 2 - src/{app => }/providers/theme.tsx | 2 - src/{app => }/providers/workspace.tsx | 4 +- src/server/api/root.ts | 10 +++ src/server/api/trpc.ts | 67 ++++++++--------- src/trpc/react.tsx | 47 ------------ src/trpc/server.ts | 28 -------- src/trpc/shared.ts | 30 -------- src/utils/api.ts | 68 ++++++++++++++++++ .../page.tsx => views/auth/login/index.tsx} | 2 +- .../page.tsx => views/auth/verify/index.tsx} | 0 .../board}/components/BoardDropdown.tsx | 10 ++- .../components/DeleteBoardConfirmation.tsx | 14 ++-- .../components/DeleteListConfirmation.tsx | 14 ++-- .../board}/components/List.tsx | 10 ++- .../board}/components/ListDropdown.tsx | 10 ++- .../board}/components/NewCardForm.tsx | 26 ++++--- .../board}/components/NewListForm.tsx | 16 ++--- .../page.tsx => views/board/index.tsx} | 12 ++-- .../boards/components/BoardsList.tsx | 6 +- .../boards/components/ImportBoardsForm.tsx | 24 +++---- .../boards/components/NewBoardForm.tsx | 14 ++-- .../page.tsx => views/boards/index.tsx} | 12 ++-- .../components/DeleteCardConfirmation.tsx | 12 ++-- .../card}/components/Dropdown.tsx | 10 ++- .../card}/components/LabelSelector.tsx | 18 +++-- .../card}/components/ListSelector.tsx | 10 ++- .../card}/components/MemberSelector.tsx | 12 ++-- .../card}/components/NewLabelForm.tsx | 18 +++-- .../page.tsx => views/card/index.tsx} | 18 +++-- .../members/components/MemberDropdown.tsx | 0 .../page.tsx => views/members/index.tsx} | 24 +++---- .../page.tsx => views/settings/index.tsx} | 8 +-- tsconfig.json | 40 ++++++----- 74 files changed, 518 insertions(+), 575 deletions(-) delete mode 100644 src/app/api/auth/[...nextauth]/route.ts delete mode 100644 src/app/api/trpc/[trpc]/route.ts delete mode 100644 src/app/boards/layout.tsx delete mode 100644 src/app/cards/layout.tsx delete mode 100644 src/app/layout.tsx delete mode 100644 src/app/members/layout.tsx delete mode 100644 src/app/page.tsx delete mode 100644 src/app/settings/layout.tsx rename src/{app => }/assets/boards-dark.json (100%) rename src/{app => }/assets/boards-light.json (100%) rename src/{app => }/assets/chat-dark.json (100%) rename src/{app => }/assets/chat-light.json (100%) rename src/{app => }/assets/members-dark.json (100%) rename src/{app => }/assets/members-light.json (100%) rename src/{app => }/assets/settings-dark.json (100%) rename src/{app => }/assets/settings-light.json (100%) rename src/{app => }/components/CheckboxDropdown.tsx (87%) rename src/{app => }/components/FeedbackButton.tsx (66%) rename src/{app => }/components/LottieIcon.tsx (96%) rename src/{app => }/components/NewWorkspaceForm.tsx (92%) rename src/{app => }/components/ReactiveButton.tsx (81%) rename src/{app => }/components/SideNavigation.tsx (64%) rename src/{app => }/components/UserMenu.tsx (71%) rename src/{app => }/components/WorkspaceMenu.tsx (77%) rename src/{app => }/components/auth.tsx (96%) rename src/{app => }/components/dashboard.tsx (53%) rename src/{app => }/components/modal.tsx (80%) create mode 100644 src/pages/_app.tsx create mode 100644 src/pages/api/auth/confirm.ts create mode 100644 src/pages/api/trpc/[trpc].ts create mode 100644 src/pages/boards/[...boardId]/index.tsx create mode 100644 src/pages/boards/index.tsx create mode 100644 src/pages/cards/[cardId]/index.tsx create mode 100644 src/pages/login/index.tsx create mode 100644 src/pages/members/index.tsx create mode 100644 src/pages/settings/index.tsx rename src/{app => }/providers/board.tsx (98%) rename src/{app => }/providers/modal.tsx (98%) rename src/{app => }/providers/theme.tsx (99%) rename src/{app => }/providers/workspace.tsx (98%) delete mode 100644 src/trpc/react.tsx delete mode 100644 src/trpc/server.ts delete mode 100644 src/trpc/shared.ts create mode 100644 src/utils/api.ts rename src/{app/auth/login/page.tsx => views/auth/login/index.tsx} (93%) rename src/{app/auth/verify/page.tsx => views/auth/verify/index.tsx} (100%) rename src/{app/boards/[...boardId] => views/board}/components/BoardDropdown.tsx (73%) rename src/{app/boards/[...boardId] => views/board}/components/DeleteBoardConfirmation.tsx (72%) rename src/{app/boards/[...boardId] => views/board}/components/DeleteListConfirmation.tsx (74%) rename src/{app/boards/[...boardId] => views/board}/components/List.tsx (87%) rename src/{app/boards/[...boardId] => views/board}/components/ListDropdown.tsx (71%) rename src/{app/boards/[...boardId] => views/board}/components/NewCardForm.tsx (86%) rename src/{app/boards/[...boardId] => views/board}/components/NewListForm.tsx (82%) rename src/{app/boards/[...boardId]/page.tsx => views/board/index.tsx} (97%) rename src/{app => views}/boards/components/BoardsList.tsx (95%) rename src/{app => views}/boards/components/ImportBoardsForm.tsx (84%) rename src/{app => views}/boards/components/NewBoardForm.tsx (74%) rename src/{app/boards/page.tsx => views/boards/index.tsx} (81%) rename src/{app/cards/[cardId] => views/card}/components/DeleteCardConfirmation.tsx (75%) rename src/{app/cards/[cardId] => views/card}/components/Dropdown.tsx (73%) rename src/{app/cards/[cardId] => views/card}/components/LabelSelector.tsx (80%) rename src/{app/cards/[cardId] => views/card}/components/ListSelector.tsx (85%) rename src/{app/cards/[cardId] => views/card}/components/MemberSelector.tsx (85%) rename src/{app/cards/[cardId] => views/card}/components/NewLabelForm.tsx (82%) rename src/{app/cards/[cardId]/page.tsx => views/card/index.tsx} (88%) rename src/{app => views}/members/components/MemberDropdown.tsx (100%) rename src/{app/members/page.tsx => views/members/index.tsx} (80%) rename src/{app/settings/page.tsx => views/settings/index.tsx} (82%) diff --git a/bun.lockb b/bun.lockb index 7e352b2971eca3b44a4287c07fc3ca3703c8a338..b59b19af9146602ec31eaceff9c1230062040949 100755 GIT binary patch delta 101835 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 z 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 BuWtYV delta 115163 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 E0K3a$SpWb4 diff --git a/package.json b/package.json index 35e03c42..d7c3b5cb 100644 --- a/package.json +++ b/package.json @@ -16,23 +16,21 @@ "src/email" ], "dependencies": { - "@auth/drizzle-adapter": "^0.3.12", "@headlessui/react": "^1.7.17", - "@planetscale/database": "^1.11.0", "@react-email/render": "^0.0.10", + "@supabase/ssr": "^0.3.0", "@supabase/supabase-js": "^2.42.0", - "@t3-oss/env-nextjs": "^0.7.0", + "@t3-oss/env-nextjs": "^0.9.2", "@tailwindcss/forms": "^0.5.6", - "@tanstack/react-query": "^4.32.6", - "@trpc/client": "^10.37.1", - "@trpc/next": "^10.37.1", - "@trpc/react-query": "^10.37.1", - "@trpc/server": "^10.37.1", + "@tanstack/react-query": "^5.25.0", + "@trpc/client": "next", + "@trpc/next": "next", + "@trpc/react-query": "next", + "@trpc/server": "next", "@vercel/postgres": "^0.7.2", "drizzle-orm": "^0.28.5", "formik": "^2.4.5", - "next": "^13.5.4", - "next-auth": "0.0.0-manual.cfb42ae7", + "next": "^14.1.3", "postgres": "^3.4.4", "react": "18.2.0", "react-beautiful-dnd": "^13.1.1", @@ -45,27 +43,27 @@ "zod": "^3.22.4" }, "devDependencies": { - "@types/eslint": "^8.44.2", - "@types/node": "^18.16.0", - "@types/react": "^18.2.20", + "@types/eslint": "^8.56.2", + "@types/node": "^20.11.20", + "@types/react": "^18.2.57", "@types/react-beautiful-dnd": "^13.1.7", - "@types/react-dom": "^18.2.7", - "@typescript-eslint/eslint-plugin": "^6.3.0", - "@typescript-eslint/parser": "^6.3.0", + "@types/react-dom": "^18.2.19", + "@typescript-eslint/eslint-plugin": "^7.1.1", + "@typescript-eslint/parser": "^7.1.1", "autoprefixer": "^10.4.14", "dotenv-cli": "^7.3.0", "drizzle-kit": "^0.19.13", - "eslint": "^8.47.0", - "eslint-config-next": "^13.5.4", - "mysql2": "^3.6.1", - "postcss": "^8.4.27", - "prettier": "^3.0.0", - "prettier-plugin-tailwindcss": "^0.5.1", + "eslint": "^8.57.0", + "eslint-config-next": "^14.1.3", + "pg": "^8.11.3", + "postcss": "^8.4.34", + "prettier": "^3.2.5", + "prettier-plugin-tailwindcss": "^0.5.11", "supabase": "^1.153.4", "tailwind": "^4.0.0", "tailwind-scrollbar": "^3.0.5", - "tailwindcss": "^3.3.3", - "typescript": "^5.1.6" + "tailwindcss": "^3.4.1", + "typescript": "^5.4.2" }, "ct3aMetadata": { "initVersion": "7.22.0" diff --git a/src/app/api/auth/[...nextauth]/route.ts b/src/app/api/auth/[...nextauth]/route.ts deleted file mode 100644 index d9a057f9..00000000 --- a/src/app/api/auth/[...nextauth]/route.ts +++ /dev/null @@ -1,5 +0,0 @@ -export { GET, POST } from "~/server/auth"; - -export const runtime = "edge"; -export const preferredRegion = 'lhr1'; -export const dynamic = 'force-dynamic' diff --git a/src/app/api/trpc/[trpc]/route.ts b/src/app/api/trpc/[trpc]/route.ts deleted file mode 100644 index 9e63b2d6..00000000 --- a/src/app/api/trpc/[trpc]/route.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { fetchRequestHandler } from "@trpc/server/adapters/fetch"; -import { type NextRequest } from "next/server"; - -import { env } from "~/env.mjs"; -import { appRouter } from "~/server/api/root"; -import { createTRPCContext } from "~/server/api/trpc"; - -const handler = (req: NextRequest) => - fetchRequestHandler({ - endpoint: "/api/trpc", - req, - router: appRouter, - createContext: () => createTRPCContext({ req }), - onError: - env.NODE_ENV === "development" - ? ({ path, error }) => { - console.error( - `❌ tRPC failed on ${path ?? ""}: ${error.message}` - ); - } - : undefined, - }); - -export { handler as GET, handler as POST }; - -export const runtime = "edge"; -export const preferredRegion = 'lhr1'; -export const dynamic = 'force-dynamic' diff --git a/src/app/boards/layout.tsx b/src/app/boards/layout.tsx deleted file mode 100644 index 41d7017b..00000000 --- a/src/app/boards/layout.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { WorkspaceProvider } from "~/app/providers/workspace"; -import Dashboard from "~/app/components/dashboard"; - -export default function Layout(props: { children: React.ReactNode }) { - return ( - - {props.children} - - ); -} diff --git a/src/app/cards/layout.tsx b/src/app/cards/layout.tsx deleted file mode 100644 index 09288909..00000000 --- a/src/app/cards/layout.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { WorkspaceProvider } from "~/app/providers/workspace"; -import Dashboard from "~/app/components/dashboard"; - -export default function Layout(props: { children: React.ReactNode }) { - return ( - - {props.children}; - - ); -} diff --git a/src/app/layout.tsx b/src/app/layout.tsx deleted file mode 100644 index 7f18d142..00000000 --- a/src/app/layout.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import "~/styles/globals.css"; - -import { Plus_Jakarta_Sans } from "next/font/google"; -import { headers } from "next/headers"; - -import { TRPCReactProvider } from "~/trpc/react"; -import { ModalProvider } from "~/app/providers/modal"; -import { BoardProvider } from "~/app/providers/board"; -import { ThemeProvider } from "./providers/theme"; - -const jakarta = Plus_Jakarta_Sans({ - subsets: ["latin"], - display: "swap", - variable: "--font-plus-jakarta-sans", -}); - -export const metadata = { - title: "Kan", - description: "The open source Trello alternative", - icons: [{ rel: "icon", url: "/favicon.ico" }], -}; - -export default function RootLayout({ - children, -}: { - children: React.ReactNode; -}) { - return ( - - - - - - {children} - - - - - - ); -} diff --git a/src/app/members/layout.tsx b/src/app/members/layout.tsx deleted file mode 100644 index 09288909..00000000 --- a/src/app/members/layout.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { WorkspaceProvider } from "~/app/providers/workspace"; -import Dashboard from "~/app/components/dashboard"; - -export default function Layout(props: { children: React.ReactNode }) { - return ( - - {props.children}; - - ); -} diff --git a/src/app/page.tsx b/src/app/page.tsx deleted file mode 100644 index 7bff2ad8..00000000 --- a/src/app/page.tsx +++ /dev/null @@ -1,3 +0,0 @@ -export default function Home() { - return
; -} diff --git a/src/app/settings/layout.tsx b/src/app/settings/layout.tsx deleted file mode 100644 index 09288909..00000000 --- a/src/app/settings/layout.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { WorkspaceProvider } from "~/app/providers/workspace"; -import Dashboard from "~/app/components/dashboard"; - -export default function Layout(props: { children: React.ReactNode }) { - return ( - - {props.children}; - - ); -} diff --git a/src/app/assets/boards-dark.json b/src/assets/boards-dark.json similarity index 100% rename from src/app/assets/boards-dark.json rename to src/assets/boards-dark.json diff --git a/src/app/assets/boards-light.json b/src/assets/boards-light.json similarity index 100% rename from src/app/assets/boards-light.json rename to src/assets/boards-light.json diff --git a/src/app/assets/chat-dark.json b/src/assets/chat-dark.json similarity index 100% rename from src/app/assets/chat-dark.json rename to src/assets/chat-dark.json diff --git a/src/app/assets/chat-light.json b/src/assets/chat-light.json similarity index 100% rename from src/app/assets/chat-light.json rename to src/assets/chat-light.json diff --git a/src/app/assets/members-dark.json b/src/assets/members-dark.json similarity index 100% rename from src/app/assets/members-dark.json rename to src/assets/members-dark.json diff --git a/src/app/assets/members-light.json b/src/assets/members-light.json similarity index 100% rename from src/app/assets/members-light.json rename to src/assets/members-light.json diff --git a/src/app/assets/settings-dark.json b/src/assets/settings-dark.json similarity index 100% rename from src/app/assets/settings-dark.json rename to src/assets/settings-dark.json diff --git a/src/app/assets/settings-light.json b/src/assets/settings-light.json similarity index 100% rename from src/app/assets/settings-light.json rename to src/assets/settings-light.json diff --git a/src/app/components/CheckboxDropdown.tsx b/src/components/CheckboxDropdown.tsx similarity index 87% rename from src/app/components/CheckboxDropdown.tsx rename to src/components/CheckboxDropdown.tsx index 2e7381b4..48c5da67 100644 --- a/src/app/components/CheckboxDropdown.tsx +++ b/src/components/CheckboxDropdown.tsx @@ -1,5 +1,3 @@ -"use client"; - import { Fragment } from "react"; import { Menu, Transition } from "@headlessui/react"; @@ -35,13 +33,13 @@ export default function CheckboxDropdown({ leaveFrom="transform opacity-100 scale-100" leaveTo="transform opacity-0 scale-95" > - +
{items?.map((item) => (
{ e.preventDefault(); handleSelect({ key: item.key }); diff --git a/src/app/components/FeedbackButton.tsx b/src/components/FeedbackButton.tsx similarity index 66% rename from src/app/components/FeedbackButton.tsx rename to src/components/FeedbackButton.tsx index 40775b42..1ad26bc0 100644 --- a/src/app/components/FeedbackButton.tsx +++ b/src/components/FeedbackButton.tsx @@ -1,11 +1,9 @@ -"use client"; - import { useState } from "react"; -import { useTheme } from "~/app/providers/theme"; +import { useTheme } from "~/providers/theme"; -import LottieIcon from "~/app/components/LottieIcon"; -import chatIconLight from "~/app/assets/chat-light.json"; -import chatIconDark from "~/app/assets/chat-dark.json"; +import LottieIcon from "~/components/LottieIcon"; +import chatIconLight from "~/assets/chat-light.json"; +import chatIconDark from "~/assets/chat-dark.json"; const FeedbackButton: React.FC = () => { const { theme } = useTheme(); @@ -21,7 +19,7 @@ const FeedbackButton: React.FC = () => { diff --git a/src/app/components/WorkspaceMenu.tsx b/src/components/WorkspaceMenu.tsx similarity index 77% rename from src/app/components/WorkspaceMenu.tsx rename to src/components/WorkspaceMenu.tsx index 46100313..41b20483 100644 --- a/src/app/components/WorkspaceMenu.tsx +++ b/src/components/WorkspaceMenu.tsx @@ -1,10 +1,8 @@ -"use client"; - import { Fragment } from "react"; import { Menu, Transition } from "@headlessui/react"; -import { useModal } from "~/app/providers/modal"; -import { useWorkspace } from "~/app/providers/workspace"; +import { useModal } from "~/providers/modal"; +import { useWorkspace } from "~/providers/workspace"; import { HiCheck } from "react-icons/hi2"; @@ -15,7 +13,7 @@ export default function WorkspaceMenu() { return (
- + {workspace?.name.charAt(0).toUpperCase()} @@ -36,14 +34,14 @@ export default function WorkspaceMenu() { leaveFrom="transform opacity-100 scale-100" leaveTo="transform opacity-0 scale-95" > - +
{availableWorkspaces.map((availableWorkspace) => (
-
+
diff --git a/src/app/components/auth.tsx b/src/components/auth.tsx similarity index 96% rename from src/app/components/auth.tsx rename to src/components/auth.tsx index 2ff66ee4..a4f97b0a 100644 --- a/src/app/components/auth.tsx +++ b/src/components/auth.tsx @@ -1,7 +1,5 @@ -"use client"; - import { Formik, Form, Field } from "formik"; -import { api } from "~/trpc/react"; +import { api } from "~/utils/api"; interface FormValues { email: string; diff --git a/src/app/components/dashboard.tsx b/src/components/dashboard.tsx similarity index 53% rename from src/app/components/dashboard.tsx rename to src/components/dashboard.tsx index a17a5902..53e6bcf6 100644 --- a/src/app/components/dashboard.tsx +++ b/src/components/dashboard.tsx @@ -1,20 +1,18 @@ import { redirect } from "next/navigation"; -import { auth } from "~/server/auth"; - import SideNavigation from "./SideNavigation"; import FeedbackButton from "./FeedbackButton"; -export default async function Dashboard(props: { children: React.ReactNode }) { - const session = await auth(); +export default function Dashboard(props: { children: React.ReactNode }) { + // const session = await auth(); - if (!session?.user) { - redirect("/api/auth/signin"); - } + // if (!session?.user) { + // redirect("/api/auth/signin"); + // } return ( -
-
+
+

kan.bn @@ -24,9 +22,9 @@ export default async function Dashboard(props: { children: React.ReactNode }) {

- +
{props.children}
-
+
); } diff --git a/src/app/components/modal.tsx b/src/components/modal.tsx similarity index 80% rename from src/app/components/modal.tsx rename to src/components/modal.tsx index a343eeb5..de672f10 100644 --- a/src/app/components/modal.tsx +++ b/src/components/modal.tsx @@ -1,9 +1,7 @@ -"use client"; - import { Fragment } from "react"; import { Dialog, Transition } from "@headlessui/react"; -import { useModal } from "~/app/providers/modal"; +import { useModal } from "~/providers/modal"; interface Props { children: React.ReactNode; @@ -24,7 +22,7 @@ const Modal: React.FC = ({ children }) => { leaveFrom="opacity-100" leaveTo="opacity-0" > -
+
@@ -38,7 +36,7 @@ const Modal: React.FC = ({ children }) => { leaveFrom="opacity-100 translate-y-0 sm:scale-100" leaveTo="opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95" > - + {children} diff --git a/src/env.mjs b/src/env.mjs index 06896a09..8c2e6b00 100644 --- a/src/env.mjs +++ b/src/env.mjs @@ -17,17 +17,6 @@ export const env = createEnv({ NODE_ENV: z .enum(["development", "test", "production"]) .default("development"), - NEXTAUTH_SECRET: - process.env.NODE_ENV === "production" - ? z.string() - : z.string().optional(), - NEXTAUTH_URL: z.preprocess( - // This makes Vercel deployments not fail if you don't set NEXTAUTH_URL - // Since NextAuth.js automatically uses the VERCEL_URL if present. - (str) => process.env.VERCEL_URL ?? str, - // VERCEL_URL doesn't include `https` so it cant be validated as a URL - process.env.VERCEL ? z.string() : z.string().url(), - ), }, /** @@ -46,8 +35,7 @@ export const env = createEnv({ runtimeEnv: { POSTGRES_URL: process.env.POSTGRES_URL, NODE_ENV: process.env.NODE_ENV, - NEXTAUTH_SECRET: process.env.NEXTAUTH_SECRET, - NEXTAUTH_URL: process.env.NEXTAUTH_URL, + // NEXT_PUBLIC_CLIENTVAR: process.env.NEXT_PUBLIC_CLIENTVAR, }, /** * Run `build` or `dev` with `SKIP_ENV_VALIDATION` to skip env validation. This is especially @@ -55,8 +43,8 @@ export const env = createEnv({ */ skipValidation: !!process.env.SKIP_ENV_VALIDATION, /** - * Makes it so that empty strings are treated as undefined. - * `SOME_VAR: z.string()` and `SOME_VAR=''` will throw an error. + * Makes it so that empty strings are treated as undefined. `SOME_VAR: z.string()` and + * `SOME_VAR=''` will throw an error. */ emptyStringAsUndefined: true, }); diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx new file mode 100644 index 00000000..f2ac059b --- /dev/null +++ b/src/pages/_app.tsx @@ -0,0 +1,38 @@ +import "~/styles/globals.css"; + +import { type AppType } from "next/app"; +import { Plus_Jakarta_Sans } from "next/font/google"; + +import { ModalProvider } from "~/providers/modal"; +import { BoardProvider } from "~/providers/board"; +import { ThemeProvider } from "~/providers/theme"; + +import { api } from "~/utils/api"; + +const jakarta = Plus_Jakarta_Sans({ + subsets: ["latin"], + display: "swap", + variable: "--font-plus-jakarta-sans", +}); + +export const metadata = { + title: "Kan", + description: "The open source Trello alternative", + icons: [{ rel: "icon", url: "/favicon.ico" }], +}; + +const MyApp: AppType = ({ Component, pageProps }) => { + return ( +
+ + + + + + + +
+ ); +}; + +export default api.withTRPC(MyApp); diff --git a/src/pages/api/auth/confirm.ts b/src/pages/api/auth/confirm.ts new file mode 100644 index 00000000..ae4c40ae --- /dev/null +++ b/src/pages/api/auth/confirm.ts @@ -0,0 +1,36 @@ +import { type EmailOtpType } from '@supabase/supabase-js' +import type { NextApiRequest, NextApiResponse } from 'next' + +import createClient from '~/utils/supabase/api' + +function stringOrFirstString(item: string | string[] | undefined) { + return Array.isArray(item) ? item[0] : item +} + +export default async function handler(req: NextApiRequest, res: NextApiResponse) { + if (req.method !== 'GET') { + res.status(405).appendHeader('Allow', 'GET').end() + return + } + + const queryParams = req.query + const token_hash = stringOrFirstString(queryParams.token_hash) + const type = stringOrFirstString(queryParams.type) + + let next = '/error' + + if (token_hash && type) { + const supabase = createClient(req, res) + const { error } = await supabase.auth.verifyOtp({ + type: type as EmailOtpType, + token_hash, + }) + if (error) { + console.error(error) + } else { + next = stringOrFirstString(queryParams.next) || '/' + } + } + + res.redirect(next) +} \ No newline at end of file diff --git a/src/pages/api/trpc/[trpc].ts b/src/pages/api/trpc/[trpc].ts new file mode 100644 index 00000000..84c02f2a --- /dev/null +++ b/src/pages/api/trpc/[trpc].ts @@ -0,0 +1,33 @@ +import { NextApiRequest, NextApiResponse } from 'next'; +import { createNextApiHandler, CreateNextContextOptions } from "@trpc/server/adapters/next"; + +import { env } from "~/env.mjs"; +import { appRouter } from "~/server/api/root"; +import { createTRPCContext } from "~/server/api/trpc"; + + +const nextApiHandler = createNextApiHandler({ + router: appRouter, + createContext: createTRPCContext, + onError: + env.NODE_ENV === "development" + ? ({ path, error }) => { + console.error( + `❌ tRPC failed on ${path ?? ""}: ${error.message}` + ); + } + : undefined, +}); + +export default async function handler( + req: NextApiRequest, + res: NextApiResponse, +) { + + return nextApiHandler(req, res); +} + +// export const runtime = "edge"; +// export const preferredRegion = 'lhr1'; +// export const dynamic = 'force-dynamic' + diff --git a/src/pages/boards/[...boardId]/index.tsx b/src/pages/boards/[...boardId]/index.tsx new file mode 100644 index 00000000..a249463f --- /dev/null +++ b/src/pages/boards/[...boardId]/index.tsx @@ -0,0 +1,13 @@ +import { WorkspaceProvider } from "~/providers/workspace"; +import Dashboard from "~/components/dashboard"; +import BoardView from "~/views/board"; + +export default function BoardPage() { + return ( + + + + + + ); +} diff --git a/src/pages/boards/index.tsx b/src/pages/boards/index.tsx new file mode 100644 index 00000000..2c8beb9a --- /dev/null +++ b/src/pages/boards/index.tsx @@ -0,0 +1,13 @@ +import { WorkspaceProvider } from "~/providers/workspace"; +import Dashboard from "~/components/dashboard"; +import BoardsView from "~/views/boards"; + +export default function BoardsPage() { + return ( + + + + + + ); +} diff --git a/src/pages/cards/[cardId]/index.tsx b/src/pages/cards/[cardId]/index.tsx new file mode 100644 index 00000000..bd91b2b9 --- /dev/null +++ b/src/pages/cards/[cardId]/index.tsx @@ -0,0 +1,13 @@ +import { WorkspaceProvider } from "~/providers/workspace"; +import Dashboard from "~/components/dashboard"; +import CardView from "~/views/card"; + +export default function CardPage() { + return ( + + + + + + ); +} diff --git a/src/pages/login/index.tsx b/src/pages/login/index.tsx new file mode 100644 index 00000000..1794079a --- /dev/null +++ b/src/pages/login/index.tsx @@ -0,0 +1,5 @@ +import LoginView from "~/views/auth/login"; + +export default function LoginPage() { + return ; +} diff --git a/src/pages/members/index.tsx b/src/pages/members/index.tsx new file mode 100644 index 00000000..6736584e --- /dev/null +++ b/src/pages/members/index.tsx @@ -0,0 +1,13 @@ +import { WorkspaceProvider } from "~/providers/workspace"; +import Dashboard from "~/components/dashboard"; +import MembersView from "~/views/members"; + +export default function MembersPage() { + return ( + + + + + + ); +} diff --git a/src/pages/settings/index.tsx b/src/pages/settings/index.tsx new file mode 100644 index 00000000..280e6654 --- /dev/null +++ b/src/pages/settings/index.tsx @@ -0,0 +1,13 @@ +import { WorkspaceProvider } from "~/providers/workspace"; +import Dashboard from "~/components/dashboard"; +import SettingsView from "~/views/settings"; + +export default function SettingsPage() { + return ( + + + + + + ); +} diff --git a/src/app/providers/board.tsx b/src/providers/board.tsx similarity index 98% rename from src/app/providers/board.tsx rename to src/providers/board.tsx index 58e439c5..2e335ddd 100644 --- a/src/app/providers/board.tsx +++ b/src/providers/board.tsx @@ -1,5 +1,3 @@ -"use client"; - import React, { createContext, useContext, @@ -7,7 +5,7 @@ import React, { type ReactNode, } from "react"; -import { api } from "~/trpc/react"; +import { api } from "~/utils/api"; interface BoardContextProps { boardData: BoardData; diff --git a/src/app/providers/modal.tsx b/src/providers/modal.tsx similarity index 98% rename from src/app/providers/modal.tsx rename to src/providers/modal.tsx index cf1deaa0..ed9f6f24 100644 --- a/src/app/providers/modal.tsx +++ b/src/providers/modal.tsx @@ -1,5 +1,3 @@ -"use client"; - import { createContext, useContext, useState } from "react"; type ModalContextType = { diff --git a/src/app/providers/theme.tsx b/src/providers/theme.tsx similarity index 99% rename from src/app/providers/theme.tsx rename to src/providers/theme.tsx index 797e2d5a..37c94411 100644 --- a/src/app/providers/theme.tsx +++ b/src/providers/theme.tsx @@ -1,5 +1,3 @@ -"use client"; - import React, { createContext, useContext, diff --git a/src/app/providers/workspace.tsx b/src/providers/workspace.tsx similarity index 98% rename from src/app/providers/workspace.tsx rename to src/providers/workspace.tsx index 5fc9f1f8..e92a9b80 100644 --- a/src/app/providers/workspace.tsx +++ b/src/providers/workspace.tsx @@ -1,5 +1,3 @@ -"use client"; - import React, { createContext, useContext, @@ -8,7 +6,7 @@ import React, { type ReactNode, } from "react"; -import { api } from "~/trpc/react"; +import { api } from "~/utils/api"; import { useRouter } from "next/navigation"; diff --git a/src/server/api/root.ts b/src/server/api/root.ts index 909a7a46..b7c4b71e 100644 --- a/src/server/api/root.ts +++ b/src/server/api/root.ts @@ -24,3 +24,13 @@ export const appRouter = createTRPCRouter({ // export type definition of API export type AppRouter = typeof appRouter; + +/** + * Create a server-side caller for the tRPC API. + * @example + * const trpc = createCaller(createContext); + * const res = await trpc.post.all(); + * ^? Post[] + */ +// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment +// export const createCaller = createCallerFactory(appRouter); \ No newline at end of file diff --git a/src/server/api/trpc.ts b/src/server/api/trpc.ts index 0f72342a..b6f1235a 100644 --- a/src/server/api/trpc.ts +++ b/src/server/api/trpc.ts @@ -6,14 +6,15 @@ * TL;DR - This is where all the tRPC server stuff is created and plugged in. The pieces you will * need to use are documented accordingly near the end. */ - -import { initTRPC, TRPCError } from "@trpc/server"; -import { type NextRequest } from "next/server"; +import { initTRPC } from "@trpc/server"; +import { type CreateNextContextOptions } from "@trpc/server/adapters/next"; import superjson from "superjson"; import { ZodError } from "zod"; -import { auth } from "~/server/auth"; -import { db, supabase } from "~/server/db"; +import { db } from "~/server/db"; +import createClient from "~/utils/supabase/api"; +import { type Database } from "~/types/database.types"; +import { SupabaseClient } from '@supabase/supabase-js'; /** * 1. CONTEXT @@ -23,8 +24,14 @@ import { db, supabase } from "~/server/db"; * These allow you to access things when processing a request, like the database, the session, etc. */ +type User = { + id: string; +}; + interface CreateContextOptions { - headers: Headers; + user: User | null; + supabase: SupabaseClient + db: any; } /** @@ -37,14 +44,12 @@ interface CreateContextOptions { * * @see https://create.t3.gg/en/usage/trpc#-serverapitrpcts */ -export const createInnerTRPCContext = async (opts: CreateContextOptions) => { - const session = await auth(); +export const createInnerTRPCContext = (opts: CreateContextOptions) => { return { - session, - headers: opts.headers, + user: opts.user, + supabase: opts.supabase, db, - supabase }; }; @@ -54,12 +59,12 @@ export const createInnerTRPCContext = async (opts: CreateContextOptions) => { * * @see https://trpc.io/docs/context */ -export const createTRPCContext = async (opts: { req: NextRequest }) => { - // Fetch stuff that depends on the request +export const createTRPCContext = async (_opts: CreateNextContextOptions) => { + const supabase = createClient(_opts.req, _opts.res); - return await createInnerTRPCContext({ - headers: opts.req.headers, - }); + const { data: { user } } = await supabase.auth.getUser() + + return createInnerTRPCContext({ user, supabase }); }; /** @@ -84,6 +89,13 @@ const t = initTRPC.context().create({ }, }); +/** + * Create a server-side caller. + * + * @see https://trpc.io/docs/server/server-side-calls + */ +// export const createCallerFactory = t.createCallerFactory; + /** * 3. ROUTER & PROCEDURE (THE IMPORTANT BIT) * @@ -106,26 +118,3 @@ export const createTRPCRouter = t.router; * are logged in. */ export const publicProcedure = t.procedure; - -/** Reusable middleware that enforces users are logged in before running the procedure. */ -const enforceUserIsAuthed = t.middleware(({ ctx, next }) => { - if (!ctx.session || !ctx.session.user) { - throw new TRPCError({ code: "UNAUTHORIZED" }); - } - return next({ - ctx: { - // infers the `session` as non-nullable - session: { ...ctx.session, user: ctx.session.user }, - }, - }); -}); - -/** - * Protected (authenticated) procedure - * - * If you want a query or mutation to ONLY be accessible to logged in users, use this. It verifies - * the session is valid and guarantees `ctx.session.user` is not null. - * - * @see https://trpc.io/docs/procedures - */ -export const protectedProcedure = t.procedure.use(enforceUserIsAuthed); diff --git a/src/trpc/react.tsx b/src/trpc/react.tsx deleted file mode 100644 index 3e3eb5d8..00000000 --- a/src/trpc/react.tsx +++ /dev/null @@ -1,47 +0,0 @@ -"use client"; - -import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; -import { loggerLink, unstable_httpBatchStreamLink } from "@trpc/client"; -import { createTRPCReact } from "@trpc/react-query"; -import { useState } from "react"; - -import { type AppRouter } from "~/server/api/root"; -import { getUrl, transformer } from "./shared"; - -export const api = createTRPCReact(); - -export function TRPCReactProvider(props: { - children: React.ReactNode; - headers: Headers; -}) { - const [queryClient] = useState(() => new QueryClient()); - - const [trpcClient] = useState(() => - api.createClient({ - transformer, - links: [ - loggerLink({ - enabled: (op) => - process.env.NODE_ENV === "development" || - (op.direction === "down" && op.result instanceof Error), - }), - unstable_httpBatchStreamLink({ - url: getUrl(), - headers() { - const heads = new Map(props.headers); - heads.set("x-trpc-source", "react"); - return Object.fromEntries(heads); - }, - }), - ], - }), - ); - - return ( - - - {props.children} - - - ); -} diff --git a/src/trpc/server.ts b/src/trpc/server.ts deleted file mode 100644 index 6984f458..00000000 --- a/src/trpc/server.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { - createTRPCProxyClient, - loggerLink, - unstable_httpBatchStreamLink, -} from "@trpc/client"; -import { headers } from "next/headers"; - -import { type AppRouter } from "~/server/api/root"; -import { getUrl, transformer } from "./shared"; - -export const api = createTRPCProxyClient({ - transformer, - links: [ - loggerLink({ - enabled: (op) => - process.env.NODE_ENV === "development" || - (op.direction === "down" && op.result instanceof Error), - }), - unstable_httpBatchStreamLink({ - url: getUrl(), - headers() { - const heads = new Map(headers()); - heads.set("x-trpc-source", "rsc"); - return Object.fromEntries(heads); - }, - }), - ], -}); diff --git a/src/trpc/shared.ts b/src/trpc/shared.ts deleted file mode 100644 index 46005045..00000000 --- a/src/trpc/shared.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { type inferRouterInputs, type inferRouterOutputs } from "@trpc/server"; -import superjson from "superjson"; - -import { type AppRouter } from "~/server/api/root"; - -export const transformer = superjson; - -function getBaseUrl() { - if (typeof window !== "undefined") return ""; - if (process.env.VERCEL_URL) return `https://${process.env.VERCEL_URL}`; - return `http://localhost:${process.env.PORT ?? 3000}`; -} - -export function getUrl() { - return getBaseUrl() + "/api/trpc"; -} - -/** - * Inference helper for inputs. - * - * @example type HelloInput = RouterInputs['example']['hello'] - */ -export type RouterInputs = inferRouterInputs; - -/** - * Inference helper for outputs. - * - * @example type HelloOutput = RouterOutputs['example']['hello'] - */ -export type RouterOutputs = inferRouterOutputs; diff --git a/src/utils/api.ts b/src/utils/api.ts new file mode 100644 index 00000000..0f03d307 --- /dev/null +++ b/src/utils/api.ts @@ -0,0 +1,68 @@ +/** + * This is the client-side entrypoint for your tRPC API. It is used to create the `api` object which + * contains the Next.js App-wrapper, as well as your type-safe React Query hooks. + * + * We also create a few inference helpers for input and output types. + */ +import { httpBatchLink, loggerLink } from "@trpc/client"; +import { createTRPCNext } from "@trpc/next"; +import { type inferRouterInputs, type inferRouterOutputs } from "@trpc/server"; +import superjson from "superjson"; + +import { type AppRouter } from "~/server/api/root"; + +const getBaseUrl = () => { + if (typeof window !== "undefined") return ""; // browser should use relative url + if (process.env.VERCEL_URL) return `https://${process.env.VERCEL_URL}`; // SSR should use vercel url + return `http://localhost:${process.env.PORT ?? 3000}`; // dev SSR should use localhost +}; + +/** A set of type-safe react-query hooks for your tRPC API. */ +export const api = createTRPCNext({ + config() { + return { + /** + * Links used to determine request flow from client to server. + * + * @see https://trpc.io/docs/links + */ + links: [ + loggerLink({ + enabled: (opts) => + process.env.NODE_ENV === "development" || + (opts.direction === "down" && opts.result instanceof Error), + }), + httpBatchLink({ + /** + * Transformer used for data de-serialization from the server. + * + * @see https://trpc.io/docs/data-transformers + */ + transformer: superjson, + url: `${getBaseUrl()}/api/trpc`, + }), + ], + }; + }, + /** + * Whether tRPC should await queries when server rendering pages. + * + * @see https://trpc.io/docs/nextjs#ssr-boolean-default-false + */ + ssr: false, + transformer: superjson, +}); + +/** + * Inference helper for inputs. + * + * @example type HelloInput = RouterInputs['example']['hello'] + */ +export type RouterInputs = inferRouterInputs; + +/** + * Inference helper for outputs. + * + * @example type HelloOutput = RouterOutputs['example']['hello'] + */ +export type RouterOutputs = inferRouterOutputs; diff --git a/src/app/auth/login/page.tsx b/src/views/auth/login/index.tsx similarity index 93% rename from src/app/auth/login/page.tsx rename to src/views/auth/login/index.tsx index 1a036b9a..d1226beb 100644 --- a/src/app/auth/login/page.tsx +++ b/src/views/auth/login/index.tsx @@ -1,4 +1,4 @@ -import { Login } from "~/app/components/auth"; +import { Login } from "~/components/auth"; export default function LoginPage() { return ( diff --git a/src/app/auth/verify/page.tsx b/src/views/auth/verify/index.tsx similarity index 100% rename from src/app/auth/verify/page.tsx rename to src/views/auth/verify/index.tsx diff --git a/src/app/boards/[...boardId]/components/BoardDropdown.tsx b/src/views/board/components/BoardDropdown.tsx similarity index 73% rename from src/app/boards/[...boardId]/components/BoardDropdown.tsx rename to src/views/board/components/BoardDropdown.tsx index 3995c84e..aecb67ce 100644 --- a/src/app/boards/[...boardId]/components/BoardDropdown.tsx +++ b/src/views/board/components/BoardDropdown.tsx @@ -1,9 +1,7 @@ -"use client"; - import { Fragment } from "react"; import { Menu, Transition } from "@headlessui/react"; import { HiEllipsisHorizontal } from "react-icons/hi2"; -import { useModal } from "~/app/providers/modal"; +import { useModal } from "~/providers/modal"; export default function BoardDropdown() { const { openModal } = useModal(); @@ -11,7 +9,7 @@ export default function BoardDropdown() { return (
- + - +
diff --git a/src/app/boards/[...boardId]/components/DeleteBoardConfirmation.tsx b/src/views/board/components/DeleteBoardConfirmation.tsx similarity index 72% rename from src/app/boards/[...boardId]/components/DeleteBoardConfirmation.tsx rename to src/views/board/components/DeleteBoardConfirmation.tsx index 060c81d8..07f72337 100644 --- a/src/app/boards/[...boardId]/components/DeleteBoardConfirmation.tsx +++ b/src/views/board/components/DeleteBoardConfirmation.tsx @@ -1,10 +1,8 @@ -"use client"; - import { useRouter } from "next/navigation"; -import { api } from "~/trpc/react"; -import { useBoard } from "~/app/providers/board"; -import { useModal } from "~/app/providers/modal"; +import { api } from "~/utils/api"; +import { useBoard } from "~/providers/board"; +import { useModal } from "~/providers/modal"; export function DeleteBoardConfirmation() { const router = useRouter(); @@ -24,13 +22,13 @@ export function DeleteBoardConfirmation() {

Are you sure you want to delete this board?

-

+

{"This action can't be undone."}

diff --git a/src/app/boards/[...boardId]/components/DeleteListConfirmation.tsx b/src/views/board/components/DeleteListConfirmation.tsx similarity index 74% rename from src/app/boards/[...boardId]/components/DeleteListConfirmation.tsx rename to src/views/board/components/DeleteListConfirmation.tsx index 65f4da50..0b8f1d34 100644 --- a/src/app/boards/[...boardId]/components/DeleteListConfirmation.tsx +++ b/src/views/board/components/DeleteListConfirmation.tsx @@ -1,8 +1,6 @@ -"use client"; - -import { api } from "~/trpc/react"; -import { useBoard } from "~/app/providers/board"; -import { useModal } from "~/app/providers/modal"; +import { api } from "~/utils/api"; +import { useBoard } from "~/providers/board"; +import { useModal } from "~/providers/modal"; interface DeleteListConfirmationProps { listPublicId: string; @@ -31,13 +29,13 @@ export function DeleteListConfirmation({

Are you sure you want to delete this list?

-

+

{"This action can't be undone."}

diff --git a/src/app/boards/[...boardId]/components/List.tsx b/src/views/board/components/List.tsx similarity index 87% rename from src/app/boards/[...boardId]/components/List.tsx rename to src/views/board/components/List.tsx index 69677d13..23c5879d 100644 --- a/src/app/boards/[...boardId]/components/List.tsx +++ b/src/views/board/components/List.tsx @@ -1,12 +1,10 @@ -"use client"; - import { type ReactNode } from "react"; import { HiOutlinePlusSmall } from "react-icons/hi2"; import { Draggable } from "react-beautiful-dnd"; import { useFormik } from "formik"; -import { api } from "~/trpc/react"; -import { useModal } from "~/app/providers/modal"; +import { api } from "~/utils/api"; +import { useModal } from "~/providers/modal"; import ListDropdown from "./ListDropdown"; @@ -66,7 +64,7 @@ export default function List({ ref={provided.innerRef} {...provided.draggableProps} {...provided.dragHandleProps} - className="bg-light-300 border-light-400 dark-text-dark-1000 mr-5 h-fit min-w-[18rem] max-w-[18rem] rounded-md border py-2 pl-2 pr-1 text-neutral-900 dark:border-dark-400 dark:bg-dark-200" + className="dark-text-dark-1000 mr-5 h-fit min-w-[18rem] max-w-[18rem] rounded-md border border-light-400 bg-light-300 py-2 pl-2 pr-1 text-neutral-900 dark:border-dark-400 dark:bg-dark-200" >
diff --git a/src/app/boards/[...boardId]/components/NewCardForm.tsx b/src/views/board/components/NewCardForm.tsx similarity index 86% rename from src/app/boards/[...boardId]/components/NewCardForm.tsx rename to src/views/board/components/NewCardForm.tsx index cfc8fd83..e94e45b3 100644 --- a/src/app/boards/[...boardId]/components/NewCardForm.tsx +++ b/src/views/board/components/NewCardForm.tsx @@ -1,15 +1,13 @@ -"use client"; - import { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; -import { api } from "~/trpc/react"; +import { api } from "~/utils/api"; import { HiXMark } from "react-icons/hi2"; import { Switch } from "@headlessui/react"; -import CheckboxDropdown from "~/app/components/CheckboxDropdown"; -import { useBoard } from "~/app/providers/board"; -import { useModal } from "~/app/providers/modal"; +import CheckboxDropdown from "~/components/CheckboxDropdown"; +import { useBoard } from "~/providers/board"; +import { useModal } from "~/providers/modal"; interface FormData { title: string; @@ -142,7 +140,7 @@ export function NewCardForm({ listPublicId }: NewCardFormProps) { New card
@@ -172,7 +170,7 @@ export function NewCardForm({ listPublicId }: NewCardFormProps) { handleSelectList(list.key) } > -
+
{selectedList?.value}
@@ -184,7 +182,7 @@ export function NewCardForm({ listPublicId }: NewCardFormProps) { handleSelectMembers(list.key) } > -
+
{!memberPublicIds.length ? ( "Members" ) : ( @@ -197,7 +195,7 @@ export function NewCardForm({ listPublicId }: NewCardFormProps) { return ( {member?.value @@ -222,7 +220,7 @@ export function NewCardForm({ listPublicId }: NewCardFormProps) { handleSelectLabels(list.key) } > -
+
{!labelPublicIds.length ? ( "Labels" ) : ( @@ -267,7 +265,7 @@ export function NewCardForm({ listPublicId }: NewCardFormProps) {
- + Create more diff --git a/src/app/boards/[...boardId]/components/NewListForm.tsx b/src/views/board/components/NewListForm.tsx similarity index 82% rename from src/app/boards/[...boardId]/components/NewListForm.tsx rename to src/views/board/components/NewListForm.tsx index 3f384f15..edbbde05 100644 --- a/src/app/boards/[...boardId]/components/NewListForm.tsx +++ b/src/views/board/components/NewListForm.tsx @@ -1,13 +1,11 @@ -"use client"; - import { useState, useEffect } from "react"; -import { api } from "~/trpc/react"; +import { api } from "~/utils/api"; import { HiXMark } from "react-icons/hi2"; import { Switch } from "@headlessui/react"; -import { useBoard } from "~/app/providers/board"; -import { useModal } from "~/app/providers/modal"; +import { useBoard } from "~/providers/board"; +import { useModal } from "~/providers/modal"; import { Formik, Form, Field } from "formik"; @@ -56,7 +54,7 @@ export function NewListForm({ boardPublicId }: boardPublicId) { New list diff --git a/src/app/boards/[...boardId]/page.tsx b/src/views/board/index.tsx similarity index 97% rename from src/app/boards/[...boardId]/page.tsx rename to src/views/board/index.tsx index 0923c023..9535e47c 100644 --- a/src/app/boards/[...boardId]/page.tsx +++ b/src/views/board/index.tsx @@ -1,5 +1,3 @@ -"use client"; - import { useState } from "react"; import Link from "next/link"; import { useParams } from "next/navigation"; @@ -12,17 +10,17 @@ import { } from "react-beautiful-dnd"; import { useFormik } from "formik"; -import { api } from "~/trpc/react"; -import { useBoard } from "~/app/providers/board"; -import { useModal } from "~/app/providers/modal"; +import { api } from "~/utils/api"; +import { useBoard } from "~/providers/board"; +import { useModal } from "~/providers/modal"; -import Modal from "~/app/components/modal"; +import Modal from "~/components/modal"; import BoardDropdown from "./components/BoardDropdown"; import { DeleteBoardConfirmation } from "./components/DeleteBoardConfirmation"; import { DeleteListConfirmation } from "./components/DeleteListConfirmation"; import List from "./components/List"; -import { NewWorkspaceForm } from "~/app/components/NewWorkspaceForm"; +import { NewWorkspaceForm } from "~/components/NewWorkspaceForm"; import { NewCardForm } from "./components/NewCardForm"; import { NewListForm } from "./components/NewListForm"; diff --git a/src/app/boards/components/BoardsList.tsx b/src/views/boards/components/BoardsList.tsx similarity index 95% rename from src/app/boards/components/BoardsList.tsx rename to src/views/boards/components/BoardsList.tsx index d6f588ee..b07483b6 100644 --- a/src/app/boards/components/BoardsList.tsx +++ b/src/views/boards/components/BoardsList.tsx @@ -1,9 +1,7 @@ -"use client"; - import Link from "next/link"; -import { api } from "~/trpc/react"; -import { useWorkspace } from "~/app/providers/workspace"; +import { api } from "~/utils/api"; +import { useWorkspace } from "~/providers/workspace"; export function BoardsList() { const { workspace } = useWorkspace(); diff --git a/src/app/boards/components/ImportBoardsForm.tsx b/src/views/boards/components/ImportBoardsForm.tsx similarity index 84% rename from src/app/boards/components/ImportBoardsForm.tsx rename to src/views/boards/components/ImportBoardsForm.tsx index 2c449d75..67d522b1 100644 --- a/src/app/boards/components/ImportBoardsForm.tsx +++ b/src/views/boards/components/ImportBoardsForm.tsx @@ -1,14 +1,12 @@ -"use client"; - import { Fragment, useState } from "react"; -import { api } from "~/trpc/react"; +import { api } from "~/utils/api"; import { Listbox, Transition } from "@headlessui/react"; import { FaTrello } from "react-icons/fa"; import { HiChevronUpDown, HiXMark } from "react-icons/hi2"; -import { useModal } from "~/app/providers/modal"; -import { useWorkspace } from "~/app/providers/workspace"; +import { useModal } from "~/providers/modal"; +import { useWorkspace } from "~/providers/workspace"; import { useFormik } from "formik"; @@ -41,7 +39,7 @@ const SelectSource = ({ handleNextStep }: { handleNextStep: () => void }) => { {({ open }) => ( <>
- + @@ -63,14 +61,14 @@ const SelectSource = ({ handleNextStep }: { handleNextStep: () => void }) => { leaveFrom="opacity-100" leaveTo="opacity-0" > - + {sources.map(({ source }, index) => ( -
+
{source} @@ -87,7 +85,7 @@ const SelectSource = ({ handleNextStep }: { handleNextStep: () => void }) => {
@@ -219,7 +217,7 @@ const ImportTrello: React.FC = () => { @@ -232,14 +230,14 @@ const ImportTrello: React.FC = () => {
@@ -259,7 +257,7 @@ export function ImportBoardsForm() { New import diff --git a/src/app/boards/page.tsx b/src/views/boards/index.tsx similarity index 81% rename from src/app/boards/page.tsx rename to src/views/boards/index.tsx index 4c67bf4b..0e1f4270 100644 --- a/src/app/boards/page.tsx +++ b/src/views/boards/index.tsx @@ -1,14 +1,12 @@ -"use client"; - import { HiArrowDownTray, HiOutlinePlusSmall } from "react-icons/hi2"; import { BoardsList } from "./components/BoardsList"; -import { useModal } from "~/app/providers/modal"; -import Modal from "~/app/components/modal"; +import { useModal } from "~/providers/modal"; +import Modal from "~/components/modal"; import { ImportBoardsForm } from "./components/ImportBoardsForm"; import { NewBoardForm } from "./components/NewBoardForm"; -import { NewWorkspaceForm } from "~/app/components/NewWorkspaceForm"; +import { NewWorkspaceForm } from "~/components/NewWorkspaceForm"; export default function BoardsPage() { const { openModal, modalContentType } = useModal(); @@ -22,7 +20,7 @@ export default function BoardsPage() {
diff --git a/src/app/cards/[cardId]/components/Dropdown.tsx b/src/views/card/components/Dropdown.tsx similarity index 73% rename from src/app/cards/[cardId]/components/Dropdown.tsx rename to src/views/card/components/Dropdown.tsx index deb9dee1..c23a01b2 100644 --- a/src/app/cards/[cardId]/components/Dropdown.tsx +++ b/src/views/card/components/Dropdown.tsx @@ -1,9 +1,7 @@ -"use client"; - import { Fragment } from "react"; import { Menu, Transition } from "@headlessui/react"; import { HiEllipsisHorizontal } from "react-icons/hi2"; -import { useModal } from "~/app/providers/modal"; +import { useModal } from "~/providers/modal"; export default function Dropdown() { const { openModal } = useModal(); @@ -11,7 +9,7 @@ export default function Dropdown() { return (
- + - +
diff --git a/src/app/cards/[cardId]/components/LabelSelector.tsx b/src/views/card/components/LabelSelector.tsx similarity index 80% rename from src/app/cards/[cardId]/components/LabelSelector.tsx rename to src/views/card/components/LabelSelector.tsx index db21f180..8064d9b1 100644 --- a/src/app/cards/[cardId]/components/LabelSelector.tsx +++ b/src/views/card/components/LabelSelector.tsx @@ -1,12 +1,10 @@ -"use client"; - import { Fragment } from "react"; -import { api } from "~/trpc/react"; +import { api } from "~/utils/api"; import { Menu, Transition } from "@headlessui/react"; import { HiMiniPlus } from "react-icons/hi2"; import { useFormik } from "formik"; -import { useModal } from "~/app/providers/modal"; +import { useModal } from "~/providers/modal"; interface LabelSelectorProps { cardPublicId: string; @@ -58,7 +56,7 @@ export default function LabelSelector({ {selectedLabels.map((label) => ( {label.name}
))} - + Add label ) : ( - + Add label @@ -92,7 +90,7 @@ export default function LabelSelector({ leaveFrom="transform opacity-100 scale-100" leaveTo="transform opacity-0 scale-95" > - +
{labels?.map((label) => ( @@ -100,7 +98,7 @@ export default function LabelSelector({ {() => (
{ e.preventDefault(); await formik.setFieldValue( @@ -137,7 +135,7 @@ export default function LabelSelector({ ))} diff --git a/src/app/cards/[cardId]/page.tsx b/src/views/card/index.tsx similarity index 88% rename from src/app/cards/[cardId]/page.tsx rename to src/views/card/index.tsx index 3efb6351..4ac2c141 100644 --- a/src/app/cards/[cardId]/page.tsx +++ b/src/views/card/index.tsx @@ -1,5 +1,3 @@ -"use client"; - import Link from "next/link"; import { useParams } from "next/navigation"; import { useFormik } from "formik"; @@ -12,12 +10,12 @@ import LabelSelector from "./components/LabelSelector"; import ListSelector from "./components/ListSelector"; import MemberSelector from "./components/MemberSelector"; import { NewLabelForm } from "./components/NewLabelForm"; -import { NewWorkspaceForm } from "~/app/components/NewWorkspaceForm"; +import { NewWorkspaceForm } from "~/components/NewWorkspaceForm"; -import Modal from "~/app/components/modal"; -import { useModal } from "~/app/providers/modal"; +import Modal from "~/components/modal"; +import { useModal } from "~/providers/modal"; -import { api } from "~/trpc/react"; +import { api } from "~/utils/api"; interface FormValues { cardId: string; @@ -98,14 +96,14 @@ export default function CardPage() {
{board?.name}
@@ -135,13 +133,13 @@ export default function CardPage() { formik.setFieldValue("description", e.target.value) } onBlur={formik.submitForm} - className="text-light-900 block w-full border-0 bg-transparent py-1.5 focus-visible:outline-none dark:text-dark-1000 sm:text-sm sm:leading-6" + className="block w-full border-0 bg-transparent py-1.5 text-light-900 focus-visible:outline-none dark:text-dark-1000 sm:text-sm sm:leading-6" />
-
+

List

diff --git a/src/app/members/components/MemberDropdown.tsx b/src/views/members/components/MemberDropdown.tsx similarity index 100% rename from src/app/members/components/MemberDropdown.tsx rename to src/views/members/components/MemberDropdown.tsx diff --git a/src/app/members/page.tsx b/src/views/members/index.tsx similarity index 80% rename from src/app/members/page.tsx rename to src/views/members/index.tsx index dd6a28f5..a20407b5 100644 --- a/src/app/members/page.tsx +++ b/src/views/members/index.tsx @@ -1,13 +1,11 @@ -"use client"; - import { HiOutlinePlusSmall } from "react-icons/hi2"; -import { useModal } from "~/app/providers/modal"; -import { useWorkspace } from "~/app/providers/workspace"; -import Modal from "~/app/components/modal"; +import { useModal } from "~/providers/modal"; +import { useWorkspace } from "~/providers/workspace"; +import Modal from "~/components/modal"; -import { NewWorkspaceForm } from "~/app/components/NewWorkspaceForm"; +import { NewWorkspaceForm } from "~/components/NewWorkspaceForm"; -import { api } from "~/trpc/react"; +import { api } from "~/utils/api"; export default function MembersPage() { const { openModal, modalContentType } = useModal(); @@ -27,7 +25,7 @@ export default function MembersPage() {