Ex1easy

GeneralInformation.tsx

Nov 18th, 2024
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. "use client";
  2. import { useEffect, useState } from "react";
  3. import { FieldValue, SubmitHandler, useForm } from "react-hook-form";
  4.  
  5. // LOCAL STORAGE
  6. import { getStoredData, setStoredData } from "@utilities/localStorage";
  7. import { StorageKeys } from "@config/local-storage/localStorageKeys";
  8.  
  9. // INTERFACES
  10. import { IDataForm } from "@/app/interfaces/Interfaces";
  11.  
  12. // COMPONENTS
  13. import RcSlider from "@/shared/slider/RcSlider";
  14.  
  15. // INPUTS
  16. import FormInputText from "@components/form-inputs/form-input-text";
  17. import FormInputDate from "@components/form-inputs/form-input-date";
  18. import FormInputNumberFormat from "@components/form-inputs/form-input-number-format";
  19. import FormInputEmail from "@components/form-inputs/form-input-email";
  20. import Button from "@/shared/ui/button/Button";
  21. import InputCheckbox from "@/shared/ui/input-checkbox/InputCheckbox";
  22.  
  23. // HELPERS
  24. import { RegForInitials } from "@helpers/reg-set";
  25. import { RepWordUp } from "@helpers/rep-word-up";
  26.  
  27. // STYLES
  28. import style from "./GeneralInformation.module.scss";
  29.  
  30. export default function GeneralInformation({
  31.   nextStep,
  32. }: {
  33.   nextStep: () => void;
  34. }): JSX.Element {
  35.   const {
  36.     control,
  37.     handleSubmit,
  38.     formState: { errors },
  39.   } = useForm({ mode: "all" });
  40.  
  41.   // NOTE: Объект с данными формы
  42.   const [dataForm, setDataForm] = useState<IDataForm>({
  43.     lastName: "",
  44.     firstName: "",
  45.     middleName: "",
  46.     dateOfBirth: "",
  47.     numberPhone: "",
  48.     email: "",
  49.     amount: 1000,
  50.     term: 5,
  51.     checkbox: false,
  52.   });
  53.  
  54.   // NOTE: Обновление данных формы из LocalStorage
  55.   useEffect(() => {
  56.     const storedData = getStoredData<IDataForm>(StorageKeys.GENERAL_INFO);
  57.     if (storedData) {
  58.       setDataForm(storedData);
  59.     }
  60.   }, []);
  61.  
  62.   // NOTE: Обновление данных формы
  63.   const updateDataForm = (newData: Partial<IDataForm>) => {
  64.     const updatedData = { ...dataForm, ...newData };
  65.     setDataForm(updatedData);
  66.     setStoredData(StorageKeys.GENERAL_INFO, updatedData);
  67.   };
  68.  
  69.   const submit: SubmitHandler<FieldValue<any>> = async (data) => {
  70.     const dataToSend = {
  71.       phone_number: data.numberPhone,
  72.       type: "reg",
  73.     };
  74.  
  75.     // NOTE: Отправка данных на сервер и получение SMS кода
  76.     try {
  77.       const response = await fetch("http://localhost:8082/api/u/send-sms", {
  78.         method: "POST",
  79.         headers: {
  80.           "Content-Type": "application/json",
  81.         },
  82.         body: JSON.stringify(dataToSend),
  83.       });
  84.  
  85.       if (response.ok) {
  86.         const responseData = await response.json();
  87.         console.log("Данные отправлены успешно!", responseData.message);
  88.         nextStep();
  89.       }
  90.     } catch (error) {
  91.       nextStep();
  92.       console.error("Ошибка отправки данных:", error);
  93.     }
  94.   };
  95.  
  96.   return (
  97.     <div className={style["general-info"]}>
  98.       {/* asd */}
  99.       <section className={style["general-info__data"]}>
  100.         <h2 className={style["data__title"]}>Общая информация</h2>
  101.         <form className={style["data__form"]} onSubmit={handleSubmit(submit)}>
  102.           <section className={style["general-info__sliders"]}>
  103.             <h2
  104.               className={`${style["sliders__title"]} max-[900px]:text-center`}
  105.             >
  106.               Какая сумма вам нужна?
  107.             </h2>
  108.             <div className={`${style["sliders__grid"]} flex flex-row`}>
  109.               <div className={style["sliders__grid__item"]}>
  110.                 <RcSlider
  111.                   controller={{
  112.                     control: control,
  113.                     type: "amount",
  114.                   }}
  115.                   min={1000}
  116.                   max={100000}
  117.                   step={1000}
  118.                   value={dataForm.amount || 1000}
  119.                   description={{
  120.                     left: "1000 ₽",
  121.                     right: "100 000 ₽",
  122.                   }}
  123.                   onChange={(val: number) => updateDataForm({ amount: val })}
  124.                   styles={{
  125.                     colorSlider: "#6588ff",
  126.                     colorThumb: "#6588ff",
  127.                     colorThumbOpacity: "#6588FF2E",
  128.                   }}
  129.                 />
  130.                 <p className={style["sliders__grid__item__value"]}>
  131.                   Сумма: {dataForm.amount?.toLocaleString("ru-RU") || "0"}
  132.                 </p>
  133.               </div>
  134.               <div className={style["sliders__grid__item"]}>
  135.                 <RcSlider
  136.                   controller={{
  137.                     control: control,
  138.                     type: "term",
  139.                   }}
  140.                   min={5}
  141.                   max={30}
  142.                   step={1}
  143.                   value={dataForm.term || 5}
  144.                   description={{
  145.                     left: "5 дней",
  146.                     right: "30 дней",
  147.                   }}
  148.                   onChange={(val) => updateDataForm({ term: val })}
  149.                   styles={{
  150.                     colorSlider: "#6588ff",
  151.                     colorThumb: "#6588ff",
  152.                     colorThumbOpacity: "#6588FF2E",
  153.                   }}
  154.                 />
  155.                 <p className={style["sliders__grid__item__value"]}>
  156.                   Срок: {dataForm.term || 0} дней
  157.                 </p>
  158.               </div>
  159.             </div>
  160.           </section>
  161.           <div className={style["data__form__fields"]}>
  162.             <FormInputText
  163.               control={control}
  164.               value={dataForm.lastName}
  165.               type="lastName"
  166.               placeholder="Фамилия"
  167.               minLength={2}
  168.               maxLength={30}
  169.               pattern={RegForInitials}
  170.               patternValid={/^[^A-Za-z]+$/gi}
  171.               onChange={(event) =>
  172.                 updateDataForm({
  173.                   lastName: RepWordUp(event.replace(RegForInitials, "")),
  174.                 })
  175.               }
  176.               error={errors}
  177.             />
  178.             <FormInputText
  179.               control={control}
  180.               value={dataForm.firstName}
  181.               type="firstName"
  182.               placeholder="Имя"
  183.               minLength={2}
  184.               maxLength={30}
  185.               pattern={RegForInitials}
  186.               patternValid={/^[^A-Za-z]+$/gi}
  187.               onChange={(event) =>
  188.                 updateDataForm({
  189.                   firstName: RepWordUp(event.replace(RegForInitials, "")),
  190.                 })
  191.               }
  192.               error={errors}
  193.             />
  194.             <FormInputText
  195.               control={control}
  196.               value={dataForm.middleName}
  197.               type="middleName"
  198.               placeholder="Отчество"
  199.               minLength={2}
  200.               maxLength={30}
  201.               pattern={RegForInitials}
  202.               patternValid={/^[^A-Za-z]+$/gi}
  203.               onChange={(event) =>
  204.                 updateDataForm({
  205.                   middleName: RepWordUp(event.replace(RegForInitials, "")),
  206.                 })
  207.               }
  208.               error={errors}
  209.             />
  210.             <FormInputDate
  211.               control={control}
  212.               value={dataForm.dateOfBirth}
  213.               type="numberDate"
  214.               placeholder="Дата рождения"
  215.               format="##/##/####"
  216.               onChange={(event) => updateDataForm({ dateOfBirth: event })}
  217.               error={errors}
  218.             />
  219.             <FormInputNumberFormat
  220.               control={control}
  221.               value={dataForm.numberPhone}
  222.               type="numberPhone"
  223.               placeholder="Мобильный телефон"
  224.               format="+7 (###) ###-##-##"
  225.               mask="_"
  226.               minLength={10}
  227.               error={errors}
  228.               errorMessage="*Заполните полностью номер телефона"
  229.               onChange={(val) => {
  230.                 updateDataForm({ numberPhone: val });
  231.               }}
  232.             />
  233.             <FormInputEmail
  234.               control={control}
  235.               value={dataForm.email}
  236.               type="email"
  237.               placeholder="Электронная почта"
  238.               onChange={(event) => updateDataForm({ email: event })}
  239.               error={errors}
  240.             />
  241.           </div>
  242.           <div className={style["data__form__resume"]}>
  243.             <div
  244.               className={`${style["data__form__resume__btn"]} flex justify-center`}
  245.             >
  246.               <Button
  247.                 customClassName={`${style["valid-code__approval__resume"]}`}
  248.                 variant="orange"
  249.                 type="submit"
  250.                 disabled={!dataForm.checkbox}
  251.                 text="Продолжить"
  252.               />
  253.               {!dataForm.checkbox && (
  254.                 <p
  255.                   className={`${style["data__form__resume--valid-checkbox"]} form-error-message`}
  256.                 >
  257.                   *Вы должны согласиться с политикой обработки
  258.                   <br />
  259.                   персональных данных
  260.                 </p>
  261.               )}
  262.             </div>
  263.             <div className={style["data__form__resume__checkbox"]}>
  264.               <InputCheckbox
  265.                 controller={{
  266.                   control: control,
  267.                   type: "checkbox",
  268.                 }}
  269.                 customClassName="custom-checkbox"
  270.                 type="checkbox"
  271.                 id="check-label"
  272.                 checked={dataForm.checkbox || false}
  273.                 onChange={(checked) => {
  274.                   updateDataForm({ checkbox: checked });
  275.                 }}
  276.               />
  277.               <p className={style["data__form__resume__checkbox__assent"]}>
  278.                 Я согласен с{" "}
  279.                 <span>Политикой обработки персональных данных</span>, а также
  280.                 предоставляю{" "}
  281.                 <span>Согласие на обработку персональных данных</span>.
  282.               </p>
  283.             </div>
  284.           </div>
  285.         </form>
  286.       </section>
  287.     </div>
  288.   );
  289. }
  290.  
Tags: nextjs
Advertisement
Add Comment
Please, Sign In to add comment