@salla.sa/twilight-components 2.14.467 → 2.14.468
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-C1SAyrFq.js} +1 -1
- package/dist/cjs/{filepond-plugin-file-poster-CXgEvsrj.js → filepond-plugin-file-poster-DAhQ7rGa.js} +1 -1
- package/dist/cjs/{filepond-plugin-file-validate-size-DISjKBXN.js → filepond-plugin-file-validate-size-qfwxpApK.js} +1 -1
- package/dist/cjs/{filepond-plugin-file-validate-type-BeDqb2RU.js → filepond-plugin-file-validate-type-BbYanfPf.js} +1 -1
- package/dist/cjs/{filepond-plugin-image-edit-CTKgasCY.js → filepond-plugin-image-edit-lWdFhMNt.js} +1 -1
- package/dist/cjs/{filepond-plugin-image-exif-orientation-BqvyVbfM.js → filepond-plugin-image-exif-orientation-C2wUYBSb.js} +1 -1
- package/dist/cjs/{filepond-plugin-image-preview-DfX-wD-s.js → filepond-plugin-image-preview-B1ukjrjT.js} +1 -1
- package/dist/cjs/{functions-DXNacMtu.js → functions-DCSgyun2.js} +1 -1
- package/dist/cjs/{index-JuURs8Nc.js → index-CXr_39D8.js} +9 -5
- package/dist/cjs/{index-2n84VIdz.js → index-D3oJJZKW.js} +1 -1
- 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 +63 -28
- 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-BsYRgTGD.js} +1 -1
- package/dist/cjs/twilight.cjs.js +2 -2
- package/dist/cjs/{vanilla-picker-Cj5ogibZ.js → vanilla-picker-DkdzTjSC.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.js +69 -29
- 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 +63 -27
- 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-C4pZr9nR.js} +1 -1
- package/dist/esm/{filepond-plugin-file-poster-CVurRtjC.js → filepond-plugin-file-poster-CXpAGxT4.js} +1 -1
- package/dist/esm/{filepond-plugin-file-validate-size-Dw2xFbfx.js → filepond-plugin-file-validate-size-Dk4M6ge1.js} +1 -1
- package/dist/esm/{filepond-plugin-file-validate-type-D6seJVa2.js → filepond-plugin-file-validate-type-DD7qvRsg.js} +1 -1
- package/dist/esm/{filepond-plugin-image-edit-CBikW78V.js → filepond-plugin-image-edit-DMllAEkg.js} +1 -1
- package/dist/esm/{filepond-plugin-image-exif-orientation-5yNhe9TO.js → filepond-plugin-image-exif-orientation-BRCbcu_E.js} +1 -1
- package/dist/esm/{filepond-plugin-image-preview-PlAAXB7f.js → filepond-plugin-image-preview-DgeylrwN.js} +1 -1
- package/dist/esm/{functions-Egzz8fEM.js → functions-DrS7by6t.js} +1 -1
- package/dist/esm/{index-Do4FV1UZ.js → index-9SnsJoYO.js} +1 -1
- package/dist/esm/{index-a4x9urdK.js → index-D2yBy7Jh.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 +63 -28
- 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-CTcAqNfZ.js} +1 -1
- package/dist/esm/twilight.js +3 -3
- package/dist/esm/{vanilla-picker-DB0pDHa7.js → vanilla-picker-DfeK45Yv.js} +1 -1
- package/dist/twilight/{p-61b1fd3b.entry.js → p-07af3286.entry.js} +1 -1
- package/dist/twilight/{p-ee605cef.entry.js → p-08337b2b.entry.js} +1 -1
- package/dist/twilight/{p-74a61155.entry.js → p-08771dff.entry.js} +1 -1
- package/dist/twilight/{p-13a033fa.entry.js → p-0e1bab4f.entry.js} +1 -1
- package/dist/twilight/{p-b0bf7a5b.entry.js → p-0eadca17.entry.js} +1 -1
- package/dist/twilight/{p-92b02f3c.entry.js → p-12ccc1ab.entry.js} +1 -1
- package/dist/twilight/{p-52fe97c8.entry.js → p-1574176e.entry.js} +1 -1
- package/dist/twilight/{p-0957f323.entry.js → p-17015f9c.entry.js} +1 -1
- package/dist/twilight/{p-b8ab7da8.entry.js → p-1920b702.entry.js} +1 -1
- package/dist/twilight/{p-91363b7e.entry.js → p-1a1cebfa.entry.js} +1 -1
- package/dist/twilight/{p-1130d4b7.entry.js → p-1a844fda.entry.js} +1 -1
- package/dist/twilight/{p-42a0b54a.entry.js → p-1b7ebf47.entry.js} +1 -1
- package/dist/twilight/{p-e726123e.entry.js → p-223d7ceb.entry.js} +1 -1
- package/dist/twilight/{p-ff270706.entry.js → p-255f5d2a.entry.js} +1 -1
- package/dist/twilight/{p-0da78d4e.entry.js → p-266f57de.entry.js} +1 -1
- package/dist/twilight/p-28bdf8ec.entry.js +4 -0
- package/dist/twilight/{p-fbfacb11.entry.js → p-2c7086ec.entry.js} +1 -1
- package/dist/twilight/{p-d33203b7.entry.js → p-2c7f524a.entry.js} +1 -1
- package/dist/twilight/{p-c60c302f.entry.js → p-30ea9a82.entry.js} +1 -1
- package/dist/twilight/{p-b80adb19.entry.js → p-313d38cd.entry.js} +1 -1
- package/dist/twilight/{p-241bd42e.entry.js → p-315ce27b.entry.js} +1 -1
- package/dist/twilight/p-378d45e2.entry.js +4 -0
- package/dist/twilight/p-3c2fe8cd.entry.js +4 -0
- package/dist/twilight/{p-d905fbca.entry.js → p-3d1e7982.entry.js} +1 -1
- package/dist/twilight/{p-a068fff4.entry.js → p-3d7c0ac6.entry.js} +1 -1
- package/dist/twilight/{p-c0380d40.entry.js → p-3d8d289e.entry.js} +1 -1
- package/dist/twilight/{p-f6bb956c.entry.js → p-4144c908.entry.js} +1 -1
- package/dist/twilight/{p-5b365561.entry.js → p-453a7bb2.entry.js} +1 -1
- package/dist/twilight/{p-6d87b134.entry.js → p-4c457ba5.entry.js} +1 -1
- package/dist/twilight/{p-735fafef.entry.js → p-4d3bcacd.entry.js} +1 -1
- package/dist/twilight/{p-d9d4ea5b.entry.js → p-4dedb514.entry.js} +1 -1
- package/dist/twilight/{p-0b169d4e.entry.js → p-50dfec0a.entry.js} +1 -1
- package/dist/twilight/{p-1ce817c2.entry.js → p-53f83426.entry.js} +1 -1
- package/dist/twilight/{p-afcb0117.entry.js → p-54e9ac89.entry.js} +1 -1
- package/dist/twilight/{p-35ac1fc9.entry.js → p-571b8e00.entry.js} +1 -1
- package/dist/twilight/{p-9dc0fec4.entry.js → p-5a5057a8.entry.js} +1 -1
- package/dist/twilight/{p-ec073354.entry.js → p-5a9b94f8.entry.js} +1 -1
- package/dist/twilight/{p-9b639078.entry.js → p-5c1c520a.entry.js} +1 -1
- package/dist/twilight/{p-f170aff7.entry.js → p-5d06fe77.entry.js} +1 -1
- package/dist/twilight/{p-ec5ae058.entry.js → p-5e433652.entry.js} +1 -1
- package/dist/twilight/{p-b0ed6a9f.entry.js → p-6046666d.entry.js} +1 -1
- package/dist/twilight/{p-10e0936d.entry.js → p-67e23040.entry.js} +1 -1
- package/dist/twilight/{p-fa039238.entry.js → p-6c777951.entry.js} +1 -1
- package/dist/twilight/{p-53cbb271.entry.js → p-749dbf27.entry.js} +1 -1
- package/dist/twilight/p-7bd464f3.entry.js +4 -0
- package/dist/twilight/{p-c8fd03c0.entry.js → p-7ffc1711.entry.js} +1 -1
- package/dist/twilight/{p-89f11893.entry.js → p-83b6c374.entry.js} +1 -1
- package/dist/twilight/{p-bfbf8121.entry.js → p-8b5d26d3.entry.js} +1 -1
- package/dist/twilight/{p-92f3ea44.entry.js → p-9a0514dd.entry.js} +1 -1
- package/dist/twilight/{p-f5135cb5.entry.js → p-9ba953ab.entry.js} +1 -1
- package/dist/twilight/{p-BVqg7xd9.js → p-BGpAIcg-.js} +1 -1
- package/dist/twilight/{p-fCaOxwGH.js → p-BHkz1ssL.js} +1 -1
- package/dist/twilight/{p-CsMnvJkR.js → p-BZhp8a87.js} +1 -1
- package/dist/twilight/p-Bo1nXenO.js +4 -0
- package/dist/twilight/{p-D9ni3BuG.js → p-BojnM4VS.js} +1 -1
- package/dist/twilight/{p-B7KW0zhB.js → p-CBU9I-zy.js} +1 -1
- package/dist/twilight/{p-pOgjUtf9.js → p-CGd7EQZr.js} +1 -1
- package/dist/twilight/{p-EPfEwqOC.js → p-D01LipFK.js} +1 -1
- package/dist/twilight/{p-a4x9urdK.js → p-D2yBy7Jh.js} +2 -2
- package/dist/twilight/{p-DiWHgCMH.js → p-DSgSJMud.js} +1 -1
- package/dist/twilight/{p-DLNIOD9t.js → p-DzAIgzdz.js} +1 -1
- package/dist/twilight/{p-fe506679.entry.js → p-a0d88c4d.entry.js} +1 -1
- package/dist/twilight/{p-f684d7bf.entry.js → p-a2b53a52.entry.js} +1 -1
- package/dist/twilight/{p-78020271.entry.js → p-a3e1fafc.entry.js} +1 -1
- package/dist/twilight/{p-fdde8399.entry.js → p-a463d567.entry.js} +1 -1
- package/dist/twilight/{p-ba1199ba.entry.js → p-a6a9e398.entry.js} +1 -1
- package/dist/twilight/{p-0405f5e8.entry.js → p-a79f60e6.entry.js} +1 -1
- package/dist/twilight/{p-0bdf58a4.entry.js → p-aadfd70e.entry.js} +1 -1
- package/dist/twilight/{p-ad19661d.entry.js → p-ad0a27e2.entry.js} +1 -1
- package/dist/twilight/{p-e90d18b2.entry.js → p-ae8bd2e7.entry.js} +1 -1
- package/dist/twilight/{p-d17596ff.entry.js → p-af121bbf.entry.js} +1 -1
- package/dist/twilight/p-b0f28806.entry.js +4 -0
- package/dist/twilight/{p-0b1970c2.entry.js → p-b3f6b725.entry.js} +1 -1
- package/dist/twilight/{p-1a37b959.entry.js → p-b7e720e8.entry.js} +1 -1
- package/dist/twilight/{p-a53d5944.entry.js → p-b80016c8.entry.js} +1 -1
- package/dist/twilight/{p-635347c9.entry.js → p-c0f40eea.entry.js} +1 -1
- package/dist/twilight/p-c4bc10c1.entry.js +4 -0
- package/dist/twilight/p-c637b6bb.entry.js +4 -0
- package/dist/twilight/{p-127ee640.entry.js → p-c6e18746.entry.js} +1 -1
- package/dist/twilight/{p-5803c158.entry.js → p-cb855cb3.entry.js} +1 -1
- package/dist/twilight/{p-4d393389.entry.js → p-cbc44b3e.entry.js} +1 -1
- package/dist/twilight/{p-6d47892b.entry.js → p-cbf547f0.entry.js} +1 -1
- package/dist/twilight/{p-e27363dd.entry.js → p-cebad615.entry.js} +1 -1
- package/dist/twilight/{p-316135f8.entry.js → p-cfd910a8.entry.js} +1 -1
- package/dist/twilight/{p-d0340e11.entry.js → p-d0a8b9be.entry.js} +1 -1
- package/dist/twilight/{p-59f7f014.entry.js → p-d0cae7da.entry.js} +1 -1
- package/dist/twilight/{p-03d13b9f.entry.js → p-d861eea6.entry.js} +1 -1
- package/dist/twilight/p-daa9c0b3.entry.js +4 -0
- package/dist/twilight/{p-59f815bc.entry.js → p-db43fa93.entry.js} +1 -1
- package/dist/twilight/{p-e1205d19.entry.js → p-e06a7e19.entry.js} +1 -1
- package/dist/twilight/{p-0c748664.entry.js → p-e34f68e0.entry.js} +1 -1
- package/dist/twilight/{p-08b2c781.entry.js → p-e4cac2a9.entry.js} +1 -1
- package/dist/twilight/{p-056400a1.entry.js → p-e5de1833.entry.js} +1 -1
- package/dist/twilight/{p-fa1cc092.entry.js → p-e80ee5b0.entry.js} +6 -6
- package/dist/twilight/{p-16bcc5ab.entry.js → p-e8ffc069.entry.js} +1 -1
- package/dist/twilight/{p-2bcfb4f3.entry.js → p-ee8c7a5a.entry.js} +1 -1
- package/dist/twilight/p-f0dedf42.entry.js +4 -0
- package/dist/twilight/{p-37457147.entry.js → p-f3a01895.entry.js} +1 -1
- package/dist/twilight/{p-ef8fb222.entry.js → p-fb56a444.entry.js} +1 -1
- package/dist/twilight/{p-e8a82952.entry.js → p-fe1bced4.entry.js} +1 -1
- package/dist/twilight/{p-DSBkBAFI.js → p-paiaALkJ.js} +1 -1
- package/dist/twilight/{p-CkA6UKAD.js → p-xz8gqXL9.js} +1 -1
- 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 +4 -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-3fbd88d0.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-9df5c9a7.entry.js +0 -4
- package/dist/twilight/p-C4aFleDM.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
|
@@ -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 ?? '';
|
|
@@ -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
|
*/
|
|
@@ -175,6 +176,13 @@ export class SallaGifting {
|
|
|
175
176
|
salla.event.dispatch('login::open', { withoutReload: true });
|
|
176
177
|
return;
|
|
177
178
|
}
|
|
179
|
+
this.currentStep = 1;
|
|
180
|
+
this.parentClass = 'is-current-step-1';
|
|
181
|
+
this.step2Animated = false;
|
|
182
|
+
this.selectedText = undefined;
|
|
183
|
+
this.selectedGiftTextOption = undefined;
|
|
184
|
+
this.uploadedImage = undefined;
|
|
185
|
+
this.selectedImage = undefined;
|
|
178
186
|
await this.modal.open();
|
|
179
187
|
// Determine the appropriate method to call based on the `physicalProducts` flag
|
|
180
188
|
const giftDetailsMethod = this.productId ? () => salla.product.getGiftProductDetails(this.productId) : () => salla.cart.getGiftCartDetails();
|
|
@@ -182,6 +190,20 @@ export class SallaGifting {
|
|
|
182
190
|
.then((response) => {
|
|
183
191
|
this.gift = response.data;
|
|
184
192
|
this.senderName = this.gift.sender_name;
|
|
193
|
+
this.disableClass = this.gift?.show_image_upload ? '' : 'pointer-events-none';
|
|
194
|
+
if (!this.gift.show_texts) {
|
|
195
|
+
this.selectedGiftTextOption = undefined;
|
|
196
|
+
this.selectedText = undefined;
|
|
197
|
+
}
|
|
198
|
+
if (!this.gift.show_images) {
|
|
199
|
+
this.selectedImage = undefined;
|
|
200
|
+
this.uploadedImage = undefined;
|
|
201
|
+
}
|
|
202
|
+
if (this.skipStep1()) {
|
|
203
|
+
this.currentStep = 2;
|
|
204
|
+
this.parentClass = 'is-current-step-2';
|
|
205
|
+
this.step2Animated = true;
|
|
206
|
+
}
|
|
185
207
|
})
|
|
186
208
|
.catch(e => {
|
|
187
209
|
this.hasError = true;
|
|
@@ -189,6 +211,9 @@ export class SallaGifting {
|
|
|
189
211
|
})
|
|
190
212
|
.finally(() => this.modal.stopLoading());
|
|
191
213
|
}
|
|
214
|
+
skipStep1() {
|
|
215
|
+
return !!this.gift && !this.gift.show_images && !this.gift.show_texts;
|
|
216
|
+
}
|
|
192
217
|
/**
|
|
193
218
|
*
|
|
194
219
|
* Hide / close the gifting modal window
|
|
@@ -243,21 +268,12 @@ export class SallaGifting {
|
|
|
243
268
|
*
|
|
244
269
|
* Go to the step 2
|
|
245
270
|
*/
|
|
246
|
-
async goToStep2() {
|
|
247
|
-
if (!this.
|
|
248
|
-
this.textSelect.classList.add('s-form-has-error');
|
|
249
|
-
this.customTextArea.classList.remove('s-form-has-error');
|
|
271
|
+
async goToStep2(withValidation = true) {
|
|
272
|
+
if (!this.step1Elems)
|
|
250
273
|
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');
|
|
274
|
+
if (withValidation && !this.validateStep1()) {
|
|
255
275
|
return;
|
|
256
276
|
}
|
|
257
|
-
else {
|
|
258
|
-
this.textSelect.classList.remove('s-form-has-error');
|
|
259
|
-
this.customTextArea.classList.remove('s-form-has-error');
|
|
260
|
-
}
|
|
261
277
|
this.setWrapperHeight(2, 600, 0);
|
|
262
278
|
let stepNextAnime = new anime.timeline();
|
|
263
279
|
stepNextAnime.add({
|
|
@@ -290,6 +306,23 @@ export class SallaGifting {
|
|
|
290
306
|
this.currentStep = 2;
|
|
291
307
|
this.parentClass = `is-current-step-${this.currentStep}`;
|
|
292
308
|
}
|
|
309
|
+
validateStep1() {
|
|
310
|
+
if (!this.gift?.show_texts)
|
|
311
|
+
return true;
|
|
312
|
+
if (!this.selectedGiftTextOption) {
|
|
313
|
+
this.textSelect?.classList.add('s-form-has-error');
|
|
314
|
+
this.customTextArea?.classList.remove('s-form-has-error');
|
|
315
|
+
return false;
|
|
316
|
+
}
|
|
317
|
+
else if (this.selectedGiftTextOption == 'custom' && !this.selectedText) {
|
|
318
|
+
this.textSelect?.classList.remove('s-form-has-error');
|
|
319
|
+
this.customTextArea?.classList.add('s-form-has-error');
|
|
320
|
+
return false;
|
|
321
|
+
}
|
|
322
|
+
this.textSelect?.classList.remove('s-form-has-error');
|
|
323
|
+
this.customTextArea?.classList.remove('s-form-has-error');
|
|
324
|
+
return true;
|
|
325
|
+
}
|
|
293
326
|
/**
|
|
294
327
|
*
|
|
295
328
|
* Go to the step 1
|
|
@@ -332,7 +365,7 @@ export class SallaGifting {
|
|
|
332
365
|
this.parentClass = `is-current-step-${this.currentStep}`;
|
|
333
366
|
}
|
|
334
367
|
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 :
|
|
368
|
+
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
369
|
}
|
|
337
370
|
setPreview(image) {
|
|
338
371
|
this.uploader?.classList.add('has-bg');
|
|
@@ -342,7 +375,7 @@ export class SallaGifting {
|
|
|
342
375
|
bg.style.backgroundImage = "url('" + image.url + "')";
|
|
343
376
|
this.uploader?.querySelector('.filepond--root')?.appendChild(bg);
|
|
344
377
|
this.uploadedImage = image.url;
|
|
345
|
-
if (!!this.gift && this.gift.gift_images
|
|
378
|
+
if (!!this.gift && this.gift.gift_images?.length) {
|
|
346
379
|
this.setWrapperHeight(1, 150, 0);
|
|
347
380
|
}
|
|
348
381
|
}
|
|
@@ -355,7 +388,7 @@ export class SallaGifting {
|
|
|
355
388
|
}
|
|
356
389
|
handleTextAreaChange(event) {
|
|
357
390
|
this.selectedText = event.target.value;
|
|
358
|
-
this.customTextArea
|
|
391
|
+
this.customTextArea?.classList.remove('s-form-has-error');
|
|
359
392
|
}
|
|
360
393
|
clearError(key) {
|
|
361
394
|
if (this.errors?.[key]) {
|
|
@@ -506,13 +539,13 @@ export class SallaGifting {
|
|
|
506
539
|
}
|
|
507
540
|
handleUploadImage(img) {
|
|
508
541
|
this.uploadedImage = img;
|
|
509
|
-
if (!!this.gift && this.gift.gift_images
|
|
542
|
+
if (!!this.gift && this.gift.gift_images?.length) {
|
|
510
543
|
this.setWrapperHeight(1, 150, 0);
|
|
511
544
|
}
|
|
512
545
|
}
|
|
513
546
|
handleRemoveImage() {
|
|
514
547
|
this.uploadedImage = '';
|
|
515
|
-
if (!!this.gift && this.gift.gift_images
|
|
548
|
+
if (!!this.gift && this.gift.gift_images?.length) {
|
|
516
549
|
this.setWrapperHeight(1, 150, 0);
|
|
517
550
|
}
|
|
518
551
|
}
|
|
@@ -646,16 +679,18 @@ export class SallaGifting {
|
|
|
646
679
|
}
|
|
647
680
|
render() {
|
|
648
681
|
return [
|
|
649
|
-
h("div", { key: '
|
|
682
|
+
h("div", { key: '7872fb48bbc18682b2dffec6e45469ed1f348cd2' }, h("salla-list-tile", { key: 'c1885fdb40f33d203b857de13644f43964570f71', class: this.generateClass() }, h("div", { key: '77bd3860e23af43f088ee96b74901e2048baaafc', slot: "title" }, this.vertical ? h("span", { innerHTML: GiftSharing }) : '', h("h3", { key: '72e2e4d99b227b48bdd1f13866c3eea874139096' }, !!this.widgetTitle ? this.widgetTitle : this.sectionTitle)), h("div", { key: '63c219936015b9d5ee3a8102dbbce748ce0e62c5', slot: "subtitle" }, h("div", { key: '4f31a0c50120697a9b96a2b77411d74f4efc5e66' }, !!this.widgetSubtitle ? this.widgetSubtitle : this.sectionSubtitle)), h("div", { key: '47f0c995ad0f921a2fdca1c8e5f0e25d897e1fb0', slot: "action" }, h("salla-button", { key: '40145bed2bc9464279d1ae16a358b5a30d255ffd', color: "primary", fill: "outline", width: "wide", class: "s-gifting-widget-action", onClick: () => this.handleGiftButtonClick() }, h("slot", { key: 'd5620606453e0af1a5186f84fa12e1f4957a9747', name: "widget-btn-content" }, h("div", { key: '038ff62e726de1800907f8a8c136a434c7c6d036', class: "s-gifting-widget-action-content" }, h("span", { key: '4e785b4e17db238b6bfeb7646709006c9a4502bb', innerHTML: GiftSharing }), " \u00A0", h("span", { key: '5965ed90aeaf684db53d3241a9287de290f10b4a' }, this.sectionBtnText)))))), h("salla-modal", { key: 'b150b2b29f751fa4db3bfff17c4e617eb7b6db5d', id: this.hostId, isLoading: true, class: "s-gifting-modal", width: "sm", ref: modal => this.modal = modal }, h("div", { key: '57167453738915bb235da0bc44498f66daaa9454', slot: "loading" }, h("div", { key: 'fd0eab2fd0d46a76dcd00511ec05366862d86d2c', class: "s-gifting-skeleton" }, h("div", { key: '6d2bb659ca06a2cadf203d83e4f5966a78bc5f01', class: "s-gifting-modal-header" }, h("salla-skeleton", { key: 'cb47841822cf9fed5b5c20664617ac52bad135ce', type: 'circle', height: '5rem', width: '5rem' }), h("h2", { key: 'e9823fc0c00a326b495e4e7e6ff6567f03d1423e', class: "s-gifting-modal-title" }, h("div", { key: '584d50ba2c1bec0fb8e530418be60fc8a0b9c2d8', class: "s-gifting-modal-badge-wrapper" }, h("salla-skeleton", { key: '493b5e6f9fa7a1d45fa52a6f3f4602e5737b9632', height: '15px', width: '150px' })))), h("div", { key: 'd33d22031f8cd6084a1c177ada6657a89ff45ad8', class: "s-gifting-skeleton-content" }, h("salla-skeleton", { key: '792e91cdcd7ede6896653fa147124cfcdc649a9f', height: '10px', width: '150px' }), h("salla-skeleton", { key: '88ca984320729528e2a3e7cab350a96202a81da6', height: '230px' }), h("salla-skeleton", { key: 'fad81ac6972eaa37766cb489d175516249afb5e6', height: '10px', width: '150px' }), h("salla-skeleton", { key: 'a4e82c29d7940b7af14af4251cc6f97e811be99a', height: '30px' }), h("salla-skeleton", { key: '6339a34ffc0deb925f69b5b0a0ed540d986e0a0b', height: '40px' })))), h("slot", { key: '8fd7cad6fbc2d73fb770ae75301f327906817c6f', name: "header" }), !!this.hasError ?
|
|
650
683
|
h("salla-placeholder", { alignment: "center" }, h("span", { slot: "title" }, this.errorMessage || salla.lang.get('common.errors.empty_results')), h("span", { slot: "description" }, " "))
|
|
651
684
|
:
|
|
652
685
|
[
|
|
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 }, h("div", { class: "s-gifting-modal-uploader-title anime-item" }, this.selectImageForYourGift),
|
|
655
|
-
h("
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
686
|
+
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)))),
|
|
687
|
+
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 }, h("div", { class: "s-gifting-modal-uploader-title anime-item" }, this.selectImageForYourGift), this.gift && this.gift.show_images &&
|
|
688
|
+
h("div", null, 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 ?
|
|
689
|
+
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 ?
|
|
690
|
+
this.gift?.gift_images.map((item) => h("a", { class: "s-gifting-clickable s-gifting-image", onClick: () => this.setPreview(item) }, h("img", { style: { "width": "120px" }, src: item.url, alt: `${item.id}` }))) : ''))
|
|
691
|
+
: "")), this.gift && this.gift.show_texts ?
|
|
692
|
+
h("div", { class: "anime-item" }, 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 ?
|
|
693
|
+
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
694
|
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
695
|
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
696
|
h("span", { class: "s-gifting-error" }, this.errors['receiver.mobile']) : ''), this.isPhysical() &&
|
|
@@ -665,8 +700,8 @@ export class SallaGifting {
|
|
|
665
700
|
h("span", { class: "s-gifting-error" }, this.errors['receiver.region']) : ''), this.isPhysical() &&
|
|
666
701
|
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
702
|
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: '
|
|
703
|
+
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)))))
|
|
704
|
+
], h("slot", { key: 'bdc014a95dab59f9f1e22f71741b5ba5f2ea3ee8', name: "footer" })))
|
|
670
705
|
];
|
|
671
706
|
}
|
|
672
707
|
static get is() { return "salla-gifting"; }
|
|
@@ -887,6 +922,7 @@ export class SallaGifting {
|
|
|
887
922
|
"receiverCountryCode": {},
|
|
888
923
|
"receiverEmail": {},
|
|
889
924
|
"hostId": {},
|
|
925
|
+
"disableClass": {},
|
|
890
926
|
"receiverCity": {}
|
|
891
927
|
};
|
|
892
928
|
}
|
|
@@ -932,8 +968,12 @@ export class SallaGifting {
|
|
|
932
968
|
},
|
|
933
969
|
"goToStep2": {
|
|
934
970
|
"complexType": {
|
|
935
|
-
"signature": "() => Promise<void>",
|
|
936
|
-
"parameters": [
|
|
971
|
+
"signature": "(withValidation?: boolean) => Promise<void>",
|
|
972
|
+
"parameters": [{
|
|
973
|
+
"name": "withValidation",
|
|
974
|
+
"type": "boolean",
|
|
975
|
+
"docs": ""
|
|
976
|
+
}],
|
|
937
977
|
"references": {
|
|
938
978
|
"Promise": {
|
|
939
979
|
"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;
|