tf-checkout-react 1.6.6-beta.25 → 1.6.6-beta.27

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 (46) hide show
  1. package/dist/api/checkout.d.ts +1 -0
  2. package/dist/components/addonsContainer/SimpleAddonsContainer.d.ts +17 -0
  3. package/dist/components/addonsContainer/index.d.ts +2 -1
  4. package/dist/components/billing-info-container/index.d.ts +6 -1
  5. package/dist/components/billing-info-container/utils.d.ts +25 -1
  6. package/dist/components/countdown/index.d.ts +1 -1
  7. package/dist/components/paymentContainer/OrderDetails.d.ts +2 -0
  8. package/dist/components/paymentContainer/handlePayment.d.ts +15 -0
  9. package/dist/components/paymentContainer/index.d.ts +8 -5
  10. package/dist/components/stripePayment/index.d.ts +18 -3
  11. package/dist/components/ticketsContainer/index.d.ts +1 -0
  12. package/dist/components/timerWidget/index.d.ts +2 -1
  13. package/dist/index.d.ts +3 -1
  14. package/dist/tf-checkout-react.cjs.development.js +3315 -2520
  15. package/dist/tf-checkout-react.cjs.development.js.map +1 -1
  16. package/dist/tf-checkout-react.cjs.production.min.js +1 -1
  17. package/dist/tf-checkout-react.cjs.production.min.js.map +1 -1
  18. package/dist/tf-checkout-react.esm.js +3315 -2522
  19. package/dist/tf-checkout-react.esm.js.map +1 -1
  20. package/dist/tf-checkout-styles.css +1 -1
  21. package/dist/types/order-data.d.ts +1 -1
  22. package/dist/utils/auth.d.ts +8 -0
  23. package/dist/utils/index.d.ts +1 -1
  24. package/package.json +3 -3
  25. package/src/api/auth.ts +2 -1
  26. package/src/api/checkout.ts +8 -4
  27. package/src/api/interceptors.ts +6 -22
  28. package/src/api/publicRequest.ts +10 -0
  29. package/src/components/addonsContainer/AddonComponent.tsx +1 -1
  30. package/src/components/addonsContainer/SimpleAddonsContainer.tsx +384 -0
  31. package/src/components/addonsContainer/index.tsx +7 -2
  32. package/src/components/billing-info-container/index.tsx +523 -327
  33. package/src/components/billing-info-container/{utils.ts → utils.tsx} +119 -0
  34. package/src/components/countdown/index.tsx +22 -22
  35. package/src/components/paymentContainer/OrderDetails.tsx +125 -0
  36. package/src/components/paymentContainer/handlePayment.ts +86 -0
  37. package/src/components/paymentContainer/index.tsx +261 -252
  38. package/src/components/preRegistration/index.tsx +4 -3
  39. package/src/components/stripePayment/index.tsx +129 -24
  40. package/src/components/ticketsContainer/TicketsSection.tsx +83 -79
  41. package/src/components/ticketsContainer/index.tsx +10 -21
  42. package/src/components/timerWidget/index.tsx +15 -3
  43. package/src/index.ts +6 -2
  44. package/src/types/order-data.ts +1 -1
  45. package/src/utils/auth.ts +32 -0
  46. package/src/utils/index.ts +1 -1
@@ -1 +1 @@
1
- .button-container{display:flex;justify-content:center;padding:20px}.billing-info-container{margin:0 auto;max-width:800px}.billing-info-container .is-half{width:49%}.billing-info-container p{color:#000}.billing-info-container .main-header{font-size:2rem;font-weight:600}.billing-info-container__twoFields{display:flex;justify-content:space-between;margin-top:15px}.billing-info-container__singleField{margin-top:15px}button{margin-top:10px}.account-actions-block{color:#182026;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,Icons16,sans-serif;margin-top:10px}.MuiButtonBase-root.MuiButton-root,.MuiButtonBase-root.MuiButton-root:hover,.login-register-button{background-color:#212529;border:#f28051;border-radius:5px;color:#fff;cursor:pointer;display:block;font-family:Inter-Bold;font-size:26px;font-weight:700;line-height:1.15;margin-top:10px;min-height:46px;outline:none;overflow:hidden;padding:14px 12px 12px;position:relative;text-align:center;text-overflow:ellipsis;text-transform:uppercase;width:49%}.logo-image-container{margin-top:5px;text-align:center;width:49%}.logo-image-container img{height:30px}.login-block{align-items:center;display:flex;flex-direction:column}.login-register-button:hover{background-color:#505050!important;border-color:#505050!important}.login-register-block{display:flex;justify-content:space-between}@media only screen and (max-width:820px){.billing-info-container{width:90%}.billing-info-container .main-header{font-size:1.5rem}}.email-checking{margin-bottom:15px}.timer{background-color:#000;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=);background-position:15px;background-repeat:no-repeat;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 12px #999;-webkit-box-shadow:0 0 12px #999;box-shadow:0 0 12px #999;color:#fff;margin:0 0 6px;max-width:300px;overflow:hidden;padding:15px 15px 15px 50px;pointer-events:auto;position:absolute;right:15px;width:300px}.timer .close-icon{cursor:pointer;display:flex;position:absolute;right:10px;top:10px}.timer .countdown{font-weight:700;margin-top:10px}.forgot-password-modal .forgot-password-container{margin:0 auto;max-width:800px}.forgot-password-modal .title{background-color:#fff;font-family:Inter;font-size:18px;font-weight:700}.forgot-password-modal .forgot-password-container__singleField{margin-top:15px}.forgot-password-modal .forgot-password-action-button button{background-color:#212529;border:none;border-radius:0;color:#fff;cursor:pointer;font-size:26px;font-weight:600;height:45px;line-height:18px;margin-top:10px;outline:none;padding:10px;text-transform:uppercase;width:100%}.forgot-password-modal .forgot-password-action-button button:hover:enabled{background-color:#505050;border-color:#505050}.forgot-password-modal .login{margin-top:10px;text-align:center}.forgot-password-modal .login span{cursor:pointer}.forgot-password-modal .login span:hover{text-decoration:underline}.forgot-password-modal button[disabled]{cursor:unset;opacity:.7}.modal-title{align-items:center;background-color:#fff;display:flex;font-family:Inter;font-size:18px;font-weight:700;height:49px;line-height:22px;padding-left:25px;position:relative}.login-modal-body{padding:15px 25px}.login-modal-body input{background:#fff!important}.login-modal-body__email,.login-modal-body__password{margin-bottom:20px}.login-action-button button{background-color:#212529;border:none;border-radius:0;color:#fff;cursor:pointer;font-size:26px;font-weight:600;height:45px;line-height:18px;margin:10px 0;outline:none;padding:10px;width:100%}.login-action-button button:hover{background-color:#505050;border-color:#505050}.server_auth__error{color:red;font-family:Inter;font-size:12px;font-style:normal;padding-left:25px;padding-top:15px}.info-text-for-login{font-size:14px;margin-bottom:4px;padding-left:10px}.forgot-password{text-align:center}.forgot-password span{cursor:pointer}.forgot-password span:hover{text-decoration:underline}.signup-modal .signup-container{margin:0 auto;max-width:800px}.signup-modal .title{background-color:#fff;font-family:Inter;font-size:18px;font-weight:700}.signup-modal .signup-container .is-half{width:49%}.signup-modal .signup-container__twoFields{display:flex;justify-content:space-between;margin-top:15px}.signup-modal .signup-container__singleField{margin-top:15px}.signup-modal button{margin-top:10px}.signup-modal .signup-action-button button{background-color:#212529;border:none;border-radius:0;color:#fff;cursor:pointer;font-size:26px;font-weight:600;height:45px;line-height:18px;margin-top:10px;outline:none;padding:10px;text-transform:uppercase;width:100%}.signup-modal .signup-action-button button:hover:enabled{background-color:#505050;border-color:#505050}.signup-modal .login{margin-top:10px;text-align:center}.signup-modal .login span{cursor:pointer}.signup-modal .login span:hover{text-decoration:underline}.signup-modal button[disabled]{cursor:unset;opacity:.7}.payment_page{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,Icons16,sans-serif}.payment_page .order_info_section{padding:15px 0}.payment_page .order_info_section .order_info_block{padding-bottom:15px;padding-top:15px}.payment_page .order_info_section .order_info_block .field-underline{border-bottom:1px solid #000;padding-bottom:15px}.payment_page .order_info_section .order_info_block .order_info_title{font-size:14px;font-weight:700;padding-bottom:3px}.payment_page .order_info_section .order_info_block .order_info_text{font-size:16px;line-height:1.15;outline:none}.payment_page .MuiBox-root{margin-left:auto;margin-right:auto;padding:20px;text-align:center}.payment_page .payment_info_label{padding:20px 0;text-align:center}.payment_page .payment_form{color:#fff;padding:20px}.payment_page .payment_form input,.payment_page .payment_form label{color:#fff}.payment_page .payment_button{padding-top:20px;text-align:center}.payment_page .payment_plan .payment_plan_block .payment_plan_text{padding-bottom:10px}.payment_page .payment_plan .payment_plan_highlight{font-weight:700}.card_form_inner{background:#232323;border-radius:8px;margin:0 auto 20px;min-width:325px;padding:15px;width:50%}.card_form_inner .card_label_text{color:#fff}.card_form_inner .StripeElement{margin:5px 0 10px}.card_label_text{color:#fff}.payment_button{padding-top:15px;text-align:center}.payment_button button{background-color:#212529;border-radius:8px;color:#fff;cursor:pointer;font-size:26px;padding:15px 30px;transition:opacity .5s;width:200px}.payment_button button:hover{opacity:.7}.disabled-payment-button button{opacity:.3;pointer-events:none;user-select:none}.checkout_error_block{color:#e53935;font-weight:600;padding:15px 0}.zip_element p{margin-bottom:0}.zip_element input{background-color:#000;border:none;color:#fff;font-size:18px;margin-top:5px;outline:none;width:100%}.confirmation-page{margin:0 auto;max-width:1024px}.confirmation-page button{margin-top:inherit}.confirmation-page .strong-text{font-weight:700}.confirmation-page .title{color:#333;font-size:24px;font-weight:600}.confirmation-page .share-message-section{background:#dff0d8;border:1px solid #d6e9c6;border-radius:5px;color:#2c7221;display:flex;flex-direction:column;margin:20px 0;padding:15px}.confirmation-page .main{font-size:15px;font-weight:700}.confirmation-page .helper,.confirmation-page .main{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,Icons16,sans-serif}.confirmation-page .helper{font-size:14px;margin-top:5px}.confirmation-page .referral_text_image_section{align-items:center;display:flex;flex-wrap:wrap;justify-content:space-between;margin:20px 0}.confirmation-page .referral_text_section{margin:10px}.confirmation-page .referral_title_text{color:#f08057;font-size:28px;padding-bottom:10px}.confirmation-page .referral_text{font-size:18px}.confirmation-page .referral_text_image_section img{margin:10px;max-width:200px}.confirmation-page .share_wrapper{column-gap:5rem;display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));margin:10px}.confirmation-page .invitation_title{font-size:22px;padding-bottom:12px;padding-top:12px}.confirmation-page .share_section{display:flex;flex-wrap:wrap;justify-content:space-between;margin:0 -10px}.confirmation-page .invitation_section{flex:1 1;padding:0 5px}.confirmation-page .share_buttons{display:grid;flex-wrap:wrap;margin:0 -7px}.confirmation-page .convenient_buttons{margin-top:10px}.confirmation-page .social-media-btns{grid-gap:5px;display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr))}.confirmation-page .sharing-btn{background-color:#000;flex:1 1;min-width:130px}.confirmation-page .sharing-btn a{text-decoration:none}.confirmation-page .share-by-link{background:#000;color:#fff;padding:10px}.confirmation-page .share-by-link.label{margin:0;padding:0;text-align:left}.confirmation-page .share-btn-inner{align-items:center;background-color:#000;box-sizing:border-box;color:#fff;cursor:pointer;display:inline-flex;padding:0;text-align:left;width:100%}.confirmation-page .share-input{background-color:#fff;border:none;outline:none;padding:5px;text-align:left;width:300px}.confirmation-page .share-text{display:block;font-size:13px;font-weight:600;padding-top:8px;width:100%}.confirmation-page .pricing-section_wrapper{background:#e3e3e3;border:1px solid #dcdcdc;display:grid;grid-template-columns:1fr 1fr;margin:10px 0;padding:15px}.confirmation-page .pricing-section_label{font-weight:600}.confirmation-page .pricing-section_sublabel{font-size:14px;font-weight:100}.confirmation-page .pricing-section_price{font-weight:600;text-align:right}.confirmation-page .share-by-link-copy-icon{align-items:center;background-color:#32325d;border-radius:4px;color:#fff;cursor:pointer;display:flex;justify-content:center;margin-left:8px;padding:10px;transition:all .15s ease}.confirmation-page .share-by-link-copy-icon:hover{background-color:#505050}.confirmation-page .share-by-link-copy-icon img{width:14px}.confirmation-page .social-media-sharing{background-color:#000;color:#fff;cursor:pointer;padding:10px;text-align:center}.confirmation-page .share-icon{border-radius:4px;display:inline-flex}@media only screen and (max-width:1050px){.confirmation-page .share_wrapper{column-gap:0;display:grid;grid-template-columns:unset;margin:15px}}@media only screen and (max-width:480px){.confirmation-page .social-media-btns{grid-template-columns:unset}.confirmation-page .share-input{width:250px}}body{margin:0;padding:0}.event-detail__tier{background-color:#fff;padding:17px 35px 20px}.event-detail__tier-name{color:#000;font-family:Inter-Bold;font-family:Bebas Neue;font-size:.85rem;font-weight:700;letter-spacing:.2em;line-height:1.3;margin-bottom:8px;margin-top:16px;padding-right:20%;text-transform:uppercase}.event-detail__tier-status{align-items:center;display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;margin-top:8px;width:100%}.event-detail__tier-status.ticket-button{background-color:#212529;border:3px solid #000;border-radius:0;color:#fff;cursor:pointer;font-weight:700;letter-spacing:.2em;line-height:1.5;margin-bottom:10px;width:200px}.event-tickets-container{align-items:center;display:flex;justify-content:space-between}.event-detail__tier-status.ticket-button.true{background-color:#c1c3c6;border-color:#afb0b1}.event-detail__tier-price{color:#000;font-family:Inter-Bold;font-size:1.5rem;line-height:1;text-align:center}.event-detail__tier-price p{margin:0}.event-detail__tier-price .fees{font-size:14px;margin-top:4px;text-align:left}.event-detail__tier-price .old-price{color:red;font-size:1.3rem;margin-bottom:5px;text-decoration:line-through}.alert-info{align-items:center;background-color:#d9edf7;border:1px solid #bce8f1;border-radius:4px;color:#3a87ad;display:flex;font-size:1em;justify-content:center;margin:0 35px;padding:8px 15px;text-shadow:0 1px 0 hsla(0,0%,100%,.5)}.alert-info svg{margin-right:4px}.event-detail__tier-state{color:#30bc9d;font-family:Inter-Bold;font-size:.75rem;font-weight:300;line-height:1;text-align:right;text-transform:uppercase}.event-detail__tier-state .ticket-not-started-message{color:#000;text-align:left;text-transform:none;width:50px}.promo-code-block input{font-size:14px;padding:1px 8px}.book-button{background-color:#212529;border:3px solid #000;border-radius:0;color:#fff;cursor:pointer;display:block;font-size:26px;font-weight:700;height:50px;letter-spacing:.2em;line-height:1.5;margin:25px auto 10px;text-align:center;width:100%}.book-button:hover{background-color:#505050;border-color:#505050}.loader-container{align-items:center;display:flex;height:100%;justify-content:center;width:100%}.get-tickets-paper::-webkit-scrollbar{width:5px}.get-tickets-paper::-webkit-scrollbar-track{background:#f1f1f1}.get-tickets-paper::-webkit-scrollbar-thumb{background:#888}.get-tickets-paper::-webkit-scrollbar-thumb:hover{background:#555}.get-tickets .get-tickets__selectbox{width:100%}.disabled{pointer-events:none;user-select:none}.hidden{display:none}.event-closed-message{font-family:Bebas Neue;letter-spacing:.5px}.countdown p{margin:0}.countdown .title{font-weight:700}.countdown .message{font-weight:700;margin-top:20px}.waiting-list{padding:17px 35px 20px}.waiting-list .field-item{margin-bottom:30px}.waiting-list .waiting-list-button{width:100%!important}.waiting-list .waiting-list-button:hover{background-color:#505050}.waiting-list .success-message{margin-bottom:15px;text-align:center}.waiting-list .success-message p{margin:0}.waiting-list .no-tickets-text{font-weight:700;text-align:center}.waiting-list .added-success-message{font-size:22px;margin-bottom:10px}.my-ticket{padding:30px}.my-ticket-table{margin-top:30px}.my-ticket .loading{background-color:rgba(0,0,0,.4);height:100vh;justify-content:center;left:0;position:fixed;top:0;width:100%}.my-ticket .event-info,.my-ticket .loading{align-items:center;display:flex}.my-ticket thead th{font-weight:700}.my-ticket .event-info img{margin-right:10px;width:50px}.my-ticket .order-details-button{background-color:#32325d;border:none;border-radius:4px;color:#fff;cursor:pointer;padding:10px 14px;transition:all .15s ease}.my-ticket .order-details-button:hover{background-color:#505050}.order-details{margin:0 auto;max-width:940px}.order-details .loading{align-items:center;background-color:rgba(0,0,0,.4);display:flex;height:100vh;justify-content:center;left:0;position:fixed;top:0;width:100%;z-index:1400}.order-details .layout-title{font-size:24px;font-weight:400}.order-details .sub-title{font-size:18px;font-weight:400;margin:10px 0}.order-details .order-summary-box{margin-top:30px}.order-details .total-row td,.order-details th{color:#fff;font-weight:700}.order-details .tickets-box{margin-top:30px}.order-details .ticket-add-on-table{background-color:#fcf8e3}.order-details .action-button{background-color:#212529;border:1px solid #fff;border-radius:0;color:#fff;cursor:pointer;display:block;font-family:Bebas Neue;font-size:14px;font-weight:400;line-height:normal;margin-bottom:20px;margin-top:20px;min-height:auto;outline:none;overflow:hidden;padding:12px;position:relative;text-align:center;text-decoration:none;text-overflow:ellipsis;text-transform:uppercase;width:max-content}.order-details .download-button:hover{background-color:#505050}.order-details .personal-link{padding:20px 0}.order-details .total-referrer{padding:0 0 20px}.resale-modal .field-box{display:flex;margin-bottom:10px}.resale-modal .field-box .icon{align-items:center;display:flex;height:56px;justify-content:center;min-width:44px}.resale-modal .field-box .empty-box{min-width:44px}.resale-modal .resale-action-button button{background-color:#212529;color:#fff;cursor:pointer;width:100%}.resale-modal .resale-action-button button[disabled]{opacity:.7}.resale-modal .resale-action-button button:hover{background-color:#505050;border-color:#505050;width:100%}.reset-password{margin:0 auto;max-width:300px;padding:14px}.reset-password .title{font-size:20px;font-weight:700}.reset-password .field-item{margin-top:14px}.reset-password .action-button button{background-color:#212529;border:none;border-radius:0;color:#fff;cursor:pointer;font-size:26px;font-weight:600;height:45px;line-height:18px;margin-top:14px;outline:none;padding:10px;text-transform:uppercase;width:100%}.reset-password .action-button button:hover:enabled{background-color:#505050;border-color:#505050}.reset-password .action-button button[disabled]{cursor:unset;opacity:.7}
1
+ .button-container{display:flex;justify-content:center;padding:20px}.billing-info-container{margin:0 auto;max-width:800px}.billing-info-container .is-half{width:49%}.billing-info-container p{color:#000}.billing-info-container .main-header{font-size:2rem;font-weight:600}.billing-info-container__twoFields{display:flex;justify-content:space-between;margin-top:15px}.billing-info-container__singleField{margin-top:15px}button{margin-top:10px}.account-actions-block{color:#182026;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,Icons16,sans-serif;margin-top:10px}.MuiButtonBase-root.MuiButton-root,.MuiButtonBase-root.MuiButton-root:hover,.login-register-button{background-color:#212529;border:#f28051;border-radius:5px;color:#fff;cursor:pointer;display:block;font-family:Inter-Bold;font-size:26px;font-weight:700;line-height:1.15;margin-top:10px;min-height:46px;outline:none;overflow:hidden;padding:14px 12px 12px;position:relative;text-align:center;text-overflow:ellipsis;text-transform:uppercase;width:49%}.logo-image-container{margin-top:5px;text-align:center;width:49%}.logo-image-container img{height:30px}.login-block{align-items:center;display:flex;flex-direction:column}.login-register-button:hover{background-color:#505050!important;border-color:#505050!important}.login-register-block{display:flex;justify-content:space-between}@media only screen and (max-width:820px){.billing-info-container{width:90%}.billing-info-container .main-header{font-size:1.5rem}}.email-checking{margin-bottom:15px}.timer{background-color:#000;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=);background-position:15px;background-repeat:no-repeat;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 12px #999;-webkit-box-shadow:0 0 12px #999;box-shadow:0 0 12px #999;color:#fff;margin:0 0 6px;max-width:300px;overflow:hidden;padding:15px 15px 15px 50px;pointer-events:auto;position:absolute;right:15px;width:300px}.timer .close-icon{cursor:pointer;display:flex;position:absolute;right:10px;top:10px}.timer .countdown{font-weight:700;margin-top:10px}.forgot-password-modal .forgot-password-container{margin:0 auto;max-width:800px}.forgot-password-modal .title{background-color:#fff;font-family:Inter;font-size:18px;font-weight:700}.forgot-password-modal .forgot-password-container__singleField{margin-top:15px}.forgot-password-modal .forgot-password-action-button button{background-color:#212529;border:none;border-radius:0;color:#fff;cursor:pointer;font-size:26px;font-weight:600;height:45px;line-height:18px;margin-top:10px;outline:none;padding:10px;text-transform:uppercase;width:100%}.forgot-password-modal .forgot-password-action-button button:hover:enabled{background-color:#505050;border-color:#505050}.forgot-password-modal .login{margin-top:10px;text-align:center}.forgot-password-modal .login span{cursor:pointer}.forgot-password-modal .login span:hover{text-decoration:underline}.forgot-password-modal button[disabled]{cursor:unset;opacity:.7}.modal-title{align-items:center;background-color:#fff;display:flex;font-family:Inter;font-size:18px;font-weight:700;height:49px;line-height:22px;padding-left:25px;position:relative}.login-modal-body{padding:15px 25px}.login-modal-body input{background:#fff!important}.login-modal-body__email,.login-modal-body__password{margin-bottom:20px}.login-action-button button{background-color:#212529;border:none;border-radius:0;color:#fff;cursor:pointer;font-size:26px;font-weight:600;height:45px;line-height:18px;margin:10px 0;outline:none;padding:10px;width:100%}.login-action-button button:hover{background-color:#505050;border-color:#505050}.server_auth__error{color:red;font-family:Inter;font-size:12px;font-style:normal;padding-left:25px;padding-top:15px}.info-text-for-login{font-size:14px;margin-bottom:4px;padding-left:10px}.forgot-password{text-align:center}.forgot-password span{cursor:pointer}.forgot-password span:hover{text-decoration:underline}.payment_page{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,Icons16,sans-serif}.payment_page .order_info_section{padding:15px 0}.payment_page .order_info_section .order_info_block{padding-bottom:15px;padding-top:15px}.payment_page .order_info_section .order_info_block .field-underline{border-bottom:1px solid #000;padding-bottom:15px}.payment_page .order_info_section .order_info_block .order_info_title{font-size:14px;font-weight:700;padding-bottom:3px}.payment_page .order_info_section .order_info_block .order_info_text{font-size:16px;line-height:1.15;outline:none}.payment_page .MuiBox-root{margin-left:auto;margin-right:auto;padding:20px;text-align:center}.payment_page .payment_info_label{padding:20px 0;text-align:center}.payment_page .payment_form{color:#fff;padding:20px}.payment_page .payment_form input,.payment_page .payment_form label{color:#fff}.payment_page .payment_button{padding-top:20px;text-align:center}.payment_page .payment_plan .payment_plan_block .payment_plan_text{padding-bottom:10px}.payment_page .payment_plan .payment_plan_highlight{font-weight:700}.card_form_inner{background:#232323;border-radius:8px;margin:0 auto 20px;min-width:325px;padding:15px;width:50%}.card_form_inner .card_label_text{color:#fff}.card_form_inner .StripeElement{margin:5px 0 10px}.card_label_text{color:#fff}.payment_button{padding-top:15px;text-align:center}.payment_button button{background-color:#212529;border-radius:8px;color:#fff;cursor:pointer;font-size:26px;padding:15px 30px;transition:opacity .5s;width:200px}.payment_button button:hover{opacity:.7}.disabled-payment-button button{opacity:.3;pointer-events:none;user-select:none}.checkout_error_block{color:#e53935;font-weight:600;padding:15px 0}.zip_element p{margin-bottom:0}.zip_element input{background-color:#000;border:none;color:#fff;font-size:18px;margin-top:5px;outline:none;width:100%}.signup-modal .signup-container{margin:0 auto;max-width:800px}.signup-modal .title{background-color:#fff;font-family:Inter;font-size:18px;font-weight:700}.signup-modal .signup-container .is-half{width:49%}.signup-modal .signup-container__twoFields{display:flex;justify-content:space-between;margin-top:15px}.signup-modal .signup-container__singleField{margin-top:15px}.signup-modal button{margin-top:10px}.signup-modal .signup-action-button button{background-color:#212529;border:none;border-radius:0;color:#fff;cursor:pointer;font-size:26px;font-weight:600;height:45px;line-height:18px;margin-top:10px;outline:none;padding:10px;text-transform:uppercase;width:100%}.signup-modal .signup-action-button button:hover:enabled{background-color:#505050;border-color:#505050}.signup-modal .login{margin-top:10px;text-align:center}.signup-modal .login span{cursor:pointer}.signup-modal .login span:hover{text-decoration:underline}.signup-modal button[disabled]{cursor:unset;opacity:.7}.confirmation-page{margin:0 auto;max-width:1024px}.confirmation-page button{margin-top:inherit}.confirmation-page .strong-text{font-weight:700}.confirmation-page .title{color:#333;font-size:24px;font-weight:600}.confirmation-page .share-message-section{background:#dff0d8;border:1px solid #d6e9c6;border-radius:5px;color:#2c7221;display:flex;flex-direction:column;margin:20px 0;padding:15px}.confirmation-page .main{font-size:15px;font-weight:700}.confirmation-page .helper,.confirmation-page .main{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,Icons16,sans-serif}.confirmation-page .helper{font-size:14px;margin-top:5px}.confirmation-page .referral_text_image_section{align-items:center;display:flex;flex-wrap:wrap;justify-content:space-between;margin:20px 0}.confirmation-page .referral_text_section{margin:10px}.confirmation-page .referral_title_text{color:#f08057;font-size:28px;padding-bottom:10px}.confirmation-page .referral_text{font-size:18px}.confirmation-page .referral_text_image_section img{margin:10px;max-width:200px}.confirmation-page .share_wrapper{column-gap:5rem;display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));margin:10px}.confirmation-page .invitation_title{font-size:22px;padding-bottom:12px;padding-top:12px}.confirmation-page .share_section{display:flex;flex-wrap:wrap;justify-content:space-between;margin:0 -10px}.confirmation-page .invitation_section{flex:1 1;padding:0 5px}.confirmation-page .share_buttons{display:grid;flex-wrap:wrap;margin:0 -7px}.confirmation-page .convenient_buttons{margin-top:10px}.confirmation-page .social-media-btns{grid-gap:5px;display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr))}.confirmation-page .sharing-btn{background-color:#000;flex:1 1;min-width:130px}.confirmation-page .sharing-btn a{text-decoration:none}.confirmation-page .share-by-link{background:#000;color:#fff;padding:10px}.confirmation-page .share-by-link.label{margin:0;padding:0;text-align:left}.confirmation-page .share-btn-inner{align-items:center;background-color:#000;box-sizing:border-box;color:#fff;cursor:pointer;display:inline-flex;padding:0;text-align:left;width:100%}.confirmation-page .share-input{background-color:#fff;border:none;outline:none;padding:5px;text-align:left;width:300px}.confirmation-page .share-text{display:block;font-size:13px;font-weight:600;padding-top:8px;width:100%}.confirmation-page .pricing-section_wrapper{background:#e3e3e3;border:1px solid #dcdcdc;display:grid;grid-template-columns:1fr 1fr;margin:10px 0;padding:15px}.confirmation-page .pricing-section_label{font-weight:600}.confirmation-page .pricing-section_sublabel{font-size:14px;font-weight:100}.confirmation-page .pricing-section_price{font-weight:600;text-align:right}.confirmation-page .share-by-link-copy-icon{align-items:center;background-color:#32325d;border-radius:4px;color:#fff;cursor:pointer;display:flex;justify-content:center;margin-left:8px;padding:10px;transition:all .15s ease}.confirmation-page .share-by-link-copy-icon:hover{background-color:#505050}.confirmation-page .share-by-link-copy-icon img{width:14px}.confirmation-page .social-media-sharing{background-color:#000;color:#fff;cursor:pointer;padding:10px;text-align:center}.confirmation-page .share-icon{border-radius:4px;display:inline-flex}@media only screen and (max-width:1050px){.confirmation-page .share_wrapper{column-gap:0;display:grid;grid-template-columns:unset;margin:15px}}@media only screen and (max-width:480px){.confirmation-page .social-media-btns{grid-template-columns:unset}.confirmation-page .share-input{width:250px}}body{margin:0;padding:0}.event-detail__tier{background-color:#fff;padding:17px 35px 20px}.event-detail__tier-name{color:#000;font-family:Inter-Bold;font-family:Bebas Neue;font-size:.85rem;font-weight:700;letter-spacing:.2em;line-height:1.3;margin-bottom:8px;margin-top:16px;padding-right:20%;text-transform:uppercase}.event-detail__tier-status{align-items:center;display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;margin-top:8px;width:100%}.event-detail__tier-status.ticket-button{background-color:#212529;border:3px solid #000;border-radius:0;color:#fff;cursor:pointer;font-weight:700;letter-spacing:.2em;line-height:1.5;margin-bottom:10px;width:200px}.event-tickets-container{align-items:center;display:flex;justify-content:space-between}.event-detail__tier-status.ticket-button.true{background-color:#c1c3c6;border-color:#afb0b1}.event-detail__tier-price{color:#000;font-family:Inter-Bold;font-size:1.5rem;line-height:1;text-align:center}.event-detail__tier-price p{margin:0}.event-detail__tier-price .fees{font-size:14px;margin-top:4px;text-align:left}.event-detail__tier-price .old-price{color:red;font-size:1.3rem;margin-bottom:5px;text-decoration:line-through}.alert-info{align-items:center;background-color:#d9edf7;border:1px solid #bce8f1;border-radius:4px;color:#3a87ad;display:flex;font-size:1em;justify-content:center;margin:0 35px;padding:8px 15px;text-shadow:0 1px 0 hsla(0,0%,100%,.5)}.alert-info svg{margin-right:4px}.event-detail__tier-state{color:#30bc9d;font-family:Inter-Bold;font-size:.75rem;font-weight:300;line-height:1;text-align:right;text-transform:uppercase}.event-detail__tier-state .ticket-not-started-message{color:#000;text-align:left;text-transform:none;width:50px}.promo-code-block input{font-size:14px;padding:1px 8px}.book-button{background-color:#212529;border:3px solid #000;border-radius:0;color:#fff;cursor:pointer;display:block;font-size:26px;font-weight:700;height:50px;letter-spacing:.2em;line-height:1.5;margin:25px auto 10px;text-align:center;width:100%}.book-button:hover{background-color:#505050;border-color:#505050}.loader-container{align-items:center;display:flex;height:100%;justify-content:center;width:100%}.get-tickets-paper::-webkit-scrollbar{width:5px}.get-tickets-paper::-webkit-scrollbar-track{background:#f1f1f1}.get-tickets-paper::-webkit-scrollbar-thumb{background:#888}.get-tickets-paper::-webkit-scrollbar-thumb:hover{background:#555}.get-tickets .get-tickets__selectbox{width:100%}.disabled{pointer-events:none;user-select:none}.hidden{display:none}.event-closed-message{font-family:Bebas Neue;letter-spacing:.5px}.countdown p{margin:0}.countdown .title{font-weight:700}.countdown .message{font-weight:700;margin-top:20px}.waiting-list{padding:17px 35px 20px}.waiting-list .field-item{margin-bottom:30px}.waiting-list .waiting-list-button{width:100%!important}.waiting-list .waiting-list-button:hover{background-color:#505050}.waiting-list .success-message{margin-bottom:15px;text-align:center}.waiting-list .success-message p{margin:0}.waiting-list .no-tickets-text{font-weight:700;text-align:center}.waiting-list .added-success-message{font-size:22px;margin-bottom:10px}.my-ticket{padding:30px}.my-ticket-table{margin-top:30px}.my-ticket .loading{background-color:rgba(0,0,0,.4);height:100vh;justify-content:center;left:0;position:fixed;top:0;width:100%}.my-ticket .event-info,.my-ticket .loading{align-items:center;display:flex}.my-ticket thead th{font-weight:700}.my-ticket .event-info img{margin-right:10px;width:50px}.my-ticket .order-details-button{background-color:#32325d;border:none;border-radius:4px;color:#fff;cursor:pointer;padding:10px 14px;transition:all .15s ease}.my-ticket .order-details-button:hover{background-color:#505050}.order-details{margin:0 auto;max-width:940px}.order-details .loading{align-items:center;background-color:rgba(0,0,0,.4);display:flex;height:100vh;justify-content:center;left:0;position:fixed;top:0;width:100%;z-index:1400}.order-details .layout-title{font-size:24px;font-weight:400}.order-details .sub-title{font-size:18px;font-weight:400;margin:10px 0}.order-details .order-summary-box{margin-top:30px}.order-details .total-row td,.order-details th{color:#fff;font-weight:700}.order-details .tickets-box{margin-top:30px}.order-details .ticket-add-on-table{background-color:#fcf8e3}.order-details .action-button{background-color:#212529;border:1px solid #fff;border-radius:0;color:#fff;cursor:pointer;display:block;font-family:Bebas Neue;font-size:14px;font-weight:400;line-height:normal;margin-bottom:20px;margin-top:20px;min-height:auto;outline:none;overflow:hidden;padding:12px;position:relative;text-align:center;text-decoration:none;text-overflow:ellipsis;text-transform:uppercase;width:max-content}.order-details .download-button:hover{background-color:#505050}.order-details .personal-link{padding:20px 0}.order-details .total-referrer{padding:0 0 20px}.resale-modal .field-box{display:flex;margin-bottom:10px}.resale-modal .field-box .icon{align-items:center;display:flex;height:56px;justify-content:center;min-width:44px}.resale-modal .field-box .empty-box{min-width:44px}.resale-modal .resale-action-button button{background-color:#212529;color:#fff;cursor:pointer;width:100%}.resale-modal .resale-action-button button[disabled]{opacity:.7}.resale-modal .resale-action-button button:hover{background-color:#505050;border-color:#505050;width:100%}.reset-password{margin:0 auto;max-width:300px;padding:14px}.reset-password .title{font-size:20px;font-weight:700}.reset-password .field-item{margin-top:14px}.reset-password .action-button button{background-color:#212529;border:none;border-radius:0;color:#fff;cursor:pointer;font-size:26px;font-weight:600;height:45px;line-height:18px;margin-top:14px;outline:none;padding:10px;text-transform:uppercase;width:100%}.reset-password .action-button button:hover:enabled{background-color:#505050;border-color:#505050}.reset-password .action-button button[disabled]{cursor:unset;opacity:.7}
@@ -2,7 +2,7 @@ import { IAddOn } from './add_on';
2
2
  export interface IOrderData {
3
3
  id: string;
4
4
  product_name: string;
5
- ticketType: string;
5
+ ticketType: string | Array<any>;
6
6
  quantity: string | number;
7
7
  price: string | number;
8
8
  total: string | number;
@@ -1,3 +1,4 @@
1
+ import { AxiosError } from 'axios';
1
2
  export declare const setLoggedUserData: (data: IProfileData) => {
2
3
  id: string | number;
3
4
  first_name: string;
@@ -11,3 +12,10 @@ export declare const setLoggedUserData: (data: IProfileData) => {
11
12
  state: string | number;
12
13
  zip: string | number;
13
14
  };
15
+ interface LogoutUserParams {
16
+ onLogoutSuccess?: () => void;
17
+ onLogoutError?: (error: AxiosError) => void;
18
+ setIsLogged?: (isLogged: boolean) => void;
19
+ }
20
+ export declare const logoutUser: ({ onLogoutSuccess, onLogoutError, setIsLogged, }: LogoutUserParams) => Promise<void>;
21
+ export {};
@@ -9,7 +9,7 @@ export { createMarkup } from './createMarkup';
9
9
  export { replaceVarInString } from './replaceVarInString';
10
10
  export { isBrowser } from './isBrowser';
11
11
  export { getFormInitialValues } from './form';
12
- export { setLoggedUserData } from './auth';
12
+ export { setLoggedUserData, logoutUser } from './auth';
13
13
  export { getDataWithCustomFields, getFieldsKeys } from './customFields';
14
14
  export { createElementFromHTML } from './htmlNodeFromString';
15
15
  export { isJson } from './jsonUtils';
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.6.6-beta.25",
2
+ "version": "1.6.6-beta.27",
3
3
  "license": "MIT",
4
4
  "main": "dist/index.js",
5
5
  "typings": "dist/index.d.ts",
@@ -90,7 +90,7 @@
90
90
  "@mui/x-date-pickers": "^5.0.1",
91
91
  "@stripe/react-stripe-js": "^1.6.0",
92
92
  "@stripe/stripe-js": "^1.21.1",
93
- "axios": "^0.24.0",
93
+ "axios": "^1.9.0",
94
94
  "clsx": "^1.1.1",
95
95
  "formik": "^2.2.9",
96
96
  "jwt-decode": "^3.1.2",
@@ -111,4 +111,4 @@
111
111
  "tf-seat-map-view": "9.4.7-beta.33",
112
112
  "yup": "^0.32.11"
113
113
  }
114
- }
114
+ }
package/src/api/auth.ts CHANGED
@@ -27,7 +27,8 @@ export const register = async (data: FormData): Promise<IProfileResponse> => {
27
27
  }
28
28
 
29
29
  export const getProfileData = async (): Promise<IProfileResponse> => {
30
- const response: AxiosResponse<IProfileResponse, AxiosRequestConfig> = await publicRequest.get('/customer/profile/')
30
+ const response: AxiosResponse<IProfileResponse, AxiosRequestConfig> =
31
+ await publicRequest.get('/customer/profile/')
31
32
  return response.data
32
33
  }
33
34
 
@@ -14,10 +14,14 @@ export const postOnCheckout = async (
14
14
  }
15
15
 
16
16
  const response: AxiosResponse<ICheckoutResponse, AxiosRequestConfig> =
17
- await publicRequest.post(
18
- `v1/on-checkout`,
19
- { data }
20
- )
17
+ await publicRequest.post(`v1/on-checkout`, { data })
18
+
19
+ return response.data
20
+ }
21
+
22
+ export const updateCheckout = async (data: any): Promise<ICheckoutResponse> => {
23
+ const response: AxiosResponse<ICheckoutResponse, AxiosRequestConfig> =
24
+ await publicRequest.post(`v1/checkout`, { data })
21
25
 
22
26
  return response.data
23
27
  }
@@ -1,44 +1,28 @@
1
- import { AxiosError, AxiosRequestConfig, AxiosResponse } from 'axios'
1
+ import { AxiosError, AxiosResponse, InternalAxiosRequestConfig } from 'axios'
2
2
  import _get from 'lodash/get'
3
3
 
4
4
  import { CONFIGS, isBrowser } from '../utils'
5
5
  import { getCookieByName, setCustomCookie } from '../utils/cookies'
6
6
  import { publicRequest } from './publicRequest'
7
7
 
8
- publicRequest.interceptors.request.use((config: AxiosRequestConfig) => {
8
+ publicRequest.interceptors.request.use((config: InternalAxiosRequestConfig) => {
9
9
  const guestToken = isBrowser ? window.localStorage.getItem('auth_guest_token') : null
10
10
  if (guestToken) {
11
- const updatedHeaders = {
12
- ...config.headers,
13
- 'Authorization-Guest': guestToken,
14
- }
15
- config.headers = updatedHeaders
11
+ config.headers['Authorization-Guest'] = guestToken
16
12
  }
17
13
 
18
14
  const xtfCookie = getCookieByName('X-TF-ECOMMERCE')
19
15
  if (xtfCookie) {
20
- const updatedHeaders = {
21
- ...config.headers,
22
- 'X-TF-ECOMMERCE': xtfCookie,
23
- }
24
- config.headers = updatedHeaders
16
+ config.headers['X-TF-ECOMMERCE'] = xtfCookie
25
17
  }
26
18
 
27
19
  const additionalCookiesHeaderValue = isBrowser ? document.cookie ?? '' : ''
28
20
  if (additionalCookiesHeaderValue !== '') {
29
- const updatedHeaders = {
30
- ...config.headers,
31
- 'Additional-Cookies': additionalCookiesHeaderValue,
32
- }
33
- config.headers = updatedHeaders
21
+ config.headers['Additional-Cookies'] = additionalCookiesHeaderValue
34
22
  }
35
23
 
36
24
  if (CONFIGS.X_SOURCE_ORIGIN) {
37
- const updatedHeaders = {
38
- ...config.headers,
39
- 'X-Source-Origin': CONFIGS.X_SOURCE_ORIGIN,
40
- }
41
- config.headers = updatedHeaders
25
+ config.headers['X-Source-Origin'] = CONFIGS.X_SOURCE_ORIGIN
42
26
  }
43
27
 
44
28
  if (CONFIGS.BASE_URL) {
@@ -1,5 +1,7 @@
1
1
  import axios, { AxiosInstance } from 'axios'
2
2
 
3
+ import { getCookieByName } from '../utils'
4
+
3
5
  const headers: { [key: string]: string } = {
4
6
  Accept: 'application/vnd.api+json',
5
7
  'Content-Type': 'application/vnd.api+json',
@@ -25,6 +27,14 @@ export const publicRequest: IPublicRequest = axios.create({
25
27
  headers,
26
28
  }) as IPublicRequest
27
29
 
30
+ publicRequest.interceptors.request.use(config => {
31
+ if (getCookieByName('X-TF-ECOMMERCE')) {
32
+ config.headers['X-TF-ECOMMERCE'] = getCookieByName('X-TF-ECOMMERCE')
33
+ }
34
+
35
+ return config
36
+ })
37
+
28
38
  publicRequest.setBaseUrl = (baseUrl: string) =>
29
39
  (publicRequest.defaults.baseURL = baseUrl + '/api')
30
40
 
@@ -61,7 +61,7 @@ const AddonComponent = ({
61
61
  />
62
62
  </div>
63
63
  {!_isEmpty(addOnDataWithCustomFields?.fields) && (
64
- <div className="ticket-holders-fields">
64
+ <div className="add-on-fields">
65
65
  <h2>{addOnDataWithCustomFields.label}</h2>
66
66
  {_map(addOnDataWithCustomFields.fields, group => {
67
67
  const { id, groupClassname, groupItems } = group
@@ -0,0 +1,384 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+
3
+ import { CircularProgress } from '@mui/material'
4
+ import { Form, Formik } from 'formik'
5
+ import _identity from 'lodash/identity'
6
+ import _map from 'lodash/map'
7
+ import React, { useEffect, useMemo, useState } from 'react'
8
+ import { Tooltip } from 'react-tooltip'
9
+
10
+ import { getAddons, getCart } from '../../api'
11
+ import { FEES_STYLES } from '../../constants'
12
+ import { currencyNormalizerCreator } from '../../normalizers'
13
+ import { CONFIGS, createMarkup } from '../../utils'
14
+ import InfoIcon from '../ticketsContainer/InfoIcon'
15
+ import { addonsWithGroupsAdapter, cartAdapter } from './adapters'
16
+ import AddonComponent from './AddonComponent'
17
+ import { getNormalizedPrice } from './normalizers'
18
+ import {
19
+ generateSelectOptions,
20
+ getAddonSelectOptions,
21
+ getSortedAddons,
22
+ getTicketRelatedAddons,
23
+ } from './utils'
24
+
25
+ export interface ISimpleAddonContainerProps {
26
+ classNamePrefix?: string;
27
+ onGetAddonsPageInfoSuccess?: (res: any) => void;
28
+ onGetAddonsPageInfoError?: (error: any) => void;
29
+ descriptionTrigger?: 'click' | 'hover' | 'always';
30
+ addOnDataWithCustomFields: any;
31
+ configs: any;
32
+ eventId: string;
33
+ onAddOnSelect?: (id: string, value: string, addon: any) => void;
34
+ handleConfirm?: (values: any) => void;
35
+ }
36
+
37
+ export interface ObjectLiteral {
38
+ [key: string]: any;
39
+ }
40
+
41
+ export const SimpleAddonsContainer = ({
42
+ classNamePrefix = 'add_on',
43
+ onGetAddonsPageInfoSuccess = _identity,
44
+ onGetAddonsPageInfoError = _identity,
45
+ descriptionTrigger = 'click',
46
+ addOnDataWithCustomFields,
47
+ configs,
48
+ eventId,
49
+ onAddOnSelect = _identity,
50
+ handleConfirm = _identity,
51
+ }: ISimpleAddonContainerProps) => {
52
+ const [addons, setAddons] = useState<any>([])
53
+ const [addonsOptions, setAddonsOptions] = useState<any>({})
54
+ const [groupsWithSelectedVariants, setGroupsWithSelectedVariants] = useState<any>({})
55
+ const [groupsWithInitialVariantsValues, setGroupsWithInitialVariantsValues] =
56
+ useState<any>({})
57
+ const [loading, setLoading] = useState(true)
58
+
59
+ const [visibleDescription, setVisibleDescription] = useState<string | null>(null)
60
+
61
+ const handleDescriptionToggle = (ticketId: string) => {
62
+ setVisibleDescription(current => (current === ticketId ? null : ticketId))
63
+ }
64
+
65
+ useEffect(() => {
66
+ const getAddonsPageInfo = async () => {
67
+ try {
68
+ if (eventId) {
69
+ setLoading(true)
70
+
71
+ // Get choosed ticket info (id, count) from Cart request for addons options calculations
72
+ const cart = await getCart()
73
+ const { id: choosedTicketID, quantity } = cartAdapter(cart)
74
+ const choosedTicketCount = Number(quantity)
75
+
76
+ // Get and collect addons data
77
+ const addonsData = await getAddons(eventId)
78
+ const adaptedAddons = addonsWithGroupsAdapter(addonsData)
79
+ const ticketRelatedAddons = getTicketRelatedAddons(
80
+ adaptedAddons,
81
+ choosedTicketID
82
+ )
83
+ const sortedTicketAddons = getSortedAddons(ticketRelatedAddons)
84
+
85
+ setAddons(sortedTicketAddons)
86
+
87
+ // Collect addons and addon group options
88
+ const {
89
+ addonsWithOptions,
90
+ groupsWithSelectedVariantsInfo,
91
+ groupsWithVariants,
92
+ } = getAddonSelectOptions(adaptedAddons, choosedTicketCount)
93
+
94
+ setAddonsOptions(addonsWithOptions)
95
+ setGroupsWithSelectedVariants(groupsWithSelectedVariantsInfo)
96
+ setGroupsWithInitialVariantsValues(groupsWithVariants)
97
+
98
+ // Success callback props
99
+ onGetAddonsPageInfoSuccess(addonsData)
100
+ }
101
+ } catch (e) {
102
+ // Callback error props
103
+ onGetAddonsPageInfoError(e)
104
+ } finally {
105
+ setLoading(false)
106
+ }
107
+ }
108
+
109
+ getAddonsPageInfo()
110
+ }, [eventId, onGetAddonsPageInfoError, onGetAddonsPageInfoSuccess])
111
+
112
+ const recreateGroupVariantsSelectOptions = (groupId: any, changedGroupd: any) => {
113
+ const { choosedVariants, limit, selectedCount } = changedGroupd
114
+ const remainingGroupStock = limit - selectedCount
115
+ const recreatedVariantsOptions: ObjectLiteral = {}
116
+
117
+ // Regenerate variants allowed stock counts
118
+ for (const variant in choosedVariants) {
119
+ const variantId = variant
120
+ const variantCurrSelectedValue = choosedVariants[variant]
121
+ let allowedOptionCount
122
+
123
+ // Formula for regenerating
124
+ if (
125
+ remainingGroupStock >=
126
+ groupsWithInitialVariantsValues[groupId][variantId] - variantCurrSelectedValue
127
+ ) {
128
+ allowedOptionCount = groupsWithInitialVariantsValues[groupId][variantId]
129
+ } else {
130
+ allowedOptionCount = remainingGroupStock + variantCurrSelectedValue
131
+ }
132
+
133
+ recreatedVariantsOptions[variantId] = generateSelectOptions(0, allowedOptionCount)
134
+ }
135
+
136
+ setAddonsOptions((prevState: any) =>
137
+ Object.assign({}, prevState, recreatedVariantsOptions)
138
+ )
139
+ }
140
+
141
+ const onFieldChange = (id: any, value: any, addon: any) => {
142
+ // If changeableGroup exsists it means that group with limitation variant was changed
143
+ const changeableGroup = groupsWithSelectedVariants[addon.id]
144
+
145
+ if (changeableGroup) {
146
+ const currGroupId = addon.id
147
+ const currSelectedVariantId = id
148
+ const currSelectedVariantCount = Number(value)
149
+ const currSelectedVariantPrevCount =
150
+ groupsWithSelectedVariants[currGroupId].choosedVariants[currSelectedVariantId]
151
+
152
+ const currSelectedGroupCount =
153
+ changeableGroup.selectedCount +
154
+ (currSelectedVariantCount - currSelectedVariantPrevCount)
155
+
156
+ // Update Group info
157
+ const updatedGroupsWithSelectedVariants = {
158
+ ...groupsWithSelectedVariants,
159
+ [currGroupId]: {
160
+ ...groupsWithSelectedVariants[currGroupId],
161
+ selectedCount: currSelectedGroupCount,
162
+ choosedVariants: {
163
+ ...groupsWithSelectedVariants[currGroupId].choosedVariants,
164
+ [currSelectedVariantId]: currSelectedVariantCount,
165
+ },
166
+ },
167
+ }
168
+ setGroupsWithSelectedVariants(updatedGroupsWithSelectedVariants)
169
+
170
+ // Recreate Select Options for Addon Group Variants
171
+ recreateGroupVariantsSelectOptions(
172
+ currGroupId,
173
+ updatedGroupsWithSelectedVariants[currGroupId]
174
+ )
175
+ }
176
+ }
177
+
178
+ const initialValues = useMemo(() => {
179
+ const addOnsData: any = {}
180
+ if (addons?.length > 0 && addOnDataWithCustomFields?.fields?.length > 0) {
181
+ _map(addons, addon => {
182
+ _map(addOnDataWithCustomFields.fields, field => {
183
+ const { id, groupItems } = field
184
+ _map(groupItems, item => {
185
+ addOnsData[`${addon.id}-${id}-${item.name}`] = item.value
186
+ })
187
+ })
188
+ })
189
+ }
190
+
191
+ return addOnsData
192
+ }, [addons, addOnDataWithCustomFields])
193
+
194
+ if (loading) {
195
+ return (
196
+ <div className={`${classNamePrefix}_loader`}>
197
+ <CircularProgress size={50} />
198
+ </div>
199
+ )
200
+ }
201
+
202
+ return (
203
+ <div className={`${classNamePrefix}_container`}>
204
+ <div className={`${classNamePrefix}_block`}>
205
+ <div className={`${classNamePrefix}_line_block`}>
206
+ {addons?.length > 0 && (
207
+ <div className={`${classNamePrefix}_title`}>UPGRADES & ADD-ONS</div>
208
+ )}
209
+ </div>
210
+ {addons?.length > 0 && (
211
+ <div className={`${classNamePrefix}_subtitle`}>
212
+ PLEASE SELECT FROM THE OPTIONAL ADD-ONS BELOW
213
+ </div>
214
+ )}
215
+ <Formik
216
+ initialValues={initialValues}
217
+ onSubmit={values => {
218
+ handleConfirm(values)
219
+ }}
220
+ validate={() => {
221
+ // Real-time validation can be handled here if needed
222
+ }}
223
+ >
224
+ {({ values, errors, setFieldTouched }) => (
225
+ <Form autoComplete="off" className="form_holder">
226
+ <>
227
+ {addons.map((addon: any) => {
228
+ const price = addon.feeIncluded ? addon.price : addon.cost
229
+ const isAddonFree = Number(addon?.price) === 0
230
+
231
+ const addOnNormalizedCost = isAddonFree
232
+ ? 'FREE'
233
+ : currencyNormalizerCreator(
234
+ getNormalizedPrice(addon?.cost ?? 0),
235
+ addon.currency
236
+ )
237
+
238
+ const addonNormalizedPrice = isAddonFree
239
+ ? 'FREE'
240
+ : currencyNormalizerCreator(
241
+ getNormalizedPrice(
242
+ CONFIGS.FEES_STYLE === FEES_STYLES.DISPLAY_BOTH
243
+ ? addon?.price ?? price
244
+ : price
245
+ ),
246
+ addon.currency
247
+ )
248
+
249
+ return (
250
+ <div key={addon.id} className={`${classNamePrefix}_product_block`}>
251
+ <div className={`${classNamePrefix}_product_images`}>
252
+ {addon.imageUrl && (
253
+ <div className={`${classNamePrefix}_product_image_block`}>
254
+ <img src={addon.imageUrl} alt="No Data" />
255
+ </div>
256
+ )}
257
+ </div>
258
+ <div className={`${classNamePrefix}_product_info_block`}>
259
+ <div className={`${classNamePrefix}_product_title`}>
260
+ {addon.name}
261
+ {addon.description && descriptionTrigger !== 'always' && (
262
+ <>
263
+ <span
264
+ aria-hidden
265
+ className="info-icon"
266
+ onClick={
267
+ descriptionTrigger === 'click'
268
+ ? () => handleDescriptionToggle(addon.id)
269
+ : undefined
270
+ }
271
+ onMouseEnter={
272
+ descriptionTrigger === 'hover'
273
+ ? () => setVisibleDescription(addon.id)
274
+ : undefined
275
+ }
276
+ onMouseLeave={
277
+ descriptionTrigger === 'hover'
278
+ ? () => setVisibleDescription(null)
279
+ : undefined
280
+ }
281
+ style={{
282
+ marginLeft: 8,
283
+ cursor: 'pointer',
284
+ display: 'flex',
285
+ }}
286
+ data-tooltip-id={`tooltip-${addon.id}`}
287
+ data-tooltip-content="View Add-On info"
288
+ >
289
+ <InfoIcon size={14} />
290
+ </span>
291
+ <Tooltip id={`tooltip-${addon.id}`} place="top">
292
+ {addon.description || 'No description available'}
293
+ </Tooltip>
294
+ </>
295
+ )}
296
+ </div>
297
+ <div className={`${classNamePrefix}_product_price`}>
298
+ {CONFIGS.FEES_STYLE === FEES_STYLES.TRADITIONAL
299
+ ? addonNormalizedPrice
300
+ : addOnNormalizedCost}
301
+ {!isAddonFree &&
302
+ CONFIGS.FEES_STYLE === FEES_STYLES.TRADITIONAL && (
303
+ <span className={`${classNamePrefix}_product_fee`}>
304
+ {addon.feeIncluded ? '(incl. Fees)' : '(excl. Fees)'}
305
+ </span>
306
+ )}
307
+ {!isAddonFree &&
308
+ CONFIGS.FEES_STYLE === FEES_STYLES.DISPLAY_BOTH && (
309
+ <>
310
+ <span className={`${classNamePrefix}_product_fee`}>
311
+ {`(${addonNormalizedPrice} with fees)`}
312
+ </span>
313
+ </>
314
+ )}
315
+ </div>
316
+ </div>
317
+ {(visibleDescription === addon.id ||
318
+ descriptionTrigger === 'always') && (
319
+ <div
320
+ className={`${classNamePrefix}_product_desc`}
321
+ dangerouslySetInnerHTML={createMarkup(addon.description)}
322
+ />
323
+ )}
324
+ <div className={`${classNamePrefix}_product_select_container`}>
325
+ {addon.variants ? (
326
+ addon.variants.map((variant: any) => (
327
+ // Group Variants
328
+ <AddonComponent
329
+ key={variant.id}
330
+ data={variant}
331
+ selectOptions={addonsOptions[variant.id]}
332
+ classNamePrefix={classNamePrefix}
333
+ handleAddonChange={(id, value) => {
334
+ onAddOnSelect(id, value, addon)
335
+ onFieldChange(id, value, addon)
336
+ }}
337
+ addOnDataWithCustomFields={addOnDataWithCustomFields}
338
+ configs={configs}
339
+ values={values}
340
+ errors={errors}
341
+ />
342
+ ))
343
+ ) : (
344
+ // Simple Addon
345
+ <AddonComponent
346
+ key={addon.id}
347
+ data={addon}
348
+ selectOptions={addonsOptions[addon.id]}
349
+ classNamePrefix={classNamePrefix}
350
+ handleAddonChange={(id, value) => {
351
+ onAddOnSelect(id, value, addon)
352
+ onFieldChange(id, value, addon)
353
+
354
+ _map(addOnDataWithCustomFields.fields, fieldGroup => {
355
+ const { id, groupItems } = fieldGroup
356
+ _map(groupItems, field => {
357
+ setFieldTouched(
358
+ `${addon.id}-${id}-${field.name}`,
359
+ true,
360
+ true
361
+ )
362
+ })
363
+ })
364
+ }}
365
+ addOnDataWithCustomFields={addOnDataWithCustomFields}
366
+ configs={configs}
367
+ values={values}
368
+ errors={errors}
369
+ />
370
+ )}
371
+ </div>
372
+ </div>
373
+ )
374
+ })}
375
+ </>
376
+ </Form>
377
+ )}
378
+ </Formik>
379
+ </div>
380
+ </div>
381
+ )
382
+ }
383
+
384
+ export default SimpleAddonsContainer