ng-miam 6.4.13 → 7.0.0

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 (208) hide show
  1. package/bundles/ng-miam.umd.js +8539 -10855
  2. package/bundles/ng-miam.umd.js.map +1 -1
  3. package/bundles/ng-miam.umd.min.js +2 -2
  4. package/bundles/ng-miam.umd.min.js.map +1 -1
  5. package/esm2015/lib/_components/abstracts/event-tracer.component.js +3 -2
  6. package/esm2015/lib/_components/accordion/accordion.component.js +75 -0
  7. package/esm2015/lib/_components/components.module.js +27 -21
  8. package/esm2015/lib/_components/counter-input/counter-input.component.js +86 -76
  9. package/esm2015/lib/_components/icon/icon.component.js +1 -1
  10. package/esm2015/lib/_components/index.js +5 -5
  11. package/esm2015/lib/_components/like-button/like-button.component.js +1 -1
  12. package/esm2015/lib/_components/list-input/list-input.component.js +5 -5
  13. package/esm2015/lib/_components/loader/loader.component.js +1 -1
  14. package/esm2015/lib/_components/meals-planner-link/meals-planner-link.component.js +3 -3
  15. package/esm2015/lib/_components/modal/modal.component.js +155 -137
  16. package/esm2015/lib/_components/product-card/product-card.component.js +333 -0
  17. package/esm2015/lib/_components/products-picker/products-picker.component.js +155 -0
  18. package/esm2015/lib/_components/progress-tracker/progress-tracker.component.js +1 -1
  19. package/esm2015/lib/_components/recipe-filters/recipe-filters.component.js +166 -217
  20. package/esm2015/lib/_components/recipe-pricing/recipe-pricing.component.js +55 -35
  21. package/esm2015/lib/_components/slider-tabs/slider-tabs.component.js +84 -0
  22. package/esm2015/lib/_components/sponsor-blocks/sponsor-image-and-text-block/sponsor-image-and-text-block.component.js +1 -1
  23. package/esm2015/lib/_components/sponsor-blocks/sponsor-text-and-image-block/sponsor-text-and-image-block.component.js +1 -1
  24. package/esm2015/lib/_components/tabs/tabs.component.js +48 -88
  25. package/esm2015/lib/_components/toaster/toaster.component.js +48 -84
  26. package/esm2015/lib/_components/tooltipable-content/tooltipable-content.component.js +1 -1
  27. package/esm2015/lib/_models/basket-entry.js +33 -49
  28. package/esm2015/lib/_models/basket-preview-line.js +5 -5
  29. package/esm2015/lib/_models/basket.js +15 -12
  30. package/esm2015/lib/_models/item.js +2 -2
  31. package/esm2015/lib/_models/recipe.js +2 -15
  32. package/esm2015/lib/_models/user.js +1 -1
  33. package/esm2015/lib/_services/analytics.service.js +24 -5
  34. package/esm2015/lib/_services/baskets-synchronizing/baskets-comparator.service.js +1 -10
  35. package/esm2015/lib/_services/baskets-synchronizing/baskets-synchronizer.service.js +15 -15
  36. package/esm2015/lib/_services/baskets.service.js +478 -60
  37. package/esm2015/lib/_services/context.service.js +22 -35
  38. package/esm2015/lib/_services/index.js +3 -5
  39. package/esm2015/lib/_services/interceptor.service.js +2 -2
  40. package/esm2015/lib/_services/items.service.js +27 -4
  41. package/esm2015/lib/_services/recipe-details.service.js +198 -0
  42. package/esm2015/lib/_services/recipe-likes.service.js +1 -1
  43. package/esm2015/lib/_services/recipes.service.js +24 -53
  44. package/esm2015/lib/_services/scrolling.service.js +17 -0
  45. package/esm2015/lib/_services/toaster.service.js +4 -5
  46. package/esm2015/lib/_services/user.service.js +2 -2
  47. package/esm2015/lib/_types/basket-action-type.enum.js +11 -0
  48. package/esm2015/lib/_types/basket-action.js +2 -0
  49. package/esm2015/lib/_types/basket-stats.js +2 -0
  50. package/esm2015/lib/_types/builded/miam-interface.js +1 -1
  51. package/esm2015/lib/_types/event-trace.js +5 -0
  52. package/esm2015/lib/_types/items-comparator.js +1 -10
  53. package/esm2015/lib/_types/recipe-filters.js +1 -1
  54. package/esm2015/lib/_types/toaster.js +1 -1
  55. package/esm2015/lib/_utils/directives/index.js +2 -1
  56. package/esm2015/lib/_utils/directives/reach-top.directive.js +33 -0
  57. package/esm2015/lib/_utils/pipes/readable-float-number/readable-float-number.pipe.js +8 -2
  58. package/esm2015/lib/_utils/utils.module.js +12 -8
  59. package/esm2015/lib/_web-components/basket-preview/basket-preview-block/basket-preview-block.component.js +140 -118
  60. package/esm2015/lib/_web-components/basket-preview/basket-preview-disabled/basket-preview-disabled.component.js +2 -2
  61. package/esm2015/lib/_web-components/basket-preview/basket-preview-line/basket-preview-line.component.js +125 -444
  62. package/esm2015/lib/_web-components/basket-preview/replace-item/replace-item.component.js +211 -108
  63. package/esm2015/lib/_web-components/index.js +1 -4
  64. package/esm2015/lib/_web-components/list-scan/basket-preview/basket-preview.component.js +11 -14
  65. package/esm2015/lib/_web-components/list-scan/files-inputs/files-inputs.component.js +13 -13
  66. package/esm2015/lib/_web-components/list-scan/ingredients-list/ingredients-list.component.js +6 -6
  67. package/esm2015/lib/_web-components/list-scan/list-scan.component.js +10 -10
  68. package/esm2015/lib/_web-components/list-scan/overlay-button/overlay-button.component.js +23 -11
  69. package/esm2015/lib/_web-components/meals-planner/meals-planner-basket-confirmation/meals-planner-basket-confirmation.component.js +1 -1
  70. package/esm2015/lib/_web-components/meals-planner/meals-planner-catalog/meals-planner-catalog.component.js +1 -1
  71. package/esm2015/lib/_web-components/meals-planner/meals-planner-form/meals-planner-form.component.js +7 -7
  72. package/esm2015/lib/_web-components/meals-planner/meals-planner-result/meals-planner-result.component.js +5 -5
  73. package/esm2015/lib/_web-components/meals-planner/meals-planner.component.js +16 -20
  74. package/esm2015/lib/_web-components/planner-side-menu/planner-side-menu.component.js +4 -53
  75. package/esm2015/lib/_web-components/recipe-cards/add-recipe-card/add-recipe-card.component.js +1 -1
  76. package/esm2015/lib/_web-components/recipe-cards/index.js +1 -3
  77. package/esm2015/lib/_web-components/recipe-cards/recipe-card/recipe-card.component.js +326 -404
  78. package/esm2015/lib/_web-components/recipe-cards/recipe-card-cta/recipe-card-cta.component.js +50 -146
  79. package/esm2015/lib/_web-components/recipe-cards/recipe-cards.module.js +3 -15
  80. package/esm2015/lib/_web-components/recipe-catalog/catalog-article-card/catalog-article-card.component.js +1 -1
  81. package/esm2015/lib/_web-components/recipe-catalog/catalog-category/catalog-category.component.js +35 -29
  82. package/esm2015/lib/_web-components/recipe-catalog/catalog-header/catalog-header.component.js +1 -1
  83. package/esm2015/lib/_web-components/recipe-catalog/catalog-list/catalog-list.component.js +27 -31
  84. package/esm2015/lib/_web-components/recipe-catalog/recipe-catalog.component.js +98 -100
  85. package/esm2015/lib/_web-components/recipe-creation/recipe-form/recipe-form.component.js +2 -2
  86. package/esm2015/lib/_web-components/recipe-creation/recipe-stepper/recipe-stepper.component.js +7 -7
  87. package/esm2015/lib/_web-components/recipe-creation/tags-creator/tags-creator.component.js +4 -4
  88. package/esm2015/lib/_web-components/recipe-creation/tags-selector/tags-selector.component.js +8 -8
  89. package/esm2015/lib/_web-components/recipe-details/recipe-addon/recipe-addon.component.js +7 -3
  90. package/esm2015/lib/_web-components/recipe-details/recipe-details-infos/recipe-details-infos.component.js +57 -358
  91. package/esm2015/lib/_web-components/recipe-details/recipe-details-ingredients/recipe-details-ingredients.component.js +59 -122
  92. package/esm2015/lib/_web-components/recipe-details/recipe-details-steps/recipe-details-steps.component.js +51 -72
  93. package/esm2015/lib/_web-components/recipe-details/recipe-details.component.js +313 -363
  94. package/esm2015/lib/_web-components/recipe-details/recipe-details.module.js +8 -4
  95. package/esm2015/lib/_web-components/recipe-details/sponsor-storytelling/sponsor-storytelling.component.js +1 -1
  96. package/esm2015/lib/_web-components/recipe-helper/recipe-helper.component.js +89 -113
  97. package/esm2015/lib/_web-components/recipe-modal/recipe-modal.component.js +78 -69
  98. package/esm2015/lib/_web-components/recipe-tags/recipe-tags.component.js +5 -5
  99. package/esm2015/lib/_web-components/toaster-stack/toaster-stack.component.js +8 -4
  100. package/esm2015/lib/_web-components/web-components.module.js +3 -19
  101. package/esm2015/lib/ng-miam.module.js +5 -7
  102. package/fesm2015/ng-miam.js +5165 -6973
  103. package/fesm2015/ng-miam.js.map +1 -1
  104. package/lib/_components/abstracts/event-tracer.component.d.ts +2 -1
  105. package/lib/_components/accordion/accordion.component.d.ts +23 -0
  106. package/lib/_components/components.module.d.ts +38 -36
  107. package/lib/_components/counter-input/counter-input.component.d.ts +12 -14
  108. package/lib/_components/index.d.ts +4 -4
  109. package/lib/_components/modal/modal.component.d.ts +18 -18
  110. package/lib/_components/product-card/product-card.component.d.ts +40 -0
  111. package/lib/_components/products-picker/products-picker.component.d.ts +17 -0
  112. package/lib/_components/recipe-pricing/recipe-pricing.component.d.ts +12 -8
  113. package/lib/_components/slider-tabs/slider-tabs.component.d.ts +16 -0
  114. package/lib/_components/tabs/tabs.component.d.ts +11 -11
  115. package/lib/_components/toaster/toaster.component.d.ts +4 -2
  116. package/lib/_models/basket-entry.d.ts +16 -20
  117. package/lib/_models/basket-preview-line.d.ts +1 -0
  118. package/lib/_models/basket.d.ts +12 -5
  119. package/lib/_models/item.d.ts +1 -1
  120. package/lib/_models/recipe.d.ts +0 -5
  121. package/lib/_models/user.d.ts +0 -1
  122. package/lib/_services/analytics.service.d.ts +8 -22
  123. package/lib/_services/baskets-synchronizing/baskets-comparator.service.d.ts +0 -5
  124. package/lib/_services/baskets-synchronizing/baskets-synchronizer.service.d.ts +3 -6
  125. package/lib/_services/baskets.service.d.ts +137 -18
  126. package/lib/_services/context.service.d.ts +2 -4
  127. package/lib/_services/index.d.ts +2 -4
  128. package/lib/_services/items.service.d.ts +9 -2
  129. package/lib/_services/recipe-details.service.d.ts +84 -0
  130. package/lib/_services/recipe-likes.service.d.ts +2 -1
  131. package/lib/_services/recipes.service.d.ts +10 -14
  132. package/lib/_services/scrolling.service.d.ts +8 -0
  133. package/lib/_services/toaster.service.d.ts +1 -1
  134. package/lib/_types/basket-action-type.enum.d.ts +9 -0
  135. package/lib/_types/basket-action.d.ts +14 -0
  136. package/lib/_types/basket-stats.d.ts +5 -0
  137. package/lib/_types/builded/miam-interface.d.ts +16 -25
  138. package/lib/_types/event-trace.d.ts +22 -0
  139. package/lib/_types/items-comparator.d.ts +0 -5
  140. package/lib/_types/recipe-filters.d.ts +0 -2
  141. package/lib/_types/toaster.d.ts +1 -1
  142. package/lib/_utils/directives/index.d.ts +1 -0
  143. package/lib/_utils/directives/reach-top.directive.d.ts +13 -0
  144. package/lib/_utils/pipes/readable-float-number/readable-float-number.pipe.d.ts +1 -1
  145. package/lib/_utils/utils.module.d.ts +2 -2
  146. package/lib/_web-components/basket-preview/basket-preview-block/basket-preview-block.component.d.ts +9 -8
  147. package/lib/_web-components/basket-preview/basket-preview-line/basket-preview-line.component.d.ts +11 -9
  148. package/lib/_web-components/basket-preview/replace-item/replace-item.component.d.ts +27 -20
  149. package/lib/_web-components/index.d.ts +0 -3
  150. package/lib/_web-components/list-scan/basket-preview/basket-preview.component.d.ts +1 -2
  151. package/lib/_web-components/list-scan/files-inputs/files-inputs.component.d.ts +6 -5
  152. package/lib/_web-components/list-scan/ingredients-list/ingredients-list.component.d.ts +3 -3
  153. package/lib/_web-components/list-scan/list-scan.component.d.ts +3 -3
  154. package/lib/_web-components/list-scan/overlay-button/overlay-button.component.d.ts +8 -6
  155. package/lib/_web-components/meals-planner/meals-planner.component.d.ts +2 -3
  156. package/lib/_web-components/recipe-cards/index.d.ts +0 -2
  157. package/lib/_web-components/recipe-cards/recipe-card/recipe-card.component.d.ts +58 -17
  158. package/lib/_web-components/recipe-cards/recipe-card-cta/recipe-card-cta.component.d.ts +5 -12
  159. package/lib/_web-components/recipe-cards/recipe-cards.module.d.ts +7 -9
  160. package/lib/_web-components/recipe-catalog/catalog-category/catalog-category.component.d.ts +8 -6
  161. package/lib/_web-components/recipe-catalog/catalog-list/catalog-list.component.d.ts +7 -4
  162. package/lib/_web-components/recipe-catalog/recipe-catalog.component.d.ts +2 -3
  163. package/lib/_web-components/recipe-details/recipe-addon/recipe-addon.component.d.ts +5 -2
  164. package/lib/_web-components/recipe-details/recipe-details-infos/recipe-details-infos.component.d.ts +6 -18
  165. package/lib/_web-components/recipe-details/recipe-details-ingredients/recipe-details-ingredients.component.d.ts +6 -13
  166. package/lib/_web-components/recipe-details/recipe-details-steps/recipe-details-steps.component.d.ts +2 -10
  167. package/lib/_web-components/recipe-details/recipe-details.component.d.ts +29 -36
  168. package/lib/_web-components/recipe-details/recipe-details.module.d.ts +2 -1
  169. package/lib/_web-components/recipe-helper/recipe-helper.component.d.ts +2 -6
  170. package/lib/_web-components/recipe-modal/recipe-modal.component.d.ts +11 -9
  171. package/lib/_web-components/toaster-stack/toaster-stack.component.d.ts +5 -2
  172. package/lib/_web-components/web-components.module.d.ts +23 -29
  173. package/miam-style.css +1 -1
  174. package/package.json +1 -1
  175. package/esm2015/lib/_components/abstracts/abstract-recipe-card.component.js +0 -130
  176. package/esm2015/lib/_components/skeleton/skeleton.component.js +0 -70
  177. package/esm2015/lib/_components/tabs/tab-body.component.js +0 -30
  178. package/esm2015/lib/_components/tabs/tab-item.component.js +0 -36
  179. package/esm2015/lib/_components/tabs/tab-label.component.js +0 -30
  180. package/esm2015/lib/_models/groceries-entry.js +0 -42
  181. package/esm2015/lib/_models/groceries-list.js +0 -36
  182. package/esm2015/lib/_services/counter.service.js +0 -20
  183. package/esm2015/lib/_services/groceries-entries.service.js +0 -21
  184. package/esm2015/lib/_services/groceries-lists.service.js +0 -240
  185. package/esm2015/lib/_services/recipe-events.service.js +0 -63
  186. package/esm2015/lib/_types/skeleton.enum.js +0 -7
  187. package/esm2015/lib/_web-components/drawer/drawer.component.js +0 -273
  188. package/esm2015/lib/_web-components/pos-card/pos-card.component.js +0 -207
  189. package/esm2015/lib/_web-components/pos-selection/pos-selection.component.js +0 -283
  190. package/esm2015/lib/_web-components/recipe-cards/catalog-recipe-card/catalog-recipe-card.component.js +0 -632
  191. package/esm2015/lib/_web-components/recipe-cards/suggestion-card/suggestion-card.component.js +0 -144
  192. package/lib/_components/abstracts/abstract-recipe-card.component.d.ts +0 -49
  193. package/lib/_components/skeleton/skeleton.component.d.ts +0 -11
  194. package/lib/_components/tabs/tab-body.component.d.ts +0 -8
  195. package/lib/_components/tabs/tab-item.component.d.ts +0 -11
  196. package/lib/_components/tabs/tab-label.component.d.ts +0 -8
  197. package/lib/_models/groceries-entry.d.ts +0 -20
  198. package/lib/_models/groceries-list.d.ts +0 -30
  199. package/lib/_services/counter.service.d.ts +0 -10
  200. package/lib/_services/groceries-entries.service.d.ts +0 -10
  201. package/lib/_services/groceries-lists.service.d.ts +0 -68
  202. package/lib/_services/recipe-events.service.d.ts +0 -23
  203. package/lib/_types/skeleton.enum.d.ts +0 -5
  204. package/lib/_web-components/drawer/drawer.component.d.ts +0 -37
  205. package/lib/_web-components/pos-card/pos-card.component.d.ts +0 -24
  206. package/lib/_web-components/pos-selection/pos-selection.component.d.ts +0 -38
  207. package/lib/_web-components/recipe-cards/catalog-recipe-card/catalog-recipe-card.component.d.ts +0 -49
  208. package/lib/_web-components/recipe-cards/suggestion-card/suggestion-card.component.d.ts +0 -42
@@ -1,20 +0,0 @@
1
- // THIS IS JUST AN EXAMPLE - UNUSED IN THE CODE
2
- import { Injectable, ApplicationRef } from '@angular/core';
3
- import { BehaviorSubject } from 'rxjs';
4
- import * as i0 from "@angular/core";
5
- export class CounterService {
6
- constructor(app) {
7
- this.app = app;
8
- this.counterNumber = new BehaviorSubject(1);
9
- this.counterNumber.asObservable().subscribe(() => this.app.tick());
10
- }
11
- }
12
- CounterService.ɵfac = function CounterService_Factory(t) { return new (t || CounterService)(i0.ɵɵinject(i0.ApplicationRef)); };
13
- CounterService.ɵprov = i0.ɵɵdefineInjectable({ token: CounterService, factory: CounterService.ɵfac, providedIn: 'root' });
14
- /*@__PURE__*/ (function () { i0.ɵsetClassMetadata(CounterService, [{
15
- type: Injectable,
16
- args: [{
17
- providedIn: 'root'
18
- }]
19
- }], function () { return [{ type: i0.ApplicationRef }]; }, null); })();
20
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291bnRlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Ii9idWlsZHMvbWlhbS9uZy1taWFtLXNkay9wcm9qZWN0cy9uZy1taWFtL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9fc2VydmljZXMvY291bnRlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUUvQyxPQUFPLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQUt2QyxNQUFNLE9BQU8sY0FBYztJQUl6QixZQUFvQixHQUFtQjtRQUFuQixRQUFHLEdBQUgsR0FBRyxDQUFnQjtRQUNyQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTVDLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN0RSxDQUFDOzs0RUFSVSxjQUFjO3NEQUFkLGNBQWMsV0FBZCxjQUFjLG1CQUZiLE1BQU07a0RBRVAsY0FBYztjQUgxQixVQUFVO2VBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUSElTIElTIEpVU1QgQU4gRVhBTVBMRSAtIFVOVVNFRCBJTiBUSEUgQ09ERVxuXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBBcHBsaWNhdGlvblJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIENvdW50ZXJTZXJ2aWNlIHtcblxuICBjb3VudGVyTnVtYmVyOiBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGFwcDogQXBwbGljYXRpb25SZWYpe1xuICAgIHRoaXMuY291bnRlck51bWJlciA9IG5ldyBCZWhhdmlvclN1YmplY3QoMSk7XG5cbiAgICB0aGlzLmNvdW50ZXJOdW1iZXIuYXNPYnNlcnZhYmxlKCkuc3Vic2NyaWJlKCgpID0+ICB0aGlzLmFwcC50aWNrKCkpO1xuICB9XG5cblxufVxuIl19
@@ -1,21 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { Service } from 'ngx-jsonapi';
3
- import { GroceriesEntry } from '../_models/groceries-entry';
4
- import * as i0 from "@angular/core";
5
- export class GroceriesEntriesService extends Service {
6
- constructor() {
7
- super();
8
- this.resource = GroceriesEntry;
9
- this.type = 'groceries-entries';
10
- this.register();
11
- }
12
- }
13
- GroceriesEntriesService.ɵfac = function GroceriesEntriesService_Factory(t) { return new (t || GroceriesEntriesService)(); };
14
- GroceriesEntriesService.ɵprov = i0.ɵɵdefineInjectable({ token: GroceriesEntriesService, factory: GroceriesEntriesService.ɵfac, providedIn: 'root' });
15
- /*@__PURE__*/ (function () { i0.ɵsetClassMetadata(GroceriesEntriesService, [{
16
- type: Injectable,
17
- args: [{
18
- providedIn: 'root'
19
- }]
20
- }], function () { return []; }, null); })();
21
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvY2VyaWVzLWVudHJpZXMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIvYnVpbGRzL21pYW0vbmctbWlhbS1zZGsvcHJvamVjdHMvbmctbWlhbS9zcmMvIiwic291cmNlcyI6WyJsaWIvX3NlcnZpY2VzL2dyb2Nlcmllcy1lbnRyaWVzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7QUFLNUQsTUFBTSxPQUFPLHVCQUF3QixTQUFRLE9BQXVCO0lBSWxFO1FBQ0UsS0FBSyxFQUFFLENBQUM7UUFKVixhQUFRLEdBQUcsY0FBYyxDQUFDO1FBQzFCLFNBQUksR0FBRyxtQkFBbUIsQ0FBQztRQUl6QixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbEIsQ0FBQzs7OEZBUFUsdUJBQXVCOytEQUF2Qix1QkFBdUIsV0FBdkIsdUJBQXVCLG1CQUZ0QixNQUFNO2tEQUVQLHVCQUF1QjtjQUhuQyxVQUFVO2VBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTZXJ2aWNlIH0gZnJvbSAnbmd4LWpzb25hcGknO1xuaW1wb3J0IHsgR3JvY2VyaWVzRW50cnkgfSBmcm9tICcuLi9fbW9kZWxzL2dyb2Nlcmllcy1lbnRyeSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEdyb2Nlcmllc0VudHJpZXNTZXJ2aWNlIGV4dGVuZHMgU2VydmljZTxHcm9jZXJpZXNFbnRyeT4ge1xuICByZXNvdXJjZSA9IEdyb2Nlcmllc0VudHJ5O1xuICB0eXBlID0gJ2dyb2Nlcmllcy1lbnRyaWVzJztcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucmVnaXN0ZXIoKTtcbiAgfVxufVxuIl19
@@ -1,240 +0,0 @@
1
- import { HttpClient } from '@angular/common/http';
2
- import { Inject, Injectable } from '@angular/core';
3
- import { Service } from 'ngx-jsonapi';
4
- import { BehaviorSubject } from 'rxjs';
5
- import { debounceTime, map, skipWhile, switchMap, take, tap } from 'rxjs/operators';
6
- import { v4 as uuidv4 } from 'uuid';
7
- import { GroceriesList } from '../_models/groceries-list';
8
- import { environment as e } from '../environments/environment';
9
- import { MIAM_BASKET_PATH } from '../providers';
10
- import { AnalyticsService } from './analytics.service';
11
- import * as i0 from "@angular/core";
12
- import * as i1 from "@angular/common/http";
13
- import * as i2 from "./analytics.service";
14
- // @dynamic
15
- export class GroceriesListsService extends Service {
16
- constructor(miamBasketURL, http, analyticsService) {
17
- super();
18
- this.miamBasketURL = miamBasketURL;
19
- this.http = http;
20
- this.analyticsService = analyticsService;
21
- this.resource = GroceriesList;
22
- this.type = 'groceries-lists';
23
- // Unused in sdk at the moment but any client app can subscribe on it to know when a recipe has been added
24
- this.recipeWasAdded$ = new BehaviorSubject([]);
25
- // Unused in sdk at the moment but any client app can subscribe on it to know when a recipe has been added
26
- this.recipeWasDeleted$ = new BehaviorSubject([]);
27
- this.recipesToRemove = new BehaviorSubject([]);
28
- this.isRemovingRecipes = false;
29
- // Singleton instance of GroceriesList
30
- this._list$ = new BehaviorSubject(null);
31
- this.saveOperationType = '';
32
- // Observe the fetching of the recipe so calls to list$ are delayed instead of calling refreshCurrentList dozens of times
33
- this.listIsFetching = false;
34
- this.register();
35
- this.recipesToRemove.pipe(skipWhile(toRemove => toRemove.length === 0 || this.isRemovingRecipes), debounceTime(200), tap(() => this.emptyRecipesToRemove())).subscribe();
36
- }
37
- /**
38
- * We want list$ to be a singleton that always returns the same list, so it is fetched only when necessary.
39
- * At any point in time the list can be fetched via the refreshCurrentList function (if we want to fetch it on startup to save time later)
40
- * But if refreshCurrentList is not called, the list will only be fetched the 1st time it is needed
41
- */
42
- get list$() {
43
- if (this._list$.value || this.listIsFetching) {
44
- return this._list$;
45
- }
46
- return this.refreshCurrentList();
47
- }
48
- takeFirstList() {
49
- return this.list$.pipe(skipWhile(l => !l), take(1));
50
- }
51
- // Check if recipe with id = recipeId is in the GroceriesList
52
- recipeIsInList(recipeId) {
53
- return this._list$.pipe(skipWhile(l => !l), take(1), map(list => list.hasRecipe(recipeId)));
54
- }
55
- guestsForRecipe(recipe) {
56
- var _a;
57
- return (_a = this._list$.value) === null || _a === void 0 ? void 0 : _a.guestsForRecipe(recipe);
58
- }
59
- refreshCurrentList() {
60
- console.log('[Miam] refreshing gl');
61
- this.listIsFetching = true;
62
- const cachedListId = localStorage.getItem('_miam/listId');
63
- // adding this uuid will force request to be sent even if one is still in process
64
- // think about making a queue to process request in order
65
- const baseRoute = 'current?uniq_token=' + uuidv4();
66
- const endpoint = (cachedListId === null || cachedListId === void 0 ? void 0 : cachedListId.toString().match(/^[0-9]+$/)) ? baseRoute + '&merge_with=' + cachedListId : baseRoute;
67
- // alway keep only the last subscription, that will make forget the last calls
68
- if (this.currentSubscription) {
69
- this.currentSubscription.unsubscribe();
70
- }
71
- this.currentSubscription = this.get(endpoint + '&include=groceries-entries').pipe(skipWhile(l => l.is_loading), tap(l => this.assignList(l))).subscribe();
72
- return this._list$;
73
- }
74
- resetList(eventTrace = { originPath: '', props: {} }) {
75
- this.analyticsService.sendEventWhenReady(this.analyticsService.EVENT_RECIPE_RESET, eventTrace.originPath, eventTrace.props);
76
- return this.takeFirstList().pipe(tap(gl => {
77
- gl.recipeInfos.forEach(info => {
78
- const newProp = { recipe_id: info.id };
79
- const mergedProps = Object.assign(newProp, eventTrace.props);
80
- this.analyticsService.sendEventWhenReady(this.analyticsService.EVENT_RECIPE_REMOVE, eventTrace.originPath, mergedProps);
81
- });
82
- }), switchMap(() => this.get('reset').pipe(skipWhile(l => l.is_loading), tap(l => this.assignList(l)))));
83
- }
84
- appendRecipeToList(recipeId, guests, eventTrace, openBasket = false) {
85
- return this.takeFirstList().pipe(switchMap(list => {
86
- this.addOrUpdateRecipeInList(list, { id: recipeId, guests }, eventTrace);
87
- return this.saveList(list, openBasket);
88
- }));
89
- }
90
- appendRecipesToList(recipes, eventTrace, openBasket = false) {
91
- return this.takeFirstList().pipe(switchMap(list => {
92
- recipes.forEach(recipe => {
93
- this.addOrUpdateRecipeInList(list, recipe, { originPath: eventTrace.originPath, props: { recipe_id: recipe === null || recipe === void 0 ? void 0 : recipe.id } });
94
- });
95
- return this.saveList(list, openBasket);
96
- }));
97
- }
98
- addOrUpdateRecipeInList(list, recipe, eventTrace) {
99
- if (!list.hasRecipe(recipe.id)) {
100
- // append to list
101
- list.attributes['append-recipes'] = true;
102
- const info = { id: recipe.id };
103
- if (recipe.guests) {
104
- Object.assign(info, { guests: recipe.guests });
105
- }
106
- list.attributes['recipes-infos'].push(info);
107
- this.saveOperationType = 'ADD';
108
- this.analyticsService.sendEventWhenReady(this.analyticsService.EVENT_RECIPE_ADD, eventTrace.originPath, eventTrace.props);
109
- }
110
- else if (recipe.guests) {
111
- // update guests number
112
- const info = list.recipeInfos.find(i => i.id === recipe.id);
113
- if (info.guests.toString() === recipe.guests.toString()) {
114
- // Avoid saving the list if nothing changed
115
- return;
116
- }
117
- info.guests = recipe.guests.toString();
118
- this.analyticsService.sendEventWhenReady(this.analyticsService.EVENT_RECIPE_CHANGEGUESTS, eventTrace.originPath, eventTrace.props);
119
- }
120
- }
121
- removeRecipeFromList(recipeId, eventTrace) {
122
- const toRemove = this.recipesToRemove.value;
123
- toRemove.push({ id: recipeId, eventTrace });
124
- this.recipesToRemove.next(toRemove);
125
- }
126
- updateRecipeGuests(recipeId, guests, eventTrace) {
127
- this.analyticsService.sendEventWhenReady(this.analyticsService.EVENT_RECIPE_CHANGEGUESTS, eventTrace.originPath, eventTrace.props);
128
- return this.takeFirstList().pipe(switchMap(list => {
129
- if (list.attributes['recipes-infos']) {
130
- const recipeInfo = list.attributes['recipes-infos'].find(info => info.id === recipeId);
131
- recipeInfo.guests = guests.toString();
132
- this.saveOperationType = 'GUESTS';
133
- return this.saveList(list);
134
- }
135
- return this._list$;
136
- }));
137
- }
138
- addEntriesFromPicture(file, include = [], disableIngredientsMatching = false) {
139
- return this.takeFirstList().pipe(switchMap(list => {
140
- let url = [e.miamAPI, 'api/v1/groceries-lists', list.id, 'add_entries_from_picture'].join('/');
141
- if (disableIngredientsMatching) {
142
- url += '?disable_matching=true';
143
- }
144
- const formData = new FormData();
145
- formData.append('picture', file);
146
- formData.append('include', include.join(','));
147
- return this.http.patch(url, formData).pipe(map((response) => {
148
- const l = this.new();
149
- l.fill(response);
150
- this._list$.next(l);
151
- return l;
152
- }));
153
- }));
154
- }
155
- /**
156
- * Will create a temporary list and set it in _list$. The list won't be marked as current and thus
157
- * will not be reused
158
- */
159
- createTemporaryList() {
160
- this.listIsFetching = true;
161
- this.new().save({ include: ['groceries-entries'] }).subscribe((temporaryList) => {
162
- this._list$.next(this.afterSave(temporaryList));
163
- this.listIsFetching = false;
164
- });
165
- }
166
- emptyRecipesToRemove() {
167
- this.isRemovingRecipes = true;
168
- const idsToRemove = this.recipesToRemove.value.map(i => i.id);
169
- if (idsToRemove.length > 0) {
170
- const eventTrace = this.recipesToRemove.value[0].eventTrace;
171
- this.takeFirstList().pipe(switchMap(list => {
172
- if (list.attributes['recipes-infos']) {
173
- list.attributes['recipes-infos'] = list.attributes['recipes-infos'].filter(info => !idsToRemove.includes(info.id));
174
- this.analyticsService.sendEventWhenReady(this.analyticsService.EVENT_RECIPE_REMOVE, eventTrace.originPath, eventTrace.props);
175
- this.saveOperationType = 'REMOVE';
176
- return this.saveList(list).pipe(take(1));
177
- }
178
- })).subscribe(() => {
179
- this.isRemovingRecipes = false;
180
- this.recipesToRemove.next(this.recipesToRemove.value.filter(i => !idsToRemove.includes(i.id)));
181
- });
182
- }
183
- }
184
- /**
185
- * save() returns an object that isn't a resource so methods aren't attached, so we have to do a little trick
186
- * @param res result of the save
187
- * @returns correct GroceriesList with the right attributes & methods
188
- */
189
- afterSave(res) {
190
- const list = this.new();
191
- list.fill(res);
192
- return list;
193
- }
194
- saveList(list, openBasket = false) {
195
- delete (list.attributes['recipes-ids']);
196
- delete (list.relationships['groceries-entries']);
197
- return list.save({ include: ['groceries-entries'] }).pipe(skipWhile((l) => l.is_loading), tap(l => {
198
- var _a;
199
- if ((_a = l === null || l === void 0 ? void 0 : l.data) === null || _a === void 0 ? void 0 : _a.id) {
200
- this._list$.next(this.afterSave(l));
201
- if (this.saveOperationType === 'ADD') {
202
- this.recipeWasAdded$.next(list.recipeInfos);
203
- }
204
- if (this.saveOperationType === 'REMOVE') {
205
- this.recipeWasDeleted$.next(list.recipeInfos);
206
- }
207
- this.saveOperationType = '';
208
- if (openBasket) {
209
- window.open(`${this.miamBasketURL}/${list.id}`, '_blank');
210
- }
211
- }
212
- }), map(l => l.data));
213
- }
214
- assignList(l) {
215
- // When a CORS error happens the response is a GL with an id equal to the request URL
216
- // In this case we don't change the GL
217
- if (l.id.toString().match(/^[0-9]+$/)) {
218
- if (l.attributes['user-id']) {
219
- localStorage.removeItem('_miam/listId');
220
- }
221
- else {
222
- localStorage.setItem('_miam/listId', l.id);
223
- }
224
- this._list$.next(l);
225
- this.listIsFetching = false;
226
- }
227
- }
228
- }
229
- GroceriesListsService.ɵfac = function GroceriesListsService_Factory(t) { return new (t || GroceriesListsService)(i0.ɵɵinject(MIAM_BASKET_PATH), i0.ɵɵinject(i1.HttpClient), i0.ɵɵinject(i2.AnalyticsService)); };
230
- GroceriesListsService.ɵprov = i0.ɵɵdefineInjectable({ token: GroceriesListsService, factory: GroceriesListsService.ɵfac, providedIn: 'root' });
231
- /*@__PURE__*/ (function () { i0.ɵsetClassMetadata(GroceriesListsService, [{
232
- type: Injectable,
233
- args: [{
234
- providedIn: 'root'
235
- }]
236
- }], function () { return [{ type: undefined, decorators: [{
237
- type: Inject,
238
- args: [MIAM_BASKET_PATH]
239
- }] }, { type: i1.HttpClient }, { type: i2.AnalyticsService }]; }, null); })();
240
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvY2VyaWVzLWxpc3RzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiL2J1aWxkcy9taWFtL25nLW1pYW0tc2RrL3Byb2plY3RzL25nLW1pYW0vc3JjLyIsInNvdXJjZXMiOlsibGliL19zZXJ2aWNlcy9ncm9jZXJpZXMtbGlzdHMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFvQixPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDeEQsT0FBTyxFQUFjLGVBQWUsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDakUsT0FBTyxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEYsT0FBTyxFQUFFLEVBQUUsSUFBSSxNQUFNLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFcEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzFELE9BQU8sRUFBRSxXQUFXLElBQUksQ0FBQyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2hELE9BQU8sRUFBRSxnQkFBZ0IsRUFBZ0MsTUFBTSxxQkFBcUIsQ0FBQzs7OztBQUVyRixXQUFXO0FBSVgsTUFBTSxPQUFPLHFCQUFzQixTQUFRLE9BQXNCO0lBaUIvRCxZQUNvQyxhQUFxQixFQUMvQyxJQUFnQixFQUNoQixnQkFBa0M7UUFFMUMsS0FBSyxFQUFFLENBQUM7UUFKMEIsa0JBQWEsR0FBYixhQUFhLENBQVE7UUFDL0MsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNoQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBbEI1Qyxh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aUJBQU07Z0JBQ0wsWUFBWSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQzVDO1lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7U0FDN0I7SUFDSCxDQUFDOzswRkE3UVUscUJBQXFCLGNBa0J0QixnQkFBZ0I7NkRBbEJmLHFCQUFxQixXQUFyQixxQkFBcUIsbUJBRnBCLE1BQU07a0RBRVAscUJBQXFCO2NBSGpDLFVBQVU7ZUFBQztnQkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQjs7c0JBbUJJLE1BQU07dUJBQUMsZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRG9jdW1lbnRSZXNvdXJjZSwgU2VydmljZSB9IGZyb20gJ25neC1qc29uYXBpJztcbmltcG9ydCB7IE9ic2VydmFibGUsIEJlaGF2aW9yU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIG1hcCwgc2tpcFdoaWxlLCBzd2l0Y2hNYXAsIHRha2UsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IHsgUmVjaXBlIH0gZnJvbSAnLi4vX21vZGVscyc7XG5pbXBvcnQgeyBHcm9jZXJpZXNMaXN0IH0gZnJvbSAnLi4vX21vZGVscy9ncm9jZXJpZXMtbGlzdCc7XG5pbXBvcnQgeyBlbnZpcm9ubWVudCBhcyBlIH0gZnJvbSAnLi4vZW52aXJvbm1lbnRzL2Vudmlyb25tZW50JztcbmltcG9ydCB7IE1JQU1fQkFTS0VUX1BBVEggfSBmcm9tICcuLi9wcm92aWRlcnMnO1xuaW1wb3J0IHsgQW5hbHl0aWNzU2VydmljZSwgQ3VzdG9tUHJvcGVydGllcywgRXZlbnRUcmFjZSB9IGZyb20gJy4vYW5hbHl0aWNzLnNlcnZpY2UnO1xuXG4vLyBAZHluYW1pY1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgR3JvY2VyaWVzTGlzdHNTZXJ2aWNlIGV4dGVuZHMgU2VydmljZTxHcm9jZXJpZXNMaXN0PiB7XG5cbiAgcmVzb3VyY2UgPSBHcm9jZXJpZXNMaXN0O1xuICB0eXBlID0gJ2dyb2Nlcmllcy1saXN0cyc7XG4gIC8vIFVudXNlZCBpbiBzZGsgYXQgdGhlIG1vbWVudCBidXQgYW55IGNsaWVudCBhcHAgY2FuIHN1YnNjcmliZSBvbiBpdCB0byBrbm93IHdoZW4gYSByZWNpcGUgaGFzIGJlZW4gYWRkZWRcbiAgcmVjaXBlV2FzQWRkZWQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDx7IGlkOiBzdHJpbmc7IGd1ZXN0cz86IHN0cmluZyB9W10+KFtdKTtcbiAgLy8gVW51c2VkIGluIHNkayBhdCB0aGUgbW9tZW50IGJ1dCBhbnkgY2xpZW50IGFwcCBjYW4gc3Vic2NyaWJlIG9uIGl0IHRvIGtub3cgd2hlbiBhIHJlY2lwZSBoYXMgYmVlbiBhZGRlZFxuICByZWNpcGVXYXNEZWxldGVkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8eyBpZDogc3RyaW5nOyBndWVzdHM/OiBzdHJpbmcgfVtdPihbXSk7XG4gIHJlY2lwZXNUb1JlbW92ZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8e2lkOiBzdHJpbmc7IGV2ZW50VHJhY2U6IEV2ZW50VHJhY2V9W10+KFtdKTtcbiAgaXNSZW1vdmluZ1JlY2lwZXMgPSBmYWxzZTtcbiAgLy8gU2luZ2xldG9uIGluc3RhbmNlIG9mIEdyb2Nlcmllc0xpc3RcbiAgcHJpdmF0ZSBfbGlzdCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEdyb2Nlcmllc0xpc3Q+KG51bGwpO1xuICBwcml2YXRlIHNhdmVPcGVyYXRpb25UeXBlID0gJyc7XG4gIHByaXZhdGUgY3VycmVudFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICAvLyBPYnNlcnZlIHRoZSBmZXRjaGluZyBvZiB0aGUgcmVjaXBlIHNvIGNhbGxzIHRvIGxpc3QkIGFyZSBkZWxheWVkIGluc3RlYWQgb2YgY2FsbGluZyByZWZyZXNoQ3VycmVudExpc3QgZG96ZW5zIG9mIHRpbWVzXG4gIHByaXZhdGUgbGlzdElzRmV0Y2hpbmcgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KE1JQU1fQkFTS0VUX1BBVEgpIHByaXZhdGUgbWlhbUJhc2tldFVSTDogc3RyaW5nLFxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcbiAgICBwcml2YXRlIGFuYWx5dGljc1NlcnZpY2U6IEFuYWx5dGljc1NlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnJlZ2lzdGVyKCk7XG4gICAgdGhpcy5yZWNpcGVzVG9SZW1vdmUucGlwZShcbiAgICAgIHNraXBXaGlsZSh0b1JlbW92ZSA9PiB0b1JlbW92ZS5sZW5ndGggPT09IDAgfHwgdGhpcy5pc1JlbW92aW5nUmVjaXBlcyksXG4gICAgICBkZWJvdW5jZVRpbWUoMjAwKSxcbiAgICAgIHRhcCgoKSA9PiB0aGlzLmVtcHR5UmVjaXBlc1RvUmVtb3ZlKCkpXG4gICAgKS5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXZSB3YW50IGxpc3QkIHRvIGJlIGEgc2luZ2xldG9uIHRoYXQgYWx3YXlzIHJldHVybnMgdGhlIHNhbWUgbGlzdCwgc28gaXQgaXMgZmV0Y2hlZCBvbmx5IHdoZW4gbmVjZXNzYXJ5LlxuICAgKiBBdCBhbnkgcG9pbnQgaW4gdGltZSB0aGUgbGlzdCBjYW4gYmUgZmV0Y2hlZCB2aWEgdGhlIHJlZnJlc2hDdXJyZW50TGlzdCBmdW5jdGlvbiAoaWYgd2Ugd2FudCB0byBmZXRjaCBpdCBvbiBzdGFydHVwIHRvIHNhdmUgdGltZSBsYXRlcilcbiAgICogQnV0IGlmIHJlZnJlc2hDdXJyZW50TGlzdCBpcyBub3QgY2FsbGVkLCB0aGUgbGlzdCB3aWxsIG9ubHkgYmUgZmV0Y2hlZCB0aGUgMXN0IHRpbWUgaXQgaXMgbmVlZGVkXG4gICAqL1xuICBnZXQgbGlzdCQoKTogQmVoYXZpb3JTdWJqZWN0PEdyb2Nlcmllc0xpc3Q+IHtcbiAgICBpZiAodGhpcy5fbGlzdCQudmFsdWUgfHwgdGhpcy5saXN0SXNGZXRjaGluZykgeyByZXR1cm4gdGhpcy5fbGlzdCQ7IH1cblxuICAgIHJldHVybiB0aGlzLnJlZnJlc2hDdXJyZW50TGlzdCgpO1xuICB9XG5cbiAgdGFrZUZpcnN0TGlzdCgpOiBPYnNlcnZhYmxlPEdyb2Nlcmllc0xpc3Q+IHtcbiAgICByZXR1cm4gdGhpcy5saXN0JC5waXBlKFxuICAgICAgc2tpcFdoaWxlKGwgPT4gIWwpLFxuICAgICAgdGFrZSgxKVxuICAgICk7XG4gIH1cblxuXG4gIC8vIENoZWNrIGlmIHJlY2lwZSB3aXRoIGlkID0gcmVjaXBlSWQgaXMgaW4gdGhlIEdyb2Nlcmllc0xpc3RcbiAgcmVjaXBlSXNJbkxpc3QocmVjaXBlSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLl9saXN0JC5waXBlKFxuICAgICAgc2tpcFdoaWxlKGwgPT4gIWwpLFxuICAgICAgdGFrZSgxKSxcbiAgICAgIG1hcChsaXN0ID0+IGxpc3QuaGFzUmVjaXBlKHJlY2lwZUlkKSlcbiAgICApO1xuICB9XG5cbiAgZ3Vlc3RzRm9yUmVjaXBlKHJlY2lwZTogUmVjaXBlKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fbGlzdCQudmFsdWU/Lmd1ZXN0c0ZvclJlY2lwZShyZWNpcGUpO1xuICB9XG5cbiAgcmVmcmVzaEN1cnJlbnRMaXN0KCk6IEJlaGF2aW9yU3ViamVjdDxHcm9jZXJpZXNMaXN0PiB7XG4gICAgY29uc29sZS5sb2coJ1tNaWFtXSByZWZyZXNoaW5nIGdsJyk7XG4gICAgdGhpcy5saXN0SXNGZXRjaGluZyA9IHRydWU7XG4gICAgY29uc3QgY2FjaGVkTGlzdElkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ19taWFtL2xpc3RJZCcpO1xuICAgIC8vIGFkZGluZyB0aGlzIHV1aWQgd2lsbCBmb3JjZSByZXF1ZXN0IHRvIGJlIHNlbnQgZXZlbiBpZiBvbmUgaXMgc3RpbGwgaW4gcHJvY2Vzc1xuICAgIC8vIHRoaW5rIGFib3V0IG1ha2luZyBhIHF1ZXVlIHRvIHByb2Nlc3MgcmVxdWVzdCBpbiBvcmRlclxuICAgIGNvbnN0IGJhc2VSb3V0ZSA9ICdjdXJyZW50P3VuaXFfdG9rZW49JyArICh1dWlkdjQgYXMgKCkgPT4gc3RyaW5nKSgpO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gY2FjaGVkTGlzdElkPy50b1N0cmluZygpLm1hdGNoKC9eWzAtOV0rJC8pID8gYmFzZVJvdXRlICsgJyZtZXJnZV93aXRoPScgKyBjYWNoZWRMaXN0SWQgOiBiYXNlUm91dGU7XG4gICAgLy8gYWx3YXkga2VlcCBvbmx5IHRoZSBsYXN0IHN1YnNjcmlwdGlvbiwgdGhhdCB3aWxsIG1ha2UgZm9yZ2V0IHRoZSBsYXN0IGNhbGxzXG4gICAgaWYgKHRoaXMuY3VycmVudFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5jdXJyZW50U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIHRoaXMuY3VycmVudFN1YnNjcmlwdGlvbiA9IHRoaXMuZ2V0KGVuZHBvaW50ICsgJyZpbmNsdWRlPWdyb2Nlcmllcy1lbnRyaWVzJykucGlwZShcbiAgICAgIHNraXBXaGlsZShsID0+IGwuaXNfbG9hZGluZyksXG4gICAgICB0YXAobCA9PiB0aGlzLmFzc2lnbkxpc3QobCkpXG4gICAgKS5zdWJzY3JpYmUoKTtcblxuICAgIHJldHVybiB0aGlzLl9saXN0JDtcbiAgfVxuXG4gIHJlc2V0TGlzdChldmVudFRyYWNlOiBFdmVudFRyYWNlID0ge29yaWdpblBhdGg6ICcnLCBwcm9wczoge319KTogT2JzZXJ2YWJsZTxHcm9jZXJpZXNMaXN0PiB7XG4gICAgdGhpcy5hbmFseXRpY3NTZXJ2aWNlLnNlbmRFdmVudFdoZW5SZWFkeSh0aGlzLmFuYWx5dGljc1NlcnZpY2UuRVZFTlRfUkVDSVBFX1JFU0VULCBldmVudFRyYWNlLm9yaWdpblBhdGgsIGV2ZW50VHJhY2UucHJvcHMpO1xuICAgIHJldHVybiAgdGhpcy50YWtlRmlyc3RMaXN0KCkucGlwZShcbiAgICAgIHRhcChnbCA9PiB7XG4gICAgICAgIGdsLnJlY2lwZUluZm9zLmZvckVhY2goaW5mbyA9PiB7XG4gICAgICAgICAgY29uc3QgbmV3UHJvcDogQ3VzdG9tUHJvcGVydGllcyA9IHsgcmVjaXBlX2lkOiBpbmZvLmlkIH07XG4gICAgICAgICAgY29uc3QgbWVyZ2VkUHJvcHMgPSBPYmplY3QuYXNzaWduKG5ld1Byb3AsIGV2ZW50VHJhY2UucHJvcHMpO1xuICAgICAgICAgIHRoaXMuYW5hbHl0aWNzU2VydmljZS5zZW5kRXZlbnRXaGVuUmVhZHkodGhpcy5hbmFseXRpY3NTZXJ2aWNlLkVWRU5UX1JFQ0lQRV9SRU1PVkUsIGV2ZW50VHJhY2Uub3JpZ2luUGF0aCwgbWVyZ2VkUHJvcHMpO1xuICAgICAgICB9KTtcbiAgICAgIH0pLFxuICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuZ2V0KCdyZXNldCcpLnBpcGUoXG4gICAgICAgIHNraXBXaGlsZShsID0+IGwuaXNfbG9hZGluZyksXG4gICAgICAgIHRhcChsID0+IHRoaXMuYXNzaWduTGlzdChsKSlcbiAgICAgICkpXG4gICAgKTtcbiAgfVxuXG4gIGFwcGVuZFJlY2lwZVRvTGlzdChyZWNpcGVJZDogc3RyaW5nLCBndWVzdHM6IG51bWJlciwgZXZlbnRUcmFjZTogRXZlbnRUcmFjZSwgb3BlbkJhc2tldDogYm9vbGVhbiA9IGZhbHNlKTogT2JzZXJ2YWJsZTxvYmplY3Q+IHtcbiAgICByZXR1cm4gdGhpcy50YWtlRmlyc3RMaXN0KCkucGlwZShcbiAgICAgIHN3aXRjaE1hcChsaXN0ID0+IHtcbiAgICAgICAgdGhpcy5hZGRPclVwZGF0ZVJlY2lwZUluTGlzdChsaXN0LCB7IGlkOiByZWNpcGVJZCwgZ3Vlc3RzIH0sIGV2ZW50VHJhY2UpO1xuICAgICAgICByZXR1cm4gdGhpcy5zYXZlTGlzdChsaXN0LCBvcGVuQmFza2V0KTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGFwcGVuZFJlY2lwZXNUb0xpc3QocmVjaXBlczogeyBpZDogc3RyaW5nOyBndWVzdHM6IG51bWJlciB9W10sIGV2ZW50VHJhY2U6IEV2ZW50VHJhY2UsIG9wZW5CYXNrZXQ6IGJvb2xlYW4gPSBmYWxzZSk6IE9ic2VydmFibGU8b2JqZWN0PiB7XG4gICAgcmV0dXJuIHRoaXMudGFrZUZpcnN0TGlzdCgpLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAobGlzdCA9PiB7XG4gICAgICAgIHJlY2lwZXMuZm9yRWFjaChyZWNpcGUgPT4ge1xuICAgICAgICAgIHRoaXMuYWRkT3JVcGRhdGVSZWNpcGVJbkxpc3QobGlzdCwgcmVjaXBlLCB7IG9yaWdpblBhdGg6IGV2ZW50VHJhY2Uub3JpZ2luUGF0aCwgcHJvcHM6IHsgcmVjaXBlX2lkOiByZWNpcGU/LmlkIH0gfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5zYXZlTGlzdChsaXN0LCBvcGVuQmFza2V0KTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkT3JVcGRhdGVSZWNpcGVJbkxpc3QobGlzdDogR3JvY2VyaWVzTGlzdCwgcmVjaXBlOiB7IGlkOiBzdHJpbmc7IGd1ZXN0czogbnVtYmVyIH0sIGV2ZW50VHJhY2U6IEV2ZW50VHJhY2UpOiB2b2lkIHtcbiAgICBpZiAoIWxpc3QuaGFzUmVjaXBlKHJlY2lwZS5pZCkpIHtcbiAgICAgIC8vIGFwcGVuZCB0byBsaXN0XG4gICAgICBsaXN0LmF0dHJpYnV0ZXNbJ2FwcGVuZC1yZWNpcGVzJ10gPSB0cnVlO1xuICAgICAgY29uc3QgaW5mbyA9IHsgaWQ6IHJlY2lwZS5pZCB9O1xuICAgICAgaWYgKHJlY2lwZS5ndWVzdHMpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihpbmZvLCB7IGd1ZXN0czogcmVjaXBlLmd1ZXN0cyB9KTtcbiAgICAgIH1cbiAgICAgIGxpc3QuYXR0cmlidXRlc1sncmVjaXBlcy1pbmZvcyddLnB1c2goaW5mbyk7XG4gICAgICB0aGlzLnNhdmVPcGVyYXRpb25UeXBlID0gJ0FERCc7XG4gICAgICB0aGlzLmFuYWx5dGljc1NlcnZpY2Uuc2VuZEV2ZW50V2hlblJlYWR5KHRoaXMuYW5hbHl0aWNzU2VydmljZS5FVkVOVF9SRUNJUEVfQURELCBldmVudFRyYWNlLm9yaWdpblBhdGgsIGV2ZW50VHJhY2UucHJvcHMpO1xuICAgIH0gZWxzZSBpZiAocmVjaXBlLmd1ZXN0cykge1xuICAgICAgLy8gdXBkYXRlIGd1ZXN0cyBudW1iZXJcbiAgICAgIGNvbnN0IGluZm8gPSBsaXN0LnJlY2lwZUluZm9zLmZpbmQoaSA9PiBpLmlkID09PSByZWNpcGUuaWQpO1xuICAgICAgaWYgKGluZm8uZ3Vlc3RzLnRvU3RyaW5nKCkgPT09IHJlY2lwZS5ndWVzdHMudG9TdHJpbmcoKSkge1xuICAgICAgICAvLyBBdm9pZCBzYXZpbmcgdGhlIGxpc3QgaWYgbm90aGluZyBjaGFuZ2VkXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGluZm8uZ3Vlc3RzID0gcmVjaXBlLmd1ZXN0cy50b1N0cmluZygpO1xuICAgICAgdGhpcy5hbmFseXRpY3NTZXJ2aWNlLnNlbmRFdmVudFdoZW5SZWFkeSh0aGlzLmFuYWx5dGljc1NlcnZpY2UuRVZFTlRfUkVDSVBFX0NIQU5HRUdVRVNUUywgZXZlbnRUcmFjZS5vcmlnaW5QYXRoLCBldmVudFRyYWNlLnByb3BzKTtcbiAgICB9XG4gIH1cblxuICByZW1vdmVSZWNpcGVGcm9tTGlzdChyZWNpcGVJZDogc3RyaW5nLCBldmVudFRyYWNlOiBFdmVudFRyYWNlKTogdm9pZCB7XG4gICAgY29uc3QgdG9SZW1vdmUgPSB0aGlzLnJlY2lwZXNUb1JlbW92ZS52YWx1ZTtcbiAgICB0b1JlbW92ZS5wdXNoKHsgaWQ6IHJlY2lwZUlkLCBldmVudFRyYWNlIH0pO1xuICAgIHRoaXMucmVjaXBlc1RvUmVtb3ZlLm5leHQodG9SZW1vdmUpO1xuICB9XG5cbiAgdXBkYXRlUmVjaXBlR3Vlc3RzKHJlY2lwZUlkOiBzdHJpbmcsIGd1ZXN0czogbnVtYmVyLCBldmVudFRyYWNlOiBFdmVudFRyYWNlKTogT2JzZXJ2YWJsZTxHcm9jZXJpZXNMaXN0PiAge1xuICAgIHRoaXMuYW5hbHl0aWNzU2VydmljZS5zZW5kRXZlbnRXaGVuUmVhZHkodGhpcy5hbmFseXRpY3NTZXJ2aWNlLkVWRU5UX1JFQ0lQRV9DSEFOR0VHVUVTVFMsIGV2ZW50VHJhY2Uub3JpZ2luUGF0aCwgZXZlbnRUcmFjZS5wcm9wcyk7XG4gICAgcmV0dXJuIHRoaXMudGFrZUZpcnN0TGlzdCgpLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAobGlzdCA9PiB7XG4gICAgICAgIGlmIChsaXN0LmF0dHJpYnV0ZXNbJ3JlY2lwZXMtaW5mb3MnXSkge1xuICAgICAgICAgIGNvbnN0IHJlY2lwZUluZm8gPSBsaXN0LmF0dHJpYnV0ZXNbJ3JlY2lwZXMtaW5mb3MnXS5maW5kKGluZm8gPT4gaW5mby5pZCA9PT0gcmVjaXBlSWQpO1xuICAgICAgICAgIHJlY2lwZUluZm8uZ3Vlc3RzID0gZ3Vlc3RzLnRvU3RyaW5nKCk7XG4gICAgICAgICAgdGhpcy5zYXZlT3BlcmF0aW9uVHlwZSA9ICdHVUVTVFMnO1xuICAgICAgICAgIHJldHVybiB0aGlzLnNhdmVMaXN0KGxpc3QpIDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9saXN0JDtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGFkZEVudHJpZXNGcm9tUGljdHVyZShmaWxlOiBGaWxlLCBpbmNsdWRlID0gW10sIGRpc2FibGVJbmdyZWRpZW50c01hdGNoaW5nID0gZmFsc2UpOiBPYnNlcnZhYmxlPEdyb2Nlcmllc0xpc3Q+IHtcbiAgICByZXR1cm4gdGhpcy50YWtlRmlyc3RMaXN0KCkucGlwZShcbiAgICAgIHN3aXRjaE1hcChsaXN0ID0+IHtcbiAgICAgICAgbGV0IHVybCA9IFtlLm1pYW1BUEksICdhcGkvdjEvZ3JvY2VyaWVzLWxpc3RzJywgbGlzdC5pZCwgJ2FkZF9lbnRyaWVzX2Zyb21fcGljdHVyZSddLmpvaW4oJy8nKTtcbiAgICAgICAgaWYgKGRpc2FibGVJbmdyZWRpZW50c01hdGNoaW5nKSB7XG4gICAgICAgICAgdXJsICs9ICc/ZGlzYWJsZV9tYXRjaGluZz10cnVlJztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmb3JtRGF0YTogRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdwaWN0dXJlJywgZmlsZSk7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnaW5jbHVkZScsIGluY2x1ZGUuam9pbignLCcpKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wYXRjaCh1cmwsIGZvcm1EYXRhKS5waXBlKFxuICAgICAgICAgIG1hcCgocmVzcG9uc2U6IERvY3VtZW50UmVzb3VyY2U8R3JvY2VyaWVzTGlzdD4pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGwgPSB0aGlzLm5ldygpO1xuICAgICAgICAgICAgbC5maWxsKHJlc3BvbnNlKTtcbiAgICAgICAgICAgIHRoaXMuX2xpc3QkLm5leHQobCk7XG4gICAgICAgICAgICByZXR1cm4gbDtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFdpbGwgY3JlYXRlIGEgdGVtcG9yYXJ5IGxpc3QgYW5kIHNldCBpdCBpbiBfbGlzdCQuIFRoZSBsaXN0IHdvbid0IGJlIG1hcmtlZCBhcyBjdXJyZW50IGFuZCB0aHVzXG4gICAqIHdpbGwgbm90IGJlIHJldXNlZFxuICAgKi9cbiAgY3JlYXRlVGVtcG9yYXJ5TGlzdCgpOiB2b2lkIHtcbiAgICB0aGlzLmxpc3RJc0ZldGNoaW5nID0gdHJ1ZTtcbiAgICB0aGlzLm5ldygpLnNhdmUoe2luY2x1ZGU6IFsnZ3JvY2VyaWVzLWVudHJpZXMnXX0pLnN1YnNjcmliZSgodGVtcG9yYXJ5TGlzdDogRG9jdW1lbnRSZXNvdXJjZTxHcm9jZXJpZXNMaXN0PikgPT4ge1xuICAgICAgdGhpcy5fbGlzdCQubmV4dCh0aGlzLmFmdGVyU2F2ZSh0ZW1wb3JhcnlMaXN0KSk7XG4gICAgICB0aGlzLmxpc3RJc0ZldGNoaW5nID0gZmFsc2U7XG4gICAgfSk7XG4gIH1cblxuICBlbXB0eVJlY2lwZXNUb1JlbW92ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmlzUmVtb3ZpbmdSZWNpcGVzID0gdHJ1ZTtcbiAgICBjb25zdCBpZHNUb1JlbW92ZSA9IHRoaXMucmVjaXBlc1RvUmVtb3ZlLnZhbHVlLm1hcChpID0+IGkuaWQpO1xuICAgIGlmIChpZHNUb1JlbW92ZS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBldmVudFRyYWNlID0gdGhpcy5yZWNpcGVzVG9SZW1vdmUudmFsdWVbMF0uZXZlbnRUcmFjZTtcbiAgICAgIHRoaXMudGFrZUZpcnN0TGlzdCgpLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcChsaXN0ID0+IHtcbiAgICAgICAgICBpZiAobGlzdC5hdHRyaWJ1dGVzWydyZWNpcGVzLWluZm9zJ10pIHtcbiAgICAgICAgICAgIGxpc3QuYXR0cmlidXRlc1sncmVjaXBlcy1pbmZvcyddID0gbGlzdC5hdHRyaWJ1dGVzWydyZWNpcGVzLWluZm9zJ10uZmlsdGVyKGluZm8gPT4gIWlkc1RvUmVtb3ZlLmluY2x1ZGVzKGluZm8uaWQpKTtcbiAgICAgICAgICAgIHRoaXMuYW5hbHl0aWNzU2VydmljZS5zZW5kRXZlbnRXaGVuUmVhZHkodGhpcy5hbmFseXRpY3NTZXJ2aWNlLkVWRU5UX1JFQ0lQRV9SRU1PVkUsIGV2ZW50VHJhY2Uub3JpZ2luUGF0aCwgZXZlbnRUcmFjZS5wcm9wcyk7XG4gICAgICAgICAgICB0aGlzLnNhdmVPcGVyYXRpb25UeXBlID0gJ1JFTU9WRSc7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zYXZlTGlzdChsaXN0KS5waXBlKFxuICAgICAgICAgICAgICB0YWtlKDEpXG4gICAgICAgICAgICApIDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuaXNSZW1vdmluZ1JlY2lwZXMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZWNpcGVzVG9SZW1vdmUubmV4dCh0aGlzLnJlY2lwZXNUb1JlbW92ZS52YWx1ZS5maWx0ZXIoaSA9PiAhaWRzVG9SZW1vdmUuaW5jbHVkZXMoaS5pZCkpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBzYXZlKCkgcmV0dXJucyBhbiBvYmplY3QgdGhhdCBpc24ndCBhIHJlc291cmNlIHNvIG1ldGhvZHMgYXJlbid0IGF0dGFjaGVkLCBzbyB3ZSBoYXZlIHRvIGRvIGEgbGl0dGxlIHRyaWNrXG4gICAqIEBwYXJhbSByZXMgcmVzdWx0IG9mIHRoZSBzYXZlXG4gICAqIEByZXR1cm5zIGNvcnJlY3QgR3JvY2VyaWVzTGlzdCB3aXRoIHRoZSByaWdodCBhdHRyaWJ1dGVzICYgbWV0aG9kc1xuICAgKi9cbiAgcHJpdmF0ZSBhZnRlclNhdmUocmVzOiBEb2N1bWVudFJlc291cmNlPEdyb2Nlcmllc0xpc3Q+KTogR3JvY2VyaWVzTGlzdCB7XG4gICAgY29uc3QgbGlzdCA9IHRoaXMubmV3KCk7XG4gICAgbGlzdC5maWxsKHJlcyk7XG4gICAgcmV0dXJuIGxpc3QgO1xuICB9XG5cbiAgcHJpdmF0ZSBzYXZlTGlzdChsaXN0OiBHcm9jZXJpZXNMaXN0LCBvcGVuQmFza2V0OiBib29sZWFuID0gZmFsc2UpOiBPYnNlcnZhYmxlPEdyb2Nlcmllc0xpc3Q+IHtcbiAgICBkZWxldGUobGlzdC5hdHRyaWJ1dGVzWydyZWNpcGVzLWlkcyddKTtcbiAgICBkZWxldGUobGlzdC5yZWxhdGlvbnNoaXBzWydncm9jZXJpZXMtZW50cmllcyddKTtcbiAgICByZXR1cm4gbGlzdC5zYXZlKHtpbmNsdWRlOiBbJ2dyb2Nlcmllcy1lbnRyaWVzJ119KS5waXBlKFxuICAgICAgc2tpcFdoaWxlKChsOiBEb2N1bWVudFJlc291cmNlPEdyb2Nlcmllc0xpc3Q+KSA9PiBsLmlzX2xvYWRpbmcpLFxuICAgICAgdGFwKGwgPT4ge1xuICAgICAgICBpZiAobD8uZGF0YT8uaWQpIHtcbiAgICAgICAgICB0aGlzLl9saXN0JC5uZXh0KHRoaXMuYWZ0ZXJTYXZlKGwpKTtcbiAgICAgICAgICBpZiAodGhpcy5zYXZlT3BlcmF0aW9uVHlwZSA9PT0gJ0FERCcpIHtcbiAgICAgICAgICAgIHRoaXMucmVjaXBlV2FzQWRkZWQkLm5leHQobGlzdC5yZWNpcGVJbmZvcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLnNhdmVPcGVyYXRpb25UeXBlID09PSAnUkVNT1ZFJykge1xuICAgICAgICAgICAgdGhpcy5yZWNpcGVXYXNEZWxldGVkJC5uZXh0KGxpc3QucmVjaXBlSW5mb3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnNhdmVPcGVyYXRpb25UeXBlID0gJyc7XG4gICAgICAgICAgaWYgKG9wZW5CYXNrZXQpIHtcbiAgICAgICAgICAgIHdpbmRvdy5vcGVuKGAke3RoaXMubWlhbUJhc2tldFVSTH0vJHtsaXN0LmlkfWAsICdfYmxhbmsnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgbWFwKGwgPT4gbC5kYXRhKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFzc2lnbkxpc3QobDogR3JvY2VyaWVzTGlzdCk6IHZvaWQge1xuICAgIC8vIFdoZW4gYSBDT1JTIGVycm9yIGhhcHBlbnMgdGhlIHJlc3BvbnNlIGlzIGEgR0wgd2l0aCBhbiBpZCBlcXVhbCB0byB0aGUgcmVxdWVzdCBVUkxcbiAgICAvLyBJbiB0aGlzIGNhc2Ugd2UgZG9uJ3QgY2hhbmdlIHRoZSBHTFxuICAgIGlmIChsLmlkLnRvU3RyaW5nKCkubWF0Y2goL15bMC05XSskLykpIHtcbiAgICAgIGlmIChsLmF0dHJpYnV0ZXNbJ3VzZXItaWQnXSkge1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnX21pYW0vbGlzdElkJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnX21pYW0vbGlzdElkJywgbC5pZCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9saXN0JC5uZXh0KGwpO1xuICAgICAgdGhpcy5saXN0SXNGZXRjaGluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -1,63 +0,0 @@
1
- import { HttpClient } from '@angular/common/http';
2
- import { Injectable } from '@angular/core';
3
- import { environment } from '../environments/environment';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "@angular/common/http";
6
- export class RecipeEventsService {
7
- constructor(http) {
8
- this.http = http;
9
- this.suggestionUrl = `${environment.miamAPI}/api/events/recipes`;
10
- this.ORIGIN_SUGGESTION = 'suggestion';
11
- this.ORIGIN_CATALOG = 'catalog';
12
- this.ACTION_PROPOSED = 'proposed';
13
- this.ACTION_SHOWN = 'shown';
14
- this.ACTION_DISPLAYED = 'displayed';
15
- this.ACTION_ADDED = 'added';
16
- this.ACTION_PUSHED = 'pushed';
17
- this.eventQueue = [];
18
- this.willAlreadyProcess = false;
19
- this.QUEUE_REFRESH_TIME_MS = 2000;
20
- }
21
- enqueueEvent(recipe, action) {
22
- if (!recipe.eventOrigin) {
23
- return;
24
- }
25
- const eventHash = {
26
- recipe_id: recipe.id,
27
- origin: recipe.eventOrigin,
28
- action,
29
- group_id: recipe.eventsGroupId
30
- };
31
- this.eventQueue.push(eventHash);
32
- if (this.willAlreadyProcess) {
33
- return;
34
- }
35
- this.willAlreadyProcess = true;
36
- setTimeout(() => { this.processQueue(); }, this.QUEUE_REFRESH_TIME_MS);
37
- }
38
- processQueue() {
39
- this.willAlreadyProcess = false;
40
- const eventsToProcess = this.eventQueue.splice(0, this.eventQueue.length);
41
- const url = `${this.suggestionUrl}/batch`;
42
- this.http.post(url, { batch: eventsToProcess }).subscribe();
43
- }
44
- sendEvent(recipe, action) {
45
- if (!recipe.eventOrigin) {
46
- return;
47
- }
48
- let url = `${this.suggestionUrl}/${recipe.id}/${recipe.eventOrigin}/${action}`;
49
- if (recipe.eventsGroupId) {
50
- url += `?group_id=${recipe.eventsGroupId}`;
51
- }
52
- this.http.post(url, {}).subscribe();
53
- }
54
- }
55
- RecipeEventsService.ɵfac = function RecipeEventsService_Factory(t) { return new (t || RecipeEventsService)(i0.ɵɵinject(i1.HttpClient)); };
56
- RecipeEventsService.ɵprov = i0.ɵɵdefineInjectable({ token: RecipeEventsService, factory: RecipeEventsService.ɵfac, providedIn: 'root' });
57
- /*@__PURE__*/ (function () { i0.ɵsetClassMetadata(RecipeEventsService, [{
58
- type: Injectable,
59
- args: [{
60
- providedIn: 'root'
61
- }]
62
- }], function () { return [{ type: i1.HttpClient }]; }, null); })();
63
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjaXBlLWV2ZW50cy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Ii9idWlsZHMvbWlhbS9uZy1taWFtLXNkay9wcm9qZWN0cy9uZy1taWFtL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9fc2VydmljZXMvcmVjaXBlLWV2ZW50cy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXpDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQzs7O0FBSzFELE1BQU0sT0FBTyxtQkFBbUI7SUFjOUIsWUFBb0IsSUFBZ0I7UUFBaEIsU0FBSSxHQUFKLElBQUksQ0FBWTtRQWJwQyxrQkFBYSxHQUFHLEdBQUcsV0FBVyxDQUFDLE9BQU8scUJBQXFCLENBQUM7UUFDNUQsc0JBQWlCLEdBQUcsWUFBWSxDQUFDO1FBQ2pDLG1CQUFjLEdBQUcsU0FBUyxDQUFDO1FBQzNCLG9CQUFlLEdBQUcsVUFBVSxDQUFDO1FBQzdCLGlCQUFZLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLHFCQUFnQixHQUFHLFdBQVcsQ0FBQztRQUMvQixpQkFBWSxHQUFHLE9BQU8sQ0FBQztRQUN2QixrQkFBYSxHQUFHLFFBQVEsQ0FBQztRQUVqQixlQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLHVCQUFrQixHQUFHLEtBQUssQ0FBQztRQUMzQiwwQkFBcUIsR0FBRyxJQUFJLENBQUM7SUFFRyxDQUFDO0lBRXpDLFlBQVksQ0FBQyxNQUFjLEVBQUUsTUFBYztRQUN6QyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBQztZQUN0QixPQUFPO1NBQ1I7UUFDRCxNQUFNLFNBQVMsR0FBRztZQUNoQixTQUFTLEVBQUUsTUFBTSxDQUFDLEVBQUU7WUFDcEIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxXQUFXO1lBQzFCLE1BQU07WUFDTixRQUFRLEVBQUUsTUFBTSxDQUFDLGFBQWE7U0FDL0IsQ0FBQztRQUNGLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2hDLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQUUsT0FBTztTQUFFO1FBRXhDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7UUFDL0IsVUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7UUFDaEMsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDMUUsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsYUFBYSxRQUFRLENBQUM7UUFDMUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUMsS0FBSyxFQUFFLGVBQWUsRUFBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDNUQsQ0FBQztJQUVELFNBQVMsQ0FBQyxNQUFjLEVBQUUsTUFBYztRQUN0QyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBQztZQUN0QixPQUFPO1NBQ1I7UUFDRCxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLElBQUksTUFBTSxDQUFDLEVBQUUsSUFBSSxNQUFNLENBQUMsV0FBVyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQy9FLElBQUksTUFBTSxDQUFDLGFBQWEsRUFBQztZQUN2QixHQUFHLElBQUksYUFBYSxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDNUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDdEMsQ0FBQzs7c0ZBakRVLG1CQUFtQjsyREFBbkIsbUJBQW1CLFdBQW5CLG1CQUFtQixtQkFGbEIsTUFBTTtrREFFUCxtQkFBbUI7Y0FIL0IsVUFBVTtlQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSZWNpcGUgfSBmcm9tICcuLi9fbW9kZWxzJztcbmltcG9ydCB7IGVudmlyb25tZW50IH0gZnJvbSAnLi4vZW52aXJvbm1lbnRzL2Vudmlyb25tZW50JztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgUmVjaXBlRXZlbnRzU2VydmljZSAge1xuICBzdWdnZXN0aW9uVXJsID0gYCR7ZW52aXJvbm1lbnQubWlhbUFQSX0vYXBpL2V2ZW50cy9yZWNpcGVzYDtcbiAgT1JJR0lOX1NVR0dFU1RJT04gPSAnc3VnZ2VzdGlvbic7XG4gIE9SSUdJTl9DQVRBTE9HID0gJ2NhdGFsb2cnO1xuICBBQ1RJT05fUFJPUE9TRUQgPSAncHJvcG9zZWQnO1xuICBBQ1RJT05fU0hPV04gPSAnc2hvd24nO1xuICBBQ1RJT05fRElTUExBWUVEID0gJ2Rpc3BsYXllZCc7XG4gIEFDVElPTl9BRERFRCA9ICdhZGRlZCc7XG4gIEFDVElPTl9QVVNIRUQgPSAncHVzaGVkJztcblxuICBwcml2YXRlIGV2ZW50UXVldWUgPSBbXTtcbiAgcHJpdmF0ZSB3aWxsQWxyZWFkeVByb2Nlc3MgPSBmYWxzZTtcbiAgcHJpdmF0ZSBRVUVVRV9SRUZSRVNIX1RJTUVfTVMgPSAyMDAwO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCkgeyB9XG5cbiAgZW5xdWV1ZUV2ZW50KHJlY2lwZTogUmVjaXBlLCBhY3Rpb246IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghcmVjaXBlLmV2ZW50T3JpZ2luKXtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZXZlbnRIYXNoID0ge1xuICAgICAgcmVjaXBlX2lkOiByZWNpcGUuaWQsXG4gICAgICBvcmlnaW46IHJlY2lwZS5ldmVudE9yaWdpbixcbiAgICAgIGFjdGlvbixcbiAgICAgIGdyb3VwX2lkOiByZWNpcGUuZXZlbnRzR3JvdXBJZFxuICAgIH07XG4gICAgdGhpcy5ldmVudFF1ZXVlLnB1c2goZXZlbnRIYXNoKTtcbiAgICBpZiAodGhpcy53aWxsQWxyZWFkeVByb2Nlc3MpIHsgcmV0dXJuOyB9XG5cbiAgICB0aGlzLndpbGxBbHJlYWR5UHJvY2VzcyA9IHRydWU7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7IHRoaXMucHJvY2Vzc1F1ZXVlKCk7IH0sIHRoaXMuUVVFVUVfUkVGUkVTSF9USU1FX01TKTtcbiAgfVxuXG4gIHByb2Nlc3NRdWV1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLndpbGxBbHJlYWR5UHJvY2VzcyA9IGZhbHNlO1xuICAgIGNvbnN0IGV2ZW50c1RvUHJvY2VzcyA9IHRoaXMuZXZlbnRRdWV1ZS5zcGxpY2UoMCwgdGhpcy5ldmVudFF1ZXVlLmxlbmd0aCk7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5zdWdnZXN0aW9uVXJsfS9iYXRjaGA7XG4gICAgdGhpcy5odHRwLnBvc3QodXJsLCB7YmF0Y2g6IGV2ZW50c1RvUHJvY2Vzc30pLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgc2VuZEV2ZW50KHJlY2lwZTogUmVjaXBlLCBhY3Rpb246IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghcmVjaXBlLmV2ZW50T3JpZ2luKXtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHVybCA9IGAke3RoaXMuc3VnZ2VzdGlvblVybH0vJHtyZWNpcGUuaWR9LyR7cmVjaXBlLmV2ZW50T3JpZ2lufS8ke2FjdGlvbn1gO1xuICAgIGlmIChyZWNpcGUuZXZlbnRzR3JvdXBJZCl7XG4gICAgICB1cmwgKz0gYD9ncm91cF9pZD0ke3JlY2lwZS5ldmVudHNHcm91cElkfWA7XG4gICAgfVxuICAgIHRoaXMuaHR0cC5wb3N0KHVybCwge30pLnN1YnNjcmliZSgpO1xuICB9XG59XG4iXX0=
@@ -1,7 +0,0 @@
1
- export var Skeleton;
2
- (function (Skeleton) {
3
- Skeleton[Skeleton["Picture"] = 0] = "Picture";
4
- Skeleton[Skeleton["Text"] = 1] = "Text";
5
- Skeleton[Skeleton["IconWithInfo"] = 2] = "IconWithInfo";
6
- })(Skeleton || (Skeleton = {}));
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2tlbGV0b24uZW51bS5qcyIsInNvdXJjZVJvb3QiOiIvYnVpbGRzL21pYW0vbmctbWlhbS1zZGsvcHJvamVjdHMvbmctbWlhbS9zcmMvIiwic291cmNlcyI6WyJsaWIvX3R5cGVzL3NrZWxldG9uLmVudW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFOLElBQVksUUFJWDtBQUpELFdBQVksUUFBUTtJQUNsQiw2Q0FBTyxDQUFBO0lBQ1AsdUNBQUksQ0FBQTtJQUNKLHVEQUFZLENBQUE7QUFDZCxDQUFDLEVBSlcsUUFBUSxLQUFSLFFBQVEsUUFJbkIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZW51bSBTa2VsZXRvbiB7XG4gIFBpY3R1cmUsXG4gIFRleHQsXG4gIEljb25XaXRoSW5mbyxcbn1cbiJdfQ==