newspack-components 4.3.0 → 4.4.0-alpha.1

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.
Files changed (263) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/DEVELOPMENT.md +868 -0
  3. package/colors/colors.module.scss +52 -2
  4. package/copy-styles.js +3 -2
  5. package/dist/cjs/accordion/index.js +17 -12
  6. package/dist/cjs/action-card/index.js +176 -139
  7. package/dist/cjs/autocomplete-tokenfield/index.js +254 -234
  8. package/dist/cjs/autocomplete-with-latest-posts/index.js +172 -110
  9. package/dist/cjs/autocomplete-with-suggestions/index.js +229 -126
  10. package/dist/cjs/badge/index.js +7 -7
  11. package/dist/cjs/box-contrast/index.js +19 -15
  12. package/dist/cjs/button/index.js +41 -26
  13. package/dist/cjs/button-props/button-props.js +5 -5
  14. package/dist/cjs/button-props/index.js +2 -2
  15. package/dist/cjs/card/core-card.js +110 -52
  16. package/dist/cjs/card/index.js +74 -67
  17. package/dist/cjs/card/style-core.scss +93 -25
  18. package/dist/cjs/card/style.scss +2 -2
  19. package/dist/cjs/card-feature/index.js +141 -0
  20. package/dist/cjs/card-feature/style.scss +75 -0
  21. package/dist/cjs/card-form/index.js +144 -0
  22. package/dist/cjs/card-form/style.scss +20 -0
  23. package/dist/cjs/card-settings-group/index.js +36 -16
  24. package/dist/cjs/card-sortable-list/index.js +176 -140
  25. package/dist/cjs/category-autocomplete/index.js +175 -155
  26. package/dist/cjs/color-picker/index.js +41 -23
  27. package/dist/cjs/color-picker/index.test.js +82 -0
  28. package/dist/cjs/color-picker/style.scss +11 -13
  29. package/dist/cjs/confirm-dialog/index.js +86 -22
  30. package/dist/cjs/consts.js +1 -1
  31. package/dist/cjs/custom-select-control/index.js +39 -28
  32. package/dist/cjs/dataviews/index.js +38 -0
  33. package/dist/cjs/dataviews/style.scss +9 -0
  34. package/dist/cjs/divider/index.js +26 -21
  35. package/dist/cjs/footer/index.js +36 -30
  36. package/dist/cjs/form-token-field/index.js +51 -40
  37. package/dist/cjs/global-notices/index.js +5 -5
  38. package/dist/cjs/grid/index.js +25 -19
  39. package/dist/cjs/grid/style.scss +6 -1
  40. package/dist/cjs/handoff/index.js +204 -156
  41. package/dist/cjs/handoff-message/index.js +12 -7
  42. package/dist/cjs/hooks/index.js +10 -8
  43. package/dist/cjs/hooks/use-confirm-dialog.js +79 -0
  44. package/dist/cjs/hooks/use-unsaved-changes-dialog.js +144 -0
  45. package/dist/cjs/hooks/useObjectState.js +21 -12
  46. package/dist/cjs/hooks/useObjectState.test.js +55 -33
  47. package/dist/cjs/hooks/useOnClickOutside.js +6 -6
  48. package/dist/cjs/hooks/usePrompt.js +10 -13
  49. package/dist/cjs/image-upload/index.js +114 -123
  50. package/dist/cjs/image-upload/index.test.js +11 -13
  51. package/dist/cjs/image-upload/style.scss +12 -40
  52. package/dist/cjs/index.js +136 -104
  53. package/dist/cjs/info-button/index.js +43 -32
  54. package/dist/cjs/integration-icons/active-campaign.js +22 -0
  55. package/dist/cjs/integration-icons/constant-contact.js +28 -0
  56. package/dist/cjs/integration-icons/fundraise-up.js +25 -0
  57. package/dist/cjs/integration-icons/index.js +48 -0
  58. package/dist/cjs/integration-icons/mailchimp.js +19 -0
  59. package/dist/cjs/integration-icons/salesforce.js +17 -0
  60. package/dist/cjs/integration-icons/wisepops.js +20 -0
  61. package/dist/cjs/modal/index.js +22 -19
  62. package/dist/cjs/modal/style.scss +4 -0
  63. package/dist/cjs/newspack-icon/index.js +45 -38
  64. package/dist/cjs/notice/index.js +64 -55
  65. package/dist/cjs/plugin-installer/index.js +259 -253
  66. package/dist/cjs/plugin-settings/SettingsSection.js +66 -60
  67. package/dist/cjs/plugin-settings/index.js +217 -200
  68. package/dist/cjs/plugin-toggle/index.js +192 -199
  69. package/dist/cjs/popover/index.js +41 -28
  70. package/dist/cjs/position-control/index.js +24 -23
  71. package/dist/cjs/progress-bar/index.js +71 -59
  72. package/dist/cjs/progress-bar/index.test.js +62 -68
  73. package/dist/cjs/proxied-imports/router.js +3 -3
  74. package/dist/cjs/radio-control/index.js +40 -27
  75. package/dist/cjs/section-header/index.js +103 -58
  76. package/dist/cjs/section-header/style.scss +31 -11
  77. package/dist/cjs/select-control/ButtonGroupControl.js +26 -21
  78. package/dist/cjs/select-control/GroupedSelectControl.js +41 -35
  79. package/dist/cjs/select-control/index.js +52 -40
  80. package/dist/cjs/settings/MinMaxSetting.js +30 -20
  81. package/dist/cjs/settings/SettingsCard.js +20 -17
  82. package/dist/cjs/settings/SettingsSection.js +22 -21
  83. package/dist/cjs/settings/index.js +5 -5
  84. package/dist/cjs/sortable-newsletter-list-control/index.js +78 -57
  85. package/dist/cjs/steps-list/index.js +44 -34
  86. package/dist/cjs/steps-list-item/index.js +47 -39
  87. package/dist/cjs/style-card/index.js +70 -63
  88. package/dist/cjs/tabbed-navigation/index.js +38 -36
  89. package/dist/cjs/text-control/index.js +27 -25
  90. package/dist/cjs/utils/color.js +4 -4
  91. package/dist/cjs/utils/editor-toolbar-back-button.js +61 -0
  92. package/dist/cjs/utils/index.js +31 -19
  93. package/dist/cjs/utils/style.scss +8 -0
  94. package/dist/cjs/waiting/index.js +48 -37
  95. package/dist/cjs/web-preview/index.js +217 -211
  96. package/dist/cjs/with-wizard/index.js +362 -364
  97. package/dist/cjs/with-wizard/style.scss +4 -54
  98. package/dist/cjs/with-wizard-screen/index.js +54 -58
  99. package/dist/cjs/with-wizard-screen/style.scss +41 -3
  100. package/dist/cjs/wizard/components/WizardError.js +20 -18
  101. package/dist/cjs/wizard/components/WizardSnackbar.js +26 -23
  102. package/dist/cjs/wizard/index.js +176 -114
  103. package/dist/cjs/wizard/store/index.js +171 -123
  104. package/dist/cjs/wizard/store/utils.js +13 -8
  105. package/dist/esm/accordion/index.js +14 -9
  106. package/dist/esm/action-card/index.js +168 -123
  107. package/dist/esm/autocomplete-tokenfield/index.js +248 -222
  108. package/dist/esm/autocomplete-with-latest-posts/index.js +169 -103
  109. package/dist/esm/autocomplete-with-suggestions/index.js +226 -119
  110. package/dist/esm/badge/index.js +5 -5
  111. package/dist/esm/box-contrast/index.js +15 -11
  112. package/dist/esm/button/index.js +39 -21
  113. package/dist/esm/button-props/button-props.js +1 -1
  114. package/dist/esm/card/core-card.js +109 -47
  115. package/dist/esm/card/index.js +69 -54
  116. package/dist/esm/card/style-core.scss +93 -25
  117. package/dist/esm/card/style.scss +2 -2
  118. package/dist/esm/card-feature/index.js +131 -0
  119. package/dist/esm/card-feature/style.scss +75 -0
  120. package/dist/esm/card-form/index.js +134 -0
  121. package/dist/esm/card-form/style.scss +20 -0
  122. package/dist/esm/card-settings-group/index.js +33 -14
  123. package/dist/esm/card-sortable-list/index.js +170 -126
  124. package/dist/esm/category-autocomplete/index.js +168 -140
  125. package/dist/esm/color-picker/index.js +39 -21
  126. package/dist/esm/color-picker/index.test.js +78 -0
  127. package/dist/esm/color-picker/style.scss +11 -13
  128. package/dist/esm/confirm-dialog/index.js +85 -18
  129. package/dist/esm/consts.js +1 -1
  130. package/dist/esm/custom-select-control/index.js +34 -15
  131. package/dist/esm/dataviews/index.js +34 -0
  132. package/dist/esm/dataviews/style.scss +9 -0
  133. package/dist/esm/divider/index.js +24 -16
  134. package/dist/esm/footer/index.js +34 -28
  135. package/dist/esm/form-token-field/index.js +46 -27
  136. package/dist/esm/global-notices/index.js +3 -3
  137. package/dist/esm/grid/index.js +23 -14
  138. package/dist/esm/grid/style.scss +6 -1
  139. package/dist/esm/handoff/index.js +199 -143
  140. package/dist/esm/handoff-message/index.js +10 -6
  141. package/dist/esm/hooks/index.js +8 -6
  142. package/dist/esm/hooks/use-confirm-dialog.js +73 -0
  143. package/dist/esm/hooks/use-unsaved-changes-dialog.js +136 -0
  144. package/dist/esm/hooks/useObjectState.js +19 -9
  145. package/dist/esm/hooks/useObjectState.test.js +54 -32
  146. package/dist/esm/hooks/useOnClickOutside.js +4 -4
  147. package/dist/esm/hooks/usePrompt.js +9 -11
  148. package/dist/esm/image-upload/index.js +110 -111
  149. package/dist/esm/image-upload/index.test.js +11 -13
  150. package/dist/esm/image-upload/style.scss +12 -40
  151. package/dist/esm/index.js +7 -1
  152. package/dist/esm/info-button/index.js +38 -19
  153. package/dist/esm/integration-icons/active-campaign.js +16 -0
  154. package/dist/esm/integration-icons/constant-contact.js +22 -0
  155. package/dist/esm/integration-icons/fundraise-up.js +19 -0
  156. package/dist/esm/integration-icons/index.js +6 -0
  157. package/dist/esm/integration-icons/mailchimp.js +13 -0
  158. package/dist/esm/integration-icons/salesforce.js +11 -0
  159. package/dist/esm/integration-icons/wisepops.js +14 -0
  160. package/dist/esm/modal/index.js +20 -13
  161. package/dist/esm/modal/style.scss +4 -0
  162. package/dist/esm/newspack-icon/index.js +40 -25
  163. package/dist/esm/notice/index.js +59 -42
  164. package/dist/esm/plugin-installer/index.js +255 -243
  165. package/dist/esm/plugin-settings/SettingsSection.js +61 -50
  166. package/dist/esm/plugin-settings/index.js +212 -189
  167. package/dist/esm/plugin-toggle/index.js +187 -190
  168. package/dist/esm/popover/index.js +35 -16
  169. package/dist/esm/position-control/index.js +22 -18
  170. package/dist/esm/progress-bar/index.js +66 -49
  171. package/dist/esm/progress-bar/index.test.js +61 -67
  172. package/dist/esm/radio-control/index.js +34 -15
  173. package/dist/esm/section-header/index.js +102 -57
  174. package/dist/esm/section-header/style.scss +31 -11
  175. package/dist/esm/select-control/ButtonGroupControl.js +23 -18
  176. package/dist/esm/select-control/GroupedSelectControl.js +38 -30
  177. package/dist/esm/select-control/index.js +47 -27
  178. package/dist/esm/settings/MinMaxSetting.js +27 -16
  179. package/dist/esm/settings/SettingsCard.js +18 -13
  180. package/dist/esm/settings/SettingsSection.js +20 -19
  181. package/dist/esm/settings/index.js +3 -3
  182. package/dist/esm/sortable-newsletter-list-control/index.js +74 -53
  183. package/dist/esm/steps-list/index.js +39 -21
  184. package/dist/esm/steps-list-item/index.js +42 -26
  185. package/dist/esm/style-card/index.js +65 -50
  186. package/dist/esm/tabbed-navigation/index.js +35 -33
  187. package/dist/esm/text-control/index.js +25 -19
  188. package/dist/esm/utils/color.js +4 -4
  189. package/dist/esm/utils/editor-toolbar-back-button.js +53 -0
  190. package/dist/esm/utils/index.js +29 -16
  191. package/dist/esm/utils/style.scss +8 -0
  192. package/dist/esm/waiting/index.js +43 -24
  193. package/dist/esm/web-preview/index.js +213 -201
  194. package/dist/esm/with-wizard/index.js +360 -358
  195. package/dist/esm/with-wizard/style.scss +4 -54
  196. package/dist/esm/with-wizard-screen/index.js +48 -46
  197. package/dist/esm/with-wizard-screen/style.scss +41 -3
  198. package/dist/esm/wizard/components/WizardError.js +18 -16
  199. package/dist/esm/wizard/components/WizardSnackbar.js +23 -17
  200. package/dist/esm/wizard/index.js +171 -103
  201. package/dist/esm/wizard/store/index.js +169 -116
  202. package/dist/esm/wizard/store/utils.js +13 -6
  203. package/package.json +30 -16
  204. package/release.config.js +1 -0
  205. package/shared/hooks/use-coauthors.js +195 -27
  206. package/shared/hooks/use-coauthors.test.js +232 -6
  207. package/shared/scss/_mixins.scss +13 -5
  208. package/src/accordion/index.js +8 -7
  209. package/src/action-card/index.js +15 -1
  210. package/src/badge/index.tsx +3 -1
  211. package/src/card/core-card.js +95 -18
  212. package/src/card/index.js +1 -0
  213. package/src/card/style-core.scss +93 -25
  214. package/src/card/style.scss +2 -2
  215. package/src/card-feature/README.md +188 -0
  216. package/src/card-feature/index.tsx +186 -0
  217. package/src/card-feature/style.scss +75 -0
  218. package/src/card-form/README.md +113 -0
  219. package/src/card-form/index.tsx +128 -0
  220. package/src/card-form/style.scss +20 -0
  221. package/src/card-settings-group/index.tsx +28 -3
  222. package/src/card-sortable-list/index.tsx +27 -4
  223. package/src/color-picker/index.js +15 -8
  224. package/src/color-picker/index.test.js +52 -0
  225. package/src/color-picker/style.scss +11 -13
  226. package/src/confirm-dialog/README.md +128 -0
  227. package/src/confirm-dialog/index.tsx +74 -6
  228. package/src/dataviews/index.tsx +34 -0
  229. package/src/dataviews/style.scss +9 -0
  230. package/src/grid/style.scss +6 -1
  231. package/src/handoff/README.md +93 -0
  232. package/src/handoff/index.js +46 -8
  233. package/src/hooks/index.ts +2 -1
  234. package/src/hooks/use-confirm-dialog.tsx +80 -0
  235. package/src/hooks/use-unsaved-changes-dialog.tsx +140 -0
  236. package/src/image-upload/index.js +10 -15
  237. package/src/image-upload/style.scss +12 -40
  238. package/src/index.js +7 -1
  239. package/src/integration-icons/active-campaign.js +14 -0
  240. package/src/integration-icons/constant-contact.js +22 -0
  241. package/src/integration-icons/fundraise-up.js +18 -0
  242. package/src/integration-icons/index.js +6 -0
  243. package/src/integration-icons/mailchimp.js +10 -0
  244. package/src/integration-icons/salesforce.js +10 -0
  245. package/src/integration-icons/wisepops.js +14 -0
  246. package/src/modal/style.scss +4 -0
  247. package/src/plugin-installer/index.js +30 -19
  248. package/src/section-header/index.js +56 -24
  249. package/src/section-header/style.scss +31 -11
  250. package/src/select-control/index.js +4 -0
  251. package/src/utils/editor-toolbar-back-button.tsx +48 -0
  252. package/src/utils/index.js +6 -0
  253. package/src/utils/style.scss +8 -0
  254. package/src/with-wizard/style.scss +4 -54
  255. package/src/with-wizard-screen/style.scss +41 -3
  256. package/src/wizard/index.js +90 -53
  257. package/src/wizard/store/index.js +2 -2
  258. package/dist/cjs/button-card/index.js +0 -72
  259. package/dist/cjs/button-card/style.scss +0 -180
  260. package/dist/esm/button-card/index.js +0 -64
  261. package/dist/esm/button-card/style.scss +0 -180
  262. package/src/button-card/index.js +0 -52
  263. package/src/button-card/style.scss +0 -180
@@ -4,7 +4,13 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.default = void 0;
7
+ exports["default"] = void 0;
8
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
9
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
10
+ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
11
+ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
12
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
13
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
8
14
  var _apiFetch = _interopRequireDefault(require("@wordpress/api-fetch"));
9
15
  var _element = require("@wordpress/element");
10
16
  var _i18n = require("@wordpress/i18n");
@@ -13,22 +19,20 @@ var _ = require("../");
13
19
  require("./style.scss");
14
20
  var _classnames = _interopRequireDefault(require("classnames"));
15
21
  var _jsxRuntime = require("react/jsx-runtime");
16
- /**
22
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
23
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
24
+ function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
25
+ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } /**
17
26
  * Plugin Installer
18
- */
19
-
20
- /**
27
+ */ /**
21
28
  * WordPress dependencies.
22
- */
23
-
24
- /**
29
+ */ /**
25
30
  * Internal dependencies.
26
31
  */
27
-
28
- const PLUGIN_STATE_NONE = 0;
29
- const PLUGIN_STATE_ACTIVE = 1;
30
- const PLUGIN_STATE_INSTALLING = 2;
31
- const PLUGIN_STATE_ERROR = 3;
32
+ var PLUGIN_STATE_NONE = 0;
33
+ var PLUGIN_STATE_ACTIVE = 1;
34
+ var PLUGIN_STATE_INSTALLING = 2;
35
+ var PLUGIN_STATE_ERROR = 3;
32
36
 
33
37
  /**
34
38
  * External dependencies.
@@ -37,261 +41,263 @@ const PLUGIN_STATE_ERROR = 3;
37
41
  /**
38
42
  * Plugin installer.
39
43
  */
40
- class PluginInstaller extends _element.Component {
41
- constructor() {
42
- super(...arguments);
43
- this.state = {
44
- pluginInfo: {},
45
- installationInitialized: false
46
- };
47
- }
48
- componentDidMount = () => {
49
- const {
50
- plugins
51
- } = this.props;
52
- this.retrievePluginInfo(plugins).then(() => {
53
- if (this.props.autoInstall) {
54
- this.installAllPlugins();
55
- }
56
- });
57
- };
58
- componentDidUpdate = prevProps => {
59
- const {
60
- autoInstall,
61
- plugins
62
- } = this.props;
63
- const {
64
- installationInitialized
65
- } = this.state;
66
- if (plugins !== prevProps.plugins) {
67
- this.retrievePluginInfo(plugins);
68
- }
69
- if (autoInstall && !installationInitialized) {
70
- this.installAllPlugins();
71
- }
72
- };
73
- retrievePluginInfo = plugins => {
74
- return new Promise(resolve => {
75
- (0, _apiFetch.default)({
76
- path: '/newspack/v1/plugins/'
77
- }).then(response => {
78
- const pluginInfo = Object.keys(response).reduce((result, slug) => {
79
- if (plugins.indexOf(slug) === -1) {
80
- return result;
81
- }
82
- result[slug] = {
83
- ...response[slug],
84
- installationStatus: response[slug].Status === 'active' ? PLUGIN_STATE_ACTIVE : PLUGIN_STATE_NONE
85
- };
86
- return result;
87
- }, {});
88
- this.updatePluginInfo(pluginInfo).then(() => resolve());
89
- });
90
- });
91
- };
92
- installAllPlugins = () => {
93
- const {
94
- pluginInfo
95
- } = this.state;
96
- this.setState({
97
- installationInitialized: true
98
- });
99
- const promises = Object.keys(pluginInfo).filter(slug => 'active' !== pluginInfo[slug].Status).map(slug => () => this.installPlugin(slug));
100
- promises.reduce((promise, action) => promise.then(result => action().then(Array.prototype.concat.bind(result))), Promise.resolve([]));
101
- };
102
- installPlugin = slug => {
103
- this.setInstallationStatus(slug, PLUGIN_STATE_INSTALLING);
104
- const params = {
105
- path: `/newspack/v1/plugins/${slug}/configure/`,
106
- method: 'post'
107
- };
108
- return (0, _apiFetch.default)(params).then(response => {
109
- const {
110
- pluginInfo
111
- } = this.state;
112
- this.props.onInstalled(slug);
113
- this.updatePluginInfo({
114
- ...pluginInfo,
115
- [slug]: {
116
- ...response,
117
- installationStatus: PLUGIN_STATE_ACTIVE
44
+ var PluginInstaller = /*#__PURE__*/function (_Component) {
45
+ function PluginInstaller() {
46
+ var _this;
47
+ (0, _classCallCheck2["default"])(this, PluginInstaller);
48
+ _this = _callSuper(this, PluginInstaller, arguments);
49
+ (0, _defineProperty2["default"])(_this, "componentDidMount", function () {
50
+ var plugins = _this.props.plugins;
51
+ _this.retrievePluginInfo(plugins).then(function () {
52
+ if (_this.props.autoInstall) {
53
+ _this.installAllPlugins();
118
54
  }
119
55
  });
120
- }).catch(error => {
121
- this.setInstallationStatus(slug, PLUGIN_STATE_ERROR, error.message);
122
56
  });
123
- };
124
- setChecked = (slug, checked) => {
125
- const {
126
- pluginInfo
127
- } = this.state;
128
- this.updatePluginInfo({
129
- ...pluginInfo,
130
- [slug]: {
131
- ...pluginInfo[slug],
132
- checked
57
+ (0, _defineProperty2["default"])(_this, "componentDidUpdate", function (prevProps) {
58
+ var _this$props = _this.props,
59
+ autoInstall = _this$props.autoInstall,
60
+ plugins = _this$props.plugins;
61
+ var installationInitialized = _this.state.installationInitialized;
62
+ if (plugins !== prevProps.plugins) {
63
+ _this.retrievePluginInfo(plugins);
133
64
  }
134
- });
135
- };
136
- setInstallationStatus = (slug, installationStatus, notification = null) => {
137
- const {
138
- pluginInfo
139
- } = this.state;
140
- this.updatePluginInfo({
141
- ...pluginInfo,
142
- [slug]: {
143
- ...pluginInfo[slug],
144
- installationStatus,
145
- notification
65
+ if (autoInstall && !installationInitialized) {
66
+ _this.installAllPlugins();
146
67
  }
147
68
  });
148
- };
149
- updatePluginInfo = pluginInfo => {
150
- return new Promise(resolve => {
151
- const {
152
- onStatus
153
- } = this.props;
154
- this.setState({
155
- pluginInfo
156
- }, () => {
157
- const complete = Object.values(pluginInfo).every(plugin => {
158
- return 'active' === plugin.Status;
69
+ (0, _defineProperty2["default"])(_this, "retrievePluginInfo", function (plugins) {
70
+ return new Promise(function (resolve) {
71
+ (0, _apiFetch["default"])({
72
+ path: '/newspack/v1/plugins/'
73
+ }).then(function (response) {
74
+ var pluginInfo = Object.keys(response).reduce(function (result, slug) {
75
+ if (plugins.indexOf(slug) === -1) {
76
+ return result;
77
+ }
78
+ result[slug] = _objectSpread(_objectSpread({}, response[slug]), {}, {
79
+ installationStatus: response[slug].Status === 'active' ? PLUGIN_STATE_ACTIVE : PLUGIN_STATE_NONE
80
+ });
81
+ return result;
82
+ }, {});
83
+ _this.updatePluginInfo(pluginInfo).then(function () {
84
+ return resolve();
85
+ });
86
+ });
87
+ });
88
+ });
89
+ (0, _defineProperty2["default"])(_this, "installAllPlugins", function () {
90
+ var pluginInfo = _this.state.pluginInfo;
91
+ _this.setState({
92
+ installationInitialized: true
93
+ });
94
+ var promises = Object.keys(pluginInfo).filter(function (slug) {
95
+ return 'active' !== pluginInfo[slug].Status;
96
+ }).map(function (slug) {
97
+ return function () {
98
+ return _this.installPlugin(slug);
99
+ };
100
+ });
101
+ promises.reduce(function (promise, action) {
102
+ return promise.then(function (result) {
103
+ return action().then(Array.prototype.concat.bind(result));
159
104
  });
160
- onStatus({
161
- complete,
162
- pluginInfo
105
+ }, Promise.resolve([]));
106
+ });
107
+ (0, _defineProperty2["default"])(_this, "installPlugin", function (slug) {
108
+ _this.setInstallationStatus(slug, PLUGIN_STATE_INSTALLING);
109
+ var params = {
110
+ path: "/newspack/v1/plugins/".concat(slug, "/configure/"),
111
+ method: 'post'
112
+ };
113
+ return (0, _apiFetch["default"])(params).then(function (response) {
114
+ _this.props.onInstalled(slug);
115
+ return _this.updatePluginInfo(function (prev) {
116
+ return _objectSpread(_objectSpread({}, prev), {}, (0, _defineProperty2["default"])({}, slug, _objectSpread(_objectSpread({}, response), {}, {
117
+ installationStatus: PLUGIN_STATE_ACTIVE
118
+ })));
163
119
  });
164
- resolve();
120
+ })["catch"](function (error) {
121
+ _this.setInstallationStatus(slug, PLUGIN_STATE_ERROR, error.message);
165
122
  });
166
123
  });
167
- };
168
- classForInstallationStatus = status => {
169
- switch (status) {
170
- case PLUGIN_STATE_ACTIVE:
171
- return 'newspack-plugin-installer__status-active';
172
- case PLUGIN_STATE_INSTALLING:
173
- return 'newspack-plugin-installer__status-installing';
174
- case PLUGIN_STATE_ERROR:
175
- return 'newspack-plugin-installer__status-error';
176
- default:
177
- return 'newspack-plugin-installer__status-none';
178
- }
179
- };
180
-
181
- /**
182
- * Render.
183
- */
184
- render() {
185
- const {
186
- autoInstall,
187
- isSmall,
188
- withoutFooterButton
189
- } = this.props;
190
- const {
191
- pluginInfo
192
- } = this.state;
193
- const {
194
- is_managed: isManaged
195
- } = window.newspack_aux_data || {};
196
- const slugs = Object.keys(pluginInfo);
197
-
198
- // Store all plugin status info for installer button text value based on current status.
199
- const currentPluginStatuses = [];
200
- slugs.forEach(slug => {
201
- const plugin = pluginInfo[slug];
202
- currentPluginStatuses.push(plugin.Status);
124
+ (0, _defineProperty2["default"])(_this, "setChecked", function (slug, checked) {
125
+ _this.updatePluginInfo(function (prev) {
126
+ return _objectSpread(_objectSpread({}, prev), {}, (0, _defineProperty2["default"])({}, slug, _objectSpread(_objectSpread({}, prev[slug]), {}, {
127
+ checked: checked
128
+ })));
129
+ });
203
130
  });
204
-
205
- // Make sure plugin status falls in either one of these, to handle button text.
206
- const pluginInstalled = currentStatus => currentStatus === 'active' || currentStatus === 'inactive';
207
- const buttonText = currentPluginStatuses.every(pluginInstalled) ? (0, _i18n.__)('Activate', 'newspack-plugin') : (0, _i18n.__)('Install', 'newspack-plugin');
208
- const needsInstall = slugs.some(slug => {
209
- const plugin = pluginInfo[slug];
210
- return plugin.Status !== 'active' && plugin.installationStatus === PLUGIN_STATE_NONE;
131
+ (0, _defineProperty2["default"])(_this, "setInstallationStatus", function (slug, installationStatus) {
132
+ var notification = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
133
+ _this.updatePluginInfo(function (prev) {
134
+ return _objectSpread(_objectSpread({}, prev), {}, (0, _defineProperty2["default"])({}, slug, _objectSpread(_objectSpread({}, prev[slug]), {}, {
135
+ installationStatus: installationStatus,
136
+ notification: notification
137
+ })));
138
+ });
211
139
  });
212
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
213
- children: [(!pluginInfo || !Object.keys(pluginInfo).length) && /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
214
- className: "newspack-plugin-installer_is-waiting",
215
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_.Waiting, {
216
- isLeft: true
217
- }), (0, _i18n.__)('Retrieving plugin information…', 'newspack-plugin')]
218
- }), pluginInfo && slugs.length > 0 && slugs.map(slug => {
219
- const plugin = pluginInfo[slug];
220
- const {
221
- Name,
222
- Description,
223
- Download,
224
- Status,
225
- installationStatus,
226
- notification
227
- } = plugin;
228
- const isWaiting = installationStatus === PLUGIN_STATE_INSTALLING;
229
- const isButton = !isWaiting && Status !== 'active';
230
- const installable = Download || pluginInstalled(Status);
231
- let actionText;
232
- if (installationStatus === PLUGIN_STATE_INSTALLING) {
233
- actionText = 'inactive' === Status ? (0, _i18n.__)('Activating…') : (0, _i18n.__)('Installing…');
234
- } else if (!installable) {
235
- actionText = /*#__PURE__*/(0, _jsxRuntime.jsxs)("span", {
236
- className: "newspack-plugin-installer__status",
237
- children: [isManaged ? (0, _i18n.__)('Contact Newspack support to install', 'newspack-plugin') : (0, _i18n.__)('Plugin must be installed manually', 'newspack-plugin'), /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
238
- className: "newspack-checkbox-icon"
239
- })]
240
- });
241
- } else if (Status === 'uninstalled') {
242
- actionText = /*#__PURE__*/(0, _jsxRuntime.jsxs)("span", {
243
- className: "newspack-plugin-installer__status",
244
- children: [(0, _i18n.__)('Install', 'newspack'), /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
245
- className: "newspack-checkbox-icon"
246
- })]
247
- });
248
- } else if (Status === 'inactive') {
249
- actionText = /*#__PURE__*/(0, _jsxRuntime.jsxs)("span", {
250
- className: "newspack-plugin-installer__status",
251
- children: [(0, _i18n.__)('Activate', 'newspack-plugin'), /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
252
- className: "newspack-checkbox-icon"
253
- })]
140
+ // Accepts either the next pluginInfo object or an updater `prev => next`.
141
+ // The updater form is required for serial install chains: setState batches
142
+ // pending updates inside the same microtask, so reading `this.state.pluginInfo`
143
+ // at call time can return a snapshot that predates an earlier-in-the-chain
144
+ // pending write, and the second update would clobber the first.
145
+ (0, _defineProperty2["default"])(_this, "updatePluginInfo", function (pluginInfoOrUpdater) {
146
+ return new Promise(function (resolve) {
147
+ var onStatus = _this.props.onStatus;
148
+ _this.setState(function (prevState) {
149
+ return {
150
+ pluginInfo: typeof pluginInfoOrUpdater === 'function' ? pluginInfoOrUpdater(prevState.pluginInfo) : pluginInfoOrUpdater
151
+ };
152
+ }, function () {
153
+ var pluginInfo = _this.state.pluginInfo;
154
+ var complete = Object.values(pluginInfo).every(function (plugin) {
155
+ return 'active' === plugin.Status;
254
156
  });
255
- } else if (Status === 'active') {
256
- actionText = /*#__PURE__*/(0, _jsxRuntime.jsxs)("span", {
257
- className: "newspack-plugin-installer__status",
258
- children: [(0, _i18n.__)('Installed', 'newspack-plugin'), /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
259
- className: "newspack-checkbox-icon newspack-checkbox-icon--checked",
260
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_icons.Icon, {
261
- icon: _icons.check
262
- })
263
- })]
157
+ onStatus({
158
+ complete: complete,
159
+ pluginInfo: pluginInfo
264
160
  });
265
- }
266
- const classes = (0, _classnames.default)('newspack-action-card__plugin-installer', this.classForInstallationStatus(installationStatus));
267
- const onClick = isButton ? () => this.installPlugin(slug) : null;
268
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_.ActionCard, {
269
- title: Name,
270
- description: Description,
271
- disabled: !installable,
272
- actionText: actionText,
273
- isSmall: isSmall,
274
- isWaiting: isWaiting,
275
- onClick: onClick,
276
- notification: notification,
277
- notificationLevel: "error",
278
- notificationHTML: true,
279
- className: classes
280
- }, slug);
281
- }), !withoutFooterButton && !autoInstall && pluginInfo && slugs.length > 0 && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
282
- className: "newspack-buttons-card",
283
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_.Button, {
284
- disabled: !needsInstall,
285
- isPrimary: true,
286
- onClick: this.installAllPlugins,
287
- children: buttonText
288
- })
289
- })]
161
+ resolve();
162
+ });
163
+ });
164
+ });
165
+ (0, _defineProperty2["default"])(_this, "classForInstallationStatus", function (status) {
166
+ switch (status) {
167
+ case PLUGIN_STATE_ACTIVE:
168
+ return 'newspack-plugin-installer__status-active';
169
+ case PLUGIN_STATE_INSTALLING:
170
+ return 'newspack-plugin-installer__status-installing';
171
+ case PLUGIN_STATE_ERROR:
172
+ return 'newspack-plugin-installer__status-error';
173
+ default:
174
+ return 'newspack-plugin-installer__status-none';
175
+ }
290
176
  });
177
+ _this.state = {
178
+ pluginInfo: {},
179
+ installationInitialized: false
180
+ };
181
+ return _this;
291
182
  }
292
- }
183
+ (0, _inherits2["default"])(PluginInstaller, _Component);
184
+ return (0, _createClass2["default"])(PluginInstaller, [{
185
+ key: "render",
186
+ value:
187
+ /**
188
+ * Render.
189
+ */
190
+ function render() {
191
+ var _this2 = this;
192
+ var _this$props2 = this.props,
193
+ autoInstall = _this$props2.autoInstall,
194
+ isSmall = _this$props2.isSmall,
195
+ withoutFooterButton = _this$props2.withoutFooterButton;
196
+ var pluginInfo = this.state.pluginInfo;
197
+ var _ref = window.newspack_aux_data || {},
198
+ isManaged = _ref.is_managed;
199
+ var slugs = Object.keys(pluginInfo);
200
+
201
+ // Store all plugin status info for installer button text value based on current status.
202
+ var currentPluginStatuses = [];
203
+ slugs.forEach(function (slug) {
204
+ var plugin = pluginInfo[slug];
205
+ currentPluginStatuses.push(plugin.Status);
206
+ });
207
+
208
+ // Make sure plugin status falls in either one of these, to handle button text.
209
+ var pluginInstalled = function pluginInstalled(currentStatus) {
210
+ return currentStatus === 'active' || currentStatus === 'inactive';
211
+ };
212
+ var buttonText = currentPluginStatuses.every(pluginInstalled) ? (0, _i18n.__)('Activate', 'newspack-plugin') : (0, _i18n.__)('Install', 'newspack-plugin');
213
+ var needsInstall = slugs.some(function (slug) {
214
+ var plugin = pluginInfo[slug];
215
+ return plugin.Status !== 'active' && plugin.installationStatus === PLUGIN_STATE_NONE;
216
+ });
217
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
218
+ children: [(!pluginInfo || !Object.keys(pluginInfo).length) && /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
219
+ className: "newspack-plugin-installer_is-waiting",
220
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_.Waiting, {
221
+ isLeft: true
222
+ }), (0, _i18n.__)('Retrieving plugin information…', 'newspack-plugin')]
223
+ }), pluginInfo && slugs.length > 0 && slugs.map(function (slug) {
224
+ var plugin = pluginInfo[slug];
225
+ var Name = plugin.Name,
226
+ Description = plugin.Description,
227
+ Download = plugin.Download,
228
+ Status = plugin.Status,
229
+ installationStatus = plugin.installationStatus,
230
+ notification = plugin.notification;
231
+ var isWaiting = installationStatus === PLUGIN_STATE_INSTALLING;
232
+ var isButton = !isWaiting && Status !== 'active';
233
+ var installable = Download || pluginInstalled(Status);
234
+ var actionText;
235
+ if (installationStatus === PLUGIN_STATE_INSTALLING) {
236
+ actionText = 'inactive' === Status ? (0, _i18n.__)('Activating…') : (0, _i18n.__)('Installing…');
237
+ } else if (!installable) {
238
+ actionText = /*#__PURE__*/(0, _jsxRuntime.jsxs)("span", {
239
+ className: "newspack-plugin-installer__status",
240
+ children: [isManaged ? (0, _i18n.__)('Contact Newspack support to install', 'newspack-plugin') : (0, _i18n.__)('Plugin must be installed manually', 'newspack-plugin'), /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
241
+ className: "newspack-checkbox-icon"
242
+ })]
243
+ });
244
+ } else if (Status === 'uninstalled') {
245
+ actionText = /*#__PURE__*/(0, _jsxRuntime.jsxs)("span", {
246
+ className: "newspack-plugin-installer__status",
247
+ children: [(0, _i18n.__)('Install', 'newspack'), /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
248
+ className: "newspack-checkbox-icon"
249
+ })]
250
+ });
251
+ } else if (Status === 'inactive') {
252
+ actionText = /*#__PURE__*/(0, _jsxRuntime.jsxs)("span", {
253
+ className: "newspack-plugin-installer__status",
254
+ children: [(0, _i18n.__)('Activate', 'newspack-plugin'), /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
255
+ className: "newspack-checkbox-icon"
256
+ })]
257
+ });
258
+ } else if (Status === 'active') {
259
+ actionText = /*#__PURE__*/(0, _jsxRuntime.jsxs)("span", {
260
+ className: "newspack-plugin-installer__status",
261
+ children: [(0, _i18n.__)('Installed', 'newspack-plugin'), /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
262
+ className: "newspack-checkbox-icon newspack-checkbox-icon--checked",
263
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_icons.Icon, {
264
+ icon: _icons.check
265
+ })
266
+ })]
267
+ });
268
+ }
269
+ var classes = (0, _classnames["default"])('newspack-action-card__plugin-installer', _this2.classForInstallationStatus(installationStatus));
270
+ var onClick = isButton ? function () {
271
+ return _this2.installPlugin(slug);
272
+ } : null;
273
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_.ActionCard, {
274
+ title: Name,
275
+ description: Description,
276
+ disabled: !installable,
277
+ actionText: actionText,
278
+ isSmall: isSmall,
279
+ isWaiting: isWaiting,
280
+ onClick: onClick,
281
+ notification: notification,
282
+ notificationLevel: "error",
283
+ notificationHTML: true,
284
+ className: classes
285
+ }, slug);
286
+ }), !withoutFooterButton && !autoInstall && pluginInfo && slugs.length > 0 && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
287
+ className: "newspack-buttons-card",
288
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_.Button, {
289
+ disabled: !needsInstall,
290
+ isPrimary: true,
291
+ onClick: this.installAllPlugins,
292
+ children: buttonText
293
+ })
294
+ })]
295
+ });
296
+ }
297
+ }]);
298
+ }(_element.Component);
293
299
  PluginInstaller.defaultProps = {
294
- onStatus: () => {},
295
- onInstalled: () => {}
300
+ onStatus: function onStatus() {},
301
+ onInstalled: function onInstalled() {}
296
302
  };
297
- var _default = exports.default = PluginInstaller;
303
+ var _default = exports["default"] = PluginInstaller;