Add network call as promise for ext views
[aai/sparky-fe.git] / src / app / MainScreenWrapper.jsx
1 /*
2  * ============LICENSE_START=======================================================
3  * org.onap.aai
4  * ================================================================================
5  * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
6  * Copyright © 2017-2018 Amdocs
7  * ================================================================================
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *       http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  * ============LICENSE_END=========================================================
20  */
21 import React, {Component} from 'react';
22 import {connect} from 'react-redux';
23 import * as Extensibility from './extensibility/index.js';
24 import TierSupport from './tierSupport/TierSupport.jsx';
25 import VnfSearch from './vnfSearch/VnfSearch.jsx';
26 import MainScreenHeader from './MainScreenHeader.jsx';
27 import {decryptParamsForView, changeUrlAddress} from 'utils/Routes.js';
28 import {isEmpty} from 'lodash';
29 import {genericRequest} from 'app/networking/NetworkCalls.js';
30 import {
31   Route,
32   HashRouter as Router,
33   Switch,
34   Redirect
35 } from 'react-router-dom';
36
37 import {
38   windowResize,
39   extensibleViewNetworkCallback,
40   overlayNetworkCallback,
41   extensibleViewMessageCallback
42 } from './MainScreenWrapperActionHelper.js';
43
44 import extensibleViews from 'resources/views/extensibleViews.json';
45
46 const mapStateToProps = ({mainWrapper}) => {
47   let {
48     showMenu = false,
49     toggleButtonActive = false,
50     extensibleViewNetworkCallbackData = {}
51   } = mainWrapper;
52
53   return {
54     showMenu,
55     toggleButtonActive,
56     extensibleViewNetworkCallbackData
57   };
58 };
59
60 const mapActionsToProps = (dispatch) => {
61   return {
62     onWindowSizeChange: () => dispatch(windowResize()),
63     onExtensibleViewNetworkCallback: (apiUrl,body,viewName,curViewData) =>  {
64       dispatch(extensibleViewNetworkCallback(apiUrl,body,viewName,curViewData));
65     },
66     onExtensibleViewMessageCallback: (message, messageSevirity) => {
67       dispatch(extensibleViewMessageCallback(message, messageSevirity));
68     },
69     onOverlayNetworkCallback: (apiUrl, body, viewName, curViewData, responseEventKey) =>  {
70       dispatch(overlayNetworkCallback(apiUrl, body, viewName, curViewData, responseEventKey));
71     }
72   };
73 };
74
75 class MainScreenWrapper extends Component {
76
77   constructor() {
78     super();
79     window.addEventListener('resize', () => {
80       this.props.onWindowSizeChange();
81     });
82
83   }
84
85
86   render() {
87
88     const {
89       onExtensibleViewNetworkCallback,
90       extensibleViewNetworkCallbackData,
91       onExtensibleViewMessageCallback,
92       onOverlayNetworkCallback
93     } = this.props;
94
95     let customViewList = [];
96     extensibleViews.forEach(function(view,key) {
97
98       let path = ''
99           , extKey = ''
100           ;
101       if(isEmpty(extensibleViews[key]['viewParams'])){
102         path = '/' + view.viewName + '/:extensibleViewParams?';
103         extKey = view.viewName + 'Route';
104       } else {
105         path = '/' + view.viewName  + view.viewParams;
106         extKey = view.viewName + view.viewParams + 'Route'
107       }
108
109       var renderComponent = (props) => {
110         let viewParams = {};
111         if(isEmpty(extensibleViews[key]['viewParams']) && props.match.params.extensibleViewParams !== undefined) {
112           viewParams = decryptParamsForView(props.match.params.extensibleViewParams);
113         }
114
115         if (Extensibility.default.hasOwnProperty(view.componentName)) {
116           let Component = Extensibility.default[view.componentName];
117           return (
118             <Component
119               {...props}
120               networkingCallback={(apiUrl, body, paramName, curViewData) => {
121                 onExtensibleViewNetworkCallback(apiUrl, body, paramName, curViewData);
122               }}
123               overlayCallback={(apiUrl, body, paramName, curOverlayData,responseEventKey) => {
124                 onOverlayNetworkCallback(apiUrl, body, paramName, curOverlayData, responseEventKey);
125               }}
126               messagingCallback ={(message, messageSeverity) => {
127                 onExtensibleViewMessageCallback(message, messageSeverity);
128               }}
129               changeRouteCallback = {(routeParam, historyObj) => {
130                 changeUrlAddress(routeParam, historyObj);
131               }}
132               networkingCallbackPromise = {(url, relativeURL, httpMethodType) => {
133                 return genericRequest(url, relativeURL, httpMethodType);
134               }}
135               viewName={view.displayName}
136               viewData={extensibleViewNetworkCallbackData}
137               viewParams={viewParams}/>
138           );
139         }
140       };
141       if(isEmpty(extensibleViews[key]['isExact']) && !extensibleViews[key]['isExact']){
142         customViewList.push(
143           <Route key={extKey} path={path} render={renderComponent}/>
144       );
145       } else {
146         customViewList.push(
147           <Route key={extKey} exact path={path} render={renderComponent}/>
148       );
149       }
150       
151     });
152
153     return (
154       <Router>
155         <div className='main-app-container'>
156           <Switch>
157             <Redirect from='/' exact to='/schema'/>
158           </Switch>
159           <Route key='MainScreenHeaderRoute' path='/:externalUrl?' component={MainScreenHeader}/>
160           <Route key='TierSupportRoue' path='/schema/:viParam?' component={TierSupport}/>
161           <Route key='VnfSearchRoute' path='/vnfSearch/:filters?' component={VnfSearch}/>
162           {customViewList}
163         </div>
164       </Router>
165     );
166   }
167 }
168
169 export default connect(mapStateToProps, mapActionsToProps)(MainScreenWrapper);