git.fiddlerwoaroof.com
src/change-url-event.js
30db14b1
 import R from 'ramda';
 
 export function wrapEvent(target, name, obj) {
   target.addEventListener(name, obj);
 }
 
 
 function debounce(object, flag, cb) {
   if (!object[flag]) {
     object[flag] = true;
     cb();
   }
 }
 
 let MISSING_CHANGE_URL = Symbol("missing_change_url");
 export default function addChangeUrlEvent(window) {
 
   debounce(window, MISSING_CHANGE_URL, () => {
     const changeUrlEventCreator = {
       lastLocation: null,
       handleEvent() { // interface for EventListener
         let {hash, host, hostname, origin, href, pathname, port, protocol} = window.location;
         // store in object for comparison
         const pushedLocation = {hash, host, hostname, origin, href, pathname, port, protocol};
 
         // only dispatch action when url has actually changed so same link can be clicked repeatedly.
         if (!R.equals(pushedLocation, this.lastLocation)) {
           var urlChangeEvent = new CustomEvent('urlchanged', {detail: pushedLocation});
           window.dispatchEvent(urlChangeEvent);
           this.lastLocation = pushedLocation;
         }
       }
     };
 
27fb05ae
     // / make sure we fire urlchanged for these
30db14b1
     wrapEvent(window, 'popstate', changeUrlEventCreator);
     wrapEvent(window, 'pushstate', changeUrlEventCreator);
     wrapEvent(window, 'replacestate', changeUrlEventCreator);
   });
 }