thm-p3-configurator 0.0.427 → 0.0.431

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 (54) hide show
  1. package/dist/src/shared/__api__/mutations.js +7 -3
  2. package/dist/src/shared/__components__/LocationsSelector/LocationDetails.js +295 -0
  3. package/dist/src/shared/__components__/LocationsSelector/LocationInfo.js +140 -0
  4. package/dist/src/shared/__components__/LocationsSelector/LocationList.js +190 -0
  5. package/dist/src/shared/__components__/LocationsSelector/LocationListItem.js +116 -0
  6. package/dist/src/shared/__components__/LocationsSelector/LocationTreeMarker.js +97 -0
  7. package/dist/src/shared/__components__/LocationsSelector/index.js +156 -0
  8. package/dist/src/shared/__components__/Modal.js +78 -0
  9. package/dist/src/shared/__components__/Navbar.js +82 -0
  10. package/dist/src/shared/__components__/NavigationSteps.js +143 -0
  11. package/dist/src/shared/__components__/Pagination.js +53 -0
  12. package/dist/src/shared/__components__/ProductCard/ProductCardCheckbox.js +38 -0
  13. package/dist/src/shared/__components__/ProductCard/ProductCardDescription.js +84 -0
  14. package/dist/src/shared/__components__/ProductCard/ProductCardDiscountAlert.js +57 -0
  15. package/dist/src/shared/__components__/ProductCard/ProductCardImage.js +28 -0
  16. package/dist/src/shared/__components__/ProductCard/ProductCardPrice.js +37 -0
  17. package/dist/src/shared/__components__/ProductCard/ProductCardRibbon.js +28 -0
  18. package/dist/src/shared/__components__/ProductCard/ProductCardSpecifications.js +77 -0
  19. package/dist/src/shared/__components__/ProductCard/ProductCardUsps.js +82 -0
  20. package/dist/src/shared/__components__/ProductCard/index.js +228 -0
  21. package/dist/src/shared/__components__/ProductTable/ProductTableEditableRow.js +66 -0
  22. package/dist/src/shared/__components__/ProductTable/ProductTableHead.js +32 -0
  23. package/dist/src/shared/__components__/ProductTable/ProductTableSection.js +25 -0
  24. package/dist/src/shared/__components__/ProductTable/ProductTableSectionTotal.js +46 -0
  25. package/dist/src/shared/__components__/ProductTable/ProductTableStaticRow.js +47 -0
  26. package/dist/src/shared/__components__/ProductTable/ProductTableTotal.js +41 -0
  27. package/dist/src/shared/__components__/ProductTable/index.js +127 -0
  28. package/dist/src/shared/__components__/SingleOrderCartCard.js +79 -0
  29. package/dist/src/shared/__components__/SingleOrderProductCard.js +360 -0
  30. package/dist/src/shared/__components__/Spinners/FullPageSpinner.js +73 -0
  31. package/dist/src/shared/__components__/Spinners/InlineSpinner.js +26 -0
  32. package/dist/src/shared/__components__/Spinners/TextSpinner.js +31 -0
  33. package/dist/src/shared/__components__/UspsList.js +27 -0
  34. package/dist/src/shared/__components__/internal/InternalCustomerDetailsForm.js +1090 -0
  35. package/dist/src/shared/__constants__/__tests__/index.test.js +38 -0
  36. package/dist/src/shared/__constants__/cartTable.js +35 -0
  37. package/dist/src/shared/__constants__/cookiebot.js +7 -0
  38. package/dist/src/shared/__constants__/index.js +398 -0
  39. package/dist/src/shared/__constants__/sentry.js +20 -0
  40. package/dist/src/shared/__containers__/ANWBMembershipInput.js +170 -0
  41. package/dist/src/shared/__containers__/AppointmentForm.js +548 -0
  42. package/dist/src/shared/__containers__/BoardComputerCard.js +139 -0
  43. package/dist/src/shared/__containers__/BottomNavigationBar.js +185 -0
  44. package/dist/src/shared/__containers__/DiscountProductsSelector.js +151 -0
  45. package/dist/src/shared/__containers__/ExitIntentModal.js +425 -0
  46. package/dist/src/shared/__containers__/ProductsCartOverview.js +16 -11
  47. package/dist/src/shared/__containers__/QuotationForm.js +13 -11
  48. package/dist/src/shared/__context__/OrderSessionContext.js +7 -1
  49. package/dist/src/shared/__helpers__/makeAppointmentRoute.js +10 -0
  50. package/dist/src/shared/__helpers__/prospectTracking.js +39 -0
  51. package/dist/src/shared/__helpers__/singleOrderVehicleReceipt.js +158 -0
  52. package/dist/src/shared/__pages__/internal/InternalOverviewPage.js +4 -2
  53. package/dist/src/shared/__pages__/internal/InternalSingleOrderPage.js +27 -8
  54. package/package.json +1 -1
@@ -107,7 +107,8 @@ const useCreateQuotationMutation = () => {
107
107
  discount,
108
108
  vehicle,
109
109
  skipFilters,
110
- isExitIntent = false
110
+ isExitIntent = false,
111
+ prospectId
111
112
  } = _ref;
112
113
  return _publicProxyApi.publicProxyApi.postQuotation({
113
114
  isExitIntent,
@@ -122,7 +123,8 @@ const useCreateQuotationMutation = () => {
122
123
  skipFilters,
123
124
  selectBoardComputerUpdate: selectBoardComputerUpdate,
124
125
  customer: customer,
125
- branchId
126
+ branchId,
127
+ prospectId
126
128
  });
127
129
  });
128
130
  return {
@@ -144,6 +146,7 @@ const useCreateAppointmentRequestMutation = () => {
144
146
  licensePlate,
145
147
  model,
146
148
  constructionYear,
149
+ prospectId,
147
150
  answers,
148
151
  cart,
149
152
  selectBoardComputerUpdate,
@@ -166,7 +169,8 @@ const useCreateAppointmentRequestMutation = () => {
166
169
  customer,
167
170
  branchId,
168
171
  discount,
169
- vehicle
172
+ vehicle,
173
+ prospectId
170
174
  });
171
175
  }, {});
172
176
  return {
@@ -0,0 +1,295 @@
1
+ "use strict";
2
+
3
+ require("core-js/modules/es.number.to-fixed.js");
4
+ require("core-js/modules/es.weak-map.js");
5
+ require("core-js/modules/esnext.iterator.constructor.js");
6
+ require("core-js/modules/esnext.iterator.filter.js");
7
+ require("core-js/modules/esnext.iterator.map.js");
8
+ require("core-js/modules/web.dom-collections.iterator.js");
9
+ require("core-js/modules/es.weak-map.js");
10
+ require("core-js/modules/web.dom-collections.iterator.js");
11
+ Object.defineProperty(exports, "__esModule", {
12
+ value: true
13
+ });
14
+ exports.default = void 0;
15
+ require("core-js/modules/es.number.to-fixed.js");
16
+ require("core-js/modules/esnext.iterator.constructor.js");
17
+ require("core-js/modules/esnext.iterator.filter.js");
18
+ require("core-js/modules/esnext.iterator.map.js");
19
+ var _react = _interopRequireWildcard(require("react"));
20
+ var _helpers__ = require("../../__helpers__");
21
+ function _getRequireWildcardCache(e) {
22
+ if ("function" != typeof WeakMap) return null;
23
+ var r = new WeakMap(),
24
+ t = new WeakMap();
25
+ return (_getRequireWildcardCache = function _getRequireWildcardCache(e) {
26
+ return e ? t : r;
27
+ })(e);
28
+ }
29
+ function _interopRequireWildcard(e, r) {
30
+ if (!r && e && e.__esModule) return e;
31
+ if (null === e || "object" != typeof e && "function" != typeof e) return {
32
+ default: e
33
+ };
34
+ var t = _getRequireWildcardCache(r);
35
+ if (t && t.has(e)) return t.get(e);
36
+ var n = {
37
+ __proto__: null
38
+ },
39
+ a = Object.defineProperty && Object.getOwnPropertyDescriptor;
40
+ for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) {
41
+ var i = a ? Object.getOwnPropertyDescriptor(e, u) : null;
42
+ i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u];
43
+ }
44
+ return n.default = e, t && t.set(e, n), n;
45
+ }
46
+ const isStatusPositive = status => status === true || status === 1 || status === 'ja' || status === 'Ja';
47
+ const StatusDot = _ref => {
48
+ let {
49
+ status
50
+ } = _ref;
51
+ const positive = isStatusPositive(status);
52
+ return /*#__PURE__*/_react.default.createElement("span", {
53
+ className: (0, _helpers__.withStyle)('d-flex align-items-center gap-1')
54
+ }, /*#__PURE__*/_react.default.createElement("span", {
55
+ style: {
56
+ width: 7,
57
+ height: 7,
58
+ borderRadius: '50%',
59
+ flexShrink: 0,
60
+ background: positive ? '#038808' : '#adb5bd',
61
+ display: 'inline-block'
62
+ }
63
+ }), /*#__PURE__*/_react.default.createElement("span", {
64
+ style: {
65
+ fontSize: 11,
66
+ fontWeight: 600,
67
+ color: positive ? '#038808' : '#6c757d'
68
+ }
69
+ }, positive ? 'Ja' : 'Nee'));
70
+ };
71
+ const ServiceRow = _ref2 => {
72
+ let {
73
+ icon,
74
+ label,
75
+ status,
76
+ bedrag,
77
+ voorwaarden
78
+ } = _ref2;
79
+ return /*#__PURE__*/_react.default.createElement("div", {
80
+ style: {
81
+ marginBottom: 6
82
+ }
83
+ }, /*#__PURE__*/_react.default.createElement("div", {
84
+ className: (0, _helpers__.withStyle)('d-flex align-items-center justify-content-between')
85
+ }, /*#__PURE__*/_react.default.createElement("span", {
86
+ className: (0, _helpers__.withStyle)('d-flex align-items-center gap-1')
87
+ }, /*#__PURE__*/_react.default.createElement("i", {
88
+ className: icon,
89
+ style: {
90
+ width: 14,
91
+ textAlign: 'center',
92
+ fontSize: 11,
93
+ color: '#6c757d'
94
+ }
95
+ }), /*#__PURE__*/_react.default.createElement("span", {
96
+ style: {
97
+ fontSize: 12,
98
+ fontWeight: 600,
99
+ color: '#343a40'
100
+ }
101
+ }, label)), /*#__PURE__*/_react.default.createElement("span", {
102
+ className: (0, _helpers__.withStyle)('d-flex align-items-center gap-2')
103
+ }, bedrag != null && bedrag !== '' && /*#__PURE__*/_react.default.createElement("span", {
104
+ style: {
105
+ fontSize: 11,
106
+ color: '#6c757d'
107
+ }
108
+ }, typeof bedrag === 'number' ? "\u20AC\xA0".concat(bedrag.toFixed(2)) : bedrag), /*#__PURE__*/_react.default.createElement(StatusDot, {
109
+ status: status
110
+ }))), voorwaarden && /*#__PURE__*/_react.default.createElement("p", {
111
+ style: {
112
+ margin: '2px 0 0 18px',
113
+ fontSize: 10,
114
+ color: '#6c757d',
115
+ fontStyle: 'italic',
116
+ lineHeight: 1.4
117
+ }
118
+ }, voorwaarden));
119
+ };
120
+ const SectionLabel = _ref3 => {
121
+ let {
122
+ icon,
123
+ label
124
+ } = _ref3;
125
+ return /*#__PURE__*/_react.default.createElement("p", {
126
+ className: (0, _helpers__.withStyle)('d-flex align-items-center gap-1 mb-1'),
127
+ style: {
128
+ fontSize: 11,
129
+ fontWeight: 700,
130
+ color: '#495057',
131
+ textTransform: 'uppercase',
132
+ letterSpacing: '0.04em'
133
+ }
134
+ }, /*#__PURE__*/_react.default.createElement("i", {
135
+ className: icon,
136
+ style: {
137
+ width: 14,
138
+ textAlign: 'center',
139
+ fontSize: 10,
140
+ color: '#6c757d'
141
+ }
142
+ }), label);
143
+ };
144
+ const formatDate = dateStr => {
145
+ if (!dateStr) return '';
146
+ const date = new Date(dateStr);
147
+ if (isNaN(date.getTime())) return dateStr;
148
+ return date.toLocaleDateString('nl-NL', {
149
+ day: '2-digit',
150
+ month: '2-digit',
151
+ year: 'numeric'
152
+ });
153
+ };
154
+
155
+ /**
156
+ * Normalises a raw branch object (from GET /branches/:id) into display props.
157
+ */
158
+ const buildDetailProps = branch => {
159
+ var _branch$haalEnBrengSe, _branch$extraGesloten;
160
+ if (!branch) return null;
161
+ return {
162
+ leenauto: {
163
+ status: branch.leenautoJaNee,
164
+ voorwaarden: branch.leenautoVoorwaarden,
165
+ bedrag: branch.leenautoBedrag
166
+ },
167
+ leenfiets: {
168
+ status: branch.leenfietsJaNee,
169
+ voorwaarden: branch.leenfietsVoorwaarden
170
+ },
171
+ haalEnBrengservice: {
172
+ status: (_branch$haalEnBrengSe = branch.haalEnBrengServiceJaNee) !== null && _branch$haalEnBrengSe !== void 0 ? _branch$haalEnBrengSe : branch.haalEnBrengService,
173
+ voorwaarden: branch.haalEnBrengServiceVoorwaarden
174
+ },
175
+ betaalmethoden: Array.isArray(branch.betaalmethoden) ? branch.betaalmethoden.map(m => m && typeof m === 'object' ? m.title : m).filter(Boolean) : branch.betaalmethoden,
176
+ extraGeslotenDagen: (_branch$extraGesloten = branch.extraGeslotenDagen) !== null && _branch$extraGesloten !== void 0 ? _branch$extraGesloten : branch.extraGeslotenDagenVestiging
177
+ };
178
+ };
179
+
180
+ /**
181
+ * Fetches and displays extra location-specific details in the Partner Portal configurator.
182
+ * Only rendered when APP_CONFIG.internal is true — never on the public website.
183
+ */
184
+ const LocationDetails = _ref4 => {
185
+ let {
186
+ initialBranch = null
187
+ } = _ref4;
188
+ const today = (0, _react.useMemo)(() => {
189
+ const d = new Date();
190
+ d.setHours(0, 0, 0, 0);
191
+ return d;
192
+ }, []);
193
+ const props = buildDetailProps(initialBranch);
194
+ if (!props) return null;
195
+ const {
196
+ leenauto,
197
+ leenfiets,
198
+ haalEnBrengservice,
199
+ betaalmethoden,
200
+ extraGeslotenDagen
201
+ } = props;
202
+ const upcomingGeslotenDagen = Array.isArray(extraGeslotenDagen) ? extraGeslotenDagen.filter(dag => {
203
+ if (!(dag !== null && dag !== void 0 && dag.einddatum)) return false;
204
+ const eindDatum = new Date(dag.einddatum);
205
+ eindDatum.setHours(0, 0, 0, 0);
206
+ return eindDatum >= today;
207
+ }) : [];
208
+ const hasLeenauto = leenauto != null;
209
+ const hasLeenfiets = leenfiets != null;
210
+ const hasHaalEnBreng = haalEnBrengservice != null;
211
+ const hasBetaalmethoden = Array.isArray(betaalmethoden) && betaalmethoden.length > 0;
212
+ const hasGeslotenDagen = upcomingGeslotenDagen.length > 0;
213
+ return /*#__PURE__*/_react.default.createElement("div", {
214
+ style: {
215
+ marginTop: 10,
216
+ paddingTop: 10,
217
+ borderTop: '1px solid #e9ecef'
218
+ }
219
+ }, (hasLeenauto || hasLeenfiets || hasHaalEnBreng) && /*#__PURE__*/_react.default.createElement("div", {
220
+ style: {
221
+ marginBottom: hasBetaalmethoden || hasGeslotenDagen ? 8 : 0
222
+ }
223
+ }, hasLeenauto && /*#__PURE__*/_react.default.createElement(ServiceRow, {
224
+ icon: "fas fa-car",
225
+ label: "Leenauto",
226
+ status: leenauto.status,
227
+ bedrag: leenauto.bedrag,
228
+ voorwaarden: leenauto.voorwaarden
229
+ }), hasLeenfiets && /*#__PURE__*/_react.default.createElement(ServiceRow, {
230
+ icon: "fas fa-bicycle",
231
+ label: "Leenfiets",
232
+ status: leenfiets.status,
233
+ voorwaarden: leenfiets.voorwaarden
234
+ }), hasHaalEnBreng && /*#__PURE__*/_react.default.createElement(ServiceRow, {
235
+ icon: "fas fa-truck",
236
+ label: "Haal- en brengservice",
237
+ status: haalEnBrengservice.status,
238
+ voorwaarden: haalEnBrengservice.voorwaarden
239
+ })), hasBetaalmethoden && /*#__PURE__*/_react.default.createElement("div", {
240
+ style: {
241
+ marginBottom: hasGeslotenDagen ? 8 : 0,
242
+ paddingTop: hasLeenauto || hasLeenfiets || hasHaalEnBreng ? 8 : 0,
243
+ borderTop: hasLeenauto || hasLeenfiets || hasHaalEnBreng ? '1px solid #f1f3f5' : 'none'
244
+ }
245
+ }, /*#__PURE__*/_react.default.createElement(SectionLabel, {
246
+ icon: "fas fa-credit-card",
247
+ label: "Betaalmethoden"
248
+ }), /*#__PURE__*/_react.default.createElement("div", {
249
+ className: (0, _helpers__.withStyle)('d-flex flex-wrap gap-1')
250
+ }, betaalmethoden.map((method, i) => /*#__PURE__*/_react.default.createElement("span", {
251
+ key: i,
252
+ style: {
253
+ fontSize: 10,
254
+ fontWeight: 600,
255
+ padding: '2px 7px',
256
+ borderRadius: 4,
257
+ border: '1px solid #dee2e6',
258
+ color: '#495057',
259
+ background: '#f8f9fa'
260
+ }
261
+ }, method)))), hasGeslotenDagen && /*#__PURE__*/_react.default.createElement("div", {
262
+ style: {
263
+ paddingTop: hasBetaalmethoden || hasLeenauto || hasLeenfiets || hasHaalEnBreng ? 8 : 0,
264
+ borderTop: hasBetaalmethoden || hasLeenauto || hasLeenfiets || hasHaalEnBreng ? '1px solid #f1f3f5' : 'none'
265
+ }
266
+ }, /*#__PURE__*/_react.default.createElement(SectionLabel, {
267
+ icon: "fas fa-calendar-times",
268
+ label: "Extra gesloten"
269
+ }), /*#__PURE__*/_react.default.createElement("ul", {
270
+ className: (0, _helpers__.withStyle)('list-unstyled mb-0')
271
+ }, upcomingGeslotenDagen.map((dag, i) => {
272
+ const heeftBereik = dag.startdatum && dag.einddatum && dag.startdatum !== dag.einddatum;
273
+ const datumLabel = heeftBereik ? "".concat(formatDate(dag.startdatum), " \u2013 ").concat(formatDate(dag.einddatum)) : formatDate(dag.einddatum || dag.startdatum);
274
+ return /*#__PURE__*/_react.default.createElement("li", {
275
+ key: i,
276
+ className: (0, _helpers__.withStyle)('d-flex justify-content-between align-items-baseline'),
277
+ style: {
278
+ marginBottom: 2
279
+ }
280
+ }, /*#__PURE__*/_react.default.createElement("span", {
281
+ style: {
282
+ fontSize: 11,
283
+ color: '#495057'
284
+ }
285
+ }, dag.omschrijving || '—'), /*#__PURE__*/_react.default.createElement("span", {
286
+ style: {
287
+ fontSize: 10,
288
+ color: '#6c757d',
289
+ marginLeft: 8,
290
+ whiteSpace: 'nowrap'
291
+ }
292
+ }, datumLabel));
293
+ }))));
294
+ };
295
+ var _default = exports.default = LocationDetails;
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+
3
+ require("core-js/modules/esnext.iterator.constructor.js");
4
+ require("core-js/modules/esnext.iterator.filter.js");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = void 0;
9
+ require("core-js/modules/esnext.iterator.constructor.js");
10
+ require("core-js/modules/esnext.iterator.filter.js");
11
+ var _react = _interopRequireDefault(require("react"));
12
+ var _logoThcWhite = _interopRequireDefault(require("../../../../public/assets/images/logo-thc-white.svg"));
13
+ var _thLogoBlack = _interopRequireDefault(require("../../../../public/assets/images/th-logo-black.png"));
14
+ var _constants__ = require("../../__constants__");
15
+ var _helpers__ = require("../../__helpers__");
16
+ var _image = require("../../__helpers__/image");
17
+ function _interopRequireDefault(e) {
18
+ return e && e.__esModule ? e : {
19
+ default: e
20
+ };
21
+ }
22
+ const FORMULAS = {
23
+ mZHgPhfuStmqHfHqSOhWY: _thLogoBlack.default,
24
+ nFbSnWdtLZBmEhhpHFGVO: _logoThcWhite.default
25
+ };
26
+ const LocationInfo = _ref => {
27
+ var _FORMULAS$formula;
28
+ let {
29
+ street,
30
+ houseNumber,
31
+ houseNumberExtra,
32
+ postCode,
33
+ city,
34
+ telephoneNumber,
35
+ locationImage,
36
+ title,
37
+ email,
38
+ website,
39
+ openingHours,
40
+ province,
41
+ formula
42
+ } = _ref;
43
+ const fallbackLogo = (0, _constants__.getThemeFormulaForConfiguratorFormula)(formula) === _constants__.CONFIGURATOR_FORMULAS.THC ? _logoThcWhite.default : (_FORMULAS$formula = FORMULAS[formula]) !== null && _FORMULAS$formula !== void 0 ? _FORMULAS$formula : _thLogoBlack.default;
44
+
45
+ // Function to format opening hours display text
46
+ const formatOpeningHours = dayData => {
47
+ if (!dayData) return {
48
+ text: 'Onbekend',
49
+ isUnknown: true
50
+ };
51
+ if (!dayData.isOpen) return {
52
+ text: 'Gesloten',
53
+ isUnknown: false
54
+ };
55
+ if (dayData.opensAt && dayData.closesAt) {
56
+ return {
57
+ text: "".concat(dayData.opensAt, " - ").concat(dayData.closesAt),
58
+ isUnknown: false
59
+ };
60
+ } else if (dayData.opensAt) {
61
+ return {
62
+ text: "".concat(dayData.opensAt),
63
+ isUnknown: false
64
+ };
65
+ } else if (dayData.closesAt) {
66
+ return {
67
+ text: "".concat(dayData.closesAt),
68
+ isUnknown: false
69
+ };
70
+ }
71
+ return {
72
+ text: 'Onbekend',
73
+ isUnknown: true
74
+ };
75
+ };
76
+ // Order of days to display
77
+ const daysOrder = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday'];
78
+ return /*#__PURE__*/_react.default.createElement("div", {
79
+ className: (0, _helpers__.withStyle)('dealer-map__infowindow p-0 shadow-none')
80
+ }, /*#__PURE__*/_react.default.createElement("h4", {
81
+ className: (0, _helpers__.withStyle)('text-primary')
82
+ }, title), /*#__PURE__*/_react.default.createElement("div", {
83
+ className: (0, _helpers__.withStyle)('row row__body no-gutters flex-md-nowrap justify-content-between align-items-start')
84
+ }, /*#__PURE__*/_react.default.createElement("div", {
85
+ className: (0, _helpers__.withStyle)('col-12 col-md-6 px-0')
86
+ }, /*#__PURE__*/_react.default.createElement("ul", {
87
+ className: (0, _helpers__.withStyle)('mb-2')
88
+ }, /*#__PURE__*/_react.default.createElement("li", null, /*#__PURE__*/_react.default.createElement("i", {
89
+ className: "fas fa-map-marker-alt ".concat((0, _helpers__.withStyle)('me-1'))
90
+ }), ["".concat(street).concat(houseNumber ? " ".concat(houseNumber) : '').concat(houseNumberExtra ? " ".concat(houseNumberExtra) : ''), postCode, city].filter(item => item).join(', ')), telephoneNumber && /*#__PURE__*/_react.default.createElement("li", {
91
+ className: (0, _helpers__.withStyle)('mt-1')
92
+ }, /*#__PURE__*/_react.default.createElement("i", {
93
+ className: "fas fa-phone-alt ".concat((0, _helpers__.withStyle)('mx-1'))
94
+ }), /*#__PURE__*/_react.default.createElement("a", {
95
+ href: "tel:".concat(telephoneNumber)
96
+ }, /*#__PURE__*/_react.default.createElement("u", null, telephoneNumber))), email && /*#__PURE__*/_react.default.createElement("li", {
97
+ className: (0, _helpers__.withStyle)('mt-1')
98
+ }, /*#__PURE__*/_react.default.createElement("i", {
99
+ className: "fas fa-envelope ".concat((0, _helpers__.withStyle)('mx-1'))
100
+ }), /*#__PURE__*/_react.default.createElement("a", {
101
+ href: "mailto:".concat(email)
102
+ }, /*#__PURE__*/_react.default.createElement("u", null, email))), website && /*#__PURE__*/_react.default.createElement("li", {
103
+ className: (0, _helpers__.withStyle)('mt-1')
104
+ }, /*#__PURE__*/_react.default.createElement("i", {
105
+ className: "fas fa-globe ".concat((0, _helpers__.withStyle)('mx-1'))
106
+ }), /*#__PURE__*/_react.default.createElement("a", {
107
+ href: website
108
+ }, /*#__PURE__*/_react.default.createElement("u", null, website)))), /*#__PURE__*/_react.default.createElement("p", {
109
+ className: (0, _helpers__.withStyle)('font-weight-bold mb-1 d-none d-md-block')
110
+ }, /*#__PURE__*/_react.default.createElement("i", {
111
+ className: "fas fa-clock ".concat((0, _helpers__.withStyle)('mx-1'))
112
+ }), "Openingstijden"), /*#__PURE__*/_react.default.createElement("ul", {
113
+ className: (0, _helpers__.withStyle)('ml-3 p-0 d-none d-md-block'),
114
+ style: {
115
+ lineHeight: '1.2'
116
+ }
117
+ }, daysOrder.map(day => {
118
+ const hoursInfo = openingHours && formatOpeningHours(openingHours[day]);
119
+ return /*#__PURE__*/_react.default.createElement("li", {
120
+ key: day,
121
+ className: (0, _helpers__.withStyle)('d-flex align-content-center justify-content-between mb-0'),
122
+ style: {
123
+ marginBottom: '2px'
124
+ }
125
+ }, /*#__PURE__*/_react.default.createElement("p", {
126
+ className: (0, _helpers__.withStyle)('mb-0')
127
+ }, _constants__.DAY_NAMES[day]), /*#__PURE__*/_react.default.createElement("p", {
128
+ className: "".concat(hoursInfo !== null && hoursInfo !== void 0 && hoursInfo.isUnknown ? (0, _helpers__.withStyle)('text-muted fst-italic') : '', " ").concat((0, _helpers__.withStyle)('mb-0'))
129
+ }, (hoursInfo === null || hoursInfo === void 0 ? void 0 : hoursInfo.text) || 'Onbekend'));
130
+ }))), /*#__PURE__*/_react.default.createElement("div", {
131
+ className: (0, _helpers__.withStyle)('col-12 col-md-6 d-flex flex-column justify-content-evenly align-items-center')
132
+ }, /*#__PURE__*/_react.default.createElement("img", {
133
+ className: (0, _helpers__.withStyle)('mb-1'),
134
+ src: locationImage !== null && locationImage !== void 0 && locationImage.length ? (0, _image.getImageFromHyper)({
135
+ imageId: locationImage
136
+ }) : fallbackLogo,
137
+ alt: title
138
+ }))));
139
+ };
140
+ var _default = exports.default = LocationInfo;
@@ -0,0 +1,190 @@
1
+ "use strict";
2
+
3
+ require("core-js/modules/es.array.sort.js");
4
+ require("core-js/modules/es.number.to-fixed.js");
5
+ require("core-js/modules/es.weak-map.js");
6
+ require("core-js/modules/esnext.iterator.constructor.js");
7
+ require("core-js/modules/esnext.iterator.filter.js");
8
+ require("core-js/modules/esnext.iterator.for-each.js");
9
+ require("core-js/modules/esnext.iterator.map.js");
10
+ require("core-js/modules/web.dom-collections.iterator.js");
11
+ require("core-js/modules/es.weak-map.js");
12
+ require("core-js/modules/esnext.iterator.for-each.js");
13
+ Object.defineProperty(exports, "__esModule", {
14
+ value: true
15
+ });
16
+ exports.default = void 0;
17
+ require("core-js/modules/es.array.sort.js");
18
+ require("core-js/modules/es.number.to-fixed.js");
19
+ require("core-js/modules/esnext.iterator.constructor.js");
20
+ require("core-js/modules/esnext.iterator.filter.js");
21
+ require("core-js/modules/esnext.iterator.map.js");
22
+ require("core-js/modules/web.dom-collections.iterator.js");
23
+ var _react = _interopRequireWildcard(require("react"));
24
+ var _LinkButton = _interopRequireDefault(require("../Buttons/LinkButton"));
25
+ var _InlineSpinner = _interopRequireDefault(require("../Spinners/InlineSpinner"));
26
+ var _ActiveMarkerContext = require("../../__context__/ActiveMarkerContext");
27
+ var _OrderSessionContext = require("../../__context__/OrderSessionContext");
28
+ var _helpers__ = require("../../__helpers__");
29
+ var _geolocation = require("../../__helpers__/geolocation");
30
+ var _LocationListItem = _interopRequireDefault(require("./LocationListItem"));
31
+ function _interopRequireDefault(e) {
32
+ return e && e.__esModule ? e : {
33
+ default: e
34
+ };
35
+ }
36
+ function _getRequireWildcardCache(e) {
37
+ if ("function" != typeof WeakMap) return null;
38
+ var r = new WeakMap(),
39
+ t = new WeakMap();
40
+ return (_getRequireWildcardCache = function _getRequireWildcardCache(e) {
41
+ return e ? t : r;
42
+ })(e);
43
+ }
44
+ function _interopRequireWildcard(e, r) {
45
+ if (!r && e && e.__esModule) return e;
46
+ if (null === e || "object" != typeof e && "function" != typeof e) return {
47
+ default: e
48
+ };
49
+ var t = _getRequireWildcardCache(r);
50
+ if (t && t.has(e)) return t.get(e);
51
+ var n = {
52
+ __proto__: null
53
+ },
54
+ a = Object.defineProperty && Object.getOwnPropertyDescriptor;
55
+ for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) {
56
+ var i = a ? Object.getOwnPropertyDescriptor(e, u) : null;
57
+ i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u];
58
+ }
59
+ return n.default = e, t && t.set(e, n), n;
60
+ }
61
+ function ownKeys(e, r) {
62
+ var t = Object.keys(e);
63
+ if (Object.getOwnPropertySymbols) {
64
+ var o = Object.getOwnPropertySymbols(e);
65
+ r && (o = o.filter(function (r) {
66
+ return Object.getOwnPropertyDescriptor(e, r).enumerable;
67
+ })), t.push.apply(t, o);
68
+ }
69
+ return t;
70
+ }
71
+ function _objectSpread(e) {
72
+ for (var r = 1; r < arguments.length; r++) {
73
+ var t = null != arguments[r] ? arguments[r] : {};
74
+ r % 2 ? ownKeys(Object(t), !0).forEach(function (r) {
75
+ _defineProperty(e, r, t[r]);
76
+ }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {
77
+ Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));
78
+ });
79
+ }
80
+ return e;
81
+ }
82
+ function _defineProperty(e, r, t) {
83
+ return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
84
+ value: t,
85
+ enumerable: !0,
86
+ configurable: !0,
87
+ writable: !0
88
+ }) : e[r] = t, e;
89
+ }
90
+ function _toPropertyKey(t) {
91
+ var i = _toPrimitive(t, "string");
92
+ return "symbol" == typeof i ? i : i + "";
93
+ }
94
+ function _toPrimitive(t, r) {
95
+ if ("object" != typeof t || !t) return t;
96
+ var e = t[Symbol.toPrimitive];
97
+ if (void 0 !== e) {
98
+ var i = e.call(t, r || "default");
99
+ if ("object" != typeof i) return i;
100
+ throw new TypeError("@@toPrimitive must return a primitive value.");
101
+ }
102
+ return ("string" === r ? String : Number)(t);
103
+ }
104
+ const LOCATION_PAGE_SIZE = 10;
105
+ const LocationsLoading = () => {
106
+ return /*#__PURE__*/_react.default.createElement("div", {
107
+ className: (0, _helpers__.withStyle)('w-100 text-center')
108
+ }, /*#__PURE__*/_react.default.createElement(_InlineSpinner.default, {
109
+ size: "2rem"
110
+ }));
111
+ };
112
+ const NoLocationFound = () => {
113
+ return /*#__PURE__*/_react.default.createElement("h4", null, "Geen montagelocaties gevonden");
114
+ };
115
+ const LocationList = _ref => {
116
+ let {
117
+ locationsById,
118
+ locationIds,
119
+ userLocation,
120
+ isLocationSetViaSearch = false,
121
+ isLoading = false
122
+ } = _ref;
123
+ const {
124
+ activeMarkerId
125
+ } = (0, _ActiveMarkerContext.useActiveMarker)();
126
+ const [{
127
+ selectedBranch
128
+ }] = (0, _OrderSessionContext.useOrderSession)();
129
+ const [visibleCount, setVisibleCount] = (0, _react.useState)(LOCATION_PAGE_SIZE);
130
+ const listRef = (0, _react.useRef)(null);
131
+ const sortedLocations = (0, _react.useMemo)(() => {
132
+ const locationsWithDistance = locationIds.map(locationId => {
133
+ const location = locationsById[locationId];
134
+ const coordinates = (0, _geolocation.getCoordinatesByString)(location.googleMapsLocation);
135
+ if (!coordinates) return null;
136
+ const distance = userLocation ? (0, _geolocation.calculateDistance)({
137
+ lat1: Number(userLocation.lat),
138
+ lng1: Number(userLocation.lng),
139
+ lat2: coordinates.lat,
140
+ lng2: coordinates.lng
141
+ }) : null;
142
+ return _objectSpread(_objectSpread({}, location), {}, {
143
+ distance: distance != null ? Number(distance.toFixed(2)) : null
144
+ });
145
+ }).filter(location => location !== null);
146
+ return [...locationsWithDistance].sort((a, b) => {
147
+ const aIsSelected = a.entityId === activeMarkerId || a.entityId === selectedBranch;
148
+ const bIsSelected = b.entityId === activeMarkerId || b.entityId === selectedBranch;
149
+ if (aIsSelected && !bIsSelected) return -1;
150
+ if (!aIsSelected && bIsSelected) return 1;
151
+ if (a.distance === null) return 1;
152
+ if (b.distance === null) return -1;
153
+ return a.distance - b.distance;
154
+ });
155
+ }, [activeMarkerId, locationIds, locationsById, selectedBranch, userLocation]);
156
+
157
+ // Handle scrolling when location is set via search
158
+ (0, _react.useEffect)(() => {
159
+ if (isLocationSetViaSearch && listRef.current) {
160
+ listRef.current.scrollTop = 0;
161
+ }
162
+ }, [isLocationSetViaSearch, userLocation]);
163
+ (0, _react.useEffect)(() => {
164
+ setVisibleCount(LOCATION_PAGE_SIZE);
165
+ }, [locationIds, userLocation]);
166
+ const visibleLocations = sortedLocations.slice(0, visibleCount);
167
+ const hasMoreLocations = visibleCount < sortedLocations.length;
168
+ return /*#__PURE__*/_react.default.createElement("div", {
169
+ ref: listRef,
170
+ className: (0, _helpers__.withStyle)('dealer-list')
171
+ }, /*#__PURE__*/_react.default.createElement("h5", null, userLocation ? 'Dichtsbijzijnde montagelocaties' : 'Montagelocaties'), isLoading && /*#__PURE__*/_react.default.createElement(LocationsLoading, null), !isLoading && !locationIds.length && /*#__PURE__*/_react.default.createElement(NoLocationFound, null), visibleLocations.map(location => /*#__PURE__*/_react.default.createElement(_LocationListItem.default, {
172
+ openingHours: location.openingstijden,
173
+ title: location.naamVestiging,
174
+ city: location.city,
175
+ distance: location.distance ? location.distance : null,
176
+ id: location.entityId,
177
+ key: location.entityId,
178
+ branch: location,
179
+ isSelected: location.entityId === activeMarkerId || location.entityId === selectedBranch,
180
+ userLocation: userLocation
181
+ })), hasMoreLocations && /*#__PURE__*/_react.default.createElement("div", {
182
+ className: (0, _helpers__.withStyle)('text-center mt-3')
183
+ }, /*#__PURE__*/_react.default.createElement(_LinkButton.default, {
184
+ label: "Laad meer",
185
+ onClick: () => {
186
+ setVisibleCount(currentCount => Math.min(currentCount + LOCATION_PAGE_SIZE, sortedLocations.length));
187
+ }
188
+ })));
189
+ };
190
+ var _default = exports.default = LocationList;