2023-12-19 08:19:27 +09:00
|
|
|
import {
|
|
|
|
isAsyncThunkAction,
|
|
|
|
isPending as isThunkActionPending,
|
|
|
|
isFulfilled as isThunkActionFulfilled,
|
|
|
|
isRejected as isThunkActionRejected,
|
|
|
|
} from '@reduxjs/toolkit';
|
2017-01-16 21:27:58 +09:00
|
|
|
import { showLoading, hideLoading } from 'react-redux-loading-bar';
|
2023-05-10 19:59:29 +09:00
|
|
|
import type { AnyAction, Middleware } from 'redux';
|
|
|
|
|
|
|
|
import type { RootState } from '..';
|
2017-01-16 21:27:58 +09:00
|
|
|
|
2023-05-09 23:56:26 +09:00
|
|
|
interface Config {
|
2023-05-10 02:02:12 +09:00
|
|
|
promiseTypeSuffixes?: string[];
|
2023-05-09 23:56:26 +09:00
|
|
|
}
|
|
|
|
|
2023-05-10 02:02:12 +09:00
|
|
|
const defaultTypeSuffixes: Config['promiseTypeSuffixes'] = [
|
|
|
|
'PENDING',
|
|
|
|
'FULFILLED',
|
|
|
|
'REJECTED',
|
|
|
|
];
|
2017-01-16 21:27:58 +09:00
|
|
|
|
2023-05-10 02:02:12 +09:00
|
|
|
export const loadingBarMiddleware = (
|
2023-07-13 18:26:45 +09:00
|
|
|
config: Config = {},
|
2023-09-12 19:18:19 +09:00
|
|
|
): Middleware<unknown, RootState> => {
|
2023-07-13 18:49:16 +09:00
|
|
|
const promiseTypeSuffixes = config.promiseTypeSuffixes ?? defaultTypeSuffixes;
|
2017-01-16 21:27:58 +09:00
|
|
|
|
2023-05-10 02:02:12 +09:00
|
|
|
return ({ dispatch }) =>
|
|
|
|
(next) =>
|
2023-05-10 19:59:29 +09:00
|
|
|
(action: AnyAction) => {
|
2023-12-19 08:19:27 +09:00
|
|
|
let isPending = false;
|
|
|
|
let isFulfilled = false;
|
|
|
|
let isRejected = false;
|
|
|
|
|
|
|
|
if (
|
|
|
|
isAsyncThunkAction(action)
|
|
|
|
// TODO: once we get the first use-case for it, add a check for skipLoading
|
|
|
|
) {
|
|
|
|
if (isThunkActionPending(action)) isPending = true;
|
|
|
|
else if (isThunkActionFulfilled(action)) isFulfilled = true;
|
|
|
|
else if (isThunkActionRejected(action)) isRejected = true;
|
|
|
|
} else if (
|
|
|
|
action.type &&
|
|
|
|
!action.skipLoading &&
|
|
|
|
typeof action.type === 'string'
|
|
|
|
) {
|
2023-05-10 02:02:12 +09:00
|
|
|
const [PENDING, FULFILLED, REJECTED] = promiseTypeSuffixes;
|
2017-01-16 21:27:58 +09:00
|
|
|
|
2023-12-19 08:19:27 +09:00
|
|
|
const isPendingRegexp = new RegExp(`${PENDING}$`, 'g');
|
|
|
|
const isFulfilledRegexp = new RegExp(`${FULFILLED}$`, 'g');
|
|
|
|
const isRejectedRegexp = new RegExp(`${REJECTED}$`, 'g');
|
|
|
|
|
|
|
|
if (action.type.match(isPendingRegexp)) {
|
|
|
|
isPending = true;
|
|
|
|
} else if (action.type.match(isFulfilledRegexp)) {
|
|
|
|
isFulfilled = true;
|
|
|
|
} else if (action.type.match(isRejectedRegexp)) {
|
|
|
|
isRejected = true;
|
2023-05-10 02:02:12 +09:00
|
|
|
}
|
2017-01-16 21:27:58 +09:00
|
|
|
}
|
|
|
|
|
2023-12-19 08:19:27 +09:00
|
|
|
if (isPending) {
|
|
|
|
dispatch(showLoading());
|
|
|
|
} else if (isFulfilled || isRejected) {
|
|
|
|
dispatch(hideLoading());
|
|
|
|
}
|
|
|
|
|
2023-05-10 02:02:12 +09:00
|
|
|
return next(action);
|
|
|
|
};
|
2023-05-09 23:56:26 +09:00
|
|
|
};
|