feat: CreatePromocodeForm logic

This commit is contained in:
IlyaDoronin 2024-02-23 17:10:57 +03:00
parent bd6dfc182e
commit 430a6c2436

@ -1,4 +1,6 @@
import { useEffect, useState } from "react";
import moment from "moment";
import { Formik, Field, Form } from "formik";
import {
Typography,
TextField,
@ -7,43 +9,46 @@ import {
Radio,
FormControlLabel,
Select,
MenuItem,
} from "@mui/material";
import { Formik, Field, Form } from "formik";
import { DesktopDatePicker } from "@mui/x-date-pickers/DesktopDatePicker";
import MenuItem from "@mui/material/MenuItem";
import theme from "../../../../theme";
import { requestPrivileges } from "@root/services/privilegies.service";
import { usePrivilegeStore } from "@root/stores/privilegesStore";
import { useCartStore } from "@root/stores/cart";
import { SERVICE_LIST } from "@root/model/privilege";
import theme from "@root/theme";
import type { ChangeEvent } from "react";
import type { TextFieldProps } from "@mui/material";
type BonusType = "discount" | "privilege";
type LayerType = "privilege" | "service";
type FormValues = {
codeword: string;
description: string;
greetings: string;
dueTo: string;
activationCount: string;
dueTo: number;
activationCount: number;
privilegeId: string;
amount: string;
layer: string;
factor: string;
amount: number;
layer: 1 | 2;
factor: number;
target: string;
threshold: string;
threshold: number;
};
type CustomTextFieldProps = {
name: string;
label: string;
required?: boolean;
onChange: (event: ChangeEvent<HTMLInputElement>) => void;
};
const CustomTextField = ({
name,
label,
required = false,
onChange,
}: CustomTextFieldProps) => (
<Field
name={name}
@ -52,6 +57,7 @@ const CustomTextField = ({
variant="filled"
color="secondary"
as={TextField}
onChange={onChange}
sx={{ width: "100%", marginTop: "15px" }}
InputProps={{
style: {
@ -65,51 +71,64 @@ const CustomTextField = ({
/>
);
const initialValues: FormValues = {
codeword: "",
description: "",
greetings: "",
dueTo: 0,
activationCount: 0,
privilegeId: "",
amount: 0,
layer: 1,
factor: 0,
target: "",
threshold: 0,
};
export const CreatePromocodeForm = () => {
const [dueTo, setDueTo] = useState<Date | null>(new Date());
const [bonusType, setBonusType] = useState<BonusType>("discount");
const [layerType, setLayerType] = useState<LayerType>("privilege");
const { privileges } = usePrivilegeStore();
const { cartData } = useCartStore();
const initialValues: FormValues = {
codeword: "",
description: "",
greetings: "",
dueTo: "",
activationCount: "",
privilegeId: "",
amount: "",
layer: "",
factor: "",
target: "",
threshold: "",
};
useEffect(() => {
requestPrivileges();
}, []);
const createPromocode = (values: FormValues) => {
console.log(values);
const body = {
...values,
threshold: values.layer === 1 ? values.threshold : values.threshold * 100,
};
console.log(body);
};
return (
<Formik initialValues={initialValues} onSubmit={createPromocode}>
{(props) => (
{({ values, handleChange, handleBlur, setFieldValue }) => (
<Form
style={{
width: "100%",
maxWidth: "600px",
padding: "0 10px",
}}
>
<CustomTextField name="codeword" label="Кодовое слово" required />
<CustomTextField name="description" label="Описание" required />
<CustomTextField
name="codeword"
label="Кодовое слово"
required
onChange={handleChange}
/>
<CustomTextField
name="description"
label="Описание"
required
onChange={handleChange}
/>
<CustomTextField
name="greetings"
label="Приветственное сообщение"
required
onChange={handleChange}
/>
<Typography
variant="h4"
@ -126,10 +145,10 @@ export const CreatePromocodeForm = () => {
name="dueTo"
as={DesktopDatePicker}
inputFormat="DD/MM/YYYY"
value={dueTo}
value={values.dueTo ? new Date(Number(values.dueTo) * 1000) : null}
onChange={(date: Date | null) => {
if (date) {
setDueTo(date);
setFieldValue("dueTo", moment(date).unix() || null);
}
}}
renderInput={(params: TextFieldProps) => <TextField {...params} />}
@ -146,6 +165,12 @@ export const CreatePromocodeForm = () => {
<CustomTextField
name="activationCount"
label="Количество активаций промокода"
onChange={({ target }) =>
setFieldValue(
"activationCount",
Number(target.value.replace(/\D/g, ""))
)
}
/>
<RadioGroup
row
@ -155,7 +180,7 @@ export const CreatePromocodeForm = () => {
onChange={({ target }: React.ChangeEvent<HTMLInputElement>) => {
setBonusType(target.value as BonusType);
}}
onBlur={props.handleBlur}
onBlur={handleBlur}
>
<FormControlLabel
value="discount"
@ -173,25 +198,36 @@ export const CreatePromocodeForm = () => {
<RadioGroup
row
name="layer"
value={layerType}
value={values.layer}
sx={{ marginTop: "15px" }}
onChange={({ target }: React.ChangeEvent<HTMLInputElement>) => {
setLayerType(target.value as LayerType);
setFieldValue("target", "");
setFieldValue("layer", Number(target.value));
}}
onBlur={props.handleBlur}
onBlur={handleBlur}
>
<FormControlLabel
value="privilege"
value="1"
control={<Radio color="secondary" />}
label="Привилегия"
/>
<FormControlLabel
value="service"
value="2"
control={<Radio color="secondary" />}
label="Сервис"
/>
</RadioGroup>
<CustomTextField name="factor" label="Процент скидки" required />
<CustomTextField
name="factor"
label="Процент скидки"
required
onChange={({ target }) =>
setFieldValue(
"factor",
Number(target.value.replace(/\D/g, ""))
)
}
/>
<Typography
variant="h4"
sx={{
@ -202,14 +238,12 @@ export const CreatePromocodeForm = () => {
color: theme.palette.secondary.main,
}}
>
{layerType === "privilege"
? "Выбор привилегии"
: "Выбор сервиса"}
{values.layer === 1 ? "Выбор привилегии" : "Выбор сервиса"}
</Typography>
<Field
name="target"
as={Select}
label={layerType === "privilege" ? "Привилегия" : "Сервис"}
label={values.layer === 1 ? "Привилегия" : "Сервис"}
sx={{
width: "100%",
border: "2px solid",
@ -221,15 +255,15 @@ export const CreatePromocodeForm = () => {
".MuiSvgIcon-root ": { fill: theme.palette.secondary.main },
}}
children={
layerType === "privilege"
values.layer === 1
? privileges.map(({ name, privilegeId }) => (
<MenuItem key={privilegeId} value={privilegeId}>
{name}
</MenuItem>
))
: cartData?.services.map(({ serviceKey }) => (
: SERVICE_LIST.map(({ displayName, serviceKey }) => (
<MenuItem key={serviceKey} value={serviceKey}>
{serviceKey}
{displayName}
</MenuItem>
))
}
@ -237,7 +271,12 @@ export const CreatePromocodeForm = () => {
<CustomTextField
name="threshold"
label="При каком значении применяется скидка"
required
onChange={({ target }) =>
setFieldValue(
"threshold",
Number(target.value.replace(/\D/g, ""))
)
}
/>
</>
)}
@ -275,7 +314,17 @@ export const CreatePromocodeForm = () => {
</MenuItem>
))}
/>
<CustomTextField name="amount" label="Количество" required />
<CustomTextField
name="amount"
label="Количество"
required
onChange={({ target }) =>
setFieldValue(
"amount",
Number(target.value.replace(/\D/g, ""))
)
}
/>
</>
)}
<Button