From d32228306405c70c69dc1830a2d0980932f502ea Mon Sep 17 00:00:00 2001 From: Taken Date: Sat, 9 Aug 2025 13:45:16 +0200 Subject: [PATCH] Refactor --- .../admin/_components/dashboard-title.tsx | 16 ++++++ .../_components/passkey.tsx | 0 .../_components/passkeys-list.tsx | 0 .../(admin)/admin/_components/password.tsx | 7 +++ .../_components/sidebar-client.tsx | 0 .../_components/sidebar-theme-toggle.tsx | 0 .../_components/sidebar-user-dropdown.tsx | 0 .../_components/sidebar.tsx | 55 ++++++++++++------- .../_components/simple-url-form-card.tsx | 0 .../_components/stats-card.tsx | 0 .../_components/url-form-card.tsx | 4 +- .../_components/urls-data-table.tsx | 2 +- .../_components/user-profile.tsx | 0 .../{ => admin}/dashboard/create/page.tsx | 8 +-- .../dashboard/edit/[id]/not-found.tsx | 4 +- .../{ => admin}/dashboard/edit/[id]/page.tsx | 8 +-- .../{ => admin}/dashboard/list/page.tsx | 8 +-- .../(admin)/{ => admin}/dashboard/page.tsx | 10 ++-- .../(admin)/{dashboard => admin}/layout.tsx | 2 +- src/app/(admin)/admin/user/auth/page.tsx | 22 ++++++++ src/app/(admin)/admin/user/page.tsx | 18 ++++++ src/app/(admin)/dashboard/user/page.tsx | 26 --------- src/app/sign-in/_components/signin-button.tsx | 4 +- src/app/sign-in/page.tsx | 4 +- src/components/user-dropdown.tsx | 4 +- src/lib/actions/url.ts | 2 +- src/lib/auth/session.ts | 9 ++- src/middleware.ts | 2 +- 28 files changed, 135 insertions(+), 80 deletions(-) create mode 100644 src/app/(admin)/admin/_components/dashboard-title.tsx rename src/app/(admin)/{dashboard => admin}/_components/passkey.tsx (100%) rename src/app/(admin)/{dashboard => admin}/_components/passkeys-list.tsx (100%) create mode 100644 src/app/(admin)/admin/_components/password.tsx rename src/app/(admin)/{dashboard => admin}/_components/sidebar-client.tsx (100%) rename src/app/(admin)/{dashboard => admin}/_components/sidebar-theme-toggle.tsx (100%) rename src/app/(admin)/{dashboard => admin}/_components/sidebar-user-dropdown.tsx (100%) rename src/app/(admin)/{dashboard => admin}/_components/sidebar.tsx (72%) rename src/app/(admin)/{dashboard => admin}/_components/simple-url-form-card.tsx (100%) rename src/app/(admin)/{dashboard => admin}/_components/stats-card.tsx (100%) rename src/app/(admin)/{dashboard => admin}/_components/url-form-card.tsx (99%) rename src/app/(admin)/{dashboard => admin}/_components/urls-data-table.tsx (99%) rename src/app/(admin)/{dashboard => admin}/_components/user-profile.tsx (100%) rename src/app/(admin)/{ => admin}/dashboard/create/page.tsx (63%) rename src/app/(admin)/{ => admin}/dashboard/edit/[id]/not-found.tsx (92%) rename src/app/(admin)/{ => admin}/dashboard/edit/[id]/page.tsx (75%) rename src/app/(admin)/{ => admin}/dashboard/list/page.tsx (75%) rename src/app/(admin)/{ => admin}/dashboard/page.tsx (87%) rename src/app/(admin)/{dashboard => admin}/layout.tsx (90%) create mode 100644 src/app/(admin)/admin/user/auth/page.tsx create mode 100644 src/app/(admin)/admin/user/page.tsx delete mode 100644 src/app/(admin)/dashboard/user/page.tsx diff --git a/src/app/(admin)/admin/_components/dashboard-title.tsx b/src/app/(admin)/admin/_components/dashboard-title.tsx new file mode 100644 index 0000000..b493971 --- /dev/null +++ b/src/app/(admin)/admin/_components/dashboard-title.tsx @@ -0,0 +1,16 @@ +type DashBoardTitleProps = { + renderSubtitle: true + subtitle: string +} | { + renderSubtitle?: false + subtitle?: never +} + +export default function DashBoardTitle({ title, subtitle, renderSubtitle }: DashBoardTitleProps & { title: string }) { + return ( +
+

{title}

+ {renderSubtitle &&

{subtitle}

} +
+ ) +} diff --git a/src/app/(admin)/dashboard/_components/passkey.tsx b/src/app/(admin)/admin/_components/passkey.tsx similarity index 100% rename from src/app/(admin)/dashboard/_components/passkey.tsx rename to src/app/(admin)/admin/_components/passkey.tsx diff --git a/src/app/(admin)/dashboard/_components/passkeys-list.tsx b/src/app/(admin)/admin/_components/passkeys-list.tsx similarity index 100% rename from src/app/(admin)/dashboard/_components/passkeys-list.tsx rename to src/app/(admin)/admin/_components/passkeys-list.tsx diff --git a/src/app/(admin)/admin/_components/password.tsx b/src/app/(admin)/admin/_components/password.tsx new file mode 100644 index 0000000..ff39552 --- /dev/null +++ b/src/app/(admin)/admin/_components/password.tsx @@ -0,0 +1,7 @@ +import { getSession } from "@/lib/auth/session" + +export default async function PasswordSettings() { + const {} = await getSession() + + return null +} diff --git a/src/app/(admin)/dashboard/_components/sidebar-client.tsx b/src/app/(admin)/admin/_components/sidebar-client.tsx similarity index 100% rename from src/app/(admin)/dashboard/_components/sidebar-client.tsx rename to src/app/(admin)/admin/_components/sidebar-client.tsx diff --git a/src/app/(admin)/dashboard/_components/sidebar-theme-toggle.tsx b/src/app/(admin)/admin/_components/sidebar-theme-toggle.tsx similarity index 100% rename from src/app/(admin)/dashboard/_components/sidebar-theme-toggle.tsx rename to src/app/(admin)/admin/_components/sidebar-theme-toggle.tsx diff --git a/src/app/(admin)/dashboard/_components/sidebar-user-dropdown.tsx b/src/app/(admin)/admin/_components/sidebar-user-dropdown.tsx similarity index 100% rename from src/app/(admin)/dashboard/_components/sidebar-user-dropdown.tsx rename to src/app/(admin)/admin/_components/sidebar-user-dropdown.tsx diff --git a/src/app/(admin)/dashboard/_components/sidebar.tsx b/src/app/(admin)/admin/_components/sidebar.tsx similarity index 72% rename from src/app/(admin)/dashboard/_components/sidebar.tsx rename to src/app/(admin)/admin/_components/sidebar.tsx index 71fb1c2..8a914db 100644 --- a/src/app/(admin)/dashboard/_components/sidebar.tsx +++ b/src/app/(admin)/admin/_components/sidebar.tsx @@ -1,6 +1,6 @@ "use client" -import { HomeIcon, LayoutDashboard, List, PanelLeft, Plus, User2 } from "lucide-react" +import { HomeIcon, KeyRoundIcon, LayoutDashboard, List, PanelLeft, Plus, User2 } from "lucide-react" import Link from "next/link" import { usePathname } from "next/navigation" @@ -20,24 +20,37 @@ import { import { SidebarThemeToggle } from "./sidebar-theme-toggle" import { SidebarUserDropdown } from "./sidebar-user-dropdown" -const items = [ +const dashboardItems = [ { title: "Dashboard", - url: "/dashboard", + url: "/admin/dashboard", icon: LayoutDashboard }, { title: "List", - url: "/dashboard/list", + url: "/admin/dashboard/list", icon: List }, { title: "Create", - url: "/dashboard/create", + url: "/admin/dashboard/create", icon: Plus } ] +const userItems = [ + { + title: "Profile", + url: "/admin/user", + icon: User2 + }, + { + title: "Auth", + url: "/admin/user/auth", + icon: KeyRoundIcon + } +] + export function DashboardSidebar() { const pathname = usePathname() const { toggleSidebar } = useSidebar() @@ -81,7 +94,7 @@ export function DashboardSidebar() { - {items.map((item) => ( + {dashboardItems.map((item) => ( - - Other + + User - - - - - User Profile - - - + {userItems.map((item) => ( + + + + + {item.title} + + + + ))} diff --git a/src/app/(admin)/dashboard/_components/simple-url-form-card.tsx b/src/app/(admin)/admin/_components/simple-url-form-card.tsx similarity index 100% rename from src/app/(admin)/dashboard/_components/simple-url-form-card.tsx rename to src/app/(admin)/admin/_components/simple-url-form-card.tsx diff --git a/src/app/(admin)/dashboard/_components/stats-card.tsx b/src/app/(admin)/admin/_components/stats-card.tsx similarity index 100% rename from src/app/(admin)/dashboard/_components/stats-card.tsx rename to src/app/(admin)/admin/_components/stats-card.tsx diff --git a/src/app/(admin)/dashboard/_components/url-form-card.tsx b/src/app/(admin)/admin/_components/url-form-card.tsx similarity index 99% rename from src/app/(admin)/dashboard/_components/url-form-card.tsx rename to src/app/(admin)/admin/_components/url-form-card.tsx index ca6e149..757b064 100644 --- a/src/app/(admin)/dashboard/_components/url-form-card.tsx +++ b/src/app/(admin)/admin/_components/url-form-card.tsx @@ -226,12 +226,12 @@ function EditUrlForm({ data }: { data: typeof urls.$inferSelect }) { toast.error(res.message) } else { toast.success(res.message) - router.push("/dashboard/list") + router.push("/admin/dashboard/list") } } const handleCancel = () => { - router.push("/dashboard/list") + router.push("/admin/dashboard/list") } return ( diff --git a/src/app/(admin)/dashboard/_components/urls-data-table.tsx b/src/app/(admin)/admin/_components/urls-data-table.tsx similarity index 99% rename from src/app/(admin)/dashboard/_components/urls-data-table.tsx rename to src/app/(admin)/admin/_components/urls-data-table.tsx index 80c63a9..a44bff5 100644 --- a/src/app/(admin)/dashboard/_components/urls-data-table.tsx +++ b/src/app/(admin)/admin/_components/urls-data-table.tsx @@ -283,7 +283,7 @@ export function UrlsDataTable({ data }: UrlsDataTableProps) { Copy URL - + Edit URL diff --git a/src/app/(admin)/dashboard/_components/user-profile.tsx b/src/app/(admin)/admin/_components/user-profile.tsx similarity index 100% rename from src/app/(admin)/dashboard/_components/user-profile.tsx rename to src/app/(admin)/admin/_components/user-profile.tsx diff --git a/src/app/(admin)/dashboard/create/page.tsx b/src/app/(admin)/admin/dashboard/create/page.tsx similarity index 63% rename from src/app/(admin)/dashboard/create/page.tsx rename to src/app/(admin)/admin/dashboard/create/page.tsx index 6df87da..83d234a 100644 --- a/src/app/(admin)/dashboard/create/page.tsx +++ b/src/app/(admin)/admin/dashboard/create/page.tsx @@ -1,15 +1,15 @@ import { getSession } from "@/lib/auth/session" -import { UrlFormCard } from "../_components/url-form-card" +import { UrlFormCard } from "../../_components/url-form-card" export default async function DashboardCreatePage() { - const { session, redirect } = await getSession() + const { session, redirectToSignIn } = await getSession() if (!session) { - redirect("/sign-in") + redirectToSignIn() } return ( -
+

Create Short Link

diff --git a/src/app/(admin)/dashboard/edit/[id]/not-found.tsx b/src/app/(admin)/admin/dashboard/edit/[id]/not-found.tsx similarity index 92% rename from src/app/(admin)/dashboard/edit/[id]/not-found.tsx rename to src/app/(admin)/admin/dashboard/edit/[id]/not-found.tsx index b5b72ea..824b5cf 100644 --- a/src/app/(admin)/dashboard/edit/[id]/not-found.tsx +++ b/src/app/(admin)/admin/dashboard/edit/[id]/not-found.tsx @@ -25,12 +25,12 @@ export default function NotFound() {
diff --git a/src/app/(admin)/dashboard/edit/[id]/page.tsx b/src/app/(admin)/admin/dashboard/edit/[id]/page.tsx similarity index 75% rename from src/app/(admin)/dashboard/edit/[id]/page.tsx rename to src/app/(admin)/admin/dashboard/edit/[id]/page.tsx index ae4faf0..b28e184 100644 --- a/src/app/(admin)/dashboard/edit/[id]/page.tsx +++ b/src/app/(admin)/admin/dashboard/edit/[id]/page.tsx @@ -1,17 +1,17 @@ import { getSession } from "@/lib/auth/session" import { getUrlById } from "@/lib/db/urls" import { notFound } from "next/navigation" -import { UrlFormCard } from "../../_components/url-form-card" +import { UrlFormCard } from "../../../_components/url-form-card" export default async function EditPage({ params }: { params: Promise<{ id: string }> }) { - const { session, redirect } = await getSession() + const { session, redirectToSignIn } = await getSession() if (!session) { - redirect("/sign-in") + redirectToSignIn() } const { id } = await params @@ -23,7 +23,7 @@ export default async function EditPage({ } return ( -
+

Edit Short Link

diff --git a/src/app/(admin)/dashboard/list/page.tsx b/src/app/(admin)/admin/dashboard/list/page.tsx similarity index 75% rename from src/app/(admin)/dashboard/list/page.tsx rename to src/app/(admin)/admin/dashboard/list/page.tsx index e403629..4d45ac9 100644 --- a/src/app/(admin)/dashboard/list/page.tsx +++ b/src/app/(admin)/admin/dashboard/list/page.tsx @@ -1,18 +1,18 @@ import { getSession } from "@/lib/auth/session" import { getAllUrls } from "@/lib/db/urls" -import { UrlsDataTable } from "../_components/urls-data-table" +import { UrlsDataTable } from "../../_components/urls-data-table" export default async function DashboardListPage() { - const { session, redirect } = await getSession() + const { session, redirectToSignIn } = await getSession() if (!session) { - redirect("/sign-in") + redirectToSignIn() } const urls = await getAllUrls() return ( -
+

URLs

Manage all your shortened URLs.

diff --git a/src/app/(admin)/dashboard/page.tsx b/src/app/(admin)/admin/dashboard/page.tsx similarity index 87% rename from src/app/(admin)/dashboard/page.tsx rename to src/app/(admin)/admin/dashboard/page.tsx index 24cc977..1b4acab 100644 --- a/src/app/(admin)/dashboard/page.tsx +++ b/src/app/(admin)/admin/dashboard/page.tsx @@ -1,14 +1,14 @@ import { getSession } from "@/lib/auth/session" import { getDashboardStats } from "@/lib/dashboard/stats" import { LinkIcon, MousePointerClick, TrendingUp } from "lucide-react" -import { UrlFormCard } from "./_components/simple-url-form-card" -import { StatsCard } from "./_components/stats-card" +import { UrlFormCard } from "../_components/simple-url-form-card" +import { StatsCard } from "../_components/stats-card" export default async function Dashboard() { - const { session, redirect } = await getSession() + const { session, redirectToSignIn } = await getSession() if (!session) { - redirect("/sign-in") + redirectToSignIn() } const stats = await getDashboardStats() @@ -20,7 +20,7 @@ export default async function Dashboard() { : "No URLs" return ( -
+

Dashboard

-
+
{children}
diff --git a/src/app/(admin)/admin/user/auth/page.tsx b/src/app/(admin)/admin/user/auth/page.tsx new file mode 100644 index 0000000..f80c93f --- /dev/null +++ b/src/app/(admin)/admin/user/auth/page.tsx @@ -0,0 +1,22 @@ +import { getSession } from "@/lib/auth/session" +import DashBoardTitle from "../../_components/dashboard-title" +import { PasskeyAdd } from "../../_components/passkey" +import PasskeysList from "../../_components/passkeys-list" + +export default async function UserAuthPage() { + const { session, redirectToSignIn } = await getSession() + + if (!session) { + redirectToSignIn() + } + + return ( +
+ +
+ + +
+
+ ) +} diff --git a/src/app/(admin)/admin/user/page.tsx b/src/app/(admin)/admin/user/page.tsx new file mode 100644 index 0000000..3a67152 --- /dev/null +++ b/src/app/(admin)/admin/user/page.tsx @@ -0,0 +1,18 @@ +import { getSession } from "@/lib/auth/session" +import DashBoardTitle from "../_components/dashboard-title" +import UserProfile from "../_components/user-profile" + +export default async function UserPage() { + const { session, redirectToSignIn } = await getSession() + + if (!session) { + redirectToSignIn() + } + + return ( +
+ + +
+ ) +} diff --git a/src/app/(admin)/dashboard/user/page.tsx b/src/app/(admin)/dashboard/user/page.tsx deleted file mode 100644 index d39de94..0000000 --- a/src/app/(admin)/dashboard/user/page.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import { getSession } from "@/lib/auth/session" -import { PasskeyAdd } from "../_components/passkey" -import PasskeysList from "../_components/passkeys-list" -import UserProfile from "../_components/user-profile" - -export default async function UserPage() { - const { session, redirect } = await getSession() - - if (!session) { - redirect("/login") - } - - return ( -
-
-

User Profile

-

Manage user settings

-
-
- - - -
-
- ) -} diff --git a/src/app/sign-in/_components/signin-button.tsx b/src/app/sign-in/_components/signin-button.tsx index 06f4cc0..f8ec892 100644 --- a/src/app/sign-in/_components/signin-button.tsx +++ b/src/app/sign-in/_components/signin-button.tsx @@ -22,7 +22,7 @@ export function OAuthSignInButton({ setIsLoading(true) const res = await authClient.signIn.oauth2({ providerId: "authentik", - callbackURL: "/dashboard" + callbackURL: "/admin/dashboard" }) if (res && res.error) { @@ -39,7 +39,7 @@ export function OAuthSignInButton({ const res = await authClient.signIn.passkey({ fetchOptions: { onSuccess: () => { - router.push("/dashboard") + router.push("/admin/dashboard") } } }) diff --git a/src/app/sign-in/page.tsx b/src/app/sign-in/page.tsx index 7c462f2..4ec9a3d 100644 --- a/src/app/sign-in/page.tsx +++ b/src/app/sign-in/page.tsx @@ -4,10 +4,10 @@ import { getSession } from "@/lib/auth/session" import { LogIn } from "lucide-react" export default async function SignInPage() { - const { session, redirect } = await getSession() + const { session, redirectToHome } = await getSession() if (session) { - redirect("/dashboard") + redirectToHome() } return ( diff --git a/src/components/user-dropdown.tsx b/src/components/user-dropdown.tsx index 3b6240d..35ad8ed 100644 --- a/src/components/user-dropdown.tsx +++ b/src/components/user-dropdown.tsx @@ -85,9 +85,9 @@ export function UserDropdown({ className }: UserDropdownProps) { - + - Dashboard + Admin diff --git a/src/lib/actions/url.ts b/src/lib/actions/url.ts index 7bf17ef..167e346 100644 --- a/src/lib/actions/url.ts +++ b/src/lib/actions/url.ts @@ -37,7 +37,7 @@ export async function addUrl(unsafeData: unknown): Promise { title: await getWebsiteTitle(data.url) }) - revalidatePath("/dashboard") + revalidatePath("/admin/dashboard") return { error: false, diff --git a/src/lib/auth/session.ts b/src/lib/auth/session.ts index 5aa0c88..4bf2fa7 100644 --- a/src/lib/auth/session.ts +++ b/src/lib/auth/session.ts @@ -6,9 +6,12 @@ export async function getSession() { const session = await auth.api.getSession({ headers: await headers() }) - const redirectFunc = (path: string) => { - redirect(path) + function redirectToSignIn() { + redirect("/sign-in") + } + function redirectToHome() { + redirect("/") } - return { session, redirect: redirectFunc } + return { session, redirectToSignIn, redirectToHome } } diff --git a/src/middleware.ts b/src/middleware.ts index 8e9275b..8540e8e 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -10,4 +10,4 @@ export async function middleware(request: NextRequest) { return NextResponse.next() } -export const config = { matcher: ["/dashboard"] } +export const config = { matcher: ["/admin"] }