diff --git a/src/config/Pages.ts b/src/config/Pages.ts index 6524ac4..4e65c84 100644 --- a/src/config/Pages.ts +++ b/src/config/Pages.ts @@ -72,14 +72,17 @@ export const Pages = { referralCode: { list: "/referral-code/list", }, - users: { - list: "/users/list", - create: "/users/create", - detail: "/users/detail/", - roleList: "/users/roles-all", - roleCreate: "/users/roles-add", - groupAdd: "/users/group-add", - groupList: "/users/groups", + admin: { + list: "/admin/list", + create: "/admin/create", + detail: "/admin/detail/", + roleList: "/admin/roles-all", + roleCreate: "/admin/roles-add", + groupAdd: "/admin/group-add", + groupList: "/admin/groups", + }, + buyUsers: { + list: "/buy-users/list", }, ads: { list: "/ads/list", diff --git a/src/pages/user/List.tsx b/src/pages/user/List.tsx new file mode 100644 index 0000000..3d58499 --- /dev/null +++ b/src/pages/user/List.tsx @@ -0,0 +1,103 @@ +import { type FC, useState } from 'react' +import { useGetUsers } from './hooks/useUserData' +import { type User } from './types/Types' +import PageLoading from '../../components/PageLoading' +import Error from '../../components/Error' +import PaginationUi from '../../components/PaginationUi' +import Td from '../../components/Td' +import { Calendar, Call, Card, User as UserIcon } from 'iconsax-react' + +const UsersList: FC = () => { + const [currentPage, setCurrentPage] = useState(1); + const { data: usersData, isLoading, error } = useGetUsers(currentPage); + + if (isLoading) { + return ( +
+ +
+ ); + } + + if (error) { + return ( +
+ +
+ ); + } + + const users = usersData?.results?.users || []; + const pager = usersData?.results?.pager; + + const formatDate = (dateString: string) => { + if (!dateString) return '-'; + return new Date(dateString).toLocaleDateString('fa-IR'); + }; + + return ( +
+
+ + + + + + + {users.length === 0 ? ( + + + + ) : ( + users.map((user: User) => ( + + + + + + + )) + )} + +
+ + + + +
+ هیچ کاربری یافت نشد +
+
+ + {user.fullName || '-'} +
+
+
+ + {user.phoneNumber} +
+
+
+ + {user.nationalCode || '-'} +
+
+
+ + {user.dateOfBirth} +
+
+
+
+ + { + setCurrentPage(page); + }} + /> +
+ ) +} + +export default UsersList \ No newline at end of file diff --git a/src/pages/user/hooks/useUserData.ts b/src/pages/user/hooks/useUserData.ts new file mode 100644 index 0000000..44ae957 --- /dev/null +++ b/src/pages/user/hooks/useUserData.ts @@ -0,0 +1,9 @@ +import { useQuery } from "@tanstack/react-query"; +import * as api from "../service/UserService"; + +export const useGetUsers = (page: number = 1, limit: number = 10) => { + return useQuery({ + queryKey: ["users", page, limit], + queryFn: () => api.getUsers(page, limit), + }); +}; diff --git a/src/pages/user/service/UserService.ts b/src/pages/user/service/UserService.ts new file mode 100644 index 0000000..75f7279 --- /dev/null +++ b/src/pages/user/service/UserService.ts @@ -0,0 +1,13 @@ +import axios from "../../../config/axios"; + +import type { UserResponse } from "../types/Types"; + +export const getUsers = async ( + page: number = 1, + limit: number = 10 +): Promise => { + const { data } = await axios.get("/admin/users", { + params: { page, limit }, + }); + return data; +}; diff --git a/src/pages/user/types/Types.ts b/src/pages/user/types/Types.ts new file mode 100644 index 0000000..00fe19b --- /dev/null +++ b/src/pages/user/types/Types.ts @@ -0,0 +1,32 @@ +export interface User { + _id: string; + fullName: string; + phoneNumber: string; + dateOfBirth: string | null; + address: string | null; + nationalCode: string | null; + homeNumber: string | null; + createdAt: string; + updatedAt: string; + __v: number; +} + +export interface Pager { + page: number; + limit: number; + totalItems: number; + totalPages: number; + prevPage: boolean; + nextPage: string | null; +} + +export interface UserResults { + users: User[]; + pager: Pager; +} + +export interface UserResponse { + status: number; + success: boolean; + results: UserResults; +} diff --git a/src/router/Main.tsx b/src/router/Main.tsx index a0cae63..a57a64d 100644 --- a/src/router/Main.tsx +++ b/src/router/Main.tsx @@ -32,6 +32,7 @@ import CreateShipment from '@/pages/shipment/Create' import CouponList from '@/pages/Coupon/List' import CreateCoupon from '@/pages/Coupon/Create' import UpdateCoupon from '@/pages/Coupon/Update' +import UsersList from '@/pages/user/List' const MainRouter: FC = () => { @@ -83,6 +84,8 @@ const MainRouter: FC = () => { } /> } /> } /> + + } /> diff --git a/src/shared/SideBar.tsx b/src/shared/SideBar.tsx index 604aed3..f7b4102 100644 --- a/src/shared/SideBar.tsx +++ b/src/shared/SideBar.tsx @@ -46,7 +46,7 @@ const SideBar: FC = () => { if (split[1] === 'dashboard' || split[1] === 'products' || split[1] === 'orders' || split[1] === 'blog' || split[1] === 'shipment' || split[1] === 'financial' || - split[1] === 'sellers' || split[1] === 'buyers' || split[1] === 'users' || + split[1] === 'sellers' || split[1] === 'buyers' || split[1] === 'admin' || split[1] === 'tickets' || split[1] === 'reports' || split[1] === 'chat' || split[1] === 'contact' || split[1] === 'settings' || split[1] === 'pages' || split[1] === 'jobs' || split[1] === 'category') { @@ -164,20 +164,20 @@ const SideBar: FC = () => { {/* خریداران */} } + icon={} title="خریداران" - isActive={isActive('buyers')} - link="/buyers" - activeName='buyers' + isActive={isActive('buy-users')} + link={Pages.buyUsers.list} + activeName='buy-users' /> {/* کاربران */} } - title="کاربران" - isActive={isActive('users')} - link="/users" - activeName='users' + icon={} + title="ادمین ها" + isActive={isActive('admin')} + link="/admin" + activeName='admin' /> {/* تیکت ها */} @@ -271,8 +271,8 @@ const SideBar: FC = () => { : subMenuName === 'shipment' ? : subMenuName === 'financial' ? : subMenuName === 'sellers' ? - : subMenuName === 'buyers' ? - : subMenuName === 'users' ? + : subMenuName === 'buy-users' ? + : subMenuName === 'admin' ? : subMenuName === 'tickets' ? : subMenuName === 'reports' ? : subMenuName === 'chat' ? @@ -563,7 +563,7 @@ const BuyersSubMenu: FC = () => { @@ -584,25 +584,25 @@ const UsersSubMenu: FC = () => { variant='Bold' />
- کاربران + ادمین ها
diff --git a/src/shared/components/UsersSubMenu.tsx b/src/shared/components/UsersSubMenu.tsx deleted file mode 100644 index 2f87a92..0000000 --- a/src/shared/components/UsersSubMenu.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import { Profile } from 'iconsax-react' -import { type FC } from 'react' -import { useTranslation } from 'react-i18next' -import SubMenuItem from './SubMenuItem' -import { Pages } from '../../config/Pages' - -const UsersSubMenu: FC = () => { - - const { t } = useTranslation('global') - - const isActive = (name: string) => { - return location.pathname.includes(name) - } - - return ( -
-
- -
- {t('sidebar.users')} -
-
- -
- - - - - - -
-
- ) -} - -export default UsersSubMenu \ No newline at end of file