Merge branch 'fixStorages' into dev

This commit is contained in:
nflnkr 2023-07-03 13:43:48 +03:00
commit ab772c116b
18 changed files with 296 additions and 210 deletions

@ -1,43 +1,31 @@
import { usePrivilegeStore } from "@root/stores/privileges";
import { usePrivilegies } from "./privilege.hook";
import { addMergedPrivileges } from "@root/stores/mergedPrivileges";
import { useEffect, useState } from "react";
export type mergedPrivilege = {
createdAt?: string;
description: string;
isDeleted?: boolean;
name: string;
price: number;
privilegeId: string;
serviceKey: string;
type: "count" | "day" | "mb";
updatedAt?: string;
value?: string;
_id?: string;
};
export const useCombinedPrivileges = () => {
const { privilegies, isError, errorMessage } = usePrivilegies();
const examplePrivileges = usePrivilegeStore((state) => state.privileges);
const mergedPrivileges: mergedPrivilege[] = [];
const getPrivilegeId = (privilegeId: string): string | undefined => {
const privilege = mergedPrivileges.find((privilege) => privilege.privilegeId === privilegeId);
return privilege?._id;
};
const privilegesGridData = mergedPrivileges.map((privilege) => ({
name: privilege.name,
description: privilege.description,
type: privilege.type,
price: privilege.price,
}));
if (privilegies) {
mergedPrivileges.push(...privilegies.Шаблонизатор, ...examplePrivileges);
}
return { mergedPrivileges, isError, errorMessage, getPrivilegeId, privilegesGridData };
import { usePrivilegeStore } from "@root/stores/privilegesStore";
import { useRefreshPrivilegesStore } from "./useRefreshPrivilegesStore.hook";
import { exampleCartValues } from "@stores/mocks/exampleCartValues"
import { mergedBackFrontPrivilege } from "@root/model/privilege";
interface UseCombinedPrivileges {
mergedPrivileges: mergedBackFrontPrivilege[]
}
export const useCombinedPrivileges = ():UseCombinedPrivileges => {
const [mergedPrivileges, setMergedPrivileges] = useState<mergedBackFrontPrivilege[]>([])
const backendPrivileges = usePrivilegeStore((state) => state.privileges);
const frontendPrivileges = exampleCartValues.privileges;
useEffect(() => {
setMergedPrivileges([...backendPrivileges.map((privilege) => ({
serviceKey: privilege.serviceKey,
privilegeId: privilege.privilegeId,
name: privilege.name,
description: privilege.description,
type: privilege.type,
price: privilege.price,
})), ...frontendPrivileges])
}, [backendPrivileges])
return { mergedPrivileges };
};

@ -1,5 +1,6 @@
import { useEffect, useState } from "react";
import axios from "axios";
import { RealPrivilege } from "@root/model/privilege";
export type Privilege = {
createdAt: string;
@ -16,21 +17,21 @@ export type Privilege = {
};
type UsePrivilegies = {
privilegies: Record<string, Privilege[]> | undefined;
privilegies: RealPrivilege[]
isError: boolean;
isLoading: boolean;
errorMessage: string;
};
export const usePrivilegies = (): UsePrivilegies => {
const [privilegies, setPrivilegies] = useState<Record<string, Privilege[]>>();
export const useGetPrivilegies = (): UsePrivilegies => {
const [privilegies, setPrivilegies] = useState<RealPrivilege[]>([]);
const [isLoading, setIsLoading] = useState(false);
const [isError, setIsError] = useState(false);
const [errorMessage, setErrorMessage] = useState("");
useEffect(() => {
const getPrivilegies = async () => {
const { data } = await axios<Record<string, Privilege[]>>({
const { data } = await axios<RealPrivilege[]>({
method: "get",
url: "https://admin.pena.digital/strator/privilege/service",
});

@ -0,0 +1,33 @@
import { useEffect, useState } from "react";
import axios from "axios";
import { RealPrivilege } from "@root/model/privilege";
import { resetPrivilegeArray } from "@root/stores/privilegesStore";
import { useGetPrivilegies } from "./useGetPrivileges.hook";
type RefreshPrivilegesStore = {
isError: boolean;
isLoading: boolean;
errorMessage: string;
};
export const useRefreshPrivilegesStore = (): RefreshPrivilegesStore => {
const gotten = useGetPrivilegies()
const [isLoading, setIsLoading] = useState(gotten.isLoading);
const [isError, setIsError] = useState(gotten.isError);
const [errorMessage, setErrorMessage] = useState(gotten.errorMessage);
//Приходит объект. В его значениях массивы привилегий для разных сервисов. Высыпаем в общую кучу и обновляем стор
useEffect(() => {
let extracted:RealPrivilege[] = []
for (let serviceKey in gotten.privilegies) {
extracted = extracted.concat(gotten.privilegies[serviceKey])
}
resetPrivilegeArray(extracted)
}, [gotten.privilegies]);
return {isError:gotten.isError, isLoading:gotten.isLoading, errorMessage:gotten.errorMessage};
};

@ -15,17 +15,20 @@ import {
FormControlLabel,
} from "@mui/material";
import Input from "@kitUI/input";
import { useCartStore } from "@root/stores/cart";
import { useEffect, useState } from "react";
import { GridSelectionModel } from "@mui/x-data-grid";
import { testUser } from "@root/stores/mocks/user";
import { useMockDiscountStore } from "@root/stores/discounts";
import { calcCartData, createCartItem, findDiscountFactor, formatDiscountFactor } from "./calc";
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 { useMockDiscountStore } from "@root/stores/discounts";
import { useCartStore } from "@root/stores/cart";
import { findPrivilegeById } from "@root/stores/privilegesStore";
import { testUser } from "@root/stores/mocks/user";
import { useTariffStore } from "@root/stores/tariffs";
interface Props {
selectedTariffs: GridSelectionModel;
}

@ -11,7 +11,7 @@ import {
UserDiscount,
} from "@root/model/cart";
import { User } from "../../model/user";
import { findPrivilegeById } from "@root/stores/privileges";
import { findPrivilegeById } from "@root/stores/privilegesStore";
import { SERVICE_LIST, ServiceType, Tariff } from "@root/model/tariff";
export function calcCartData({

@ -1,21 +1,46 @@
export const SERVICE_LIST = [
{
serviceKey: "templategen",
displayName: "Шаблонизатор документов",
},
{
serviceKey: "squiz",
displayName: "Опросник",
},
{
serviceKey: "dwarfener",
displayName: "Аналитика сокращателя",
},
] as const;
export interface RealPrivilege {
_id: string;
name: string;
privilegeId: string;
serviceKey: string;
createdAt: string;
description: string;
type: "day" | "count";
value: PrivilegeValueType;
isDeleted: boolean;
name: string;
price: number;
updatedAt?: string;
isDeleted?: boolean;
createdAt?: string;
privilegeId: string;
serviceKey: ServiceType;
type: "count" | "day" | "mb";
updatedAt: string;
value: string;
_id: string;
};
export type PrivilegeMap = Record<string, RealPrivilege[]>;
export interface mergedBackFrontPrivilege {
serviceKey: ServiceType;
privilegeId: string;
name: string;
description: string;
type: string;
price: number;
isDeleted?: boolean
}
export type ServiceType = (typeof SERVICE_LIST)[number]["serviceKey"];
// export type PrivilegeMap = Record<string, RealPrivilege[]>;
export type PrivilegeValueType = "шаблон" | "день" | "МБ";
// export type PrivilegeValueType = "шаблон" | "день" | "МБ";
export type PrivilegeWithAmount = Omit<RealPrivilege, "_id"> & { amount: number; };
// export type PrivilegeWithAmount = Omit<RealPrivilege, "_id"> & { amount: number; };
export type PrivilegeWithoutPrice = Omit<PrivilegeWithAmount, "price">;
// export type PrivilegeWithoutPrice = Omit<PrivilegeWithAmount, "price">;

@ -1,30 +0,0 @@
import { Typography } from "@mui/material";
import { СardPrivilegie } from "./CardPrivilegie";
import { mergedPrivilegeStore } from "@root/stores/mergedPrivileges";
export default function ListPrivilegie() {
const { mergedPrivileges, isError, errorMessage } = mergedPrivilegeStore();
console.log(mergedPrivileges);
return (
<>
{isError ? (
<Typography>{errorMessage}</Typography>
) : (
mergedPrivileges.map(({ name, type, price, description, value, privilegeId, serviceKey, _id }) => (
<СardPrivilegie
key={_id}
name={name}
type={type}
price={price}
value={value}
privilegeId={privilegeId}
serviceKey={serviceKey}
description={description}
/>
))
)}
</>
);
}

@ -2,7 +2,7 @@ import { useState } from "react";
import { Box, SxProps, Theme, Typography, useMediaQuery, useTheme } from "@mui/material";
import ListPrivilegie from "./ListPrivilegie";
// import ListPrivilegie from "./ListPrivilegie";
interface CustomWrapperProps {
text: string;
@ -121,7 +121,7 @@ export const PrivilegiesWrapper = ({ text, sx, result }: CustomWrapperProps) =>
)}
</Box>
</Box>
{isExpanded && <ListPrivilegie />}
{/* {isExpanded && <ListPrivilegie />} */}
</Box>
</Box>
);

@ -4,6 +4,7 @@ import Select, { SelectChangeEvent } from "@mui/material/Select";
import { useState } from "react";
import { SERVICE_LIST, ServiceType } from "@root/model/tariff";
import { CustomTextField } from "@root/kitUI/CustomTextField";
import { resetPrivilegeArray, usePrivilegeStore } from "@root/stores/privilegesStore";
import { setRealPrivileges, useRealPrivilegeStore } from "@root/stores/privileges";
import { addDiscount } from "@root/stores/discounts";
import { enqueueSnackbar } from "notistack";
@ -14,7 +15,7 @@ import usePrivileges from "@root/utils/hooks/usePrivileges";
export default function CreateDiscount() {
const theme = useTheme();
const privileges = useRealPrivilegeStore(state => state.privileges);
const privileges = usePrivilegeStore(state => state.privileges);
const [serviceType, setServiceType] = useState<ServiceType>("templategen");
const [discountType, setDiscountType] = useState<DiscountType>("purchasesAmount");
const [discountNameField, setDiscountNameField] = useState<string>("");

@ -8,7 +8,7 @@ import { CustomTextField } from "@root/kitUI/CustomTextField";
import { addTariffs } from "@root/stores/tariffs";
import { authStore } from "@root/stores/auth";
import { mergedPrivilegeStore } from "@root/stores/mergedPrivileges";
// import { mergedPrivilegeStore } from "@root/stores/mergedPrivileges";
import { Tariff_BACKEND } from "@root/model/tariff";
export default function CreateTariff() {
@ -17,16 +17,14 @@ export default function CreateTariff() {
const [amountField, setAmountField] = useState<string>("");
const [customPriceField, setCustomPriceField] = useState<string>("");
const [privilegeIdField, setPrivilegeIdField] = useState<string>("");
const { mergedPrivileges, isError, errorMessage } = mergedPrivilegeStore();
const { token } = authStore();
const findPrivilegeById = (privilegeId: string) => {
return mergedPrivileges.find((privilege) => privilege.privilegeId === privilegeId) ?? null;
// return mergedPrivileges.find((privilege) => privilege.privilegeId === privilegeId) ?? null;
};
const privilege = findPrivilegeById(privilegeIdField);
console.log(mergedPrivileges);
// function handleCreateTariffClick() {
// if (nameField === "") {
@ -136,10 +134,7 @@ export default function CreateTariff() {
>
Привилегия
</InputLabel>
{isError ? (
<Typography>{errorMessage}</Typography>
) : (
<Select
<Select
labelId="privilege-select-label"
id="privilege-select"
value={privilegeIdField}
@ -158,15 +153,15 @@ export default function CreateTariff() {
}}
inputProps={{ sx: { pt: "12px" } }}
>
{mergedPrivileges.map((privilege) => (
{/* {mergedPrivileges.map((privilege) => (
<MenuItem key={privilege.description} value={privilege.privilegeId}>
{privilege.description}
</MenuItem>
))}
))} */}
</Select>
)}
</FormControl>
{privilege && (
{/* {privilege && (
<Box
sx={{
display: "flex",
@ -186,7 +181,7 @@ export default function CreateTariff() {
Стандартная цена за единицу: <span>{privilege.price}</span>
</Typography>
</Box>
)}
)} */}
<CustomTextField
id="tariff-name"
label="Название тарифа"

@ -8,8 +8,7 @@ import TextField from "@mui/material/TextField";
import axios from "axios";
import { authStore } from "@root/stores/auth";
import { Privilege, Tariff_FRONTEND } from "@root/model/tariff";
import { findPrivilegeById } from "@root/stores/privileges";
import { mergedPrivilegeStore } from "@root/stores/mergedPrivileges";
import { findPrivilegeById } from "@root/stores/privilegesStore";
import { useTariffStore, updateTariff } from "@root/stores/tariffs";
import { arrayBuffer } from "stream/consumers";
@ -56,7 +55,6 @@ export default function EditModal({tariff, getTariffs}:Props) {
const [name, setName] = useState("");
const [price, setPrice] = useState("");
const { token } = authStore();
const mergedPrivileges = mergedPrivilegeStore((state:any) => state.mergedPrivileges);
const tariffs = useTariffStore((state) => state.tariffs);
useEffect(() => {

@ -1,43 +1,44 @@
import { Box, Button, Dialog, useTheme } from "@mui/material";
import { CustomTextField } from "@root/kitUI/CustomTextField";
import {
changeModalPriceField,
changePrivilegePrice,
closePrivilegePriceModal,
usePrivilegeStore,
} from "@root/stores/privileges";
// import {
// changeModalPriceField,
// changePrivilegePrice,
// closePrivilegePriceModal,
// usePrivilegeStore,
// } from "@root/stores/privileges";
import { enqueueSnackbar } from "notistack";
export default function ChangePriceModal() {
const theme = useTheme();
const isModalOpen = usePrivilegeStore((state) => state.isModalOpen);
const modalPriceField = usePrivilegeStore((state) => state.modalPriceField);
// const isModalOpen = usePrivilegeStore((state) => state.isModalOpen);
// const modalPriceField = usePrivilegeStore((state) => state.modalPriceField);
function handleSaveChange() {
const errorMessage = changePrivilegePrice();
if (errorMessage) enqueueSnackbar(errorMessage);
// const errorMessage = changePrivilegePrice();
// if (errorMessage) enqueueSnackbar(errorMessage);
}
return (
<Dialog open={isModalOpen} onClose={closePrivilegePriceModal}>
<Box
sx={{
p: "20px",
backgroundColor: theme.palette.grayLight.main,
display: "flex",
flexDirection: "column",
gap: "8px",
}}
>
<CustomTextField
id="privilege-custom-price"
label="Цена"
value={modalPriceField}
onChange={(e) => changeModalPriceField(e.target.value)}
type="number"
/>
<Button onClick={handleSaveChange}>Сохранить</Button>
</Box>
</Dialog>
<></>
// <Dialog open={isModalOpen} onClose={closePrivilegePriceModal}>
// <Box
// sx={{
// p: "20px",
// backgroundColor: theme.palette.grayLight.main,
// display: "flex",
// flexDirection: "column",
// gap: "8px",
// }}
// >
// <CustomTextField
// id="privilege-custom-price"
// label="Цена"
// value={modalPriceField}
// onChange={(e) => changeModalPriceField(e.target.value)}
// type="number"
// />
// <Button onClick={handleSaveChange}>Сохранить</Button>
// </Box>
// </Dialog>
);
}

@ -2,7 +2,6 @@ import { GridColDef } from "@mui/x-data-grid";
import DataGrid from "@kitUI/datagrid";
import { Typography } from "@mui/material";
import { useCombinedPrivileges } from "@root/hooks/useCombinedPrivileges.hook";
import { addMergedPrivileges } from "@root/stores/mergedPrivileges";
const columns: GridColDef[] = [
{ field: "id", headerName: "id", width: 40 },
@ -13,8 +12,12 @@ const columns: GridColDef[] = [
];
export default function Privileges() {
const { mergedPrivileges, isError, errorMessage } = useCombinedPrivileges();
const privilegesGridData = mergedPrivileges.map((privilege) => ({
const { mergedPrivileges } = useCombinedPrivileges();
const privilegesGridData = mergedPrivileges
.filter(privilege => (
!privilege.isDeleted
))
.map((privilege) => ({
id: privilege.privilegeId,
name: privilege.name,
description: privilege.description,
@ -22,19 +25,10 @@ export default function Privileges() {
price: privilege.price,
}));
addMergedPrivileges(mergedPrivileges, isError, errorMessage);
return (
<>
{isError ? (
<Typography>{errorMessage}</Typography>
) : (
<DataGrid
// checkboxSelection={true}
rows={privilegesGridData}
columns={columns}
/>
)}
</>
<DataGrid
rows={privilegesGridData}
columns={columns}
/>
);
}

@ -4,22 +4,36 @@ import { GridSelectionModel } from "@mui/x-data-grid";
import Cart from "@root/kitUI/Cart/Cart";
import Privileges from "./Privileges/Privileges";
import axios from "axios";
import { enqueueSnackbar } from "notistack";
import { authStore } from "@root/stores/auth";
import { Tariff_BACKEND } from "@root/model/tariff";
import { updateTariff, useTariffStore } from "@root/stores/tariffs";
import { usePrivilegeStore } from "@root/stores/privilegesStore";
import TariffsDG from "./tariffsDG";
import CreateTariff from "./CreateTariff";
import Privileges from "./Privileges/Privileges";
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";
import {useRefreshPrivilegesStore} from "@root/hooks/useRefreshPrivilegesStore.hook"
export default function Tariffs() {
const token = authStore((state) => state.token);
// const tariffs = useTariffStore((state) => state.tariffs);
const privileges = usePrivilegeStore((state) => state.privileges);
const tariffs = useTariffStore((state) => state.tariffs);
const [selectedTariffs, setSelectedTariffs] = useState<GridSelectionModel>([]);
const getTariffs = () => {
useRefreshPrivilegesStore()
const getTariffs = (page: number = 1) => {
axios({
method: "get",
url: "https://admin.pena.digital/strator/tariff",
params: { page, limit: 100 },
headers: {
Authorization: `Bearer ${token}`,
},
})
.then((data: any) => {
//Получили список тарифов. Сразу убираем удалённые и записываем остальное в стор
@ -34,10 +48,14 @@ export default function Tariffs() {
customPricePerUnit: tariff.price,
};
console.log(data.data.tariffs)
console.log("reade")
updateTariff(toFrontTariff);
}
});
if (page < data.totalPages) {
return getTariffs(page + 1);
}
// data.data.tariffs.forEach(async (t:any) => {
// if (t._id) {
// console.log(t._id)
@ -54,11 +72,13 @@ export default function Tariffs() {
// })
})
.catch((error) => {
console.log(error)
enqueueSnackbar("Ошибка получения тарифов");
});
};
useEffect(() => {
getTariffs();
}, []);
return (
@ -71,6 +91,11 @@ export default function Tariffs() {
alignItems: "center",
}}
>
<button onClick={() => console.log(privileges)}>provileges</button>
<button onClick={() => console.log(tariffs)}>tariffs</button>
<Typography variant="h6">Список привилегий</Typography>
<Privileges />

@ -11,7 +11,7 @@ import DataGrid from "@kitUI/datagrid";
import { deleteTariffs, useTariffStore } from "@root/stores/tariffs";
import { SERVICE_LIST } from "@root/model/tariff";
import { findPrivilegeById } from "@root/stores/privileges";
import { findPrivilegeById } from "@root/stores/privilegesStore";
import axios from "axios";
import { authStore } from "@root/stores/auth";

@ -1,43 +0,0 @@
import { create } from "zustand";
import { persist } from "zustand/middleware";
type mergedPrivilege = {
createdAt?: string;
description: string;
isDeleted?: boolean;
name: string;
price: number;
privilegeId: string;
serviceKey: string;
type: "count" | "day" | "mb";
updatedAt?: string;
value?: string;
_id?: string;
};
type MergedPrivilegeType = {
mergedPrivileges: mergedPrivilege[];
isError: boolean;
errorMessage: string;
};
export const mergedPrivilegeStore = create<MergedPrivilegeType>()(
persist(
(set, get) => ({
mergedPrivileges: [],
isError: false,
errorMessage: "",
}),
{
name: "MergedPrivileg store",
}
)
);
export const addMergedPrivileges = (newPrivileges: mergedPrivilege[], isError: boolean, errorMessage: string) => {
mergedPrivilegeStore.setState((state) => ({
mergedPrivileges: [...newPrivileges],
isError: isError,
errorMessage: errorMessage,
}));
};

@ -0,0 +1,94 @@
import { Privilege } from "@root/model/tariff";
import { create } from "zustand";
import { devtools } from "zustand/middleware";
import { exampleCartValues } from "./mocks/exampleCartValues";
import { RealPrivilege } from "@root/model/privilege";
interface RealPrivilegeStore {
privileges: RealPrivilege[];
}
export const usePrivilegeStore = create<RealPrivilegeStore>()(
devtools(
(set, get) => ({
privileges: [],
}),
{
name: "Privilege store",
}
)
);
export const resetPrivilegeArray = (privileges: RealPrivilegeStore["privileges"]) => usePrivilegeStore.setState({ privileges });
/** @deprecated */
// interface PrivilegeStore {
// privileges: Privilege[];
// isModalOpen: boolean;
// modalPrivilegeId: string | null;
// modalPriceField: string;
// addPrivileges: (newPrivileges: Privilege[]) => void;
// }
/** @deprecated */
// export const usePrivilegeStore = create<PrivilegeStore>()(
// devtools(
// (set, get) => ({
// privileges: exampleCartValues.privileges,
// isModalOpen: false,
// modalPrivilegeId: null,
// modalPriceField: "",
// addPrivileges: (newPrivileges) => set((state) => ({ privileges: [...state.privileges, ...newPrivileges] })),
// }),
// {
// name: "Mock Privilege store",
// }
// )
// );
// /** @deprecated */
// export const closePrivilegePriceModal = () => usePrivilegeStore.setState({ isModalOpen: false });
// /** @deprecated */
// export const openPrivilegePriceModal = (modalPrivilegeId: string | null, defaultPrice: number) =>
// usePrivilegeStore.setState({
// isModalOpen: true,
// modalPriceField: defaultPrice.toString(),
// modalPrivilegeId,
// });
// /** @deprecated */
// export const changeModalPriceField = (modalPriceField: string) => usePrivilegeStore.setState({ modalPriceField });
// /** @deprecated */
// export const changePrivilegePrice = () => {
// const { privileges, modalPrivilegeId, modalPriceField } = usePrivilegeStore.getState();
// const privilegeIndex = privileges.findIndex((privilege) => privilege.privilegeId === modalPrivilegeId);
// if (privilegeIndex === -1) throw new Error("Privilege not found by id");
// const price = parseFloat(modalPriceField.replace(",", "."));
// if (!isFinite(price)) return "Error parsing price";
// const newPrivilege: Privilege = {
// ...privileges[privilegeIndex],
// price: price,
// };
// const newPrivileges = [...privileges];
// newPrivileges.splice(privilegeIndex, 1, newPrivilege);
// usePrivilegeStore.setState({
// privileges: newPrivileges,
// isModalOpen: false,
// });
// };
/** @deprecated */
export const findPrivilegeById = (privilegeId: string) => {
return usePrivilegeStore.getState().privileges.find((privilege) => privilege.privilegeId === privilegeId) ?? null;
};

@ -36,6 +36,7 @@ export const updateTariff = (tariff: Tariff_FRONTEND) => {
}
}
export const addTariffs = (newTariffs: Tariff_FRONTEND[]) => {
let stateTariffs = useTariffStore.getState().tariffs
let newArrayTariffs = [...stateTariffs, ...newTariffs]