aboutsummaryrefslogtreecommitdiffstats
path: root/src/features/todos
diff options
context:
space:
mode:
Diffstat (limited to 'src/features/todos')
-rw-r--r--src/features/todos/actions.js11
-rw-r--r--src/features/todos/components/TodosWebview.js20
-rw-r--r--src/features/todos/containers/TodosScreen.js3
-rw-r--r--src/features/todos/preload.js21
-rw-r--r--src/features/todos/store.js29
5 files changed, 81 insertions, 3 deletions
diff --git a/src/features/todos/actions.js b/src/features/todos/actions.js
index 673ce8531..696568f7f 100644
--- a/src/features/todos/actions.js
+++ b/src/features/todos/actions.js
@@ -5,6 +5,17 @@ export const todoActions = createActionsFromDefinitions({
5 resize: { 5 resize: {
6 width: PropTypes.number.isRequired, 6 width: PropTypes.number.isRequired,
7 }, 7 },
8 setTodosWebview: {
9 webview: PropTypes.element.isRequired,
10 },
11 handleHostMessage: {
12 action: PropTypes.string.isRequired,
13 data: PropTypes.object,
14 },
15 handleClientMessage: {
16 action: PropTypes.string.isRequired,
17 data: PropTypes.object,
18 },
8}, PropTypes.checkPropTypes); 19}, PropTypes.checkPropTypes);
9 20
10export default todoActions; 21export default todoActions;
diff --git a/src/features/todos/components/TodosWebview.js b/src/features/todos/components/TodosWebview.js
index 1d99b9388..1f4730094 100644
--- a/src/features/todos/components/TodosWebview.js
+++ b/src/features/todos/components/TodosWebview.js
@@ -35,6 +35,8 @@ class TodosWebview extends Component {
35 static propTypes = { 35 static propTypes = {
36 classes: PropTypes.object.isRequired, 36 classes: PropTypes.object.isRequired,
37 authToken: PropTypes.string.isRequired, 37 authToken: PropTypes.string.isRequired,
38 handleClientMessage: PropTypes.func.isRequired,
39 setTodosWebview: PropTypes.func.isRequired,
38 resize: PropTypes.func.isRequired, 40 resize: PropTypes.func.isRequired,
39 width: PropTypes.number.isRequired, 41 width: PropTypes.number.isRequired,
40 minWidth: PropTypes.number.isRequired, 42 minWidth: PropTypes.number.isRequired,
@@ -43,7 +45,7 @@ class TodosWebview extends Component {
43 state = { 45 state = {
44 isDragging: false, 46 isDragging: false,
45 width: 300, 47 width: 300,
46 } 48 };
47 49
48 componentWillMount() { 50 componentWillMount() {
49 const { width } = this.props; 51 const { width } = this.props;
@@ -65,7 +67,7 @@ class TodosWebview extends Component {
65 initialPos: event.clientX, 67 initialPos: event.clientX,
66 delta: 0, 68 delta: 0,
67 }); 69 });
68 } 70 };
69 71
70 resizePanel(e) { 72 resizePanel(e) {
71 const { minWidth } = this.props; 73 const { minWidth } = this.props;
@@ -113,10 +115,15 @@ class TodosWebview extends Component {
113 } 115 }
114 } 116 }
115 117
118 startListeningToIpcMessages() {
119 const { handleClientMessage } = this.props;
120 if (!this.webview) return;
121 this.webview.addEventListener('ipc-message', e => handleClientMessage(e.args[0]));
122 }
123
116 render() { 124 render() {
117 const { authToken, classes } = this.props; 125 const { authToken, classes } = this.props;
118 const { width, delta, isDragging } = this.state; 126 const { width, delta, isDragging } = this.state;
119
120 return ( 127 return (
121 <> 128 <>
122 <div 129 <div
@@ -138,6 +145,13 @@ class TodosWebview extends Component {
138 )} 145 )}
139 <Webview 146 <Webview
140 className={classes.webview} 147 className={classes.webview}
148 onDidAttach={() => {
149 this.props.setTodosWebview(this.webview);
150 this.startListeningToIpcMessages();
151 }}
152 partition="persist:todos"
153 preload="./features/todos/preload.js"
154 ref={(webview) => { this.webview = webview ? webview.view : null; }}
141 src={`${environment.TODOS_FRONTEND}?authToken=${authToken}`} 155 src={`${environment.TODOS_FRONTEND}?authToken=${authToken}`}
142 /> 156 />
143 </div> 157 </div>
diff --git a/src/features/todos/containers/TodosScreen.js b/src/features/todos/containers/TodosScreen.js
index 0759c22db..5b7c4531b 100644
--- a/src/features/todos/containers/TodosScreen.js
+++ b/src/features/todos/containers/TodosScreen.js
@@ -18,6 +18,7 @@ class TodosScreen extends Component {
18 actions: PropTypes.shape({ 18 actions: PropTypes.shape({
19 todos: PropTypes.shape({ 19 todos: PropTypes.shape({
20 resize: PropTypes.func.isRequired, 20 resize: PropTypes.func.isRequired,
21 handleIPCMessage: PropTypes.func.isRequired,
21 }), 22 }),
22 }).isRequired, 23 }).isRequired,
23 }; 24 };
@@ -33,6 +34,8 @@ class TodosScreen extends Component {
33 <ErrorBoundary> 34 <ErrorBoundary>
34 <TodosWebview 35 <TodosWebview
35 authToken={stores.user.authToken} 36 authToken={stores.user.authToken}
37 handleClientMessage={actions.todos.handleClientMessage}
38 setTodosWebview={webview => actions.todos.setTodosWebview({ webview })}
36 width={stores.todos.width} 39 width={stores.todos.width}
37 minWidth={TODOS_MIN_WIDTH} 40 minWidth={TODOS_MIN_WIDTH}
38 resize={width => actions.todos.resize({ width })} 41 resize={width => actions.todos.resize({ width })}
diff --git a/src/features/todos/preload.js b/src/features/todos/preload.js
new file mode 100644
index 000000000..533c9aea3
--- /dev/null
+++ b/src/features/todos/preload.js
@@ -0,0 +1,21 @@
1import { ipcRenderer } from 'electron';
2
3const debug = require('debug')('Franz:feature:todos:preload');
4
5debug('Preloading Todos Webview');
6
7let hostMessageListener = () => {};
8
9window.franz = {
10 onInitialize(ipcHostMessageListener) {
11 hostMessageListener = ipcHostMessageListener;
12 },
13 sendToHost(message) {
14 ipcRenderer.sendToHost('clientMessage', message);
15 },
16};
17
18ipcRenderer.on('hostMessage', (event, message) => {
19 debug('Received host message', event, message);
20 hostMessageListener(message);
21});
diff --git a/src/features/todos/store.js b/src/features/todos/store.js
index e7e13b37f..737902946 100644
--- a/src/features/todos/store.js
+++ b/src/features/todos/store.js
@@ -18,6 +18,8 @@ export default class TodoStore extends FeatureStore {
18 18
19 @observable isFeatureActive = false; 19 @observable isFeatureActive = false;
20 20
21 webview = null;
22
21 @computed get width() { 23 @computed get width() {
22 const width = this.settings.width || DEFAULT_TODOS_WIDTH; 24 const width = this.settings.width || DEFAULT_TODOS_WIDTH;
23 25
@@ -39,6 +41,9 @@ export default class TodoStore extends FeatureStore {
39 41
40 this._registerActions(createActionBindings([ 42 this._registerActions(createActionBindings([
41 [todoActions.resize, this._resize], 43 [todoActions.resize, this._resize],
44 [todoActions.setTodosWebview, this._setTodosWebview],
45 [todoActions.handleHostMessage, this._handleHostMessage],
46 [todoActions.handleClientMessage, this._handleClientMessage],
42 ])); 47 ]));
43 48
44 // REACTIONS 49 // REACTIONS
@@ -76,6 +81,30 @@ export default class TodoStore extends FeatureStore {
76 }); 81 });
77 }; 82 };
78 83
84 @action _setTodosWebview = ({ webview }) => {
85 debug('_setTodosWebview', webview);
86 this.webview = webview;
87 };
88
89 @action _handleHostMessage = (message) => {
90 debug('_handleHostMessage', message);
91 if (message.action === 'create:todo') {
92 console.log(this.webview);
93 this.webview.send('hostMessage', message);
94 }
95 };
96
97 @action _handleClientMessage = (message) => {
98 debug('_handleClientMessage', message);
99 if (message.action === 'goToService') {
100 const { url, serviceId } = message.data;
101 if (url) {
102 this.stores.services.one(serviceId).webview.loadURL(url);
103 }
104 this.actions.service.setActive({ serviceId });
105 }
106 };
107
79 // Reactions 108 // Reactions
80 109
81 _setFeatureEnabledReaction = () => { 110 _setFeatureEnabledReaction = () => {