@everymatrix/cashier-method-details 1.43.2 → 1.43.4

Sign up to get free protection for your applications and to get access to all the features.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@everymatrix/cashier-method-details",
3
- "version": "1.43.2",
3
+ "version": "1.43.4",
4
4
  "main": "index.js",
5
5
  "svelte": "src/index.ts",
6
6
  "scripts": {
@@ -35,5 +35,5 @@
35
35
  "publishConfig": {
36
36
  "access": "public"
37
37
  },
38
- "gitHead": "0477411e57fe6c3eda8ff28059aa540dcada8ae0"
38
+ "gitHead": "8464c47cb49b4ffa1c9debfac3a7dfc3097cf57a"
39
39
  }
@@ -120,7 +120,8 @@
120
120
  enum ResponseCode {
121
121
  PlayerSessionIsNotValid = 'PlayerSessionIsNotValid',
122
122
  Success = 'Success',
123
- JwtTokenError = 'JwtTokenError'
123
+ JwtTokenError = 'JwtTokenError',
124
+ Maintenance = 'Maintenance'
124
125
  }
125
126
 
126
127
  const VISIBLE_FIELD_TYPES: string[] = 'Text,Number,Money,Boolean,Lookup,Date,Time,DateTime,Password,Label,Link,QRCode'.split(',');
@@ -218,13 +219,11 @@
218
219
  let selectedPaymentMethod: PaymentMethod = {} as PaymentMethod;
219
220
  let fields: PaymentMethodDetails[] = [];
220
221
  let prepareFields = {};
221
- let isLoading:boolean = false;
222
- let isMethodOpen:boolean = false;
223
- let displayNone:boolean = false;
224
- let customStylingContainer:HTMLElement;
222
+ let displayNone: boolean = false;
223
+ let customStylingContainer: HTMLElement;
225
224
  let prepareRequest;
226
- let showConfirmModal:boolean = false;
227
- let showReceiptPage:boolean = false;
225
+ let showConfirmModal: boolean = false;
226
+ let showReceiptPage: boolean = false;
228
227
  let redirectUrl: string;
229
228
  let windowRedirect: Window;
230
229
  let showRedirectNotification: boolean;
@@ -239,9 +238,7 @@
239
238
  let qrCodeScriptSrc: string = 'https://cdn.rawgit.com/davidshimjs/qrcodejs/gh-pages/qrcode.min.js';
240
239
  let blankPageTarget: string = '_blank';
241
240
  let externalLink: string = '';
242
- let mobileView:boolean = false;
243
- let userAgent:string = window.navigator.userAgent;
244
- let mediaQuery = window.matchMedia('(max-width: 750px)');
241
+ let mobileView: boolean = false;
245
242
  let innerWidth: number;
246
243
  let formatter = new Intl.NumberFormat(local, {minimumFractionDigits: 2 });
247
244
  let amountError = '';
@@ -254,8 +251,10 @@
254
251
  let isDisabled: boolean;
255
252
  let showErrorModal = false;
256
253
  let transactionId = '';
257
- let showSpinner: boolean = true;
258
- $: endpoint && session && selectedpaymentmethodname && currency && reinitMethod();
254
+ let showSpinner: boolean = false;
255
+ let abortController = new AbortController();
256
+
257
+ $: endpoint && session && selectedpaymentmethodname && currency && initMethod();
259
258
  $: clientstyling && customStylingContainer && setClientStyling();
260
259
  $: clientstylingurl && customStylingContainer && setClientStylingURL();
261
260
  $: lang && setActiveLanguage();
@@ -264,8 +263,7 @@
264
263
  $: fields.length && qrCodeContainer.length && generateQr();
265
264
  $: fields.length && flatpickrEl.length && createDatePicker();
266
265
 
267
-
268
- const reinitMethod = () => {
266
+ const initMethod = () => {
269
267
  if (flatpickrEl.length) {
270
268
  flatpickrEl.forEach(el => {
271
269
  if (!el) {
@@ -308,6 +306,12 @@
308
306
  })
309
307
  }
310
308
 
309
+ const reinitMethod = (e) => {
310
+ if (abortController?.signal?.aborted && selectedpaymentmethodname === e.detail.Name) {
311
+ initMethod()
312
+ }
313
+ }
314
+
311
315
  const createDatePicker = () => {
312
316
  const dateOptions = {
313
317
  [FieldTypes.Time]: {
@@ -347,9 +351,11 @@
347
351
  })
348
352
  });
349
353
  }
354
+
350
355
  const setActiveLanguage = ():void => {
351
356
  setLocale(lang);
352
357
  }
358
+
353
359
  const setTranslationUrl = () => {
354
360
  let url:string = translationurl;
355
361
  if (url) {
@@ -370,6 +376,10 @@
370
376
  });
371
377
 
372
378
  const getPaymentDetails = () => {
379
+ abortPaymentFetch();
380
+ abortController = new AbortController();
381
+ const signal = abortController.signal;
382
+ showSpinner = true;
373
383
  const url:URL = new URL(`${endpoint}/v1/player/${customerid}/payment/GetPaymentMethod`);
374
384
  const headers = new Headers();
375
385
  headers.append("accept", "application/json");
@@ -386,46 +396,53 @@
386
396
  })
387
397
  }
388
398
  fetch(url, requestParams).then(res => res.json()).then(data => {
389
- if (data.error) {
390
- window.postMessage({type: 'ShowSessionError', error: data.error}, window.location.href)
391
- return;
392
- }
393
- if (data.ResponseCode === ResponseCode.PlayerSessionIsNotValid) {
394
- errorResponseCode = data.ResponseCode;
399
+ if (!signal.aborted) {
400
+ if (data.error) {
401
+ window.postMessage({type: 'ShowSessionError', error: data.error}, window.location.href)
402
+ return;
403
+ }
404
+ if (data.ResponseCode === ResponseCode.PlayerSessionIsNotValid
405
+ || data.ResponseCode === ResponseCode.Maintenance
406
+ || data.ResponseCode === ResponseCode.JwtTokenError) {
407
+ errorResponseCode = data.ResponseCode;
408
+ setErrorResponseCode();
409
+ return;
410
+ }
411
+ if (data.ResponseCode !== ResponseCode.Success) {
412
+ errorResponseCode = data.ResponseCode;
413
+ return;
414
+ }
415
+ xPaymentSessionToken = data.XPaymentSessionToken;
416
+ selectedPaymentMethod = data.PaymentMethod;
417
+ editedAmount = Number(amount);
418
+ if (!selectedPaymentMethod.HideAmountField) {
419
+ validateAmount();
420
+ } else {
421
+ amountError = '';
422
+ }
423
+ fields = selectedPaymentMethod.Fields && selectedPaymentMethod.Fields.map(field => new PaymentMethodDetails(field));
424
+ fields.forEach(field => {
425
+ if (field?.defaultValue) {
426
+ prepareFields[field.name] = field.defaultValue;
427
+ }
428
+ validateField(field);
429
+ })
430
+ setConfirmModalInfo();
395
431
  setErrorResponseCode();
396
- return;
397
- }
398
-
399
- if (data.ResponseCode === ResponseCode.JwtTokenError) {
400
- errorResponseCode = data.ResponseCode;
401
- setErrorResponseCode();
402
- return;
432
+ hideMethodsList();
433
+ window.postMessage({
434
+ type: 'StartSessionCountdown',
435
+ xPaymentSessionToken,
436
+ selectedPaymentMethodName: selectedpaymentmethodname
437
+ }, window.location.href);
403
438
  }
439
+ }).finally(() => { showSpinner = signal.aborted })
440
+ }
404
441
 
405
- if (data.ResponseCode !== ResponseCode.Success) {
406
- errorResponseCode = data.ResponseCode;
407
- return;
408
- }
409
- xPaymentSessionToken = data.XPaymentSessionToken;
410
- selectedPaymentMethod = data.PaymentMethod;
411
- editedAmount = Number(amount);
412
- if (!selectedPaymentMethod.HideAmountField) {
413
- validateAmount();
414
- } else {
415
- amountError = '';
416
- }
417
- fields = selectedPaymentMethod.Fields && selectedPaymentMethod.Fields.map(field => new PaymentMethodDetails(field));
418
- fields.forEach(field => {
419
- if (field?.defaultValue) {
420
- prepareFields[field.name] = field.defaultValue;
421
- }
422
- validateField(field);
423
- })
424
- setConfirmModalInfo();
425
- setErrorResponseCode();
426
- hideMethodsList();
427
- window.postMessage({ type: 'StartSessionCountdown', xPaymentSessionToken, selectedPaymentMethodName: selectedpaymentmethodname }, window.location.href);
428
- }).finally(() => showSpinner = false)
442
+ const abortPaymentFetch = ():void => {
443
+ if (abortController) {
444
+ abortController.abort();
445
+ }
429
446
  }
430
447
 
431
448
  const setClientStyling = ():void => {
@@ -471,6 +488,7 @@
471
488
  window.addEventListener('confirmModal', confirmTxn, false);
472
489
  window.addEventListener('closeIframe', closeIframe, false);
473
490
  window.addEventListener('notificationButtonClick', retryRedirect, false);
491
+ window.addEventListener('selectPayMeth', reinitMethod, false)
474
492
  document.addEventListener('click',closeAllLookups);
475
493
  window.addEventListener('message', messageHandler, false);
476
494
  dayjs.extend(customParseFormat);
@@ -480,6 +498,7 @@
480
498
  window.removeEventListener('confirmModal', confirmTxn);
481
499
  window.removeEventListener('closeIframe', closeIframe);
482
500
  window.removeEventListener('notificationButtonClick', retryRedirect);
501
+ window.removeEventListener('selectPayMeth', reinitMethod, false)
483
502
  window.removeEventListener('message', messageHandler);
484
503
  }
485
504
  });
@@ -546,23 +565,17 @@
546
565
  postMessage({type: 'ShowSessionError', error: data.error}, window.location.href)
547
566
  return;
548
567
  }
549
- if (data.ResponseCode === ResponseCode.PlayerSessionIsNotValid) {
550
- errorResponseCode = data.ResponseCode
551
- setErrorResponseCode();
552
- return;
553
- }
554
-
555
- if (data.ResponseCode === ResponseCode.JwtTokenError) {
556
- errorResponseCode = data.ResponseCode
557
- setErrorResponseCode();
558
- return;
559
- }
560
-
561
568
  if (data.ResponseCode !== ResponseCode.Success) {
562
569
  errorResponseCode = data.ResponseCode
563
570
  isProcessingTxn = false;
564
571
  toggleDisableActionOnPage();
565
- showModal()
572
+ if (data.ResponseCode === ResponseCode.PlayerSessionIsNotValid
573
+ || data.ResponseCode === ResponseCode.Maintenance
574
+ || data.ResponseCode === ResponseCode.JwtTokenError) {
575
+ setErrorResponseCode();
576
+ } else {
577
+ showModal()
578
+ }
566
579
  return;
567
580
  }
568
581
  xPaymentSessionToken = data.XPaymentSessionToken;
@@ -577,16 +590,20 @@
577
590
  const setErrorResponseCode = () => {
578
591
  window.postMessage({type: 'ErrorResponseCode', errorResponseCode}, window.location.href);
579
592
  }
593
+
580
594
  const setConfirmModalInfo = () => {
581
595
  window.postMessage({type:'ShowConfirmModal', showConfirmModal, editedAmount, hideAmountField: selectedPaymentMethod.HideAmountField}, window.location.href);
582
596
  }
597
+
583
598
  const setRedirectInfo = () => {
584
599
  window.postMessage({type: 'RedirectInfo', redirectMode, redirectUrl}, window.location.href);
585
600
  }
601
+
586
602
  const showModal = () => {
587
603
  showErrorModal = true;
588
604
  window.postMessage({ type: 'ShowCashierModal', modalErrorMessage: errorResponseCode}, window.location.href)
589
605
  }
606
+
590
607
  const backToMethodList = () => {
591
608
  dispatchEvent(new CustomEvent('backToMethodList', {
592
609
  bubbles: true,
@@ -601,6 +618,9 @@
601
618
  }
602
619
 
603
620
  const hidePaymentDetails = () => {
621
+ if (showSpinner) {
622
+ abortPaymentFetch()
623
+ }
604
624
  dispatchEvent(new CustomEvent('hidePaymentDetails', {
605
625
  detail: { hideMethodDetails: mobileView },
606
626
  bubbles: true,
@@ -617,14 +637,17 @@
617
637
  composed: true
618
638
  }));
619
639
  }
640
+
620
641
  const closeIframe = () => {
621
642
  redirectUrl = null;
622
643
  showReceiptPage = true;
623
644
  setRedirectInfo();
624
645
  }
646
+
625
647
  const closeModal = () => {
626
648
  showConfirmModal = false;
627
649
  }
650
+
628
651
  const confirmTxn = () => {
629
652
  isProcessingTxn = true;
630
653
  const url:URL = new URL(`${endpoint}/v1/player/${customerid}/payment/GetPaymentConfirm`);
@@ -642,23 +665,17 @@
642
665
  })
643
666
  }
644
667
  fetch(url, requestParams).then((res) => res.json()).then(data => {
645
- if(data.ResponseCode === ResponseCode.PlayerSessionIsNotValid) {
646
- errorResponseCode = data.ResponseCode
647
- setErrorResponseCode();
648
- return;
649
- }
650
-
651
- if(data.ResponseCode === ResponseCode.JwtTokenError) {
652
- errorResponseCode = data.ResponseCode
653
- setErrorResponseCode();
654
- return;
655
- }
656
-
657
668
  if (data.ResponseCode !== ResponseCode.Success) {
658
- errorResponseCode = data.ResponseCode;
669
+ errorResponseCode = data.ResponseCode
659
670
  isProcessingTxn = false;
660
671
  toggleDisableActionOnPage();
661
- showModal();
672
+ if (data.ResponseCode === ResponseCode.PlayerSessionIsNotValid
673
+ || data.ResponseCode === ResponseCode.Maintenance
674
+ || data.ResponseCode === ResponseCode.JwtTokenError) {
675
+ setErrorResponseCode();
676
+ } else {
677
+ showModal()
678
+ }
662
679
  return;
663
680
  }
664
681
  xPaymentSessionToken = data.XPaymentSessionToken;
@@ -807,6 +824,12 @@
807
824
  return ''
808
825
  }
809
826
 
827
+ const keydownHandler = (event: KeyboardEvent) => {
828
+ const invalidKeys = ['+','-','e','E'];
829
+ if (invalidKeys.includes(event.key)) {
830
+ event.preventDefault();
831
+ }
832
+ }
810
833
  const validateAmount = () => {
811
834
  amountError = emptyAmountError() || minAmountError() ||
812
835
  maxAmountError() || amountMultiplierError() ||
@@ -879,6 +902,7 @@
879
902
  <input type="number"
880
903
  bind:value={editedAmount}
881
904
  on:input={() => validateAmount()}
905
+ on:keydown={(event) => keydownHandler(event)}
882
906
  on:blur={() => {showError['amount'] = true; validateAmount()}}
883
907
  placeholder="{$_('amountPlaceholder')}"
884
908
  >
@@ -1048,7 +1072,7 @@
1048
1072
  hidebuttons="{`${!mobileView}`}"
1049
1073
  errorcode={errorResponseCode}
1050
1074
  >
1051
- <div slot="button" class="ModalButton" on:click={backToMethodList}>{$_('backToMethodList')}</div>
1075
+ <button slot="button" class="CashierErrorButton" on:click={backToMethodList}>{$_('backToMethodList')}</button>
1052
1076
  </cashier-error>
1053
1077
  {/if}
1054
1078
  </div>
@@ -1333,6 +1357,27 @@
1333
1357
  background: var(--mmw--color-main-button-hover, #71B11B);
1334
1358
  }
1335
1359
  }
1360
+ .CashierErrorButton {
1361
+ width: 100%;
1362
+ height: 36px;
1363
+ color: var(--emw--color-white, #FFF);
1364
+ text-align: center;
1365
+ cursor: pointer;
1366
+ font-size: var(--emw--font-size-x-small, 12px);
1367
+ font-style: normal;
1368
+ font-weight: var(--emw--font-weight-semibold, 500);
1369
+ font-family: inherit;
1370
+ line-height: 36px;
1371
+ border: none;
1372
+ border-radius: var(--emw--border-radius-medium, 4px);
1373
+ background: var(--emw--color-primary, #7EC51E);
1374
+ &:hover {
1375
+ background: var(--mmw--color-main-button-hover, #71B11B);
1376
+ }
1377
+ &:active {
1378
+ background: var(--mmw--color-main-button-active, #5C950F);
1379
+ }
1380
+ }
1336
1381
  .QRCode {
1337
1382
  width: 250px;
1338
1383
  margin: auto;
@@ -1393,7 +1438,7 @@
1393
1438
  display: block;
1394
1439
  }
1395
1440
  }
1396
- }
1441
+ }
1397
1442
  .DateInput {
1398
1443
  position: relative;
1399
1444
  .MobileDateInput {
@@ -1449,7 +1494,7 @@
1449
1494
  position: absolute;
1450
1495
  left: 0;
1451
1496
  right: 0;
1452
- z-index: 99;
1497
+ z-index: 3;
1453
1498
  background-color: var(--emw--color-white, #fff);
1454
1499
  border: 1px solid var(--mmw--color-grey-105, #E8E9EB);
1455
1500
  border-radius: var(--emw--border-radius-medium, 4px);