@wix/patterns 1.324.0 → 1.325.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 (261) hide show
  1. package/dist/cjs/components/CardContainer/CardContainer.st.css.js +2 -2
  2. package/dist/cjs/components/CardContainer/CardContainer.st.css.js.map +1 -1
  3. package/dist/cjs/components/Collapse/Collapse.st.css.js +3 -3
  4. package/dist/cjs/components/Collapse/Collapse.st.css.js.map +1 -1
  5. package/dist/cjs/components/CollectionPageNew/CollectionPage.st.css.js +2 -2
  6. package/dist/cjs/components/CollectionPageNew/CollectionPage.st.css.js.map +1 -1
  7. package/dist/cjs/components/CollectionTable/CollectionTable.js +13 -11
  8. package/dist/cjs/components/CollectionTable/CollectionTable.js.map +1 -1
  9. package/dist/cjs/components/CollectionTable/CollectionTable.st.css.js +2 -2
  10. package/dist/cjs/components/CollectionTable/CollectionTable.st.css.js.map +1 -1
  11. package/dist/cjs/components/CollectionToolbar/CollectionToolbar.st.css.js +5 -5
  12. package/dist/cjs/components/CollectionToolbar/CollectionToolbar.st.css.js.map +1 -1
  13. package/dist/cjs/components/CollectionToolbar/SearchOrCustomFilter.st.css.js +4 -4
  14. package/dist/cjs/components/CollectionToolbar/SearchOrCustomFilter.st.css.js.map +1 -1
  15. package/dist/cjs/components/CollectionViewsDropdown/AutoCompleteReadonly.st.css.js +2 -2
  16. package/dist/cjs/components/CollectionViewsDropdown/AutoCompleteReadonly.st.css.js.map +1 -1
  17. package/dist/cjs/components/CollectionViewsDropdown/ViewsDropdown.st.css.js +2 -2
  18. package/dist/cjs/components/CollectionViewsDropdown/ViewsDropdown.st.css.js.map +1 -1
  19. package/dist/cjs/components/DragHandle/DragHandle.st.css.js +2 -2
  20. package/dist/cjs/components/DragHandle/DragHandle.st.css.js.map +1 -1
  21. package/dist/cjs/components/EntityPage/EntityPagePlain.st.css.js +2 -2
  22. package/dist/cjs/components/EntityPage/EntityPagePlain.st.css.js.map +1 -1
  23. package/dist/cjs/components/Fade/Fade.st.css.js +2 -2
  24. package/dist/cjs/components/Fade/Fade.st.css.js.map +1 -1
  25. package/dist/cjs/components/Heading/Heading.st.css.js +2 -2
  26. package/dist/cjs/components/Heading/Heading.st.css.js.map +1 -1
  27. package/dist/cjs/components/InputOverflow/InputOverflow.st.css.js +2 -2
  28. package/dist/cjs/components/InputOverflow/InputOverflow.st.css.js.map +1 -1
  29. package/dist/cjs/components/LoadingRow/LoadingRow.st.css.js +3 -3
  30. package/dist/cjs/components/LoadingRow/LoadingRow.st.css.js.map +1 -1
  31. package/dist/cjs/components/MaxHeightText/MaxHeightText.st.css.js +2 -2
  32. package/dist/cjs/components/MaxHeightText/MaxHeightText.st.css.js.map +1 -1
  33. package/dist/cjs/components/MaxLines/MaxLines.st.css.js +2 -2
  34. package/dist/cjs/components/MaxLines/MaxLines.st.css.js.map +1 -1
  35. package/dist/cjs/components/MultiBulkActionToolbar/MultiBulkActionToolbar.st.css.js +5 -5
  36. package/dist/cjs/components/MultiBulkActionToolbar/MultiBulkActionToolbar.st.css.js.map +1 -1
  37. package/dist/cjs/components/NestedTable/NestedTablePlaceholderStatesRow.st.css.js +2 -2
  38. package/dist/cjs/components/NestedTable/NestedTablePlaceholderStatesRow.st.css.js.map +1 -1
  39. package/dist/cjs/components/NestedTable/NestedTableRow.st.css.js +5 -5
  40. package/dist/cjs/components/NestedTable/NestedTableRow.st.css.js.map +1 -1
  41. package/dist/cjs/components/NestedTableDragAndDrop/MultipleDragOverlayEffect.st.css.js +2 -2
  42. package/dist/cjs/components/NestedTableDragAndDrop/MultipleDragOverlayEffect.st.css.js.map +1 -1
  43. package/dist/cjs/components/NestedTableDragAndDrop/NestedTableDragAndDropRow.st.css.js +2 -2
  44. package/dist/cjs/components/NestedTableDragAndDrop/NestedTableDragAndDropRow.st.css.js.map +1 -1
  45. package/dist/cjs/components/PickerContent/PickerContent.st.css.js +2 -2
  46. package/dist/cjs/components/PickerContent/PickerContent.st.css.js.map +1 -1
  47. package/dist/cjs/components/PickerContent/PickerContentAdditionalStep.st.css.js +4 -4
  48. package/dist/cjs/components/PickerContent/PickerContentAdditionalStep.st.css.js.map +1 -1
  49. package/dist/cjs/components/PickerTableListItem/PickerTableListItem.st.css.js +2 -2
  50. package/dist/cjs/components/PickerTableListItem/PickerTableListItem.st.css.js.map +1 -1
  51. package/dist/cjs/components/ScrollableContent/ScrollableContent.st.css.js +2 -2
  52. package/dist/cjs/components/ScrollableContent/ScrollableContent.st.css.js.map +1 -1
  53. package/dist/cjs/components/SkeletonCard/SkeletonCard.st.css.js +3 -3
  54. package/dist/cjs/components/SkeletonCard/SkeletonCard.st.css.js.map +1 -1
  55. package/dist/cjs/components/SlidingModal/SlidingModal.st.css.js +2 -2
  56. package/dist/cjs/components/SlidingModal/SlidingModal.st.css.js.map +1 -1
  57. package/dist/cjs/components/Suggestions/DESIGN_BI_REPORTING.md +73 -0
  58. package/dist/cjs/components/Suggestions/MarketingCard.js +18 -16
  59. package/dist/cjs/components/Suggestions/MarketingCard.js.map +1 -1
  60. package/dist/cjs/components/Suggestions/Suggestions.js +66 -29
  61. package/dist/cjs/components/Suggestions/Suggestions.js.map +1 -1
  62. package/dist/cjs/components/Suggestions/Suggestions.uni.driver.js +4 -5
  63. package/dist/cjs/components/Suggestions/Suggestions.uni.driver.js.map +1 -1
  64. package/dist/cjs/components/Suggestions/VisibilityTrackedCard.js +22 -0
  65. package/dist/cjs/components/Suggestions/VisibilityTrackedCard.js.map +1 -0
  66. package/dist/cjs/components/Suggestions/types.js.map +1 -1
  67. package/dist/cjs/components/TabsFilter/TabsFilter.st.css.js +3 -3
  68. package/dist/cjs/components/TabsFilter/TabsFilter.st.css.js.map +1 -1
  69. package/dist/cjs/components/Tags/ManageTags/ManageTagsModal/ManageTagsModal.st.css.js +2 -2
  70. package/dist/cjs/components/Tags/ManageTags/ManageTagsModal/ManageTagsModal.st.css.js.map +1 -1
  71. package/dist/cjs/components/ToolbarItem/ToolbarItem.st.css.js +2 -2
  72. package/dist/cjs/components/ToolbarItem/ToolbarItem.st.css.js.map +1 -1
  73. package/dist/cjs/components/ToolbarItemBox/ToolbarItemBox.st.css.js +2 -2
  74. package/dist/cjs/components/ToolbarItemBox/ToolbarItemBox.st.css.js.map +1 -1
  75. package/dist/cjs/components/common.st.css.js +4 -4
  76. package/dist/cjs/components/common.st.css.js.map +1 -1
  77. package/dist/cjs/exports/testkit/unidriver.js +1 -2
  78. package/dist/cjs/exports/testkit/unidriver.js.map +1 -1
  79. package/dist/cjs/hooks/useCollectionTableResize.js +3 -2
  80. package/dist/cjs/hooks/useCollectionTableResize.js.map +1 -1
  81. package/dist/cjs/hooks/useIntersectionObserver.js +36 -0
  82. package/dist/cjs/hooks/useIntersectionObserver.js.map +1 -0
  83. package/dist/cjs/state/CollectionPage/CollectionPageHeader.st.css.js +2 -2
  84. package/dist/cjs/state/CollectionPage/CollectionPageHeader.st.css.js.map +1 -1
  85. package/dist/cjs/state/FormPage/FormPageHeader.st.css.js +2 -2
  86. package/dist/cjs/state/FormPage/FormPageHeader.st.css.js.map +1 -1
  87. package/dist/cjs/state/Suggestions/SuggestionsBIReporter.js +38 -0
  88. package/dist/cjs/state/Suggestions/SuggestionsBIReporter.js.map +1 -0
  89. package/dist/cjs/state/Suggestions/SuggestionsState.js +26 -3
  90. package/dist/cjs/state/Suggestions/SuggestionsState.js.map +1 -1
  91. package/dist/cjs/styles.global.css +1 -1
  92. package/dist/cjs/test-utils/DealerBIMock.js +81 -0
  93. package/dist/cjs/test-utils/DealerBIMock.js.map +1 -0
  94. package/dist/cjs/test-utils/IntersectionObserverMock.js +155 -0
  95. package/dist/cjs/test-utils/IntersectionObserverMock.js.map +1 -0
  96. package/dist/cjs/version.js +1 -1
  97. package/dist/cjs/version.js.map +1 -1
  98. package/dist/esm/components/CardContainer/CardContainer.st.css.js +2 -2
  99. package/dist/esm/components/CardContainer/CardContainer.st.css.js.map +1 -1
  100. package/dist/esm/components/Collapse/Collapse.st.css.js +2 -2
  101. package/dist/esm/components/Collapse/Collapse.st.css.js.map +1 -1
  102. package/dist/esm/components/CollectionPageNew/CollectionPage.st.css.js +2 -2
  103. package/dist/esm/components/CollectionPageNew/CollectionPage.st.css.js.map +1 -1
  104. package/dist/esm/components/CollectionTable/CollectionTable.js +3 -1
  105. package/dist/esm/components/CollectionTable/CollectionTable.js.map +1 -1
  106. package/dist/esm/components/CollectionTable/CollectionTable.st.css.js +2 -2
  107. package/dist/esm/components/CollectionToolbar/CollectionToolbar.st.css.js +2 -2
  108. package/dist/esm/components/CollectionToolbar/SearchOrCustomFilter.st.css.js +2 -2
  109. package/dist/esm/components/CollectionToolbar/SearchOrCustomFilter.st.css.js.map +1 -1
  110. package/dist/esm/components/CollectionViewsDropdown/AutoCompleteReadonly.st.css.js +2 -2
  111. package/dist/esm/components/CollectionViewsDropdown/ViewsDropdown.st.css.js +2 -2
  112. package/dist/esm/components/DragHandle/DragHandle.st.css.js +2 -2
  113. package/dist/esm/components/EntityPage/EntityPagePlain.st.css.js +2 -2
  114. package/dist/esm/components/Fade/Fade.st.css.js +2 -2
  115. package/dist/esm/components/Fade/Fade.st.css.js.map +1 -1
  116. package/dist/esm/components/Heading/Heading.st.css.js +2 -2
  117. package/dist/esm/components/InputOverflow/InputOverflow.st.css.js +2 -2
  118. package/dist/esm/components/LoadingRow/LoadingRow.st.css.js +3 -3
  119. package/dist/esm/components/LoadingRow/LoadingRow.st.css.js.map +1 -1
  120. package/dist/esm/components/MaxHeightText/MaxHeightText.st.css.js +2 -2
  121. package/dist/esm/components/MaxLines/MaxLines.st.css.js +2 -2
  122. package/dist/esm/components/MultiBulkActionToolbar/MultiBulkActionToolbar.st.css.js +2 -2
  123. package/dist/esm/components/MultiBulkActionToolbar/MultiBulkActionToolbar.st.css.js.map +1 -1
  124. package/dist/esm/components/NestedTable/NestedTablePlaceholderStatesRow.st.css.js +2 -2
  125. package/dist/esm/components/NestedTable/NestedTablePlaceholderStatesRow.st.css.js.map +1 -1
  126. package/dist/esm/components/NestedTable/NestedTableRow.st.css.js +2 -2
  127. package/dist/esm/components/NestedTableDragAndDrop/MultipleDragOverlayEffect.st.css.js +2 -2
  128. package/dist/esm/components/NestedTableDragAndDrop/NestedTableDragAndDropRow.st.css.js +2 -2
  129. package/dist/esm/components/NestedTableDragAndDrop/NestedTableDragAndDropRow.st.css.js.map +1 -1
  130. package/dist/esm/components/PickerContent/PickerContent.st.css.js +2 -2
  131. package/dist/esm/components/PickerContent/PickerContentAdditionalStep.st.css.js +2 -2
  132. package/dist/esm/components/PickerContent/PickerContentAdditionalStep.st.css.js.map +1 -1
  133. package/dist/esm/components/PickerTableListItem/PickerTableListItem.st.css.js +2 -2
  134. package/dist/esm/components/ScrollableContent/ScrollableContent.st.css.js +2 -2
  135. package/dist/esm/components/SkeletonCard/SkeletonCard.st.css.js +2 -2
  136. package/dist/esm/components/SlidingModal/SlidingModal.st.css.js +2 -2
  137. package/dist/esm/components/Suggestions/DESIGN_BI_REPORTING.md +73 -0
  138. package/dist/esm/components/Suggestions/MarketingCard.js +5 -4
  139. package/dist/esm/components/Suggestions/MarketingCard.js.map +1 -1
  140. package/dist/esm/components/Suggestions/Suggestions.js +21 -13
  141. package/dist/esm/components/Suggestions/Suggestions.js.map +1 -1
  142. package/dist/esm/components/Suggestions/Suggestions.uni.driver.js +4 -5
  143. package/dist/esm/components/Suggestions/Suggestions.uni.driver.js.map +1 -1
  144. package/dist/esm/components/Suggestions/VisibilityTrackedCard.js +10 -0
  145. package/dist/esm/components/Suggestions/VisibilityTrackedCard.js.map +1 -0
  146. package/dist/esm/components/TabsFilter/TabsFilter.st.css.js +2 -2
  147. package/dist/esm/components/TabsFilter/TabsFilter.st.css.js.map +1 -1
  148. package/dist/esm/components/Tags/ManageTags/ManageTagsModal/ManageTagsModal.st.css.js +2 -2
  149. package/dist/esm/components/ToolbarItem/ToolbarItem.st.css.js +2 -2
  150. package/dist/esm/components/ToolbarItemBox/ToolbarItemBox.st.css.js +2 -2
  151. package/dist/esm/components/common.st.css.js +2 -2
  152. package/dist/esm/exports/testkit/unidriver.js +1 -1
  153. package/dist/esm/exports/testkit/unidriver.js.map +1 -1
  154. package/dist/esm/hooks/useCollectionTableResize.js +2 -1
  155. package/dist/esm/hooks/useCollectionTableResize.js.map +1 -1
  156. package/dist/esm/hooks/useIntersectionObserver.js +32 -0
  157. package/dist/esm/hooks/useIntersectionObserver.js.map +1 -0
  158. package/dist/esm/state/CollectionPage/CollectionPageHeader.st.css.js +2 -2
  159. package/dist/esm/state/CollectionPage/CollectionPageHeader.st.css.js.map +1 -1
  160. package/dist/esm/state/FormPage/FormPageHeader.st.css.js +2 -2
  161. package/dist/esm/state/FormPage/FormPageHeader.st.css.js.map +1 -1
  162. package/dist/esm/state/Suggestions/SuggestionsBIReporter.js +26 -0
  163. package/dist/esm/state/Suggestions/SuggestionsBIReporter.js.map +1 -0
  164. package/dist/esm/state/Suggestions/SuggestionsState.js +23 -3
  165. package/dist/esm/state/Suggestions/SuggestionsState.js.map +1 -1
  166. package/dist/esm/styles.global.css +1 -1
  167. package/dist/esm/test-utils/DealerBIMock.js +75 -0
  168. package/dist/esm/test-utils/DealerBIMock.js.map +1 -0
  169. package/dist/esm/test-utils/IntersectionObserverMock.js +133 -0
  170. package/dist/esm/test-utils/IntersectionObserverMock.js.map +1 -0
  171. package/dist/esm/version.js +1 -1
  172. package/dist/types/components/CardContainer/CardContainer.st.css.d.ts.map +1 -1
  173. package/dist/types/components/Collapse/Collapse.st.css.d.ts.map +1 -1
  174. package/dist/types/components/CollectionPageNew/CollectionPage.st.css.d.ts.map +1 -1
  175. package/dist/types/components/CollectionTable/CollectionTable.d.ts.map +1 -1
  176. package/dist/types/components/CollectionToolbar/SearchOrCustomFilter.st.css.d.ts.map +1 -1
  177. package/dist/types/components/Fade/Fade.st.css.d.ts.map +1 -1
  178. package/dist/types/components/LoadingRow/LoadingRow.st.css.d.ts.map +1 -1
  179. package/dist/types/components/MultiBulkActionToolbar/MultiBulkActionToolbar.st.css.d.ts.map +1 -1
  180. package/dist/types/components/NestedTable/NestedTablePlaceholderStatesRow.st.css.d.ts.map +1 -1
  181. package/dist/types/components/NestedTableDragAndDrop/NestedTableDragAndDropRow.st.css.d.ts.map +1 -1
  182. package/dist/types/components/PickerContent/PickerContentAdditionalStep.st.css.d.ts.map +1 -1
  183. package/dist/types/components/Suggestions/MarketingCard.d.ts +1 -1
  184. package/dist/types/components/Suggestions/MarketingCard.d.ts.map +1 -1
  185. package/dist/types/components/Suggestions/Suggestions.d.ts +10 -0
  186. package/dist/types/components/Suggestions/Suggestions.d.ts.map +1 -1
  187. package/dist/types/components/Suggestions/Suggestions.uni.driver.d.ts +1 -7
  188. package/dist/types/components/Suggestions/Suggestions.uni.driver.d.ts.map +1 -1
  189. package/dist/types/components/Suggestions/VisibilityTrackedCard.d.ts +8 -0
  190. package/dist/types/components/Suggestions/VisibilityTrackedCard.d.ts.map +1 -0
  191. package/dist/types/components/Suggestions/types.d.ts +5 -2
  192. package/dist/types/components/Suggestions/types.d.ts.map +1 -1
  193. package/dist/types/components/TabsFilter/TabsFilter.st.css.d.ts.map +1 -1
  194. package/dist/types/exports/testkit/unidriver.d.ts +1 -1
  195. package/dist/types/exports/testkit/unidriver.d.ts.map +1 -1
  196. package/dist/types/hooks/useCollectionTableResize.d.ts +2 -1
  197. package/dist/types/hooks/useCollectionTableResize.d.ts.map +1 -1
  198. package/dist/types/hooks/useIntersectionObserver.d.ts +5 -0
  199. package/dist/types/hooks/useIntersectionObserver.d.ts.map +1 -0
  200. package/dist/types/state/CollectionPage/CollectionPageHeader.st.css.d.ts.map +1 -1
  201. package/dist/types/state/FormPage/FormPageHeader.st.css.d.ts.map +1 -1
  202. package/dist/types/state/Suggestions/SuggestionsBIReporter.d.ts +16 -0
  203. package/dist/types/state/Suggestions/SuggestionsBIReporter.d.ts.map +1 -0
  204. package/dist/types/state/Suggestions/SuggestionsState.d.ts +8 -3
  205. package/dist/types/state/Suggestions/SuggestionsState.d.ts.map +1 -1
  206. package/dist/types/test-utils/DealerBIMock.d.ts +71 -0
  207. package/dist/types/test-utils/DealerBIMock.d.ts.map +1 -0
  208. package/dist/types/test-utils/IntersectionObserverMock.d.ts +93 -0
  209. package/dist/types/test-utils/IntersectionObserverMock.d.ts.map +1 -0
  210. package/dist/types/version.d.ts +1 -1
  211. package/package.json +4 -4
  212. package/src/components/CardContainer/CardContainer.st.css.ts +2 -2
  213. package/src/components/Collapse/Collapse.st.css.ts +2 -2
  214. package/src/components/CollectionPageNew/CollectionPage.st.css.ts +2 -2
  215. package/src/components/CollectionTable/CollectionTable.st.css.ts +2 -2
  216. package/src/components/CollectionTable/CollectionTable.tsx +4 -1
  217. package/src/components/CollectionToolbar/CollectionToolbar.st.css.ts +2 -2
  218. package/src/components/CollectionToolbar/SearchOrCustomFilter.st.css.ts +2 -2
  219. package/src/components/CollectionViewsDropdown/AutoCompleteReadonly.st.css.ts +2 -2
  220. package/src/components/CollectionViewsDropdown/ViewsDropdown.st.css.ts +2 -2
  221. package/src/components/DragHandle/DragHandle.st.css.ts +2 -2
  222. package/src/components/EntityPage/EntityPagePlain.st.css.ts +2 -2
  223. package/src/components/Fade/Fade.st.css.ts +2 -2
  224. package/src/components/Heading/Heading.st.css.ts +2 -2
  225. package/src/components/InputOverflow/InputOverflow.st.css.ts +2 -2
  226. package/src/components/LoadingRow/LoadingRow.st.css.ts +3 -3
  227. package/src/components/MaxHeightText/MaxHeightText.st.css.ts +2 -2
  228. package/src/components/MaxLines/MaxLines.st.css.ts +2 -2
  229. package/src/components/MultiBulkActionToolbar/MultiBulkActionToolbar.st.css.ts +2 -2
  230. package/src/components/NestedTable/NestedTablePlaceholderStatesRow.st.css.ts +2 -2
  231. package/src/components/NestedTable/NestedTableRow.st.css.ts +2 -2
  232. package/src/components/NestedTableDragAndDrop/MultipleDragOverlayEffect.st.css.ts +2 -2
  233. package/src/components/NestedTableDragAndDrop/NestedTableDragAndDropRow.st.css.ts +2 -2
  234. package/src/components/PickerContent/PickerContent.st.css.ts +2 -2
  235. package/src/components/PickerContent/PickerContentAdditionalStep.st.css.ts +2 -2
  236. package/src/components/PickerTableListItem/PickerTableListItem.st.css.ts +2 -2
  237. package/src/components/ScrollableContent/ScrollableContent.st.css.ts +2 -2
  238. package/src/components/SkeletonCard/SkeletonCard.st.css.ts +2 -2
  239. package/src/components/SlidingModal/SlidingModal.st.css.ts +2 -2
  240. package/src/components/Suggestions/DESIGN_BI_REPORTING.md +73 -0
  241. package/src/components/Suggestions/MarketingCard.tsx +17 -8
  242. package/src/components/Suggestions/Suggestions.tsx +54 -18
  243. package/src/components/Suggestions/Suggestions.uni.driver.ts +4 -16
  244. package/src/components/Suggestions/VisibilityTrackedCard.tsx +20 -0
  245. package/src/components/Suggestions/types.ts +5 -2
  246. package/src/components/TabsFilter/TabsFilter.st.css.ts +2 -2
  247. package/src/components/Tags/ManageTags/ManageTagsModal/ManageTagsModal.st.css.ts +2 -2
  248. package/src/components/ToolbarItem/ToolbarItem.st.css.ts +2 -2
  249. package/src/components/ToolbarItemBox/ToolbarItemBox.st.css.ts +2 -2
  250. package/src/components/common.st.css.ts +2 -2
  251. package/src/exports/testkit/unidriver.ts +1 -4
  252. package/src/hooks/useCollectionTableResize.ts +3 -0
  253. package/src/hooks/useIntersectionObserver.ts +44 -0
  254. package/src/state/CollectionPage/CollectionPageHeader.st.css.ts +2 -2
  255. package/src/state/FormPage/FormPageHeader.st.css.ts +2 -2
  256. package/src/state/Suggestions/SuggestionsBIReporter.ts +44 -0
  257. package/src/state/Suggestions/SuggestionsState.ts +38 -5
  258. package/src/styles.global.css +1 -1
  259. package/src/test-utils/DealerBIMock.ts +123 -0
  260. package/src/test-utils/IntersectionObserverMock.ts +155 -0
  261. package/src/version.ts +1 -1
@@ -0,0 +1,44 @@
1
+ import { useEffect, useRef, useState } from 'react';
2
+
3
+ export function useIntersectionObserver(
4
+ callback: () => void,
5
+ threshold: number = 0.9,
6
+ ) {
7
+ const elementRef = useRef<HTMLElement | null>(null);
8
+ const [intersectionObserver] = useState(() => {
9
+ // in jsdom, IntersectionObserver is not implemeted
10
+ if (typeof IntersectionObserver === 'undefined') {
11
+ return null;
12
+ }
13
+
14
+ return new IntersectionObserver(
15
+ ([entry]) => {
16
+ if (entry.isIntersecting) {
17
+ callback();
18
+ intersectionObserver?.disconnect();
19
+ }
20
+ },
21
+ {
22
+ threshold,
23
+ },
24
+ );
25
+ });
26
+
27
+ useEffect(() => {
28
+ const element = elementRef.current;
29
+
30
+ if (!element || !intersectionObserver) {
31
+ return;
32
+ }
33
+
34
+ intersectionObserver.observe(element);
35
+
36
+ return () => {
37
+ intersectionObserver.disconnect();
38
+ };
39
+ }, []);
40
+
41
+ return {
42
+ elementRef,
43
+ };
44
+ }
@@ -5,7 +5,7 @@ import { classesRuntime, statesRuntime } from "../../stylable-esm-runtime.js";
5
5
 
6
6
 
7
7
 
8
- var _namespace_ = "CollectionPageHeader4131588040";
8
+ var _namespace_ = "CollectionPageHeader736711144";
9
9
  var _style_ = classesRuntime.bind(null, _namespace_);
10
10
 
11
11
  export var cssStates = statesRuntime.bind(null, _namespace_);
@@ -13,7 +13,7 @@ export var style = _style_;
13
13
  export var st: import("@stylable/runtime").STFunction = _style_;
14
14
 
15
15
  export var namespace = _namespace_;
16
- export var classes = {"root":"CollectionPageHeader4131588040__root"};
16
+ export var classes = {"root":"CollectionPageHeader736711144__root"};
17
17
  export var keyframes = {};
18
18
  export var layers = {};
19
19
  export var containers = {};
@@ -5,7 +5,7 @@ import { classesRuntime, statesRuntime } from "../../stylable-esm-runtime.js";
5
5
 
6
6
 
7
7
 
8
- var _namespace_ = "FormPageHeader476015855";
8
+ var _namespace_ = "FormPageHeader3304963303";
9
9
  var _style_ = classesRuntime.bind(null, _namespace_);
10
10
 
11
11
  export var cssStates = statesRuntime.bind(null, _namespace_);
@@ -13,7 +13,7 @@ export var style = _style_;
13
13
  export var st: import("@stylable/runtime").STFunction = _style_;
14
14
 
15
15
  export var namespace = _namespace_;
16
- export var classes = {"root":"FormPageHeader476015855__root"};
16
+ export var classes = {"root":"FormPageHeader3304963303__root"};
17
17
  export var keyframes = {};
18
18
  export var layers = {};
19
19
  export var containers = {};
@@ -0,0 +1,44 @@
1
+ import { ReportBI, WixPatternsContainerParams } from '@wix/bex-core';
2
+ import { loadEnd, loadStart } from '@wix/bex-core/bi';
3
+ import { reportEvent } from '@wix/bex-utils/@wix/ambassador-dealer-v1-offer-event/http';
4
+ import { EventType } from '@wix/bex-utils/@wix/ambassador-dealer-v1-offer-event/types';
5
+
6
+ export interface SuggestionsBIReporterParams {
7
+ reportBI: ReportBI;
8
+ realEstateId: string;
9
+ httpClient: WixPatternsContainerParams['httpClient'];
10
+ }
11
+
12
+ export class SuggestionsBIReporter {
13
+ readonly reportBI: ReportBI;
14
+ readonly httpClient: WixPatternsContainerParams['httpClient'];
15
+ readonly realEstateId: string;
16
+
17
+ constructor(params: SuggestionsBIReporterParams) {
18
+ this.reportBI = params.reportBI;
19
+ this.realEstateId = params.realEstateId;
20
+ this.httpClient = params.httpClient;
21
+ }
22
+
23
+ loadStart() {
24
+ this.reportBI(loadStart({}));
25
+ }
26
+
27
+ loadEnd(startTime: DOMHighResTimeStamp) {
28
+ this.reportBI(
29
+ loadEnd({ loadingTime: Math.round(performance.now() - startTime) }),
30
+ );
31
+ }
32
+
33
+ reportOfferViewed(offerId: string) {
34
+ this.httpClient.request(
35
+ reportEvent({
36
+ event: {
37
+ type: EventType.VIEW,
38
+ offerId,
39
+ realEstateId: this.realEstateId,
40
+ },
41
+ }),
42
+ );
43
+ }
44
+ }
@@ -1,21 +1,42 @@
1
1
  import { Offer } from '@wix/bex-utils/@wix/ambassador-dealer-v1-serving-offer/types';
2
2
  import { listOffers } from '@wix/bex-utils/@wix/ambassador-dealer-v1-serving-offer/http';
3
3
  import { computed, makeObservable } from 'mobx';
4
- import { TaskState, WixPatternsContainerParams } from '@wix/bex-core';
4
+ import {
5
+ ReportBI,
6
+ TaskState,
7
+ WixPatternsContainer,
8
+ WixPatternsContainerParams,
9
+ } from '@wix/bex-core';
10
+ import { SuggestionsBIReporter } from './SuggestionsBIReporter';
5
11
 
6
12
  export interface SuggestionsStateParams {
7
13
  placementId: string;
8
- httpClient: WixPatternsContainerParams['httpClient'];
14
+ container: WixPatternsContainer;
9
15
  }
10
16
 
11
17
  export class SuggestionsState {
12
18
  readonly placementId: string;
13
- readonly httpClient: WixPatternsContainerParams['httpClient'];
19
+ readonly container: WixPatternsContainer;
14
20
  readonly fetchOffersTask = new TaskState<Offer[]>();
21
+ readonly reportBI: ReportBI;
22
+
23
+ readonly bi: SuggestionsBIReporter;
24
+ readonly httpClient: WixPatternsContainerParams['httpClient'];
15
25
 
16
26
  constructor(params: SuggestionsStateParams) {
17
27
  this.placementId = params.placementId;
18
- this.httpClient = params.httpClient;
28
+ this.container = params.container;
29
+ this.httpClient = this.container.httpClient;
30
+ this.reportBI = this.container.createBILogger({
31
+ componentType: 'suggestionsWidget',
32
+ route: window.location.pathname,
33
+ });
34
+
35
+ this.bi = new SuggestionsBIReporter({
36
+ reportBI: this.reportBI,
37
+ realEstateId: this.placementId,
38
+ httpClient: this.httpClient,
39
+ });
19
40
 
20
41
  makeObservable(this, {
21
42
  offers: computed,
@@ -25,7 +46,15 @@ export class SuggestionsState {
25
46
  }
26
47
 
27
48
  init = () => {
28
- this.fetchOffersTask.runOnce(this._fetchOffers);
49
+ const startTime = performance.now();
50
+
51
+ this.bi.loadStart();
52
+
53
+ this.fetchOffersTask.runOnce(async () => {
54
+ const offers = await this._fetchOffers();
55
+ this.bi.loadEnd(startTime);
56
+ return offers;
57
+ });
29
58
  };
30
59
 
31
60
  private _fetchOffers = async () => {
@@ -50,4 +79,8 @@ export class SuggestionsState {
50
79
  get hasOffers() {
51
80
  return this.offers.length > 0;
52
81
  }
82
+
83
+ onOfferViewed(offerId: string) {
84
+ this.bi.reportOfferViewed(offerId);
85
+ }
53
86
  }
@@ -1 +1 @@
1
- .CardContainer2170180015__root.CardContainer2170180015--mobile{border-radius:0}.Collapse2302586638__root{transition-property:height;transition-timing-function:cubic-bezier(.4,0,.2,1)}.Collapse2302586638__exit{height:0}.CollectionPage462372587__root [data-hook=page-header-wrapper]{--wds-space-300:18px}.CollectionPage462372587__root.CollectionPage462372587--mobile{--wds-page-header-padding-horizontal:0;--wds-color-fill-surface-sunken:#ffffff}.CollectionPage462372587__root.CollectionPage462372587--panel{overflow:hidden;position:relative}.CollectionTable764384252__root td{vertical-align:middle}.CollectionTable764384252__root.CollectionTable764384252--mobile td:first-child{padding-left:18px}.CollectionTable764384252__root.CollectionTable764384252--mobile td:last-child{padding-right:18px}.CollectionToolbar1427703721__left{min-width:0}.CollectionToolbar1427703721__root.CollectionToolbar1427703721--views .CollectionToolbar1427703721__left{flex-shrink:1;flex-grow:0}.CollectionToolbar1427703721__left.CollectionToolbar1427703721--expandable{flex:auto}.CollectionToolbar1427703721__root .CollectionToolbar1427703721__right{justify-content:flex-end!important;flex-grow:1;flex-shrink:1;flex-basis:auto}.CollectionToolbar1427703721__root.CollectionToolbar1427703721--views .CollectionToolbar1427703721__right{min-width:0;flex-grow:1;flex-shrink:0;flex-basis:0}.CollectionToolbar1427703721__root .CollectionToolbar1427703721__right.CollectionToolbar1427703721__fullWidth{margin-inline-start:0!important}.CollectionToolbar1427703721__root.CollectionToolbar1427703721--mobile{padding-right:18px;padding-left:18px}.SearchOrCustomFilter3667856890__search{min-width:140px;max-width:240px;flex:1 0}.SearchOrCustomFilter3667856890__searchMobile{justify-content:flex-end;position:absolute;right:18px}.SearchOrCustomFilter3667856890__searchMobile:not(.SearchOrCustomFilter3667856890--expandable){left:18px}.SearchOrCustomFilter3667856890__searchMobile.SearchOrCustomFilter3667856890--expandable.SearchOrCustomFilter3667856890--expanded{left:18px}.AutoCompleteReadonly3174350507__root.AutoCompleteReadonly3174350507--disableEditing{cursor:pointer}.AutoCompleteReadonly3174350507__root.AutoCompleteReadonly3174350507--disableEditing input{cursor:pointer}.ViewsDropdown3394695892__root{width:200px}.DragHandle1654597455__root{display:flex;align-items:center}.DragHandle1654597455__root:not(.DragHandle1654597455--disabled){cursor:grab;color:#a8caff}.DragHandle1654597455__root.DragHandle1654597455--disabled{color:#acafc4}.DragHandle1654597455__root:focus-visible:not(.DragHandle1654597455--disabled){outline:0;box-shadow:0 0 0 3px #a6d0ff}.DragHandle1654597455__root.DragHandle1654597455--disabled{pointer-events:none}.DragHandle1654597455__root.DragHandle1654597455--dragging:not(.DragHandle1654597455--disabled){cursor:grabbing}.EntityPagePlain3313101122__root.EntityPagePlain3313101122--mobile{--wds-page-header-padding-horizontal:0}.Fade940409182__root{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);opacity:1}.Fade940409182__root.Fade940409182--exit{opacity:0}.Heading3697161820__root{visibility:visible}.Heading3697161820__root.Heading3697161820--appearanceH2{font-size:28px!important;line-height:36px!important}.InputOverflow2254481690__root.InputOverflow2254481690--selected:not(.InputOverflow2254481690--focused) input::placeholder{color:#000624}@keyframes LoadingRow697099013__gradientSwoosh{0%{background-position:50% 50%;background-size:150% 125%}15%{background-position:75% 40%;background-size:130% 115%}30%{background-position:50% 50%;background-size:120% 135%}60%{background-position:30% 50%;background-size:120% 135%}80%{background-position:10% 30%;background-size:130% 155%}to{background-position:40% 45%;background-size:125% 135%}}.LoadingRow697099013__root{background-image:linear-gradient(60deg,rgba(255,255,255,.15)0,rgba(255,255,255,.15) 50%,rgba(95,242,174,.15) 100%),linear-gradient(284.81deg,#fff 67.18%,#91bbff 158.87%),linear-gradient(29deg,rgba(145,187,255,.6)0,#fff 40%,rgba(95,242,174,.6) 100%);height:100%;background-size:150% 125%;background-repeat:no-repeat;animation:LoadingRow697099013__gradientSwoosh 2s ease-out infinite alternate}.MaxHeightText1628925456__root{opacity:1}.MaxHeightText1628925456__root.MaxHeightText1628925456--height24{line-height:24px}.MaxLines3474561681__root{overflow:hidden}.MaxLines3474561681__root.MaxLines3474561681--clamp{-webkit-box-orient:vertical;display:-webkit-box}.MultiBulkActionToolbar68419382__root{min-width:0}.MultiBulkActionToolbar68419382__leftGroupWrapper{overflow:hidden;padding-right:12px;min-width:0;flex-wrap:nowrap;align-items:center}.MultiBulkActionToolbar68419382__selectedCountItem{min-width:0;flex-shrink:1;white-space:nowrap;overflow:hidden}.MultiBulkActionToolbar68419382__selectedCountText{display:block;width:100%}.NestedTablePlaceholderStatesRow2489859390__root td{padding:0!important;width:100%}.NestedTableRow3970235073__firstLevel td{padding-top:18px!important;padding-bottom:18px!important}.NestedTableRow3970235073__root:hover{background-color:#e7f0ff!important}.NestedTableRow3970235073__root.NestedTableRow3970235073--expandable{cursor:pointer}.NestedTableRow3970235073__placeholder td{padding:0!important;width:100%}.NestedTableRow3970235073__root:hover td:first-of-type::before,.NestedTableRow3970235073__parentHovered td:first-of-type::before{content:"";position:absolute;top:0;bottom:0;left:0;width:2px;background-color:#5999ff}.MultipleDragOverlayEffect2349309335__root{position:absolute;transform:translate(6px,6px);background-color:#fff;box-shadow:0 2px 4px 0 rgba(0,6,36,.12),0 0 6px 0 rgba(0,6,36,.12)}.NestedTableDragAndDropRow737617853__root.NestedTableDragAndDropRow737617853--draggingInto td{background-color:#e7f0ff!important}.PickerContent2017000944__root{display:flex}.PickerContentAdditionalStep21172298__titles{display:flex;justify-content:center;flex:1 1 auto;overflow:hidden;flex-direction:column}.PickerContentAdditionalStep21172298__suffix{display:flex;align-items:center;flex:0 0 auto;overflow:hidden}.PickerTableListItem3587473997__root{box-sizing:border-box}.ScrollableContent585524193__root.ScrollableContent585524193--overflowY{overflow-y:auto}.ScrollableContent585524193__root.ScrollableContent585524193--overflowX{overflow-x:auto}.ScrollableContent585524193__root.ScrollableContent585524193--smooth{scroll-behavior:smooth}.SkeletonCard2899189437__headerLoading{display:block!important}.SlidingModal2850069453__root{transition:transform .4s ease 0s;position:fixed;z-index:1}.SlidingModal2850069453__root.SlidingModal2850069453--overlay{transition:transform 0s ease 0s}.SlidingModal2850069453__root.SlidingModal2850069453---appendTo-6-parent{position:absolute}.SlidingModal2850069453__root:not(.SlidingModal2850069453--exited){box-shadow:0 3px 24px 0 rgba(22,45,61,.18),0 8px 8px 0 rgba(22,45,61,.12)}.TabsFilter1535445293__root .TabsFilter1535445293__title{color:inherit!important}.ManageTagsModal3898350931__root{display:flex}.ToolbarItem3741416254__root{min-width:0}.ToolbarItemBox3494125805__root{min-width:0}.ToolbarItemBox3494125805__root.ToolbarItemBox3494125805--removeStartPadding{margin-left:-24px}.ToolbarItemBox3494125805__root.ToolbarItemBox3494125805--expandable{flex:1 0}.common1732706577__column{display:flex;flex-direction:column}.common1732706577__fullHeight{height:100%;min-height:0}.CollectionPageHeader4131588040__root.CollectionPageHeader4131588040--mobile{flex-direction:column;padding-right:18px;padding-left:18px}.CollectionPageHeader4131588040__root.CollectionPageHeader4131588040--mobile>*{margin-left:0;margin-top:6px!important;height:auto}.FormPageHeader476015855__root.FormPageHeader476015855--mobile{flex-direction:column;padding-right:18px;padding-left:18px}.FormPageHeader476015855__root.FormPageHeader476015855--mobile>*{margin-left:0;margin-top:6px!important;height:auto}
1
+ .CardContainer312641811__root.CardContainer312641811--mobile{border-radius:0}.Collapse635544407__root{transition-property:height;transition-timing-function:cubic-bezier(.4,0,.2,1)}.Collapse635544407__exit{height:0}.CollectionPage3558163292__root [data-hook=page-header-wrapper]{--wds-space-300:18px}.CollectionPage3558163292__root.CollectionPage3558163292--mobile{--wds-page-header-padding-horizontal:0;--wds-color-fill-surface-sunken:#ffffff}.CollectionPage3558163292__root.CollectionPage3558163292--panel{overflow:hidden;position:relative}.CollectionTable967591821__root td{vertical-align:middle}.CollectionTable967591821__root.CollectionTable967591821--mobile td:first-child{padding-left:18px}.CollectionTable967591821__root.CollectionTable967591821--mobile td:last-child{padding-right:18px}.CollectionToolbar2765748828__left{min-width:0}.CollectionToolbar2765748828__root.CollectionToolbar2765748828--views .CollectionToolbar2765748828__left{flex-shrink:1;flex-grow:0}.CollectionToolbar2765748828__left.CollectionToolbar2765748828--expandable{flex:auto}.CollectionToolbar2765748828__root .CollectionToolbar2765748828__right{justify-content:flex-end!important;flex-grow:1;flex-shrink:1;flex-basis:auto}.CollectionToolbar2765748828__root.CollectionToolbar2765748828--views .CollectionToolbar2765748828__right{min-width:0;flex-grow:1;flex-shrink:0;flex-basis:0}.CollectionToolbar2765748828__root .CollectionToolbar2765748828__right.CollectionToolbar2765748828__fullWidth{margin-inline-start:0!important}.CollectionToolbar2765748828__root.CollectionToolbar2765748828--mobile{padding-right:18px;padding-left:18px}.SearchOrCustomFilter676053826__search{min-width:140px;max-width:240px;flex:1 0}.SearchOrCustomFilter676053826__searchMobile{justify-content:flex-end;position:absolute;right:18px}.SearchOrCustomFilter676053826__searchMobile:not(.SearchOrCustomFilter676053826--expandable){left:18px}.SearchOrCustomFilter676053826__searchMobile.SearchOrCustomFilter676053826--expandable.SearchOrCustomFilter676053826--expanded{left:18px}.AutoCompleteReadonly2136975089__root.AutoCompleteReadonly2136975089--disableEditing{cursor:pointer}.AutoCompleteReadonly2136975089__root.AutoCompleteReadonly2136975089--disableEditing input{cursor:pointer}.ViewsDropdown1562602937__root{width:200px}.DragHandle1680406004__root{display:flex;align-items:center}.DragHandle1680406004__root:not(.DragHandle1680406004--disabled){cursor:grab;color:#a8caff}.DragHandle1680406004__root.DragHandle1680406004--disabled{color:#acafc4}.DragHandle1680406004__root:focus-visible:not(.DragHandle1680406004--disabled){outline:0;box-shadow:0 0 0 3px #a6d0ff}.DragHandle1680406004__root.DragHandle1680406004--disabled{pointer-events:none}.DragHandle1680406004__root.DragHandle1680406004--dragging:not(.DragHandle1680406004--disabled){cursor:grabbing}.EntityPagePlain2129186045__root.EntityPagePlain2129186045--mobile{--wds-page-header-padding-horizontal:0}.Fade2580742614__root{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);opacity:1}.Fade2580742614__root.Fade2580742614--exit{opacity:0}.Heading1552734931__root{visibility:visible}.Heading1552734931__root.Heading1552734931--appearanceH2{font-size:28px!important;line-height:36px!important}.InputOverflow1980064947__root.InputOverflow1980064947--selected:not(.InputOverflow1980064947--focused) input::placeholder{color:#000624}@keyframes LoadingRow72311180__gradientSwoosh{0%{background-position:50% 50%;background-size:150% 125%}15%{background-position:75% 40%;background-size:130% 115%}30%{background-position:50% 50%;background-size:120% 135%}60%{background-position:30% 50%;background-size:120% 135%}80%{background-position:10% 30%;background-size:130% 155%}to{background-position:40% 45%;background-size:125% 135%}}.LoadingRow72311180__root{background-image:linear-gradient(60deg,rgba(255,255,255,.15)0,rgba(255,255,255,.15) 50%,rgba(95,242,174,.15) 100%),linear-gradient(284.81deg,#fff 67.18%,#91bbff 158.87%),linear-gradient(29deg,rgba(145,187,255,.6)0,#fff 40%,rgba(95,242,174,.6) 100%);height:100%;background-size:150% 125%;background-repeat:no-repeat;animation:LoadingRow72311180__gradientSwoosh 2s ease-out infinite alternate}.MaxHeightText2940241560__root{opacity:1}.MaxHeightText2940241560__root.MaxHeightText2940241560--height24{line-height:24px}.MaxLines1993089027__root{overflow:hidden}.MaxLines1993089027__root.MaxLines1993089027--clamp{-webkit-box-orient:vertical;display:-webkit-box}.MultiBulkActionToolbar3117766984__root{min-width:0}.MultiBulkActionToolbar3117766984__leftGroupWrapper{overflow:hidden;padding-right:12px;min-width:0;flex-wrap:nowrap;align-items:center}.MultiBulkActionToolbar3117766984__selectedCountItem{min-width:0;flex-shrink:1;white-space:nowrap;overflow:hidden}.MultiBulkActionToolbar3117766984__selectedCountText{display:block;width:100%}.NestedTablePlaceholderStatesRow634506500__root td{padding:0!important;width:100%}.NestedTableRow3595325079__firstLevel td{padding-top:18px!important;padding-bottom:18px!important}.NestedTableRow3595325079__root:hover{background-color:#e7f0ff!important}.NestedTableRow3595325079__root.NestedTableRow3595325079--expandable{cursor:pointer}.NestedTableRow3595325079__placeholder td{padding:0!important;width:100%}.NestedTableRow3595325079__root:hover td:first-of-type::before,.NestedTableRow3595325079__parentHovered td:first-of-type::before{content:"";position:absolute;top:0;bottom:0;left:0;width:2px;background-color:#5999ff}.MultipleDragOverlayEffect3760073984__root{position:absolute;transform:translate(6px,6px);background-color:#fff;box-shadow:0 2px 4px 0 rgba(0,6,36,.12),0 0 6px 0 rgba(0,6,36,.12)}.NestedTableDragAndDropRow2976497727__root.NestedTableDragAndDropRow2976497727--draggingInto td{background-color:#e7f0ff!important}.PickerContent3108120277__root{display:flex}.PickerContentAdditionalStep4199282124__titles{display:flex;justify-content:center;flex:1 1 auto;overflow:hidden;flex-direction:column}.PickerContentAdditionalStep4199282124__suffix{display:flex;align-items:center;flex:0 0 auto;overflow:hidden}.PickerTableListItem2983769481__root{box-sizing:border-box}.ScrollableContent980648129__root.ScrollableContent980648129--overflowY{overflow-y:auto}.ScrollableContent980648129__root.ScrollableContent980648129--overflowX{overflow-x:auto}.ScrollableContent980648129__root.ScrollableContent980648129--smooth{scroll-behavior:smooth}.SkeletonCard1226407146__headerLoading{display:block!important}.SlidingModal3040154923__root{transition:transform .4s ease 0s;position:fixed;z-index:1}.SlidingModal3040154923__root.SlidingModal3040154923--overlay{transition:transform 0s ease 0s}.SlidingModal3040154923__root.SlidingModal3040154923---appendTo-6-parent{position:absolute}.SlidingModal3040154923__root:not(.SlidingModal3040154923--exited){box-shadow:0 3px 24px 0 rgba(22,45,61,.18),0 8px 8px 0 rgba(22,45,61,.12)}.TabsFilter494994749__root .TabsFilter494994749__title{color:inherit!important}.ManageTagsModal2750172858__root{display:flex}.ToolbarItem2717057697__root{min-width:0}.ToolbarItemBox4200702974__root{min-width:0}.ToolbarItemBox4200702974__root.ToolbarItemBox4200702974--removeStartPadding{margin-left:-24px}.ToolbarItemBox4200702974__root.ToolbarItemBox4200702974--expandable{flex:1 0}.common1210614291__column{display:flex;flex-direction:column}.common1210614291__fullHeight{height:100%;min-height:0}.CollectionPageHeader736711144__root.CollectionPageHeader736711144--mobile{flex-direction:column;padding-right:18px;padding-left:18px}.CollectionPageHeader736711144__root.CollectionPageHeader736711144--mobile>*{margin-left:0;margin-top:6px!important;height:auto}.FormPageHeader3304963303__root.FormPageHeader3304963303--mobile{flex-direction:column;padding-right:18px;padding-left:18px}.FormPageHeader3304963303__root.FormPageHeader3304963303--mobile>*{margin-left:0;margin-top:6px!important;height:auto}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Testkit for testing dealer BI events.
3
+ *
4
+ * Provides a singleton-style API similar to biTestkit from @wix/bex-core/bi/testkit.
5
+ * Captures dealer reportEvent HTTP calls and provides utilities to assert on events.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import dealerBITestkit from '../test-utils/DealerBIMock';
10
+ *
11
+ * describe('MyComponent', () => {
12
+ * const setup = () => {
13
+ * const driver = new MyDriver({
14
+ * httpMocks: [
15
+ * // ... other mocks
16
+ * dealerBITestkit.httpMock,
17
+ * ],
18
+ * });
19
+ * return { driver };
20
+ * };
21
+ *
22
+ * it('sends view event', async () => {
23
+ * setup();
24
+ * // ... trigger the view event
25
+ *
26
+ * expect(dealerBITestkit.view.last()).toEqual(
27
+ * expect.objectContaining({
28
+ * offerId: 'offer-1',
29
+ * }),
30
+ * );
31
+ * });
32
+ * });
33
+ * ```
34
+ */
35
+
36
+ import { whenRequest } from '@wix/yoshi-flow-bm/testkit/http-client';
37
+ import { reportEvent } from '@wix/bex-utils/@wix/ambassador-dealer-v1-offer-event/http';
38
+ import type { AnyScenario } from '@wix/http-client-testkit';
39
+
40
+ // Re-export EventType for convenience
41
+ export { EventType } from '@wix/bex-utils/@wix/ambassador-dealer-v1-offer-event/types';
42
+
43
+ interface ReportEventData {
44
+ event?: {
45
+ type?: string;
46
+ offerId?: string;
47
+ realEstateId?: string;
48
+ [key: string]: unknown;
49
+ };
50
+ [key: string]: unknown;
51
+ }
52
+
53
+ interface EventTypeAccessor {
54
+ /** Get all events of this type */
55
+ all: () => ReportEventData[];
56
+ /** Get the last event of this type */
57
+ last: () => ReportEventData | undefined;
58
+ /** Get event count of this type */
59
+ count: () => number;
60
+ }
61
+
62
+ interface DealerBITestkit {
63
+ /** The HTTP mock - add this to your driver's httpMocks array */
64
+ httpMock: AnyScenario;
65
+
66
+ /** Access VIEW events */
67
+ view: EventTypeAccessor;
68
+ /** Access CLICK events */
69
+ click: EventTypeAccessor;
70
+
71
+ /** Get all captured events (any type) */
72
+ all: () => ReportEventData[];
73
+ /** Get the last captured event (any type) */
74
+ last: () => ReportEventData | undefined;
75
+ /** Clear all captured events - call in beforeEach for test isolation */
76
+ clear: () => void;
77
+ }
78
+
79
+ // Singleton spy to capture all events
80
+ const eventsSpy = jest.fn();
81
+
82
+ // Create HTTP mock once
83
+ const httpMock = whenRequest(reportEvent)
84
+ .reply(async (data) => {
85
+ eventsSpy(data);
86
+ return { status: 200, data: {} };
87
+ })
88
+ .persist() as AnyScenario;
89
+
90
+ const _getAllEventsOfType = (type?: string): ReportEventData[] =>
91
+ type
92
+ ? eventsSpy.mock.calls
93
+ .filter((call) => call[0]?.event?.type === type)
94
+ .map((call) => call[0])
95
+ : eventsSpy.mock.calls.map((call) => call[0]);
96
+
97
+ const createEventTypeAccessor = (type: string): EventTypeAccessor => ({
98
+ all: () => _getAllEventsOfType(type),
99
+ last: () => {
100
+ const events = _getAllEventsOfType(type);
101
+ return events.length > 0 ? events[events.length - 1] : undefined;
102
+ },
103
+ count: () => _getAllEventsOfType(type).length,
104
+ });
105
+
106
+ const dealerBITestkit: DealerBITestkit = {
107
+ httpMock,
108
+
109
+ view: createEventTypeAccessor('VIEW'),
110
+ click: createEventTypeAccessor('CLICK'),
111
+
112
+ all: _getAllEventsOfType,
113
+ last: () => {
114
+ const events = _getAllEventsOfType();
115
+ return events.length > 0 ? events[events.length - 1] : undefined;
116
+ },
117
+ clear: () => eventsSpy.mockClear(),
118
+ };
119
+
120
+ export default dealerBITestkit;
121
+
122
+ // Also export named for flexibility
123
+ export { dealerBITestkit };
@@ -0,0 +1,155 @@
1
+ /**
2
+ * Mock implementation of IntersectionObserver for jsdom testing environment.
3
+ *
4
+ * jsdom does not implement IntersectionObserver, so this mock allows testing
5
+ * components that rely on intersection detection (e.g., lazy loading, view tracking).
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import {
10
+ * setupIntersectionObserverMock,
11
+ * teardownIntersectionObserverMock,
12
+ * resetIntersectionObserverMock,
13
+ * triggerIntersection,
14
+ * triggerAllIntersections,
15
+ * } from '../test-utils/IntersectionObserverMock';
16
+ *
17
+ * describe('MyComponent', () => {
18
+ * beforeAll(() => {
19
+ * setupIntersectionObserverMock();
20
+ * });
21
+ *
22
+ * afterAll(() => {
23
+ * teardownIntersectionObserverMock();
24
+ * });
25
+ *
26
+ * beforeEach(() => {
27
+ * resetIntersectionObserverMock();
28
+ * });
29
+ *
30
+ * it('tracks element visibility', async () => {
31
+ * render(<MyComponent />);
32
+ * const element = screen.getByTestId('tracked-element');
33
+ *
34
+ * triggerIntersection(element);
35
+ *
36
+ * expect(onVisibleSpy).toHaveBeenCalled();
37
+ * });
38
+ * });
39
+ * ```
40
+ */
41
+
42
+ // Track all observer instances so we can trigger intersections on any of them
43
+ const observerInstances: Set<MockIntersectionObserverInstance> = new Set();
44
+
45
+ class MockIntersectionObserverInstance implements IntersectionObserver {
46
+ root: Element | Document | null = null;
47
+ rootMargin: string = '';
48
+ thresholds: readonly number[] = [];
49
+
50
+ private callback: IntersectionObserverCallback;
51
+ private observedElements: Set<Element> = new Set();
52
+
53
+ constructor(callback: IntersectionObserverCallback) {
54
+ this.callback = callback;
55
+ observerInstances.add(this);
56
+ }
57
+
58
+ observe(target: Element) {
59
+ this.observedElements.add(target);
60
+ }
61
+
62
+ unobserve(target: Element) {
63
+ this.observedElements.delete(target);
64
+ }
65
+
66
+ disconnect() {
67
+ this.observedElements.clear();
68
+ observerInstances.delete(this);
69
+ }
70
+
71
+ takeRecords(): IntersectionObserverEntry[] {
72
+ return [];
73
+ }
74
+
75
+ /**
76
+ * Test helper: trigger intersection for a specific element on this observer.
77
+ * Calls the observer callback with isIntersecting: true for the given element.
78
+ */
79
+ triggerIntersection(element: Element) {
80
+ if (!this.observedElements.has(element)) {
81
+ return;
82
+ }
83
+
84
+ const entry = {
85
+ target: element,
86
+ isIntersecting: true,
87
+ intersectionRatio: 1,
88
+ boundingClientRect: element.getBoundingClientRect(),
89
+ intersectionRect: element.getBoundingClientRect(),
90
+ rootBounds: null,
91
+ time: Date.now(),
92
+ } as IntersectionObserverEntry;
93
+
94
+ this.callback([entry], this);
95
+ }
96
+
97
+ /**
98
+ * Test helper: trigger intersection for all observed elements on this observer.
99
+ */
100
+ triggerAllIntersections() {
101
+ this.observedElements.forEach((element) =>
102
+ this.triggerIntersection(element),
103
+ );
104
+ }
105
+ }
106
+
107
+ /**
108
+ * Trigger intersection for a specific element across all observer instances.
109
+ * Use this when you know which element you want to mark as visible.
110
+ */
111
+ export const triggerIntersection = (element: Element) => {
112
+ observerInstances.forEach((observer) =>
113
+ observer.triggerIntersection(element),
114
+ );
115
+ };
116
+
117
+ /**
118
+ * Trigger intersection for all observed elements across all observer instances.
119
+ * Use this to simulate all tracked elements becoming visible at once.
120
+ */
121
+ export const triggerAllIntersections = () => {
122
+ observerInstances.forEach((observer) => observer.triggerAllIntersections());
123
+ };
124
+
125
+ /**
126
+ * Set up the IntersectionObserver mock on the global object.
127
+ * Call this in beforeAll() before your tests run.
128
+ */
129
+ export const setupIntersectionObserverMock = () => {
130
+ observerInstances.clear();
131
+ global.IntersectionObserver = MockIntersectionObserverInstance;
132
+ };
133
+
134
+ /**
135
+ * Tear down the IntersectionObserver mock from the global object.
136
+ * Call this in afterAll() after your tests complete.
137
+ */
138
+ export const teardownIntersectionObserverMock = () => {
139
+ observerInstances.clear();
140
+ delete (global as any).IntersectionObserver;
141
+ };
142
+
143
+ /**
144
+ * Reset all observer instances between tests.
145
+ * Call this in beforeEach() to ensure test isolation.
146
+ */
147
+ export const resetIntersectionObserverMock = () => {
148
+ observerInstances.clear();
149
+ };
150
+
151
+ /**
152
+ * Get all currently active observer instances.
153
+ * Useful for debugging or advanced test scenarios.
154
+ */
155
+ export const getObserverInstances = () => observerInstances;
package/src/version.ts CHANGED
@@ -1 +1 @@
1
- export const version = 'patterns@1.324.0';
1
+ export const version = 'patterns@1.325.0';