4f4bd1f2创建于 2023年8月28日历史提交
import { inject, ref } from 'vue';
import type { Ref, SetupContext } from 'vue';
import { FORM_ITEM_TOKEN, FormItemContext } from '../../../form/src/components/form-item/form-item-types';
import { InputProps } from '../input-types';

export function useInputEvent(isFocus: Ref<boolean>, props: InputProps, ctx: SetupContext, focus: () => void) {
  const formItemContext = inject(FORM_ITEM_TOKEN, undefined) as FormItemContext;
  const isComposition = ref(false);
  const onFocus = (e: FocusEvent) => {
    isFocus.value = true;
    ctx.emit('focus', e);
  };

  const onBlur = (e: FocusEvent) => {
    isFocus.value = false;
    ctx.emit('blur', e);
    if (props.validateEvent) {
      formItemContext?.validate('blur').catch((err) => console.warn(err));
    }
  };

  const onInput = (e: Event) => {
    ctx.emit('input', (e.target as HTMLInputElement).value);
    if (isComposition.value) {
      return;
    }
    ctx.emit('update:modelValue', (e.target as HTMLInputElement).value);
  };

  const onChange = (e: Event) => {
    ctx.emit('change', (e.target as HTMLInputElement).value);
  };

  const onKeydown = (e: KeyboardEvent) => {
    ctx.emit('keydown', e);
  };

  const onClear = () => {
    ctx.emit('update:modelValue', '');
    ctx.emit('clear');
    focus();
  };

  const onCompositionStart = () => {
    isComposition.value = true;
  };

  const onCompositionUpdate = (e: CompositionEvent) => {
    const text = (e.target as HTMLInputElement)?.value;
    const lastCharacter = text[text.length - 1] || '';
    isComposition.value = !/([(\uAC00-\uD7AF)|(\u3130-\u318F)])+/gi.test(lastCharacter);
  };

  const onCompositionEnd = (e: CompositionEvent) => {
    if (isComposition.value) {
      isComposition.value = false;
      onInput(e);
    }
  };

  return { onFocus, onBlur, onInput, onChange, onKeydown, onClear, onCompositionStart, onCompositionUpdate, onCompositionEnd };
}