Files
coopgo/node_modules/decap-cms-core/src/reducers/medias.ts
sgauthier 6e64e138e2
All checks were successful
Publish To Prod / deploy_and_publish (push) Successful in 35s
planning
2024-10-14 09:15:30 +02:00

67 lines
1.7 KiB
TypeScript

import { produce } from 'immer';
import {
ADD_ASSETS,
ADD_ASSET,
REMOVE_ASSET,
LOAD_ASSET_REQUEST,
LOAD_ASSET_SUCCESS,
LOAD_ASSET_FAILURE,
} from '../actions/media';
import type { MediasAction } from '../actions/media';
import type AssetProxy from '../valueObjects/AssetProxy';
export type Medias = {
[path: string]: { asset: AssetProxy | undefined; isLoading: boolean; error: Error | null };
};
const defaultState: Medias = {};
const medias = produce((state: Medias, action: MediasAction) => {
switch (action.type) {
case ADD_ASSETS: {
const assets = action.payload;
assets.forEach(asset => {
state[asset.path] = { asset, isLoading: false, error: null };
});
break;
}
case ADD_ASSET: {
const asset = action.payload;
state[asset.path] = { asset, isLoading: false, error: null };
break;
}
case REMOVE_ASSET: {
const path = action.payload;
delete state[path];
break;
}
case LOAD_ASSET_REQUEST: {
const { path } = action.payload;
state[path] = state[path] || {};
state[path].isLoading = true;
break;
}
case LOAD_ASSET_SUCCESS: {
const { path } = action.payload;
state[path] = state[path] || {};
state[path].isLoading = false;
state[path].error = null;
break;
}
case LOAD_ASSET_FAILURE: {
const { path, error } = action.payload;
state[path] = state[path] || {};
state[path].isLoading = false;
state[path].error = error;
}
}
}, defaultState);
export function selectIsLoadingAsset(state: Medias) {
return Object.values(state).some(state => state.isLoading);
}
export default medias;