import { useSearchParams } from 'react-router-dom'; import { Dispatch, SetStateAction, useEffect, useState } from 'react'; import toast from 'react-hot-toast'; // Components import { RiEditBoxFill } from 'react-icons/ri'; import { HiTrash } from 'react-icons/hi'; import { StyledOperationTable } from './styled'; import Menus from '../../components/Menus'; import Table from '../../components/Table'; import Direction from '../../commons/styles/Direction'; import Message from '../../components/Message'; import Search from '../../components/Search'; import SortBy from '../../components/SortBy'; import OrderBy from '../../components/OrderBy'; // Types import { Nullable } from '../../types/common'; import { IRoom } from '../../types/rooms'; // Constants import { useFetch } from '../../hooks/useFetch'; import { ROOM_PATH } from '../../constants/path'; import { STATUS_CODE } from '../../constants/responseStatus'; import { CONFIRM_DELETE, DELETE_SUCCESS } from '../../constants/messages'; import { ORDERBY_OPTIONS, ROOM_PAGE } from '../../constants/variables'; // Styled import Spinner from '../../commons/styles/Spinner'; // Helpers import { sendRequest } from '../../helpers/sendRequest'; import { formatCurrency } from '../../helpers/helper'; interface IRoomRow { room: IRoom; openFormDialog: () => void; setRoom: Dispatch>>; reload: boolean; setReload: Dispatch>; } const RoomRow = ({ room, openFormDialog, setRoom, reload, setReload, }: IRoomRow) => { const handleEdit = (room: IRoom) => { setRoom(room); openFormDialog(); }; const handleDelete = async (room: IRoom) => { if (confirm(CONFIRM_DELETE)) { const response = await sendRequest(ROOM_PATH + `/${room.id}`, 'DELETE'); if (response.statusCode === STATUS_CODE.OK) { toast.success(DELETE_SUCCESS); // Reload table setReload(!reload); } } }; const { id, name, finalPrice, status } = room; const statusText = status ? 'Unavailable' : 'Available'; return (
{id}
{name}
{formatCurrency(finalPrice)}
{statusText}
} onClick={() => handleEdit(room)} > Edit } onClick={() => handleDelete(room)}> Delete
); }; interface IRoomTable { reload: boolean; setReload: Dispatch>; openFormDialog: () => void; setRoom?: Dispatch>>; } const RoomTable = ({ reload, setReload, openFormDialog, setRoom, }: IRoomTable) => { const [nameSearch, setNameSearch] = useState(''); const [searchParams] = useSearchParams(); const [rooms, setRooms] = useState([]); const sortByValue = searchParams.get('sortBy') ? searchParams.get('sortBy')! : ''; const orderByValue = searchParams.get('orderBy') ? searchParams.get('orderBy')! : ''; const { data, isPending, errorFetchMsg } = useFetch( 'rooms', 'name', nameSearch, sortByValue, orderByValue, reload ); useEffect(() => { if (data) { setRooms(data); } else { setRooms([]); } if (errorFetchMsg) { console.error(errorFetchMsg); } }, [data, errorFetchMsg]); return ( <> {isPending && } {rooms.length ? (
Id
Name
Price
Status
data={rooms} render={(room: IRoom) => ( )} />
) : ( !isPending && No data to show here! )}
); }; export default RoomTable;