feat: add RTK for master
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
import React, { useState } from 'react';
|
||||
import React, { useEffect, useState } from 'react';
|
||||
import {
|
||||
Button,
|
||||
FormControl,
|
||||
@@ -18,21 +18,29 @@ import {
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { PhoneIcon } from '@chakra-ui/icons';
|
||||
|
||||
import { armService } from '../../api/arm';
|
||||
import { api } from '../../__data__/service/api';
|
||||
|
||||
const MasterDrawer = ({ isOpen, onClose }) => {
|
||||
const { addMaster } = armService();
|
||||
const [addMaster, { error, isSuccess }] = api.useAddMasterMutation();
|
||||
const toast = useToast();
|
||||
|
||||
const [newMaster, setNewMaster] = useState({ name: '', phone: '' });
|
||||
|
||||
const handleSave = async () => {
|
||||
if (newMaster.name.trim() === '' || newMaster.phone.trim() === '') {
|
||||
const trimMaster = {
|
||||
phone: newMaster.phone.trim(),
|
||||
name: newMaster.name.trim(),
|
||||
};
|
||||
|
||||
if (trimMaster.name === '' || trimMaster.phone === '') {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
await addMaster(newMaster);
|
||||
addMaster(trimMaster);
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
if (isSuccess) {
|
||||
toast({
|
||||
title: 'Мастер создан.',
|
||||
description: `Мастер "${newMaster.name}" успешно добавлен.`,
|
||||
@@ -42,7 +50,11 @@ const MasterDrawer = ({ isOpen, onClose }) => {
|
||||
position: 'top-right',
|
||||
});
|
||||
onClose();
|
||||
} catch (error) {
|
||||
}
|
||||
}, [isSuccess]);
|
||||
|
||||
useEffect(() => {
|
||||
if (error) {
|
||||
toast({
|
||||
title: 'Ошибка при создании мастера.',
|
||||
description: 'Не удалось добавить мастера. Попробуйте еще раз.',
|
||||
@@ -53,7 +65,7 @@ const MasterDrawer = ({ isOpen, onClose }) => {
|
||||
});
|
||||
console.error(error);
|
||||
}
|
||||
};
|
||||
}, [error]);
|
||||
|
||||
const { t } = useTranslation('~', {
|
||||
keyPrefix: 'dry-wash.arm.master.drawer',
|
||||
|
||||
@@ -7,19 +7,6 @@ import { getTimeSlot } from '../../lib';
|
||||
import EditableWrapper from '../Editable/Editable';
|
||||
import { armService } from '../../api/arm';
|
||||
|
||||
export interface Schedule {
|
||||
id: string;
|
||||
startWashTime: string;
|
||||
endWashTime: string;
|
||||
}
|
||||
|
||||
export type MasterProps = {
|
||||
id: string;
|
||||
name: string;
|
||||
phone: string;
|
||||
schedule: Schedule[];
|
||||
};
|
||||
|
||||
const MasterItem = ({ name, phone, id, schedule }) => {
|
||||
const { updateMaster } = armService();
|
||||
const { t } = useTranslation('~', {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import React, { useEffect, useState } from 'react';
|
||||
import React, { useEffect } from 'react';
|
||||
import {
|
||||
Box,
|
||||
Heading,
|
||||
@@ -19,8 +19,7 @@ import { useTranslation } from 'react-i18next';
|
||||
|
||||
import MasterItem from '../MasterItem';
|
||||
import MasterDrawer from '../MasterDrawer';
|
||||
import { armService } from '../../api/arm';
|
||||
import { MasterProps } from '../MasterItem/MasterItem';
|
||||
import { api } from '../../__data__/service/api';
|
||||
|
||||
const TABLE_HEADERS = [
|
||||
'name' as const,
|
||||
@@ -36,35 +35,23 @@ const Masters = () => {
|
||||
keyPrefix: 'dry-wash.arm.master',
|
||||
});
|
||||
|
||||
const [masters, setMasters] = useState<MasterProps[]>([]);
|
||||
const [loading, setLoading] = useState(false);
|
||||
const [error, setError] = useState<string | null>(null);
|
||||
|
||||
const { fetchMasters } = armService();
|
||||
const {
|
||||
data: masters,
|
||||
error,
|
||||
isLoading,
|
||||
isSuccess,
|
||||
} = api.useGetMastersQuery();
|
||||
|
||||
useEffect(() => {
|
||||
const loadMasters = async () => {
|
||||
setLoading(true);
|
||||
|
||||
try {
|
||||
const data = await fetchMasters();
|
||||
setMasters(data.body);
|
||||
} catch (err) {
|
||||
setError(err.message);
|
||||
toast({
|
||||
title: t('error.title'),
|
||||
status: 'error',
|
||||
duration: 5000,
|
||||
isClosable: true,
|
||||
position: 'bottom-right',
|
||||
});
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
};
|
||||
|
||||
loadMasters();
|
||||
}, [toast, t]);
|
||||
if (error) {
|
||||
toast({
|
||||
title: t('error.title'),
|
||||
status: 'error',
|
||||
isClosable: true,
|
||||
position: 'bottom-right',
|
||||
});
|
||||
}
|
||||
}, [error]);
|
||||
|
||||
return (
|
||||
<Box p='8'>
|
||||
@@ -83,22 +70,21 @@ const Masters = () => {
|
||||
</Tr>
|
||||
</Thead>
|
||||
<Tbody>
|
||||
{loading && (
|
||||
{isLoading && (
|
||||
<Tr>
|
||||
<Td colSpan={TABLE_HEADERS.length} textAlign='center' py='8'>
|
||||
<Spinner size='lg' />
|
||||
</Td>
|
||||
</Tr>
|
||||
)}
|
||||
{!loading && masters.length === 0 && !error && (
|
||||
{isSuccess && masters.length === 0 && (
|
||||
<Tr>
|
||||
<Td colSpan={TABLE_HEADERS.length}>
|
||||
<Text>{t('table.empty')}</Text>
|
||||
</Td>
|
||||
</Tr>
|
||||
)}
|
||||
{!loading &&
|
||||
!error &&
|
||||
{isSuccess &&
|
||||
masters.map((master, index) => (
|
||||
<MasterItem key={index} {...master} />
|
||||
))}
|
||||
|
||||
@@ -3,8 +3,8 @@ import { Td, Tr, Link, Select } from '@chakra-ui/react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import dayjs from 'dayjs';
|
||||
|
||||
import { MasterProps } from '../MasterItem/MasterItem';
|
||||
import { getTimeSlot } from '../../lib';
|
||||
import { Master } from '../../models/api/master';
|
||||
import { armService } from '../../api/arm';
|
||||
|
||||
const statuses = [
|
||||
@@ -26,9 +26,9 @@ export type OrderProps = {
|
||||
status?: GetArrItemType<typeof statuses>;
|
||||
phone?: string;
|
||||
location?: string;
|
||||
master: MasterProps;
|
||||
master: Master;
|
||||
notes: '';
|
||||
allMasters: MasterProps[];
|
||||
allMasters: Master[];
|
||||
id: string;
|
||||
};
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ import OrderItem from '../OrderItem';
|
||||
import { OrderProps } from '../OrderItem/OrderItem';
|
||||
import { armService } from '../../api/arm';
|
||||
import DateNavigator from '../DateNavigator';
|
||||
import { MasterProps } from '../MasterItem/MasterItem';
|
||||
import { Master } from '../../models/api/master';
|
||||
|
||||
const TABLE_HEADERS = [
|
||||
'carNumber' as const,
|
||||
@@ -41,7 +41,7 @@ const Orders = () => {
|
||||
const toast = useToast();
|
||||
|
||||
const [orders, setOrders] = useState<OrderProps[]>([]);
|
||||
const [allMasters, setAllMasters] = useState<MasterProps[]>([]);
|
||||
const [allMasters, setAllMasters] = useState<Master[]>([]);
|
||||
const [loading, setLoading] = useState(false);
|
||||
const [error, setError] = useState<string | null>(null);
|
||||
const [currentDate, setCurrentDate] = useState(new Date());
|
||||
|
||||
Reference in New Issue
Block a user