ReactContainer.tsx 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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 { ContextSrv } from 'app/core/services/context_srv';
  7. function WrapInProvider(store, Component, props) {
  8. return (
  9. <Provider store={store}>
  10. <Component {...props} />
  11. </Provider>
  12. );
  13. }
  14. /** @ngInject */
  15. export function reactContainer(
  16. $route,
  17. $location,
  18. $injector,
  19. $rootScope,
  20. contextSrv: ContextSrv
  21. ) {
  22. return {
  23. restrict: 'E',
  24. template: '',
  25. link(scope, elem) {
  26. // Check permissions for this component
  27. const { roles } = $route.current.locals;
  28. if (roles && roles.length) {
  29. if (!roles.some(r => contextSrv.hasRole(r))) {
  30. $location.url('/');
  31. }
  32. }
  33. let { component } = $route.current.locals;
  34. // Dynamic imports return whole module, need to extract default export
  35. if (component.default) {
  36. component = component.default;
  37. }
  38. const props = {
  39. $injector: $injector,
  40. $rootScope: $rootScope,
  41. $scope: scope,
  42. routeInfo: $route.current.$$route.routeInfo,
  43. };
  44. document.body.classList.add('is-react');
  45. ReactDOM.render(WrapInProvider(store, component, props), elem[0]);
  46. scope.$on('$destroy', () => {
  47. document.body.classList.remove('is-react');
  48. ReactDOM.unmountComponentAtNode(elem[0]);
  49. });
  50. },
  51. };
  52. }
  53. coreModule.directive('reactContainer', reactContainer);