// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.

import {
    captureMessage,
    cleanUrlForLogging,
    LOGGER_JAVASCRIPT_WARNING,
} from 'app/utils/sentry';

// Creates middleware that mimics thunk while catching network errors thrown by Client4 that haven't
// been otherwise handled.
export function createThunkMiddleware() {
    return (store) => (next) => (action) => {
        if (typeof action === 'function') {
            const result = action(store.dispatch, store.getState);

            if (result instanceof Promise) {
                return result.catch((error) => {
                    if (error.url) {
                        // This is a connection error from mattermost-redux. This should've been handled
                        // within the action itself, so we'll log to Sentry enough to identify where
                        // that handling is missing.
                        captureMessage(
                            `Caught Client4 error "${error.message}" from "${cleanUrlForLogging(error.url)}"`,
                            LOGGER_JAVASCRIPT_WARNING,
                            store
                        );

                        return {error};
                    }

                    throw error;
                });
            }

            return result;
        }

        return next(action);
    };
}
