pleroma/app/soapbox/entity-store/reducer.ts

79 lines
2.1 KiB
TypeScript
Raw Normal View History

2022-12-04 14:58:13 -08:00
import produce, { enableMapSet } from 'immer';
import {
ENTITIES_IMPORT,
ENTITIES_FETCH_REQUEST,
ENTITIES_FETCH_SUCCESS,
ENTITIES_FETCH_FAIL,
EntityAction,
} from './actions';
2022-12-04 14:58:13 -08:00
import { createCache, createList, updateStore, updateList } from './utils';
2022-12-04 15:53:56 -08:00
import type { Entity, EntityCache, EntityListState } from './types';
2022-12-04 14:58:13 -08:00
enableMapSet();
/** Entity reducer state. */
type State = Map<string, EntityCache>;
/** Import entities into the cache. */
const importEntities = (
state: Readonly<State>,
entityType: string,
entities: Entity[],
listKey?: string,
2022-12-04 15:53:56 -08:00
newState?: EntityListState,
2022-12-04 14:58:13 -08:00
): State => {
return produce(state, draft => {
const cache = draft.get(entityType) ?? createCache();
cache.store = updateStore(cache.store, entities);
if (listKey) {
2022-12-04 15:53:56 -08:00
let list = cache.lists.get(listKey) ?? createList();
list = updateList(list, entities);
if (newState) {
list.state = newState;
}
cache.lists.set(listKey, list);
2022-12-04 14:58:13 -08:00
}
return draft.set(entityType, cache);
});
};
const setFetching = (
state: State,
entityType: string,
listKey: string | undefined,
isFetching: boolean,
) => {
return produce(state, draft => {
const cache = draft.get(entityType) ?? createCache();
if (listKey) {
const list = cache.lists.get(listKey) ?? createList();
list.state.fetching = isFetching;
cache.lists.set(listKey, list);
}
return draft.set(entityType, cache);
});
};
2022-12-04 14:58:13 -08:00
/** Stores various entity data and lists in a one reducer. */
function reducer(state: Readonly<State> = new Map(), action: EntityAction): State {
switch (action.type) {
case ENTITIES_IMPORT:
return importEntities(state, action.entityType, action.entities, action.listKey);
2022-12-04 15:53:56 -08:00
case ENTITIES_FETCH_SUCCESS:
return importEntities(state, action.entityType, action.entities, action.listKey, action.newState);
case ENTITIES_FETCH_REQUEST:
return setFetching(state, action.entityType, action.listKey, true);
case ENTITIES_FETCH_FAIL:
return setFetching(state, action.entityType, action.listKey, false);
2022-12-04 14:58:13 -08:00
default:
return state;
}
}
export default reducer;