piral-core
Version:
The core library for creating a Piral instance.
96 lines (83 loc) • 2.56 kB
text/typescript
import { ComponentType } from 'react';
import { RouteComponentProps } from 'react-router';
import { runPilet } from 'piral-base';
import { withKey, replaceOrAddItem, removeNested, withProvider, withRoute, noop } from '../utils';
import {
ComponentsState,
ErrorComponentsState,
BaseRegistration,
RegistryState,
GlobalStateContext,
Pilet,
PiletEntry,
} from '../types';
export function initialize(ctx: GlobalStateContext, loading: boolean, error: Error | undefined, modules: Array<Pilet>) {
ctx.dispatch((state) => ({
...state,
app: {
...state.app,
error,
loading,
},
modules,
}));
}
export function addPilet(ctx: GlobalStateContext, meta: PiletEntry): Promise<void> {
return ctx.options
.loadPilet(meta)
.then((pilet) => ctx.injectPilet(pilet))
.then((pilet) => runPilet(ctx.options.createApi, pilet, ctx.options.hooks))
.then(noop);
}
export function removePilet(ctx: GlobalStateContext, name: string): Promise<void> {
ctx.dispatch((state) => ({
...state,
modules: state.modules.filter((m) => m.name !== name),
registry: removeNested<RegistryState, BaseRegistration>(state.registry, (m) => m.pilet === name),
}));
ctx.emit('unload-pilet', {
name,
});
return Promise.resolve();
}
export function injectPilet(ctx: GlobalStateContext, pilet: Pilet): Pilet {
ctx.dispatch((state) => ({
...state,
modules: replaceOrAddItem(state.modules, pilet, (m) => m.name === pilet.name),
registry: removeNested<RegistryState, BaseRegistration>(state.registry, (m) => m.pilet === pilet.name),
}));
ctx.emit('unload-pilet', {
name: pilet.name,
});
return pilet;
}
export function setComponent<TKey extends keyof ComponentsState>(
ctx: GlobalStateContext,
name: TKey,
component: ComponentsState[TKey],
) {
ctx.dispatch((state) => ({
...state,
components: withKey(state.components, name, component),
}));
}
export function setErrorComponent<TKey extends keyof ErrorComponentsState>(
ctx: GlobalStateContext,
type: TKey,
component: ErrorComponentsState[TKey],
) {
ctx.dispatch((state) => ({
...state,
errorComponents: withKey(state.errorComponents, type, component),
}));
}
export function setRoute<T extends { [K in keyof T]?: string } = {}>(
ctx: GlobalStateContext,
path: string,
component: ComponentType<RouteComponentProps<T>>,
) {
ctx.dispatch(withRoute(path, component));
}
export function includeProvider(ctx: GlobalStateContext, provider: JSX.Element) {
ctx.dispatch(withProvider(provider));
}