cozy-harvest-lib 9.23.4 → 9.24.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +32 -0
- package/dist/components/InAppBrowser.js +1 -1
- package/dist/components/Routes.js +22 -10
- package/dist/helpers/useKonnectorWithTriggers.js +182 -0
- package/dist/locales/nl_NL.json +10 -2
- package/package.json +2 -2
- package/src/components/InAppBrowser.jsx +1 -1
- package/src/components/Routes.jsx +98 -74
- package/src/helpers/useKonnectorWithTriggers.js +75 -0
- package/src/locales/nl_NL.json +10 -2
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,38 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [9.24.2](https://github.com/cozy/cozy-libs/compare/cozy-harvest-lib@9.24.1...cozy-harvest-lib@9.24.2) (2022-07-29)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Bug Fixes
|
|
10
|
+
|
|
11
|
+
* Expect a state attribute in showInAppBrowser result ([4d79905](https://github.com/cozy/cozy-libs/commit/4d799052aa4bb2d15bdf7a8c927c875b0484800a))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
## [9.24.1](https://github.com/cozy/cozy-libs/compare/cozy-harvest-lib@9.24.0...cozy-harvest-lib@9.24.1) (2022-07-27)
|
|
18
|
+
|
|
19
|
+
**Note:** Version bump only for package cozy-harvest-lib
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
# [9.24.0](https://github.com/cozy/cozy-libs/compare/cozy-harvest-lib@9.23.4...cozy-harvest-lib@9.24.0) (2022-07-27)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
### Features
|
|
29
|
+
|
|
30
|
+
* **cozy-harvest-app:** Add `konnectorSlug` prop in Routes.jsx ([e7e656e](https://github.com/cozy/cozy-libs/commit/e7e656e5527df108dbed86c2c74543adaa928f34))
|
|
31
|
+
* **cozy-harvest-app:** Display a spinner while connector is fetched ([6c6079b](https://github.com/cozy/cozy-libs/commit/6c6079b2d5dc4d1d993bd5c72d48b18dcbba5377))
|
|
32
|
+
* **cozy-harvest-app:** Fetch connector from cozy-stack if undefined ([5433f97](https://github.com/cozy/cozy-libs/commit/5433f97df552262d6de71eb112e59d81b62c0451))
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
|
|
6
38
|
## [9.23.4](https://github.com/cozy/cozy-libs/compare/cozy-harvest-lib@9.23.3...cozy-harvest-lib@9.23.4) (2022-07-27)
|
|
7
39
|
|
|
8
40
|
|
|
@@ -152,7 +152,7 @@ var InAppBrowserWithIntentsApi = function InAppBrowserWithIntentsApi(_ref3) {
|
|
|
152
152
|
case 13:
|
|
153
153
|
result = _context2.sent;
|
|
154
154
|
|
|
155
|
-
if ((result === null || result === void 0 ? void 0 : result.
|
|
155
|
+
if ((result === null || result === void 0 ? void 0 : result.state) !== 'dismiss' && (result === null || result === void 0 ? void 0 : result.state) !== 'cancel') {
|
|
156
156
|
logger.error('Unexpected InAppBrowser result', result);
|
|
157
157
|
}
|
|
158
158
|
|
|
@@ -4,6 +4,7 @@ import { Switch, Route, Redirect } from 'react-router';
|
|
|
4
4
|
import { withStyles } from '@material-ui/core/styles';
|
|
5
5
|
import Dialog from 'cozy-ui/transpiled/react/Dialog';
|
|
6
6
|
import { DialogCloseButton, useCozyDialog } from 'cozy-ui/transpiled/react/CozyDialogs';
|
|
7
|
+
import Spinner from 'cozy-ui/transpiled/react/Spinner';
|
|
7
8
|
import { useVaultUnlockContext, VaultUnlockProvider, VaultUnlockPlaceholder } from 'cozy-keys-lib';
|
|
8
9
|
import KonnectorAccounts from './KonnectorAccounts';
|
|
9
10
|
import AccountModal from './AccountModal';
|
|
@@ -16,6 +17,7 @@ import { MountPointProvider } from './MountPointContext';
|
|
|
16
17
|
import DialogContext from './DialogContext';
|
|
17
18
|
import { DatacardOptions } from './Datacards/DatacardOptionsContext';
|
|
18
19
|
import { ViewerModal } from '../datacards/ViewerModal';
|
|
20
|
+
import { useKonnectorWithTriggers } from '../helpers/useKonnectorWithTriggers';
|
|
19
21
|
/**
|
|
20
22
|
* Dialog will not be centered vertically since we need the modal to "stay in place"
|
|
21
23
|
* when changing tabs. Since tabs content's height is not the same between the data
|
|
@@ -45,6 +47,7 @@ var HarvestDialog = withStyles({
|
|
|
45
47
|
var Routes = function Routes(_ref) {
|
|
46
48
|
var konnectorRoot = _ref.konnectorRoot,
|
|
47
49
|
konnector = _ref.konnector,
|
|
50
|
+
konnectorSlug = _ref.konnectorSlug,
|
|
48
51
|
onDismiss = _ref.onDismiss,
|
|
49
52
|
datacardOptions = _ref.datacardOptions;
|
|
50
53
|
var dialogContext = useCozyDialog({
|
|
@@ -52,6 +55,11 @@ var Routes = function Routes(_ref) {
|
|
|
52
55
|
open: true,
|
|
53
56
|
onClose: onDismiss
|
|
54
57
|
});
|
|
58
|
+
|
|
59
|
+
var _useKonnectorWithTrig = useKonnectorWithTriggers(konnectorSlug, konnector),
|
|
60
|
+
konnectorWithTriggers = _useKonnectorWithTrig.konnectorWithTriggers,
|
|
61
|
+
fetching = _useKonnectorWithTrig.fetching;
|
|
62
|
+
|
|
55
63
|
return /*#__PURE__*/React.createElement(DatacardOptions, {
|
|
56
64
|
options: datacardOptions
|
|
57
65
|
}, /*#__PURE__*/React.createElement(MountPointProvider, {
|
|
@@ -59,11 +67,15 @@ var Routes = function Routes(_ref) {
|
|
|
59
67
|
}, /*#__PURE__*/React.createElement(DialogContext.Provider, {
|
|
60
68
|
value: dialogContext
|
|
61
69
|
}, /*#__PURE__*/React.createElement(HarvestVaultProvider, null, /*#__PURE__*/React.createElement(VaultUnlockProvider, null, /*#__PURE__*/React.createElement(HarvestDialog, _extends({}, dialogContext.dialogProps, {
|
|
62
|
-
"aria-label":
|
|
70
|
+
"aria-label": konnectorWithTriggers.name
|
|
63
71
|
}), /*#__PURE__*/React.createElement(DialogCloseButton, {
|
|
64
72
|
onClick: onDismiss
|
|
65
|
-
}), /*#__PURE__*/React.createElement(
|
|
66
|
-
|
|
73
|
+
}), fetching ? /*#__PURE__*/React.createElement("div", {
|
|
74
|
+
className: "u-pv-2 u-ta-center"
|
|
75
|
+
}, /*#__PURE__*/React.createElement(Spinner, {
|
|
76
|
+
size: "xxlarge"
|
|
77
|
+
})) : /*#__PURE__*/React.createElement(KonnectorAccounts, {
|
|
78
|
+
konnector: konnectorWithTriggers
|
|
67
79
|
}, function (accountsAndTriggers) {
|
|
68
80
|
return /*#__PURE__*/React.createElement(Switch, null, /*#__PURE__*/React.createElement(Route, {
|
|
69
81
|
path: "".concat(konnectorRoot, "/"),
|
|
@@ -71,7 +83,7 @@ var Routes = function Routes(_ref) {
|
|
|
71
83
|
render: function render() {
|
|
72
84
|
return /*#__PURE__*/React.createElement(HarvestModalRoot, {
|
|
73
85
|
accounts: accountsAndTriggers,
|
|
74
|
-
konnector:
|
|
86
|
+
konnector: konnectorWithTriggers
|
|
75
87
|
});
|
|
76
88
|
}
|
|
77
89
|
}), /*#__PURE__*/React.createElement(Route, {
|
|
@@ -80,12 +92,12 @@ var Routes = function Routes(_ref) {
|
|
|
80
92
|
render: function render(_ref2) {
|
|
81
93
|
var match = _ref2.match;
|
|
82
94
|
return /*#__PURE__*/React.createElement(AccountModal, {
|
|
83
|
-
konnector:
|
|
95
|
+
konnector: konnectorWithTriggers,
|
|
84
96
|
accountId: match.params.accountId,
|
|
85
97
|
accountsAndTriggers: accountsAndTriggers,
|
|
86
98
|
onDismiss: onDismiss,
|
|
87
|
-
showNewAccountButton: !
|
|
88
|
-
showAccountSelection: !
|
|
99
|
+
showNewAccountButton: !konnectorWithTriggers.clientSide,
|
|
100
|
+
showAccountSelection: !konnectorWithTriggers.clientSide
|
|
89
101
|
});
|
|
90
102
|
}
|
|
91
103
|
}), /*#__PURE__*/React.createElement(Route, {
|
|
@@ -94,7 +106,7 @@ var Routes = function Routes(_ref) {
|
|
|
94
106
|
render: function render(_ref3) {
|
|
95
107
|
var match = _ref3.match;
|
|
96
108
|
return /*#__PURE__*/React.createElement(EditAccountModal, {
|
|
97
|
-
konnector:
|
|
109
|
+
konnector: konnectorWithTriggers,
|
|
98
110
|
accountId: match.params.accountId,
|
|
99
111
|
accounts: accountsAndTriggers
|
|
100
112
|
});
|
|
@@ -110,7 +122,7 @@ var Routes = function Routes(_ref) {
|
|
|
110
122
|
exact: true,
|
|
111
123
|
render: function render() {
|
|
112
124
|
return /*#__PURE__*/React.createElement(NewAccountModal, {
|
|
113
|
-
konnector:
|
|
125
|
+
konnector: konnectorWithTriggers,
|
|
114
126
|
onDismiss: onDismiss
|
|
115
127
|
});
|
|
116
128
|
}
|
|
@@ -120,7 +132,7 @@ var Routes = function Routes(_ref) {
|
|
|
120
132
|
render: function render(_ref4) {
|
|
121
133
|
var match = _ref4.match;
|
|
122
134
|
return /*#__PURE__*/React.createElement(KonnectorSuccess, {
|
|
123
|
-
konnector:
|
|
135
|
+
konnector: konnectorWithTriggers,
|
|
124
136
|
accountId: match.params.accountId,
|
|
125
137
|
accounts: accountsAndTriggers,
|
|
126
138
|
onDismiss: onDismiss
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
|
+
import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
|
|
3
|
+
import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
|
|
4
|
+
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
5
|
+
|
|
6
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
7
|
+
|
|
8
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
9
|
+
|
|
10
|
+
import _regeneratorRuntime from "@babel/runtime/regenerator";
|
|
11
|
+
import { useClient, Q } from 'cozy-client';
|
|
12
|
+
import CozyRealtime from 'cozy-realtime';
|
|
13
|
+
import { useEffect, useState } from 'react';
|
|
14
|
+
import get from 'lodash/get';
|
|
15
|
+
var TRIGGERS_DOCTYPE = 'io.cozy.triggers';
|
|
16
|
+
var KONNECTORS_DOCTYPE = 'io.cozy.konnectors';
|
|
17
|
+
export var useKonnectorWithTriggers = function useKonnectorWithTriggers(slug, injectedKonnector) {
|
|
18
|
+
var client = useClient();
|
|
19
|
+
|
|
20
|
+
var _useState = useState(true),
|
|
21
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
22
|
+
isFetching = _useState2[0],
|
|
23
|
+
setIsFetching = _useState2[1];
|
|
24
|
+
|
|
25
|
+
var _useState3 = useState([]),
|
|
26
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
27
|
+
triggers = _useState4[0],
|
|
28
|
+
setTriggers = _useState4[1];
|
|
29
|
+
|
|
30
|
+
var _useState5 = useState({}),
|
|
31
|
+
_useState6 = _slicedToArray(_useState5, 2),
|
|
32
|
+
konnector = _useState6[0],
|
|
33
|
+
setKonnector = _useState6[1];
|
|
34
|
+
|
|
35
|
+
useEffect(function () {
|
|
36
|
+
function load() {
|
|
37
|
+
return _load.apply(this, arguments);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function _load() {
|
|
41
|
+
_load = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
|
|
42
|
+
var _yield$Promise$all, _yield$Promise$all2, _konnector, _triggers;
|
|
43
|
+
|
|
44
|
+
return _regeneratorRuntime.wrap(function _callee$(_context) {
|
|
45
|
+
while (1) {
|
|
46
|
+
switch (_context.prev = _context.next) {
|
|
47
|
+
case 0:
|
|
48
|
+
if (!injectedKonnector) {
|
|
49
|
+
_context.next = 5;
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
setKonnector(injectedKonnector);
|
|
54
|
+
setTriggers(injectedKonnector.triggers);
|
|
55
|
+
_context.next = 13;
|
|
56
|
+
break;
|
|
57
|
+
|
|
58
|
+
case 5:
|
|
59
|
+
_context.next = 7;
|
|
60
|
+
return Promise.all([getKonnector(client, slug), getTriggers(client, slug)]);
|
|
61
|
+
|
|
62
|
+
case 7:
|
|
63
|
+
_yield$Promise$all = _context.sent;
|
|
64
|
+
_yield$Promise$all2 = _slicedToArray(_yield$Promise$all, 2);
|
|
65
|
+
_konnector = _yield$Promise$all2[0];
|
|
66
|
+
_triggers = _yield$Promise$all2[1];
|
|
67
|
+
setKonnector(_konnector);
|
|
68
|
+
setTriggers({
|
|
69
|
+
data: _triggers
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
case 13:
|
|
73
|
+
setIsFetching(false);
|
|
74
|
+
|
|
75
|
+
case 14:
|
|
76
|
+
case "end":
|
|
77
|
+
return _context.stop();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}, _callee);
|
|
81
|
+
}));
|
|
82
|
+
return _load.apply(this, arguments);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
load();
|
|
86
|
+
}, [client, injectedKonnector, slug]);
|
|
87
|
+
useEffect(function () {
|
|
88
|
+
var realtime = new CozyRealtime({
|
|
89
|
+
client: client
|
|
90
|
+
});
|
|
91
|
+
realtime.subscribe('created', TRIGGERS_DOCTYPE, onTriggerCreated);
|
|
92
|
+
|
|
93
|
+
function onTriggerCreated(trigger) {
|
|
94
|
+
if (get(trigger, 'message.konnector') === slug) {
|
|
95
|
+
setTriggers([].concat(_toConsumableArray(triggers), [trigger]));
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return function cleanUp() {
|
|
100
|
+
if (realtime) {
|
|
101
|
+
realtime.unsubscribeAll();
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
}, [client, slug, triggers]);
|
|
105
|
+
|
|
106
|
+
var konnectorWithTriggers = _objectSpread(_objectSpread({}, konnector), {}, {
|
|
107
|
+
triggers: triggers
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
return {
|
|
111
|
+
konnectorWithTriggers: konnectorWithTriggers,
|
|
112
|
+
fetching: isFetching
|
|
113
|
+
};
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
function isKonnectorTrigger(doc) {
|
|
117
|
+
return doc._type === TRIGGERS_DOCTYPE && !!doc.message && !!doc.message.konnector;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function getKonnector(_x, _x2) {
|
|
121
|
+
return _getKonnector.apply(this, arguments);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function _getKonnector() {
|
|
125
|
+
_getKonnector = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(client, slug) {
|
|
126
|
+
var result;
|
|
127
|
+
return _regeneratorRuntime.wrap(function _callee2$(_context2) {
|
|
128
|
+
while (1) {
|
|
129
|
+
switch (_context2.prev = _context2.next) {
|
|
130
|
+
case 0:
|
|
131
|
+
_context2.next = 2;
|
|
132
|
+
return client.query(Q(KONNECTORS_DOCTYPE).where({
|
|
133
|
+
slug: slug
|
|
134
|
+
}));
|
|
135
|
+
|
|
136
|
+
case 2:
|
|
137
|
+
result = _context2.sent;
|
|
138
|
+
return _context2.abrupt("return", result.data[0]);
|
|
139
|
+
|
|
140
|
+
case 4:
|
|
141
|
+
case "end":
|
|
142
|
+
return _context2.stop();
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}, _callee2);
|
|
146
|
+
}));
|
|
147
|
+
return _getKonnector.apply(this, arguments);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function getTriggers(_x3, _x4) {
|
|
151
|
+
return _getTriggers.apply(this, arguments);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function _getTriggers() {
|
|
155
|
+
_getTriggers = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(client, slug) {
|
|
156
|
+
var _yield$client$query, allTriggers;
|
|
157
|
+
|
|
158
|
+
return _regeneratorRuntime.wrap(function _callee3$(_context3) {
|
|
159
|
+
while (1) {
|
|
160
|
+
switch (_context3.prev = _context3.next) {
|
|
161
|
+
case 0:
|
|
162
|
+
_context3.next = 2;
|
|
163
|
+
return client.query(Q(TRIGGERS_DOCTYPE).where({
|
|
164
|
+
worker: ['client', 'konnector']
|
|
165
|
+
}));
|
|
166
|
+
|
|
167
|
+
case 2:
|
|
168
|
+
_yield$client$query = _context3.sent;
|
|
169
|
+
allTriggers = _yield$client$query.data;
|
|
170
|
+
return _context3.abrupt("return", allTriggers.filter(function (trigger) {
|
|
171
|
+
return isKonnectorTrigger(trigger) && get(trigger, 'message.konnector') === slug;
|
|
172
|
+
}));
|
|
173
|
+
|
|
174
|
+
case 5:
|
|
175
|
+
case "end":
|
|
176
|
+
return _context3.stop();
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}, _callee3);
|
|
180
|
+
}));
|
|
181
|
+
return _getTriggers.apply(this, arguments);
|
|
182
|
+
}
|
package/dist/locales/nl_NL.json
CHANGED
|
@@ -394,11 +394,19 @@
|
|
|
394
394
|
}
|
|
395
395
|
},
|
|
396
396
|
"oauth": {
|
|
397
|
+
"banking": {
|
|
398
|
+
"connect": {
|
|
399
|
+
"label": "Bank toevoegen"
|
|
400
|
+
},
|
|
401
|
+
"reconnect": {
|
|
402
|
+
"label": "Opnieuw koppelen"
|
|
403
|
+
}
|
|
404
|
+
},
|
|
397
405
|
"reconnect": {
|
|
398
406
|
"label": "Opnieuw koppelen"
|
|
399
407
|
},
|
|
400
408
|
"connect": {
|
|
401
|
-
"label": "
|
|
409
|
+
"label": "Koppelen"
|
|
402
410
|
},
|
|
403
411
|
"window": {
|
|
404
412
|
"title": "OAuth"
|
|
@@ -532,4 +540,4 @@
|
|
|
532
540
|
"caption": "Deze dienst haalt je recentste documenten op en maakt er een volledige back-up van."
|
|
533
541
|
}
|
|
534
542
|
}
|
|
535
|
-
}
|
|
543
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cozy-harvest-lib",
|
|
3
|
-
"version": "9.
|
|
3
|
+
"version": "9.24.2",
|
|
4
4
|
"description": "Provides logic, modules and components for Cozy's harvest applications.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"author": "Cozy",
|
|
@@ -90,5 +90,5 @@
|
|
|
90
90
|
"react-router-dom": "^5.0.1"
|
|
91
91
|
},
|
|
92
92
|
"sideEffects": false,
|
|
93
|
-
"gitHead": "
|
|
93
|
+
"gitHead": "40797e689180f5bed894dbb15c3815dc2639c05b"
|
|
94
94
|
}
|
|
@@ -84,7 +84,7 @@ const InAppBrowserWithIntentsApi = ({ url, onClose, intentsApi = {} }) => {
|
|
|
84
84
|
const urlToOpen = decodeURIComponent(iabUrl.toString())
|
|
85
85
|
logger.debug('url to open: ', urlToOpen)
|
|
86
86
|
const result = await showInAppBrowser(urlToOpen)
|
|
87
|
-
if (result?.
|
|
87
|
+
if (result?.state !== 'dismiss' && result?.state !== 'cancel') {
|
|
88
88
|
logger.error('Unexpected InAppBrowser result', result)
|
|
89
89
|
}
|
|
90
90
|
} catch (err) {
|
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
DialogCloseButton,
|
|
8
8
|
useCozyDialog
|
|
9
9
|
} from 'cozy-ui/transpiled/react/CozyDialogs'
|
|
10
|
+
import Spinner from 'cozy-ui/transpiled/react/Spinner'
|
|
10
11
|
import {
|
|
11
12
|
useVaultUnlockContext,
|
|
12
13
|
VaultUnlockProvider,
|
|
@@ -25,6 +26,7 @@ import DialogContext from './DialogContext'
|
|
|
25
26
|
import { DatacardOptions } from './Datacards/DatacardOptionsContext'
|
|
26
27
|
|
|
27
28
|
import { ViewerModal } from '../datacards/ViewerModal'
|
|
29
|
+
import { useKonnectorWithTriggers } from '../helpers/useKonnectorWithTriggers'
|
|
28
30
|
|
|
29
31
|
/**
|
|
30
32
|
* Dialog will not be centered vertically since we need the modal to "stay in place"
|
|
@@ -48,12 +50,24 @@ const HarvestDialog = withStyles({
|
|
|
48
50
|
return <Dialog disableRestoreFocus {...props} />
|
|
49
51
|
})
|
|
50
52
|
|
|
51
|
-
const Routes = ({
|
|
53
|
+
const Routes = ({
|
|
54
|
+
konnectorRoot,
|
|
55
|
+
konnector,
|
|
56
|
+
konnectorSlug,
|
|
57
|
+
onDismiss,
|
|
58
|
+
datacardOptions
|
|
59
|
+
}) => {
|
|
52
60
|
const dialogContext = useCozyDialog({
|
|
53
61
|
size: 'l',
|
|
54
62
|
open: true,
|
|
55
63
|
onClose: onDismiss
|
|
56
64
|
})
|
|
65
|
+
|
|
66
|
+
const { konnectorWithTriggers, fetching } = useKonnectorWithTriggers(
|
|
67
|
+
konnectorSlug,
|
|
68
|
+
konnector
|
|
69
|
+
)
|
|
70
|
+
|
|
57
71
|
return (
|
|
58
72
|
<DatacardOptions options={datacardOptions}>
|
|
59
73
|
<MountPointProvider baseRoute={konnectorRoot}>
|
|
@@ -62,85 +76,95 @@ const Routes = ({ konnectorRoot, konnector, onDismiss, datacardOptions }) => {
|
|
|
62
76
|
<VaultUnlockProvider>
|
|
63
77
|
<HarvestDialog
|
|
64
78
|
{...dialogContext.dialogProps}
|
|
65
|
-
aria-label={
|
|
79
|
+
aria-label={konnectorWithTriggers.name}
|
|
66
80
|
>
|
|
67
81
|
<DialogCloseButton onClick={onDismiss} />
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
<
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
<ViewerModal {...routeComponentProps} />
|
|
111
|
-
)}
|
|
112
|
-
/>
|
|
113
|
-
<Route
|
|
114
|
-
path={`${konnectorRoot}/new`}
|
|
115
|
-
exact
|
|
116
|
-
render={() => (
|
|
117
|
-
<NewAccountModal
|
|
118
|
-
konnector={konnector}
|
|
119
|
-
onDismiss={onDismiss}
|
|
120
|
-
/>
|
|
121
|
-
)}
|
|
122
|
-
/>
|
|
123
|
-
<Route
|
|
124
|
-
path={`${konnectorRoot}/accounts/:accountId/success`}
|
|
125
|
-
exact
|
|
126
|
-
render={({ match }) => {
|
|
127
|
-
return (
|
|
128
|
-
<KonnectorSuccess
|
|
129
|
-
konnector={konnector}
|
|
82
|
+
{fetching ? (
|
|
83
|
+
<div className="u-pv-2 u-ta-center">
|
|
84
|
+
<Spinner size="xxlarge" />
|
|
85
|
+
</div>
|
|
86
|
+
) : (
|
|
87
|
+
<KonnectorAccounts konnector={konnectorWithTriggers}>
|
|
88
|
+
{accountsAndTriggers => (
|
|
89
|
+
<Switch>
|
|
90
|
+
<Route
|
|
91
|
+
path={`${konnectorRoot}/`}
|
|
92
|
+
exact
|
|
93
|
+
render={() => (
|
|
94
|
+
<HarvestModalRoot
|
|
95
|
+
accounts={accountsAndTriggers}
|
|
96
|
+
konnector={konnectorWithTriggers}
|
|
97
|
+
/>
|
|
98
|
+
)}
|
|
99
|
+
/>
|
|
100
|
+
<Route
|
|
101
|
+
path={`${konnectorRoot}/accounts/:accountId`}
|
|
102
|
+
exact
|
|
103
|
+
render={({ match }) => (
|
|
104
|
+
<AccountModal
|
|
105
|
+
konnector={konnectorWithTriggers}
|
|
106
|
+
accountId={match.params.accountId}
|
|
107
|
+
accountsAndTriggers={accountsAndTriggers}
|
|
108
|
+
onDismiss={onDismiss}
|
|
109
|
+
showNewAccountButton={
|
|
110
|
+
!konnectorWithTriggers.clientSide
|
|
111
|
+
}
|
|
112
|
+
showAccountSelection={
|
|
113
|
+
!konnectorWithTriggers.clientSide
|
|
114
|
+
}
|
|
115
|
+
/>
|
|
116
|
+
)}
|
|
117
|
+
/>
|
|
118
|
+
<Route
|
|
119
|
+
path={`${konnectorRoot}/accounts/:accountId/edit`}
|
|
120
|
+
exact
|
|
121
|
+
render={({ match }) => (
|
|
122
|
+
<EditAccountModal
|
|
123
|
+
konnector={konnectorWithTriggers}
|
|
130
124
|
accountId={match.params.accountId}
|
|
131
125
|
accounts={accountsAndTriggers}
|
|
126
|
+
/>
|
|
127
|
+
)}
|
|
128
|
+
/>
|
|
129
|
+
<Route
|
|
130
|
+
path={`${konnectorRoot}/viewer/:accountId/:folderToSaveId/:fileIndex`}
|
|
131
|
+
exact
|
|
132
|
+
render={routeComponentProps => (
|
|
133
|
+
<ViewerModal {...routeComponentProps} />
|
|
134
|
+
)}
|
|
135
|
+
/>
|
|
136
|
+
<Route
|
|
137
|
+
path={`${konnectorRoot}/new`}
|
|
138
|
+
exact
|
|
139
|
+
render={() => (
|
|
140
|
+
<NewAccountModal
|
|
141
|
+
konnector={konnectorWithTriggers}
|
|
132
142
|
onDismiss={onDismiss}
|
|
133
143
|
/>
|
|
134
|
-
)
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
+
)}
|
|
145
|
+
/>
|
|
146
|
+
<Route
|
|
147
|
+
path={`${konnectorRoot}/accounts/:accountId/success`}
|
|
148
|
+
exact
|
|
149
|
+
render={({ match }) => {
|
|
150
|
+
return (
|
|
151
|
+
<KonnectorSuccess
|
|
152
|
+
konnector={konnectorWithTriggers}
|
|
153
|
+
accountId={match.params.accountId}
|
|
154
|
+
accounts={accountsAndTriggers}
|
|
155
|
+
onDismiss={onDismiss}
|
|
156
|
+
/>
|
|
157
|
+
)
|
|
158
|
+
}}
|
|
159
|
+
/>
|
|
160
|
+
<Redirect
|
|
161
|
+
from={`${konnectorRoot}/*`}
|
|
162
|
+
to={`${konnectorRoot}/`}
|
|
163
|
+
/>
|
|
164
|
+
</Switch>
|
|
165
|
+
)}
|
|
166
|
+
</KonnectorAccounts>
|
|
167
|
+
)}
|
|
144
168
|
</HarvestDialog>
|
|
145
169
|
<VaultUnlockPlaceholder />
|
|
146
170
|
</VaultUnlockProvider>
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { useClient, Q } from 'cozy-client'
|
|
2
|
+
import CozyRealtime from 'cozy-realtime'
|
|
3
|
+
import { useEffect, useState } from 'react'
|
|
4
|
+
import get from 'lodash/get'
|
|
5
|
+
|
|
6
|
+
const TRIGGERS_DOCTYPE = 'io.cozy.triggers'
|
|
7
|
+
const KONNECTORS_DOCTYPE = 'io.cozy.konnectors'
|
|
8
|
+
|
|
9
|
+
export const useKonnectorWithTriggers = (slug, injectedKonnector) => {
|
|
10
|
+
const client = useClient()
|
|
11
|
+
const [isFetching, setIsFetching] = useState(true)
|
|
12
|
+
const [triggers, setTriggers] = useState([])
|
|
13
|
+
const [konnector, setKonnector] = useState({})
|
|
14
|
+
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
async function load() {
|
|
17
|
+
if (injectedKonnector) {
|
|
18
|
+
setKonnector(injectedKonnector)
|
|
19
|
+
setTriggers(injectedKonnector.triggers)
|
|
20
|
+
} else {
|
|
21
|
+
const [konnector, triggers] = await Promise.all([
|
|
22
|
+
getKonnector(client, slug),
|
|
23
|
+
getTriggers(client, slug)
|
|
24
|
+
])
|
|
25
|
+
setKonnector(konnector)
|
|
26
|
+
setTriggers({ data: triggers })
|
|
27
|
+
}
|
|
28
|
+
setIsFetching(false)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
load()
|
|
32
|
+
}, [client, injectedKonnector, slug])
|
|
33
|
+
|
|
34
|
+
useEffect(() => {
|
|
35
|
+
const realtime = new CozyRealtime({ client })
|
|
36
|
+
realtime.subscribe('created', TRIGGERS_DOCTYPE, onTriggerCreated)
|
|
37
|
+
function onTriggerCreated(trigger) {
|
|
38
|
+
if (get(trigger, 'message.konnector') === slug) {
|
|
39
|
+
setTriggers([...triggers, trigger])
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return function cleanUp() {
|
|
43
|
+
if (realtime) {
|
|
44
|
+
realtime.unsubscribeAll()
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}, [client, slug, triggers])
|
|
48
|
+
|
|
49
|
+
const konnectorWithTriggers = {
|
|
50
|
+
...konnector,
|
|
51
|
+
triggers
|
|
52
|
+
}
|
|
53
|
+
return { konnectorWithTriggers, fetching: isFetching }
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function isKonnectorTrigger(doc) {
|
|
57
|
+
return (
|
|
58
|
+
doc._type === TRIGGERS_DOCTYPE && !!doc.message && !!doc.message.konnector
|
|
59
|
+
)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
async function getKonnector(client, slug) {
|
|
63
|
+
const result = await client.query(Q(KONNECTORS_DOCTYPE).where({ slug: slug }))
|
|
64
|
+
return result.data[0]
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
async function getTriggers(client, slug) {
|
|
68
|
+
const { data: allTriggers } = await client.query(
|
|
69
|
+
Q(TRIGGERS_DOCTYPE).where({ worker: ['client', 'konnector'] })
|
|
70
|
+
)
|
|
71
|
+
return allTriggers.filter(
|
|
72
|
+
trigger =>
|
|
73
|
+
isKonnectorTrigger(trigger) && get(trigger, 'message.konnector') === slug
|
|
74
|
+
)
|
|
75
|
+
}
|
package/src/locales/nl_NL.json
CHANGED
|
@@ -394,11 +394,19 @@
|
|
|
394
394
|
}
|
|
395
395
|
},
|
|
396
396
|
"oauth": {
|
|
397
|
+
"banking": {
|
|
398
|
+
"connect": {
|
|
399
|
+
"label": "Bank toevoegen"
|
|
400
|
+
},
|
|
401
|
+
"reconnect": {
|
|
402
|
+
"label": "Opnieuw koppelen"
|
|
403
|
+
}
|
|
404
|
+
},
|
|
397
405
|
"reconnect": {
|
|
398
406
|
"label": "Opnieuw koppelen"
|
|
399
407
|
},
|
|
400
408
|
"connect": {
|
|
401
|
-
"label": "
|
|
409
|
+
"label": "Koppelen"
|
|
402
410
|
},
|
|
403
411
|
"window": {
|
|
404
412
|
"title": "OAuth"
|
|
@@ -532,4 +540,4 @@
|
|
|
532
540
|
"caption": "Deze dienst haalt je recentste documenten op en maakt er een volledige back-up van."
|
|
533
541
|
}
|
|
534
542
|
}
|
|
535
|
-
}
|
|
543
|
+
}
|