import { Button, FormControlLabel, MenuItem, Radio, RadioGroup, Select, TextField, Typography, } from "@mui/material"; import { DesktopDatePicker } from "@mui/x-date-pickers/DesktopDatePicker"; import { Field, Form, Formik } from "formik"; import moment from "moment"; import { useEffect, useState } from "react"; import { requestPrivileges } from "@root/services/privilegies.service"; import { usePrivilegeStore } from "@root/stores/privilegesStore"; import { SERVICE_LIST } from "@root/model/privilege"; import theme from "@root/theme"; import type { TextFieldProps } from "@mui/material"; import { createPromocode } from "@root/api/promocode/swr"; import type { ChangeEvent } from "react"; type BonusType = "discount" | "privilege"; type FormValues = { codeword: string; description: string; greetings: string; dueTo: number; activationCount: number; privilegeId: string; amount: number; layer: 1 | 2; factor: number; target: string; threshold: number; }; const initialValues: FormValues = { codeword: "", description: "", greetings: "", dueTo: 0, activationCount: 0, privilegeId: "", amount: 0, layer: 1, factor: 0, target: "", threshold: 0, }; export const CreatePromocodeForm = () => { const [bonusType, setBonusType] = useState("discount"); const { privileges } = usePrivilegeStore(); useEffect(() => { requestPrivileges(); }, []); const submitForm = (values: FormValues) => { const body = { ...values, threshold: values.layer === 1 ? values.threshold : values.threshold * 100, }; const factorFromDiscountValue = 1 - body.factor / 100; return createPromocode({ codeword: body.codeword, description: body.description, greetings: body.greetings, dueTo: body.dueTo, activationCount: body.activationCount, bonus: { privilege: { privilegeID: body.privilegeId, amount: body.amount }, discount: { layer: body.layer, factor: factorFromDiscountValue, target: body.target, threshold: body.threshold, }, }, }); }; return ( {({ values, handleChange, handleBlur, setFieldValue }) => (
Время существования промокода { if (date) { setFieldValue("dueTo", moment(date).unix() || null); } }} renderInput={(params: TextFieldProps) => } InputProps={{ sx: { height: "40px", color: theme.palette.secondary.main, border: "1px solid", borderColor: theme.palette.secondary.main, "& .MuiSvgIcon-root": { color: theme.palette.secondary.main }, }, }} /> setFieldValue( "activationCount", Number(target.value.replace(/\D/g, "")) ) } /> ) => { setBonusType(target.value as BonusType); }} onBlur={handleBlur} > } label="Скидка" /> } label="Привилегия" /> {bonusType === "discount" && ( <> ) => { setFieldValue("target", ""); setFieldValue("layer", Number(target.value)); }} onBlur={handleBlur} > } label="Привилегия" /> } label="Сервис" /> { setFieldValue( "factor", Number(target.value.replace(/\D/g, "")) ); }} /> {values.layer === 1 ? "Выбор привилегии" : "Выбор сервиса"} ( {name} )) : SERVICE_LIST.map(({ displayName, serviceKey }) => ( {displayName} )) } /> setFieldValue( "threshold", Number(target.value.replace(/\D/g, "")) ) } /> )} {bonusType === "privilege" && ( <> Выбор привилегии ( {name} ))} /> setFieldValue( "amount", Number(target.value.replace(/\D/g, "")) ) } /> )} )}
); }; type CustomTextFieldProps = { name: string; label: string; required?: boolean; onChange: (event: ChangeEvent) => void; }; const CustomTextField = ({ name, label, required = false, onChange, }: CustomTextFieldProps) => ( );