@wayke-se/components-react 3.2.0 → 3.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist-web/index.js CHANGED
@@ -11,6 +11,8 @@ import scrollIntoView from 'scroll-into-view-if-needed';
11
11
  import { gql, useQuery, ApolloClient, InMemoryCache, ApolloProvider } from '@apollo/client';
12
12
  import { marked } from 'marked';
13
13
  import { parsePhoneNumberFromString } from 'libphonenumber-js/core';
14
+ import { format as format$1 } from 'date-fns/esm';
15
+ import sv$1 from 'date-fns/locale/sv';
14
16
 
15
17
  const _colors = {
16
18
  black: '#000',
@@ -27,6 +29,7 @@ const _colors = {
27
29
  redLight: '#ffd0d0',
28
30
  red: '#c71f1f',
29
31
  yellowLight: '#fff4c7',
32
+ yellow: '#ffc700',
30
33
  blueLight: '#daf7fc',
31
34
  },
32
35
  };
@@ -49,6 +52,7 @@ const theme = {
49
52
  positiveLight: _colors.ui.greenLight,
50
53
  positive: _colors.ui.green,
51
54
  neutralLight: _colors.ui.yellowLight,
55
+ neutral: _colors.ui.yellow,
52
56
  negativeLight: _colors.ui.redLight,
53
57
  negative: _colors.ui.red,
54
58
  infoLight: _colors.ui.blueLight,
@@ -2493,7 +2497,7 @@ const OldPrice$1 = styled.div `
2493
2497
  text-decoration: line-through;
2494
2498
  `;
2495
2499
 
2496
- const PriceTable = ({ price, oldPrice }) => (React__default.createElement(List$6, null,
2500
+ const PriceTable = ({ price, discount }) => (React__default.createElement(List$6, null,
2497
2501
  React__default.createElement(Item$6, null,
2498
2502
  React__default.createElement(Label$5, null,
2499
2503
  React__default.createElement(VisualHeading, null, "Pris")),
@@ -2501,11 +2505,11 @@ const PriceTable = ({ price, oldPrice }) => (React__default.createElement(List$6
2501
2505
  React__default.createElement(Price$1, null,
2502
2506
  numberSeparator(price),
2503
2507
  " kr"))),
2504
- oldPrice !== undefined && (React__default.createElement(Item$6, null,
2508
+ discount !== undefined && (React__default.createElement(Item$6, null,
2505
2509
  React__default.createElement(Label$5, null),
2506
2510
  React__default.createElement(Value, null,
2507
2511
  React__default.createElement(OldPrice$1, null,
2508
- numberSeparator(oldPrice),
2512
+ numberSeparator(price + discount),
2509
2513
  " kr"))))));
2510
2514
 
2511
2515
  const Logo = styled.img `
@@ -4322,8 +4326,13 @@ const SEARCH_ITEM_QUERY = gql `
4322
4326
  postalCode
4323
4327
  }
4324
4328
  price
4329
+ discount
4325
4330
  shortDescription
4326
4331
  title
4332
+ availableFrom
4333
+ flags {
4334
+ demoVersion
4335
+ }
4327
4336
  }
4328
4337
  }
4329
4338
  ${HoursOpen}
@@ -5460,6 +5469,103 @@ const ActionList = ({ contact, branch }) => {
5460
5469
  phonenumber && (React__default.createElement(ToggleItem, { title: "Visa telefonnummer", value: formatPhonenumber(phonenumber), type: "tel", onClickVisible: onClickPhoneVisible, onClickValue: onClickPhoneValue }))));
5461
5470
  };
5462
5471
 
5472
+ const Column = styled.div `
5473
+ flex: 0 1 auto;
5474
+
5475
+ ${({ grow }) => grow &&
5476
+ css `
5477
+ flex-grow: 1;
5478
+ `}
5479
+
5480
+ ${({ noShrink }) => noShrink &&
5481
+ css `
5482
+ flex-shrink: 0;
5483
+ `}
5484
+ `;
5485
+ const Columns = styled.div `
5486
+ display: flex;
5487
+ align-items: flex-start;
5488
+
5489
+ ${({ valign }) => valign === 'end'
5490
+ ? css `
5491
+ align-items: flex-end;
5492
+ `
5493
+ : valign === 'center'
5494
+ ? css `
5495
+ align-items: center;
5496
+ `
5497
+ : css `
5498
+ align-items: flex-start;
5499
+ `}
5500
+
5501
+ ${({ align }) => align === 'end'
5502
+ ? css `
5503
+ justify-content: flex-end;
5504
+ `
5505
+ : align === 'center'
5506
+ ? css `
5507
+ justify-content: center;
5508
+ `
5509
+ : css `
5510
+ justify-content: flex-start;
5511
+ `}
5512
+
5513
+ ${({ $spacing }) => $spacing &&
5514
+ css `
5515
+ margin: ${size($spacing / -2)};
5516
+
5517
+ & > ${Column} {
5518
+ padding: ${size($spacing / 2)};
5519
+ }
5520
+ `}
5521
+
5522
+ ${({ flexWrap }) => flexWrap &&
5523
+ css `
5524
+ flex-wrap: wrap;
5525
+ `}
5526
+
5527
+ ${({ flexInline }) => flexInline &&
5528
+ css `
5529
+ display: inline-flex;
5530
+ `}
5531
+
5532
+ ${({ clearLtSm }) => clearLtSm &&
5533
+ css `
5534
+ ${(props) => props.theme.breakpoint.LtSm} {
5535
+ display: block;
5536
+ }
5537
+ `}
5538
+
5539
+ ${({ clearLtMd }) => clearLtMd &&
5540
+ css `
5541
+ ${(props) => props.theme.breakpoint.LtMd} {
5542
+ display: block;
5543
+ }
5544
+ `}
5545
+ `;
5546
+
5547
+ const StateIndicator = styled.div `
5548
+ width: ${size(1)};
5549
+ height: ${size(1)};
5550
+ border-radius: 50%;
5551
+
5552
+ ${({ $tone }) => $tone === 'success'
5553
+ ? css `
5554
+ background-color: ${(props) => props.theme.color.ui.positive};
5555
+ `
5556
+ : $tone === 'pending'
5557
+ ? css `
5558
+ background-color: ${(props) => props.theme.color.ui.neutral};
5559
+ `
5560
+ : $tone === 'error'
5561
+ ? css `
5562
+ background-color: ${(props) => props.theme.color.ui.negative};
5563
+ `
5564
+ : css `
5565
+ background-color: ${(props) => props.theme.color.textDarkLighten};
5566
+ `}
5567
+ `;
5568
+
5463
5569
  const List$8 = styled.ul `
5464
5570
  list-style: none;
5465
5571
  padding: 0;
@@ -5618,7 +5724,7 @@ const PackageOptionModal = ({ packageOption, onClose }) => (React__default.creat
5618
5724
  packageOption.link?.href && packageOption.link.title && (React__default.createElement(Repeat, null,
5619
5725
  React__default.createElement(ButtonInline, { as: "a", href: packageOption.link.href, target: "_blank", rel: "noopener noreferrer nofollow" }, packageOption.link.title)))));
5620
5726
 
5621
- const CheckList = ({ manufacturer, packageOptions, ecommerce, branch, contact, toggleEcomModal, loadingCentralStorageVehicle, }) => {
5727
+ const CheckList = ({ manufacturer, packageOptions, ecommerce, branch, contact, availableFrom, toggleEcomModal, loadingCentralStorageVehicle, }) => {
5622
5728
  const [modalBranch, setModalBranch] = useState(false);
5623
5729
  const openModalBranch = useCallback(() => setModalBranch(true), []);
5624
5730
  const closeModalBranch = useCallback(() => setModalBranch(false), []);
@@ -5634,31 +5740,6 @@ const CheckList = ({ manufacturer, packageOptions, ecommerce, branch, contact, t
5634
5740
  return (React__default.createElement(React__default.Fragment, null,
5635
5741
  modalBranch && (React__default.createElement(BranchModal, { loading: loadingCentralStorageVehicle, connections: branch?.connections, onClose: closeModalBranch })),
5636
5742
  modal && React__default.createElement(PackageOptionModal, { packageOption: modal, onClose: onClose }),
5637
- React__default.createElement(Repeat, null,
5638
- React__default.createElement(CheckMarkList, null,
5639
- packageOption?.title && (React__default.createElement(CheckMarkListItem, null,
5640
- React__default.createElement(React__default.Fragment, null,
5641
- "Inkl.",
5642
- ' ',
5643
- React__default.createElement(ButtonInline, { onClick: () => onOpen({
5644
- title: packageOption?.title,
5645
- image: packageOption?.image,
5646
- description: packageOption?.description,
5647
- link: packageOption?.link,
5648
- }) }, packageOption.title),
5649
- ' ',
5650
- "begagnatgaranti"))),
5651
- packageOptions?.map((packageOption, index) => (React__default.createElement(CheckMarkListItem, { key: packageOption.title || index },
5652
- React__default.createElement(React__default.Fragment, null,
5653
- "Inkl.",
5654
- ' ',
5655
- React__default.createElement(ButtonInline, { onClick: () => onOpen({
5656
- title: packageOption?.title,
5657
- image: packageOption?.image,
5658
- description: packageOption?.description,
5659
- link: packageOption?.link,
5660
- }) }, packageOption.title))))),
5661
- ecommerce?.withHomeDelivery && React__default.createElement(CheckMarkListItem, null, "Hemleverans"))),
5662
5743
  React__default.createElement(Repeat, null,
5663
5744
  ecommerce && ecommerce.enabled && (React__default.createElement(RepeatTiny, null,
5664
5745
  React__default.createElement(ButtonPrimary, { disabled: !!ecommerce.reserved, fullWidth: true, onClick: toggleEcomModal },
@@ -5668,6 +5749,40 @@ const CheckList = ({ manufacturer, packageOptions, ecommerce, branch, contact, t
5668
5749
  React__default.createElement(Content$2, null,
5669
5750
  React__default.createElement("p", null, "Denna bil \u00E4r reserverad av en annan k\u00F6pare."))))),
5670
5751
  React__default.createElement(ActionList, { branch: branch, contact: contact })),
5752
+ React__default.createElement(Repeat, null,
5753
+ availableFrom && new Date(availableFrom).valueOf() > new Date().valueOf() && (React__default.createElement(RepeatTiny, null,
5754
+ React__default.createElement(Columns, { "$spacing": 1, valign: "center" },
5755
+ React__default.createElement(Column, { noShrink: true },
5756
+ React__default.createElement(StateIndicator, { "$tone": "pending" })),
5757
+ React__default.createElement(Column, null,
5758
+ React__default.createElement(UtilityFontSizeSmall, null,
5759
+ "Tillg\u00E4nglig fr\u00E5n ",
5760
+ format$1(new Date(availableFrom), 'dd MMMM yyyy', { locale: sv$1 })))))),
5761
+ React__default.createElement(RepeatTiny, null,
5762
+ React__default.createElement(CheckMarkList, null,
5763
+ packageOption?.title && (React__default.createElement(CheckMarkListItem, null,
5764
+ React__default.createElement(React__default.Fragment, null,
5765
+ "Inkl.",
5766
+ ' ',
5767
+ React__default.createElement(ButtonInline, { onClick: () => onOpen({
5768
+ title: packageOption?.title,
5769
+ image: packageOption?.image,
5770
+ description: packageOption?.description,
5771
+ link: packageOption?.link,
5772
+ }) }, packageOption.title),
5773
+ ' ',
5774
+ "begagnatgaranti"))),
5775
+ packageOptions?.map((packageOption, index) => (React__default.createElement(CheckMarkListItem, { key: packageOption.title || index },
5776
+ React__default.createElement(React__default.Fragment, null,
5777
+ "Inkl.",
5778
+ ' ',
5779
+ React__default.createElement(ButtonInline, { onClick: () => onOpen({
5780
+ title: packageOption?.title,
5781
+ image: packageOption?.image,
5782
+ description: packageOption?.description,
5783
+ link: packageOption?.link,
5784
+ }) }, packageOption.title))))),
5785
+ ecommerce?.withHomeDelivery && React__default.createElement(CheckMarkListItem, null, "Hemleverans")))),
5671
5786
  (branch?.connections.length || 0) > 1 && (React__default.createElement(Repeat, null,
5672
5787
  React__default.createElement(SwitchBar, { title: "Centrallagerbil", actionTitle: "Byt anl\u00E4ggning", onClick: openModalBranch },
5673
5788
  React__default.createElement(Content$2, null,
@@ -6979,6 +7094,10 @@ const PropertySet = ({ propertySet, vehicleData }) => {
6979
7094
  React__default.createElement(MetadataCategory, { properties: activeCategory.properties, subCategories: activeCategory.subCategories })))));
6980
7095
  };
6981
7096
 
7097
+ const DemoCarModal = ({ onClose }) => (React__default.createElement(Modal, { title: "Demobil", onClose: onClose },
7098
+ React__default.createElement(Content$2, null,
7099
+ React__default.createElement("p", null, "En demobil \u00E4r en bil som st\u00E5tt i utst\u00E4llning eller som p\u00E5 annat s\u00E4tt anv\u00E4nts f\u00F6r att visa upp en viss modell. Bilarna \u00E4r ofta v\u00E4lutrustade och har blivit v\u00E4l omh\u00E4ndertagna. Dessutom har de vanligtvis g\u00E5tt f\u00E5 mil och har fortfarande nybilsgarantierna kvar."))));
7100
+
6982
7101
  const PdfListItem = styled.li.attrs(() => ({
6983
7102
  className: 'wayke__theme wayke__color--primary-text',
6984
7103
  })) `
@@ -7047,6 +7166,8 @@ const WaykeSearchItem = ({ id, hashRoute, pathRoute, disableResetScrollOnInit, p
7047
7166
  const ecomContext = useRef();
7048
7167
  const { loading, data: result } = useSearchItem(id);
7049
7168
  const { vehicle: centralStorageVehicle, loading: loadingCentralStorageVehicle } = useCentralStorage(result?.vehicle);
7169
+ const [demoCarModal, setDemoCarModal] = useState(false);
7170
+ const onToggleDemoCarModal = useCallback(() => setDemoCarModal(!demoCarModal), [demoCarModal]);
7050
7171
  useEffect(() => {
7051
7172
  if (ecomSettings) {
7052
7173
  ecomContext.current = new WaykeEcomWeb({
@@ -7093,7 +7214,7 @@ const WaykeSearchItem = ({ id, hashRoute, pathRoute, disableResetScrollOnInit, p
7093
7214
  const { vehicle } = result;
7094
7215
  const contact = centralStorageVehicle?.contact;
7095
7216
  const branch = centralStorageVehicle?.branch;
7096
- const { title, shortDescription, media, description, price, financialOptions, manufacturer, ecommerce, packageOptions, publishedAt, documents, } = vehicle;
7217
+ const { title, shortDescription, media, description, price, discount, financialOptions, manufacturer, ecommerce, packageOptions, publishedAt, documents, availableFrom, flags, } = vehicle;
7097
7218
  const insuranceOptions = centralStorageVehicle?.insuranceOptions
7098
7219
  ? centralStorageVehicle.insuranceOptions
7099
7220
  : vehicle.insuranceOptions;
@@ -7102,10 +7223,16 @@ const WaykeSearchItem = ({ id, hashRoute, pathRoute, disableResetScrollOnInit, p
7102
7223
  {
7103
7224
  title: modelYear,
7104
7225
  },
7105
- {
7106
- title: `${numberSeparator(mileage)} mil`,
7107
- },
7108
7226
  ];
7227
+ if (flags?.demoVersion) {
7228
+ uspList.push({
7229
+ title: 'Demobil',
7230
+ onClick: onToggleDemoCarModal,
7231
+ });
7232
+ }
7233
+ uspList.push({
7234
+ title: `${numberSeparator(mileage)} mil`,
7235
+ });
7109
7236
  if (gearbox) {
7110
7237
  uspList.push({ title: gearbox });
7111
7238
  }
@@ -7135,12 +7262,12 @@ const WaykeSearchItem = ({ id, hashRoute, pathRoute, disableResetScrollOnInit, p
7135
7262
  React__default.createElement(RepeatSmall, null,
7136
7263
  React__default.createElement(UspList, { small: true, items: uspList })))),
7137
7264
  React__default.createElement(ProductPageAsideSection, { mobileOrder: 2 },
7138
- React__default.createElement(PriceTable, { price: price })),
7265
+ React__default.createElement(PriceTable, { price: price, discount: discount || undefined })),
7139
7266
  (financialOptions.length > 0 || insuranceOptions.length > 0) && (React__default.createElement(ProductPageAsideSection, { mobileOrder: 4 },
7140
7267
  financialOptions.length > 0 && (React__default.createElement(FinancialOptions, { id: id, financialOptions: financialOptions })),
7141
7268
  insuranceOptions.length > 0 && (React__default.createElement(InsuranceOptions, { id: id, branch: centralStorageVehicle?.branch, insuranceOptions: insuranceOptions })))),
7142
7269
  React__default.createElement(ProductPageAsideSection, { mobileOrder: 5 },
7143
- React__default.createElement(CheckList, { manufacturer: manufacturer, packageOptions: packageOptions, ecommerce: ecommerce, branch: branch, contact: centralStorageVehicle?.contact, loadingCentralStorageVehicle: loadingCentralStorageVehicle, toggleEcomModal: () => ecomContext.current?.start() }))),
7270
+ React__default.createElement(CheckList, { manufacturer: manufacturer, packageOptions: packageOptions, ecommerce: ecommerce, branch: branch, contact: centralStorageVehicle?.contact, loadingCentralStorageVehicle: loadingCentralStorageVehicle, availableFrom: availableFrom, toggleEcomModal: () => ecomContext.current?.start() }))),
7144
7271
  React__default.createElement(ProductPageMain, null,
7145
7272
  React__default.createElement(ProductPageAsideSection, { mobileOrder: 3 },
7146
7273
  React__default.createElement(Gallery, { media: media, placeholderImage: placeholderImage })),
@@ -7181,7 +7308,8 @@ const WaykeSearchItem = ({ id, hashRoute, pathRoute, disableResetScrollOnInit, p
7181
7308
  React__default.createElement(ManufacturerPackageOption, { packageOption: manufacturer?.packageOption }))))),
7182
7309
  React__default.createElement(Related, { id: id, hashRoute: hashRoute, pathRoute: pathRoute, onClickSearchItem: onClickSearchItem })),
7183
7310
  false ,
7184
- React__default.createElement(PortalElement, { id: DefaultPortal })));
7311
+ React__default.createElement(PortalElement, { id: DefaultPortal }),
7312
+ demoCarModal && React__default.createElement(DemoCarModal, { onClose: onToggleDemoCarModal })));
7185
7313
  };
7186
7314
 
7187
7315
  const GraphqlProvider = ({ uri, children }) => {
@@ -7344,7 +7472,9 @@ const SearchProvider = ({ url, apiKey, useQueryParamsFromUrl, pathRoute, childre
7344
7472
  setQueryFilter({
7345
7473
  searchParams: initialQueryParams,
7346
7474
  });
7347
- replaceState(`${window.location.pathname}${nextSearch}`);
7475
+ if (useQueryParamsFromUrl) {
7476
+ replaceState(`${window.location.pathname}${nextSearch}`);
7477
+ }
7348
7478
  }
7349
7479
  setInitialize(true);
7350
7480
  }