* Reorganize repo * Overhaul website design and rewrite in NextJS and Typescript * Delete website-publish.yml
53 lines
1.8 KiB
TypeScript
53 lines
1.8 KiB
TypeScript
/**
|
|
* This module is currently concerned only with external media libraries
|
|
* registered via `registerMediaLibrary`.
|
|
*/
|
|
import once from 'lodash/once';
|
|
|
|
import { configFailed } from './actions/config';
|
|
import { createMediaLibrary, insertMedia } from './actions/mediaLibrary';
|
|
import { getMediaLibrary } from './lib/registry';
|
|
import { store } from './store';
|
|
|
|
import type { MediaLibrary, MediaLibraryExternalLibrary } from './interface';
|
|
import type { RootState } from './store';
|
|
|
|
function handleInsert(url: string | string[]) {
|
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
// @ts-ignore
|
|
return store.dispatch(insertMedia(url, undefined));
|
|
}
|
|
|
|
const initializeMediaLibrary = once(async function initializeMediaLibrary(
|
|
name: string,
|
|
{ config }: MediaLibraryExternalLibrary,
|
|
) {
|
|
const lib = getMediaLibrary(name);
|
|
if (!lib) {
|
|
const err = new Error(
|
|
`Missing external media library '${name}'. Please use 'registerMediaLibrary' to register it.`,
|
|
);
|
|
store.dispatch(configFailed(err));
|
|
} else {
|
|
const instance = await lib.init({ options: config, handleInsert });
|
|
store.dispatch(createMediaLibrary(instance));
|
|
}
|
|
});
|
|
|
|
function isExternalMediaLibraryConfig(
|
|
config: MediaLibrary | undefined,
|
|
): config is MediaLibraryExternalLibrary {
|
|
return Boolean(config && 'name' in config);
|
|
}
|
|
|
|
store.subscribe(() => {
|
|
const state = store.getState() as unknown as RootState;
|
|
if (state.config.config && isExternalMediaLibraryConfig(state.config.config.media_library)) {
|
|
const mediaLibraryName = state.config.config.media_library?.name;
|
|
if (mediaLibraryName && !state.mediaLibrary.externalLibrary) {
|
|
const mediaLibraryConfig = state.config.config.media_library;
|
|
initializeMediaLibrary(mediaLibraryName, mediaLibraryConfig);
|
|
}
|
|
}
|
|
});
|