Migrated selectServer action to RTK and moved loadMercureInfo to an action listener

This commit is contained in:
Alejandro Celaya
2022-11-10 22:44:25 +01:00
parent 2e0e24d87b
commit 6221f9ed05
6 changed files with 71 additions and 68 deletions

View File

@@ -1,15 +1,13 @@
import { PayloadAction } from '@reduxjs/toolkit';
import { createAction, createListenerMiddleware, PayloadAction } from '@reduxjs/toolkit';
import { identity, memoizeWith, pipe } from 'ramda';
import { Action, Dispatch } from 'redux';
import { versionToPrintable, versionToSemVer as toSemVer } from '../../utils/helpers/version';
import { SelectedServer } from '../data';
import { GetState } from '../../container/types';
import { isReachableServer, SelectedServer } from '../data';
import { ShlinkHealth } from '../../api/types';
import { buildActionCreator, buildReducer } from '../../utils/helpers/redux';
import { buildReducer, createAsyncThunk } from '../../utils/helpers/redux';
import { ShlinkApiClientBuilder } from '../../api/services/ShlinkApiClientBuilder';
export const SELECT_SERVER = 'shlink/selectedServer/SELECT_SERVER';
export const RESET_SELECTED_SERVER = 'shlink/selectedServer/RESET_SELECTED_SERVER';
export const SELECT_SERVER = 'shlink/selectedServer/selectServer';
export const RESET_SELECTED_SERVER = 'shlink/selectedServer/resetSelectedServer';
export const MIN_FALLBACK_VERSION = '1.0.0';
export const MAX_FALLBACK_VERSION = '999.999.999';
@@ -35,50 +33,49 @@ const initialState: SelectedServer = null;
export default buildReducer<SelectedServer, SelectServerAction>({
[RESET_SELECTED_SERVER]: () => initialState,
[SELECT_SERVER]: (_, { payload }) => payload,
[`${SELECT_SERVER}/fulfilled`]: (_, { payload }) => payload,
}, initialState);
export const resetSelectedServer = buildActionCreator(RESET_SELECTED_SERVER);
export const resetSelectedServer = createAction<void>(RESET_SELECTED_SERVER);
export const selectServer = (
buildShlinkApiClient: ShlinkApiClientBuilder,
loadMercureInfo: () => Action,
) => (
serverId: string,
) => async (
dispatch: Dispatch,
getState: GetState,
) => {
) => createAsyncThunk(SELECT_SERVER, async (serverId: string, { dispatch, getState }): Promise<SelectedServer> => {
dispatch(resetSelectedServer());
const { servers } = getState();
const selectedServer = servers[serverId];
if (!selectedServer) {
dispatch<SelectServerAction>({
type: SELECT_SERVER,
payload: { serverNotFound: true },
});
return;
return { serverNotFound: true };
}
try {
const { health } = buildShlinkApiClient(selectedServer);
const { version, printableVersion } = await getServerVersion(serverId, health);
dispatch<SelectServerAction>({
type: SELECT_SERVER,
payload: {
...selectedServer,
version,
printableVersion,
},
});
dispatch(loadMercureInfo());
return {
...selectedServer,
version,
printableVersion,
};
} catch (e) {
dispatch<SelectServerAction>({
type: SELECT_SERVER,
payload: { ...selectedServer, serverNotReachable: true },
});
return { ...selectedServer, serverNotReachable: true };
}
});
export const selectServerListener = (
selectServerThunk: ReturnType<typeof selectServer>,
loadMercureInfo: () => PayloadAction<any>, // TODO Consider setting actual type, if relevant
) => {
const listener = createListenerMiddleware();
listener.startListening({
actionCreator: selectServerThunk.fulfilled,
effect: ({ payload }, { dispatch }) => {
isReachableServer(payload) && dispatch(loadMercureInfo());
},
});
return listener;
};