From 780239dbbe8f63b518485521bf60b4d9e09beba3 Mon Sep 17 00:00:00 2001 From: i701 Date: Sun, 13 Jul 2025 23:09:02 +0500 Subject: [PATCH] =?UTF-8?q?feat(admin):=20add=20usertable=20and=20update?= =?UTF-8?q?=20next=20config=20=E2=9C=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/user-table.tsx | 309 ++++++++++++++++---------------------- next.config.ts | 18 +-- 2 files changed, 130 insertions(+), 197 deletions(-) diff --git a/components/user-table.tsx b/components/user-table.tsx index 1b8e29b..cd769de 100644 --- a/components/user-table.tsx +++ b/components/user-table.tsx @@ -13,198 +13,141 @@ // import { Badge } from "./ui/badge"; // import { Button } from "./ui/button"; +import Link from "next/link"; +import { redirect } from "next/navigation"; +import { getUsers } from "@/queries/users"; +import { tryCatch } from "@/utils/tryCatch"; +import ClientErrorMessage from "./client-error-message"; +import Pagination from "./pagination"; +import { Badge } from "./ui/badge"; +import { Button } from "./ui/button"; +import { + Table, + TableBody, + TableCaption, + TableCell, + TableFooter, + TableHead, + TableHeader, + TableRow, +} from "./ui/table"; + export async function UsersTable({ searchParams, }: { searchParams: Promise<{ - query: string; - page: number; - sortBy: string; - status: string; + [key: string]: unknown; }>; }) { - const query = (await searchParams)?.query || ""; - console.log(query); - // const page = (await searchParams)?.page; - // const sortBy = (await searchParams)?.sortBy || "asc"; - // const verified = (await searchParams)?.status || "all"; - // const totalUsers = await prisma.user.count({ - // where: { - // OR: [ - // { - // name: { - // contains: query || "", - // mode: "insensitive", - // }, - // }, - // { - // phoneNumber: { - // contains: query || "", - // mode: "insensitive", - // }, - // }, - // { - // address: { - // contains: query || "", - // mode: "insensitive", - // }, - // }, - // { - // id_card: { - // contains: query || "", - // mode: "insensitive", - // }, - // }, - // ], - // verified: verified === "all" ? undefined : verified === "verified", - // }, + const resolvedParams = await searchParams; - // }); + const page = Number.parseInt(resolvedParams.page as string) || 1; + const limit = 10; + const offset = (page - 1) * limit; + const apiParams: Record = {}; + for (const [key, value] of Object.entries(resolvedParams)) { + if (value !== undefined && value !== "") { + apiParams[key] = typeof value === "number" ? value : String(value); + } + } - // const totalPages = Math.ceil(totalUsers / 10); - // const limit = 10; - // const offset = (Number(page) - 1) * limit || 0; + apiParams.limit = limit; + apiParams.offset = offset; + const [error, users] = await tryCatch(getUsers(apiParams)); + if (error) { + if (error.message === "UNAUTHORIZED") { + redirect("/auth/signin"); + } + return ; + } + const { meta, data } = users; - // const users = await prisma.user.findMany({ - // where: { - // OR: [ - // { - // name: { - // contains: query || "", - // mode: "insensitive", - // }, - // }, - // { - // phoneNumber: { - // contains: query || "", - // mode: "insensitive", - // }, - // }, - // { - // address: { - // contains: query || "", - // mode: "insensitive", - // }, - // }, - // { - // id_card: { - // contains: query || "", - // mode: "insensitive", - // }, - // }, - // ], - // verified: verified === "all" ? undefined : verified === "verified", + // return null; + return ( +
+ {users?.data.length === 0 ? ( +
+

No Users yet.

+
+ ) : ( + <> + + Table of all users. + + + Name + ID Card + Atoll + Island + House Name + Status + Dob + Phone Number + Action + + + + {data.map((user) => ( + + {user.first_name} {user.last_name} + {user.id_card} + {user.atoll?.name} + {user.island?.name} + {user.address} - // }, - // include: { - // island: true, - // atoll: true, - // }, - // skip: offset, - // take: limit, - // orderBy: { - // id: `${sortBy}` as "asc" | "desc", - // }, - // }); + + {user.verified ? ( + + Verified + + ) : ( + + Unverified + + )} + + + {new Date(user.dob ?? "").toLocaleDateString("en-US", { + month: "short", + day: "2-digit", + year: "numeric", + })} + - // const users = await prisma.user.findMany({ - // where: { - // role: "USER", - // }, - // include: { - // atoll: true, - // island: true, - // }, - // }); - return null; - // return ( - //
- // {users.length === 0 ? ( - //
- //

No Users yet.

- //
- // ) : ( - // <> - //
- // Table of all users. - // - // - // Name - // ID Card - // Atoll - // Island - // House Name - // Status - // Dob - // Phone Number - // Action - // - // - // - // {users.map((user) => ( - // - // {user.name} - // {user.id_card} - // {user.atoll?.name} - // {user.island?.name} - // {user.address} - - // - // {user.verified ? ( - // - // Verified - // - // ) : ( - // - // Unverified - // - // )} - // - // - // {new Date(user.dob ?? "").toLocaleDateString("en-US", { - // month: "short", - // day: "2-digit", - // year: "numeric", - // })} - // - - // {user.phoneNumber} - // - // - // - // - // - // - // ))} - // - // - // - // - // {query.length > 0 && ( - //

- // Showing {users.length} locations for "{query} - // " - //

- // )} - //
- // - // {totalUsers} users - // - //
- //
- //
- // - // - // )} - //
- // ); + {user.mobile} + + + + + + + ))} + + + + + {meta?.total === 1 ? ( +

Total {meta?.total} user.

+ ) : ( +

Total {meta?.total} users.

+ )} +
+
+
+ + + + )} + + ); } diff --git a/next.config.ts b/next.config.ts index 32b8868..ae7e156 100644 --- a/next.config.ts +++ b/next.config.ts @@ -4,20 +4,10 @@ const nextConfig: NextConfig = { /* config options here */ images: { remotePatterns: [ - { - protocol: "http", - hostname: "verifypersonapi.baraveli.dev", - pathname: "/images/**", - search: "", - port: "", - }, - { - protocol: "https", - hostname: "i.pravatar.cc", - pathname: "/300/**", - search: "", - port: "", - }, + new URL('http://people-api.sarlink.net/images/**'), + new URL('http://verifypersonapi.baraveli.dev/images/**'), + new URL('https://i.pravatar.cc/300/**'), + new URL('https://sarlink-portal.vercel.app/**'), ], }, output: "standalone",