add-payment-method.js
3 years ago
add-payment-method.min.js
3 years ago
add-to-cart-variation.js
3 years ago
add-to-cart-variation.min.js
3 years ago
add-to-cart.js
3 years ago
add-to-cart.min.js
3 years ago
address-i18n.js
5 years ago
address-i18n.min.js
3 years ago
cart-fragments.js
3 years ago
cart-fragments.min.js
3 years ago
cart.js
3 years ago
cart.min.js
3 years ago
checkout.js
3 years ago
checkout.min.js
3 years ago
country-select.js
5 years ago
country-select.min.js
3 years ago
credit-card-form.js
8 years ago
credit-card-form.min.js
8 years ago
geolocation.js
3 years ago
geolocation.min.js
3 years ago
lost-password.js
8 years ago
lost-password.min.js
8 years ago
password-strength-meter.js
4 years ago
password-strength-meter.min.js
3 years ago
price-slider.js
5 years ago
price-slider.min.js
3 years ago
single-product.js
3 years ago
single-product.min.js
3 years ago
tokenization-form.js
5 years ago
tokenization-form.min.js
5 years ago
woocommerce.js
5 years ago
woocommerce.min.js
5 years ago
geolocation.js
156 lines
| 1 | /*global wc_geolocation_params */ |
| 2 | jQuery( function( $ ) { |
| 3 | /** |
| 4 | * Contains the current geo hash (or false if the hash |
| 5 | * is not set/cannot be determined). |
| 6 | * |
| 7 | * @type {boolean|string} |
| 8 | */ |
| 9 | var geo_hash = false; |
| 10 | |
| 11 | /** |
| 12 | * Obtains the current geo hash from the `woocommerce_geo_hash` cookie, if set. |
| 13 | * |
| 14 | * @returns {boolean} |
| 15 | */ |
| 16 | function get_geo_hash() { |
| 17 | var geo_hash_cookie = Cookies.get( 'woocommerce_geo_hash' ); |
| 18 | |
| 19 | if ( 'string' === typeof geo_hash_cookie && geo_hash_cookie.length ) { |
| 20 | geo_hash = geo_hash_cookie; |
| 21 | return true; |
| 22 | } |
| 23 | |
| 24 | return false; |
| 25 | } |
| 26 | |
| 27 | /** |
| 28 | * If we have an active geo hash value but it does not match the `?v=` query var in |
| 29 | * current page URL, that indicates that we need to refresh the page. |
| 30 | * |
| 31 | * @returns {boolean} |
| 32 | */ |
| 33 | function needs_refresh() { |
| 34 | return geo_hash && ( new URLSearchParams( window.location.search ) ).get( 'v' ) !== geo_hash; |
| 35 | } |
| 36 | |
| 37 | /** |
| 38 | * Appends (or replaces) the geo hash used for links on the current page. |
| 39 | */ |
| 40 | var $append_hashes = function() { |
| 41 | if ( ! geo_hash ) { |
| 42 | return; |
| 43 | } |
| 44 | |
| 45 | $( 'a[href^="' + wc_geolocation_params.home_url + '"]:not(a[href*="v="]), a[href^="/"]:not(a[href*="v="])' ).each( function() { |
| 46 | var $this = $( this ), |
| 47 | href = $this.attr( 'href' ), |
| 48 | href_parts = href.split( '#' ); |
| 49 | |
| 50 | href = href_parts[0]; |
| 51 | |
| 52 | if ( href.indexOf( '?' ) > 0 ) { |
| 53 | href = href + '&v=' + geo_hash; |
| 54 | } else { |
| 55 | href = href + '?v=' + geo_hash; |
| 56 | } |
| 57 | |
| 58 | if ( typeof href_parts[1] !== 'undefined' && href_parts[1] !== null ) { |
| 59 | href = href + '#' + href_parts[1]; |
| 60 | } |
| 61 | |
| 62 | $this.attr( 'href', href ); |
| 63 | }); |
| 64 | }; |
| 65 | |
| 66 | var $geolocate_customer = { |
| 67 | url: wc_geolocation_params.wc_ajax_url.toString().replace( '%%endpoint%%', 'get_customer_location' ), |
| 68 | type: 'GET', |
| 69 | success: function( response ) { |
| 70 | if ( response.success && response.data.hash && response.data.hash !== geo_hash ) { |
| 71 | $geolocation_redirect( response.data.hash ); |
| 72 | } |
| 73 | } |
| 74 | }; |
| 75 | |
| 76 | /** |
| 77 | * Once we have a new hash, we redirect so a new version of the current page |
| 78 | * (with correct pricing for the current region, etc) is displayed. |
| 79 | * |
| 80 | * @param {string} hash |
| 81 | */ |
| 82 | var $geolocation_redirect = function( hash ) { |
| 83 | // Updates our (cookie-based) cache of the hash value. Expires in 1 hour. |
| 84 | Cookies.set( 'woocommerce_geo_hash', hash, { expires: 1 / 24 } ); |
| 85 | |
| 86 | var this_page = window.location.toString(); |
| 87 | |
| 88 | if ( this_page.indexOf( '?v=' ) > 0 || this_page.indexOf( '&v=' ) > 0 ) { |
| 89 | this_page = this_page.replace( /v=[^&]+/, 'v=' + hash ); |
| 90 | } else if ( this_page.indexOf( '?' ) > 0 ) { |
| 91 | this_page = this_page + '&v=' + hash; |
| 92 | } else { |
| 93 | this_page = this_page + '?v=' + hash; |
| 94 | } |
| 95 | |
| 96 | window.location = this_page; |
| 97 | }; |
| 98 | |
| 99 | /** |
| 100 | * Updates any forms on the page so they use the current geo hash. |
| 101 | */ |
| 102 | function update_forms() { |
| 103 | if ( ! geo_hash ) { |
| 104 | return; |
| 105 | } |
| 106 | |
| 107 | $( 'form' ).each( function () { |
| 108 | var $this = $( this ); |
| 109 | var method = $this.attr( 'method' ); |
| 110 | var hasField = $this.find( 'input[name="v"]' ).length > 0; |
| 111 | |
| 112 | if ( method && 'get' === method.toLowerCase() && ! hasField ) { |
| 113 | $this.append( '<input type="hidden" name="v" value="' + geo_hash + '" />' ); |
| 114 | } else { |
| 115 | var href = $this.attr( 'action' ); |
| 116 | if ( href ) { |
| 117 | if ( href.indexOf( '?' ) > 0 ) { |
| 118 | $this.attr( 'action', href + '&v=' + geo_hash ); |
| 119 | } else { |
| 120 | $this.attr( 'action', href + '?v=' + geo_hash ); |
| 121 | } |
| 122 | } |
| 123 | } |
| 124 | }); |
| 125 | } |
| 126 | |
| 127 | // Get the current geo hash. If it doesn't exist, or if it doesn't match the current |
| 128 | // page URL, perform a geolocation request. |
| 129 | if ( ! get_geo_hash() || needs_refresh() ) { |
| 130 | window.fetch( $geolocate_customer.url, { |
| 131 | method: $geolocate_customer.type, |
| 132 | headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' } |
| 133 | } ) |
| 134 | .then( response => { |
| 135 | if ( !response.ok ) { |
| 136 | throw new Error( response.statusText ); |
| 137 | } |
| 138 | return response.json(); |
| 139 | } ) |
| 140 | .then( $geolocate_customer.success ); |
| 141 | } |
| 142 | |
| 143 | // Page updates. |
| 144 | update_forms(); |
| 145 | $append_hashes(); |
| 146 | |
| 147 | $( document.body ).on( 'added_to_cart', function() { |
| 148 | $append_hashes(); |
| 149 | }); |
| 150 | |
| 151 | // Enable user to trigger manual append hashes on AJAX operations |
| 152 | $( document.body ).on( 'woocommerce_append_geo_hashes', function() { |
| 153 | $append_hashes(); |
| 154 | }); |
| 155 | }); |
| 156 |