/** * Wraps the callback/context menu handler such that the default * operation can proceed if the SHIFT key is held while right-clicked * @param {Function} cb Callback for contextMenu * @return {Function} Wrapped contextmenu handler */ export function wrapCtxMenu(cb) { return (event) => { if (!event.getModifierState('Shift')) { event.preventDefault(); cb.call(null, event); } }; } /** * Stop context menu / right-click propagation unless shift is held. * @param {SyntheticEvent} event Event */ export function stopCtxPropagation(event) { if (!event.getModifierState('Shift')) { event.preventDefault(); event.stopPropagation(); } } /** * Compares A and B and return true using strict comparison (===) * @param {any} objA A * @param {any} objB B * @return {boolean} true if A === B OR A properties === B properties */ export function shallowEqual(objA, objB) { if (objA === objB) { return true; } if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) { return false; } let keysA = Object.keys(objA); let keysB = Object.keys(objB); if (keysA.length !== keysB.length) { return false; } // Test for A's keys different from B. let bHasOwnProperty = Object.prototype.hasOwnProperty.bind(objB); for (let i = 0; i < keysA.length; i++) { if (!bHasOwnProperty(keysA[i]) || objA[keysA[i]] !== objB[keysA[i]]) { return false; } } return true; } /** * Turn a URL-safe base-64 encoded string in to a normal version. * Coriolis used to use a different encoding system, and some old * data might be bookmarked or on local storage, so we keep this * around and use it when decoding data from the old-style URLs to * be safe. * @param {string} data the string * @return {string} the converted string */ export function fromUrlSafe(data) { return data ? data.replace(/-/g, '/').replace(/_/g, '+') : null; } /** * Check if an object is empty * @param {object} obj the object * @return {bool} true if the object is empty, otherwise false */ export function isEmpty(obj) { for (let key in obj) { if (obj.hasOwnProperty(key)) return false; } return true; };