Загрузка данных


import { normalizeSipUriForPayload } from '@/domains/equipment/repositories/helpers/normalizeSipUriForPayload';
import { usePreservedSipUri } from '@/domains/equipment/repositories/helpers/usePreservedSipUri';
import { PadletModelItem } from '@/shared/api/controller/client';
import { useCloseDrawer } from '@/shared/hooks/drawer/useCloseDrawer';
import { useSelectDrawerType } from '@/shared/hooks/drawer/useSelectDrawerType';
import { Helpers } from '@/shared/lib';
import { DrawerTypes } from '@/shared/model/drawer/drawer.types';
import { useSelectControllerLocationId } from '@/shared/store/сontrollers/сontrollers.selectors';
import { useSyncControlPage } from '@/widgets/Monitoring/hooks';
import {
  Ieee8021X,
  ProtocolIp,
  Segment,
} from '@/widgets/Monitoring/model/padlet.model';
import { usePadletRepository } from '@/widgets/Monitoring/repositories/padlet.repository';
import { yupResolver } from '@hookform/resolvers/yup';
import { QueryStatus } from '@reduxjs/toolkit/dist/query';
import { useControllerActions } from '@shared/store/сontrollers/controllers.actions';
import { useEffect, useState } from 'react';
import { SubmitHandler, UseFormReturn, useForm } from 'react-hook-form';
import { useTranslation } from 'react-i18next';
import {
  PADLET_CREATE_FORM_KEY,
  PadletCreateFormData,
} from '../model/padletCreateCreateForm.model';
import { padletCreateSchema } from '../validation/padletCreate.schema';

type PadletCreate = {
  saveLabel: string;
  createLabel: string;
  methods: UseFormReturn<PadletCreateFormData, unknown, undefined>;
  onDrawerClose: () => void;
  submitHandler: SubmitHandler<PadletCreateFormData>;
  isSaveButtonDisabled: boolean;
  setModel: (model: PadletModelItem | null) => void;
};

export const usePadletCreateState = (): PadletCreate => {
  const { t } = useTranslation();

  const drawerType = useSelectDrawerType();
  const isVisible = drawerType[DrawerTypes.padletCreate];
  const closeDrawer = useCloseDrawer();
  const [model, setModel] = useState<PadletModelItem | null>(null);

  const { cleanControllerLocationId } = useControllerActions();

  const saveLabel = t('common:buttons.save');
  const createLabel = t('common:drawerTitle.PadletCreate');
  const locationId = useSelectControllerLocationId();

  const defaultValues: PadletCreateFormData = {
    locationId: '',
    name: '',
    ip: '',
    mac: '',
    subnetMask: '',
    gateway: '',
    port: 8080,
    timeZone: '+03:00',
    modelId: '',
    typeName: '',
    sipUri: '',
    hasSipUri: null,
    manufacturerName: '',
    segment: Segment.SIGMA,
    protocolIp: ProtocolIp.DHCP,
    ieee8021x: Ieee8021X.MAB,
    description: '',
    controlPage: '',
    telnetPort: '',
    firmware: '',
    serialNumber: '',
    inventoryNumber: '',
    sendNotifications: false,
    disableMonitoring: false,
  };

  const methods = useForm<PadletCreateFormData, unknown, undefined>({
    mode: 'onBlur',
    reValidateMode: 'onChange',
    resolver: yupResolver(padletCreateSchema),
    defaultValues,
  });

  const {
    preserveSipUri,
    getPreservedSipUri,
    resetPreservedSipUri,
  } = usePreservedSipUri();

  useEffect(() => {
    const currentHasSipUri = methods.getValues('hasSipUri');

    if (currentHasSipUri) {
      preserveSipUri(methods.getValues('sipUri'));
    }

    if (model) {
      const modelHasSipUri = model.type?.hasSipUri ?? false;

      methods.setValue('manufacturerName', model.manufacturer?.name || '');
      methods.setValue('typeName', model.type?.name || '');
      methods.setValue('hasSipUri', modelHasSipUri);

      if (modelHasSipUri) {
        methods.setValue('sipUri', getPreservedSipUri());
      }

      return;
    }

    methods.setValue('modelId', '');
    methods.resetField('manufacturerName');
    methods.resetField('typeName');
    methods.setValue('hasSipUri', null);
  }, [model]);

  useEffect(() => {
    if (isVisible) {
      cleanControllerLocationId();
      methods.reset(defaultValues);
      resetPreservedSipUri();
    }
  }, [isVisible]);

  useSyncControlPage(defaultValues.ip, methods);

  const { createPadlet, createPadletQueryStatus } = usePadletRepository();

  const onDrawerClose = (): void => {
    methods.reset(defaultValues);
    resetPreservedSipUri();
  };

  const submitHandler: SubmitHandler<PadletCreateFormData> = (values) => {
    createPadlet(normalizeSipUriForPayload(values));
  };

  useEffect(() => {
    if (createPadletQueryStatus === QueryStatus.fulfilled) {
      closeDrawer(DrawerTypes.padletCreate);
      methods.reset(defaultValues);
      resetPreservedSipUri();
    }
  }, [createPadletQueryStatus]);

  const { isValid, dirtyFields } = methods.formState;
  const isDirtyLocationId =
    locationId && locationId !== defaultValues.locationId;

  useEffect(() => {
    if (locationId) {
      methods.setValue(PADLET_CREATE_FORM_KEY.locationId, locationId);
      methods.reset(methods.getValues());
    }
  }, [locationId]);

  const isDirtyFields = !Helpers.isEmpty(dirtyFields) || isDirtyLocationId;
  const isSaveButtonDisabled = !isDirtyFields || !isValid;

  return {
    createLabel,
    saveLabel,
    methods,
    onDrawerClose,
    submitHandler,
    isSaveButtonDisabled,

    setModel,
  };
};