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 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.type) !== 'dismiss' && (result === null || result === void 0 ? void 0 : result.type) !== 'cancel') {
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": konnector.name
70
+ "aria-label": konnectorWithTriggers.name
63
71
  }), /*#__PURE__*/React.createElement(DialogCloseButton, {
64
72
  onClick: onDismiss
65
- }), /*#__PURE__*/React.createElement(KonnectorAccounts, {
66
- konnector: konnector
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: 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: konnector,
95
+ konnector: konnectorWithTriggers,
84
96
  accountId: match.params.accountId,
85
97
  accountsAndTriggers: accountsAndTriggers,
86
98
  onDismiss: onDismiss,
87
- showNewAccountButton: !konnector.clientSide,
88
- showAccountSelection: !konnector.clientSide
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: 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: 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: 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
+ }
@@ -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": "Bank toevoegen"
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.23.4",
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": "068fddf874b770dfe0858dec376e999c2aa26f87"
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?.type !== 'dismiss' && result?.type !== 'cancel') {
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 = ({ konnectorRoot, konnector, onDismiss, datacardOptions }) => {
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={konnector.name}
79
+ aria-label={konnectorWithTriggers.name}
66
80
  >
67
81
  <DialogCloseButton onClick={onDismiss} />
68
- <KonnectorAccounts konnector={konnector}>
69
- {accountsAndTriggers => (
70
- <Switch>
71
- <Route
72
- path={`${konnectorRoot}/`}
73
- exact
74
- render={() => (
75
- <HarvestModalRoot
76
- accounts={accountsAndTriggers}
77
- konnector={konnector}
78
- />
79
- )}
80
- />
81
- <Route
82
- path={`${konnectorRoot}/accounts/:accountId`}
83
- exact
84
- render={({ match }) => (
85
- <AccountModal
86
- konnector={konnector}
87
- accountId={match.params.accountId}
88
- accountsAndTriggers={accountsAndTriggers}
89
- onDismiss={onDismiss}
90
- showNewAccountButton={!konnector.clientSide}
91
- showAccountSelection={!konnector.clientSide}
92
- />
93
- )}
94
- />
95
- <Route
96
- path={`${konnectorRoot}/accounts/:accountId/edit`}
97
- exact
98
- render={({ match }) => (
99
- <EditAccountModal
100
- konnector={konnector}
101
- accountId={match.params.accountId}
102
- accounts={accountsAndTriggers}
103
- />
104
- )}
105
- />
106
- <Route
107
- path={`${konnectorRoot}/viewer/:accountId/:folderToSaveId/:fileIndex`}
108
- exact
109
- render={routeComponentProps => (
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
- <Redirect
138
- from={`${konnectorRoot}/*`}
139
- to={`${konnectorRoot}/`}
140
- />
141
- </Switch>
142
- )}
143
- </KonnectorAccounts>
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
+ }
@@ -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": "Bank toevoegen"
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
+ }