Files
grafana/public/app/routes/ReactContainer.tsx

61 lines
1.5 KiB
TypeScript
Raw Normal View History

import React from 'react';
import ReactDOM from 'react-dom';
2018-09-14 09:41:37 +02:00
import { Provider } from 'react-redux';
2018-04-26 11:58:42 +02:00
import coreModule from 'app/core/core_module';
2018-11-05 16:54:48 +01:00
import { store } from 'app/store/store';
2018-04-26 11:58:42 +02:00
import { BackendSrv } from 'app/core/services/backend_srv';
import { DatasourceSrv } from 'app/features/plugins/datasource_srv';
import { ContextSrv } from 'app/core/services/context_srv';
function WrapInProvider(store, Component, props) {
return (
2018-09-14 09:41:37 +02:00
<Provider store={store}>
<Component {...props} />
</Provider>
);
}
/** @ngInject */
export function reactContainer(
$route,
$location,
backendSrv: BackendSrv,
datasourceSrv: DatasourceSrv,
contextSrv: ContextSrv
) {
return {
restrict: 'E',
template: '',
link(scope, elem) {
// Check permissions for this component
const { roles } = $route.current.locals;
if (roles && roles.length) {
if (!roles.some(r => contextSrv.hasRole(r))) {
$location.url('/');
}
}
let { component } = $route.current.locals;
2018-04-27 11:49:11 +02:00
// Dynamic imports return whole module, need to extract default export
if (component.default) {
component = component.default;
}
2018-04-27 11:49:11 +02:00
const props = {
backendSrv: backendSrv,
2018-04-26 11:58:42 +02:00
datasourceSrv: datasourceSrv,
routeParams: $route.current.params,
};
ReactDOM.render(WrapInProvider(store, component, props), elem[0]);
scope.$on('$destroy', () => {
ReactDOM.unmountComponentAtNode(elem[0]);
});
},
};
}
coreModule.directive('reactContainer', reactContainer);