diff --git a/.vscode/settings.json b/.vscode/settings.json index 22073e71..ab243a37 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,6 @@ { - "spellright.addToSystemDictionary": true + "spellright.addToSystemDictionary": true, + "editor.codeActionsOnSave": { + "source.fixAll": "explicit" + }, } \ No newline at end of file diff --git a/bun.lockb b/bun.lockb index 14216750..b59b19af 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/package.json b/package.json index e6549492..d7c3b5cb 100644 --- a/package.json +++ b/package.json @@ -16,22 +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", - "@t3-oss/env-nextjs": "^0.7.0", + "@supabase/ssr": "^0.3.0", + "@supabase/supabase-js": "^2.42.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", @@ -44,26 +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/components/dashboard.tsx b/src/app/components/dashboard.tsx deleted file mode 100644 index a17a5902..00000000 --- a/src/app/components/dashboard.tsx +++ /dev/null @@ -1,32 +0,0 @@ -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(); - - if (!session?.user) { - redirect("/api/auth/signin"); - } - - return ( -
-
-
-

- kan.bn -

- -
-
- -
- -
{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 = () => {
@@ -54,20 +61,20 @@ export function NewWorkspaceForm() { >
diff --git a/src/app/components/ReactiveButton.tsx b/src/components/ReactiveButton.tsx similarity index 81% rename from src/app/components/ReactiveButton.tsx rename to src/components/ReactiveButton.tsx index e10075a9..4b689926 100644 --- a/src/app/components/ReactiveButton.tsx +++ b/src/components/ReactiveButton.tsx @@ -1,9 +1,7 @@ -"use client"; - import { useState } from "react"; import Link from "next/link"; -import LottieIcon from "~/app/components/LottieIcon"; +import LottieIcon from "~/components/LottieIcon"; function classNames(...classes: string[]): string { return classes.filter(Boolean).join(" "); @@ -29,7 +27,7 @@ const Button: React.FC<{ onMouseEnter={handleMouseEnter} className={classNames( current ? "bg-light-200 dark:bg-dark-200" : " dark:bg-dark-50", - "hover:bg-light-200 group flex items-center gap-x-3 rounded-md p-1.5 text-sm font-normal leading-6 text-neutral-900 dark:text-dark-1000 dark:hover:bg-dark-200", + "group flex items-center gap-x-3 rounded-md p-1.5 text-sm font-normal leading-6 text-neutral-900 hover:bg-light-200 dark:text-dark-1000 dark:hover:bg-dark-200", )} > diff --git a/src/app/components/SideNavigation.tsx b/src/components/SideNavigation.tsx similarity index 62% rename from src/app/components/SideNavigation.tsx rename to src/components/SideNavigation.tsx index 0ac176d4..0007984a 100644 --- a/src/app/components/SideNavigation.tsx +++ b/src/components/SideNavigation.tsx @@ -1,19 +1,17 @@ -"use client"; - import { usePathname } from "next/navigation"; -import { useTheme } from "~/app/providers/theme"; +import { useTheme } from "~/providers/theme"; -import boardsIconDark from "~/app/assets/boards-dark.json"; -import boardsIconLight from "~/app/assets/boards-light.json"; -import membersIconDark from "~/app/assets/members-dark.json"; -import membersIconLight from "~/app/assets/members-light.json"; -import settingsIconDark from "~/app/assets/settings-dark.json"; -import settingsIconLight from "~/app/assets/settings-light.json"; +import boardsIconDark from "~/assets/boards-dark.json"; +import boardsIconLight from "~/assets/boards-light.json"; +import membersIconDark from "~/assets/members-dark.json"; +import membersIconLight from "~/assets/members-light.json"; +import settingsIconDark from "~/assets/settings-dark.json"; +import settingsIconLight from "~/assets/settings-light.json"; -import ReactiveButton from "~/app/components/ReactiveButton"; -import UserMenu from "~/app/components/UserMenu"; -import WorkspaceMenu from "~/app/components/WorkspaceMenu"; +import ReactiveButton from "~/components/ReactiveButton"; +import UserMenu from "~/components/UserMenu"; +import WorkspaceMenu from "~/components/WorkspaceMenu"; interface SideNavigationProps { user: UserType; @@ -48,7 +46,7 @@ export default function SideNavigation({ user }: SideNavigationProps) { return ( <> -