1 | import mapKeys from 'lodash/fp/mapKeys';
|
2 | import React from 'react';
|
3 | import ReactDOM from 'react-dom';
|
4 |
|
5 | const DefaultProvider = props => props.children;
|
6 |
|
7 | const link = (Provider, Component) => (scope, element, attrs) => {
|
8 | const update = vTree => {
|
9 | ReactDOM.render(vTree, element[0]);
|
10 | };
|
11 |
|
12 | const refresh = (context = {}, props = {}) => {
|
13 | const vTree = React.createElement(
|
14 | Provider,
|
15 | context,
|
16 | React.createElement(Component, props)
|
17 | );
|
18 |
|
19 | update(vTree);
|
20 | };
|
21 |
|
22 | scope.$watch('context', () => refresh(scope.context, scope.props), true);
|
23 | scope.$watch('props', () => refresh(scope.context, scope.props), true);
|
24 |
|
25 | scope.$on('$destroy', () => window.angular.element(element).remove());
|
26 | };
|
27 |
|
28 | const createDirective = (app, componentName, Provider, Component) => {
|
29 | const directive = () => {
|
30 | return {
|
31 | restrict: 'E',
|
32 | link: link(Provider, Component),
|
33 | scope: {
|
34 | props: '=',
|
35 | context: '='
|
36 | }
|
37 | };
|
38 | };
|
39 |
|
40 | app.directive(componentName, [directive]);
|
41 | };
|
42 |
|
43 |
|
44 |
|
45 |
|
46 |
|
47 |
|
48 | const createDirectives = (app, Provider, components) => {
|
49 | const toDirective = key => {
|
50 | const componentName = `coorp${key}`;
|
51 | const Component = components[key];
|
52 | createDirective(app, componentName, Provider || DefaultProvider, Component);
|
53 | };
|
54 |
|
55 | return mapKeys(toDirective, components);
|
56 | };
|
57 |
|
58 | export default createDirectives;
|
59 |
|
\ | No newline at end of file |