/* This file is taken from @testing-library/react (https://github.com/testing-library/react-testing-library/blob/main/src/act-compat.js)
  in order to solve act compatibility issues resulting in following warning: The current testing environment is not configured to support act.
  It's needed because we cannot use '@testing-library/react' in our testkits, as not all of our consumers use this library.
  It's meant to be used only in ReactBase.js and should be removed once ReactBase is removed.
*/
import * as React from 'react';
import * as DeprecatedReactTestUtils from 'react-dom/test-utils';
const reactAct = typeof React.act === 'function' ? React.act : DeprecatedReactTestUtils.act;
function getGlobalThis() {
    if (typeof globalThis !== 'undefined') {
        return globalThis;
    }
    if (typeof self !== 'undefined') {
        return self;
    }
    if (typeof window !== 'undefined') {
        return window;
    }
    if (typeof global !== 'undefined') {
        return global;
    }
    throw new Error('unable to locate global object');
}
function setIsReactActEnvironment(isReactActEnvironment) {
    getGlobalThis().IS_REACT_ACT_ENVIRONMENT = isReactActEnvironment;
}
function getIsReactActEnvironment() {
    return getGlobalThis().IS_REACT_ACT_ENVIRONMENT;
}
function withGlobalActEnvironment(actImplementation) {
    return callback => {
        const previousActEnvironment = getIsReactActEnvironment();
        setIsReactActEnvironment(true);
        try {
            // The return value of `act` is always a thenable.
            let callbackNeedsToBeAwaited = false;
            const actResult = actImplementation(() => {
                const result = callback();
                if (result !== null &&
                    typeof result === 'object' &&
                    typeof result.then === 'function') {
                    callbackNeedsToBeAwaited = true;
                }
                return result;
            });
            if (callbackNeedsToBeAwaited) {
                const thenable = actResult;
                return {
                    then: (resolve, reject) => {
                        thenable.then(returnValue => {
                            setIsReactActEnvironment(previousActEnvironment);
                            resolve(returnValue);
                        }, error => {
                            setIsReactActEnvironment(previousActEnvironment);
                            reject(error);
                        });
                    },
                };
            }
            else {
                setIsReactActEnvironment(previousActEnvironment);
                return actResult;
            }
        }
        catch (error) {
            // Can't be a `finally {}` block since we don't know if we have to immediately restore IS_REACT_ACT_ENVIRONMENT
            // or if we have to await the callback first.
            setIsReactActEnvironment(previousActEnvironment);
            throw error;
        }
    };
}
const act = withGlobalActEnvironment(reactAct);
export { act };
//# sourceMappingURL=actCompat.js.map