From f8ab92b3123d42d144dddbc5082df6130af7f1d6 Mon Sep 17 00:00:00 2001 From: Sergey Yarkov Date: Sat, 18 Sep 2021 20:52:40 +0300 Subject: [PATCH] feat: search user --- src/contexts/index.ts | 2 ++ .../users/components/UserList/UserList.tsx | 4 +++- .../components/UserSearch/UserSearch.tsx | 24 +++++++++++++++++-- src/pages/users/index.tsx | 3 ++- src/services/UserService.ts | 5 ++-- src/types/index.d.ts | 7 ++++++ 6 files changed, 39 insertions(+), 6 deletions(-) diff --git a/src/contexts/index.ts b/src/contexts/index.ts index 96ccd51..221f0b3 100644 --- a/src/contexts/index.ts +++ b/src/contexts/index.ts @@ -14,4 +14,6 @@ export const UsersPageContext = createContext({ setSearchingRole: () => {}, loading: false, setLoading: () => {}, + search: undefined, + setSearch: () => {}, }); diff --git a/src/pages/users/components/UserList/UserList.tsx b/src/pages/users/components/UserList/UserList.tsx index d5ccc52..8f54628 100644 --- a/src/pages/users/components/UserList/UserList.tsx +++ b/src/pages/users/components/UserList/UserList.tsx @@ -16,7 +16,7 @@ type UserListPropsType = { const UserList: React.FC = ({ users, pagination }) => { const { userStore } = useRootStore(); - const { searchingRole, loading, setLoading } = useContext(UsersPageContext); + const { searchingRole, loading, setLoading, search } = useContext(UsersPageContext); const handleError = useErrorHandler(); const pagesCount = Math.ceil(pagination.total / pagination.per_page); @@ -27,6 +27,7 @@ const UserList: React.FC = ({ users, pagination }) => { page: pagination.current_page + 1, limit: pagination.per_page, role: searchingRole, + search, }); } catch (error: any) { handleError(error); @@ -42,6 +43,7 @@ const UserList: React.FC = ({ users, pagination }) => { page: pagination.current_page - 1, limit: pagination.per_page, role: searchingRole, + search, }); } catch (error: any) { handleError(error); diff --git a/src/pages/users/components/UserSearch/UserSearch.tsx b/src/pages/users/components/UserSearch/UserSearch.tsx index cc19cf0..8c494a1 100644 --- a/src/pages/users/components/UserSearch/UserSearch.tsx +++ b/src/pages/users/components/UserSearch/UserSearch.tsx @@ -11,7 +11,8 @@ type SelectRoleStateType = UserRoleEnum | 'any'; const UserSearch: React.FC = () => { const { userStore } = useRootStore(); - const { searchingRole, setSearchingRole, setLoading } = useContext(UsersPageContext); + const { searchingRole, setSearchingRole, setLoading, search, setSearch } = + useContext(UsersPageContext); const { pagination } = userStore; const handleError = useErrorHandler(); @@ -25,6 +26,7 @@ const UserSearch: React.FC = () => { page: 1, limit: pagination.per_page, role: value, + search, }); setSearchingRole(value); } catch (error) { @@ -34,6 +36,24 @@ const UserSearch: React.FC = () => { } }; + const onSearch: React.ChangeEventHandler | undefined = async e => { + try { + const value = e.target.value; + setLoading(true); + setSearch(value); + await userStore.loadUsersData({ + page: 1, + limit: pagination.per_page, + role: searchingRole, + search: value, + }); + } catch (error) { + handleError(error); + } finally { + setLoading(false); + } + }; + return ( } /> - + ); diff --git a/src/pages/users/index.tsx b/src/pages/users/index.tsx index 319ac2c..1073123 100644 --- a/src/pages/users/index.tsx +++ b/src/pages/users/index.tsx @@ -36,6 +36,7 @@ const UsersPage: React.FC = ({ title }) => { const { userStore } = useRootStore(); const [searchingRole, setSearchingRole] = useState(undefined); const [loading, setLoading] = useState(false); + const [search, setSearch] = useState(undefined); const handleError = useErrorHandler(); const location = useLocation(); @@ -44,7 +45,7 @@ const UsersPage: React.FC = ({ title }) => { }, [handleError, userStore, location.search]); return ( - + User management You can add or delete your users on this page. diff --git a/src/services/UserService.ts b/src/services/UserService.ts index 87a3c2c..aa30566 100644 --- a/src/services/UserService.ts +++ b/src/services/UserService.ts @@ -3,7 +3,7 @@ import { IApiRespose, IMe, IUser, IUserContacts } from 'interfaces'; import * as helpers from 'helpers'; import { UserRoleEnum } from 'enums'; -export type FetchUsersParamsType = { page?: number; limit?: number; role?: UserRoleEnum | 'any' }; +export type FetchUsersParamsType = { page?: number; limit?: number; role?: UserRoleEnum | 'any'; search?: string }; export default class UserService { public api: AxiosInstance; @@ -18,12 +18,13 @@ export default class UserService { } public async fetchAll(params?: FetchUsersParamsType): Promise> { - const { page = 1, limit = 1, role } = params || {}; + const { page = 1, limit = 1, role, search } = params || {}; const result = await this.api.get('/v1/users', { params: { page, limit, role: role === 'any' ? undefined : role, + search: search || undefined, }, }); return result.data; diff --git a/src/types/index.d.ts b/src/types/index.d.ts index f94869a..23f2e0e 100644 --- a/src/types/index.d.ts +++ b/src/types/index.d.ts @@ -41,9 +41,16 @@ export type UsersPageContextType = { */ searchingRole: SearchingRoleStateType; setSearchingRole: React.Dispatch>; + /** * Set loading state while loading users */ loading: boolean; setLoading: React.Dispatch>; + + /** + * Serach user by fullname or email + */ + search: string | undefined; + setSearch: React.Dispatch>; };