Advertisement
the0938

Untitled

Aug 13th, 2021 (edited)
1,393
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import { ComponentType, FC, createElement, useRef } from 'react';
  2. import { autorun } from 'mobx';
  3. import { Field } from 'mobx-react-form';
  4.  
  5. /**
  6.  * Свойства целевого компонента.
  7.  */
  8. type InnerProps = {
  9.   /**
  10.    * Обрабатывает событие потери фокуса.
  11.    */
  12.   onBlur?: (...args: any[]) => void;
  13. };
  14.  
  15. /**
  16.  * Свойства итогового компонента.
  17.  */
  18. type OuterProps<P extends InnerProps> = P;
  19.  
  20. export const withTextInputFilledMetric = (field: Field, dispatch: () => void) => <P extends InnerProps>(Target: ComponentType<P>) => {
  21.   const WithTextInputFilledMetric: FC<OuterProps<P>> = ({ onBlur, ...props }) => {
  22.     const stopObserving = useRef<any>();
  23.    
  24.     function handleBlur(...args: any[]) {
  25.       if (onBlur) {
  26.         onBlur(...args);
  27.       }
  28.  
  29.       if (stopObserving.current) {
  30.         stopObserving.current();
  31.       }
  32.  
  33.       stopObserving.current = autorun(() => {
  34.         if (!field.validating && field.validated && field.isValid) {
  35.           dispatch();
  36.         }
  37.       });
  38.     }
  39.  
  40.     return createElement(Target, { ...props, onBlur: handleBlur } as P);
  41.   };
  42.  
  43.   WithTextInputFilledMetric.displayName = `WithTextInputFilledMetric(${Target.displayName || Target.name})`;
  44.  
  45.   return WithTextInputFilledMetric;
  46. };
  47.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement