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