From 878cb40d53a91c9af62dc787ed14d36f9f55a28f Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Mon, 24 Jul 2023 20:01:28 +0000 Subject: [PATCH] Revert "Merge branch 'disable-errors-middleware' into 'develop'" This reverts merge request !2614 --- app/soapbox/middleware/errors.ts | 33 ++++++++++++++++++++++++++++++++ app/soapbox/store.ts | 2 ++ 2 files changed, 35 insertions(+) create mode 100644 app/soapbox/middleware/errors.ts diff --git a/app/soapbox/middleware/errors.ts b/app/soapbox/middleware/errors.ts new file mode 100644 index 000000000..9e423a685 --- /dev/null +++ b/app/soapbox/middleware/errors.ts @@ -0,0 +1,33 @@ +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; diff --git a/app/soapbox/store.ts b/app/soapbox/store.ts index 9b0136a00..8aeb0a791 100644 --- a/app/soapbox/store.ts +++ b/app/soapbox/store.ts @@ -1,6 +1,7 @@ import { configureStore } from '@reduxjs/toolkit'; import thunk, { ThunkDispatch } from 'redux-thunk'; +import errorsMiddleware from './middleware/errors'; import soundsMiddleware from './middleware/sounds'; import appReducer from './reducers'; @@ -10,6 +11,7 @@ export const store = configureStore({ reducer: appReducer, middleware: [ thunk, + errorsMiddleware(), soundsMiddleware(), ], devTools: true,