diff --git a/app/apis/admin/get-users.ts b/app/apis/admin/get-users.ts new file mode 100644 index 0000000..56d17e7 --- /dev/null +++ b/app/apis/admin/get-users.ts @@ -0,0 +1,41 @@ +import { z } from 'zod' + +import { HttpServer, type THttpServer } from '~/libs/http-server' + +const subscribePlanResponseSchema = z.object({ + id: z.string(), + code: z.string(), + name: z.string(), +}) +const subscribeResponseSchema = z.object({ + id: z.string(), + subscribe_plan_id: z.string(), + start_date: z.string(), + end_date: z.string().nullable(), + status: z.string(), + auto_renew: z.boolean(), + subscribe_plan: subscribePlanResponseSchema, +}) +const userResponseSchema = z.object({ + id: z.string(), + email: z.string().email(), + phone: z.string(), + subscribe: subscribeResponseSchema, +}) +const usersResponseSchema = z.object({ + data: z.array(userResponseSchema), +}) + +export type TSubscribePlanRespon = z.infer +export type TUserResponse = z.infer +export type TSubscribeResponse = z.infer + +export const getUsers = async (parameters: THttpServer) => { + try { + const { data } = await HttpServer(parameters).get(`/api/staff/users`) + return usersResponseSchema.parse(data) + } catch (error) { + // eslint-disable-next-line unicorn/no-useless-promise-resolve-reject + return Promise.reject(error) + } +} diff --git a/app/pages/dashboard-users/data.ts b/app/pages/dashboard-users/data.ts deleted file mode 100644 index bc7cb77..0000000 --- a/app/pages/dashboard-users/data.ts +++ /dev/null @@ -1,56 +0,0 @@ -type TUsers = { - id: number - idTransaction: number - date: string - name: string - email: string - category: string - status: string -} -export const USERS: TUsers[] = [ - { - id: 1, - idTransaction: 5_512_446_588, - date: '24/10/2024', - name: 'Ainun Wijaya', - email: 'ainun@gmail.com', - category: 'Pribadi', - status: 'Baru', - }, - { - id: 2, - idTransaction: 5_512_446_588, - date: '24/10/2024', - name: 'Ainun Wijaya', - email: 'ainun@gmail.com', - category: 'Pribadi', - status: 'Premium', - }, - { - id: 3, - idTransaction: 5_512_446_588, - date: '24/10/2024', - name: 'Ainun Wijaya', - email: 'ainun@gmail.com', - category: 'Pribadi', - status: 'Pembayaran', - }, - { - id: 4, - idTransaction: 5_512_446_588, - date: '24/10/2024', - name: 'Ainun Wijaya', - email: 'ainun@gmail.com', - category: 'Pribadi', - status: 'Premium', - }, - { - id: 5, - idTransaction: 5_512_446_588, - date: '24/10/2024', - name: 'Ainun Wijaya', - email: 'ainun@gmail.com', - category: 'Pribadi', - status: 'Baru', - }, -] diff --git a/app/pages/dashboard-users/index.tsx b/app/pages/dashboard-users/index.tsx index 8862c8e..a9b503f 100644 --- a/app/pages/dashboard-users/index.tsx +++ b/app/pages/dashboard-users/index.tsx @@ -1,110 +1,98 @@ -import { Field, Input, Label, Select } from '@headlessui/react' +import DT, { type ConfigColumns } from 'datatables.net-dt' +import DataTable, { type DataTableSlots } from 'datatables.net-react' +import { useRouteLoaderData } from 'react-router' -import { SearchIcon } from '~/components/icons/search' -import { Pagination } from '~/components/ui/pagination' +import type { TUserResponse } from '~/apis/admin/get-users' +import { UiTable } from '~/components/ui/table' import { TitleDashboard } from '~/components/ui/title-dashboard' - -import { USERS } from './data' +import type { loader } from '~/routes/_admin.lg-admin._dashboard.users._index' +import { formatDate } from '~/utils/formatter' type TColorBadge = 'Baru' | 'Premium' | 'Pembayaran' +const getStatusBadge = (status: TColorBadge) => { + const statusColors = { + Baru: 'bg-[#DFE5FF] text-[#4C5CA0]', + Premium: 'bg-[#FFFCAF] text-[#DBCA6E]', + Pembayaran: 'bg-[#FEC4FF] text-[#CC6EDB]', + } + return statusColors[status] || 'bg-gray-200 text-gray-700' +} export const UsersPage = () => { - const getStatusBadge = (status: TColorBadge) => { - const statusColors = { - Baru: 'bg-[#DFE5FF] text-[#4C5CA0]', - Premium: 'bg-[#FFFCAF] text-[#DBCA6E]', - Pembayaran: 'bg-[#FEC4FF] text-[#CC6EDB]', - } - return statusColors[status] || 'bg-gray-200 text-gray-700' + const loaderData = useRouteLoaderData( + 'routes/_admin.lg-admin._dashboard.users._index', + ) + + DataTable.use(DT) + const dataTable = + loaderData?.usersData?.sort( + (a, b) => + new Date(b.subscribe.start_date).getTime() - + new Date(a.subscribe.start_date).getTime(), + ) || [] + + const dataColumns: ConfigColumns[] = [ + { + title: 'No', + render: ( + _data: unknown, + _type: unknown, + _row: unknown, + meta: { row: number }, + ) => { + return meta.row + 1 + }, + }, + { + title: 'Tanggal Daftar', + data: 'subscribe.start_date', + }, + { + title: 'Nama User', + }, + { + title: 'Email', + data: 'email', + }, + { + title: 'Kategori', + data: 'subscribe.status', + }, + { + title: 'Status', + data: 'subscribe.subscribe_plan.name', + }, + ] + const dataSlot: DataTableSlots = { + 1: (value: string) => formatDate(value), + 2: (_value: unknown, _type: unknown, data: TUserResponse) => ( +
+
{data.phone}
+
ID: {data.id.slice(0, 8)}
+
+ ), + 4: (_value: string) => Pribadi, + 5: (value: TColorBadge) => ( + + {value} + + ), } return (
- {/* filter section */} -
-
- - -
- -
- -
-
-
-
- -
- - - - -
+
+
{/* TODO: Filter */}
- {/* table */} -
-
-

Daftar User

- - - - - - - - - - - - - {USERS.map((user, index) => ( - - - - - - - - - ))} - -
NoTanggal DaftarNama UserEmailKategoriStatus
{index + 1}{user.date} - {user.name} -
- id: {user.idTransaction} -
-
{user.email}{user.category} - - {user.status} - -
-
- - {/* pagination */} -
- {}} - /> -
-
+
) } diff --git a/app/routes/_admin.lg-admin._dashboard.users._index.tsx b/app/routes/_admin.lg-admin._dashboard.users._index.tsx new file mode 100644 index 0000000..8e78490 --- /dev/null +++ b/app/routes/_admin.lg-admin._dashboard.users._index.tsx @@ -0,0 +1,17 @@ +import { getUsers } from '~/apis/admin/get-users' +import { handleCookie } from '~/libs/cookies' +import { UsersPage } from '~/pages/dashboard-users' + +import type { Route } from './+types/_admin.lg-admin._dashboard.users._index' + +export const loader = async ({ request }: Route.LoaderArgs) => { + const { staffToken } = await handleCookie(request) + const { data: usersData } = await getUsers({ + accessToken: staffToken, + }) + + return { usersData } +} + +const DashboardUsersLayout = () => +export default DashboardUsersLayout diff --git a/app/routes/_admin.lg-admin._dashboard.users.tsx b/app/routes/_admin.lg-admin._dashboard.users.tsx deleted file mode 100644 index 8c3838b..0000000 --- a/app/routes/_admin.lg-admin._dashboard.users.tsx +++ /dev/null @@ -1,4 +0,0 @@ -import { UsersPage } from '~/pages/dashboard-users' - -const DashboardUsersLayout = () => -export default DashboardUsersLayout