import useFeatureApi from 'hooks/api/actions/useFeatureApi/useFeatureApi'; import { useEffect, useState } from 'react'; import { IConstraint } from 'interfaces/strategy'; const isValid = (constraint: IConstraint) => { const hasValues = Array.isArray(constraint.values) && constraint.values.length > 0; const hasValue = Boolean(constraint.value); return hasValues || hasValue; }; export const useConstraintsValidation = ( constraints?: IConstraint[] ): boolean => { // An empty list of constraints is valid. An undefined list is not. // A non-empty list has to be checked by calling the backend. const isEmptyList = Boolean(constraints && constraints.length === 0); const [valid, setValid] = useState(isEmptyList); const { validateConstraint } = useFeatureApi(); useEffect(() => { if (!constraints) { return; } const invalidConstraints = constraints.find(item => !isValid(item)); if (invalidConstraints) { setValid(false); return; } const validationRequests = constraints .filter(isValid) .map(constraint => { return validateConstraint(constraint); }); Promise.all(validationRequests) .then(() => setValid(true)) .catch(() => setValid(false)); // eslint-disable-next-line react-hooks/exhaustive-deps }, [JSON.stringify(constraints)]); return valid; };