ReactContainer.tsx 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import React from 'react';
  2. import ReactDOM from 'react-dom';
  3. import { Provider } from 'react-redux';
  4. import coreModule from 'app/core/core_module';
  5. import { store } from 'app/store/store';
  6. import { BackendSrv } from 'app/core/services/backend_srv';
  7. import { DatasourceSrv } from 'app/features/plugins/datasource_srv';
  8. import { ContextSrv } from 'app/core/services/context_srv';
  9. function WrapInProvider(store, Component, props) {
  10. return (
  11. <Provider store={store}>
  12. <Component {...props} />
  13. </Provider>
  14. );
  15. }
  16. /** @ngInject */
  17. export function reactContainer(
  18. $route,
  19. $location,
  20. backendSrv: BackendSrv,
  21. datasourceSrv: DatasourceSrv,
  22. contextSrv: ContextSrv
  23. ) {
  24. return {
  25. restrict: 'E',
  26. template: '',
  27. link(scope, elem) {
  28. // Check permissions for this component
  29. const { roles } = $route.current.locals;
  30. if (roles && roles.length) {
  31. if (!roles.some(r => contextSrv.hasRole(r))) {
  32. $location.url('/');
  33. }
  34. }
  35. let { component } = $route.current.locals;
  36. // Dynamic imports return whole module, need to extract default export
  37. if (component.default) {
  38. component = component.default;
  39. }
  40. const props = {
  41. backendSrv: backendSrv,
  42. datasourceSrv: datasourceSrv,
  43. routeParams: $route.current.params,
  44. };
  45. ReactDOM.render(WrapInProvider(store, component, props), elem[0]);
  46. scope.$on('$destroy', () => {
  47. ReactDOM.unmountComponentAtNode(elem[0]);
  48. });
  49. },
  50. };
  51. }
  52. coreModule.directive('reactContainer', reactContainer);