mirror of
https://github.com/shlinkio/shlink-web-client.git
synced 2026-03-03 06:11:48 +00:00
61 lines
2.3 KiB
TypeScript
61 lines
2.3 KiB
TypeScript
import Bottle, { IContainer } from 'bottlejs';
|
|
import { withRouter } from 'react-router-dom';
|
|
import { connect as reduxConnect } from 'react-redux';
|
|
import { pick } from 'ramda';
|
|
import App from '../App';
|
|
import provideApiServices from '../api/services/provideServices';
|
|
import provideCommonServices from '../common/services/provideServices';
|
|
import provideShortUrlsServices from '../short-urls/services/provideServices';
|
|
import provideServersServices from '../servers/services/provideServices';
|
|
import provideVisitsServices from '../visits/services/provideServices';
|
|
import provideTagsServices from '../tags/services/provideServices';
|
|
import provideUtilsServices from '../utils/services/provideServices';
|
|
import provideMercureServices from '../mercure/services/provideServices';
|
|
import provideSettingsServices from '../settings/services/provideServices';
|
|
import provideDomainsServices from '../domains/services/provideServices';
|
|
import { ConnectDecorator } from './types';
|
|
|
|
type LazyActionMap = Record<string, Function>;
|
|
|
|
const bottle = new Bottle();
|
|
const { container } = bottle;
|
|
|
|
const lazyService = <T extends Function, K>(container: IContainer, serviceName: string) =>
|
|
(...args: any[]) => (container[serviceName] as T)(...args) as K;
|
|
const mapActionService = (map: LazyActionMap, actionName: string): LazyActionMap => ({
|
|
...map,
|
|
// Wrap actual action service in a function so that it is lazily created the first time it is called
|
|
[actionName]: lazyService(container, actionName),
|
|
});
|
|
const connect: ConnectDecorator = (propsFromState: string[] | null, actionServiceNames: string[] = []) =>
|
|
reduxConnect(
|
|
propsFromState ? pick(propsFromState) : null,
|
|
actionServiceNames.reduce(mapActionService, {}),
|
|
);
|
|
|
|
bottle.serviceFactory(
|
|
'App',
|
|
App,
|
|
'MainHeader',
|
|
'Home',
|
|
'MenuLayout',
|
|
'CreateServer',
|
|
'EditServer',
|
|
'Settings',
|
|
'ShlinkVersionsContainer',
|
|
);
|
|
bottle.decorator('App', connect([ 'servers', 'settings' ], [ 'fetchServers' ]));
|
|
|
|
provideCommonServices(bottle, connect, withRouter);
|
|
provideApiServices(bottle);
|
|
provideShortUrlsServices(bottle, connect);
|
|
provideServersServices(bottle, connect, withRouter);
|
|
provideTagsServices(bottle, connect);
|
|
provideVisitsServices(bottle, connect);
|
|
provideUtilsServices(bottle);
|
|
provideMercureServices(bottle);
|
|
provideSettingsServices(bottle, connect);
|
|
provideDomainsServices(bottle, connect);
|
|
|
|
export default container;
|