| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- /* global wc_cart_fragments_params, Cookies */
- jQuery( function( $ ) {
- // wc_cart_fragments_params is required to continue, ensure the object exists
- if ( typeof wc_cart_fragments_params === 'undefined' ) {
- return false;
- }
- /* Storage Handling */
- var $supports_html5_storage = true,
- cart_hash_key = wc_cart_fragments_params.cart_hash_key;
- try {
- $supports_html5_storage = ( 'sessionStorage' in window && window.sessionStorage !== null );
- window.sessionStorage.setItem( 'wc', 'test' );
- window.sessionStorage.removeItem( 'wc' );
- window.localStorage.setItem( 'wc', 'test' );
- window.localStorage.removeItem( 'wc' );
- } catch( err ) {
- $supports_html5_storage = false;
- }
- /* Cart session creation time to base expiration on */
- function set_cart_creation_timestamp() {
- if ( $supports_html5_storage ) {
- sessionStorage.setItem( 'wc_cart_created', ( new Date() ).getTime() );
- }
- }
- /** Set the cart hash in both session and local storage */
- function set_cart_hash( cart_hash ) {
- if ( $supports_html5_storage ) {
- localStorage.setItem( cart_hash_key, cart_hash );
- sessionStorage.setItem( cart_hash_key, cart_hash );
- }
- }
- var $fragment_refresh = {
- url: wc_cart_fragments_params.wc_ajax_url.toString().replace( '%%endpoint%%', 'get_refreshed_fragments' ),
- type: 'POST',
- success: function( data ) {
- if ( data && data.fragments ) {
- $.each( data.fragments, function( key, value ) {
- $( key ).replaceWith( value );
- });
- if ( $supports_html5_storage ) {
- sessionStorage.setItem( wc_cart_fragments_params.fragment_name, JSON.stringify( data.fragments ) );
- set_cart_hash( data.cart_hash );
- if ( data.cart_hash ) {
- set_cart_creation_timestamp();
- }
- }
- $( document.body ).trigger( 'wc_fragments_refreshed' );
- }
- }
- };
- /* Named callback for refreshing cart fragment */
- function refresh_cart_fragment() {
- $.ajax( $fragment_refresh );
- }
- /* Cart Handling */
- if ( $supports_html5_storage ) {
- var cart_timeout = null,
- day_in_ms = ( 24 * 60 * 60 * 1000 );
- $( document.body ).on( 'wc_fragment_refresh updated_wc_div', function() {
- refresh_cart_fragment();
- });
- $( document.body ).on( 'added_to_cart removed_from_cart', function( event, fragments, cart_hash ) {
- var prev_cart_hash = sessionStorage.getItem( cart_hash_key );
- if ( prev_cart_hash === null || prev_cart_hash === undefined || prev_cart_hash === '' ) {
- set_cart_creation_timestamp();
- }
- sessionStorage.setItem( wc_cart_fragments_params.fragment_name, JSON.stringify( fragments ) );
- set_cart_hash( cart_hash );
- });
- $( document.body ).on( 'wc_fragments_refreshed', function() {
- clearTimeout( cart_timeout );
- cart_timeout = setTimeout( refresh_cart_fragment, day_in_ms );
- } );
- // Refresh when storage changes in another tab
- $( window ).on( 'storage onstorage', function ( e ) {
- if ( cart_hash_key === e.originalEvent.key && localStorage.getItem( cart_hash_key ) !== sessionStorage.getItem( cart_hash_key ) ) {
- refresh_cart_fragment();
- }
- });
- // Refresh when page is shown after back button (safari)
- $( window ).on( 'pageshow' , function( e ) {
- if ( e.originalEvent.persisted ) {
- $( '.widget_shopping_cart_content' ).empty();
- $( document.body ).trigger( 'wc_fragment_refresh' );
- }
- } );
- try {
- var wc_fragments = $.parseJSON( sessionStorage.getItem( wc_cart_fragments_params.fragment_name ) ),
- cart_hash = sessionStorage.getItem( cart_hash_key ),
- cookie_hash = Cookies.get( 'woocommerce_cart_hash'),
- cart_created = sessionStorage.getItem( 'wc_cart_created' );
- if ( cart_hash === null || cart_hash === undefined || cart_hash === '' ) {
- cart_hash = '';
- }
- if ( cookie_hash === null || cookie_hash === undefined || cookie_hash === '' ) {
- cookie_hash = '';
- }
- if ( cart_hash && ( cart_created === null || cart_created === undefined || cart_created === '' ) ) {
- throw 'No cart_created';
- }
- if ( cart_created ) {
- var cart_expiration = ( ( 1 * cart_created ) + day_in_ms ),
- timestamp_now = ( new Date() ).getTime();
- if ( cart_expiration < timestamp_now ) {
- throw 'Fragment expired';
- }
- cart_timeout = setTimeout( refresh_cart_fragment, ( cart_expiration - timestamp_now ) );
- }
- if ( wc_fragments && wc_fragments['div.widget_shopping_cart_content'] && cart_hash === cookie_hash ) {
- $.each( wc_fragments, function( key, value ) {
- $( key ).replaceWith(value);
- });
- $( document.body ).trigger( 'wc_fragments_loaded' );
- } else {
- throw 'No fragment';
- }
- } catch( err ) {
- refresh_cart_fragment();
- }
- } else {
- refresh_cart_fragment();
- }
- /* Cart Hiding */
- if ( Cookies.get( 'woocommerce_items_in_cart' ) > 0 ) {
- $( '.hide_cart_widget_if_empty' ).closest( '.widget_shopping_cart' ).show();
- } else {
- $( '.hide_cart_widget_if_empty' ).closest( '.widget_shopping_cart' ).hide();
- }
- $( document.body ).on( 'adding_to_cart', function() {
- $( '.hide_cart_widget_if_empty' ).closest( '.widget_shopping_cart' ).show();
- });
- });
|