aboutsummaryrefslogtreecommitdiffstats
path: root/src/components/services/content/ServiceView.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/services/content/ServiceView.js')
-rw-r--r--src/components/services/content/ServiceView.js139
1 files changed, 139 insertions, 0 deletions
diff --git a/src/components/services/content/ServiceView.js b/src/components/services/content/ServiceView.js
new file mode 100644
index 000000000..13148b9b3
--- /dev/null
+++ b/src/components/services/content/ServiceView.js
@@ -0,0 +1,139 @@
1import React, { Component, Fragment } from 'react';
2import PropTypes from 'prop-types';
3import { autorun } from 'mobx';
4import { observer } from 'mobx-react';
5import classnames from 'classnames';
6
7import ServiceModel from '../../../models/Service';
8import StatusBarTargetUrl from '../../ui/StatusBarTargetUrl';
9import WebviewLoader from '../../ui/WebviewLoader';
10import WebviewCrashHandler from './WebviewCrashHandler';
11import WebviewErrorHandler from './ErrorHandlers/WebviewErrorHandler';
12import ServiceDisabled from './ServiceDisabled';
13import ServiceWebview from './ServiceWebview';
14
15export default @observer class ServiceView extends Component {
16 static propTypes = {
17 service: PropTypes.instanceOf(ServiceModel).isRequired,
18 setWebviewReference: PropTypes.func.isRequired,
19 detachService: PropTypes.func.isRequired,
20 reload: PropTypes.func.isRequired,
21 edit: PropTypes.func.isRequired,
22 enable: PropTypes.func.isRequired,
23 isActive: PropTypes.bool,
24 };
25
26 static defaultProps = {
27 isActive: false,
28 };
29
30 state = {
31 forceRepaint: false,
32 targetUrl: '',
33 statusBarVisible: false,
34 };
35
36 autorunDisposer = null;
37
38 forceRepaintTimeout = null;
39
40 componentDidMount() {
41 this.autorunDisposer = autorun(() => {
42 if (this.props.service.isActive) {
43 this.setState({ forceRepaint: true });
44 this.forceRepaintTimeout = setTimeout(() => {
45 this.setState({ forceRepaint: false });
46 }, 100);
47 }
48 });
49 }
50
51 componentWillUnmount() {
52 this.autorunDisposer();
53 clearTimeout(this.forceRepaintTimeout);
54 }
55
56 updateTargetUrl = (event) => {
57 let visible = true;
58 if (event.url === '' || event.url === '#') {
59 visible = false;
60 }
61 this.setState({
62 targetUrl: event.url,
63 statusBarVisible: visible,
64 });
65 };
66
67 render() {
68 const {
69 detachService,
70 service,
71 setWebviewReference,
72 reload,
73 edit,
74 enable,
75 } = this.props;
76
77 const webviewClasses = classnames({
78 services__webview: true,
79 'services__webview-wrapper': true,
80 'is-active': service.isActive,
81 'services__webview--force-repaint': this.state.forceRepaint,
82 });
83
84 let statusBar = null;
85 if (this.state.statusBarVisible) {
86 statusBar = (
87 <StatusBarTargetUrl text={this.state.targetUrl} />
88 );
89 }
90
91 return (
92 <div className={webviewClasses}>
93 {service.isActive && service.isEnabled && (
94 <Fragment>
95 {service.hasCrashed && (
96 <WebviewCrashHandler
97 name={service.recipe.name}
98 webview={service.webview}
99 reload={reload}
100 />
101 )}
102 {service.isEnabled && service.isLoading && service.isFirstLoad && (
103 <WebviewLoader
104 loaded={false}
105 name={service.name}
106 />
107 )}
108 {service.isError && (
109 <WebviewErrorHandler
110 name={service.recipe.name}
111 errorMessage={service.errorMessage}
112 reload={reload}
113 edit={edit}
114 />
115 )}
116 </Fragment>
117 )}
118 {!service.isEnabled ? (
119 <Fragment>
120 {service.isActive && (
121 <ServiceDisabled
122 name={service.recipe.name}
123 webview={service.webview}
124 enable={enable}
125 />
126 )}
127 </Fragment>
128 ) : (
129 <ServiceWebview
130 service={service}
131 setWebviewReference={setWebviewReference}
132 detachService={detachService}
133 />
134 )}
135 {statusBar}
136 </div>
137 );
138 }
139}