diff --git a/packages/netlify-cms-core/src/mediaLibrary.ts b/packages/netlify-cms-core/src/mediaLibrary.ts index f85d782a..940e6994 100644 --- a/packages/netlify-cms-core/src/mediaLibrary.ts +++ b/packages/netlify-cms-core/src/mediaLibrary.ts @@ -5,6 +5,7 @@ import { once } from 'lodash'; import { getMediaLibrary } from './lib/registry'; import store from './redux'; +import { configFailed } from './actions/config'; import { createMediaLibrary, insertMedia } from './actions/mediaLibrary'; import { MediaLibraryInstance } from './types/redux'; @@ -18,10 +19,17 @@ interface MediaLibrary { } const initializeMediaLibrary = once(async function initializeMediaLibrary(name, options) { - const lib = (getMediaLibrary(name) as unknown) as MediaLibrary; - const handleInsert = (url: string) => store.dispatch(insertMedia(url, undefined)); - const instance = await lib.init({ options, handleInsert }); - store.dispatch(createMediaLibrary(instance)); + const lib = (getMediaLibrary(name) as unknown) as MediaLibrary | undefined; + if (!lib) { + const err = new Error( + `Missing external media library '${name}'. Please use 'registerMediaLibrary' to register it.`, + ); + store.dispatch(configFailed(err)); + } else { + const handleInsert = (url: string) => store.dispatch(insertMedia(url, undefined)); + const instance = await lib.init({ options, handleInsert }); + store.dispatch(createMediaLibrary(instance)); + } }); store.subscribe(() => { diff --git a/packages/netlify-cms-core/src/reducers/config.ts b/packages/netlify-cms-core/src/reducers/config.ts index f462c78b..6e031be4 100644 --- a/packages/netlify-cms-core/src/reducers/config.ts +++ b/packages/netlify-cms-core/src/reducers/config.ts @@ -3,7 +3,9 @@ import { CONFIG_REQUEST, CONFIG_SUCCESS, CONFIG_FAILURE, CONFIG_MERGE } from '.. import { Config, ConfigAction } from '../types/redux'; import { EDITORIAL_WORKFLOW } from '../constants/publishModes'; -const config = (state = Map({ isFetching: true }), action: ConfigAction) => { +const defaultState: Map = Map({ isFetching: true }); + +const config = (state = defaultState, action: ConfigAction) => { switch (action.type) { case CONFIG_MERGE: return state.mergeDeep(action.payload); @@ -17,7 +19,10 @@ const config = (state = Map({ isFetching: true }), action: ConfigAction) => { */ return action.payload.delete('isFetching'); case CONFIG_FAILURE: - return Map({ error: action.payload.toString() }); + return state.withMutations(s => { + s.delete('isFetching'); + s.set('error', action.payload.toString()); + }); default: return state; } diff --git a/packages/netlify-cms-core/src/types/redux.ts b/packages/netlify-cms-core/src/types/redux.ts index c862fa66..10b60599 100644 --- a/packages/netlify-cms-core/src/types/redux.ts +++ b/packages/netlify-cms-core/src/types/redux.ts @@ -41,6 +41,7 @@ export type Config = StaticallyTypedRecord<{ site_id?: string; site_url?: string; show_preview_links?: boolean; + isFetching?: boolean; }>; type PagesObject = {