From 07dc9c7f73dd1484876bcacae4422ceb0f2d2ec0 Mon Sep 17 00:00:00 2001 From: Sergey Yarkov Date: Mon, 20 Sep 2021 23:33:17 +0300 Subject: [PATCH] feat: creating a new user --- .../CreateUserModal/CreateUserModal.tsx | 47 +++++++++++++++++-- .../users/components/UserList/UserList.tsx | 3 +- src/services/UserService.ts | 20 ++++++++ src/stores/UserStore.ts | 20 +++++++- 4 files changed, 84 insertions(+), 6 deletions(-) diff --git a/src/pages/users/components/CreateUserModal/CreateUserModal.tsx b/src/pages/users/components/CreateUserModal/CreateUserModal.tsx index 5e18d35..147a702 100644 --- a/src/pages/users/components/CreateUserModal/CreateUserModal.tsx +++ b/src/pages/users/components/CreateUserModal/CreateUserModal.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useState } from 'react'; import { Modal, ModalOverlay, @@ -34,6 +34,9 @@ import { UserRoleEnum } from 'enums'; */ import { useDisclosure } from '@chakra-ui/hooks'; import { useForm } from 'react-hook-form'; +import { useRootStore } from 'hooks/useRootStore'; +import { useErrorHandler } from 'react-error-boundary'; +import { useToast } from '@chakra-ui/react'; type CreateUserModalPropsType = { me: IMe; @@ -49,17 +52,45 @@ type CreateUserInputType = { }; const CreateUserModal: React.FC = ({ me }) => { + const { userStore } = useRootStore(); const { isOpen, onOpen, onClose } = useDisclosure(); const { register, handleSubmit, + reset, formState: { errors }, } = useForm({ resolver: yupResolver(CreateUserSchema), }); + const [loading, setLoading] = useState(false); + const toast = useToast(); + const handleError = useErrorHandler(); - const onSubmit: SubmitHandler = data => { - console.log(data); + /** + * Create new user handler + */ + const onSubmit: SubmitHandler = async data => { + try { + setLoading(true); + await userStore.createUser(data); + /** + * Clear form state + */ + reset(); + + /** + * Close modal + */ + onClose(); + } catch (error: any) { + if (error.response) { + toast({ title: `${error.message}`, status: 'error' }); + } else { + handleError(error); + } + } finally { + setLoading(false); + } }; return ( @@ -129,7 +160,15 @@ const CreateUserModal: React.FC = ({ me }) => { - diff --git a/src/pages/users/components/UserList/UserList.tsx b/src/pages/users/components/UserList/UserList.tsx index 2f1749a..26c48d7 100644 --- a/src/pages/users/components/UserList/UserList.tsx +++ b/src/pages/users/components/UserList/UserList.tsx @@ -8,6 +8,7 @@ import { useRootStore } from 'hooks/useRootStore'; import { useErrorHandler } from 'react-error-boundary'; import { UsersPageContextType } from 'types'; import { UsersPageContext } from 'contexts'; +import { observer } from 'mobx-react'; type UserListPropsType = { users: IUser[]; @@ -106,4 +107,4 @@ const UserList: React.FC = ({ users, pagination }) => { ); }; -export default UserList; +export default observer(UserList); diff --git a/src/services/UserService.ts b/src/services/UserService.ts index d7ebe4c..88982cc 100644 --- a/src/services/UserService.ts +++ b/src/services/UserService.ts @@ -4,6 +4,14 @@ import * as helpers from 'helpers'; import { UserRoleEnum } from 'enums'; export type FetchUsersParamsType = { page?: number; limit?: number; role?: UserRoleEnum | 'any'; search?: string }; +export type CreateUserParamsType = { + first_name: string; + last_name: string; + login: string; + email: string; + role: UserRoleEnum; + password: string; +}; export default class UserService { public api: AxiosInstance; @@ -30,6 +38,18 @@ export default class UserService { return result.data; } + public async create(data: CreateUserParamsType): Promise> { + const result = await this.api.post('v1/users', { + first_name: data.first_name, + last_name: data.last_name, + login: data.login, + email: data.email, + role: data.role, + password: data.password, + }); + return result.data; + } + public async updateContacts(data: IUserContacts): Promise> { const result = await this.api.put('v1/me/contacts', helpers.removeEmptyValues(data)); return result.data; diff --git a/src/stores/UserStore.ts b/src/stores/UserStore.ts index 99e20bf..ed17f75 100644 --- a/src/stores/UserStore.ts +++ b/src/stores/UserStore.ts @@ -6,7 +6,7 @@ import * as helpers from 'helpers'; /** * Services */ -import UserService, { FetchUsersParamsType } from 'services/UserService'; +import UserService, { CreateUserParamsType, FetchUsersParamsType } from 'services/UserService'; /** * Stores @@ -78,6 +78,24 @@ export default class UserStore { } } + public async createUser(data: CreateUserParamsType) { + try { + const result = await this.userService.create(data); + + console.log(`[${this.constructor.name}]: ${result.message}`, result); + + runInAction(() => { + if (this.users !== null) { + this.users.unshift(result.data); + } + }); + + return result; + } catch (error: any) { + throw error; + } + } + /** * Update contacts of authorized user *