878cb40d53
This reverts merge request !2614
33 lines
1.1 KiB
TypeScript
33 lines
1.1 KiB
TypeScript
import toast from 'soapbox/toast';
|
|
|
|
import type { AnyAction } from 'redux';
|
|
import type { ThunkMiddleware } from 'redux-thunk';
|
|
|
|
/** Whether the action is considered a failure. */
|
|
const isFailType = (type: string): boolean => type.endsWith('_FAIL');
|
|
|
|
/** Whether the action is a failure to fetch from browser storage. */
|
|
const isRememberFailType = (type: string): boolean => type.endsWith('_REMEMBER_FAIL');
|
|
|
|
/** Whether the error contains an Axios response. */
|
|
const hasResponse = (error: any): boolean => Boolean(error && error.response);
|
|
|
|
/** Don't show 401's. */
|
|
const authorized = (error: any): boolean => error?.response?.status !== 401;
|
|
|
|
/** Whether the error should be shown to the user. */
|
|
const shouldShowError = ({ type, skipAlert, error }: AnyAction): boolean => {
|
|
return !skipAlert && hasResponse(error) && authorized(error) && isFailType(type) && !isRememberFailType(type);
|
|
};
|
|
|
|
/** Middleware to display Redux errors to the user. */
|
|
const errorsMiddleware = (): ThunkMiddleware =>
|
|
() => next => action => {
|
|
if (shouldShowError(action)) {
|
|
toast.showAlertForError(action.error);
|
|
}
|
|
|
|
return next(action);
|
|
};
|
|
|
|
export default errorsMiddleware;
|