mirror of
https://github.com/Nezumi-2711/react-training.git
synced 2026-09-22 20:01:59 +00:00
Fix asynchronous error
This commit is contained in:
@@ -1,13 +1,21 @@
|
||||
import { forwardRef, useEffect } from 'react';
|
||||
|
||||
// Components
|
||||
import Dialog, { IDialogProps } from '../../components/Dialog';
|
||||
import Dialog from '../../components/Dialog';
|
||||
import RoomForm from './Form';
|
||||
|
||||
// Types
|
||||
import { TRoom } from '../../globals/types';
|
||||
|
||||
const RoomDialog = forwardRef((props, ref) => {
|
||||
|
||||
interface IRoomDialog {
|
||||
onClose?: () => void;
|
||||
reload?: boolean;
|
||||
setReload?: React.Dispatch<React.SetStateAction<boolean>>;
|
||||
ref?: React.MutableRefObject<HTMLDialogElement | null>;
|
||||
room?: TRoom | null;
|
||||
isAdd?: boolean;
|
||||
}
|
||||
|
||||
const RoomDialog = forwardRef((props: IRoomDialog, ref) => {
|
||||
const dialogRef = ref as React.MutableRefObject<
|
||||
HTMLDialogElement | undefined
|
||||
>;
|
||||
@@ -16,7 +24,7 @@ const RoomDialog = forwardRef((props, ref) => {
|
||||
onClose,
|
||||
setReload,
|
||||
reload,
|
||||
data,
|
||||
room,
|
||||
isAdd
|
||||
} = props;
|
||||
|
||||
@@ -42,11 +50,11 @@ const RoomDialog = forwardRef((props, ref) => {
|
||||
onClose={onClose!}
|
||||
reload={reload!}
|
||||
setReload={setReload!}
|
||||
room={data}
|
||||
room={room}
|
||||
isAdd={isAdd!}
|
||||
/>
|
||||
</Dialog>
|
||||
);
|
||||
}) as React.FC<IDialogProps<TRoom>>;
|
||||
});
|
||||
|
||||
export default RoomDialog;
|
||||
|
||||
@@ -48,7 +48,7 @@ const Room = () => {
|
||||
ref={dialogRef}
|
||||
setReload={setReload}
|
||||
reload={reload}
|
||||
data={room}
|
||||
room={room}
|
||||
isAdd={isAdd}
|
||||
/>
|
||||
</>
|
||||
|
||||
@@ -1,24 +1,32 @@
|
||||
import { forwardRef, useEffect } from 'react';
|
||||
|
||||
// Components
|
||||
import Dialog, { IDialogProps } from '../../components/Dialog';
|
||||
import Dialog from '../../components/Dialog';
|
||||
import UserForm from './Form';
|
||||
|
||||
// Types
|
||||
import { TUser } from '../../globals/types';
|
||||
import { useForwardRef } from '../../hooks/useForwardRef';
|
||||
|
||||
interface IUserDialog {
|
||||
onClose: () => void;
|
||||
reload: boolean;
|
||||
setReload: React.Dispatch<React.SetStateAction<boolean>>;
|
||||
ref: React.MutableRefObject<HTMLDialogElement | null>;
|
||||
user: TUser | null;
|
||||
isAdd: boolean;
|
||||
}
|
||||
|
||||
const UserDialog = forwardRef((props, ref) => {
|
||||
const dialogRef = ref as React.MutableRefObject<
|
||||
HTMLDialogElement | undefined
|
||||
>;
|
||||
const dialogRef = useForwardRef(ref);
|
||||
|
||||
// prettier-ignore
|
||||
const {
|
||||
onClose,
|
||||
setReload,
|
||||
reload,
|
||||
data,
|
||||
isAdd
|
||||
user,
|
||||
isAdd,
|
||||
} = props;
|
||||
|
||||
useEffect(() => {
|
||||
@@ -43,11 +51,11 @@ const UserDialog = forwardRef((props, ref) => {
|
||||
onClose={onClose!}
|
||||
reload={reload!}
|
||||
setReload={setReload!}
|
||||
user={data}
|
||||
user={user}
|
||||
isAdd={isAdd!}
|
||||
/>
|
||||
</Dialog>
|
||||
);
|
||||
}) as React.FC<IDialogProps<TUser>>;
|
||||
}) as React.FC<IUserDialog>;
|
||||
|
||||
export default UserDialog;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { useEffect, useState } from 'react';
|
||||
import { useCallback, useEffect, useState } from 'react';
|
||||
import toast from 'react-hot-toast';
|
||||
import { FormProvider, useForm } from 'react-hook-form';
|
||||
|
||||
@@ -38,14 +38,14 @@ import {
|
||||
REQUIRED_FIELD_ERROR,
|
||||
} from '../../constants/formValidateMessage.ts';
|
||||
import { getAllRoom, updateRoomStatus } from '../../services/roomServices.ts';
|
||||
import { TUser } from '../../globals/types.ts';
|
||||
import { TRoom, TUser } from '../../globals/types.ts';
|
||||
import { INIT_VALUE_USER_FORM } from '../../constants/variables.ts';
|
||||
|
||||
interface IUserFormProp {
|
||||
onClose: () => void;
|
||||
reload: boolean;
|
||||
setReload: React.Dispatch<React.SetStateAction<boolean>>;
|
||||
user?: TUser | null;
|
||||
user: TUser | null;
|
||||
isAdd: boolean;
|
||||
}
|
||||
|
||||
@@ -64,19 +64,17 @@ const UserForm = ({
|
||||
formState: { errors, isDirty, isValid },
|
||||
trigger,
|
||||
} = formMethods;
|
||||
const [rooms, setRooms] = useState<TRoom[]>([]);
|
||||
const [options, setOptions] = useState<ISelectOptions[]>();
|
||||
|
||||
// Init value when edit form and load options
|
||||
useEffect(() => {
|
||||
const load = async () => {
|
||||
const rooms = await getAllRoom();
|
||||
const options: ISelectOptions[] = [];
|
||||
const tempUser = isAdd
|
||||
? {}
|
||||
: {...user};
|
||||
const tempUser = isAdd ? {} : { ...user };
|
||||
|
||||
// Load and set default options room
|
||||
if (rooms) {
|
||||
if (rooms.length > 0) {
|
||||
rooms.forEach((item) => {
|
||||
if (!item.status || tempUser?.roomId === item.id)
|
||||
options.push({
|
||||
@@ -103,55 +101,71 @@ const UserForm = ({
|
||||
};
|
||||
|
||||
load();
|
||||
}, [reset, user, isAdd]);
|
||||
}, [reset, user, isAdd, rooms]);
|
||||
|
||||
// Submit form
|
||||
const onSubmit = async (newUser: TUser) => {
|
||||
try {
|
||||
if (isAdd) {
|
||||
// Add request
|
||||
const response = await sendRequest(
|
||||
USER_PATH,
|
||||
'POST',
|
||||
JSON.stringify(newUser)
|
||||
);
|
||||
const onSubmit = useCallback(
|
||||
async (newUser: TUser) => {
|
||||
try {
|
||||
if (isAdd) {
|
||||
// Add request
|
||||
const response = await sendRequest(
|
||||
USER_PATH,
|
||||
'POST',
|
||||
JSON.stringify(newUser)
|
||||
);
|
||||
|
||||
if (response.statusCode === STATUS_CODE.CREATE) {
|
||||
toast.success(ADD_SUCCESS);
|
||||
if (response.statusCode === STATUS_CODE.CREATE) {
|
||||
toast.success(ADD_SUCCESS);
|
||||
} else {
|
||||
throw new Error(errorMsg(response.statusCode, response.msg));
|
||||
}
|
||||
|
||||
// Update room status
|
||||
updateRoomStatus(newUser.roomId, true);
|
||||
} else {
|
||||
throw new Error(errorMsg(response.statusCode, response.msg));
|
||||
// Edit request
|
||||
const response = await sendRequest(
|
||||
USER_PATH + `/${newUser.id}`,
|
||||
'PUT',
|
||||
JSON.stringify(newUser)
|
||||
);
|
||||
|
||||
if (response.statusCode == STATUS_CODE.OK) {
|
||||
toast.success(EDIT_SUCCESS);
|
||||
} else {
|
||||
throw new Error(errorMsg(response.statusCode, response.msg));
|
||||
}
|
||||
|
||||
// Update room status
|
||||
updateRoomStatus(user!.roomId, true, newUser.roomId);
|
||||
}
|
||||
|
||||
// Update room status
|
||||
updateRoomStatus(newUser.roomId, true);
|
||||
} else {
|
||||
// Edit request
|
||||
const response = await sendRequest(
|
||||
USER_PATH + `/${newUser.id}`,
|
||||
'PUT',
|
||||
JSON.stringify(newUser)
|
||||
);
|
||||
|
||||
if (response.statusCode == STATUS_CODE.OK) {
|
||||
toast.success(EDIT_SUCCESS);
|
||||
} else {
|
||||
throw new Error(errorMsg(response.statusCode, response.msg));
|
||||
// Reload table data
|
||||
setReload(!reload);
|
||||
} catch (error: unknown) {
|
||||
if (error instanceof Error) {
|
||||
toast.error(error.message);
|
||||
}
|
||||
|
||||
// Update room status
|
||||
updateRoomStatus(user!.roomId, true, newUser.roomId);
|
||||
}
|
||||
// Reload table data
|
||||
setReload(!reload);
|
||||
} catch (error: unknown) {
|
||||
if (error instanceof Error) {
|
||||
toast.error(error.message);
|
||||
}
|
||||
}
|
||||
|
||||
reset();
|
||||
onClose();
|
||||
};
|
||||
reset();
|
||||
onClose();
|
||||
},
|
||||
[isAdd, onClose, reload, reset, setReload, user]
|
||||
);
|
||||
|
||||
// Load all rooms
|
||||
useEffect(() => {
|
||||
const loadRoom = async () => {
|
||||
const rooms = await getAllRoom();
|
||||
|
||||
if (rooms) {
|
||||
setRooms(rooms);
|
||||
}
|
||||
};
|
||||
|
||||
loadRoom();
|
||||
}, [onSubmit]);
|
||||
|
||||
return (
|
||||
<FormProvider {...formMethods}>
|
||||
|
||||
@@ -75,11 +75,7 @@ const UserRow = ({
|
||||
<div>{name}</div>
|
||||
<div>{identifiedCode}</div>
|
||||
<div>{phone}</div>
|
||||
<div>{
|
||||
roomId
|
||||
? roomId
|
||||
: 'None'
|
||||
}</div>
|
||||
<div>{roomId ? roomId : 'None'}</div>
|
||||
|
||||
<Menus.Menu>
|
||||
<Menus.Toggle id={id.toString()} />
|
||||
@@ -116,9 +112,9 @@ const UserTable = ({
|
||||
openFormDialog,
|
||||
setUser,
|
||||
}: IUserTable) => {
|
||||
const [users, setUsers] = useState<TUser[]>([]);
|
||||
const [phoneSearch, setPhoneSearch] = useState('');
|
||||
const [searchParams] = useSearchParams();
|
||||
const [users, setUsers] = useState<TUser[]>([]);
|
||||
const sortByValue = searchParams.get('sortBy')
|
||||
? searchParams.get('sortBy')!
|
||||
: '';
|
||||
@@ -145,8 +141,7 @@ const UserTable = ({
|
||||
if (errorFetchMsg) {
|
||||
console.error(errorFetchMsg);
|
||||
}
|
||||
}, [data, errorFetchMsg]);
|
||||
|
||||
}, [data, errorFetchMsg, setUsers]);
|
||||
|
||||
return (
|
||||
<>
|
||||
|
||||
@@ -13,7 +13,7 @@ import UserDialog from './Dialog';
|
||||
import { TUser } from '../../globals/types';
|
||||
|
||||
const User = () => {
|
||||
const dialogRef = useRef<HTMLDialogElement>();
|
||||
const dialogRef = useRef<HTMLDialogElement>(null);
|
||||
const [reload, setReload] = useState(true);
|
||||
const [user, setUser] = useState<TUser | null>(null);
|
||||
const [isAdd, setIsAdd] = useState(false);
|
||||
@@ -48,7 +48,7 @@ const User = () => {
|
||||
ref={dialogRef}
|
||||
setReload={setReload}
|
||||
reload={reload}
|
||||
data={user}
|
||||
user={user}
|
||||
isAdd={isAdd}
|
||||
/>
|
||||
</>
|
||||
|
||||
Reference in New Issue
Block a user