useFlipFlopData.ts 3.7 KB
import { Ref, nextTick, toRaw, unref } from 'vue';
import { FlipFlopConditionType, FlipFlopFormRecordType, FlipFlopItemType } from './types';
import { DefineComponentsBasicExpose } from '/#/utils';
import { FormFieldEnum } from './config';
import { FlipFlopTypeEnum } from '/@/enums/linkedgeEnum';
import { createNewFlipFlopItem } from '.';

export function useFlipFlopData(
  flipFlopListRef: Ref<FlipFlopItemType[]>
): DefineComponentsBasicExpose<FlipFlopConditionType[]> {
  const crateFlipFlopCondition = (flipFlopItem: FlipFlopItemType): FlipFlopConditionType => {
    const {
      deviceProfileId,
      deviceType,
      entityId,
      entityType,
      triggerType,
      flipFlopType,
      triggerDurationUnit,
      triggerRepeatCount,
      triggerDurationValue,
    } = flipFlopItem.ref?.getFieldsValue() as FlipFlopFormRecordType;

    const condition = flipFlopItem.conditionRef?.getFieldsValue() || [];

    return {
      deviceProfileId,
      deviceType,
      entityId,
      entityType,
      triggerType,
      triggerCondition: {
        condition: {
          condition,
          spec: {
            type: flipFlopType,
            ...(flipFlopType !== FlipFlopTypeEnum.SIMPLE
              ? {
                  unit: triggerDurationUnit,
                  predicate: {
                    defaultValue:
                      flipFlopType === FlipFlopTypeEnum.DURATION
                        ? triggerDurationValue
                        : triggerRepeatCount,
                  },
                }
              : {}),
          },
        },
        schedule: toRaw(unref(flipFlopItem.schedule)),
      },
    };
  };

  const getFieldsValue = () => {
    return unref(flipFlopListRef).map((flipFlopItem) => crateFlipFlopCondition(flipFlopItem));
  };

  const setFieldsValue = (flipFlopData: FlipFlopConditionType[]) => {
    flipFlopListRef.value = Array.from({ length: flipFlopData.length }, () =>
      createNewFlipFlopItem()
    );

    nextTick(() => {
      unref(flipFlopListRef).forEach((item, index) => {
        const data = flipFlopData[index];
        const condition = data.triggerCondition.condition;
        const [firstItem] = condition.condition;
        const { key, valueType } = firstItem;
        const { type, unit, predicate } = condition.spec;
        const { defaultValue } = predicate || {};

        item.ref?.setFieldsValue({
          ...data,
          [FormFieldEnum.FLIP_FLOP_TYPE]: type,
          [FormFieldEnum.CONDITION_KEY]: key.key,
          [FormFieldEnum.CONDITION_VALUE_TYPE]: valueType,
          [FormFieldEnum.TRIGGER_DURATION_UNIT]: unit,
          [FormFieldEnum.TRIGGER_DURATION_VALUE]:
            type === FlipFlopTypeEnum.DURATION ? defaultValue : null,
          [FormFieldEnum.TRIGGER_REPEAT_COUNT]:
            type === FlipFlopTypeEnum.REPEATING ? defaultValue : null,
        });

        const {
          daysOfWeek,
          startsOn = 0,
          endsOn = 0,
          timezone,
          type: scheduleType,
          items,
        } = data.triggerCondition.schedule;
        item.schedule = {
          type: scheduleType,
          timezone,
          daysOfWeek,
          startsOn,
          endsOn,
          items,
        };

        nextTick(() => {
          item.conditionRef?.setFieldsValue(condition.condition);
        });
      });
    });
  };

  const validate = async () => {
    for (const flipFlopItem of unref(flipFlopListRef)) {
      await flipFlopItem.ref?.validate();
      await flipFlopItem.conditionRef?.validate?.();
    }
  };

  const resetFieldsValue = (defaultNull?: boolean) => {
    flipFlopListRef.value = defaultNull ? [] : [createNewFlipFlopItem()];
  };

  return {
    getFieldsValue,
    setFieldsValue,
    validate,
    resetFieldsValue,
  };
}