Единая функция запроса тарифов в корне страницы тарифов. БекТарифы приведены к фронтТарифам. 4 функции работы со стором тарифов

This commit is contained in:
Nastya 2023-06-15 23:29:27 +03:00
parent cdc56c900b
commit ef4000ea07
9 changed files with 198 additions and 255 deletions

@ -24,9 +24,6 @@ import { calcCartData, createCartItem, findDiscountFactor, formatDiscountFactor
import { useTariffStore } from "@root/stores/tariffs";
import { AnyDiscount, CartItemTotal } from "@root/model/cart";
import { findPrivilegeById } from "@root/stores/privileges";
import { Privilege } from "@root/model/tariff";
import { enqueueSnackbar } from "notistack";
import axios from "axios";
interface Props {
selectedTariffs: GridSelectionModel;
@ -64,36 +61,6 @@ export default function Cart({ selectedTariffs }: Props) {
console.log(cartTotal, "cartTotal");
const getTariffs = () => {
axios({
method: "get",
url: "https://admin.pena.digital/strator/tariff",
})
.then((data: any) => {
setTariffs(data.data.tariffs);
// data.data.tariffs.forEach(async (t:any) => {
// if (t._id) {
// console.log(t._id)
// await axios({
// method: "delete",
// url: "https://admin.pena.digital/strator/tariff/delete",
// headers: {
// Authorization: `Bearer ${token}`,
// },
// data: { id: t._id },
// });
// }
// })
})
.catch((error) => {
enqueueSnackbar("Ошибка получения тарифов");
});
};
useEffect(() => {
getTariffs();
}, []);
const cartRows = cartTotal?.items.map((cartItemTotal) => {
const privilege = findPrivilegeById(cartItemTotal.tariff.privilegeId);

@ -10,7 +10,7 @@ import {
ServiceDiscount,
UserDiscount,
} from "@root/model/cart";
import { ServiceType, SERVICE_LIST, Tariff } from "../../model/tariff";
import { Tariff_BACKEND } from "@root/model/tariff";
import { User } from "../../model/user";
import { findPrivilegeById } from "@root/stores/privileges";
@ -38,6 +38,8 @@ export function calcCartData({
};
cartItems.forEach((cartItem) => {
console.log(cartItem)
console.log(cartItem.tariff.privilegeId)
const privilege = findPrivilegeById(cartItem.tariff.privilegeId);
console.log(privilege)

@ -17,24 +17,34 @@ export type ServiceType = (typeof SERVICE_LIST)[number]["serviceKey"];
export type PrivilegeType = "unlim" | "gencount" | "activequiz" | "abcount" | "extended";
export interface Privilege {
serviceKey: ServiceType;
name: PrivilegeType;
privilegeId: string;
description: string;
/** Единица измерения привелегии: время в днях/кол-во */
type: "day" | "count";
/** Стоимость одной единицы привелегии */
price: number;
}
export interface Tariff {
id: string;
export interface Privilege_BACKEND {
name: string;
privilegeId: string;
/** Количество единиц привелегии */
serviceKey: string;
amount: number;
/** Кастомная цена, если есть, то используется вместо privilege.price */
customPricePerUnit?: number;
isFront?: boolean
description: string;
price: number;
type: string;
value: string;
updatedAt: string;
_id: string;
}
export type Tariff_BACKEND = {
_id: string,
name: string,
price: number,
isCustom: boolean,
isFront: boolean,
privilegies: Privilege_BACKEND[],
isDeleted: boolean,
createdAt: string,
updatedAt: string
}
export type Tariff_FRONTEND = {
id: string,
name: string,
amount:number,
isFront: boolean,
privilegeId: string,
customPricePerUnit: number
}

@ -6,11 +6,11 @@ import axios from "axios";
import { CustomTextField } from "@root/kitUI/CustomTextField";
import { Tariff } from "@root/model/tariff";
import { addTariffs } from "@root/stores/tariffs";
import { authStore } from "@root/stores/auth";
import { mergedPrivilegeStore } from "@root/stores/mergedPrivileges";
import { Tariff_BACKEND } from "@root/model/tariff";
export default function CreateTariff() {
const theme = useTheme();
@ -29,77 +29,77 @@ export default function CreateTariff() {
console.log(privilege);
function handleCreateTariffClick() {
if (nameField === "") {
enqueueSnackbar("Пустое название тарифа");
}
if (amountField === "") {
enqueueSnackbar("Пустое кол-во едениц привилегия");
}
if (privilegeIdField === "") {
enqueueSnackbar("Не выбрана привилегия");
}
// function handleCreateTariffClick() {
// if (nameField === "") {
// enqueueSnackbar("Пустое название тарифа");
// }
// if (amountField === "") {
// enqueueSnackbar("Пустое кол-во едениц привилегия");
// }
// if (privilegeIdField === "") {
// enqueueSnackbar("Не выбрана привилегия");
// }
const amount = Number(amountField);
const customPrice = Number(customPriceField);
// const amount = Number(amountField);
// const customPrice = Number(customPriceField);
if (isNaN(amount) || !privilege) return;
// if (isNaN(amount) || !privilege) return;
const newTariff: Tariff = {
id: nanoid(5),
name: nameField,
amount:amount,
isFront: true,
privilegeId: privilege.privilegeId,
customPricePerUnit: customPrice ? customPrice / amount : undefined,
};
addTariffs([newTariff]);
// const newTariff: Tariff = {
// id: nanoid(5),
// name: nameField,
// amount:amount,
// isFront: true,
// privilegeId: privilege.privilegeId,
// customPricePerUnit: customPrice ? customPrice / amount : undefined,
// };
// addTariffs([newTariff]);
}
// }
const createTariff = async () => {
if (nameField === "" || amountField === "" || privilegeIdField === "") {
return;
}
// const createTariff = async () => {
// if (nameField === "" || amountField === "" || privilegeIdField === "") {
// return;
// }
try {
if (!privilege) {
throw new Error("Привилегия не выбрана");
}
// try {
// if (!privilege) {
// throw new Error("Привилегия не выбрана");
// }
if (!privilege._id) {
return;
}
// if (!privilege._id) {
// return;
// }
const { data } = await axios({
url: "https://admin.pena.digital/strator/tariff/",
method: "post",
headers: {
Authorization: `Bearer ${token}`,
},
data: {
name: nameField,
price: Number(customPriceField) * 100,
isCustom: false,
privilegies: [
{
name: privilege.name,
privilegeId: privilege._id,
serviceKey: privilege.serviceKey,
description: privilege.description,
type: privilege.type,
value: privilege.value,
price: privilege.price,
amount: Number(amountField),
},
],
},
});
} catch (error) {
enqueueSnackbar((error as Error).message);
}
};
// const { data } = await axios({
// url: "https://admin.pena.digital/strator/tariff/",
// method: "post",
// headers: {
// Authorization: `Bearer ${token}`,
// },
// data: {
// name: nameField,
// price: Number(customPriceField) * 100,
// isCustom: false,
// privilegies: [
// {
// name: privilege.name,
// privilegeId: privilege._id,
// serviceKey: privilege.serviceKey,
// description: privilege.description,
// type: privilege.type,
// value: privilege.value,
// price: privilege.price,
// amount: Number(amountField),
// },
// ],
// },
// });
// } catch (error) {
// enqueueSnackbar((error as Error).message);
// }
// };
return (
<Container
@ -210,16 +210,16 @@ isFront: true,
type="number"
/>
<Button
onClick={() => {
const privilege = findPrivilegeById(privilegeIdField);
if (true) {
//тариф создан на основе привилегии из БЕКЕНДА
createTariff();
} else {
//тариф создан на основе привилегии из ФРОНТА
handleCreateTariffClick();
}
}}
// onClick={() => {
// const privilege = findPrivilegeById(privilegeIdField);
// if (true) {
// //тариф создан на основе привилегии из БЕКЕНДА
// createTariff();
// } else {
// //тариф создан на основе привилегии из ФРОНТА
// handleCreateTariffClick();
// }
// }}
>
Создать

@ -6,10 +6,10 @@ import Modal from "@mui/material/Modal";
import TextField from "@mui/material/TextField";
import axios from "axios";
import { authStore } from "@root/stores/auth";
import {TariffDG, Privilege} from "./types"
import { Privilege, Tariff_FRONTEND } from "@root/model/tariff";
import { findPrivilegeById } from "@root/stores/privileges";
import { mergedPrivilegeStore } from "@root/stores/mergedPrivileges";
import { useTariffStore, updateTariffs } from "@root/stores/tariffs";
import { useTariffStore, updateTariff } from "@root/stores/tariffs";
import { arrayBuffer } from "stream/consumers";
@ -44,7 +44,7 @@ const editTariff = ({
});
}
interface Props {
tariff: TariffDG | undefined,
tariff: Tariff_FRONTEND,
getTariffs: () => void
}

@ -1,4 +1,4 @@
import { useState } from "react";
import { useState, useEffect } from "react";
import { Container, Typography } from "@mui/material";
import { GridSelectionModel } from "@mui/x-data-grid";
@ -8,10 +8,59 @@ import Privileges from "./Privileges/Privileges";
import TariffsDG from "./tariffsDG";
import CreateTariff from "./CreateTariff";
import ChangePriceModal from "./Privileges/ChangePriceModal";
import { Tariff_BACKEND } from "@root/model/tariff";
import { enqueueSnackbar } from "notistack";
import axios from "axios";
import { updateTariff } from "@root/stores/tariffs";
export default function Tariffs() {
const [selectedTariffs, setSelectedTariffs] = useState<GridSelectionModel>([]);
const getTariffs = () => {
axios({
method: "get",
url: "https://admin.pena.digital/strator/tariff",
})
.then((data: any) => {
//Получили список тарифов. Сразу убираем удалённые и записываем остальное в стор
data.data.tariffs.forEach((tariff:Tariff_BACKEND) => {
if (!tariff.isDeleted) {
let toFrontTariff = {
id: tariff._id,
name: tariff.name,
amount: tariff.privilegies[0].amount,
isFront: false,
privilegeId: tariff.privilegies[0].privilegeId,
customPricePerUnit: tariff.price
}
updateTariff(toFrontTariff)
}
})
// data.data.tariffs.forEach(async (t:any) => {
// if (t._id) {
// console.log(t._id)
// await axios({
// method: "delete",
// url: "https://admin.pena.digital/strator/tariff/delete",
// headers: {
// Authorization: `Bearer ${token}`,
// },
// data: { id: t._id },
// });
// }
// })
})
.catch((error) => {
enqueueSnackbar("Ошибка получения тарифов");
});
};
useEffect(() => {
getTariffs();
}, []);
return (
<Container
sx={{
@ -38,6 +87,7 @@ export default function Tariffs() {
<TariffsDG
selectedTariffs={selectedTariffs}
handleSelectionChange={(selectionModel) => setSelectedTariffs(selectionModel)}
getTariffs={getTariffs}
/>

@ -16,41 +16,25 @@ import axios from "axios";
import { authStore } from "@root/stores/auth";
import DeleteModal from "@root/kitUI/DeleteModal";
import EditModal from "./EditModal";
import { TariffDG, Privilege } from "./types";
import { Tariff_FRONTEND } from "@root/model/tariff";
interface Props {
selectedTariffs: GridSelectionModel;
handleSelectionChange: (selectionModel: GridSelectionModel) => void;
getTariffs: () => void
}
interface MergedTariff {
_id: string;
id: string;
name: string;
privilegeId: string;
serviceName: string;
price: number;
isCustom: boolean;
createdAt: string;
isDeleted: boolean;
amount?: number;
customPricePerUnit?: number;
privilegies: Privilege[];
isFront: boolean;
}
export default function TariffsDG({ selectedTariffs, handleSelectionChange }: Props) {
export default function TariffsDG({ selectedTariffs, handleSelectionChange, getTariffs }: Props) {
const { token } = authStore();
const exampleTariffs = useTariffStore((state) => state.tariffs);
const [tariffs, setTariffs] = useState<any>();
const tariffs = useTariffStore((state) => state.tariffs);
const [deletedRows, setDeletedRows] = useState<string[]>([]);
const [openDeleteModal, setOpenDeleteModal] = useState(false);
const [changedTariff, setChangedTariff] = useState<TariffDG | undefined>();
const [changingTariff, setChangingTariff] = useState<Tariff_FRONTEND | undefined>();
const [errorDelete, setErrorDelete] = useState(false);
const mergeTariffs: MergedTariff[] = [...exampleTariffs, ...(tariffs || [])];
const tariffDeleteDataGrid = async (tarifIid: string) => {
if (exampleTariffs.find((tariff) => tariff.id === tarifIid)) {
@ -113,46 +97,16 @@ export default function TariffsDG({ selectedTariffs, handleSelectionChange }: Pr
enqueueSnackbar(`Not deleted: ${notDeleted.join(", ")}`);
};
const getTariffs = () => {
axios({
method: "get",
url: "https://admin.pena.digital/strator/tariff",
})
.then((data: any) => {
setTariffs(data.data.tariffs);
// data.data.tariffs.forEach(async (t:any) => {
// if (t._id) {
// console.log(t._id)
// await axios({
// method: "delete",
// url: "https://admin.pena.digital/strator/tariff/delete",
// headers: {
// Authorization: `Bearer ${token}`,
// },
// data: { id: t._id },
// });
// }
// })
})
.catch((error) => {
enqueueSnackbar("Ошибка получения тарифов");
});
};
useEffect(() => {
getTariffs();
}, []);
const columns: GridColDef[] = [
{ field: "id", headerName: "ID", width: 100 },
{ field: "name", headerName: "Название тарифа", width: 150 },
{ field: "amount", headerName: "Количество", width: 110 },
{ field: "serviceName", headerName: "Сервис", width: 150 }, //инфо из гитлаба.
{ field: "privilegeName", headerName: "Привелегия", width: 150 },
{ field: "amount", headerName: "Количество", width: 110 },
{ field: "type", headerName: "Единица", width: 100 },
{ field: "pricePerUnit", headerName: "Цена за ед.", width: 100 },
{ field: "isCustomPrice", headerName: "Кастомная цена", width: 130 },
{ field: "customPricePerUnit", headerName: "Кастомная цена", width: 130 },
{ field: "total", headerName: "Сумма", width: 60 },
{
field: "delete",
@ -177,7 +131,7 @@ export default function TariffsDG({ selectedTariffs, handleSelectionChange }: Pr
renderCell: ({ row }) => {
// console.log(row)
return (
<IconButton onClick={() => setChangedTariff(row)}>
<IconButton onClick={() => setChangingTariff(row)}>
<ModeEditOutlineOutlinedIcon />
</IconButton>
);
@ -185,42 +139,8 @@ export default function TariffsDG({ selectedTariffs, handleSelectionChange }: Pr
},
];
const privilegiesName = (array: Privilege[]) => {
const name = array.map(({ name }) => name);
return name[0];
};
console.log(mergeTariffs);
const gridData = mergeTariffs
.filter((tariff) => !tariff.isDeleted)
.map((tariff) => {
console.log(tariff);
return {
id: tariff._id ? tariff._id : tariff.id,
name: tariff.name,
serviceName: SERVICE_LIST.find(
(service) => service.serviceKey === findPrivilegeById(tariff.privilegeId)?.serviceKey
)?.displayName,
privilegeName: tariff.privilegies
? privilegiesName(tariff.privilegies)
: `(${tariff.privilegeId}) ${findPrivilegeById(tariff.privilegeId)?.description ?? "Привилегия не найдена"}`,
privilege: tariff.privilegies ? tariff.privilegies : [],
amount: tariff.amount,
type: findPrivilegeById(tariff.privilegeId)?.type === "count" ? "день" : "шт.",
pricePerUnit: tariff.customPricePerUnit
? tariff.customPricePerUnit ?? findPrivilegeById(tariff.privilegeId)?.price
: tariff.price,
isCustomPrice: tariff.customPricePerUnit === undefined ? "Нет" : "Да",
isDeleted: tariff.isDeleted,
total: tariff.amount
? tariff.amount * (tariff.customPricePerUnit ?? findPrivilegeById(tariff.privilegeId)?.price ?? 0)
: 0,
isFront: tariff.isFront ? tariff.isFront : false,
};
});
const selectedTariff = gridData.find((tariff) => tariff.id === selectedTariffs[0]);
const selectedTariffPrivilege = selectedTariff ? selectedTariff.privilege : [];
// const selectedTariff = gridData.find((tariff) => tariff.id === selectedTariffs[0]);
// const selectedTariffPrivilege = selectedTariff ? selectedTariff.privilege : [];
const allName = () => {
const selectedNames = [];
@ -234,15 +154,12 @@ export default function TariffsDG({ selectedTariffs, handleSelectionChange }: Pr
return selectedNames;
};
console.log(allName());
console.log(gridData);
return (
<>
<DataGrid
disableSelectionOnClick={true}
checkboxSelection={true}
rows={gridData}
rows={tariffs}
columns={columns}
getRowId={(row) => row.id}
components={{ Toolbar: GridToolbar }}
@ -257,7 +174,7 @@ export default function TariffsDG({ selectedTariffs, handleSelectionChange }: Pr
) : (
<React.Fragment />
)}
<DeleteModal
{/* <DeleteModal
tariffDelete={tariffDelete}
errorDelete={errorDelete}
tariffId={selectedTariffs}
@ -266,9 +183,9 @@ export default function TariffsDG({ selectedTariffs, handleSelectionChange }: Pr
handleClose={() => {
setOpenDeleteModal(false);
}}
/>
{console.log(changedTariff)}
<EditModal tariff={changedTariff} getTariffs={getTariffs} />
/> */}
{console.log(changingTariff)}
<EditModal tariff={changingTariff} getTariffs={getTariffs} />
</>
);
}

@ -1,23 +0,0 @@
export interface TariffDG {
id: string;
name: string;
serviceName: "Шаблонизатор документов" | "Опросник" | "Аналитика сокращателя" | undefined;
privilege: Privilege[];
amount: number | undefined;
type?: string;
value?: string;
pricePerUnit: number | undefined;
total: number;
}
export interface Privilege {
name: string;
privilegeId: string;
serviceKey: string;
amount: number;
description: string;
price: number;
type: string;
value: string;
updatedAt: string;
_id: string;
}

@ -1,9 +1,10 @@
import { Tariff } from "@root/model/tariff";
import { create } from "zustand";
import { persist } from "zustand/middleware";
import { Tariff_BACKEND, Tariff_FRONTEND } from "@root/model/tariff";
interface TariffStore {
tariffs: Tariff[];
tariffs: Tariff_FRONTEND[]
}
export const useTariffStore = create<TariffStore>()(
@ -18,11 +19,30 @@ export const useTariffStore = create<TariffStore>()(
)
);
export const addTariffs = (newTariffs: Tariff[]) =>
useTariffStore.setState((state) => ({ tariffs: [...state.tariffs, ...newTariffs] }));
export const updateTariffs = (newTariff: Tariff[]) => useTariffStore.setState((state) => ({ tariffs: newTariff }));
export const resetTariffs = (newTariff: Tariff_FRONTEND[]) => useTariffStore.setState((state) => ({ tariffs: newTariff }));
export const updateTariff = (tariff: Tariff_FRONTEND) => {
let stateTariffs = useTariffStore.getState().tariffs
let index
stateTariffs.forEach((e,i) => { //ищем такой тариф для замены на новый
if (e.id == tariff.id) index = i
})
if (index === undefined) {// не нашли. Добавляем
addTariffs([tariff])
} else { //нашли. Заменяем
stateTariffs[index] = tariff
useTariffStore.setState(() => ({tariffs: stateTariffs}))
}
}
export const addTariffs = (newTariffs: Tariff_FRONTEND[]) => {
let stateTariffs = useTariffStore.getState().tariffs
let newArrayTariffs = [...stateTariffs, ...newTariffs]
newArrayTariffs.forEach((tariff) => {
updateTariff(tariff)
})
}
export const deleteTariffs = (tariffId: string) =>
useTariffStore.setState((state) => ({
tariffs: state.tariffs.filter((tariff) => tariff.id !== tariffId),