@salla.sa/twilight-components 2.14.467 → 2.14.469
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/cjs/{filepond-Li5IcLEr.js → filepond-CG7dNZgq.js} +1 -1
- package/dist/cjs/{filepond-plugin-file-poster-CXgEvsrj.js → filepond-plugin-file-poster-B1zrjwgr.js} +1 -1
- package/dist/cjs/{filepond-plugin-file-validate-size-DISjKBXN.js → filepond-plugin-file-validate-size-BqZtoWbe.js} +1 -1
- package/dist/cjs/{filepond-plugin-file-validate-type-BeDqb2RU.js → filepond-plugin-file-validate-type-BGmGKK9L.js} +1 -1
- package/dist/cjs/{filepond-plugin-image-edit-CTKgasCY.js → filepond-plugin-image-edit-CYeh6qmG.js} +1 -1
- package/dist/cjs/{filepond-plugin-image-exif-orientation-BqvyVbfM.js → filepond-plugin-image-exif-orientation-BEVpo-ZQ.js} +1 -1
- package/dist/cjs/{filepond-plugin-image-preview-DfX-wD-s.js → filepond-plugin-image-preview-C7MMEZFE.js} +1 -1
- package/dist/cjs/{functions-DXNacMtu.js → functions-CnBVKKGk.js} +1 -1
- package/dist/cjs/{index-2n84VIdz.js → index-BNOCK3IN.js} +1 -1
- package/dist/cjs/{index-JuURs8Nc.js → index-inmL4H71.js} +9 -5
- package/dist/cjs/loader.cjs.js +2 -2
- package/dist/cjs/{mail-Bgvt2hc9.js → mail-C9D8MHae.js} +2 -2
- package/dist/cjs/salla-accordion-body_2.cjs.entry.js +1 -1
- package/dist/cjs/salla-accordion_6.cjs.entry.js +1 -1
- package/dist/cjs/salla-add-product-button_5.cjs.entry.js +29 -84
- package/dist/cjs/salla-advertisement.cjs.entry.js +1 -1
- package/dist/cjs/salla-alert_2.cjs.entry.js +1 -1
- package/dist/cjs/salla-app-install-alert.cjs.entry.js +1 -1
- package/dist/cjs/salla-apps-icons.cjs.entry.js +1 -1
- package/dist/cjs/salla-badge.cjs.entry.js +1 -1
- package/dist/cjs/salla-booking-field_7.cjs.entry.js +11 -11
- package/dist/cjs/salla-bullet-delivery_2.cjs.entry.js +91 -7
- package/dist/cjs/salla-cart-coupons.cjs.entry.js +1 -1
- package/dist/cjs/salla-cart-item-offers_2.cjs.entry.js +1 -1
- package/dist/cjs/salla-cashback-banner.cjs.entry.js +1 -1
- package/dist/cjs/salla-comment-form_8.cjs.entry.js +1 -1
- package/dist/cjs/salla-conditional-offer.cjs.entry.js +1 -1
- package/dist/cjs/salla-contacts.cjs.entry.js +3 -3
- package/dist/cjs/salla-cookies-bar.cjs.entry.js +1 -1
- package/dist/cjs/salla-count-down.cjs.entry.js +1 -1
- package/dist/cjs/salla-custom-fields.cjs.entry.js +1 -1
- package/dist/cjs/salla-delivery-promise.cjs.entry.js +1 -1
- package/dist/cjs/salla-edit-order-button.cjs.entry.js +1 -1
- package/dist/cjs/salla-filters-widget.cjs.entry.js +1 -1
- package/dist/cjs/salla-filters.cjs.entry.js +1 -1
- package/dist/cjs/salla-fulfillment-methods.cjs.entry.js +1 -1
- package/dist/cjs/salla-gifting.cjs.entry.js +85 -31
- package/dist/cjs/salla-hook.cjs.entry.js +1 -1
- package/dist/cjs/salla-infinite-scroll.cjs.entry.js +1 -1
- package/dist/cjs/salla-installment.cjs.entry.js +1 -1
- package/dist/cjs/salla-list-tile.cjs.entry.js +1 -1
- package/dist/cjs/salla-localization-modal.cjs.entry.js +1 -1
- package/dist/cjs/salla-login-modal.cjs.entry.js +32 -2
- package/dist/cjs/salla-loyalty-banner.cjs.entry.js +2 -2
- package/dist/cjs/salla-loyalty-hero_2.cjs.entry.js +4 -4
- package/dist/cjs/salla-loyalty-panel.cjs.entry.js +3 -3
- package/dist/cjs/salla-loyalty-points-banner.cjs.entry.js +1 -1
- package/dist/cjs/salla-loyalty-points-history.cjs.entry.js +1 -1
- package/dist/cjs/salla-loyalty-prize-item.cjs.entry.js +1 -1
- package/dist/cjs/salla-loyalty-program.cjs.entry.js +3 -3
- package/dist/cjs/salla-loyalty-reward.cjs.entry.js +2 -2
- package/dist/cjs/salla-loyalty.cjs.entry.js +1 -1
- package/dist/cjs/salla-maintenance-alert.cjs.entry.js +1 -1
- package/dist/cjs/salla-map.cjs.entry.js +1 -1
- package/dist/cjs/salla-menu.cjs.entry.js +1 -1
- package/dist/cjs/salla-metadata.cjs.entry.js +1 -1
- package/dist/cjs/salla-multiple-bundle-product-cart_2.cjs.entry.js +1 -1
- package/dist/cjs/salla-multiple-bundle-product-options-modal_2.cjs.entry.js +1 -1
- package/dist/cjs/salla-multiple-bundle-product.cjs.entry.js +1 -1
- package/dist/cjs/salla-next-order-coupon.cjs.entry.js +1 -1
- package/dist/cjs/salla-notification-item.cjs.entry.js +1 -1
- package/dist/cjs/salla-notifications.cjs.entry.js +1 -1
- package/dist/cjs/salla-offer-modal.cjs.entry.js +1 -1
- package/dist/cjs/salla-offer.cjs.entry.js +1 -1
- package/dist/cjs/salla-order-branch.cjs.entry.js +1 -1
- package/dist/cjs/salla-order-details-multiple-bundle-product.cjs.entry.js +1 -1
- package/dist/cjs/salla-order-details-options.cjs.entry.js +1 -1
- package/dist/cjs/salla-order-details.cjs.entry.js +1 -1
- package/dist/cjs/salla-order-edit-item.cjs.entry.js +1 -1
- package/dist/cjs/salla-order-edit-product-card.cjs.entry.js +1 -1
- package/dist/cjs/salla-order-edit.cjs.entry.js +1 -1
- package/dist/cjs/salla-order-summary.cjs.entry.js +1 -1
- package/dist/cjs/salla-order-totals-card.cjs.entry.js +1 -1
- package/dist/cjs/salla-orders.cjs.entry.js +1 -1
- package/dist/cjs/salla-payments.cjs.entry.js +1 -1
- package/dist/cjs/salla-placeholder.cjs.entry.js +1 -1
- package/dist/cjs/salla-price-range.cjs.entry.js +1 -1
- package/dist/cjs/salla-product-card-embed.cjs.entry.js +1 -1
- package/dist/cjs/salla-product-card_2.cjs.entry.js +1 -1
- package/dist/cjs/salla-product-size-guide.cjs.entry.js +1 -1
- package/dist/cjs/salla-products-list.cjs.entry.js +259 -64
- package/dist/cjs/salla-progress-bar.cjs.entry.js +1 -1
- package/dist/cjs/salla-quick-order.cjs.entry.js +3 -3
- package/dist/cjs/salla-rating-modal.cjs.entry.js +3 -3
- package/dist/cjs/salla-reward-action_4.cjs.entry.js +3 -3
- package/dist/cjs/salla-scopes.cjs.entry.js +1 -1
- package/dist/cjs/salla-search.cjs.entry.js +1 -1
- package/dist/cjs/salla-skeleton.cjs.entry.js +1 -1
- package/dist/cjs/salla-slider.cjs.entry.js +1 -1
- package/dist/cjs/salla-social-share.cjs.entry.js +252 -32
- package/dist/cjs/salla-social.cjs.entry.js +1 -1
- package/dist/cjs/salla-tab-content_3.cjs.entry.js +4 -4
- package/dist/cjs/salla-tiered-offer.cjs.entry.js +1 -1
- package/dist/cjs/salla-tooltip.cjs.entry.js +2 -2
- package/dist/cjs/salla-trust-badges.cjs.entry.js +1 -1
- package/dist/cjs/salla-user-menu.cjs.entry.js +1 -1
- package/dist/cjs/salla-user-profile.cjs.entry.js +1 -1
- package/dist/cjs/salla-user-settings.cjs.entry.js +2 -2
- package/dist/cjs/salla-verify.cjs.entry.js +3 -3
- package/dist/cjs/salla-wallet.cjs.entry.js +1 -1
- package/dist/cjs/salla-wishlist-actions.cjs.entry.js +329 -0
- package/dist/cjs/{tracked-promise-BdbqBT_O.js → tracked-promise-DvLhM2Sx.js} +1 -1
- package/dist/cjs/twilight.cjs.js +2 -2
- package/dist/cjs/{vanilla-picker-Cj5ogibZ.js → vanilla-picker-DtuN6WGq.js} +1 -1
- package/dist/collection/collection-manifest.json +2 -1
- package/dist/collection/components/salla-bullet-delivery/salla-bullet-delivery.js +90 -6
- package/dist/collection/components/salla-gifting/salla-gifting.css +18 -0
- package/dist/collection/components/salla-gifting/salla-gifting.js +91 -31
- package/dist/collection/components/salla-login-modal/salla-login-modal.js +31 -1
- package/dist/collection/components/salla-product-options/salla-product-options.css +0 -3
- package/dist/collection/components/salla-product-options/salla-product-options.js +28 -84
- package/dist/collection/components/salla-products-list/salla-products-list.css +76 -0
- package/dist/collection/components/salla-products-list/salla-products-list.js +387 -65
- package/dist/collection/components/salla-social-share/salla-social-share.css +161 -0
- package/dist/collection/components/salla-social-share/salla-social-share.js +316 -50
- package/dist/collection/components/salla-tabs/salla-tab-content.js +1 -1
- package/dist/collection/components/salla-tabs/salla-tab-header.js +1 -1
- package/dist/collection/components/salla-tabs/salla-tabs.js +1 -1
- package/dist/collection/components/salla-tel-input/salla-tel-input.js +1 -1
- package/dist/collection/components/salla-tooltip/salla-tooltip.js +1 -1
- package/dist/collection/components/salla-user-settings/salla-user-settings.js +1 -1
- package/dist/collection/components/salla-wishlist-actions/salla-wishlist-actions.css +65 -0
- package/dist/collection/components/salla-wishlist-actions/salla-wishlist-actions.js +432 -0
- package/dist/components/index.js +5 -5
- package/dist/components/salla-bullet-delivery.js +90 -6
- package/dist/components/salla-gifting.js +86 -30
- package/dist/components/salla-login-modal2.js +31 -1
- package/dist/components/salla-product-options2.js +28 -84
- package/dist/components/salla-products-list2.js +266 -64
- package/dist/components/salla-social-share.js +1 -189
- package/dist/components/salla-social-share2.js +420 -0
- package/dist/components/salla-tab-content2.js +1 -1
- package/dist/components/salla-tab-header2.js +1 -1
- package/dist/components/salla-tabs2.js +1 -1
- package/dist/components/salla-tel-input2.js +1 -1
- package/dist/components/salla-tooltip2.js +1 -1
- package/dist/components/salla-user-settings.js +1 -1
- package/dist/components/salla-wishlist-actions.d.ts +11 -0
- package/dist/components/salla-wishlist-actions.js +375 -0
- package/dist/esm/{filepond-Cpf2HNH9.js → filepond-D4dDq1wa.js} +1 -1
- package/dist/esm/{filepond-plugin-file-poster-CVurRtjC.js → filepond-plugin-file-poster-CcnsMPSH.js} +1 -1
- package/dist/esm/{filepond-plugin-file-validate-size-Dw2xFbfx.js → filepond-plugin-file-validate-size-qgEgRYkk.js} +1 -1
- package/dist/esm/{filepond-plugin-file-validate-type-D6seJVa2.js → filepond-plugin-file-validate-type-BuFGnco8.js} +1 -1
- package/dist/esm/{filepond-plugin-image-edit-CBikW78V.js → filepond-plugin-image-edit-kS2Sie2d.js} +1 -1
- package/dist/esm/{filepond-plugin-image-exif-orientation-5yNhe9TO.js → filepond-plugin-image-exif-orientation-Bjoh_of2.js} +1 -1
- package/dist/esm/{filepond-plugin-image-preview-PlAAXB7f.js → filepond-plugin-image-preview-b_VEHHGf.js} +1 -1
- package/dist/esm/{functions-Egzz8fEM.js → functions-ISZQDw0y.js} +1 -1
- package/dist/esm/{index-Do4FV1UZ.js → index-CqC4wD_f.js} +1 -1
- package/dist/esm/{index-a4x9urdK.js → index-Cqh-ta1v.js} +9 -5
- package/dist/esm/loader.js +3 -3
- package/dist/esm/{mail-DLNIOD9t.js → mail-DzAIgzdz.js} +2 -2
- package/dist/esm/salla-accordion-body_2.entry.js +1 -1
- package/dist/esm/salla-accordion_6.entry.js +1 -1
- package/dist/esm/salla-add-product-button_5.entry.js +29 -84
- package/dist/esm/salla-advertisement.entry.js +1 -1
- package/dist/esm/salla-alert_2.entry.js +1 -1
- package/dist/esm/salla-app-install-alert.entry.js +1 -1
- package/dist/esm/salla-apps-icons.entry.js +1 -1
- package/dist/esm/salla-badge.entry.js +1 -1
- package/dist/esm/salla-booking-field_7.entry.js +11 -11
- package/dist/esm/salla-bullet-delivery_2.entry.js +91 -7
- package/dist/esm/salla-cart-coupons.entry.js +1 -1
- package/dist/esm/salla-cart-item-offers_2.entry.js +1 -1
- package/dist/esm/salla-cashback-banner.entry.js +1 -1
- package/dist/esm/salla-comment-form_8.entry.js +1 -1
- package/dist/esm/salla-conditional-offer.entry.js +1 -1
- package/dist/esm/salla-contacts.entry.js +3 -3
- package/dist/esm/salla-cookies-bar.entry.js +1 -1
- package/dist/esm/salla-count-down.entry.js +1 -1
- package/dist/esm/salla-custom-fields.entry.js +1 -1
- package/dist/esm/salla-delivery-promise.entry.js +1 -1
- package/dist/esm/salla-edit-order-button.entry.js +1 -1
- package/dist/esm/salla-filters-widget.entry.js +1 -1
- package/dist/esm/salla-filters.entry.js +1 -1
- package/dist/esm/salla-fulfillment-methods.entry.js +1 -1
- package/dist/esm/salla-gifting.entry.js +85 -31
- package/dist/esm/salla-hook.entry.js +1 -1
- package/dist/esm/salla-infinite-scroll.entry.js +1 -1
- package/dist/esm/salla-installment.entry.js +1 -1
- package/dist/esm/salla-list-tile.entry.js +1 -1
- package/dist/esm/salla-localization-modal.entry.js +1 -1
- package/dist/esm/salla-login-modal.entry.js +32 -2
- package/dist/esm/salla-loyalty-banner.entry.js +2 -2
- package/dist/esm/salla-loyalty-hero_2.entry.js +4 -4
- package/dist/esm/salla-loyalty-panel.entry.js +3 -3
- package/dist/esm/salla-loyalty-points-banner.entry.js +1 -1
- package/dist/esm/salla-loyalty-points-history.entry.js +1 -1
- package/dist/esm/salla-loyalty-prize-item.entry.js +1 -1
- package/dist/esm/salla-loyalty-program.entry.js +3 -3
- package/dist/esm/salla-loyalty-reward.entry.js +2 -2
- package/dist/esm/salla-loyalty.entry.js +1 -1
- package/dist/esm/salla-maintenance-alert.entry.js +1 -1
- package/dist/esm/salla-map.entry.js +1 -1
- package/dist/esm/salla-menu.entry.js +1 -1
- package/dist/esm/salla-metadata.entry.js +1 -1
- package/dist/esm/salla-multiple-bundle-product-cart_2.entry.js +1 -1
- package/dist/esm/salla-multiple-bundle-product-options-modal_2.entry.js +1 -1
- package/dist/esm/salla-multiple-bundle-product.entry.js +1 -1
- package/dist/esm/salla-next-order-coupon.entry.js +1 -1
- package/dist/esm/salla-notification-item.entry.js +1 -1
- package/dist/esm/salla-notifications.entry.js +1 -1
- package/dist/esm/salla-offer-modal.entry.js +1 -1
- package/dist/esm/salla-offer.entry.js +1 -1
- package/dist/esm/salla-order-branch.entry.js +1 -1
- package/dist/esm/salla-order-details-multiple-bundle-product.entry.js +1 -1
- package/dist/esm/salla-order-details-options.entry.js +1 -1
- package/dist/esm/salla-order-details.entry.js +1 -1
- package/dist/esm/salla-order-edit-item.entry.js +1 -1
- package/dist/esm/salla-order-edit-product-card.entry.js +1 -1
- package/dist/esm/salla-order-edit.entry.js +1 -1
- package/dist/esm/salla-order-summary.entry.js +1 -1
- package/dist/esm/salla-order-totals-card.entry.js +1 -1
- package/dist/esm/salla-orders.entry.js +1 -1
- package/dist/esm/salla-payments.entry.js +1 -1
- package/dist/esm/salla-placeholder.entry.js +1 -1
- package/dist/esm/salla-price-range.entry.js +1 -1
- package/dist/esm/salla-product-card-embed.entry.js +1 -1
- package/dist/esm/salla-product-card_2.entry.js +1 -1
- package/dist/esm/salla-product-size-guide.entry.js +1 -1
- package/dist/esm/salla-products-list.entry.js +259 -64
- package/dist/esm/salla-progress-bar.entry.js +1 -1
- package/dist/esm/salla-quick-order.entry.js +3 -3
- package/dist/esm/salla-rating-modal.entry.js +3 -3
- package/dist/esm/salla-reward-action_4.entry.js +3 -3
- package/dist/esm/salla-scopes.entry.js +1 -1
- package/dist/esm/salla-search.entry.js +1 -1
- package/dist/esm/salla-skeleton.entry.js +1 -1
- package/dist/esm/salla-slider.entry.js +1 -1
- package/dist/esm/salla-social-share.entry.js +252 -32
- package/dist/esm/salla-social.entry.js +1 -1
- package/dist/esm/salla-tab-content_3.entry.js +4 -4
- package/dist/esm/salla-tiered-offer.entry.js +1 -1
- package/dist/esm/salla-tooltip.entry.js +2 -2
- package/dist/esm/salla-trust-badges.entry.js +1 -1
- package/dist/esm/salla-user-menu.entry.js +1 -1
- package/dist/esm/salla-user-profile.entry.js +1 -1
- package/dist/esm/salla-user-settings.entry.js +2 -2
- package/dist/esm/salla-verify.entry.js +3 -3
- package/dist/esm/salla-wallet.entry.js +1 -1
- package/dist/esm/salla-wishlist-actions.entry.js +327 -0
- package/dist/esm/{tracked-promise-BX5clCDX.js → tracked-promise-CH_UyK-l.js} +1 -1
- package/dist/esm/twilight.js +3 -3
- package/dist/esm/{vanilla-picker-DB0pDHa7.js → vanilla-picker-PE31tu9y.js} +1 -1
- package/dist/twilight/{p-afcb0117.entry.js → p-054c9462.entry.js} +1 -1
- package/dist/twilight/{p-78020271.entry.js → p-06372aeb.entry.js} +1 -1
- package/dist/twilight/p-06c06719.entry.js +4 -0
- package/dist/twilight/{p-16bcc5ab.entry.js → p-0c7efc0b.entry.js} +1 -1
- package/dist/twilight/{p-53cbb271.entry.js → p-0cca1b63.entry.js} +1 -1
- package/dist/twilight/{p-ad19661d.entry.js → p-1415eb5e.entry.js} +1 -1
- package/dist/twilight/{p-a53d5944.entry.js → p-14a3277b.entry.js} +1 -1
- package/dist/twilight/{p-92b02f3c.entry.js → p-15b3f969.entry.js} +1 -1
- package/dist/twilight/{p-241bd42e.entry.js → p-16b64bb5.entry.js} +1 -1
- package/dist/twilight/{p-37457147.entry.js → p-16c64a38.entry.js} +1 -1
- package/dist/twilight/{p-f5135cb5.entry.js → p-17920aa7.entry.js} +1 -1
- package/dist/twilight/{p-ec5ae058.entry.js → p-196fad8d.entry.js} +1 -1
- package/dist/twilight/{p-5803c158.entry.js → p-19fe2b27.entry.js} +1 -1
- package/dist/twilight/{p-316135f8.entry.js → p-1c0f9fd9.entry.js} +1 -1
- package/dist/twilight/{p-1130d4b7.entry.js → p-1db8b515.entry.js} +1 -1
- package/dist/twilight/{p-d0340e11.entry.js → p-219b14c4.entry.js} +1 -1
- package/dist/twilight/{p-127ee640.entry.js → p-227d11a0.entry.js} +1 -1
- package/dist/twilight/p-293a6d6b.entry.js +4 -0
- package/dist/twilight/{p-0c748664.entry.js → p-2ba603bc.entry.js} +1 -1
- package/dist/twilight/p-2dbb3b49.entry.js +4 -0
- package/dist/twilight/{p-5b365561.entry.js → p-31bd852c.entry.js} +1 -1
- package/dist/twilight/{p-92f3ea44.entry.js → p-32a7cb85.entry.js} +1 -1
- package/dist/twilight/{p-1a37b959.entry.js → p-32d5d279.entry.js} +1 -1
- package/dist/twilight/{p-91363b7e.entry.js → p-36884c05.entry.js} +1 -1
- package/dist/twilight/{p-13a033fa.entry.js → p-38a791cb.entry.js} +1 -1
- package/dist/twilight/{p-0b169d4e.entry.js → p-3b198162.entry.js} +1 -1
- package/dist/twilight/{p-735fafef.entry.js → p-3d517178.entry.js} +1 -1
- package/dist/twilight/{p-d9d4ea5b.entry.js → p-3e5a57cc.entry.js} +1 -1
- package/dist/twilight/{p-fa1cc092.entry.js → p-40eb9556.entry.js} +6 -6
- package/dist/twilight/{p-1ce817c2.entry.js → p-49181c4a.entry.js} +1 -1
- package/dist/twilight/p-4a81a708.entry.js +4 -0
- package/dist/twilight/{p-35ac1fc9.entry.js → p-4b20872a.entry.js} +1 -1
- package/dist/twilight/{p-e27363dd.entry.js → p-4c370853.entry.js} +1 -1
- package/dist/twilight/{p-e1205d19.entry.js → p-4ee20a54.entry.js} +1 -1
- package/dist/twilight/{p-b0bf7a5b.entry.js → p-51c30ec2.entry.js} +1 -1
- package/dist/twilight/{p-2bcfb4f3.entry.js → p-5334222c.entry.js} +1 -1
- package/dist/twilight/{p-c0380d40.entry.js → p-559bdcca.entry.js} +1 -1
- package/dist/twilight/{p-03d13b9f.entry.js → p-5701244a.entry.js} +1 -1
- package/dist/twilight/{p-0da78d4e.entry.js → p-5d364fc2.entry.js} +1 -1
- package/dist/twilight/{p-DiWHgCMH.js → p-5fxCpxw5.js} +1 -1
- package/dist/twilight/{p-08b2c781.entry.js → p-61ad2660.entry.js} +1 -1
- package/dist/twilight/p-6590acee.entry.js +4 -0
- package/dist/twilight/{p-b8ab7da8.entry.js → p-681f8874.entry.js} +1 -1
- package/dist/twilight/{p-d17596ff.entry.js → p-6b6f9822.entry.js} +1 -1
- package/dist/twilight/{p-4d393389.entry.js → p-6d23fd92.entry.js} +1 -1
- package/dist/twilight/p-6e723d46.entry.js +4 -0
- package/dist/twilight/{p-d33203b7.entry.js → p-71f2ba66.entry.js} +1 -1
- package/dist/twilight/{p-c8fd03c0.entry.js → p-732bd9fb.entry.js} +1 -1
- package/dist/twilight/{p-42a0b54a.entry.js → p-73d9e4c8.entry.js} +1 -1
- package/dist/twilight/{p-e90d18b2.entry.js → p-74e0d0c2.entry.js} +1 -1
- package/dist/twilight/{p-52fe97c8.entry.js → p-77d2312a.entry.js} +1 -1
- package/dist/twilight/{p-635347c9.entry.js → p-78ff445c.entry.js} +1 -1
- package/dist/twilight/{p-74a61155.entry.js → p-798fb3c7.entry.js} +1 -1
- package/dist/twilight/{p-e726123e.entry.js → p-79c20964.entry.js} +1 -1
- package/dist/twilight/{p-C4aFleDM.js → p-7FtjQghq.js} +1 -1
- package/dist/twilight/{p-0405f5e8.entry.js → p-7afe6e1a.entry.js} +1 -1
- package/dist/twilight/{p-b80adb19.entry.js → p-7e185acf.entry.js} +1 -1
- package/dist/twilight/{p-f684d7bf.entry.js → p-8b538bd7.entry.js} +1 -1
- package/dist/twilight/{p-bfbf8121.entry.js → p-8bcc3b86.entry.js} +1 -1
- package/dist/twilight/{p-a068fff4.entry.js → p-8db52fe9.entry.js} +1 -1
- package/dist/twilight/{p-89f11893.entry.js → p-93ec294d.entry.js} +1 -1
- package/dist/twilight/p-9785f314.entry.js +4 -0
- package/dist/twilight/{p-ff270706.entry.js → p-9a3f27e9.entry.js} +1 -1
- package/dist/twilight/{p-DSBkBAFI.js → p-B0uENqSF.js} +1 -1
- package/dist/twilight/{p-B7KW0zhB.js → p-C3kw3FEZ.js} +1 -1
- package/dist/twilight/{p-BVqg7xd9.js → p-CUfwD9kr.js} +1 -1
- package/dist/twilight/{p-a4x9urdK.js → p-Cqh-ta1v.js} +2 -2
- package/dist/twilight/{p-fCaOxwGH.js → p-DZ18vMT2.js} +1 -1
- package/dist/twilight/{p-EPfEwqOC.js → p-DyQ5MH6F.js} +1 -1
- package/dist/twilight/{p-DLNIOD9t.js → p-DzAIgzdz.js} +1 -1
- package/dist/twilight/{p-pOgjUtf9.js → p-J_27I63T.js} +1 -1
- package/dist/twilight/{p-10e0936d.entry.js → p-a85d80b5.entry.js} +1 -1
- package/dist/twilight/{p-6d47892b.entry.js → p-a918b812.entry.js} +1 -1
- package/dist/twilight/{p-ba1199ba.entry.js → p-aec0a2df.entry.js} +1 -1
- package/dist/twilight/{p-9b639078.entry.js → p-b16d8b19.entry.js} +1 -1
- package/dist/twilight/{p-ee605cef.entry.js → p-b295c1f1.entry.js} +1 -1
- package/dist/twilight/{p-0957f323.entry.js → p-b6c0aa79.entry.js} +1 -1
- package/dist/twilight/{p-0bdf58a4.entry.js → p-b7727021.entry.js} +1 -1
- package/dist/twilight/{p-e8a82952.entry.js → p-badf4c9d.entry.js} +1 -1
- package/dist/twilight/{p-fe506679.entry.js → p-c6be8afd.entry.js} +1 -1
- package/dist/twilight/{p-ec073354.entry.js → p-ccd8c960.entry.js} +1 -1
- package/dist/twilight/{p-3fbd88d0.entry.js → p-ce0410d5.entry.js} +1 -1
- package/dist/twilight/{p-ef8fb222.entry.js → p-cee7a8ad.entry.js} +1 -1
- package/dist/twilight/{p-f6bb956c.entry.js → p-d0c8435f.entry.js} +1 -1
- package/dist/twilight/{p-59f815bc.entry.js → p-d23eeb0c.entry.js} +1 -1
- package/dist/twilight/{p-f170aff7.entry.js → p-d63f2cbd.entry.js} +1 -1
- package/dist/twilight/{p-6d87b134.entry.js → p-d6b6a8ad.entry.js} +1 -1
- package/dist/twilight/{p-b0ed6a9f.entry.js → p-d823cbcd.entry.js} +1 -1
- package/dist/twilight/{p-9df5c9a7.entry.js → p-d8f22e4b.entry.js} +1 -1
- package/dist/twilight/{p-CsMnvJkR.js → p-dKdk2xpB.js} +1 -1
- package/dist/twilight/p-dbdbb882.entry.js +4 -0
- package/dist/twilight/{p-d905fbca.entry.js → p-dc8555bf.entry.js} +1 -1
- package/dist/twilight/{p-fbfacb11.entry.js → p-dca3b67e.entry.js} +1 -1
- package/dist/twilight/{p-056400a1.entry.js → p-e0671ff1.entry.js} +1 -1
- package/dist/twilight/{p-59f7f014.entry.js → p-e06e37c1.entry.js} +1 -1
- package/dist/twilight/{p-c60c302f.entry.js → p-e265d626.entry.js} +1 -1
- package/dist/twilight/{p-61b1fd3b.entry.js → p-f0e96875.entry.js} +1 -1
- package/dist/twilight/p-f64168cc.entry.js +4 -0
- package/dist/twilight/{p-0b1970c2.entry.js → p-f67639df.entry.js} +1 -1
- package/dist/twilight/{p-fa039238.entry.js → p-fd180bd3.entry.js} +1 -1
- package/dist/twilight/{p-D9ni3BuG.js → p-m2p-QAbu.js} +1 -1
- package/dist/twilight/{p-CkA6UKAD.js → p-yyvPGK6r.js} +2 -2
- package/dist/twilight/twilight.esm.js +1 -1
- package/dist/types/components/salla-bullet-delivery/salla-bullet-delivery.d.ts +16 -0
- package/dist/types/components/salla-gifting/gift-schema.d.ts +4 -0
- package/dist/types/components/salla-gifting/salla-gifting.d.ts +5 -1
- package/dist/types/components/salla-login-modal/salla-login-modal.d.ts +2 -0
- package/dist/types/components/salla-product-options/salla-product-options.d.ts +0 -11
- package/dist/types/components/salla-products-list/salla-products-list.d.ts +60 -6
- package/dist/types/components/salla-social-share/salla-social-share.d.ts +39 -2
- package/dist/types/components/salla-wishlist-actions/salla-wishlist-actions.d.ts +93 -0
- package/dist/types/components.d.ts +172 -18
- package/package.json +5 -5
- package/dist/twilight/p-234fdf72.entry.js +0 -4
- package/dist/twilight/p-7a1cfd65.entry.js +0 -4
- package/dist/twilight/p-865c602e.entry.js +0 -4
- package/dist/twilight/p-9dc0fec4.entry.js +0 -4
- package/dist/twilight/p-e485d0b8.entry.js +0 -4
- package/dist/twilight/p-f5072671.entry.js +0 -4
- package/dist/twilight/p-fb7904e6.entry.js +0 -4
- package/dist/twilight/p-fdde8399.entry.js +0 -4
|
@@ -122,7 +122,8 @@
|
|
|
122
122
|
"components/salla-user-profile/salla-user-profile.js",
|
|
123
123
|
"components/salla-user-settings/salla-user-settings.js",
|
|
124
124
|
"components/salla-verify/salla-verify.js",
|
|
125
|
-
"components/salla-wallet/salla-wallet.js"
|
|
125
|
+
"components/salla-wallet/salla-wallet.js",
|
|
126
|
+
"components/salla-wishlist-actions/salla-wishlist-actions.js"
|
|
126
127
|
],
|
|
127
128
|
"compiler": {
|
|
128
129
|
"name": "@stencil/core",
|
|
@@ -6,6 +6,8 @@ import { bulletDeliveryAPI, clearApiCache, isSaudiArabia } from "./api-service";
|
|
|
6
6
|
import { buildAddressLocationPayloadFromSelection, filterBranches, findNearestBranch, formatWorkingHoursDisplay, getBranchFirstSlot, getGeolocationErrorMessage, getIntentBranchId, getIntentCityId, getIntentCountryCode, getIntentCountryId, getIntentDistrictId, getIntentLatitude, getIntentLongitude, getIntentRegionId, getIntentSubtitle, hasSessionAddressIntent, requireRegionAndDistrictForSA, } from "./helpers";
|
|
7
7
|
const BRANCH_SEARCH_DEBOUNCE_MS = 1000;
|
|
8
8
|
const GEOLOCATION_TIMEOUT = 10000;
|
|
9
|
+
/** Final fallback center used only if `user.default_geo_location` is absent (Riyadh — matches checkout map-page). */
|
|
10
|
+
const DEFAULT_MAP_CENTER = { lat: 24.7756042, lng: 46.7360729 };
|
|
9
11
|
import { load } from "@salla.sa/ui-google-map-render";
|
|
10
12
|
import "@salla.sa/ui-google-map-render";
|
|
11
13
|
import GetDirections from "../../assets/svg/get-directions.svg";
|
|
@@ -64,6 +66,8 @@ export class SallaBulletDelivery {
|
|
|
64
66
|
/** True after saved addresses have been loaded (lazy: only when address tab is shown). */
|
|
65
67
|
this.savedAddressesLoaded = false;
|
|
66
68
|
this.gmapRef = null;
|
|
69
|
+
/** Guards against re-prompting for geolocation each time the map (re)initializes within one flow. */
|
|
70
|
+
this.autoGeolocationTriggered = false;
|
|
67
71
|
// Core state
|
|
68
72
|
this.activeTab = "address";
|
|
69
73
|
this.isLoggedIn = false;
|
|
@@ -205,6 +209,8 @@ export class SallaBulletDelivery {
|
|
|
205
209
|
shortAddress: detail.place?.placeId ?? detail.place?.place_id ?? undefined,
|
|
206
210
|
formattedAddress: detail.place?.formattedAddress ?? detail.place?.formatted_address ?? undefined,
|
|
207
211
|
};
|
|
212
|
+
// Bias autocomplete results toward the currently selected location.
|
|
213
|
+
this.updateLocationBias();
|
|
208
214
|
setTimeout(() => {
|
|
209
215
|
const marker = this.gmapRef?.locationMarker;
|
|
210
216
|
if (marker)
|
|
@@ -216,6 +222,25 @@ export class SallaBulletDelivery {
|
|
|
216
222
|
if (this.gmapRef && typeof this.gmapRef.resize === 'function') {
|
|
217
223
|
this.gmapRef.resize();
|
|
218
224
|
}
|
|
225
|
+
this.updateLocationBias();
|
|
226
|
+
// Auto-locate the customer so the map never opens "empty" — matches checkout map-page
|
|
227
|
+
// (getCurrentLocation(true) pans to the resolved position). Skip if a location is already set
|
|
228
|
+
// (e.g. returning from the confirm step). Falls back silently to mapInitialCenter if denied.
|
|
229
|
+
if (!this.autoGeolocationTriggered && !this.hasMapLocation() && this.gmapRef) {
|
|
230
|
+
const getCurrentLocation = this.gmapRef.getCurrentLocation;
|
|
231
|
+
if (typeof getCurrentLocation === 'function') {
|
|
232
|
+
this.autoGeolocationTriggered = true;
|
|
233
|
+
try {
|
|
234
|
+
const result = getCurrentLocation.call(this.gmapRef, true);
|
|
235
|
+
if (result && typeof result.catch === 'function') {
|
|
236
|
+
result.catch((err) => log('Auto geolocation failed', err));
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
catch (err) {
|
|
240
|
+
log('Auto geolocation threw', err);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
219
244
|
};
|
|
220
245
|
/**
|
|
221
246
|
* Submit add-address form: create address via API then switch back to list.
|
|
@@ -339,6 +364,9 @@ export class SallaBulletDelivery {
|
|
|
339
364
|
get isRequired() {
|
|
340
365
|
return !!Salla.config.get("store.settings.bullet_delivery.settings.is_required");
|
|
341
366
|
}
|
|
367
|
+
get isSupportsDelivery() {
|
|
368
|
+
return !!Salla.config.get("store.settings.bullet_delivery.supports_delivery");
|
|
369
|
+
}
|
|
342
370
|
get isMobileApp() {
|
|
343
371
|
return Salla.config.isMobileApp();
|
|
344
372
|
}
|
|
@@ -447,6 +475,7 @@ export class SallaBulletDelivery {
|
|
|
447
475
|
}
|
|
448
476
|
resetState() {
|
|
449
477
|
this.viewMode = "main";
|
|
478
|
+
this.autoGeolocationTriggered = false;
|
|
450
479
|
this.selectedCountry = null;
|
|
451
480
|
this.selectedRegion = null;
|
|
452
481
|
this.selectedCity = null;
|
|
@@ -524,12 +553,27 @@ export class SallaBulletDelivery {
|
|
|
524
553
|
// only when it represents a valid session-style address.
|
|
525
554
|
return hasSessionAddressIntent(intent);
|
|
526
555
|
}
|
|
556
|
+
/**
|
|
557
|
+
* Whether the store still supports the delivery method captured in a stored
|
|
558
|
+
* intent. Shared by the cart pill and the cart-submit gate so an unsupported
|
|
559
|
+
* method (e.g. a remembered delivery address in a now pickup-only store) is
|
|
560
|
+
* never treated as a valid/complete selection.
|
|
561
|
+
*/
|
|
562
|
+
isIntentMethodSupported(intent) {
|
|
563
|
+
if (intent.type === "branch")
|
|
564
|
+
return this.supportsPickup;
|
|
565
|
+
if (intent.type === "address")
|
|
566
|
+
return this.isSupportsDelivery;
|
|
567
|
+
return false;
|
|
568
|
+
}
|
|
527
569
|
hasCompleteIntentForLoggedInUser() {
|
|
528
570
|
if (this.isGuestUser())
|
|
529
571
|
return false;
|
|
530
572
|
const intent = this.getStoredIntent();
|
|
531
573
|
if (!intent)
|
|
532
574
|
return false;
|
|
575
|
+
if (!this.isIntentMethodSupported(intent))
|
|
576
|
+
return false;
|
|
533
577
|
if (intent.type === "address")
|
|
534
578
|
return !!intent.address_id;
|
|
535
579
|
if (intent.type === "branch")
|
|
@@ -1107,6 +1151,7 @@ export class SallaBulletDelivery {
|
|
|
1107
1151
|
async handleAddNewAddress() {
|
|
1108
1152
|
this.viewMode = "add-address";
|
|
1109
1153
|
this.mapLocationData = null;
|
|
1154
|
+
this.autoGeolocationTriggered = false;
|
|
1110
1155
|
this.fetchAddressToken();
|
|
1111
1156
|
const intent = this.getStoredIntent();
|
|
1112
1157
|
const sessionCountryId = getIntentCountryId(intent);
|
|
@@ -1129,6 +1174,7 @@ export class SallaBulletDelivery {
|
|
|
1129
1174
|
this.mapLocationData = null;
|
|
1130
1175
|
this.mapStep = 'map';
|
|
1131
1176
|
this.addressDescription = '';
|
|
1177
|
+
this.autoGeolocationTriggered = false;
|
|
1132
1178
|
}
|
|
1133
1179
|
// ─── Map methods ───
|
|
1134
1180
|
async fetchAddressToken() {
|
|
@@ -1153,6 +1199,15 @@ export class SallaBulletDelivery {
|
|
|
1153
1199
|
this.loadingToken = false;
|
|
1154
1200
|
}
|
|
1155
1201
|
}
|
|
1202
|
+
/** Bias autocomplete toward the current selection (or the initial center) — mirrors checkout's map-page. */
|
|
1203
|
+
updateLocationBias() {
|
|
1204
|
+
if (!this.gmapRef)
|
|
1205
|
+
return;
|
|
1206
|
+
const center = this.hasMapLocation()
|
|
1207
|
+
? { lat: this.mapLocationData.lat, lng: this.mapLocationData.lng }
|
|
1208
|
+
: this.mapInitialCenter;
|
|
1209
|
+
this.gmapRef.autocompleteLocationBias = { center, radius: 500000 };
|
|
1210
|
+
}
|
|
1156
1211
|
hasMapLocation() {
|
|
1157
1212
|
return this.mapLocationData?.lat != null && this.mapLocationData?.lng != null;
|
|
1158
1213
|
}
|
|
@@ -1163,6 +1218,27 @@ export class SallaBulletDelivery {
|
|
|
1163
1218
|
get isMapModeAvailable() {
|
|
1164
1219
|
return this.isMapSettingEnabled && !!salla.config.get('store.settings.keys.maps') && !!this.addressToken;
|
|
1165
1220
|
}
|
|
1221
|
+
/** Center shown before geolocation resolves — the customer's IP-based default (falls back to Riyadh). */
|
|
1222
|
+
get mapInitialCenter() {
|
|
1223
|
+
const geo = salla.config.get('user.default_geo_location');
|
|
1224
|
+
// Coerce defensively: config may arrive as strings, blank/whitespace, NaN, or out-of-range
|
|
1225
|
+
// values. Reject blanks before coercion (Number('') === 0) and validate lat/lng ranges so we
|
|
1226
|
+
// never feed (0,0) or an invalid point to the map; otherwise fall back to the default center.
|
|
1227
|
+
const lat = this.toCoordinate(geo?.lat);
|
|
1228
|
+
const lng = this.toCoordinate(geo?.lng);
|
|
1229
|
+
const isValid = lat != null && lng != null &&
|
|
1230
|
+
lat >= -90 && lat <= 90 && lng >= -180 && lng <= 180;
|
|
1231
|
+
return isValid ? { lat, lng } : DEFAULT_MAP_CENTER;
|
|
1232
|
+
}
|
|
1233
|
+
/** Parse a config coordinate to a finite number, treating blank/whitespace strings as missing. */
|
|
1234
|
+
toCoordinate(value) {
|
|
1235
|
+
if (typeof value === 'string' && value.trim() === '')
|
|
1236
|
+
return null;
|
|
1237
|
+
if (value == null)
|
|
1238
|
+
return null;
|
|
1239
|
+
const num = Number(value);
|
|
1240
|
+
return Number.isFinite(num) ? num : null;
|
|
1241
|
+
}
|
|
1166
1242
|
// ─── End Map methods ───
|
|
1167
1243
|
/**
|
|
1168
1244
|
* Build address/location payload from guest-form state (same fields as add-address).
|
|
@@ -1733,10 +1809,10 @@ export class SallaBulletDelivery {
|
|
|
1733
1809
|
getCartViewConfig(intent) {
|
|
1734
1810
|
if (!intent || !Salla.url.is_page("cart"))
|
|
1735
1811
|
return null;
|
|
1812
|
+
if (!this.isIntentMethodSupported(intent))
|
|
1813
|
+
return null;
|
|
1736
1814
|
const isBranch = intent.type === "branch";
|
|
1737
1815
|
const isAddress = intent.type === "address";
|
|
1738
|
-
if ((isBranch && !this.supportsPickup) || (!isBranch && !isAddress))
|
|
1739
|
-
return null;
|
|
1740
1816
|
return {
|
|
1741
1817
|
title: isBranch
|
|
1742
1818
|
? Salla.lang.get("pages.checkout.pickup_option")
|
|
@@ -1786,13 +1862,15 @@ export class SallaBulletDelivery {
|
|
|
1786
1862
|
return wrapper;
|
|
1787
1863
|
}
|
|
1788
1864
|
renderTabs() {
|
|
1789
|
-
// Show tabs only when pickup is supported; otherwise delivery-only view with no tabs
|
|
1865
|
+
// Show tabs only when pickup is supported; otherwise delivery-only view with no tabs.
|
|
1866
|
+
// The pickup tab is gated by this same `supportsPickup` check, while the delivery
|
|
1867
|
+
// tab is shown only when bullet delivery supports delivery (`isSupportsDelivery`).
|
|
1790
1868
|
if (!this.supportsPickup)
|
|
1791
1869
|
return null;
|
|
1792
|
-
return (h("div", { class: "s-bullet-delivery-tabs" }, h("button", { type: "button", class: {
|
|
1870
|
+
return (h("div", { class: "s-bullet-delivery-tabs" }, this.isSupportsDelivery && (h("button", { type: "button", class: {
|
|
1793
1871
|
"s-bullet-delivery-tab": true,
|
|
1794
1872
|
"s-bullet-delivery-tab--active": this.activeTab === "address",
|
|
1795
|
-
}, onClick: () => this.handleTabChange("address") }, h("span", { class: "s-bullet-delivery-tab-icon", innerHTML: Location, "aria-hidden": "true" }), h("span", null, Salla.lang.get("mobile_app.strings.delivery"))), h("button", { type: "button", class: {
|
|
1873
|
+
}, onClick: () => this.handleTabChange("address") }, h("span", { class: "s-bullet-delivery-tab-icon", innerHTML: Location, "aria-hidden": "true" }), h("span", null, Salla.lang.get("mobile_app.strings.delivery")))), h("button", { type: "button", class: {
|
|
1796
1874
|
"s-bullet-delivery-tab": true,
|
|
1797
1875
|
"s-bullet-delivery-tab--active": this.activeTab === "branch",
|
|
1798
1876
|
}, onClick: () => this.handleTabChange("branch") }, h("span", { class: "s-bullet-delivery-tab-icon", innerHTML: Store, "aria-hidden": "true" }), h("span", null, Salla.lang.get("mobile_app.strings.pickup")))));
|
|
@@ -1945,7 +2023,13 @@ export class SallaBulletDelivery {
|
|
|
1945
2023
|
}
|
|
1946
2024
|
renderMapSection() {
|
|
1947
2025
|
const isSA = isSaudiArabia(this.selectedCountry?.code ?? '');
|
|
1948
|
-
|
|
2026
|
+
const loc = this.mapLocationData;
|
|
2027
|
+
const hasLoc = loc?.lat != null && loc?.lng != null;
|
|
2028
|
+
// Resolve the center once (the getter reads salla.config) and reuse it for the marker so the
|
|
2029
|
+
// map never opens "empty": before a selection the marker sits on the IP/Riyadh default and is
|
|
2030
|
+
// dragged/replaced once auto-geolocation or the user picks a real position.
|
|
2031
|
+
const center = hasLoc ? { lat: loc.lat, lng: loc.lng } : this.mapInitialCenter;
|
|
2032
|
+
return (h("div", { class: "s-bullet-delivery-map-container" }, h("gmap-map", { ref: (el) => (this.gmapRef = el), center: center, zoom: 16, "min-zoom": 4, "max-zoom": 21, "map-id": "DEMO_MAP_ID", "enable-autocomplete": true, "enable-geolocation": true, "show-location-marker": true, "location-marker-position": hasLoc ? { lat: loc.lat, lng: loc.lng, accuracy: 50 } : { ...center, accuracy: 50 }, language: Salla.lang.getLocale?.() ?? document.documentElement.lang ?? 'ar', "geolocation-button-label": Salla.lang.get('pages.checkout.current_location'), "autocomplete-placeholder": Salla.lang.get('pages.checkout.search_for_address'), "autocomplete-hint": isSA ? Salla.lang.get('pages.checkout.short_address_format_validation') : undefined, "autocomplete-country": this.selectedCountry?.code?.toLowerCase(), "autocomplete-resolve": false, "autocomplete-auth-token": this.addressToken, "location-marker-background": "#4285F4", "location-marker-border-color": "#1967D2", "location-marker-glyph-color": "#FFFFFF", "location-marker-scale": 1.3, "onGmap-location-changed": this.handleMapLocationChanged, "onGmap-ready": this.handleMapReady })));
|
|
1949
2033
|
}
|
|
1950
2034
|
renderAddressConfirmation() {
|
|
1951
2035
|
const address = this.mapLocationData?.formattedAddress ?? '';
|
|
@@ -37,4 +37,22 @@
|
|
|
37
37
|
}
|
|
38
38
|
.s-gifting-modal .s-searchable-dropdown-trigger-placeholder {
|
|
39
39
|
color: #000;
|
|
40
|
+
}
|
|
41
|
+
.s-gifting-modal .s-gifting-image-section {
|
|
42
|
+
margin-bottom: 1.5rem;
|
|
43
|
+
}
|
|
44
|
+
.s-gifting-modal .s-gifting-slider {
|
|
45
|
+
margin-bottom: 0.5rem;
|
|
46
|
+
}
|
|
47
|
+
.s-gifting-modal .s-gifting-image {
|
|
48
|
+
display: block;
|
|
49
|
+
}
|
|
50
|
+
.s-gifting-modal .s-gifting-image img {
|
|
51
|
+
display: block;
|
|
52
|
+
width: auto;
|
|
53
|
+
height: 100px;
|
|
54
|
+
object-fit: contain;
|
|
55
|
+
}
|
|
56
|
+
.s-gifting-modal .s-gifting-image-section + .anime-item .s-gifting-text-title {
|
|
57
|
+
margin-top: 1rem;
|
|
40
58
|
}
|
|
@@ -14,7 +14,7 @@ import Alert from "../../assets/svg/alert.svg";
|
|
|
14
14
|
export class SallaGifting {
|
|
15
15
|
constructor() {
|
|
16
16
|
this.defaultEvent = "gifting:open";
|
|
17
|
-
this.selectImageForYourGift = salla.lang.get('blocks.buy_as_gift.
|
|
17
|
+
this.selectImageForYourGift = salla.lang.get('blocks.buy_as_gift.select_image_for_your_gift');
|
|
18
18
|
this.currentStep = 1;
|
|
19
19
|
this.showCalendar = false;
|
|
20
20
|
this.showGiftText = false;
|
|
@@ -50,6 +50,7 @@ export class SallaGifting {
|
|
|
50
50
|
this.timeZone = null;
|
|
51
51
|
this.receiverCountryCode = salla.config.get('store.scope.countries')?.[0] || salla.config.get('store.store_country') || 'SA';
|
|
52
52
|
this.hostId = `salla-gifting-${Math.random().toString(36).slice(2, 10)}`;
|
|
53
|
+
this.disableClass = this.gift?.show_image_upload ? '' : 'pointer-events-none';
|
|
53
54
|
/**
|
|
54
55
|
* The form selector to be used to get the form data
|
|
55
56
|
*/
|
|
@@ -106,6 +107,7 @@ export class SallaGifting {
|
|
|
106
107
|
this.sectionBtnText = salla.lang.get('blocks.buy_as_gift.send_as_a_gift');
|
|
107
108
|
this.giftDetails = salla.lang.get('blocks.buy_as_gift.gift_details');
|
|
108
109
|
this.selectGiftMessage = salla.lang.get('blocks.buy_as_gift.select_gift_message');
|
|
110
|
+
this.giftText = salla.lang.get('blocks.buy_as_gift.gift_text');
|
|
109
111
|
this.giftCustomText = salla.lang.get('blocks.buy_as_gift.gift_custom_text');
|
|
110
112
|
this.textId = salla.lang.get('blocks.buy_as_gift.text_id');
|
|
111
113
|
this.incorrectGiftText = salla.lang.get('blocks.buy_as_gift.incorrect_gift_text');
|
|
@@ -175,13 +177,46 @@ export class SallaGifting {
|
|
|
175
177
|
salla.event.dispatch('login::open', { withoutReload: true });
|
|
176
178
|
return;
|
|
177
179
|
}
|
|
180
|
+
this.currentStep = 1;
|
|
181
|
+
this.parentClass = 'is-current-step-1';
|
|
182
|
+
this.step2Animated = false;
|
|
183
|
+
this.selectedText = undefined;
|
|
184
|
+
this.selectedGiftTextOption = undefined;
|
|
185
|
+
this.uploadedImage = undefined;
|
|
186
|
+
this.selectedImage = undefined;
|
|
178
187
|
await this.modal.open();
|
|
179
188
|
// Determine the appropriate method to call based on the `physicalProducts` flag
|
|
180
189
|
const giftDetailsMethod = this.productId ? () => salla.product.getGiftProductDetails(this.productId) : () => salla.cart.getGiftCartDetails();
|
|
181
190
|
return await salla.api.withoutNotifier(giftDetailsMethod)
|
|
182
191
|
.then((response) => {
|
|
183
192
|
this.gift = response.data;
|
|
193
|
+
// Backward-compat: older BE responses omit these visibility flags. Treat a
|
|
194
|
+
// missing flag as enabled so the image/text steps still render until the BE
|
|
195
|
+
// that returns them is deployed. Use `??` so an explicit `false` is preserved.
|
|
196
|
+
this.gift.show_texts = this.gift.show_texts ?? true;
|
|
197
|
+
this.gift.show_images = this.gift.show_images ?? true;
|
|
198
|
+
this.gift.show_custom_text = this.gift.show_custom_text ?? true;
|
|
199
|
+
this.gift.show_image_upload = this.gift.show_image_upload ?? true;
|
|
184
200
|
this.senderName = this.gift.sender_name;
|
|
201
|
+
this.disableClass = this.gift?.show_image_upload ? '' : 'pointer-events-none';
|
|
202
|
+
if (!this.gift.show_texts) {
|
|
203
|
+
this.selectedGiftTextOption = undefined;
|
|
204
|
+
this.selectedText = undefined;
|
|
205
|
+
}
|
|
206
|
+
if (!this.gift.show_images) {
|
|
207
|
+
this.selectedImage = undefined;
|
|
208
|
+
this.uploadedImage = undefined;
|
|
209
|
+
}
|
|
210
|
+
if (this.skipStep1()) {
|
|
211
|
+
this.currentStep = 2;
|
|
212
|
+
this.parentClass = 'is-current-step-2';
|
|
213
|
+
this.step2Animated = true;
|
|
214
|
+
}
|
|
215
|
+
else if (!this.gift.show_images) {
|
|
216
|
+
// the slider lays out asynchronously,
|
|
217
|
+
// so an early measurement would pin it too short and overlap the button.
|
|
218
|
+
this.setWrapperHeight(1, 250, 5);
|
|
219
|
+
}
|
|
185
220
|
})
|
|
186
221
|
.catch(e => {
|
|
187
222
|
this.hasError = true;
|
|
@@ -189,6 +224,9 @@ export class SallaGifting {
|
|
|
189
224
|
})
|
|
190
225
|
.finally(() => this.modal.stopLoading());
|
|
191
226
|
}
|
|
227
|
+
skipStep1() {
|
|
228
|
+
return !!this.gift && !this.gift.show_images && !this.gift.show_texts;
|
|
229
|
+
}
|
|
192
230
|
/**
|
|
193
231
|
*
|
|
194
232
|
* Hide / close the gifting modal window
|
|
@@ -225,39 +263,35 @@ export class SallaGifting {
|
|
|
225
263
|
this.textSelect?.classList.remove('s-form-has-error');
|
|
226
264
|
let dataID = event.target.children[event.target.selectedIndex].getAttribute('data-id');
|
|
227
265
|
let customID = dataID == "custom";
|
|
266
|
+
// Only the custom-text textarea changes the layout; resize the wrapper just
|
|
267
|
+
// when it actually appears/disappears so picking or clearing a normal option
|
|
268
|
+
// doesn't jump the modal height.
|
|
269
|
+
const customVisibilityChanged = this.showGiftText !== customID;
|
|
228
270
|
this.showGiftText = customID;
|
|
229
271
|
if (dataID) {
|
|
230
272
|
this.selectedGiftTextOption = dataID;
|
|
231
273
|
customID ? this.selectedText = undefined : this.selectedText = event.target.value;
|
|
232
|
-
this.setWrapperHeight(1, 150, 5);
|
|
233
274
|
}
|
|
234
275
|
else {
|
|
235
276
|
// empty textarea value
|
|
236
277
|
this.textArea.value = '';
|
|
237
278
|
this.selectedText = undefined;
|
|
238
279
|
this.selectedGiftTextOption = undefined;
|
|
239
|
-
|
|
280
|
+
}
|
|
281
|
+
if (customVisibilityChanged) {
|
|
282
|
+
this.setWrapperHeight(1, 150, 5);
|
|
240
283
|
}
|
|
241
284
|
}
|
|
242
285
|
/**
|
|
243
286
|
*
|
|
244
287
|
* Go to the step 2
|
|
245
288
|
*/
|
|
246
|
-
async goToStep2() {
|
|
247
|
-
if (!this.
|
|
248
|
-
this.textSelect.classList.add('s-form-has-error');
|
|
249
|
-
this.customTextArea.classList.remove('s-form-has-error');
|
|
289
|
+
async goToStep2(withValidation = true) {
|
|
290
|
+
if (!this.step1Elems)
|
|
250
291
|
return;
|
|
251
|
-
|
|
252
|
-
else if (this.selectedGiftTextOption == 'custom' && !this.selectedText) {
|
|
253
|
-
this.textSelect.classList.remove('s-form-has-error');
|
|
254
|
-
this.customTextArea.classList.add('s-form-has-error');
|
|
292
|
+
if (withValidation && !this.validateStep1()) {
|
|
255
293
|
return;
|
|
256
294
|
}
|
|
257
|
-
else {
|
|
258
|
-
this.textSelect.classList.remove('s-form-has-error');
|
|
259
|
-
this.customTextArea.classList.remove('s-form-has-error');
|
|
260
|
-
}
|
|
261
295
|
this.setWrapperHeight(2, 600, 0);
|
|
262
296
|
let stepNextAnime = new anime.timeline();
|
|
263
297
|
stepNextAnime.add({
|
|
@@ -290,6 +324,23 @@ export class SallaGifting {
|
|
|
290
324
|
this.currentStep = 2;
|
|
291
325
|
this.parentClass = `is-current-step-${this.currentStep}`;
|
|
292
326
|
}
|
|
327
|
+
validateStep1() {
|
|
328
|
+
if (!this.gift?.show_texts)
|
|
329
|
+
return true;
|
|
330
|
+
if (!this.selectedGiftTextOption) {
|
|
331
|
+
this.textSelect?.classList.add('s-form-has-error');
|
|
332
|
+
this.customTextArea?.classList.remove('s-form-has-error');
|
|
333
|
+
return false;
|
|
334
|
+
}
|
|
335
|
+
else if (this.selectedGiftTextOption == 'custom' && !this.selectedText) {
|
|
336
|
+
this.textSelect?.classList.remove('s-form-has-error');
|
|
337
|
+
this.customTextArea?.classList.add('s-form-has-error');
|
|
338
|
+
return false;
|
|
339
|
+
}
|
|
340
|
+
this.textSelect?.classList.remove('s-form-has-error');
|
|
341
|
+
this.customTextArea?.classList.remove('s-form-has-error');
|
|
342
|
+
return true;
|
|
343
|
+
}
|
|
293
344
|
/**
|
|
294
345
|
*
|
|
295
346
|
* Go to the step 1
|
|
@@ -332,7 +383,7 @@ export class SallaGifting {
|
|
|
332
383
|
this.parentClass = `is-current-step-${this.currentStep}`;
|
|
333
384
|
}
|
|
334
385
|
getFilepondPlaceholder() {
|
|
335
|
-
return `<div class="s-gifting-filepond-placeholder"><span class="s-gifting-filepond-placeholder-icon">${Images}</span><p class="s-gifting-filepond-placeholder-text">${this.selectImageOrUpload ? this.selectImageOrUpload :
|
|
386
|
+
return `<div class="s-gifting-filepond-placeholder"><span class="s-gifting-filepond-placeholder-icon">${Images}</span><p class="s-gifting-filepond-placeholder-text">${this.selectImageOrUpload && this.gift.show_image_upload ? this.selectImageOrUpload : this.selectImageForYourGift}</p></div>`;
|
|
336
387
|
}
|
|
337
388
|
setPreview(image) {
|
|
338
389
|
this.uploader?.classList.add('has-bg');
|
|
@@ -342,7 +393,7 @@ export class SallaGifting {
|
|
|
342
393
|
bg.style.backgroundImage = "url('" + image.url + "')";
|
|
343
394
|
this.uploader?.querySelector('.filepond--root')?.appendChild(bg);
|
|
344
395
|
this.uploadedImage = image.url;
|
|
345
|
-
if (!!this.gift && this.gift.gift_images
|
|
396
|
+
if (!!this.gift && this.gift.gift_images?.length) {
|
|
346
397
|
this.setWrapperHeight(1, 150, 0);
|
|
347
398
|
}
|
|
348
399
|
}
|
|
@@ -355,7 +406,7 @@ export class SallaGifting {
|
|
|
355
406
|
}
|
|
356
407
|
handleTextAreaChange(event) {
|
|
357
408
|
this.selectedText = event.target.value;
|
|
358
|
-
this.customTextArea
|
|
409
|
+
this.customTextArea?.classList.remove('s-form-has-error');
|
|
359
410
|
}
|
|
360
411
|
clearError(key) {
|
|
361
412
|
if (this.errors?.[key]) {
|
|
@@ -506,13 +557,13 @@ export class SallaGifting {
|
|
|
506
557
|
}
|
|
507
558
|
handleUploadImage(img) {
|
|
508
559
|
this.uploadedImage = img;
|
|
509
|
-
if (!!this.gift && this.gift.gift_images
|
|
560
|
+
if (!!this.gift && this.gift.gift_images?.length) {
|
|
510
561
|
this.setWrapperHeight(1, 150, 0);
|
|
511
562
|
}
|
|
512
563
|
}
|
|
513
564
|
handleRemoveImage() {
|
|
514
565
|
this.uploadedImage = '';
|
|
515
|
-
if (!!this.gift && this.gift.gift_images
|
|
566
|
+
if (!!this.gift && this.gift.gift_images?.length) {
|
|
516
567
|
this.setWrapperHeight(1, 150, 0);
|
|
517
568
|
}
|
|
518
569
|
}
|
|
@@ -646,16 +697,19 @@ export class SallaGifting {
|
|
|
646
697
|
}
|
|
647
698
|
render() {
|
|
648
699
|
return [
|
|
649
|
-
h("div", { key: '
|
|
700
|
+
h("div", { key: 'fdb6b68a052a9fa0a0d527edb25e3d7783cc47e9' }, h("salla-list-tile", { key: '3cfb7f37df96e924af7f977fd17f4161e40f83fe', class: this.generateClass() }, h("div", { key: '291a27d70bc43d6edac5c5838d93eaa6a51fb84a', slot: "title" }, this.vertical ? h("span", { innerHTML: GiftSharing }) : '', h("h3", { key: 'c49f119d84a279338c4478872883ba7356e118ce' }, !!this.widgetTitle ? this.widgetTitle : this.sectionTitle)), h("div", { key: '2ccfb84620132477c0845ffc0bbc257c350cdeb9', slot: "subtitle" }, h("div", { key: '2840a426b505f7fe7ac5c285ab9b74ca4f99ab55' }, !!this.widgetSubtitle ? this.widgetSubtitle : this.sectionSubtitle)), h("div", { key: 'e3560b1bc8a6c062417f3e2b7a91b5b20b4e1880', slot: "action" }, h("salla-button", { key: '5d96fb354f2845955344d782e693fe27a0fa2652', color: "primary", fill: "outline", width: "wide", class: "s-gifting-widget-action", onClick: () => this.handleGiftButtonClick() }, h("slot", { key: '384ab549dc1942a600cc37c4df26008a8a05e9ab', name: "widget-btn-content" }, h("div", { key: '80d83cd6296f2e93ebbc0eada8737d65c76e4ce0', class: "s-gifting-widget-action-content" }, h("span", { key: '69f6686f6fe23bdab891ab12b295cf918ba0a8fb', innerHTML: GiftSharing }), " \u00A0", h("span", { key: '495c9e9b10dcb69a1335d0345d42a8323b52abef' }, this.sectionBtnText)))))), h("salla-modal", { key: '303a208c394aa2c91f2273b3909208c29266b490', id: this.hostId, isLoading: true, class: "s-gifting-modal", width: "sm", ref: modal => this.modal = modal }, h("div", { key: '985a4d292ea01cb7ff48b443afe854de6f293abf', slot: "loading" }, h("div", { key: 'ba2b61f3bebf33d04d7132a00d3334a35042646a', class: "s-gifting-skeleton" }, h("div", { key: '4c8d2a5f128407423fd0c3070907d7781fb92283', class: "s-gifting-modal-header" }, h("salla-skeleton", { key: '8585263f0bcb523a5b537c3b13f9c2a0a3a898d0', type: 'circle', height: '5rem', width: '5rem' }), h("h2", { key: 'dbd2c3efbe5c91563275c09efd832709b6ed6748', class: "s-gifting-modal-title" }, h("div", { key: '4885e29c71001b530be33a4cf585fd77cf434dfd', class: "s-gifting-modal-badge-wrapper" }, h("salla-skeleton", { key: '6c248a65bcc92c51555f0dd8f6d10c6f9d4a2b9a', height: '15px', width: '150px' })))), h("div", { key: '07de64586572cea82b2561344b5922ad4f7cb2c1', class: "s-gifting-skeleton-content" }, h("salla-skeleton", { key: '9a9e45772c6f5ce30a19ebcb53405032dfc25862', height: '10px', width: '150px' }), h("salla-skeleton", { key: 'd1165987504fb2e5a7d013118b6ca5db2bf1523c', height: '230px' }), h("salla-skeleton", { key: '33cc657831541bcf6916c54c8dffca3b9933ccbb', height: '10px', width: '150px' }), h("salla-skeleton", { key: '46ff78b7725c57c955c73e9a71b9bf1c7340a354', height: '30px' }), h("salla-skeleton", { key: '520bd0a02c0bf4ef6109f014856dfad71d779aca', height: '40px' })))), h("slot", { key: '5519fd6df4f911b042f68f6825a563ce92f16733', name: "header" }), !!this.hasError ?
|
|
650
701
|
h("salla-placeholder", { alignment: "center" }, h("span", { slot: "title" }, this.errorMessage || salla.lang.get('common.errors.empty_results')), h("span", { slot: "description" }, " "))
|
|
651
702
|
:
|
|
652
703
|
[
|
|
653
|
-
h("div", { class: "s-gifting-modal-header" }, h("span", { class: "s-gifting-modal-icon" }, h("span", { innerHTML: GiftSharing })), h("h2", { class: "s-gifting-modal-title" }, h("div", { class: "s-gifting-modal-badge-wrapper" }, h("div", { class: "s-gifting-modal-badge" }, h("span", null, h("span", null, this.currentStep), "/2")), h("span", null, this.giftDetails)))),
|
|
654
|
-
h("div", { class: "s-gifting-steps-wrapper " + this.parentClass, ref: el => this.stepsWrapper = el }, h("div", { class: "s-gifting-step-one gift-step-1", ref: el => this.step1Elems = el },
|
|
655
|
-
h("
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
704
|
+
h("div", { class: "s-gifting-modal-header" }, h("span", { class: "s-gifting-modal-icon" }, h("span", { innerHTML: GiftSharing })), h("h2", { class: "s-gifting-modal-title" }, h("div", { class: "s-gifting-modal-badge-wrapper" }, !this.skipStep1() && h("div", { class: "s-gifting-modal-badge" }, h("span", null, h("span", null, this.currentStep), "/2")), h("span", null, this.giftDetails)))),
|
|
705
|
+
h("div", { class: "s-gifting-steps-wrapper " + this.parentClass, ref: el => this.stepsWrapper = el }, !this.skipStep1() && h("div", { class: "s-gifting-step-one gift-step-1", ref: el => this.step1Elems = el }, this.gift && this.gift.show_images &&
|
|
706
|
+
h("div", { class: "s-gifting-modal-uploader-title anime-item" }, this.selectImageForYourGift), this.gift && this.gift.show_images &&
|
|
707
|
+
h("div", { class: "s-gifting-image-section" }, h("div", { class: `s-gifting-modal-uploader anime-item ${this.disableClass}`, ref: el => this.uploader = el }, h("span", { class: "s-gifting-remove-preview pointer-events-auto", onClick: () => this.removePreview(), innerHTML: Cancel }), this.selectImageOrUpload && this.gift && h("salla-file-upload", { "instant-upload": true, name: "image_url", url: salla.url.api(salla.product.api.getUrl('giftImage')), onUploaded: event => this.handleUploadImage(event.detail), labelIdle: this.getFilepondPlaceholder(), onRemoved: () => this.handleRemoveImage() })), h("div", { class: "anime-item" }, !this.uploadedImage && !!this.gift && !!this.gift.gift_images && this.gift.gift_images.length > 0 ?
|
|
708
|
+
h("salla-slider", { id: "gifting-slider", loop: false, "controls-outer": true, class: "s-gifting-slider", type: "carousel" }, h("div", { slot: "items" }, this.gift && this.gift.gift_images ?
|
|
709
|
+
this.gift?.gift_images.map((item) => h("a", { class: "s-gifting-clickable s-gifting-image", onClick: () => this.setPreview(item) }, h("img", { src: item.url, alt: `${item.id}` }))) : ''))
|
|
710
|
+
: "")), this.gift && this.gift.show_texts ?
|
|
711
|
+
h("div", { class: "anime-item" }, h("div", { class: "s-gifting-modal-uploader-title s-gifting-text-title" }, this.giftText), h("div", { class: "s-form-group s-gifting-selectText", ref: el => this.textSelect = el }, h("select", { id: "gift-text-selection", name: "gift-text-selection", class: "s-form-control s-gifting-select", onChange: e => this.toggleGiftText(e) }, h("option", { "data-id": null, selected: true }, this.selectGiftMessage), this.gift && this.gift.gift_texts ?
|
|
712
|
+
this.gift?.gift_texts.map((txt) => h("option", { "data-id": txt.id, value: txt.text, key: txt.id }, txt.text)) : '', this.gift && this.gift.show_custom_text ? h("option", { "data-id": "custom" }, this.giftCustomText) : null)), h("div", { class: this.showGiftText && this.gift && this.gift.show_custom_text ? "s-form-group s-gifting-textarea shown" : "s-form-group s-gifting-textarea hide", ref: (el) => this.customTextArea = el }, h("label", { htmlFor: "gift-custom-text", class: "s-form-label" }, this.giftCustomText), h("div", { class: "mt-1" }, h("textarea", { onInput: (event) => this.handleTextAreaChange(event), rows: 4, ref: (el) => this.textArea = el, name: "gift-custom-text", id: "gift-custom-text", class: "s-form-control" })))) : null, h("div", { class: "anime-item" }, h("salla-button", { color: "primary", width: "wide", onClick: () => this.goToStep2(!!this.gift?.show_texts) }, h("span", null, this.nextStep)))), h("div", { class: "s-gifting-step-two gift-step-2", style: this.skipStep1() ? { opacity: '1', transform: 'translateX(0)', position: 'relative' } : undefined, ref: el => this.step2Elems = el }, h("div", { class: this.step2ItemClass(this.errors?.['sender_name'] ? 's-form-group s-form-has-error' : 's-form-group') }, h("label", { htmlFor: "sender_name", class: "s-form-label" }, this.senderNameLabel), h("input", { type: "text", class: "s-form-control", name: "sender_name", id: "sender_name", value: this.senderName, onInput: (event) => this.handleSenderName(event), placeholder: "" }), this.errors && this.errors['sender_name'] ?
|
|
659
713
|
h("span", { class: "s-gifting-error" }, this.errors['sender_name']) : ''), h("div", { class: this.step2ItemClass(this.errors?.['receiver.name'] ? 's-form-group s-form-has-error' : 's-form-group') }, h("label", { htmlFor: "receiver_name", class: "s-form-label" }, this.receiverNameFieldLabel), h("input", { type: "text", class: "s-form-control", name: "receiver_name", id: "receiver_name", value: "", onInput: (event) => this.handleReceiverName(event), placeholder: "" }), this.errors && this.errors['receiver.name'] ?
|
|
660
714
|
h("span", { class: "s-gifting-error" }, this.errors['receiver.name']) : ''), h("div", { class: this.step2ItemClass(this.errors?.['receiver.mobile'] ? 's-form-group s-form-has-error' : 's-form-group') }, h("label", { class: "s-form-label" }, this.receiverMobileFieldLabel), h("salla-tel-input", { class: "s-gifting-tel-input", phone: this.receiverMobile, countryCode: this.receiverCountryCode, onPhoneEntered: (e) => this.handlePhoneInputChange(e) }), this.errors && this.errors['receiver.mobile'] ?
|
|
661
715
|
h("span", { class: "s-gifting-error" }, this.errors['receiver.mobile']) : ''), this.isPhysical() &&
|
|
@@ -665,8 +719,8 @@ export class SallaGifting {
|
|
|
665
719
|
h("span", { class: "s-gifting-error" }, this.errors['receiver.region']) : ''), this.isPhysical() &&
|
|
666
720
|
h("div", { class: this.step2ItemClass(this.errors?.['receiver.city_id'] ? 's-form-group s-form-has-error' : 's-form-group') }, h("label", { class: "s-form-label", htmlFor: `${this.hostId}-city` }, this.receiverCityFieldLabel), h("salla-searchable-dropdown", { placeholder: this.selectCity, items: this.displayedCities, selectedItem: this.selectedCity, loading: this.loadingCities, searching: this.searchingCities, disabled: this.loadingCities || (this.isKSA && !this.selectedRegionId), required: true, inputId: `${this.hostId}-city`, searchQuery: this.citySearchQuery, clientSearch: !this.enableCityAjaxSearch, dropUp: true, keepParentScroll: true, onItemSelected: (e) => this.handleCitySelected(e.detail), onSearchInput: (e) => this.handleCitySearch(e.detail), onDropdownClosed: () => this.handleCityDropdownClosed() }), this.errors && this.errors['receiver.city_id'] ?
|
|
667
721
|
h("span", { class: "s-gifting-error" }, this.errors['receiver.city_id']) : ''), this.isPhysical() &&
|
|
668
|
-
h("div", { class: this.step2ItemClass('s-gifting-info') }, h("span", { innerHTML: Alert }), h("span", null, this.selectCityInfo)), !this.isPhysical() && h("div", { class: this.step2ItemClass() }, h("label", { class: "s-gifting-schedule s-gifting-clickable", htmlFor: `schedule-${this.hostId}` }, h("input", { type: "checkbox", name: 'schedule', id: `schedule-${this.hostId}`, onChange: () => this.toggleCalendar(), class: "s-checkbox" }), h("span", { class: "s-form-label" }, " ", this.sendLater, " "))), h("div", { class: this.getCalendarClasses(), ref: (el) => this.calendarFormGroup = el }, h("label", { class: "s-form-label" }, this.selectSendDateAndTime), h("salla-datetime-picker", { value: this.deliveryDate, placeholder: this.selectSendDateAndTime, "enable-time": true, "date-format": "Y-m-d h:i K", onPicked: (event) => this.handleDateTimePicker(event) }), h("span", { class: "s-gifting-calendar-hint" }, this.canNotEditOrderAfterSelectDate)), h("div", { class: this.step2ItemClass('s-gifting-step-two-footer') }, h("a", { href: "#!", innerHTML: LeftArrow, onClick: (e) => this.goToStep1(e) }), h("salla-button", { onClick: () => this.submitForm(), color: "primary", width: 'wide' }, h("span", null, this.sendGift)))))
|
|
669
|
-
], h("slot", { key: '
|
|
722
|
+
h("div", { class: this.step2ItemClass('s-gifting-info') }, h("span", { innerHTML: Alert }), h("span", null, this.selectCityInfo)), !this.isPhysical() && h("div", { class: this.step2ItemClass() }, h("label", { class: "s-gifting-schedule s-gifting-clickable", htmlFor: `schedule-${this.hostId}` }, h("input", { type: "checkbox", name: 'schedule', id: `schedule-${this.hostId}`, onChange: () => this.toggleCalendar(), class: "s-checkbox" }), h("span", { class: "s-form-label" }, " ", this.sendLater, " "))), h("div", { class: this.getCalendarClasses(), ref: (el) => this.calendarFormGroup = el }, h("label", { class: "s-form-label" }, this.selectSendDateAndTime), h("salla-datetime-picker", { value: this.deliveryDate, placeholder: this.selectSendDateAndTime, "enable-time": true, "date-format": "Y-m-d h:i K", onPicked: (event) => this.handleDateTimePicker(event) }), h("span", { class: "s-gifting-calendar-hint" }, this.canNotEditOrderAfterSelectDate)), h("div", { class: this.step2ItemClass('s-gifting-step-two-footer') }, !this.skipStep1() && h("a", { href: "#!", innerHTML: LeftArrow, onClick: (e) => this.goToStep1(e) }), h("salla-button", { onClick: () => this.submitForm(), color: "primary", width: 'wide' }, h("span", null, this.sendGift)))))
|
|
723
|
+
], h("slot", { key: '9413ec459b3b5dc137a90979990022b7ec1c6453', name: "footer" })))
|
|
670
724
|
];
|
|
671
725
|
}
|
|
672
726
|
static get is() { return "salla-gifting"; }
|
|
@@ -827,6 +881,7 @@ export class SallaGifting {
|
|
|
827
881
|
"selectImageForYourGift": {},
|
|
828
882
|
"selectImageOrUpload": {},
|
|
829
883
|
"selectGiftMessage": {},
|
|
884
|
+
"giftText": {},
|
|
830
885
|
"giftCustomText": {},
|
|
831
886
|
"textId": {},
|
|
832
887
|
"incorrectGiftText": {},
|
|
@@ -887,6 +942,7 @@ export class SallaGifting {
|
|
|
887
942
|
"receiverCountryCode": {},
|
|
888
943
|
"receiverEmail": {},
|
|
889
944
|
"hostId": {},
|
|
945
|
+
"disableClass": {},
|
|
890
946
|
"receiverCity": {}
|
|
891
947
|
};
|
|
892
948
|
}
|
|
@@ -932,8 +988,12 @@ export class SallaGifting {
|
|
|
932
988
|
},
|
|
933
989
|
"goToStep2": {
|
|
934
990
|
"complexType": {
|
|
935
|
-
"signature": "() => Promise<void>",
|
|
936
|
-
"parameters": [
|
|
991
|
+
"signature": "(withValidation?: boolean) => Promise<void>",
|
|
992
|
+
"parameters": [{
|
|
993
|
+
"name": "withValidation",
|
|
994
|
+
"type": "boolean",
|
|
995
|
+
"docs": ""
|
|
996
|
+
}],
|
|
937
997
|
"references": {
|
|
938
998
|
"Promise": {
|
|
939
999
|
"location": "global",
|
|
@@ -56,7 +56,8 @@ export class SallaLoginModal {
|
|
|
56
56
|
}
|
|
57
57
|
componentDidLoad() {
|
|
58
58
|
window.addEventListener('message', (event) => {
|
|
59
|
-
|
|
59
|
+
// Trust only our login iframe/passkey popup at the accounts origin.
|
|
60
|
+
if (!this.isTrustedMessage(event) || event.data?.source != "login") {
|
|
60
61
|
return;
|
|
61
62
|
}
|
|
62
63
|
if (!this.inline && !this.canRenderIframe) {
|
|
@@ -133,6 +134,8 @@ export class SallaLoginModal {
|
|
|
133
134
|
return window.location.reload();
|
|
134
135
|
}
|
|
135
136
|
if (action === 'open_page') {
|
|
137
|
+
if (!this.isSafeUrl(value?.url))
|
|
138
|
+
return;
|
|
136
139
|
return window.location.href = value.url;
|
|
137
140
|
}
|
|
138
141
|
if (action === 'open_passkey_page') {
|
|
@@ -245,6 +248,33 @@ export class SallaLoginModal {
|
|
|
245
248
|
}
|
|
246
249
|
withCartReset && Salla.cart.reset();
|
|
247
250
|
}
|
|
251
|
+
// Accept postMessage only from our own login iframe/passkey popup at the accounts origin.
|
|
252
|
+
isTrustedMessage(event) {
|
|
253
|
+
const fromIframe = !!this.iframe && event.source === this.iframe.contentWindow;
|
|
254
|
+
const fromPasskey = !!this.createPassKey && event.source === this.createPassKey;
|
|
255
|
+
if (!fromIframe && !fromPasskey)
|
|
256
|
+
return false;
|
|
257
|
+
let origin;
|
|
258
|
+
try {
|
|
259
|
+
origin = new URL(salla.config.get('login.url', 'https://accounts.salla.com')).origin;
|
|
260
|
+
}
|
|
261
|
+
catch (e) {
|
|
262
|
+
origin = 'https://accounts.salla.com';
|
|
263
|
+
}
|
|
264
|
+
return event.origin === origin;
|
|
265
|
+
}
|
|
266
|
+
// Reject javascript:/data: and other non-http(s) navigation targets.
|
|
267
|
+
isSafeUrl(url) {
|
|
268
|
+
if (typeof url !== 'string' || !url)
|
|
269
|
+
return false;
|
|
270
|
+
try {
|
|
271
|
+
const { protocol } = new URL(url, location.href);
|
|
272
|
+
return protocol === 'https:' || protocol === 'http:';
|
|
273
|
+
}
|
|
274
|
+
catch (e) {
|
|
275
|
+
return false;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
248
278
|
sendMessageToIframe(message) {
|
|
249
279
|
if (!this.iframe)
|
|
250
280
|
return;
|