From 3e69a479072b4760607e911b29efb82fe22d8e32 Mon Sep 17 00:00:00 2001 From: Sergey Yarkov Date: Wed, 3 Nov 2021 00:27:15 +0300 Subject: [PATCH] refactor: user rendering --- .../users/components/UserList/UserItem.tsx | 2 +- .../users/components/UserList/UserList.tsx | 124 ++++++++++-------- .../components/UserSearch/UserSearch.tsx | 3 +- src/pages/users/users.tsx | 40 +++--- 4 files changed, 86 insertions(+), 83 deletions(-) diff --git a/src/pages/users/components/UserList/UserItem.tsx b/src/pages/users/components/UserList/UserItem.tsx index d47d80c..ca5508c 100644 --- a/src/pages/users/components/UserList/UserItem.tsx +++ b/src/pages/users/components/UserList/UserItem.tsx @@ -21,7 +21,7 @@ import UserBadge from '@educt/components/UserBadge'; import { useRootStore } from '@educt/hooks/useRootStore'; import { useColorModeValue } from '@chakra-ui/react'; -type UserItemPropsType = { +export type UserItemPropsType = { user: IUser; onEdit: (user: IUser) => void; onDelete: (user: IUser) => void; diff --git a/src/pages/users/components/UserList/UserList.tsx b/src/pages/users/components/UserList/UserList.tsx index 998f7f4..2b69cf7 100644 --- a/src/pages/users/components/UserList/UserList.tsx +++ b/src/pages/users/components/UserList/UserList.tsx @@ -1,4 +1,5 @@ import React from 'react'; +import { observer } from 'mobx-react'; import { ChevronLeftIcon, ChevronRightIcon } from '@chakra-ui/icons'; import { Flex, Box, Stack, Text } from '@chakra-ui/layout'; import { Button } from '@chakra-ui/button'; @@ -6,15 +7,15 @@ import { Button } from '@chakra-ui/button'; /** * Components */ -import UserItem from './UserItem'; import EditUserForm from '../EditUserForm'; import DeleteUserDialog from '../DeleteUserDialog'; /** * Types */ -import { IPaginationMeta, IUser } from '@educt/interfaces'; -import { UsersPageContextType } from '@educt/types'; +import type { IUser } from '@educt/interfaces'; +import type { UsersPageContextType } from '@educt/types'; +import type { UserItemPropsType } from './UserItem'; /** * Contexts @@ -24,21 +25,31 @@ import { UsersPageContext } from '@educt/contexts'; /** * Hooks */ -import { useContext } from 'react'; +import { useEffect, useContext } from 'react'; +import { useLocation } from 'react-router'; +import { useErrorHandler } from 'react-error-boundary'; import { useRootStore } from '@educt/hooks/useRootStore'; import { useDisclosure } from '@chakra-ui/hooks'; -import { useErrorHandler } from 'react-error-boundary'; -type UserListPropsType = { users: IUser[]; pagination: IPaginationMeta }; +type UserListPropsType = { render: React.FC }; -const UserList: React.FC = ({ users, pagination }) => { +const UserList: React.FC = ({ render: Item }) => { const { userStore } = useRootStore(); const { searchingRole, loading, setLoading, search, editingUser, setEditingUser, deletingUser, setDeletingUser } = useContext(UsersPageContext); + const location = useLocation(); const handleError = useErrorHandler(); - const pagesCount = Math.ceil(pagination.total / pagination.per_page); const { onOpen: onOpenEditModal, onClose: onCloseEditModal, isOpen: isOpenEditModal } = useDisclosure(); const { onOpen: onOpenDeleteDialog, onClose: onCloseDeleteDialog, isOpen: isOpenDeleteDialog } = useDisclosure(); + const { users, pagination } = userStore; + + useEffect(() => { + userStore.loadUsersData().catch(error => handleError(error)); + }, [handleError, userStore, location.search]); + + if (pagination === undefined || users === null) return
Loading users...
; + + const pagesCount = Math.ceil(pagination.total / pagination.per_page); /** * Handle next page @@ -96,60 +107,59 @@ const UserList: React.FC = ({ users, pagination }) => { onOpenDeleteDialog(); }; + if (pagination.total === 0) + return ( + + Cannot find any users. + + ); + return ( <> - {pagination.total !== 0 ? ( - <> - {editingUser && } - {deletingUser && } - - - Total: ({pagination.total}) - Actions - - {loading ? ( - - Wait a second... - - ) : ( - - {users.map(user => ( - - ))} - - )} + {editingUser && } + {deletingUser && } + + + Total: ({pagination.total}) + Actions + + {loading ? ( + + Wait a second... - - - Page {pagination.current_page} of {pagesCount} - - - - - - - - ) : ( - - Cannot find any users. + ) : ( + + {users.map(user => ( + + ))} + + )} + + + + Page {pagination.current_page} of {pagesCount} - )} + + + + + ); }; -export default UserList; +export default observer(UserList); diff --git a/src/pages/users/components/UserSearch/UserSearch.tsx b/src/pages/users/components/UserSearch/UserSearch.tsx index 483979c..df20120 100644 --- a/src/pages/users/components/UserSearch/UserSearch.tsx +++ b/src/pages/users/components/UserSearch/UserSearch.tsx @@ -6,6 +6,7 @@ import { UserRoleEnum } from '@educt/enums'; import { useErrorHandler } from 'react-error-boundary'; import { UsersPageContext } from '@educt/contexts'; import { UsersPageContextType } from '@educt/types'; +import { observer } from 'mobx-react'; type SelectRoleStateType = UserRoleEnum | 'any'; @@ -70,4 +71,4 @@ const UserSearch: React.FC = () => { ); }; -export default UserSearch; +export default observer(UserSearch); diff --git a/src/pages/users/users.tsx b/src/pages/users/users.tsx index 30f2119..e3a1a6d 100644 --- a/src/pages/users/users.tsx +++ b/src/pages/users/users.tsx @@ -1,5 +1,4 @@ -import React, { useEffect } from 'react'; -import { observer } from 'mobx-react'; +import React from 'react'; import { Box, Flex, Heading, Text } from '@chakra-ui/react'; /** @@ -10,56 +9,49 @@ import { IPageProps } from '@educt/interfaces'; /** * Components */ +import LoadingPage from '@educt/components/LoadingPage'; import UserSearch from './components/UserSearch'; import UserList from './components/UserList'; -import LoadingPage from './components/LoadingPage'; +import UserItem from './components/UserList/UserItem'; +import CreateUserForm from './components/CreateUserForm'; /** * Hooks */ import { useRootStore } from '@educt/hooks/useRootStore'; -import { useErrorHandler } from 'react-error-boundary'; -import { useLocation } from 'react-router'; /** * Context */ -import CreateUserForm from './components/CreateUserForm'; import { UsersPageContextProvider } from '@educt/providers'; /** * Users Page */ const UsersPage: React.FC = () => { - const { userStore } = useRootStore(); - const handleError = useErrorHandler(); - const location = useLocation(); + const { + userStore: { me }, + } = useRootStore(); - useEffect(() => { - userStore.loadUsersData().catch(error => handleError(error)); - }, [handleError, userStore, location.search]); + if (me === null) return ; return ( User management You can add or delete users on this page. - {userStore.users !== null && userStore.me !== null && userStore.pagination !== undefined ? ( - - - - - - + + + + + - - ) : ( - - )} + + ); }; -export default observer(UsersPage); +export default UsersPage;